diff options
Diffstat (limited to 'linux/opensimpad-2.4.25-vrs2-pxa1-jpm1/2.4.25-vrs2-pxa1.patch')
-rw-r--r-- | linux/opensimpad-2.4.25-vrs2-pxa1-jpm1/2.4.25-vrs2-pxa1.patch | 39937 |
1 files changed, 0 insertions, 39937 deletions
diff --git a/linux/opensimpad-2.4.25-vrs2-pxa1-jpm1/2.4.25-vrs2-pxa1.patch b/linux/opensimpad-2.4.25-vrs2-pxa1-jpm1/2.4.25-vrs2-pxa1.patch deleted file mode 100644 index df59f13544..0000000000 --- a/linux/opensimpad-2.4.25-vrs2-pxa1-jpm1/2.4.25-vrs2-pxa1.patch +++ /dev/null @@ -1,39937 +0,0 @@ - -# -# Patch managed by http://www.mn-logistik.de/unsupported/pxa250/patcher -# - ---- linux-2.4.25/Documentation/Configure.help~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:08.000000000 +0200 -+++ linux-2.4.25/Documentation/Configure.help 2004-03-31 17:15:11.000000000 +0200 -@@ -4526,6 +4526,24 @@ - building a kernel for install/rescue disks or your system is very - limited in memory. - -+Kernel Execute-In-Place from ROM -+CONFIG_XIP_KERNEL -+ Execute-In-Place allows the kernel to run directly from -+ non-volatile storage, such as flash. This saves RAM space since -+ the text section of the kernel is not loaded from flash to -+ RAM. Read-write sections, such as the data section and stack, -+ are still copied to RAM. The XIP kernel is not compressed since it -+ has to run directly from flash, so it will take more space to store -+ it. The flash address where the kernel is linked to run from and -+ is stored is board dependent. Therefore, if you say Y, you must -+ know the proper physical address where to store the kernel image. -+ -+ Also note that the make target becomes "make xipImage" rather than -+ "make zImage" or "make Image". The final kernel binary to put in -+ ROM memory will be arch/arm/boot/xipImage. -+ -+ If unsure, say N. -+ - # Choice: kcore - Kernel core (/proc/kcore) format - CONFIG_KCORE_ELF -@@ -13386,6 +13404,30 @@ - - If you don't know what this all is, saying Y is a safe choice. - -+Workaround for XScale cache errata -+CONFIG_XSCALE_CACHE_ERRATA -+ There are couple errata that say that the cache may get confused -+ whether some cache lines are dirty or not, resulting in some memory -+ corruptions. The workaround (using the cache only in write through -+ mode) is performance impairing, and the bug _might_ just not be -+ that visible or critical to you depending on many esoteric -+ hardware factors. -+ -+ Not using the workaround makes Linux unreliable. If you're used -+ to some other OSes which requires to be rebooted once in a while -+ then this won't look so bad to you. On the other hand you may -+ stress test the system for hours without seeing any effect of this -+ bug. -+ -+ So this is configurable. Let's hope a future core revision will tell -+ this was just a bad dream. But in the mean time the risk and -+ trade-off is yours to decide. -+ -+ This should apply to all PXA250 up to rev B2 (erratum #120) and -+ possibly other current XScale cores as well. -+ -+ If you don't know what to answer, say Y. -+ - Support CD-ROM drives that are not SCSI or IDE/ATAPI - CONFIG_CD_NO_IDESCSI - If you have a CD-ROM drive that is neither SCSI nor IDE/ATAPI, say Y -@@ -16568,6 +16610,40 @@ - - If unsure, say N. - -+Use linear addressing for cramfs -+CONFIG_CRAMFS_LINEAR -+ This option tells the cramfs driver to load data directly from a linear -+ adressed memory range (usually non volatile memory like flash) instead -+ of going through the block device layer. This saves some memory since -+ no intermediate buffering is necessary. -+ -+ This is also a prerequisite for XIP of binaries stored on the filesystem. -+ -+ The location of the cramfs image in memory is board dependent. Therefore, -+ if you say Y, you must know the proper physical address where to store -+ the cramfs image and specify it using the physaddr=0x******** mount -+ option (for example: "mount -t cramfs -o physaddr=0x100000 none /mnt"). -+ -+ If unsure, say N. -+ -+Support XIP on linear cramfs -+CONFIG_CRAMFS_LINEAR_XIP -+ You must say Y to this option if you want to be able to run applications -+ directly from non-volatile memory. XIP applications are marked by -+ setting the sticky bit (ie, "chmod +t <app name>"). A cramfs file system -+ then needs to be created using mkcramfs (with XIP cramfs support -+ in it). Applications marked for XIP execution will not be compressed -+ since they have to run directly from flash. -+ -+Root file system on linear cramfs -+CONFIG_ROOT_CRAMFS_LINEAR -+ Say Y if you have enabled linear cramfs, and you want to be able to use -+ the linear cramfs image as a root file system. To actually have the -+ kernel mount this cramfs image as a root file system, you must also pass -+ the command line parameter "root=/dev/null rootflags=physaddr=0x********" -+ to the kernel (replace 0x******** with the physical address location -+ of the linear cramfs image to boot with). -+ - CMS file system support - CONFIG_CMS_FS - Read only support for CMS minidisk file systems found on IBM ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/Documentation/arm/XScale/PXA/USB-client 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,38 @@ -+Date: Wed, 05 Jun 2002 13:38:53 -0700 -+From: Frank Becker <fbecker@intrinsyc.com> -+To: Nicolas Pitre <nico@cam.org> -+Subject: [PATCH] PXA-USB -+ -+Hi Nicolas, -+ -+one more patch... -+ -+This patch adds minimal USB client (UDC) support. -+ -+Some notes: -+It adds just enough to get usb-eth working. I.e. -+endpoints 0-2, no dma. Performance isn't stellar -+partially due to UDC bug workarounds... -+(~350K @ 100Mhz, ~550K @ 200Mhz). -+ -+Endpoint 1&2 have changed direction compared to -+the SA, so the host side requires a change to -+usbnet.c to flip endpoints (in:2/out:1 -> in:1/out:2). -+ -+usb-eth and usb-char for PXA are almost identical -+to the SA versions, so they could probably be merged at -+one point. I made some minor changes to the eth driver -+to grab the usb resources at open, rather than at init -+and allow eth&char to be loaded at the same time. -+ -+Stuart Lynne was working on his own USB client driver -+(and he was getting higher throughput than my driver). -+Assuming you guys have something in the oven for USB -+as well, there should be good selection for best of -+breed :) -+ -+Cheers, -+Frank. -+-- -+Frank Becker - Intrinsyc Software, Inc. - http://www.intrinsyc.com/ -+Need a break? http://criticalmass.sf.net/ ---- linux-2.4.25/Makefile~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:08.000000000 +0200 -+++ linux-2.4.25/Makefile 2004-03-31 17:15:11.000000000 +0200 -@@ -1,11 +1,13 @@ - VERSION = 2 - PATCHLEVEL = 4 - SUBLEVEL = 25 --EXTRAVERSION =-vrs2 -+EXTRAVERSION =-vrs2-pxa1 - - KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) - --ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/) -+#ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/) -+ARCH := arm -+ - KERNELPATH=kernel-$(shell echo $(KERNELRELEASE) | sed -e "s/-//g") - - CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \ -@@ -19,7 +21,7 @@ - HOSTCC = gcc - HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer - --CROSS_COMPILE = -+CROSS_COMPILE = arm-linux- - - # - # Include the make variables (CC, etc...) -@@ -168,6 +170,7 @@ - DRIVERS-$(CONFIG_SOUND) += drivers/sound/sounddrivers.o - DRIVERS-$(CONFIG_PCI) += drivers/pci/driver.o - DRIVERS-$(CONFIG_MTD) += drivers/mtd/mtdlink.o -+DRIVERS-$(CONFIG_MMC) += drivers/mmc/mmcdrivers.o - DRIVERS-$(CONFIG_PCMCIA) += drivers/pcmcia/pcmcia.o - DRIVERS-$(CONFIG_NET_PCMCIA) += drivers/net/pcmcia/pcmcia_net.o - DRIVERS-$(CONFIG_NET_WIRELESS) += drivers/net/wireless/wireless_net.o ---- linux-2.4.25/arch/arm/Makefile~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:08.000000000 +0200 -+++ linux-2.4.25/arch/arm/Makefile 2004-03-31 17:15:11.000000000 +0200 -@@ -13,10 +13,11 @@ - CFLAGS +=-Uarm -fno-common -pipe - - ifeq ($(CONFIG_FRAME_POINTER),y) --CFLAGS :=$(CFLAGS:-fomit-frame-pointer=-mapcs -mno-sched-prolog) -+CFLAGS :=$(CFLAGS:-fomit-frame-pointer=) -+CFLAGS +=-fno-omit-frame-pointer -mapcs -mno-sched-prolog - endif - --CFLAGS :=$(CFLAGS:-O2=-Os) -+#CFLAGS :=$(CFLAGS:-O2=-Os) - - ifeq ($(CONFIG_DEBUG_INFO),y) - CFLAGS +=-g -@@ -38,6 +39,8 @@ - arch-$(CONFIG_CPU_32v3) :=-D__LINUX_ARM_ARCH__=3 -march=armv3 - arch-$(CONFIG_CPU_32v4) :=-D__LINUX_ARM_ARCH__=4 -march=armv4 - arch-$(CONFIG_CPU_32v5) :=-D__LINUX_ARM_ARCH__=5 -march=armv5 -+#arch-$(CONFIG_CPU_XSCALE) :=-D__LINUX_ARM_ARCH__=5 -mcpu=xscale -+arch-$(CONFIG_CPU_XSCALE) :=-D__LINUX_ARM_ARCH__=5 -march=armv4 -Wa,-mcpu=xscale - - # This selects how we optimise for the processor. - tune-y := -@@ -49,6 +52,8 @@ - tune-$(CONFIG_CPU_ARM926T) :=-mtune=arm9tdmi - tune-$(CONFIG_CPU_SA110) :=-mtune=strongarm110 - tune-$(CONFIG_CPU_SA1100) :=-mtune=strongarm1100 -+tune-$(CONFIG_CPU_XSCALE) :=-mtune=xscale -+#tune-$(CONFIG_CPU_XSCALE) :=-mtune=strongarm - - CFLAGS_BOOT :=$(apcs-y) $(arch-y) $(tune-y) -mshort-load-bytes -msoft-float -Uarm - CFLAGS +=$(apcs-y) $(arch-y) $(tune-y) -mshort-load-bytes -msoft-float -Uarm -@@ -127,6 +132,10 @@ - MACHINE = sa1100 - endif - -+ifeq ($(CONFIG_ARCH_PXA),y) -+MACHINE = pxa -+endif -+ - ifeq ($(CONFIG_ARCH_L7200),y) - MACHINE = l7200 - endif -@@ -164,6 +173,17 @@ - MACHINE = omaha - endif - -+ifeq ($(CONFIG_XIP_KERNEL),y) -+ DATAADDR := $(TEXTADDR) -+ # Replace phys addr with virt addr while keeping offset from base. -+ # Virt base addr also defined in include/asm-arm/arch-*/hardware.h -+ TEXTADDR = $(shell echo 0x`echo $(CONFIG_XIP_PHYS_ADDR)|sed -e's/^0x//'` |\ -+ awk --non-decimal-data '/[:xdigit:]/ \ -+ {printf("0x%x\n",and($$0,0x001fffff)+0xe8000000)}' ) -+ LDSCRIPT = arch/arm/vmlinux-armv-xip.lds.in -+ export DATAADDR -+endif -+ - export MACHINE PROCESSOR TEXTADDR GZFLAGS CFLAGS_BOOT OBJCOPYFLAGS - - # Only set INCDIR if its not already defined above -@@ -269,7 +289,7 @@ - arch/arm/kernel arch/arm/mm arch/arm/lib: dummy - $(MAKE) CFLAGS="$(CFLAGS) $(CFLAGS_KERNEL)" $(subst $@, _dir_$@, $@) - --bzImage zImage zinstall Image bootpImage install: vmlinux -+bzImage zImage zinstall Image xipImage bootpImage install: vmlinux - @$(MAKEBOOT) $@ - - CLEAN_FILES += \ ---- linux-2.4.25/arch/arm/boot/Makefile~2.4.25-vrs2-pxa1.patch 2003-08-25 13:44:39.000000000 +0200 -+++ linux-2.4.25/arch/arm/boot/Makefile 2004-03-31 17:15:11.000000000 +0200 -@@ -113,6 +113,10 @@ - endif - endif - -+ifeq ($(CONFIG_ARCH_PXA),y) -+ZRELADDR = 0xa0008000 -+endif -+ - ifeq ($(CONFIG_ARCH_ANAKIN),y) - ZRELADDR = 0x20008000 - endif -@@ -140,6 +144,14 @@ - zImage: compressed/vmlinux - $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ - -+ifeq ($(CONFIG_XIP_KERNEL),y) -+xipImage: $(CONFIGURE) $(SYSTEM) -+ $(OBJCOPY) -S -O binary -R .data $(SYSTEM) vmlinux-text.bin -+ $(OBJCOPY) -S -O binary -R .init -R .text -R __ex_table -R __ksymtab $(SYSTEM) vmlinux-data.bin -+ cat vmlinux-text.bin vmlinux-data.bin > $@ -+ $(RM) -f vmlinux-text.bin vmlinux-data.bin -+endif -+ - bootpImage: bootp/bootp - $(OBJCOPY) $(OBJCOPYFLAGS) $< $@ - -@@ -160,7 +172,7 @@ - sh ./install.sh $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) zImage $(TOPDIR)/System.map "$(INSTALL_PATH)" - - clean: -- $(RM) Image zImage bootpImage -+ $(RM) Image xipImage zImage bootpImage - @$(MAKE) -C compressed clean - @$(MAKE) -C bootp clean - ---- linux-2.4.25/arch/arm/boot/compressed/Makefile~2.4.25-vrs2-pxa1.patch 2003-08-25 13:44:39.000000000 +0200 -+++ linux-2.4.25/arch/arm/boot/compressed/Makefile 2004-03-31 17:15:11.000000000 +0200 -@@ -71,6 +71,10 @@ - OBJS += head-sa1100.o - endif - -+ifeq ($(CONFIG_CPU_XSCALE),y) -+OBJS += head-xscale.o -+endif -+ - SEDFLAGS = s/TEXT_START/$(ZTEXTADDR)/;s/LOAD_ADDR/$(ZRELADDR)/;s/BSS_START/$(ZBSSADDR)/ - - LIBGCC := $(shell $(CC) $(CFLAGS) --print-libgcc-file-name) ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/boot/compressed/head-xscale.S 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,50 @@ -+/* -+ * linux/arch/arm/boot/compressed/head-xscale.S -+ * -+ * XScale specific tweaks. This is merged into head.S by the linker. -+ * -+ */ -+ -+#include <linux/config.h> -+#include <linux/linkage.h> -+#include <asm/mach-types.h> -+ -+ .section ".start", #alloc, #execinstr -+ -+__XScale_start: -+ -+ @ Preserve r8/r7 i.e. kernel entry values -+ -+ @ Data cache might be active. -+ @ Be sure to flush kernel binary out of the cache, -+ @ whatever state it is, before it is turned off. -+ @ This is done by fetching through currently executed -+ @ memory to be sure we hit the same cache. -+ bic r2, pc, #0x1f -+ add r3, r2, #0x10000 @ 64 kb is quite enough... -+1: ldr r0, [r2], #32 -+ teq r2, r3 -+ bne 1b -+ mcr p15, 0, r0, c7, c10, 4 @ drain WB -+ mcr p15, 0, r0, c7, c7, 0 @ flush I & D caches -+ -+ @ disabling MMU and caches -+ mrc p15, 0, r0, c1, c0, 0 @ read control reg -+ bic r0, r0, #0x05 @ clear DC, MMU -+ bic r0, r0, #0x1000 @ clear Icache -+ mcr p15, 0, r0, c1, c0, 0 -+ -+#ifdef CONFIG_ARCH_LUBBOCK -+ mov r7, #MACH_TYPE_LUBBOCK -+#endif -+ -+#ifdef CONFIG_ARCH_PXA_IDP -+ mov r7, #MACH_TYPE_PXA_IDP -+#endif -+ -+#ifdef CONFIG_ARCH_TRIZEPS2 -+ mov r7, #(MACH_TYPE_TRIZEPS2 & 0xFF00) -+ add r7, r7, #(MACH_TYPE_TRIZEPS2 & 0xFF) -+#endif -+ -+ ---- linux-2.4.25/arch/arm/boot/compressed/head.S~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:08.000000000 +0200 -+++ linux-2.4.25/arch/arm/boot/compressed/head.S 2004-03-31 17:15:11.000000000 +0200 -@@ -351,7 +351,11 @@ - orr r1, r1, #3 << 10 - add r2, r3, #16384 - 1: cmp r1, r8 @ if virt > start of RAM -+#ifdef CONFIG_XSCALE_CACHE_ERRATA -+ orrhs r1, r1, #0x08 @ set cacheable, not bufferable -+#else - orrhs r1, r1, #0x0c @ set cacheable, bufferable -+#endif - cmp r1, r9 @ if virt > end of RAM - bichs r1, r1, #0x0c @ clear cacheable, bufferable - str r1, [r0], #4 @ 1:1 mapping -@@ -364,7 +368,11 @@ - * so there is no map overlap problem for up to 1 MB compressed kernel. - * If the execution is in RAM then we would only be duplicating the above. - */ -+#ifdef CONFIG_XSCALE_CACHE_ERRATA -+ mov r1, #0x1a -+#else - mov r1, #0x1e -+#endif - orr r1, r1, #3 << 10 - mov r2, pc, lsr #20 - orr r1, r1, r2, lsl #20 ---- linux-2.4.25/arch/arm/config.in~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:08.000000000 +0200 -+++ linux-2.4.25/arch/arm/config.in 2004-03-31 17:15:11.000000000 +0200 -@@ -38,6 +38,7 @@ - Cirrus-CL-PS7500FE CONFIG_ARCH_CLPS7500 \ - CLPS711x/EP721x-based CONFIG_ARCH_CLPS711X \ - Co-EBSA285 CONFIG_ARCH_CO285 \ -+ PXA250/210-based CONFIG_ARCH_PXA \ - EBSA-110 CONFIG_ARCH_EBSA110 \ - Excalibur-ARM CONFIG_ARCH_CAMELOT \ - FootBridge CONFIG_ARCH_FOOTBRIDGE \ -@@ -148,6 +149,47 @@ - endmenu - - mainmenu_option next_comment -+comment 'Intel PXA250/210 Implementations' -+dep_bool ' Intel DBPXA250 Development Platform' CONFIG_ARCH_LUBBOCK $CONFIG_ARCH_PXA -+dep_bool ' Accelent Xscale IDP' CONFIG_ARCH_PXA_IDP $CONFIG_ARCH_PXA -+dep_bool ' Intrinsyc CerfBoard' CONFIG_ARCH_PXA_CERF $CONFIG_ARCH_PXA -+dep_bool ' Trizeps-II MT6N' CONFIG_ARCH_TRIZEPS2 $CONFIG_ARCH_PXA -+ -+if [ "$CONFIG_ARCH_PXA_CERF" = "y" ]; then -+ define_bool CONFIG_PXA_CERF y -+ -+ choice 'CerfBoard Style' \ -+ "PDA CONFIG_PXA_CERF_PDA \ -+ BOARD CONFIG_PXA_CERF_BOARD" PDA -+ -+ choice 'CerfBoard RAM Available' \ -+ "128MB CONFIG_PXA_CERF_RAM_128MB \ -+ 64MB CONFIG_PXA_CERF_RAM_64MB \ -+ 32MB CONFIG_PXA_CERF_RAM_32MB \ -+ 16MB CONFIG_PXA_CERF_RAM_16MB" 64MB -+ -+ choice 'CerfBoard Flash Available' \ -+ "64MB CONFIG_PXA_CERF_FLASH_64MB \ -+ 32MB CONFIG_PXA_CERF_FLASH_32MB \ -+ 16MB CONFIG_PXA_CERF_FLASH_16MB \ -+ 8MB CONFIG_PXA_CERF_FLASH_8MB" 32MB -+fi -+ -+if [ "$CONFIG_ARCH_LUBBOCK" = "y" ]; then -+ define_bool CONFIG_SA1111 y -+fi -+ -+if [ "$CONFIG_ARCH_TRIZEPS2" = "y" ]; then -+ define_bool CONFIG_TRIZEPS2 y -+fi -+ -+dep_tristate 'PXA USB function support' CONFIG_PXA_USB $CONFIG_ARCH_PXA -+dep_tristate ' Support for PXA USB network link function' CONFIG_PXA_USB_NETLINK $CONFIG_PXA_USB -+dep_tristate ' Support for PXA USB character device emulation' CONFIG_PXA_USB_CHAR $CONFIG_PXA_USB -+ -+endmenu -+ -+mainmenu_option next_comment - comment 'CLPS711X/EP721X Implementations' - dep_bool ' AUTCPU12' CONFIG_ARCH_AUTCPU12 $CONFIG_ARCH_CLPS711X - dep_bool ' CDB89712' CONFIG_ARCH_CDB89712 $CONFIG_ARCH_CLPS711X -@@ -385,6 +427,12 @@ - define_bool CONFIG_CPU_SA1100 n - fi - -+if [ "$CONFIG_ARCH_PXA" = "y" ]; then -+ define_bool CONFIG_CPU_32v5 y -+ define_bool CONFIG_CPU_XSCALE y -+ bool 'Workaround for XScale cache errata (see help)' CONFIG_XSCALE_CACHE_ERRATA -+fi -+ - # Figure out what processor architecture version we should be using. - # This defines the compiler instruction set which depends on the machine type. - -@@ -493,6 +541,7 @@ - hex 'Compressed ROM boot loader BSS address' CONFIG_ZBOOT_ROM_BSS 0 - - if [ "$CONFIG_ARCH_SA1100" = "y" -o \ -+ "$CONFIG_ARCH_PXA" = "y" -o \ - "$CONFIG_ARCH_INTEGRATOR" = "y" ]; then - dep_bool 'Support CPU clock change (EXPERIMENTAL)' CONFIG_CPU_FREQ $CONFIG_EXPERIMENTAL - fi -@@ -501,8 +550,10 @@ - bool 'Support for hot-pluggable devices' CONFIG_HOTPLUG - if [ "$CONFIG_HOTPLUG" = "y" ]; then - source drivers/pcmcia/Config.in -+ source drivers/mmc/Config.in - else - define_bool CONFIG_PCMCIA n -+ define_bool CONFIG_MMC n - fi - if [ "$CONFIG_SA1100_ACCELENT" = "y" ]; then - if [ "$CONFIG_PCMCIA" != "n" ]; then -@@ -513,6 +564,14 @@ - bool 'System V IPC' CONFIG_SYSVIPC - bool 'BSD Process Accounting' CONFIG_BSD_PROCESS_ACCT - bool 'Sysctl support' CONFIG_SYSCTL -+ -+if [ "$CONFIG_ARCH_PXA" = "y" ]; then -+ dep_bool 'Kernel Execute-In-Place from ROM (EXPERIMENTAL)' CONFIG_XIP_KERNEL $CONFIG_EXPERIMENTAL -+ if [ "$CONFIG_XIP_KERNEL" = "y" ]; then -+ hex ' Kernel .text physical address' CONFIG_XIP_PHYS_ADDR 0 -+ fi -+fi -+ - comment 'At least one math emulation must be selected' - tristate 'NWFPE math emulation' CONFIG_FPE_NWFPE - if [ "$CONFIG_FPE_NWFPE" != "n" ]; then -@@ -538,6 +597,9 @@ - "$CONFIG_ARCH_SHARK" = "y" -o \ - "$CONFIG_ARCH_CO285" = "y" -o \ - "$CONFIG_ARCH_SA1100" = "y" -o \ -+ "$CONFIG_ARCH_LUBBOCK" = "y" -o \ -+ "$CONFIG_ARCH_PXA_IDP" = "y" -o \ -+ "$CONFIG_ARCH_PXA_CERF" = "y" -o \ - "$CONFIG_ARCH_INTEGRATOR" = "y" -o \ - "$CONFIG_ARCH_CDB89712" = "y" -o \ - "$CONFIG_ARCH_P720T" = "y" -o \ -@@ -549,8 +611,12 @@ - "$CONFIG_ARCH_SHARK" = "y" -o \ - "$CONFIG_ARCH_CO285" = "y" -o \ - "$CONFIG_ARCH_SA1100" = "y" -o \ -+ "$CONFIG_ARCH_LUBBOCK" = "y" -o \ - "$CONFIG_ARCH_INTEGRATOR" = "y" -o \ - "$CONFIG_ARCH_P720T" = "y" -o \ -+ "$CONFIG_ARCH_LUBBOCK" = "y" -o \ -+ "$CONFIG_ARCH_PXA_CERF" = "y" -o \ -+ "$CONFIG_ARCH_PXA_IDP" = "y" -o \ - "$CONFIG_ARCH_OMAHA" = "y" ]; then - bool ' Timer LED' CONFIG_LEDS_TIMER - bool ' CPU usage LED' CONFIG_LEDS_CPU -@@ -684,6 +750,7 @@ - if [ "$CONFIG_FOOTBRIDGE_HOST" = "y" -o \ - "$CONFIG_ARCH_SHARK" = "y" -o \ - "$CONFIG_ARCH_SA1100" = "y" -o \ -+ "$CONFIG_ARCH_PXA" = "y" -o \ - "$CONFIG_ARCH_INTEGRATOR" = "y" -o \ - "$CONFIG_ARCH_TBOX" = "y" -o \ - "$CONFIG_ARCH_CLPS7500" = "y" -o \ -@@ -705,6 +772,7 @@ - "$CONFIG_ARCH_TBOX" = "y" -o \ - "$CONFIG_ARCH_SHARK" = "y" -o \ - "$CONFIG_ARCH_SA1100" = "y" -o \ -+ "$CONFIG_ARCH_PXA" = "y" -o \ - "$CONFIG_PCI" = "y" ]; then - mainmenu_option next_comment - comment 'Sound' ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/def-configs/cerfboard_pxa 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,857 @@ -+# -+# Automatically generated by make menuconfig: don't edit -+# -+CONFIG_ARM=y -+# CONFIG_EISA is not set -+# CONFIG_SBUS is not set -+# CONFIG_MCA is not set -+CONFIG_UID16=y -+CONFIG_RWSEM_GENERIC_SPINLOCK=y -+# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set -+# CONFIG_GENERIC_BUST_SPINLOCK is not set -+# CONFIG_GENERIC_ISA_DMA is not set -+ -+# -+# Code maturity level options -+# -+CONFIG_EXPERIMENTAL=y -+# CONFIG_OBSOLETE is not set -+ -+# -+# Loadable module support -+# -+CONFIG_MODULES=y -+# CONFIG_MODVERSIONS is not set -+CONFIG_KMOD=y -+ -+# -+# System Type -+# -+# CONFIG_ARCH_ANAKIN is not set -+# CONFIG_ARCH_ARCA5K is not set -+# CONFIG_ARCH_CLPS7500 is not set -+# CONFIG_ARCH_CLPS711X is not set -+# CONFIG_ARCH_CO285 is not set -+CONFIG_ARCH_PXA=y -+# CONFIG_ARCH_EBSA110 is not set -+# CONFIG_ARCH_CAMELOT is not set -+# CONFIG_ARCH_FOOTBRIDGE is not set -+# CONFIG_ARCH_INTEGRATOR is not set -+# CONFIG_ARCH_OMAHA is not set -+# CONFIG_ARCH_L7200 is not set -+# CONFIG_ARCH_MX1ADS is not set -+# CONFIG_ARCH_RPC is not set -+# CONFIG_ARCH_RISCSTATION is not set -+# CONFIG_ARCH_SA1100 is not set -+# CONFIG_ARCH_SHARK is not set -+ -+# -+# Archimedes/A5000 Implementations -+# -+# CONFIG_ARCH_ARC is not set -+# CONFIG_ARCH_A5K is not set -+ -+# -+# Footbridge Implementations -+# -+# CONFIG_ARCH_CATS is not set -+# CONFIG_ARCH_PERSONAL_SERVER is not set -+# CONFIG_ARCH_EBSA285_ADDIN is not set -+# CONFIG_ARCH_EBSA285_HOST is not set -+# CONFIG_ARCH_NETWINDER is not set -+ -+# -+# SA11x0 Implementations -+# -+# CONFIG_SA1100_ACCELENT is not set -+# CONFIG_SA1100_ASSABET is not set -+# CONFIG_ASSABET_NEPONSET is not set -+# CONFIG_SA1100_ADSBITSY is not set -+# CONFIG_SA1100_BRUTUS is not set -+# CONFIG_SA1100_CEP is not set -+# CONFIG_SA1100_CERF is not set -+# CONFIG_SA1100_H3100 is not set -+# CONFIG_SA1100_H3600 is not set -+# CONFIG_SA1100_H3800 is not set -+# CONFIG_SA1100_H3XXX is not set -+# CONFIG_SA1100_EXTENEX1 is not set -+# CONFIG_SA1100_FLEXANET is not set -+# CONFIG_SA1100_FREEBIRD is not set -+# CONFIG_SA1100_FRODO is not set -+# CONFIG_SA1100_GRAPHICSCLIENT is not set -+# CONFIG_SA1100_GRAPHICSMASTER is not set -+# CONFIG_SA1100_BADGE4 is not set -+# CONFIG_SA1100_JORNADA720 is not set -+# CONFIG_SA1100_HUW_WEBPANEL is not set -+# CONFIG_SA1100_ITSY is not set -+# CONFIG_SA1100_LART is not set -+# CONFIG_SA1100_NANOENGINE is not set -+# CONFIG_SA1100_OMNIMETER is not set -+# CONFIG_SA1100_PANGOLIN is not set -+# CONFIG_SA1100_PLEB is not set -+# CONFIG_SA1100_PT_SYSTEM3 is not set -+# CONFIG_SA1100_SHANNON is not set -+# CONFIG_SA1100_SHERMAN is not set -+# CONFIG_SA1100_SIMPAD is not set -+# CONFIG_SA1100_SIMPUTER is not set -+# CONFIG_SA1100_PFS168 is not set -+# CONFIG_SA1100_VICTOR is not set -+# CONFIG_SA1100_XP860 is not set -+# CONFIG_SA1100_YOPY is not set -+# CONFIG_SA1100_USB is not set -+# CONFIG_SA1100_USB_NETLINK is not set -+# CONFIG_SA1100_USB_CHAR is not set -+# CONFIG_H3600_SLEEVE is not set -+ -+# -+# Intel PXA250/210 Implementations -+# -+# CONFIG_ARCH_LUBBOCK is not set -+# CONFIG_ARCH_PXA_IDP is not set -+CONFIG_ARCH_PXA_CERF=y -+CONFIG_PXA_CERF=y -+# CONFIG_PXA_CERF_PDA is not set -+CONFIG_PXA_CERF_BOARD=y -+# CONFIG_PXA_CERF_RAM_128MB is not set -+CONFIG_PXA_CERF_RAM_64MB=y -+# CONFIG_PXA_CERF_RAM_32MB is not set -+# CONFIG_PXA_CERF_RAM_16MB is not set -+# CONFIG_PXA_CERF_FLASH_64MB is not set -+CONFIG_PXA_CERF_FLASH_32MB=y -+# CONFIG_PXA_CERF_FLASH_16MB is not set -+# CONFIG_PXA_CERF_FLASH_8MB is not set -+CONFIG_PXA_USB=y -+CONFIG_PXA_USB_NETLINK=y -+CONFIG_PXA_USB_CHAR=m -+ -+# -+# CLPS711X/EP721X Implementations -+# -+# CONFIG_ARCH_AUTCPU12 is not set -+# CONFIG_ARCH_CDB89712 is not set -+# CONFIG_ARCH_CLEP7312 is not set -+# CONFIG_ARCH_EDB7211 is not set -+# CONFIG_ARCH_P720T is not set -+# CONFIG_ARCH_FORTUNET is not set -+# CONFIG_ARCH_EP7211 is not set -+# CONFIG_ARCH_EP7212 is not set -+# CONFIG_ARCH_ACORN is not set -+# CONFIG_FOOTBRIDGE is not set -+# CONFIG_FOOTBRIDGE_HOST is not set -+# CONFIG_FOOTBRIDGE_ADDIN is not set -+CONFIG_CPU_32=y -+# CONFIG_CPU_26 is not set -+# CONFIG_CPU_ARM610 is not set -+# CONFIG_CPU_ARM710 is not set -+# CONFIG_CPU_ARM720T is not set -+# CONFIG_CPU_ARM920T is not set -+# CONFIG_CPU_ARM922T is not set -+# CONFIG_PLD is not set -+# CONFIG_CPU_ARM926T is not set -+# CONFIG_CPU_ARM1020 is not set -+# CONFIG_CPU_ARM1026 is not set -+# CONFIG_CPU_SA110 is not set -+# CONFIG_CPU_SA1100 is not set -+CONFIG_CPU_32v5=y -+CONFIG_CPU_XSCALE=y -+CONFIG_XSCALE_CACHE_ERRATA=y -+# CONFIG_CPU_32v3 is not set -+# CONFIG_CPU_32v4 is not set -+# CONFIG_DISCONTIGMEM is not set -+ -+# -+# General setup -+# -+# CONFIG_PCI is not set -+# CONFIG_ISA is not set -+# CONFIG_ISA_DMA is not set -+# CONFIG_ZBOOT_ROM is not set -+CONFIG_ZBOOT_ROM_TEXT=0 -+CONFIG_ZBOOT_ROM_BSS=0 -+CONFIG_CPU_FREQ=y -+CONFIG_HOTPLUG=y -+ -+# -+# PCMCIA/CardBus support -+# -+CONFIG_PCMCIA=y -+# CONFIG_I82092 is not set -+# CONFIG_I82365 is not set -+# CONFIG_TCIC is not set -+# CONFIG_PCMCIA_CLPS6700 is not set -+# CONFIG_PCMCIA_SA1100 is not set -+CONFIG_PCMCIA_PXA=y -+CONFIG_NET=y -+CONFIG_SYSVIPC=y -+CONFIG_BSD_PROCESS_ACCT=y -+CONFIG_SYSCTL=y -+CONFIG_FPE_NWFPE=y -+# CONFIG_FPE_FASTFPE is not set -+CONFIG_KCORE_ELF=y -+# CONFIG_KCORE_AOUT is not set -+# CONFIG_BINFMT_AOUT is not set -+CONFIG_BINFMT_ELF=y -+# CONFIG_BINFMT_MISC is not set -+# CONFIG_PM is not set -+# CONFIG_ARTHUR is not set -+CONFIG_CMDLINE="root=1f03 rw console=tty0 console=ttyS0,38400 init=/linuxrc" -+CONFIG_LEDS=y -+# CONFIG_LEDS_TIMER is not set -+CONFIG_LEDS_CPU=y -+CONFIG_ALIGNMENT_TRAP=y -+ -+# -+# Parallel port support -+# -+# CONFIG_PARPORT is not set -+ -+# -+# Memory Technology Devices (MTD) -+# -+CONFIG_MTD=y -+# CONFIG_MTD_DEBUG is not set -+CONFIG_MTD_PARTITIONS=y -+# CONFIG_MTD_CONCAT is not set -+CONFIG_MTD_REDBOOT_PARTS=y -+# CONFIG_MTD_CMDLINE_PARTS is not set -+# CONFIG_MTD_AFS_PARTS is not set -+CONFIG_MTD_CHAR=y -+CONFIG_MTD_BLOCK=y -+# CONFIG_FTL is not set -+# CONFIG_NFTL is not set -+ -+# -+# RAM/ROM/Flash chip drivers -+# -+CONFIG_MTD_CFI=y -+# CONFIG_MTD_JEDECPROBE is not set -+CONFIG_MTD_GEN_PROBE=y -+CONFIG_MTD_CFI_ADV_OPTIONS=y -+CONFIG_MTD_CFI_NOSWAP=y -+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set -+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set -+CONFIG_MTD_CFI_GEOMETRY=y -+# CONFIG_MTD_CFI_B1 is not set -+# CONFIG_MTD_CFI_B2 is not set -+CONFIG_MTD_CFI_B4=y -+# CONFIG_MTD_CFI_B8 is not set -+# CONFIG_MTD_CFI_I1 is not set -+CONFIG_MTD_CFI_I2=y -+# CONFIG_MTD_CFI_I4 is not set -+# CONFIG_MTD_CFI_I8 is not set -+CONFIG_MTD_CFI_INTELEXT=y -+# CONFIG_MTD_CFI_AMDSTD is not set -+# CONFIG_MTD_RAM is not set -+# CONFIG_MTD_ROM is not set -+# CONFIG_MTD_ABSENT is not set -+# CONFIG_MTD_OBSOLETE_CHIPS is not set -+# CONFIG_MTD_AMDSTD is not set -+# CONFIG_MTD_SHARP is not set -+# CONFIG_MTD_JEDEC is not set -+ -+# -+# Mapping drivers for chip access -+# -+# CONFIG_MTD_PHYSMAP is not set -+# CONFIG_MTD_LUBBOCK is not set -+# CONFIG_MTD_NORA is not set -+# CONFIG_MTD_ARM_INTEGRATOR is not set -+# CONFIG_MTD_CDB89712 is not set -+# CONFIG_MTD_SA1100 is not set -+# CONFIG_MTD_DC21285 is not set -+# CONFIG_MTD_IQ80310 is not set -+# CONFIG_MTD_FORTUNET is not set -+CONFIG_MTD_PXA_CERF=y -+# CONFIG_MTD_EPXA10DB is not set -+# CONFIG_MTD_AUTCPU12 is not set -+# CONFIG_MTD_EDB7312 is not set -+# CONFIG_MTD_IMPA7 is not set -+# CONFIG_MTD_PCI is not set -+ -+# -+# Self-contained MTD device drivers -+# -+# CONFIG_MTD_PMC551 is not set -+# CONFIG_MTD_SLRAM is not set -+# CONFIG_MTD_MTDRAM is not set -+# CONFIG_MTD_BLKMTD is not set -+# CONFIG_MTD_DOC1000 is not set -+# CONFIG_MTD_DOC2000 is not set -+# CONFIG_MTD_DOC2001 is not set -+# CONFIG_MTD_DOCPROBE is not set -+ -+# -+# NAND Flash Device Drivers -+# -+# CONFIG_MTD_NAND is not set -+ -+# -+# Plug and Play configuration -+# -+# CONFIG_PNP is not set -+# CONFIG_ISAPNP is not set -+ -+# -+# Block devices -+# -+# CONFIG_BLK_DEV_FD is not set -+# CONFIG_BLK_DEV_XD is not set -+# CONFIG_PARIDE is not set -+# CONFIG_BLK_CPQ_DA is not set -+# CONFIG_BLK_CPQ_CISS_DA is not set -+# CONFIG_CISS_SCSI_TAPE is not set -+# CONFIG_BLK_DEV_DAC960 is not set -+# CONFIG_BLK_DEV_UMEM is not set -+CONFIG_BLK_DEV_LOOP=m -+# CONFIG_BLK_DEV_NBD is not set -+CONFIG_BLK_DEV_RAM=y -+CONFIG_BLK_DEV_RAM_SIZE=4096 -+CONFIG_BLK_DEV_INITRD=y -+ -+# -+# Multi-device support (RAID and LVM) -+# -+# CONFIG_MD is not set -+# CONFIG_BLK_DEV_MD is not set -+# CONFIG_MD_LINEAR is not set -+# CONFIG_MD_RAID0 is not set -+# CONFIG_MD_RAID1 is not set -+# CONFIG_MD_RAID5 is not set -+# CONFIG_MD_MULTIPATH is not set -+# CONFIG_BLK_DEV_LVM is not set -+ -+# -+# Networking options -+# -+CONFIG_PACKET=y -+# CONFIG_PACKET_MMAP is not set -+# CONFIG_NETLINK_DEV is not set -+# CONFIG_NETFILTER is not set -+CONFIG_FILTER=y -+CONFIG_UNIX=y -+CONFIG_INET=y -+# CONFIG_IP_MULTICAST is not set -+# CONFIG_IP_ADVANCED_ROUTER is not set -+CONFIG_IP_PNP=y -+CONFIG_IP_PNP_DHCP=y -+CONFIG_IP_PNP_BOOTP=y -+CONFIG_IP_PNP_RARP=y -+# CONFIG_NET_IPIP is not set -+# CONFIG_NET_IPGRE is not set -+# CONFIG_ARPD is not set -+# CONFIG_INET_ECN is not set -+# CONFIG_SYN_COOKIES is not set -+# CONFIG_IPV6 is not set -+# CONFIG_KHTTPD is not set -+# CONFIG_ATM is not set -+# CONFIG_VLAN_8021Q is not set -+# CONFIG_IPX is not set -+# CONFIG_ATALK is not set -+ -+# -+# Appletalk devices -+# -+# CONFIG_DEV_APPLETALK is not set -+# CONFIG_DECNET is not set -+# CONFIG_BRIDGE is not set -+# CONFIG_X25 is not set -+# CONFIG_LAPB is not set -+# CONFIG_LLC is not set -+# CONFIG_NET_DIVERT is not set -+# CONFIG_ECONET is not set -+# CONFIG_WAN_ROUTER is not set -+# CONFIG_NET_FASTROUTE is not set -+# CONFIG_NET_HW_FLOWCONTROL is not set -+ -+# -+# QoS and/or fair queueing -+# -+# CONFIG_NET_SCHED is not set -+ -+# -+# Network testing -+# -+# CONFIG_NET_PKTGEN is not set -+ -+# -+# Network device support -+# -+CONFIG_NETDEVICES=y -+ -+# -+# ARCnet devices -+# -+# CONFIG_ARCNET is not set -+# CONFIG_DUMMY is not set -+# CONFIG_BONDING is not set -+# CONFIG_EQUALIZER is not set -+# CONFIG_TUN is not set -+# CONFIG_ETHERTAP is not set -+ -+# -+# Ethernet (10 or 100Mbit) -+# -+CONFIG_NET_ETHERNET=y -+# CONFIG_ARM_AM79C961A is not set -+# CONFIG_ARM_CIRRUS is not set -+# CONFIG_SUNLANCE is not set -+# CONFIG_SUNBMAC is not set -+# CONFIG_SUNQE is not set -+# CONFIG_SUNGEM is not set -+# CONFIG_NET_VENDOR_3COM is not set -+# CONFIG_LANCE is not set -+CONFIG_NET_VENDOR_SMC=y -+# CONFIG_WD80x3 is not set -+# CONFIG_ULTRAMCA is not set -+# CONFIG_ULTRA is not set -+# CONFIG_ULTRA32 is not set -+# CONFIG_SMC9194 is not set -+# CONFIG_NET_VENDOR_RACAL is not set -+# CONFIG_NET_ISA is not set -+# CONFIG_NET_PCI is not set -+# CONFIG_NET_POCKET is not set -+ -+# -+# Ethernet (1000 Mbit) -+# -+# CONFIG_ACENIC is not set -+# CONFIG_DL2K is not set -+# CONFIG_MYRI_SBUS is not set -+# CONFIG_NS83820 is not set -+# CONFIG_HAMACHI is not set -+# CONFIG_YELLOWFIN is not set -+# CONFIG_SK98LIN is not set -+# CONFIG_TIGON3 is not set -+# CONFIG_FDDI is not set -+# CONFIG_HIPPI is not set -+# CONFIG_PLIP is not set -+CONFIG_PPP=m -+# CONFIG_PPP_MULTILINK is not set -+# CONFIG_PPP_FILTER is not set -+CONFIG_PPP_ASYNC=m -+# CONFIG_PPP_SYNC_TTY is not set -+CONFIG_PPP_DEFLATE=m -+CONFIG_PPP_BSDCOMP=m -+# CONFIG_PPPOE is not set -+# CONFIG_SLIP is not set -+ -+# -+# Wireless LAN (non-hamradio) -+# -+# CONFIG_NET_RADIO is not set -+ -+# -+# Token Ring devices -+# -+# CONFIG_TR is not set -+# CONFIG_NET_FC is not set -+# CONFIG_RCPCI is not set -+# CONFIG_SHAPER is not set -+ -+# -+# Wan interfaces -+# -+# CONFIG_WAN is not set -+ -+# -+# PCMCIA network device support -+# -+CONFIG_NET_PCMCIA=y -+CONFIG_PCMCIA_3C589=m -+CONFIG_PCMCIA_3C574=m -+CONFIG_PCMCIA_FMVJ18X=m -+CONFIG_PCMCIA_PCNET=m -+CONFIG_PCMCIA_AXNET=m -+CONFIG_PCMCIA_NMCLAN=m -+CONFIG_PCMCIA_SMC91C92=m -+CONFIG_PCMCIA_XIRC2PS=m -+# CONFIG_ARCNET_COM20020_CS is not set -+# CONFIG_PCMCIA_IBMTR is not set -+CONFIG_NET_PCMCIA_RADIO=y -+CONFIG_PCMCIA_RAYCS=m -+CONFIG_PCMCIA_NETWAVE=m -+CONFIG_PCMCIA_WAVELAN=m -+CONFIG_AIRONET4500_CS=m -+ -+# -+# Amateur Radio support -+# -+# CONFIG_HAMRADIO is not set -+ -+# -+# IrDA (infrared) support -+# -+# CONFIG_IRDA is not set -+ -+# -+# ATA/ATAPI/MFM/RLL support -+# -+CONFIG_IDE=y -+ -+# -+# IDE, ATA and ATAPI Block devices -+# -+CONFIG_BLK_DEV_IDE=y -+# CONFIG_BLK_DEV_HD_IDE is not set -+# CONFIG_BLK_DEV_HD is not set -+CONFIG_BLK_DEV_IDEDISK=y -+# CONFIG_IDEDISK_MULTI_MODE is not set -+# CONFIG_IDEDISK_STROKE is not set -+# CONFIG_BLK_DEV_IDEDISK_VENDOR is not set -+# CONFIG_BLK_DEV_IDEDISK_FUJITSU is not set -+# CONFIG_BLK_DEV_IDEDISK_IBM is not set -+# CONFIG_BLK_DEV_IDEDISK_MAXTOR is not set -+# CONFIG_BLK_DEV_IDEDISK_QUANTUM is not set -+# CONFIG_BLK_DEV_IDEDISK_SEAGATE is not set -+# CONFIG_BLK_DEV_IDEDISK_WD is not set -+# CONFIG_BLK_DEV_COMMERIAL is not set -+# CONFIG_BLK_DEV_TIVO is not set -+CONFIG_BLK_DEV_IDECS=m -+# CONFIG_BLK_DEV_IDECD is not set -+# CONFIG_BLK_DEV_IDETAPE is not set -+# CONFIG_BLK_DEV_IDEFLOPPY is not set -+# CONFIG_BLK_DEV_IDESCSI is not set -+# CONFIG_IDE_TASK_IOCTL is not set -+# CONFIG_BLK_DEV_CMD640 is not set -+# CONFIG_BLK_DEV_CMD640_ENHANCED is not set -+# CONFIG_BLK_DEV_ISAPNP is not set -+# CONFIG_IDE_CHIPSETS is not set -+# CONFIG_IDEDMA_AUTO is not set -+# CONFIG_DMA_NONPCI is not set -+# CONFIG_BLK_DEV_IDE_MODES is not set -+# CONFIG_BLK_DEV_ATARAID is not set -+# CONFIG_BLK_DEV_ATARAID_PDC is not set -+# CONFIG_BLK_DEV_ATARAID_HPT is not set -+ -+# -+# SCSI support -+# -+# CONFIG_SCSI is not set -+ -+# -+# I2O device support -+# -+# CONFIG_I2O is not set -+# CONFIG_I2O_BLOCK is not set -+# CONFIG_I2O_LAN is not set -+# CONFIG_I2O_SCSI is not set -+# CONFIG_I2O_PROC is not set -+ -+# -+# ISDN subsystem -+# -+# CONFIG_ISDN is not set -+ -+# -+# Input core support -+# -+# CONFIG_INPUT is not set -+# CONFIG_INPUT_KEYBDEV is not set -+# CONFIG_INPUT_MOUSEDEV is not set -+# CONFIG_INPUT_JOYDEV is not set -+# CONFIG_INPUT_EVDEV is not set -+ -+# -+# Character devices -+# -+CONFIG_VT=y -+CONFIG_VT_CONSOLE=y -+CONFIG_SERIAL=y -+CONFIG_SERIAL_CONSOLE=y -+# CONFIG_SERIAL_EXTENDED is not set -+# CONFIG_SERIAL_NONSTANDARD is not set -+ -+# -+# Serial drivers -+# -+# CONFIG_SERIAL_ANAKIN is not set -+# CONFIG_SERIAL_ANAKIN_CONSOLE is not set -+# CONFIG_SERIAL_AMBA is not set -+# CONFIG_SERIAL_AMBA_CONSOLE is not set -+# CONFIG_SERIAL_CLPS711X is not set -+# CONFIG_SERIAL_CLPS711X_CONSOLE is not set -+# CONFIG_SERIAL_21285 is not set -+# CONFIG_SERIAL_21285_OLD is not set -+# CONFIG_SERIAL_21285_CONSOLE is not set -+# CONFIG_SERIAL_UART00 is not set -+# CONFIG_SERIAL_UART00_CONSOLE is not set -+# CONFIG_SERIAL_SA1100 is not set -+# CONFIG_SERIAL_SA1100_CONSOLE is not set -+# CONFIG_SERIAL_OMAHA is not set -+# CONFIG_SERIAL_OMAHA_CONSOLE is not set -+# CONFIG_SERIAL_8250 is not set -+# CONFIG_SERIAL_8250_CONSOLE is not set -+# CONFIG_SERIAL_8250_EXTENDED is not set -+# CONFIG_SERIAL_8250_MANY_PORTS is not set -+# CONFIG_SERIAL_8250_SHARE_IRQ is not set -+# CONFIG_SERIAL_8250_DETECT_IRQ is not set -+# CONFIG_SERIAL_8250_MULTIPORT is not set -+# CONFIG_SERIAL_8250_HUB6 is not set -+CONFIG_UNIX98_PTYS=y -+CONFIG_UNIX98_PTY_COUNT=256 -+ -+# -+# I2C support -+# -+CONFIG_I2C=y -+# CONFIG_I2C_ALGOBIT is not set -+# CONFIG_I2C_ALGOPCF is not set -+CONFIG_I2C_PXA_ALGO=y -+CONFIG_I2C_PXA_ADAP=y -+# CONFIG_I2C_CHARDEV is not set -+# CONFIG_I2C_PROC is not set -+# CONFIG_I2C_DS1307 is not set -+ -+# -+# L3 serial bus support -+# -+# CONFIG_L3 is not set -+# CONFIG_L3_ALGOBIT is not set -+# CONFIG_L3_BIT_SA1100_GPIO is not set -+# CONFIG_L3_SA1111 is not set -+# CONFIG_BIT_SA1100_GPIO is not set -+ -+# -+# Mice -+# -+# CONFIG_BUSMOUSE is not set -+# CONFIG_MOUSE is not set -+ -+# -+# Joysticks -+# -+# CONFIG_INPUT_GAMEPORT is not set -+# CONFIG_QIC02_TAPE is not set -+ -+# -+# Watchdog Cards -+# -+CONFIG_WATCHDOG=y -+# CONFIG_WATCHDOG_NOWAYOUT is not set -+# CONFIG_ACQUIRE_WDT is not set -+# CONFIG_ADVANTECH_WDT is not set -+# CONFIG_ALIM7101_WDT is not set -+# CONFIG_SC520_WDT is not set -+# CONFIG_PCWATCHDOG is not set -+# CONFIG_21285_WATCHDOG is not set -+# CONFIG_977_WATCHDOG is not set -+# CONFIG_SA1100_WATCHDOG is not set -+CONFIG_PXA_WATCHDOG=m -+# CONFIG_OMAHA_WATCHDOG is not set -+# CONFIG_EUROTECH_WDT is not set -+# CONFIG_IB700_WDT is not set -+# CONFIG_WAFER_WDT is not set -+# CONFIG_I810_TCO is not set -+# CONFIG_MIXCOMWD is not set -+# CONFIG_60XX_WDT is not set -+# CONFIG_SC1200_WDT is not set -+# CONFIG_SOFT_WATCHDOG is not set -+# CONFIG_W83877F_WDT is not set -+# CONFIG_WDT is not set -+# CONFIG_WDTPCI is not set -+# CONFIG_MACHZ_WDT is not set -+# CONFIG_NVRAM is not set -+# CONFIG_RTC is not set -+# CONFIG_PXA_RTC is not set -+# CONFIG_DTLK is not set -+# CONFIG_R3964 is not set -+# CONFIG_APPLICOM is not set -+ -+# -+# Ftape, the floppy tape device driver -+# -+# CONFIG_FTAPE is not set -+# CONFIG_AGP is not set -+# CONFIG_DRM is not set -+ -+# -+# PCMCIA character devices -+# -+CONFIG_PCMCIA_SERIAL_CS=y -+CONFIG_PCMCIA_CHRDEV=y -+ -+# -+# Multimedia devices -+# -+# CONFIG_VIDEO_DEV is not set -+ -+# -+# File systems -+# -+# CONFIG_QUOTA is not set -+CONFIG_AUTOFS_FS=y -+CONFIG_AUTOFS4_FS=y -+# CONFIG_REISERFS_FS is not set -+# CONFIG_REISERFS_CHECK is not set -+# CONFIG_REISERFS_PROC_INFO is not set -+# CONFIG_ADFS_FS is not set -+# CONFIG_ADFS_FS_RW is not set -+# CONFIG_AFFS_FS is not set -+# CONFIG_HFS_FS is not set -+# CONFIG_BFS_FS is not set -+# CONFIG_EXT3_FS is not set -+# CONFIG_JBD is not set -+# CONFIG_JBD_DEBUG is not set -+CONFIG_FAT_FS=m -+CONFIG_MSDOS_FS=m -+CONFIG_UMSDOS_FS=m -+CONFIG_VFAT_FS=m -+# CONFIG_EFS_FS is not set -+# CONFIG_JFFS_FS is not set -+CONFIG_JFFS2_FS=y -+CONFIG_JFFS2_FS_DEBUG=0 -+# CONFIG_CRAMFS is not set -+CONFIG_TMPFS=y -+CONFIG_RAMFS=y -+# CONFIG_ISO9660_FS is not set -+# CONFIG_JOLIET is not set -+# CONFIG_ZISOFS is not set -+# CONFIG_MINIX_FS is not set -+# CONFIG_VXFS_FS is not set -+# CONFIG_NTFS_FS is not set -+# CONFIG_NTFS_RW is not set -+# CONFIG_HPFS_FS is not set -+CONFIG_PROC_FS=y -+# CONFIG_DEVFS_FS is not set -+# CONFIG_DEVFS_MOUNT is not set -+# CONFIG_DEVFS_DEBUG is not set -+CONFIG_DEVPTS_FS=y -+# CONFIG_QNX4FS_FS is not set -+# CONFIG_QNX4FS_RW is not set -+CONFIG_ROMFS_FS=y -+CONFIG_EXT2_FS=y -+# CONFIG_SYSV_FS is not set -+# CONFIG_UDF_FS is not set -+# CONFIG_UDF_RW is not set -+# CONFIG_UFS_FS is not set -+# CONFIG_UFS_FS_WRITE is not set -+ -+# -+# Network File Systems -+# -+# CONFIG_CODA_FS is not set -+# CONFIG_INTERMEZZO_FS is not set -+CONFIG_NFS_FS=y -+CONFIG_NFS_V3=y -+CONFIG_ROOT_NFS=y -+# CONFIG_NFSD is not set -+# CONFIG_NFSD_V3 is not set -+CONFIG_SUNRPC=y -+CONFIG_LOCKD=y -+CONFIG_LOCKD_V4=y -+# CONFIG_SMB_FS is not set -+# CONFIG_NCP_FS is not set -+# CONFIG_NCPFS_PACKET_SIGNING is not set -+# CONFIG_NCPFS_IOCTL_LOCKING is not set -+# CONFIG_NCPFS_STRONG is not set -+# CONFIG_NCPFS_NFS_NS is not set -+# CONFIG_NCPFS_OS2_NS is not set -+# CONFIG_NCPFS_SMALLDOS is not set -+# CONFIG_NCPFS_NLS is not set -+# CONFIG_NCPFS_EXTRAS is not set -+# CONFIG_ZISOFS_FS is not set -+# CONFIG_ZLIB_FS_INFLATE is not set -+ -+# -+# Partition Types -+# -+# CONFIG_PARTITION_ADVANCED is not set -+CONFIG_MSDOS_PARTITION=y -+# CONFIG_SMB_NLS is not set -+CONFIG_NLS=y -+ -+# -+# Native Language Support -+# -+CONFIG_NLS_DEFAULT="iso8859-1" -+CONFIG_NLS_CODEPAGE_437=m -+# CONFIG_NLS_CODEPAGE_737 is not set -+# CONFIG_NLS_CODEPAGE_775 is not set -+CONFIG_NLS_CODEPAGE_850=m -+CONFIG_NLS_CODEPAGE_852=m -+# CONFIG_NLS_CODEPAGE_855 is not set -+# CONFIG_NLS_CODEPAGE_857 is not set -+# CONFIG_NLS_CODEPAGE_860 is not set -+# CONFIG_NLS_CODEPAGE_861 is not set -+# CONFIG_NLS_CODEPAGE_862 is not set -+CONFIG_NLS_CODEPAGE_863=m -+# CONFIG_NLS_CODEPAGE_864 is not set -+# CONFIG_NLS_CODEPAGE_865 is not set -+# CONFIG_NLS_CODEPAGE_866 is not set -+# CONFIG_NLS_CODEPAGE_869 is not set -+# CONFIG_NLS_CODEPAGE_936 is not set -+# CONFIG_NLS_CODEPAGE_950 is not set -+# CONFIG_NLS_CODEPAGE_932 is not set -+# CONFIG_NLS_CODEPAGE_949 is not set -+# CONFIG_NLS_CODEPAGE_874 is not set -+# CONFIG_NLS_ISO8859_8 is not set -+# CONFIG_NLS_CODEPAGE_1250 is not set -+# CONFIG_NLS_CODEPAGE_1251 is not set -+CONFIG_NLS_ISO8859_1=m -+CONFIG_NLS_ISO8859_2=m -+CONFIG_NLS_ISO8859_3=m -+CONFIG_NLS_ISO8859_4=m -+# CONFIG_NLS_ISO8859_5 is not set -+# CONFIG_NLS_ISO8859_6 is not set -+# CONFIG_NLS_ISO8859_7 is not set -+# CONFIG_NLS_ISO8859_9 is not set -+# CONFIG_NLS_ISO8859_13 is not set -+# CONFIG_NLS_ISO8859_14 is not set -+# CONFIG_NLS_ISO8859_15 is not set -+# CONFIG_NLS_KOI8_R is not set -+# CONFIG_NLS_KOI8_U is not set -+# CONFIG_NLS_UTF8 is not set -+ -+# -+# Console drivers -+# -+CONFIG_PC_KEYMAP=y -+# CONFIG_VGA_CONSOLE is not set -+ -+# -+# Frame-buffer support -+# -+# CONFIG_FB is not set -+ -+# -+# Sound -+# -+# CONFIG_SOUND is not set -+ -+# -+# Multimedia Capabilities Port drivers -+# -+# CONFIG_MCP is not set -+# CONFIG_MCP_SA1100 is not set -+# CONFIG_MCP_UCB1200 is not set -+# CONFIG_MCP_UCB1200_AUDIO is not set -+# CONFIG_MCP_UCB1200_TS is not set -+# CONFIG_MCP_UCB1400_TS is not set -+ -+# -+# USB support -+# -+# CONFIG_USB is not set -+ -+# -+# Bluetooth support -+# -+# CONFIG_BLUEZ is not set -+ -+# -+# Kernel hacking -+# -+CONFIG_FRAME_POINTER=y -+CONFIG_DEBUG_USER=y -+# CONFIG_DEBUG_INFO is not set -+# CONFIG_NO_PGT_CACHE is not set -+CONFIG_DEBUG_KERNEL=y -+# CONFIG_DEBUG_SLAB is not set -+CONFIG_MAGIC_SYSRQ=y -+# CONFIG_DEBUG_SPINLOCK is not set -+# CONFIG_DEBUG_WAITQ is not set -+CONFIG_DEBUG_BUGVERBOSE=y -+CONFIG_DEBUG_ERRORS=y -+CONFIG_DEBUG_LL=y -+# CONFIG_DEBUG_DC21285_PORT is not set -+# CONFIG_DEBUG_CLPS711X_UART2 is not set ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/def-configs/cerfpda_pxa 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,962 @@ -+# -+# Automatically generated by make menuconfig: don't edit -+# -+CONFIG_ARM=y -+# CONFIG_EISA is not set -+# CONFIG_SBUS is not set -+# CONFIG_MCA is not set -+CONFIG_UID16=y -+CONFIG_RWSEM_GENERIC_SPINLOCK=y -+# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set -+# CONFIG_GENERIC_BUST_SPINLOCK is not set -+# CONFIG_GENERIC_ISA_DMA is not set -+ -+# -+# Code maturity level options -+# -+CONFIG_EXPERIMENTAL=y -+# CONFIG_OBSOLETE is not set -+ -+# -+# Loadable module support -+# -+CONFIG_MODULES=y -+# CONFIG_MODVERSIONS is not set -+CONFIG_KMOD=y -+ -+# -+# System Type -+# -+# CONFIG_ARCH_ANAKIN is not set -+# CONFIG_ARCH_ARCA5K is not set -+# CONFIG_ARCH_CLPS7500 is not set -+# CONFIG_ARCH_CLPS711X is not set -+# CONFIG_ARCH_CO285 is not set -+CONFIG_ARCH_PXA=y -+# CONFIG_ARCH_EBSA110 is not set -+# CONFIG_ARCH_CAMELOT is not set -+# CONFIG_ARCH_FOOTBRIDGE is not set -+# CONFIG_ARCH_INTEGRATOR is not set -+# CONFIG_ARCH_L7200 is not set -+# CONFIG_ARCH_MX1ADS is not set -+# CONFIG_ARCH_RPC is not set -+# CONFIG_ARCH_SA1100 is not set -+# CONFIG_ARCH_SHARK is not set -+ -+# -+# Archimedes/A5000 Implementations -+# -+# CONFIG_ARCH_ARC is not set -+# CONFIG_ARCH_A5K is not set -+ -+# -+# Footbridge Implementations -+# -+# CONFIG_ARCH_CATS is not set -+# CONFIG_ARCH_PERSONAL_SERVER is not set -+# CONFIG_ARCH_EBSA285_ADDIN is not set -+# CONFIG_ARCH_EBSA285_HOST is not set -+# CONFIG_ARCH_NETWINDER is not set -+ -+# -+# SA11x0 Implementations -+# -+# CONFIG_SA1100_ASSABET is not set -+# CONFIG_ASSABET_NEPONSET is not set -+# CONFIG_SA1100_ADSBITSY is not set -+# CONFIG_SA1100_BRUTUS is not set -+# CONFIG_SA1100_CEP is not set -+# CONFIG_SA1100_CERF is not set -+# CONFIG_SA1100_H3100 is not set -+# CONFIG_SA1100_H3600 is not set -+# CONFIG_SA1100_H3800 is not set -+# CONFIG_SA1100_H3XXX is not set -+# CONFIG_SA1100_EXTENEX1 is not set -+# CONFIG_SA1100_FLEXANET is not set -+# CONFIG_SA1100_FREEBIRD is not set -+# CONFIG_SA1100_FRODO is not set -+# CONFIG_SA1100_GRAPHICSCLIENT is not set -+# CONFIG_SA1100_GRAPHICSMASTER is not set -+# CONFIG_SA1100_BADGE4 is not set -+# CONFIG_SA1100_JORNADA720 is not set -+# CONFIG_SA1100_HUW_WEBPANEL is not set -+# CONFIG_SA1100_ITSY is not set -+# CONFIG_SA1100_LART is not set -+# CONFIG_SA1100_NANOENGINE is not set -+# CONFIG_SA1100_OMNIMETER is not set -+# CONFIG_SA1100_PANGOLIN is not set -+# CONFIG_SA1100_PLEB is not set -+# CONFIG_SA1100_PT_SYSTEM3 is not set -+# CONFIG_SA1100_SHANNON is not set -+# CONFIG_SA1100_SHERMAN is not set -+# CONFIG_SA1100_SIMPAD is not set -+# CONFIG_SA1100_PFS168 is not set -+# CONFIG_SA1100_VICTOR is not set -+# CONFIG_SA1100_XP860 is not set -+# CONFIG_SA1100_YOPY is not set -+# CONFIG_SA1100_USB is not set -+# CONFIG_SA1100_USB_NETLINK is not set -+# CONFIG_SA1100_USB_CHAR is not set -+# CONFIG_H3600_SLEEVE is not set -+ -+# -+# Intel PXA250/210 Implementations -+# -+# CONFIG_ARCH_LUBBOCK is not set -+# CONFIG_ARCH_PXA_IDP is not set -+CONFIG_ARCH_PXA_CERF=y -+CONFIG_PXA_CERF=y -+CONFIG_PXA_CERF_PDA=y -+# CONFIG_PXA_CERF_BOARD is not set -+# CONFIG_PXA_CERF_RAM_128MB is not set -+CONFIG_PXA_CERF_RAM_64MB=y -+# CONFIG_PXA_CERF_RAM_32MB is not set -+# CONFIG_PXA_CERF_RAM_16MB is not set -+# CONFIG_PXA_CERF_FLASH_64MB is not set -+CONFIG_PXA_CERF_FLASH_32MB=y -+# CONFIG_PXA_CERF_FLASH_16MB is not set -+# CONFIG_PXA_CERF_FLASH_8MB is not set -+CONFIG_PXA_USB=y -+CONFIG_PXA_USB_NETLINK=y -+CONFIG_PXA_USB_CHAR=y -+ -+# -+# CLPS711X/EP721X Implementations -+# -+# CONFIG_ARCH_AUTCPU12 is not set -+# CONFIG_ARCH_CDB89712 is not set -+# CONFIG_ARCH_CLEP7312 is not set -+# CONFIG_ARCH_EDB7211 is not set -+# CONFIG_ARCH_P720T is not set -+# CONFIG_ARCH_FORTUNET is not set -+# CONFIG_ARCH_EP7211 is not set -+# CONFIG_ARCH_EP7212 is not set -+# CONFIG_ARCH_ACORN is not set -+# CONFIG_FOOTBRIDGE is not set -+# CONFIG_FOOTBRIDGE_HOST is not set -+# CONFIG_FOOTBRIDGE_ADDIN is not set -+CONFIG_CPU_32=y -+# CONFIG_CPU_26 is not set -+# CONFIG_CPU_32v3 is not set -+# CONFIG_CPU_32v4 is not set -+# CONFIG_CPU_ARM610 is not set -+# CONFIG_CPU_ARM710 is not set -+# CONFIG_CPU_ARM720T is not set -+# CONFIG_CPU_ARM920T is not set -+# CONFIG_CPU_ARM922T is not set -+# CONFIG_PLD is not set -+# CONFIG_CPU_ARM926T is not set -+# CONFIG_CPU_ARM1020 is not set -+# CONFIG_CPU_SA110 is not set -+# CONFIG_CPU_SA1100 is not set -+CONFIG_CPU_32v5=y -+CONFIG_CPU_XSCALE=y -+# CONFIG_XSCALE_CACHE_ERRATA is not set -+# CONFIG_ARM_THUMB is not set -+# CONFIG_DISCONTIGMEM is not set -+ -+# -+# General setup -+# -+# CONFIG_PCI is not set -+# CONFIG_ISA is not set -+# CONFIG_ISA_DMA is not set -+# CONFIG_ZBOOT_ROM is not set -+CONFIG_ZBOOT_ROM_TEXT=0 -+CONFIG_ZBOOT_ROM_BSS=0 -+CONFIG_HOTPLUG=y -+ -+# -+# PCMCIA/CardBus support -+# -+CONFIG_PCMCIA=y -+# CONFIG_I82092 is not set -+# CONFIG_I82365 is not set -+# CONFIG_TCIC is not set -+# CONFIG_PCMCIA_CLPS6700 is not set -+# CONFIG_PCMCIA_SA1100 is not set -+CONFIG_PCMCIA_PXA=y -+CONFIG_NET=y -+CONFIG_SYSVIPC=y -+CONFIG_BSD_PROCESS_ACCT=y -+CONFIG_SYSCTL=y -+CONFIG_FPE_NWFPE=y -+# CONFIG_FPE_FASTFPE is not set -+CONFIG_KCORE_ELF=y -+# CONFIG_KCORE_AOUT is not set -+# CONFIG_BINFMT_AOUT is not set -+CONFIG_BINFMT_ELF=y -+# CONFIG_BINFMT_MISC is not set -+# CONFIG_PM is not set -+# CONFIG_ARTHUR is not set -+CONFIG_CMDLINE="root=1f03 rw console=tty0 console=ttyS0,38400 init=/linuxrc" -+CONFIG_LEDS=y -+# CONFIG_LEDS_TIMER is not set -+CONFIG_LEDS_CPU=y -+CONFIG_ALIGNMENT_TRAP=y -+ -+# -+# Parallel port support -+# -+# CONFIG_PARPORT is not set -+ -+# -+# Memory Technology Devices (MTD) -+# -+CONFIG_MTD=y -+# CONFIG_MTD_DEBUG is not set -+CONFIG_MTD_PARTITIONS=y -+# CONFIG_MTD_CONCAT is not set -+CONFIG_MTD_REDBOOT_PARTS=y -+# CONFIG_MTD_CMDLINE_PARTS is not set -+# CONFIG_MTD_AFS_PARTS is not set -+CONFIG_MTD_CHAR=y -+CONFIG_MTD_BLOCK=y -+# CONFIG_FTL is not set -+# CONFIG_NFTL is not set -+ -+# -+# RAM/ROM/Flash chip drivers -+# -+CONFIG_MTD_CFI=y -+# CONFIG_MTD_JEDECPROBE is not set -+CONFIG_MTD_GEN_PROBE=y -+CONFIG_MTD_CFI_ADV_OPTIONS=y -+CONFIG_MTD_CFI_NOSWAP=y -+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set -+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set -+CONFIG_MTD_CFI_GEOMETRY=y -+# CONFIG_MTD_CFI_B1 is not set -+# CONFIG_MTD_CFI_B2 is not set -+CONFIG_MTD_CFI_B4=y -+# CONFIG_MTD_CFI_B8 is not set -+# CONFIG_MTD_CFI_I1 is not set -+CONFIG_MTD_CFI_I2=y -+# CONFIG_MTD_CFI_I4 is not set -+# CONFIG_MTD_CFI_I8 is not set -+CONFIG_MTD_CFI_INTELEXT=y -+# CONFIG_MTD_CFI_AMDSTD is not set -+# CONFIG_MTD_RAM is not set -+# CONFIG_MTD_ROM is not set -+# CONFIG_MTD_ABSENT is not set -+# CONFIG_MTD_OBSOLETE_CHIPS is not set -+# CONFIG_MTD_AMDSTD is not set -+# CONFIG_MTD_SHARP is not set -+# CONFIG_MTD_JEDEC is not set -+ -+# -+# Mapping drivers for chip access -+# -+# CONFIG_MTD_PHYSMAP is not set -+# CONFIG_MTD_LUBBOCK is not set -+# CONFIG_MTD_NORA is not set -+# CONFIG_MTD_ARM_INTEGRATOR is not set -+# CONFIG_MTD_CDB89712 is not set -+# CONFIG_MTD_SA1100 is not set -+# CONFIG_MTD_DC21285 is not set -+# CONFIG_MTD_IQ80310 is not set -+# CONFIG_MTD_FORTUNET is not set -+CONFIG_MTD_PXA_CERF=y -+# CONFIG_MTD_EPXA10DB is not set -+# CONFIG_MTD_AUTCPU12 is not set -+# CONFIG_MTD_EDB7312 is not set -+# CONFIG_MTD_IMPA7 is not set -+# CONFIG_MTD_PCI is not set -+ -+# -+# Self-contained MTD device drivers -+# -+# CONFIG_MTD_PMC551 is not set -+# CONFIG_MTD_SLRAM is not set -+# CONFIG_MTD_MTDRAM is not set -+# CONFIG_MTD_BLKMTD is not set -+# CONFIG_MTD_DOC1000 is not set -+# CONFIG_MTD_DOC2000 is not set -+# CONFIG_MTD_DOC2001 is not set -+# CONFIG_MTD_DOCPROBE is not set -+ -+# -+# NAND Flash Device Drivers -+# -+# CONFIG_MTD_NAND is not set -+ -+# -+# Plug and Play configuration -+# -+# CONFIG_PNP is not set -+# CONFIG_ISAPNP is not set -+ -+# -+# Block devices -+# -+# CONFIG_BLK_DEV_FD is not set -+# CONFIG_BLK_DEV_XD is not set -+# CONFIG_PARIDE is not set -+# CONFIG_BLK_CPQ_DA is not set -+# CONFIG_BLK_CPQ_CISS_DA is not set -+# CONFIG_BLK_DEV_DAC960 is not set -+CONFIG_BLK_DEV_LOOP=m -+# CONFIG_BLK_DEV_NBD is not set -+CONFIG_BLK_DEV_RAM=y -+CONFIG_BLK_DEV_RAM_SIZE=4096 -+CONFIG_BLK_DEV_INITRD=y -+ -+# -+# Multi-device support (RAID and LVM) -+# -+# CONFIG_MD is not set -+# CONFIG_BLK_DEV_MD is not set -+# CONFIG_MD_LINEAR is not set -+# CONFIG_MD_RAID0 is not set -+# CONFIG_MD_RAID1 is not set -+# CONFIG_MD_RAID5 is not set -+# CONFIG_MD_MULTIPATH is not set -+# CONFIG_BLK_DEV_LVM is not set -+ -+# -+# Networking options -+# -+CONFIG_PACKET=y -+# CONFIG_PACKET_MMAP is not set -+# CONFIG_NETLINK_DEV is not set -+# CONFIG_NETFILTER is not set -+CONFIG_FILTER=y -+CONFIG_UNIX=y -+CONFIG_INET=y -+# CONFIG_IP_MULTICAST is not set -+# CONFIG_IP_ADVANCED_ROUTER is not set -+CONFIG_IP_PNP=y -+CONFIG_IP_PNP_DHCP=y -+CONFIG_IP_PNP_BOOTP=y -+CONFIG_IP_PNP_RARP=y -+# CONFIG_NET_IPIP is not set -+# CONFIG_NET_IPGRE is not set -+# CONFIG_ARPD is not set -+# CONFIG_INET_ECN is not set -+# CONFIG_SYN_COOKIES is not set -+# CONFIG_IPV6 is not set -+# CONFIG_KHTTPD is not set -+# CONFIG_ATM is not set -+# CONFIG_VLAN_8021Q is not set -+# CONFIG_IPX is not set -+# CONFIG_ATALK is not set -+# CONFIG_DECNET is not set -+# CONFIG_BRIDGE is not set -+# CONFIG_X25 is not set -+# CONFIG_LAPB is not set -+# CONFIG_LLC is not set -+# CONFIG_NET_DIVERT is not set -+# CONFIG_ECONET is not set -+# CONFIG_WAN_ROUTER is not set -+# CONFIG_NET_FASTROUTE is not set -+# CONFIG_NET_HW_FLOWCONTROL is not set -+ -+# -+# QoS and/or fair queueing -+# -+# CONFIG_NET_SCHED is not set -+ -+# -+# Network device support -+# -+CONFIG_NETDEVICES=y -+ -+# -+# ARCnet devices -+# -+# CONFIG_ARCNET is not set -+# CONFIG_DUMMY is not set -+# CONFIG_BONDING is not set -+# CONFIG_EQUALIZER is not set -+# CONFIG_TUN is not set -+# CONFIG_ETHERTAP is not set -+ -+# -+# Ethernet (10 or 100Mbit) -+# -+CONFIG_NET_ETHERNET=y -+# CONFIG_ARM_AM79C961A is not set -+# CONFIG_SUNLANCE is not set -+# CONFIG_SUNBMAC is not set -+# CONFIG_SUNQE is not set -+# CONFIG_SUNGEM is not set -+# CONFIG_NET_VENDOR_3COM is not set -+# CONFIG_LANCE is not set -+# CONFIG_NET_VENDOR_SMC is not set -+# CONFIG_NET_VENDOR_RACAL is not set -+# CONFIG_NET_ISA is not set -+# CONFIG_NET_PCI is not set -+# CONFIG_NET_POCKET is not set -+ -+# -+# Ethernet (1000 Mbit) -+# -+# CONFIG_ACENIC is not set -+# CONFIG_DL2K is not set -+# CONFIG_MYRI_SBUS is not set -+# CONFIG_NS83820 is not set -+# CONFIG_HAMACHI is not set -+# CONFIG_YELLOWFIN is not set -+# CONFIG_SK98LIN is not set -+# CONFIG_FDDI is not set -+# CONFIG_HIPPI is not set -+# CONFIG_PLIP is not set -+CONFIG_PPP=m -+# CONFIG_PPP_MULTILINK is not set -+# CONFIG_PPP_FILTER is not set -+CONFIG_PPP_ASYNC=m -+# CONFIG_PPP_SYNC_TTY is not set -+CONFIG_PPP_DEFLATE=m -+CONFIG_PPP_BSDCOMP=m -+# CONFIG_PPPOE is not set -+# CONFIG_SLIP is not set -+ -+# -+# Wireless LAN (non-hamradio) -+# -+# CONFIG_NET_RADIO is not set -+ -+# -+# Token Ring devices -+# -+# CONFIG_TR is not set -+# CONFIG_NET_FC is not set -+# CONFIG_RCPCI is not set -+# CONFIG_SHAPER is not set -+ -+# -+# Wan interfaces -+# -+# CONFIG_WAN is not set -+ -+# -+# PCMCIA network device support -+# -+CONFIG_NET_PCMCIA=y -+CONFIG_PCMCIA_3C589=m -+CONFIG_PCMCIA_3C574=m -+CONFIG_PCMCIA_FMVJ18X=m -+CONFIG_PCMCIA_PCNET=m -+CONFIG_PCMCIA_AXNET=m -+CONFIG_PCMCIA_NMCLAN=m -+CONFIG_PCMCIA_SMC91C92=m -+CONFIG_PCMCIA_XIRC2PS=m -+# CONFIG_ARCNET_COM20020_CS is not set -+# CONFIG_PCMCIA_IBMTR is not set -+# CONFIG_NET_PCMCIA_RADIO is not set -+ -+# -+# Amateur Radio support -+# -+# CONFIG_HAMRADIO is not set -+ -+# -+# IrDA (infrared) support -+# -+CONFIG_IRDA=y -+CONFIG_IRLAN=y -+# CONFIG_IRNET is not set -+CONFIG_IRCOMM=y -+CONFIG_IRDA_ULTRA=y -+# CONFIG_IRDA_CACHE_LAST_LSAP is not set -+# CONFIG_IRDA_FAST_RR is not set -+CONFIG_IRDA_DEBUG=y -+ -+# -+# Infrared-port device drivers -+# -+CONFIG_IRTTY_SIR=y -+# CONFIG_IRPORT_SIR is not set -+# CONFIG_DONGLE is not set -+# CONFIG_USB_IRDA is not set -+# CONFIG_NSC_FIR is not set -+# CONFIG_WINBOND_FIR is not set -+# CONFIG_TOSHIBA_FIR is not set -+# CONFIG_SMC_IRCC_FIR is not set -+# CONFIG_ALI_FIR is not set -+# CONFIG_VLSI_FIR is not set -+ -+# -+# ATA/IDE/MFM/RLL support -+# -+CONFIG_IDE=y -+ -+# -+# IDE, ATA and ATAPI Block devices -+# -+CONFIG_BLK_DEV_IDE=y -+# CONFIG_BLK_DEV_HD_IDE is not set -+# CONFIG_BLK_DEV_HD is not set -+CONFIG_BLK_DEV_IDEDISK=y -+# CONFIG_IDEDISK_MULTI_MODE is not set -+# CONFIG_BLK_DEV_IDEDISK_VENDOR is not set -+# CONFIG_BLK_DEV_IDEDISK_FUJITSU is not set -+# CONFIG_BLK_DEV_IDEDISK_IBM is not set -+# CONFIG_BLK_DEV_IDEDISK_MAXTOR is not set -+# CONFIG_BLK_DEV_IDEDISK_QUANTUM is not set -+# CONFIG_BLK_DEV_IDEDISK_SEAGATE is not set -+# CONFIG_BLK_DEV_IDEDISK_WD is not set -+# CONFIG_BLK_DEV_COMMERIAL is not set -+# CONFIG_BLK_DEV_TIVO is not set -+CONFIG_BLK_DEV_IDECS=m -+# CONFIG_BLK_DEV_IDECD is not set -+# CONFIG_BLK_DEV_IDETAPE is not set -+# CONFIG_BLK_DEV_IDEFLOPPY is not set -+# CONFIG_BLK_DEV_IDESCSI is not set -+# CONFIG_BLK_DEV_CMD640 is not set -+# CONFIG_BLK_DEV_CMD640_ENHANCED is not set -+# CONFIG_BLK_DEV_ISAPNP is not set -+# CONFIG_IDE_CHIPSETS is not set -+# CONFIG_IDEDMA_AUTO is not set -+# CONFIG_DMA_NONPCI is not set -+# CONFIG_BLK_DEV_IDE_MODES is not set -+# CONFIG_BLK_DEV_ATARAID is not set -+# CONFIG_BLK_DEV_ATARAID_PDC is not set -+# CONFIG_BLK_DEV_ATARAID_HPT is not set -+ -+# -+# SCSI support -+# -+# CONFIG_SCSI is not set -+ -+# -+# I2O device support -+# -+# CONFIG_I2O is not set -+# CONFIG_I2O_BLOCK is not set -+# CONFIG_I2O_LAN is not set -+# CONFIG_I2O_SCSI is not set -+# CONFIG_I2O_PROC is not set -+ -+# -+# ISDN subsystem -+# -+# CONFIG_ISDN is not set -+ -+# -+# Input core support -+# -+CONFIG_INPUT=y -+# CONFIG_INPUT_KEYBDEV is not set -+# CONFIG_INPUT_MOUSEDEV is not set -+# CONFIG_INPUT_JOYDEV is not set -+CONFIG_INPUT_EVDEV=y -+ -+# -+# Character devices -+# -+CONFIG_VT=y -+CONFIG_VT_CONSOLE=y -+CONFIG_SERIAL=y -+CONFIG_SERIAL_CONSOLE=y -+# CONFIG_SERIAL_EXTENDED is not set -+# CONFIG_SERIAL_NONSTANDARD is not set -+ -+# -+# Serial drivers -+# -+# CONFIG_SERIAL_ANAKIN is not set -+# CONFIG_SERIAL_ANAKIN_CONSOLE is not set -+# CONFIG_SERIAL_AMBA is not set -+# CONFIG_SERIAL_AMBA_CONSOLE is not set -+# CONFIG_SERIAL_CLPS711X is not set -+# CONFIG_SERIAL_CLPS711X_CONSOLE is not set -+# CONFIG_SERIAL_21285 is not set -+# CONFIG_SERIAL_21285_OLD is not set -+# CONFIG_SERIAL_21285_CONSOLE is not set -+# CONFIG_SERIAL_UART00 is not set -+# CONFIG_SERIAL_UART00_CONSOLE is not set -+# CONFIG_SERIAL_SA1100 is not set -+# CONFIG_SERIAL_SA1100_CONSOLE is not set -+# CONFIG_SERIAL_8250 is not set -+# CONFIG_SERIAL_8250_CONSOLE is not set -+# CONFIG_SERIAL_8250_EXTENDED is not set -+# CONFIG_SERIAL_8250_MANY_PORTS is not set -+# CONFIG_SERIAL_8250_SHARE_IRQ is not set -+# CONFIG_SERIAL_8250_DETECT_IRQ is not set -+# CONFIG_SERIAL_8250_MULTIPORT is not set -+# CONFIG_SERIAL_8250_HUB6 is not set -+CONFIG_UNIX98_PTYS=y -+CONFIG_UNIX98_PTY_COUNT=256 -+ -+# -+# I2C support -+# -+# CONFIG_I2C is not set -+ -+# -+# L3 serial bus support -+# -+# CONFIG_L3 is not set -+# CONFIG_L3_ALGOBIT is not set -+# CONFIG_L3_BIT_SA1100_GPIO is not set -+# CONFIG_L3_SA1111 is not set -+# CONFIG_BIT_SA1100_GPIO is not set -+ -+# -+# Mice -+# -+# CONFIG_BUSMOUSE is not set -+# CONFIG_MOUSE is not set -+ -+# -+# Joysticks -+# -+# CONFIG_INPUT_GAMEPORT is not set -+# CONFIG_INPUT_NS558 is not set -+# CONFIG_INPUT_LIGHTNING is not set -+# CONFIG_INPUT_PCIGAME is not set -+# CONFIG_INPUT_CS461X is not set -+# CONFIG_INPUT_EMU10K1 is not set -+# CONFIG_INPUT_SERIO is not set -+# CONFIG_INPUT_SERPORT is not set -+# CONFIG_INPUT_ANALOG is not set -+# CONFIG_INPUT_A3D is not set -+# CONFIG_INPUT_ADI is not set -+# CONFIG_INPUT_COBRA is not set -+# CONFIG_INPUT_GF2K is not set -+# CONFIG_INPUT_GRIP is not set -+# CONFIG_INPUT_INTERACT is not set -+# CONFIG_INPUT_TMDC is not set -+# CONFIG_INPUT_SIDEWINDER is not set -+# CONFIG_INPUT_IFORCE_USB is not set -+# CONFIG_INPUT_IFORCE_232 is not set -+# CONFIG_INPUT_WARRIOR is not set -+# CONFIG_INPUT_MAGELLAN is not set -+# CONFIG_INPUT_SPACEORB is not set -+# CONFIG_INPUT_SPACEBALL is not set -+# CONFIG_INPUT_STINGER is not set -+# CONFIG_INPUT_DB9 is not set -+# CONFIG_INPUT_GAMECON is not set -+# CONFIG_INPUT_TURBOGRAFX is not set -+# CONFIG_QIC02_TAPE is not set -+ -+# -+# Watchdog Cards -+# -+# CONFIG_WATCHDOG is not set -+# CONFIG_INTEL_RNG is not set -+# CONFIG_NVRAM is not set -+# CONFIG_RTC is not set -+# CONFIG_DTLK is not set -+# CONFIG_R3964 is not set -+# CONFIG_APPLICOM is not set -+ -+# -+# Ftape, the floppy tape device driver -+# -+# CONFIG_FTAPE is not set -+# CONFIG_AGP is not set -+# CONFIG_DRM is not set -+ -+# -+# PCMCIA character devices -+# -+CONFIG_PCMCIA_SERIAL_CS=y -+CONFIG_PCMCIA_CHRDEV=y -+ -+# -+# Multimedia devices -+# -+# CONFIG_VIDEO_DEV is not set -+ -+# -+# File systems -+# -+# CONFIG_QUOTA is not set -+CONFIG_AUTOFS_FS=y -+CONFIG_AUTOFS4_FS=y -+# CONFIG_REISERFS_FS is not set -+# CONFIG_REISERFS_CHECK is not set -+# CONFIG_REISERFS_PROC_INFO is not set -+# CONFIG_ADFS_FS is not set -+# CONFIG_ADFS_FS_RW is not set -+# CONFIG_AFFS_FS is not set -+# CONFIG_HFS_FS is not set -+# CONFIG_BFS_FS is not set -+# CONFIG_EXT3_FS is not set -+# CONFIG_JBD is not set -+# CONFIG_JBD_DEBUG is not set -+CONFIG_FAT_FS=m -+CONFIG_MSDOS_FS=m -+CONFIG_UMSDOS_FS=m -+CONFIG_VFAT_FS=m -+# CONFIG_EFS_FS is not set -+# CONFIG_JFFS_FS is not set -+CONFIG_JFFS2_FS=y -+CONFIG_JFFS2_FS_DEBUG=0 -+# CONFIG_CRAMFS is not set -+CONFIG_TMPFS=y -+CONFIG_RAMFS=m -+# CONFIG_ISO9660_FS is not set -+# CONFIG_JOLIET is not set -+# CONFIG_ZISOFS is not set -+# CONFIG_MINIX_FS is not set -+# CONFIG_VXFS_FS is not set -+# CONFIG_NTFS_FS is not set -+# CONFIG_NTFS_RW is not set -+# CONFIG_HPFS_FS is not set -+CONFIG_PROC_FS=y -+# CONFIG_DEVFS_FS is not set -+# CONFIG_DEVFS_MOUNT is not set -+# CONFIG_DEVFS_DEBUG is not set -+CONFIG_DEVPTS_FS=y -+# CONFIG_QNX4FS_FS is not set -+# CONFIG_QNX4FS_RW is not set -+CONFIG_ROMFS_FS=y -+CONFIG_EXT2_FS=y -+# CONFIG_SYSV_FS is not set -+# CONFIG_UDF_FS is not set -+# CONFIG_UDF_RW is not set -+# CONFIG_UFS_FS is not set -+# CONFIG_UFS_FS_WRITE is not set -+ -+# -+# Network File Systems -+# -+# CONFIG_CODA_FS is not set -+# CONFIG_INTERMEZZO_FS is not set -+CONFIG_NFS_FS=y -+CONFIG_NFS_V3=y -+CONFIG_ROOT_NFS=y -+# CONFIG_NFSD is not set -+# CONFIG_NFSD_V3 is not set -+CONFIG_SUNRPC=y -+CONFIG_LOCKD=y -+CONFIG_LOCKD_V4=y -+# CONFIG_SMB_FS is not set -+# CONFIG_NCP_FS is not set -+# CONFIG_NCPFS_PACKET_SIGNING is not set -+# CONFIG_NCPFS_IOCTL_LOCKING is not set -+# CONFIG_NCPFS_STRONG is not set -+# CONFIG_NCPFS_NFS_NS is not set -+# CONFIG_NCPFS_OS2_NS is not set -+# CONFIG_NCPFS_SMALLDOS is not set -+# CONFIG_NCPFS_NLS is not set -+# CONFIG_NCPFS_EXTRAS is not set -+# CONFIG_ZISOFS_FS is not set -+# CONFIG_ZLIB_FS_INFLATE is not set -+ -+# -+# Partition Types -+# -+# CONFIG_PARTITION_ADVANCED is not set -+CONFIG_MSDOS_PARTITION=y -+# CONFIG_SMB_NLS is not set -+CONFIG_NLS=y -+ -+# -+# Native Language Support -+# -+CONFIG_NLS_DEFAULT="iso8859-1" -+CONFIG_NLS_CODEPAGE_437=m -+# CONFIG_NLS_CODEPAGE_737 is not set -+# CONFIG_NLS_CODEPAGE_775 is not set -+CONFIG_NLS_CODEPAGE_850=m -+CONFIG_NLS_CODEPAGE_852=m -+# CONFIG_NLS_CODEPAGE_855 is not set -+# CONFIG_NLS_CODEPAGE_857 is not set -+# CONFIG_NLS_CODEPAGE_860 is not set -+# CONFIG_NLS_CODEPAGE_861 is not set -+# CONFIG_NLS_CODEPAGE_862 is not set -+CONFIG_NLS_CODEPAGE_863=m -+# CONFIG_NLS_CODEPAGE_864 is not set -+# CONFIG_NLS_CODEPAGE_865 is not set -+# CONFIG_NLS_CODEPAGE_866 is not set -+# CONFIG_NLS_CODEPAGE_869 is not set -+# CONFIG_NLS_CODEPAGE_936 is not set -+# CONFIG_NLS_CODEPAGE_950 is not set -+# CONFIG_NLS_CODEPAGE_932 is not set -+# CONFIG_NLS_CODEPAGE_949 is not set -+# CONFIG_NLS_CODEPAGE_874 is not set -+# CONFIG_NLS_ISO8859_8 is not set -+# CONFIG_NLS_CODEPAGE_1250 is not set -+# CONFIG_NLS_CODEPAGE_1251 is not set -+CONFIG_NLS_ISO8859_1=m -+CONFIG_NLS_ISO8859_2=m -+CONFIG_NLS_ISO8859_3=m -+CONFIG_NLS_ISO8859_4=m -+# CONFIG_NLS_ISO8859_5 is not set -+# CONFIG_NLS_ISO8859_6 is not set -+# CONFIG_NLS_ISO8859_7 is not set -+# CONFIG_NLS_ISO8859_9 is not set -+# CONFIG_NLS_ISO8859_13 is not set -+# CONFIG_NLS_ISO8859_14 is not set -+# CONFIG_NLS_ISO8859_15 is not set -+# CONFIG_NLS_KOI8_R is not set -+# CONFIG_NLS_KOI8_U is not set -+# CONFIG_NLS_UTF8 is not set -+ -+# -+# Console drivers -+# -+CONFIG_PC_KEYMAP=y -+# CONFIG_VGA_CONSOLE is not set -+ -+# -+# Frame-buffer support -+# -+CONFIG_FB=y -+CONFIG_DUMMY_CONSOLE=y -+# CONFIG_FB_ACORN is not set -+# CONFIG_FB_ANAKIN is not set -+# CONFIG_FB_CLPS711X is not set -+# CONFIG_FB_SA1100 is not set -+CONFIG_FB_PXA=y -+# CONFIG_FB_PXA_8BPP is not set -+CONFIG_FB_PXA_16BPP=y -+# CONFIG_FB_CYBER2000 is not set -+# CONFIG_FB_VIRTUAL is not set -+# CONFIG_FBCON_ADVANCED is not set -+CONFIG_FBCON_CFB2=y -+CONFIG_FBCON_CFB4=y -+CONFIG_FBCON_CFB8=y -+CONFIG_FBCON_CFB16=y -+# CONFIG_FBCON_FONTWIDTH8_ONLY is not set -+CONFIG_FBCON_FONTS=y -+# CONFIG_FONT_8x8 is not set -+# CONFIG_FONT_8x16 is not set -+# CONFIG_FONT_SUN8x16 is not set -+# CONFIG_FONT_SUN12x22 is not set -+# CONFIG_FONT_6x11 is not set -+# CONFIG_FONT_PEARL_8x8 is not set -+CONFIG_FONT_ACORN_8x8=y -+ -+# -+# Sound -+# -+CONFIG_SOUND=y -+# CONFIG_SOUND_BT878 is not set -+# CONFIG_SOUND_CMPCI is not set -+# CONFIG_SOUND_EMU10K1 is not set -+# CONFIG_MIDI_EMU10K1 is not set -+# CONFIG_SOUND_FUSION is not set -+# CONFIG_SOUND_CS4281 is not set -+# CONFIG_SOUND_ES1370 is not set -+# CONFIG_SOUND_ES1371 is not set -+# CONFIG_SOUND_ESSSOLO1 is not set -+# CONFIG_SOUND_MAESTRO is not set -+# CONFIG_SOUND_MAESTRO3 is not set -+# CONFIG_SOUND_ICH is not set -+# CONFIG_SOUND_RME96XX is not set -+# CONFIG_SOUND_SONICVIBES is not set -+# CONFIG_SOUND_TRIDENT is not set -+# CONFIG_SOUND_MSNDCLAS is not set -+# CONFIG_SOUND_MSNDPIN is not set -+# CONFIG_SOUND_VIA82CXXX is not set -+# CONFIG_MIDI_VIA82CXXX is not set -+# CONFIG_SOUND_OSS is not set -+# CONFIG_SOUND_WAVEARTIST is not set -+CONFIG_SOUND_PXA_AC97=y -+# CONFIG_SOUND_TVMIXER is not set -+ -+# -+# Multimedia Capabilities Port drivers -+# -+# CONFIG_MCP is not set -+# CONFIG_MCP_SA1100 is not set -+# CONFIG_MCP_UCB1200 is not set -+# CONFIG_MCP_UCB1200_AUDIO is not set -+# CONFIG_MCP_UCB1200_TS is not set -+CONFIG_MCP_UCB1400_TS=y -+ -+# -+# USB support -+# -+# CONFIG_USB is not set -+# CONFIG_USB_UHCI is not set -+# CONFIG_USB_UHCI_ALT is not set -+# CONFIG_USB_OHCI is not set -+# CONFIG_USB_OHCI_SA1111 is not set -+# CONFIG_USB_AUDIO is not set -+# CONFIG_USB_BLUETOOTH is not set -+# CONFIG_USB_STORAGE is not set -+# CONFIG_USB_STORAGE_DEBUG is not set -+# CONFIG_USB_STORAGE_DATAFAB is not set -+# CONFIG_USB_STORAGE_FREECOM is not set -+# CONFIG_USB_STORAGE_ISD200 is not set -+# CONFIG_USB_STORAGE_DPCM is not set -+# CONFIG_USB_STORAGE_HP8200e is not set -+# CONFIG_USB_STORAGE_SDDR09 is not set -+# CONFIG_USB_STORAGE_JUMPSHOT is not set -+# CONFIG_USB_ACM is not set -+# CONFIG_USB_PRINTER is not set -+# CONFIG_USB_HID is not set -+# CONFIG_USB_HIDDEV is not set -+# CONFIG_USB_KBD is not set -+# CONFIG_USB_MOUSE is not set -+# CONFIG_USB_WACOM is not set -+# CONFIG_USB_DC2XX is not set -+# CONFIG_USB_MDC800 is not set -+# CONFIG_USB_SCANNER is not set -+# CONFIG_USB_MICROTEK is not set -+# CONFIG_USB_HPUSBSCSI is not set -+# CONFIG_USB_PEGASUS is not set -+# CONFIG_USB_KAWETH is not set -+# CONFIG_USB_CATC is not set -+# CONFIG_USB_CDCETHER is not set -+# CONFIG_USB_USBNET is not set -+# CONFIG_USB_USS720 is not set -+ -+# -+# USB Serial Converter support -+# -+# CONFIG_USB_SERIAL is not set -+# CONFIG_USB_SERIAL_GENERIC is not set -+# CONFIG_USB_SERIAL_BELKIN is not set -+# CONFIG_USB_SERIAL_WHITEHEAT is not set -+# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set -+# CONFIG_USB_SERIAL_EMPEG is not set -+# CONFIG_USB_SERIAL_FTDI_SIO is not set -+# CONFIG_USB_SERIAL_VISOR is not set -+# CONFIG_USB_SERIAL_IPAQ is not set -+# CONFIG_USB_SERIAL_IR is not set -+# CONFIG_USB_SERIAL_EDGEPORT is not set -+# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set -+# CONFIG_USB_SERIAL_KEYSPAN is not set -+# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set -+# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set -+# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set -+# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set -+# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set -+# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set -+# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set -+# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set -+# CONFIG_USB_SERIAL_MCT_U232 is not set -+# CONFIG_USB_SERIAL_KLSI is not set -+# CONFIG_USB_SERIAL_PL2303 is not set -+# CONFIG_USB_SERIAL_CYBERJACK is not set -+# CONFIG_USB_SERIAL_XIRCOM is not set -+# CONFIG_USB_SERIAL_OMNINET is not set -+# CONFIG_USB_RIO500 is not set -+ -+# -+# Bluetooth support -+# -+CONFIG_BLUEZ=y -+CONFIG_BLUEZ_L2CAP=y -+ -+# -+# Bluetooth device drivers -+# -+# CONFIG_BLUEZ_HCIUSB is not set -+CONFIG_BLUEZ_HCIUART=y -+CONFIG_BLUEZ_HCIVHCI=y -+ -+# -+# Kernel hacking -+# -+CONFIG_FRAME_POINTER=y -+CONFIG_DEBUG_USER=y -+CONFIG_DEBUG_INFO=y -+# CONFIG_NO_PGT_CACHE is not set -+CONFIG_DEBUG_KERNEL=y -+# CONFIG_DEBUG_SLAB is not set -+CONFIG_MAGIC_SYSRQ=y -+# CONFIG_DEBUG_SPINLOCK is not set -+# CONFIG_DEBUG_WAITQ is not set -+CONFIG_DEBUG_BUGVERBOSE=y -+CONFIG_DEBUG_ERRORS=y -+CONFIG_DEBUG_LL=y -+# CONFIG_DEBUG_DC21285_PORT is not set -+# CONFIG_DEBUG_CLPS711X_UART2 is not set ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/def-configs/csb226 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,615 @@ -+# -+# Automatically generated by make menuconfig: don't edit -+# -+CONFIG_ARM=y -+# CONFIG_EISA is not set -+# CONFIG_SBUS is not set -+# CONFIG_MCA is not set -+CONFIG_UID16=y -+CONFIG_RWSEM_GENERIC_SPINLOCK=y -+# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set -+# CONFIG_GENERIC_BUST_SPINLOCK is not set -+# CONFIG_GENERIC_ISA_DMA is not set -+ -+# -+# Code maturity level options -+# -+CONFIG_EXPERIMENTAL=y -+# CONFIG_OBSOLETE is not set -+ -+# -+# Loadable module support -+# -+CONFIG_MODULES=y -+# CONFIG_MODVERSIONS is not set -+CONFIG_KMOD=y -+ -+# -+# System Type -+# -+# CONFIG_ARCH_ANAKIN is not set -+# CONFIG_ARCH_ARCA5K is not set -+# CONFIG_ARCH_CLPS7500 is not set -+# CONFIG_ARCH_CLPS711X is not set -+# CONFIG_ARCH_CO285 is not set -+CONFIG_ARCH_PXA=y -+# CONFIG_ARCH_EBSA110 is not set -+# CONFIG_ARCH_CAMELOT is not set -+# CONFIG_ARCH_FOOTBRIDGE is not set -+# CONFIG_ARCH_INTEGRATOR is not set -+# CONFIG_ARCH_OMAHA is not set -+# CONFIG_ARCH_L7200 is not set -+# CONFIG_ARCH_MX1ADS is not set -+# CONFIG_ARCH_RPC is not set -+# CONFIG_ARCH_RISCSTATION is not set -+# CONFIG_ARCH_SA1100 is not set -+# CONFIG_ARCH_SHARK is not set -+# CONFIG_ARCH_AT91RM9200DK is not set -+ -+# -+# Archimedes/A5000 Implementations -+# -+# CONFIG_ARCH_ARC is not set -+# CONFIG_ARCH_A5K is not set -+ -+# -+# Footbridge Implementations -+# -+# CONFIG_ARCH_CATS is not set -+# CONFIG_ARCH_PERSONAL_SERVER is not set -+# CONFIG_ARCH_EBSA285_ADDIN is not set -+# CONFIG_ARCH_EBSA285_HOST is not set -+# CONFIG_ARCH_NETWINDER is not set -+ -+# -+# SA11x0 Implementations -+# -+# CONFIG_SA1100_ACCELENT is not set -+# CONFIG_SA1100_ASSABET is not set -+# CONFIG_ASSABET_NEPONSET is not set -+# CONFIG_SA1100_ADSBITSY is not set -+# CONFIG_SA1100_BRUTUS is not set -+# CONFIG_SA1100_CEP is not set -+# CONFIG_SA1100_CERF is not set -+# CONFIG_SA1100_H3100 is not set -+# CONFIG_SA1100_H3600 is not set -+# CONFIG_SA1100_H3800 is not set -+# CONFIG_SA1100_H3XXX is not set -+# CONFIG_SA1100_EXTENEX1 is not set -+# CONFIG_SA1100_FLEXANET is not set -+# CONFIG_SA1100_FREEBIRD is not set -+# CONFIG_SA1100_FRODO is not set -+# CONFIG_SA1100_GRAPHICSCLIENT is not set -+# CONFIG_SA1100_GRAPHICSMASTER is not set -+# CONFIG_SA1100_HACKKIT is not set -+# CONFIG_SA1100_BADGE4 is not set -+# CONFIG_SA1100_JORNADA720 is not set -+# CONFIG_SA1100_HUW_WEBPANEL is not set -+# CONFIG_SA1100_ITSY is not set -+# CONFIG_SA1100_LART is not set -+# CONFIG_SA1100_NANOENGINE is not set -+# CONFIG_SA1100_OMNIMETER is not set -+# CONFIG_SA1100_PANGOLIN is not set -+# CONFIG_SA1100_PLEB is not set -+# CONFIG_SA1100_PT_SYSTEM3 is not set -+# CONFIG_SA1100_SHANNON is not set -+# CONFIG_SA1100_SHERMAN is not set -+# CONFIG_SA1100_SIMPAD is not set -+# CONFIG_SA1100_SIMPUTER is not set -+# CONFIG_SA1100_PFS168 is not set -+# CONFIG_SA1100_VICTOR is not set -+# CONFIG_SA1100_XP860 is not set -+# CONFIG_SA1100_YOPY is not set -+# CONFIG_SA1100_USB is not set -+# CONFIG_SA1100_USB_NETLINK is not set -+# CONFIG_SA1100_USB_CHAR is not set -+# CONFIG_H3600_SLEEVE is not set -+ -+# -+# Intel PXA250/210 Board -+# -+# CONFIG_ARCH_PXA_IDP is not set -+# CONFIG_ARCH_INNOKOM is not set -+CONFIG_ARCH_CSB226=y -+# CONFIG_ARCH_LUBBOCK is not set -+# CONFIG_ARCH_PXA_CERF is not set -+# CONFIG_PXA_USB is not set -+# CONFIG_PXA_USB_NETLINK is not set -+# CONFIG_PXA_USB_CHAR is not set -+ -+# -+# CLPS711X/EP721X Implementations -+# -+# CONFIG_ARCH_AUTCPU12 is not set -+# CONFIG_ARCH_CDB89712 is not set -+# CONFIG_ARCH_CLEP7312 is not set -+# CONFIG_ARCH_EDB7211 is not set -+# CONFIG_ARCH_P720T is not set -+# CONFIG_ARCH_FORTUNET is not set -+# CONFIG_ARCH_EP7211 is not set -+# CONFIG_ARCH_EP7212 is not set -+# CONFIG_ARCH_ACORN is not set -+# CONFIG_FOOTBRIDGE is not set -+# CONFIG_FOOTBRIDGE_HOST is not set -+# CONFIG_FOOTBRIDGE_ADDIN is not set -+CONFIG_CPU_32=y -+# CONFIG_CPU_26 is not set -+# CONFIG_CPU_ARM610 is not set -+# CONFIG_CPU_ARM710 is not set -+# CONFIG_CPU_ARM720T is not set -+# CONFIG_CPU_ARM920T is not set -+# CONFIG_CPU_ARM922T is not set -+# CONFIG_PLD is not set -+# CONFIG_CPU_ARM926T is not set -+# CONFIG_CPU_ARM1020 is not set -+# CONFIG_CPU_ARM1026 is not set -+# CONFIG_CPU_SA110 is not set -+# CONFIG_CPU_SA1100 is not set -+CONFIG_CPU_32v5=y -+CONFIG_CPU_XSCALE=y -+CONFIG_XSCALE_CACHE_ERRATA=y -+# CONFIG_CPU_32v3 is not set -+# CONFIG_CPU_32v4 is not set -+# CONFIG_DISCONTIGMEM is not set -+ -+# -+# General setup -+# -+# CONFIG_PCI is not set -+# CONFIG_ISA is not set -+# CONFIG_ISA_DMA is not set -+# CONFIG_ZBOOT_ROM is not set -+CONFIG_ZBOOT_ROM_TEXT=0 -+CONFIG_ZBOOT_ROM_BSS=0 -+# CONFIG_CPU_FREQ is not set -+# CONFIG_HOTPLUG is not set -+# CONFIG_PCMCIA is not set -+# CONFIG_MMC is not set -+CONFIG_NET=y -+CONFIG_SYSVIPC=y -+# CONFIG_BSD_PROCESS_ACCT is not set -+CONFIG_SYSCTL=y -+# CONFIG_XIP_KERNEL is not set -+CONFIG_FPE_NWFPE=y -+# CONFIG_FPE_FASTFPE is not set -+CONFIG_KCORE_ELF=y -+# CONFIG_KCORE_AOUT is not set -+# CONFIG_BINFMT_AOUT is not set -+CONFIG_BINFMT_ELF=y -+# CONFIG_BINFMT_MISC is not set -+# CONFIG_PM is not set -+# CONFIG_ARTHUR is not set -+CONFIG_CMDLINE="console=ttyS0,19200" -+CONFIG_ALIGNMENT_TRAP=y -+CONFIG_ARM_HWTIMER=y -+ -+# -+# Parallel port support -+# -+# CONFIG_PARPORT is not set -+ -+# -+# Memory Technology Devices (MTD) -+# -+# CONFIG_MTD is not set -+ -+# -+# Plug and Play configuration -+# -+# CONFIG_PNP is not set -+# CONFIG_ISAPNP is not set -+ -+# -+# Block devices -+# -+# CONFIG_BLK_DEV_FD is not set -+# CONFIG_BLK_DEV_XD is not set -+# CONFIG_PARIDE is not set -+# CONFIG_BLK_CPQ_DA is not set -+# CONFIG_BLK_CPQ_CISS_DA is not set -+# CONFIG_CISS_SCSI_TAPE is not set -+# CONFIG_BLK_DEV_DAC960 is not set -+# CONFIG_BLK_DEV_UMEM is not set -+# CONFIG_BLK_DEV_LOOP is not set -+# CONFIG_BLK_DEV_NBD is not set -+# CONFIG_BLK_DEV_RAM is not set -+# CONFIG_BLK_DEV_INITRD is not set -+ -+# -+# Multi-device support (RAID and LVM) -+# -+# CONFIG_MD is not set -+# CONFIG_BLK_DEV_MD is not set -+# CONFIG_MD_LINEAR is not set -+# CONFIG_MD_RAID0 is not set -+# CONFIG_MD_RAID1 is not set -+# CONFIG_MD_RAID5 is not set -+# CONFIG_MD_MULTIPATH is not set -+# CONFIG_BLK_DEV_LVM is not set -+ -+# -+# Networking options -+# -+# CONFIG_PACKET is not set -+# CONFIG_NETLINK_DEV is not set -+# CONFIG_NETFILTER is not set -+# CONFIG_FILTER is not set -+CONFIG_UNIX=y -+CONFIG_INET=y -+# CONFIG_IP_MULTICAST is not set -+# CONFIG_IP_ADVANCED_ROUTER is not set -+CONFIG_IP_PNP=y -+# CONFIG_IP_PNP_DHCP is not set -+CONFIG_IP_PNP_BOOTP=y -+# CONFIG_IP_PNP_RARP is not set -+# CONFIG_NET_IPIP is not set -+# CONFIG_NET_IPGRE is not set -+# CONFIG_ARPD is not set -+# CONFIG_INET_ECN is not set -+# CONFIG_SYN_COOKIES is not set -+# CONFIG_IPV6 is not set -+# CONFIG_KHTTPD is not set -+# CONFIG_ATM is not set -+# CONFIG_VLAN_8021Q is not set -+# CONFIG_IPX is not set -+# CONFIG_ATALK is not set -+ -+# -+# Appletalk devices -+# -+# CONFIG_DEV_APPLETALK is not set -+# CONFIG_DECNET is not set -+# CONFIG_BRIDGE is not set -+# CONFIG_X25 is not set -+# CONFIG_LAPB is not set -+# CONFIG_LLC is not set -+# CONFIG_NET_DIVERT is not set -+# CONFIG_ECONET is not set -+# CONFIG_WAN_ROUTER is not set -+# CONFIG_NET_FASTROUTE is not set -+# CONFIG_NET_HW_FLOWCONTROL is not set -+ -+# -+# QoS and/or fair queueing -+# -+# CONFIG_NET_SCHED is not set -+ -+# -+# Network testing -+# -+# CONFIG_NET_PKTGEN is not set -+ -+# -+# Network device support -+# -+CONFIG_NETDEVICES=y -+ -+# -+# ARCnet devices -+# -+# CONFIG_ARCNET is not set -+# CONFIG_DUMMY is not set -+# CONFIG_BONDING is not set -+# CONFIG_EQUALIZER is not set -+# CONFIG_TUN is not set -+# CONFIG_ETHERTAP is not set -+ -+# -+# Ethernet (10 or 100Mbit) -+# -+CONFIG_NET_ETHERNET=y -+# CONFIG_ARM_AM79C961A is not set -+CONFIG_ARM_CIRRUS=y -+# CONFIG_SUNLANCE is not set -+# CONFIG_SUNBMAC is not set -+# CONFIG_SUNQE is not set -+# CONFIG_SUNGEM is not set -+# CONFIG_NET_VENDOR_3COM is not set -+# CONFIG_LANCE is not set -+# CONFIG_NET_VENDOR_SMC is not set -+# CONFIG_NET_VENDOR_RACAL is not set -+# CONFIG_NET_ISA is not set -+# CONFIG_NET_PCI is not set -+# CONFIG_NET_POCKET is not set -+ -+# -+# Ethernet (1000 Mbit) -+# -+# CONFIG_ACENIC is not set -+# CONFIG_DL2K is not set -+# CONFIG_MYRI_SBUS is not set -+# CONFIG_NS83820 is not set -+# CONFIG_HAMACHI is not set -+# CONFIG_YELLOWFIN is not set -+# CONFIG_SK98LIN is not set -+# CONFIG_TIGON3 is not set -+# CONFIG_FDDI is not set -+# CONFIG_HIPPI is not set -+# CONFIG_PLIP is not set -+# CONFIG_PPP is not set -+# CONFIG_SLIP is not set -+ -+# -+# Wireless LAN (non-hamradio) -+# -+# CONFIG_NET_RADIO is not set -+ -+# -+# Token Ring devices -+# -+# CONFIG_TR is not set -+# CONFIG_NET_FC is not set -+# CONFIG_RCPCI is not set -+# CONFIG_SHAPER is not set -+ -+# -+# Wan interfaces -+# -+# CONFIG_WAN is not set -+ -+# -+# Amateur Radio support -+# -+# CONFIG_HAMRADIO is not set -+ -+# -+# IrDA (infrared) support -+# -+# CONFIG_IRDA is not set -+ -+# -+# ATA/ATAPI/MFM/RLL support -+# -+# CONFIG_IDE is not set -+# CONFIG_BLK_DEV_IDE_MODES is not set -+# CONFIG_BLK_DEV_HD is not set -+ -+# -+# SCSI support -+# -+# CONFIG_SCSI is not set -+ -+# -+# I2O device support -+# -+# CONFIG_I2O is not set -+# CONFIG_I2O_BLOCK is not set -+# CONFIG_I2O_LAN is not set -+# CONFIG_I2O_SCSI is not set -+# CONFIG_I2O_PROC is not set -+ -+# -+# ISDN subsystem -+# -+# CONFIG_ISDN is not set -+ -+# -+# Input core support -+# -+# CONFIG_INPUT is not set -+# CONFIG_INPUT_KEYBDEV is not set -+# CONFIG_INPUT_MOUSEDEV is not set -+# CONFIG_INPUT_JOYDEV is not set -+# CONFIG_INPUT_EVDEV is not set -+ -+# -+# Character devices -+# -+# CONFIG_VT is not set -+CONFIG_SERIAL=y -+CONFIG_SERIAL_CONSOLE=y -+# CONFIG_SERIAL_EXTENDED is not set -+# CONFIG_SERIAL_NONSTANDARD is not set -+ -+# -+# Serial drivers -+# -+# CONFIG_SERIAL_ANAKIN is not set -+# CONFIG_SERIAL_ANAKIN_CONSOLE is not set -+# CONFIG_SERIAL_AMBA is not set -+# CONFIG_SERIAL_AMBA_CONSOLE is not set -+# CONFIG_SERIAL_CLPS711X is not set -+# CONFIG_SERIAL_CLPS711X_CONSOLE is not set -+# CONFIG_SERIAL_21285 is not set -+# CONFIG_SERIAL_21285_OLD is not set -+# CONFIG_SERIAL_21285_CONSOLE is not set -+# CONFIG_SERIAL_UART00 is not set -+# CONFIG_SERIAL_UART00_CONSOLE is not set -+# CONFIG_SERIAL_SA1100 is not set -+# CONFIG_SERIAL_SA1100_CONSOLE is not set -+# CONFIG_SERIAL_OMAHA is not set -+# CONFIG_SERIAL_OMAHA_CONSOLE is not set -+# CONFIG_SERIAL_8250 is not set -+# CONFIG_SERIAL_8250_CONSOLE is not set -+# CONFIG_SERIAL_8250_EXTENDED is not set -+# CONFIG_SERIAL_8250_MANY_PORTS is not set -+# CONFIG_SERIAL_8250_SHARE_IRQ is not set -+# CONFIG_SERIAL_8250_DETECT_IRQ is not set -+# CONFIG_SERIAL_8250_MULTIPORT is not set -+# CONFIG_SERIAL_8250_HUB6 is not set -+CONFIG_UNIX98_PTYS=y -+CONFIG_UNIX98_PTY_COUNT=256 -+ -+# -+# I2C support -+# -+# CONFIG_I2C is not set -+ -+# -+# L3 serial bus support -+# -+# CONFIG_L3 is not set -+# CONFIG_L3_ALGOBIT is not set -+# CONFIG_L3_BIT_SA1100_GPIO is not set -+# CONFIG_L3_SA1111 is not set -+# CONFIG_BIT_SA1100_GPIO is not set -+ -+# -+# Mice -+# -+# CONFIG_BUSMOUSE is not set -+# CONFIG_MOUSE is not set -+ -+# -+# Joysticks -+# -+# CONFIG_INPUT_GAMEPORT is not set -+# CONFIG_QIC02_TAPE is not set -+ -+# -+# Watchdog Cards -+# -+# CONFIG_WATCHDOG is not set -+# CONFIG_NVRAM is not set -+# CONFIG_RTC is not set -+# CONFIG_PXA_RTC is not set -+# CONFIG_DTLK is not set -+# CONFIG_R3964 is not set -+# CONFIG_APPLICOM is not set -+ -+# -+# Ftape, the floppy tape device driver -+# -+# CONFIG_FTAPE is not set -+# CONFIG_AGP is not set -+# CONFIG_DRM is not set -+ -+# -+# Multimedia devices -+# -+# CONFIG_VIDEO_DEV is not set -+ -+# -+# File systems -+# -+# CONFIG_QUOTA is not set -+# CONFIG_AUTOFS_FS is not set -+# CONFIG_AUTOFS4_FS is not set -+# CONFIG_REISERFS_FS is not set -+# CONFIG_REISERFS_CHECK is not set -+# CONFIG_REISERFS_PROC_INFO is not set -+# CONFIG_ADFS_FS is not set -+# CONFIG_ADFS_FS_RW is not set -+# CONFIG_AFFS_FS is not set -+# CONFIG_HFS_FS is not set -+# CONFIG_BFS_FS is not set -+# CONFIG_EXT3_FS is not set -+# CONFIG_JBD is not set -+# CONFIG_JBD_DEBUG is not set -+# CONFIG_FAT_FS is not set -+# CONFIG_MSDOS_FS is not set -+# CONFIG_UMSDOS_FS is not set -+# CONFIG_VFAT_FS is not set -+# CONFIG_EFS_FS is not set -+# CONFIG_JFFS_FS is not set -+# CONFIG_JFFS2_FS is not set -+# CONFIG_CRAMFS is not set -+# CONFIG_TMPFS is not set -+CONFIG_RAMFS=y -+# CONFIG_ISO9660_FS is not set -+# CONFIG_JOLIET is not set -+# CONFIG_ZISOFS is not set -+# CONFIG_MINIX_FS is not set -+# CONFIG_VXFS_FS is not set -+# CONFIG_NTFS_FS is not set -+# CONFIG_NTFS_RW is not set -+# CONFIG_HPFS_FS is not set -+CONFIG_PROC_FS=y -+# CONFIG_DEVFS_FS is not set -+# CONFIG_DEVFS_MOUNT is not set -+# CONFIG_DEVFS_DEBUG is not set -+CONFIG_DEVPTS_FS=y -+# CONFIG_QNX4FS_FS is not set -+# CONFIG_QNX4FS_RW is not set -+# CONFIG_ROMFS_FS is not set -+# CONFIG_EXT2_FS is not set -+# CONFIG_SYSV_FS is not set -+# CONFIG_UDF_FS is not set -+# CONFIG_UDF_RW is not set -+# CONFIG_UFS_FS is not set -+# CONFIG_UFS_FS_WRITE is not set -+ -+# -+# Network File Systems -+# -+# CONFIG_CODA_FS is not set -+# CONFIG_INTERMEZZO_FS is not set -+CONFIG_NFS_FS=y -+# CONFIG_NFS_V3 is not set -+CONFIG_ROOT_NFS=y -+# CONFIG_NFSD is not set -+# CONFIG_NFSD_V3 is not set -+CONFIG_SUNRPC=y -+CONFIG_LOCKD=y -+# CONFIG_SMB_FS is not set -+# CONFIG_NCP_FS is not set -+# CONFIG_NCPFS_PACKET_SIGNING is not set -+# CONFIG_NCPFS_IOCTL_LOCKING is not set -+# CONFIG_NCPFS_STRONG is not set -+# CONFIG_NCPFS_NFS_NS is not set -+# CONFIG_NCPFS_OS2_NS is not set -+# CONFIG_NCPFS_SMALLDOS is not set -+# CONFIG_NCPFS_NLS is not set -+# CONFIG_NCPFS_EXTRAS is not set -+# CONFIG_ZISOFS_FS is not set -+# CONFIG_ZLIB_FS_INFLATE is not set -+ -+# -+# Partition Types -+# -+CONFIG_PARTITION_ADVANCED=y -+# CONFIG_ACORN_PARTITION is not set -+# CONFIG_OSF_PARTITION is not set -+# CONFIG_AMIGA_PARTITION is not set -+# CONFIG_ATARI_PARTITION is not set -+# CONFIG_MAC_PARTITION is not set -+# CONFIG_MSDOS_PARTITION is not set -+# CONFIG_LDM_PARTITION is not set -+# CONFIG_SGI_PARTITION is not set -+# CONFIG_ULTRIX_PARTITION is not set -+# CONFIG_SUN_PARTITION is not set -+# CONFIG_SMB_NLS is not set -+# CONFIG_NLS is not set -+ -+# -+# Sound -+# -+# CONFIG_SOUND is not set -+ -+# -+# Multimedia Capabilities Port drivers -+# -+# CONFIG_MCP is not set -+# CONFIG_MCP_SA1100 is not set -+# CONFIG_MCP_UCB1200 is not set -+# CONFIG_MCP_UCB1200_AUDIO is not set -+# CONFIG_MCP_UCB1200_TS is not set -+# CONFIG_MCP_UCB1400_TS is not set -+ -+# -+# USB support -+# -+# CONFIG_USB is not set -+ -+# -+# Bluetooth support -+# -+# CONFIG_BLUEZ is not set -+ -+# -+# Kernel hacking -+# -+CONFIG_FRAME_POINTER=y -+CONFIG_DEBUG_USER=y -+CONFIG_DEBUG_INFO=y -+# CONFIG_NO_PGT_CACHE is not set -+CONFIG_DEBUG_KERNEL=y -+CONFIG_DEBUG_SLAB=y -+CONFIG_MAGIC_SYSRQ=y -+CONFIG_DEBUG_SPINLOCK=y -+CONFIG_DEBUG_WAITQ=y -+CONFIG_DEBUG_BUGVERBOSE=y -+CONFIG_DEBUG_ERRORS=y -+CONFIG_DEBUG_LL=y -+# CONFIG_DEBUG_DC21285_PORT is not set -+# CONFIG_DEBUG_CLPS711X_UART2 is not set ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/def-configs/innokom 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,699 @@ -+# -+# Automatically generated by make menuconfig: don't edit -+# -+CONFIG_ARM=y -+# CONFIG_EISA is not set -+# CONFIG_SBUS is not set -+# CONFIG_MCA is not set -+CONFIG_UID16=y -+CONFIG_RWSEM_GENERIC_SPINLOCK=y -+# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set -+# CONFIG_GENERIC_BUST_SPINLOCK is not set -+# CONFIG_GENERIC_ISA_DMA is not set -+ -+# -+# Code maturity level options -+# -+CONFIG_EXPERIMENTAL=y -+# CONFIG_OBSOLETE is not set -+ -+# -+# Loadable module support -+# -+CONFIG_MODULES=y -+# CONFIG_MODVERSIONS is not set -+CONFIG_KMOD=y -+ -+# -+# System Type -+# -+# CONFIG_ARCH_ANAKIN is not set -+# CONFIG_ARCH_ARCA5K is not set -+# CONFIG_ARCH_CLPS7500 is not set -+# CONFIG_ARCH_CLPS711X is not set -+# CONFIG_ARCH_CO285 is not set -+CONFIG_ARCH_PXA=y -+# CONFIG_ARCH_EBSA110 is not set -+# CONFIG_ARCH_CAMELOT is not set -+# CONFIG_ARCH_FOOTBRIDGE is not set -+# CONFIG_ARCH_INTEGRATOR is not set -+# CONFIG_ARCH_OMAHA is not set -+# CONFIG_ARCH_L7200 is not set -+# CONFIG_ARCH_MX1ADS is not set -+# CONFIG_ARCH_RPC is not set -+# CONFIG_ARCH_RISCSTATION is not set -+# CONFIG_ARCH_SA1100 is not set -+# CONFIG_ARCH_SHARK is not set -+# CONFIG_ARCH_AT91RM9200DK is not set -+ -+# -+# Archimedes/A5000 Implementations -+# -+# CONFIG_ARCH_ARC is not set -+# CONFIG_ARCH_A5K is not set -+ -+# -+# Footbridge Implementations -+# -+# CONFIG_ARCH_CATS is not set -+# CONFIG_ARCH_PERSONAL_SERVER is not set -+# CONFIG_ARCH_EBSA285_ADDIN is not set -+# CONFIG_ARCH_EBSA285_HOST is not set -+# CONFIG_ARCH_NETWINDER is not set -+ -+# -+# SA11x0 Implementations -+# -+# CONFIG_SA1100_ACCELENT is not set -+# CONFIG_SA1100_ASSABET is not set -+# CONFIG_ASSABET_NEPONSET is not set -+# CONFIG_SA1100_ADSBITSY is not set -+# CONFIG_SA1100_BRUTUS is not set -+# CONFIG_SA1100_CEP is not set -+# CONFIG_SA1100_CERF is not set -+# CONFIG_SA1100_H3100 is not set -+# CONFIG_SA1100_H3600 is not set -+# CONFIG_SA1100_H3800 is not set -+# CONFIG_SA1100_H3XXX is not set -+# CONFIG_SA1100_EXTENEX1 is not set -+# CONFIG_SA1100_FLEXANET is not set -+# CONFIG_SA1100_FREEBIRD is not set -+# CONFIG_SA1100_FRODO is not set -+# CONFIG_SA1100_GRAPHICSCLIENT is not set -+# CONFIG_SA1100_GRAPHICSMASTER is not set -+# CONFIG_SA1100_HACKKIT is not set -+# CONFIG_SA1100_BADGE4 is not set -+# CONFIG_SA1100_JORNADA720 is not set -+# CONFIG_SA1100_HUW_WEBPANEL is not set -+# CONFIG_SA1100_ITSY is not set -+# CONFIG_SA1100_LART is not set -+# CONFIG_SA1100_NANOENGINE is not set -+# CONFIG_SA1100_OMNIMETER is not set -+# CONFIG_SA1100_PANGOLIN is not set -+# CONFIG_SA1100_PLEB is not set -+# CONFIG_SA1100_PT_SYSTEM3 is not set -+# CONFIG_SA1100_SHANNON is not set -+# CONFIG_SA1100_SHERMAN is not set -+# CONFIG_SA1100_SIMPAD is not set -+# CONFIG_SA1100_SIMPUTER is not set -+# CONFIG_SA1100_PFS168 is not set -+# CONFIG_SA1100_VICTOR is not set -+# CONFIG_SA1100_XP860 is not set -+# CONFIG_SA1100_YOPY is not set -+# CONFIG_SA1100_USB is not set -+# CONFIG_SA1100_USB_NETLINK is not set -+# CONFIG_SA1100_USB_CHAR is not set -+# CONFIG_H3600_SLEEVE is not set -+ -+# -+# Intel PXA250/210 Board -+# -+# CONFIG_ARCH_PXA_IDP is not set -+CONFIG_ARCH_INNOKOM=y -+# CONFIG_ARCH_CSB226 is not set -+# CONFIG_ARCH_LUBBOCK is not set -+# CONFIG_ARCH_PXA_CERF is not set -+# CONFIG_PXA_USB is not set -+# CONFIG_PXA_USB_NETLINK is not set -+# CONFIG_PXA_USB_CHAR is not set -+ -+# -+# CLPS711X/EP721X Implementations -+# -+# CONFIG_ARCH_AUTCPU12 is not set -+# CONFIG_ARCH_CDB89712 is not set -+# CONFIG_ARCH_CLEP7312 is not set -+# CONFIG_ARCH_EDB7211 is not set -+# CONFIG_ARCH_P720T is not set -+# CONFIG_ARCH_FORTUNET is not set -+# CONFIG_ARCH_EP7211 is not set -+# CONFIG_ARCH_EP7212 is not set -+# CONFIG_ARCH_ACORN is not set -+# CONFIG_FOOTBRIDGE is not set -+# CONFIG_FOOTBRIDGE_HOST is not set -+# CONFIG_FOOTBRIDGE_ADDIN is not set -+CONFIG_CPU_32=y -+# CONFIG_CPU_26 is not set -+# CONFIG_CPU_ARM610 is not set -+# CONFIG_CPU_ARM710 is not set -+# CONFIG_CPU_ARM720T is not set -+# CONFIG_CPU_ARM920T is not set -+# CONFIG_CPU_ARM922T is not set -+# CONFIG_PLD is not set -+# CONFIG_CPU_ARM926T is not set -+# CONFIG_CPU_ARM1020 is not set -+# CONFIG_CPU_ARM1026 is not set -+# CONFIG_CPU_SA110 is not set -+# CONFIG_CPU_SA1100 is not set -+CONFIG_CPU_32v5=y -+CONFIG_CPU_XSCALE=y -+CONFIG_XSCALE_CACHE_ERRATA=y -+# CONFIG_CPU_32v3 is not set -+# CONFIG_CPU_32v4 is not set -+# CONFIG_DISCONTIGMEM is not set -+ -+# -+# General setup -+# -+# CONFIG_PCI is not set -+# CONFIG_ISA is not set -+# CONFIG_ISA_DMA is not set -+# CONFIG_ZBOOT_ROM is not set -+CONFIG_ZBOOT_ROM_TEXT=0 -+CONFIG_ZBOOT_ROM_BSS=0 -+# CONFIG_CPU_FREQ is not set -+# CONFIG_HOTPLUG is not set -+# CONFIG_PCMCIA is not set -+# CONFIG_MMC is not set -+CONFIG_NET=y -+CONFIG_SYSVIPC=y -+# CONFIG_BSD_PROCESS_ACCT is not set -+CONFIG_SYSCTL=y -+# CONFIG_XIP_KERNEL is not set -+CONFIG_FPE_NWFPE=y -+# CONFIG_FPE_FASTFPE is not set -+CONFIG_KCORE_ELF=y -+# CONFIG_KCORE_AOUT is not set -+# CONFIG_BINFMT_AOUT is not set -+CONFIG_BINFMT_ELF=y -+# CONFIG_BINFMT_MISC is not set -+# CONFIG_PM is not set -+# CONFIG_ARTHUR is not set -+CONFIG_CMDLINE="root=/dev/nfs mem=32M ip=dhcp console=ttyS0,19200" -+CONFIG_ALIGNMENT_TRAP=y -+CONFIG_ARM_HWTIMER=y -+ -+# -+# Parallel port support -+# -+# CONFIG_PARPORT is not set -+ -+# -+# Memory Technology Devices (MTD) -+# -+CONFIG_MTD=y -+# CONFIG_MTD_DEBUG is not set -+CONFIG_MTD_PARTITIONS=y -+# CONFIG_MTD_CONCAT is not set -+# CONFIG_MTD_REDBOOT_PARTS is not set -+CONFIG_MTD_CMDLINE_PARTS=y -+# CONFIG_MTD_AFS_PARTS is not set -+CONFIG_MTD_CHAR=y -+CONFIG_MTD_BLOCK=y -+# CONFIG_FTL is not set -+# CONFIG_NFTL is not set -+ -+# -+# RAM/ROM/Flash chip drivers -+# -+CONFIG_MTD_CFI=y -+# CONFIG_MTD_JEDECPROBE is not set -+CONFIG_MTD_GEN_PROBE=y -+# CONFIG_MTD_CFI_ADV_OPTIONS is not set -+CONFIG_MTD_CFI_INTELEXT=y -+CONFIG_MTD_CFI_AMDSTD=y -+# CONFIG_MTD_CFI_STAA is not set -+# CONFIG_MTD_RAM is not set -+# CONFIG_MTD_ROM is not set -+# CONFIG_MTD_ABSENT is not set -+# CONFIG_MTD_OBSOLETE_CHIPS is not set -+# CONFIG_MTD_AMDSTD is not set -+# CONFIG_MTD_SHARP is not set -+# CONFIG_MTD_JEDEC is not set -+ -+# -+# Mapping drivers for chip access -+# -+# CONFIG_MTD_PHYSMAP is not set -+# CONFIG_MTD_NORA is not set -+# CONFIG_MTD_ARM_INTEGRATOR is not set -+# CONFIG_MTD_CDB89712 is not set -+# CONFIG_MTD_SA1100 is not set -+# CONFIG_MTD_DC21285 is not set -+# CONFIG_MTD_IQ80310 is not set -+# CONFIG_MTD_LUBBOCK is not set -+# CONFIG_MTD_EPXA10DB is not set -+# CONFIG_MTD_FORTUNET is not set -+CONFIG_MTD_INNOKOM=y -+CONFIG_MTD_INNOKOM_16MB=y -+# CONFIG_MTD_INNOKOM_64MB is not set -+# CONFIG_MTD_AUTCPU12 is not set -+# CONFIG_MTD_EDB7312 is not set -+# CONFIG_MTD_IMPA7 is not set -+# CONFIG_MTD_CEIVA is not set -+# CONFIG_MTD_PCI is not set -+# CONFIG_MTD_PCMCIA is not set -+ -+# -+# Self-contained MTD device drivers -+# -+# CONFIG_MTD_PMC551 is not set -+# CONFIG_MTD_SLRAM is not set -+# CONFIG_MTD_MTDRAM is not set -+# CONFIG_MTD_BLKMTD is not set -+# CONFIG_MTD_DOC1000 is not set -+# CONFIG_MTD_DOC2000 is not set -+# CONFIG_MTD_DOC2001 is not set -+# CONFIG_MTD_DOCPROBE is not set -+ -+# -+# NAND Flash Device Drivers -+# -+# CONFIG_MTD_NAND is not set -+ -+# -+# Plug and Play configuration -+# -+# CONFIG_PNP is not set -+# CONFIG_ISAPNP is not set -+ -+# -+# Block devices -+# -+# CONFIG_BLK_DEV_FD is not set -+# CONFIG_BLK_DEV_XD is not set -+# CONFIG_PARIDE is not set -+# CONFIG_BLK_CPQ_DA is not set -+# CONFIG_BLK_CPQ_CISS_DA is not set -+# CONFIG_CISS_SCSI_TAPE is not set -+# CONFIG_BLK_DEV_DAC960 is not set -+# CONFIG_BLK_DEV_UMEM is not set -+# CONFIG_BLK_DEV_LOOP is not set -+# CONFIG_BLK_DEV_NBD is not set -+# CONFIG_BLK_DEV_RAM is not set -+# CONFIG_BLK_DEV_INITRD is not set -+ -+# -+# Multi-device support (RAID and LVM) -+# -+# CONFIG_MD is not set -+# CONFIG_BLK_DEV_MD is not set -+# CONFIG_MD_LINEAR is not set -+# CONFIG_MD_RAID0 is not set -+# CONFIG_MD_RAID1 is not set -+# CONFIG_MD_RAID5 is not set -+# CONFIG_MD_MULTIPATH is not set -+# CONFIG_BLK_DEV_LVM is not set -+ -+# -+# Networking options -+# -+# CONFIG_PACKET is not set -+# CONFIG_NETLINK_DEV is not set -+# CONFIG_NETFILTER is not set -+# CONFIG_FILTER is not set -+CONFIG_UNIX=y -+CONFIG_INET=y -+# CONFIG_IP_MULTICAST is not set -+# CONFIG_IP_ADVANCED_ROUTER is not set -+CONFIG_IP_PNP=y -+CONFIG_IP_PNP_DHCP=y -+# CONFIG_IP_PNP_BOOTP is not set -+# CONFIG_IP_PNP_RARP is not set -+# CONFIG_NET_IPIP is not set -+# CONFIG_NET_IPGRE is not set -+# CONFIG_ARPD is not set -+# CONFIG_INET_ECN is not set -+# CONFIG_SYN_COOKIES is not set -+# CONFIG_IPV6 is not set -+# CONFIG_KHTTPD is not set -+# CONFIG_ATM is not set -+# CONFIG_VLAN_8021Q is not set -+# CONFIG_IPX is not set -+# CONFIG_ATALK is not set -+ -+# -+# Appletalk devices -+# -+# CONFIG_DEV_APPLETALK is not set -+# CONFIG_DECNET is not set -+# CONFIG_BRIDGE is not set -+# CONFIG_X25 is not set -+# CONFIG_LAPB is not set -+# CONFIG_LLC is not set -+# CONFIG_NET_DIVERT is not set -+# CONFIG_ECONET is not set -+# CONFIG_WAN_ROUTER is not set -+# CONFIG_NET_FASTROUTE is not set -+# CONFIG_NET_HW_FLOWCONTROL is not set -+ -+# -+# QoS and/or fair queueing -+# -+# CONFIG_NET_SCHED is not set -+ -+# -+# Network testing -+# -+# CONFIG_NET_PKTGEN is not set -+ -+# -+# Network device support -+# -+CONFIG_NETDEVICES=y -+ -+# -+# ARCnet devices -+# -+# CONFIG_ARCNET is not set -+# CONFIG_DUMMY is not set -+# CONFIG_BONDING is not set -+# CONFIG_EQUALIZER is not set -+# CONFIG_TUN is not set -+# CONFIG_ETHERTAP is not set -+ -+# -+# Ethernet (10 or 100Mbit) -+# -+CONFIG_NET_ETHERNET=y -+# CONFIG_ARM_AM79C961A is not set -+# CONFIG_ARM_CIRRUS is not set -+# CONFIG_SUNLANCE is not set -+# CONFIG_SUNBMAC is not set -+# CONFIG_SUNQE is not set -+# CONFIG_SUNGEM is not set -+# CONFIG_NET_VENDOR_3COM is not set -+# CONFIG_LANCE is not set -+CONFIG_NET_VENDOR_SMC=y -+# CONFIG_WD80x3 is not set -+# CONFIG_ULTRAMCA is not set -+# CONFIG_ULTRA is not set -+# CONFIG_ULTRA32 is not set -+# CONFIG_SMC9194 is not set -+CONFIG_SMC91X=y -+# CONFIG_NET_VENDOR_RACAL is not set -+# CONFIG_NET_ISA is not set -+# CONFIG_NET_PCI is not set -+# CONFIG_NET_POCKET is not set -+ -+# -+# Ethernet (1000 Mbit) -+# -+# CONFIG_ACENIC is not set -+# CONFIG_DL2K is not set -+# CONFIG_MYRI_SBUS is not set -+# CONFIG_NS83820 is not set -+# CONFIG_HAMACHI is not set -+# CONFIG_YELLOWFIN is not set -+# CONFIG_SK98LIN is not set -+# CONFIG_TIGON3 is not set -+# CONFIG_FDDI is not set -+# CONFIG_HIPPI is not set -+# CONFIG_PLIP is not set -+# CONFIG_PPP is not set -+# CONFIG_SLIP is not set -+ -+# -+# Wireless LAN (non-hamradio) -+# -+# CONFIG_NET_RADIO is not set -+ -+# -+# Token Ring devices -+# -+# CONFIG_TR is not set -+# CONFIG_NET_FC is not set -+# CONFIG_RCPCI is not set -+# CONFIG_SHAPER is not set -+ -+# -+# Wan interfaces -+# -+# CONFIG_WAN is not set -+ -+# -+# Amateur Radio support -+# -+# CONFIG_HAMRADIO is not set -+ -+# -+# IrDA (infrared) support -+# -+# CONFIG_IRDA is not set -+ -+# -+# ATA/ATAPI/MFM/RLL support -+# -+# CONFIG_IDE is not set -+# CONFIG_BLK_DEV_IDE_MODES is not set -+# CONFIG_BLK_DEV_HD is not set -+ -+# -+# SCSI support -+# -+# CONFIG_SCSI is not set -+ -+# -+# I2O device support -+# -+# CONFIG_I2O is not set -+# CONFIG_I2O_BLOCK is not set -+# CONFIG_I2O_LAN is not set -+# CONFIG_I2O_SCSI is not set -+# CONFIG_I2O_PROC is not set -+ -+# -+# ISDN subsystem -+# -+# CONFIG_ISDN is not set -+ -+# -+# Input core support -+# -+# CONFIG_INPUT is not set -+# CONFIG_INPUT_KEYBDEV is not set -+# CONFIG_INPUT_MOUSEDEV is not set -+# CONFIG_INPUT_JOYDEV is not set -+# CONFIG_INPUT_EVDEV is not set -+ -+# -+# Character devices -+# -+# CONFIG_VT is not set -+CONFIG_SERIAL=y -+CONFIG_SERIAL_CONSOLE=y -+# CONFIG_SERIAL_EXTENDED is not set -+# CONFIG_SERIAL_NONSTANDARD is not set -+ -+# -+# Serial drivers -+# -+# CONFIG_SERIAL_ANAKIN is not set -+# CONFIG_SERIAL_ANAKIN_CONSOLE is not set -+# CONFIG_SERIAL_AMBA is not set -+# CONFIG_SERIAL_AMBA_CONSOLE is not set -+# CONFIG_SERIAL_CLPS711X is not set -+# CONFIG_SERIAL_CLPS711X_CONSOLE is not set -+# CONFIG_SERIAL_21285 is not set -+# CONFIG_SERIAL_21285_OLD is not set -+# CONFIG_SERIAL_21285_CONSOLE is not set -+# CONFIG_SERIAL_UART00 is not set -+# CONFIG_SERIAL_UART00_CONSOLE is not set -+# CONFIG_SERIAL_SA1100 is not set -+# CONFIG_SERIAL_SA1100_CONSOLE is not set -+# CONFIG_SERIAL_OMAHA is not set -+# CONFIG_SERIAL_OMAHA_CONSOLE is not set -+# CONFIG_SERIAL_8250 is not set -+# CONFIG_SERIAL_8250_CONSOLE is not set -+# CONFIG_SERIAL_8250_EXTENDED is not set -+# CONFIG_SERIAL_8250_MANY_PORTS is not set -+# CONFIG_SERIAL_8250_SHARE_IRQ is not set -+# CONFIG_SERIAL_8250_DETECT_IRQ is not set -+# CONFIG_SERIAL_8250_MULTIPORT is not set -+# CONFIG_SERIAL_8250_HUB6 is not set -+CONFIG_UNIX98_PTYS=y -+CONFIG_UNIX98_PTY_COUNT=256 -+ -+# -+# I2C support -+# -+CONFIG_I2C=y -+# CONFIG_I2C_ALGOBIT is not set -+# CONFIG_I2C_ALGOPCF is not set -+CONFIG_I2C_PXA_ALGO=y -+CONFIG_I2C_PXA_ADAP=y -+CONFIG_I2C_CHARDEV=y -+CONFIG_I2C_PROC=y -+# CONFIG_I2C_DS1307 is not set -+ -+# -+# L3 serial bus support -+# -+# CONFIG_L3 is not set -+# CONFIG_L3_ALGOBIT is not set -+# CONFIG_L3_BIT_SA1100_GPIO is not set -+# CONFIG_L3_SA1111 is not set -+# CONFIG_BIT_SA1100_GPIO is not set -+ -+# -+# Mice -+# -+# CONFIG_BUSMOUSE is not set -+# CONFIG_MOUSE is not set -+ -+# -+# Joysticks -+# -+# CONFIG_INPUT_GAMEPORT is not set -+# CONFIG_QIC02_TAPE is not set -+ -+# -+# Watchdog Cards -+# -+# CONFIG_WATCHDOG is not set -+# CONFIG_NVRAM is not set -+# CONFIG_RTC is not set -+# CONFIG_PXA_RTC is not set -+# CONFIG_DTLK is not set -+# CONFIG_R3964 is not set -+# CONFIG_APPLICOM is not set -+ -+# -+# Ftape, the floppy tape device driver -+# -+# CONFIG_FTAPE is not set -+# CONFIG_AGP is not set -+# CONFIG_DRM is not set -+ -+# -+# Multimedia devices -+# -+# CONFIG_VIDEO_DEV is not set -+ -+# -+# File systems -+# -+# CONFIG_QUOTA is not set -+# CONFIG_AUTOFS_FS is not set -+# CONFIG_AUTOFS4_FS is not set -+# CONFIG_REISERFS_FS is not set -+# CONFIG_REISERFS_CHECK is not set -+# CONFIG_REISERFS_PROC_INFO is not set -+# CONFIG_ADFS_FS is not set -+# CONFIG_ADFS_FS_RW is not set -+# CONFIG_AFFS_FS is not set -+# CONFIG_HFS_FS is not set -+# CONFIG_BFS_FS is not set -+# CONFIG_EXT3_FS is not set -+# CONFIG_JBD is not set -+# CONFIG_JBD_DEBUG is not set -+# CONFIG_FAT_FS is not set -+# CONFIG_MSDOS_FS is not set -+# CONFIG_UMSDOS_FS is not set -+# CONFIG_VFAT_FS is not set -+# CONFIG_EFS_FS is not set -+# CONFIG_JFFS_FS is not set -+CONFIG_JFFS2_FS=y -+CONFIG_JFFS2_FS_DEBUG=0 -+# CONFIG_JFFS2_FS_NAND is not set -+# CONFIG_CRAMFS is not set -+# CONFIG_TMPFS is not set -+CONFIG_RAMFS=y -+# CONFIG_ISO9660_FS is not set -+# CONFIG_JOLIET is not set -+# CONFIG_ZISOFS is not set -+# CONFIG_MINIX_FS is not set -+# CONFIG_VXFS_FS is not set -+# CONFIG_NTFS_FS is not set -+# CONFIG_NTFS_RW is not set -+# CONFIG_HPFS_FS is not set -+CONFIG_PROC_FS=y -+CONFIG_DEVFS_FS=y -+CONFIG_DEVFS_MOUNT=y -+# CONFIG_DEVFS_DEBUG is not set -+CONFIG_DEVPTS_FS=y -+# CONFIG_QNX4FS_FS is not set -+# CONFIG_QNX4FS_RW is not set -+# CONFIG_ROMFS_FS is not set -+# CONFIG_EXT2_FS is not set -+# CONFIG_SYSV_FS is not set -+# CONFIG_UDF_FS is not set -+# CONFIG_UDF_RW is not set -+# CONFIG_UFS_FS is not set -+# CONFIG_UFS_FS_WRITE is not set -+ -+# -+# Network File Systems -+# -+# CONFIG_CODA_FS is not set -+# CONFIG_INTERMEZZO_FS is not set -+CONFIG_NFS_FS=y -+CONFIG_NFS_V3=y -+CONFIG_ROOT_NFS=y -+# CONFIG_NFSD is not set -+# CONFIG_NFSD_V3 is not set -+CONFIG_SUNRPC=y -+CONFIG_LOCKD=y -+CONFIG_LOCKD_V4=y -+# CONFIG_SMB_FS is not set -+# CONFIG_NCP_FS is not set -+# CONFIG_NCPFS_PACKET_SIGNING is not set -+# CONFIG_NCPFS_IOCTL_LOCKING is not set -+# CONFIG_NCPFS_STRONG is not set -+# CONFIG_NCPFS_NFS_NS is not set -+# CONFIG_NCPFS_OS2_NS is not set -+# CONFIG_NCPFS_SMALLDOS is not set -+# CONFIG_NCPFS_NLS is not set -+# CONFIG_NCPFS_EXTRAS is not set -+# CONFIG_ZISOFS_FS is not set -+# CONFIG_ZLIB_FS_INFLATE is not set -+ -+# -+# Partition Types -+# -+CONFIG_PARTITION_ADVANCED=y -+# CONFIG_ACORN_PARTITION is not set -+# CONFIG_OSF_PARTITION is not set -+# CONFIG_AMIGA_PARTITION is not set -+# CONFIG_ATARI_PARTITION is not set -+# CONFIG_MAC_PARTITION is not set -+# CONFIG_MSDOS_PARTITION is not set -+# CONFIG_LDM_PARTITION is not set -+# CONFIG_SGI_PARTITION is not set -+# CONFIG_ULTRIX_PARTITION is not set -+# CONFIG_SUN_PARTITION is not set -+# CONFIG_SMB_NLS is not set -+# CONFIG_NLS is not set -+ -+# -+# Sound -+# -+# CONFIG_SOUND is not set -+ -+# -+# Multimedia Capabilities Port drivers -+# -+# CONFIG_MCP is not set -+# CONFIG_MCP_SA1100 is not set -+# CONFIG_MCP_UCB1200 is not set -+# CONFIG_MCP_UCB1200_AUDIO is not set -+# CONFIG_MCP_UCB1200_TS is not set -+# CONFIG_MCP_UCB1400_TS is not set -+ -+# -+# USB support -+# -+# CONFIG_USB is not set -+ -+# -+# Bluetooth support -+# -+# CONFIG_BLUEZ is not set -+ -+# -+# Kernel hacking -+# -+CONFIG_FRAME_POINTER=y -+CONFIG_DEBUG_USER=y -+CONFIG_DEBUG_INFO=y -+# CONFIG_NO_PGT_CACHE is not set -+CONFIG_DEBUG_KERNEL=y -+CONFIG_DEBUG_SLAB=y -+CONFIG_MAGIC_SYSRQ=y -+CONFIG_DEBUG_SPINLOCK=y -+CONFIG_DEBUG_WAITQ=y -+CONFIG_DEBUG_BUGVERBOSE=y -+CONFIG_DEBUG_ERRORS=y -+CONFIG_DEBUG_LL=y -+# CONFIG_DEBUG_DC21285_PORT is not set -+# CONFIG_DEBUG_CLPS711X_UART2 is not set ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/def-configs/lubbock 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,971 @@ -+# -+# Automatically generated make config: don't edit -+# -+CONFIG_ARM=y -+# CONFIG_EISA is not set -+# CONFIG_SBUS is not set -+# CONFIG_MCA is not set -+CONFIG_UID16=y -+CONFIG_RWSEM_GENERIC_SPINLOCK=y -+# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set -+# CONFIG_GENERIC_BUST_SPINLOCK is not set -+# CONFIG_GENERIC_ISA_DMA is not set -+ -+# -+# Code maturity level options -+# -+CONFIG_EXPERIMENTAL=y -+# CONFIG_OBSOLETE is not set -+ -+# -+# Loadable module support -+# -+CONFIG_MODULES=y -+# CONFIG_MODVERSIONS is not set -+# CONFIG_KMOD is not set -+ -+# -+# System Type -+# -+# CONFIG_ARCH_ANAKIN is not set -+# CONFIG_ARCH_ARCA5K is not set -+# CONFIG_ARCH_CLPS7500 is not set -+# CONFIG_ARCH_CLPS711X is not set -+# CONFIG_ARCH_CO285 is not set -+CONFIG_ARCH_PXA=y -+# CONFIG_ARCH_EBSA110 is not set -+# CONFIG_ARCH_CAMELOT is not set -+# CONFIG_ARCH_FOOTBRIDGE is not set -+# CONFIG_ARCH_INTEGRATOR is not set -+# CONFIG_ARCH_OMAHA is not set -+# CONFIG_ARCH_L7200 is not set -+# CONFIG_ARCH_MX1ADS is not set -+# CONFIG_ARCH_RPC is not set -+# CONFIG_ARCH_RISCSTATION is not set -+# CONFIG_ARCH_SA1100 is not set -+# CONFIG_ARCH_SHARK is not set -+# CONFIG_ARCH_AT91RM9200 is not set -+ -+# -+# Archimedes/A5000 Implementations -+# -+ -+# -+# Archimedes/A5000 Implementations (select only ONE) -+# -+# CONFIG_ARCH_ARC is not set -+# CONFIG_ARCH_A5K is not set -+ -+# -+# Footbridge Implementations -+# -+# CONFIG_ARCH_CATS is not set -+# CONFIG_ARCH_PERSONAL_SERVER is not set -+# CONFIG_ARCH_EBSA285_ADDIN is not set -+# CONFIG_ARCH_EBSA285_HOST is not set -+# CONFIG_ARCH_NETWINDER is not set -+ -+# -+# SA11x0 Implementations -+# -+# CONFIG_SA1100_ACCELENT is not set -+# CONFIG_SA1100_ASSABET is not set -+# CONFIG_ASSABET_NEPONSET is not set -+# CONFIG_SA1100_ADSAGC is not set -+# CONFIG_SA1100_ADSBITSY is not set -+# CONFIG_SA1100_ADSBITSYPLUS is not set -+# CONFIG_SA1100_BRUTUS is not set -+# CONFIG_SA1100_CEP is not set -+# CONFIG_SA1100_CERF is not set -+# CONFIG_SA1100_H3100 is not set -+# CONFIG_SA1100_H3600 is not set -+# CONFIG_SA1100_H3800 is not set -+# CONFIG_SA1100_H3XXX is not set -+# CONFIG_H3600_SLEEVE is not set -+# CONFIG_SA1100_EXTENEX1 is not set -+# CONFIG_SA1100_FLEXANET is not set -+# CONFIG_SA1100_FREEBIRD is not set -+# CONFIG_SA1100_FRODO is not set -+# CONFIG_SA1100_GRAPHICSCLIENT is not set -+# CONFIG_SA1100_GRAPHICSMASTER is not set -+# CONFIG_SA1100_HACKKIT is not set -+# CONFIG_SA1100_BADGE4 is not set -+# CONFIG_SA1100_JORNADA720 is not set -+# CONFIG_SA1100_HUW_WEBPANEL is not set -+# CONFIG_SA1100_ITSY is not set -+# CONFIG_SA1100_LART is not set -+# CONFIG_SA1100_NANOENGINE is not set -+# CONFIG_SA1100_OMNIMETER is not set -+# CONFIG_SA1100_PANGOLIN is not set -+# CONFIG_SA1100_PLEB is not set -+# CONFIG_SA1100_PT_SYSTEM3 is not set -+# CONFIG_SA1100_SHANNON is not set -+# CONFIG_SA1100_SHERMAN is not set -+# CONFIG_SA1100_SIMPAD is not set -+# CONFIG_SA1100_SIMPUTER is not set -+# CONFIG_SA1100_PFS168 is not set -+# CONFIG_SA1100_VICTOR is not set -+# CONFIG_SA1100_XP860 is not set -+# CONFIG_SA1100_YOPY is not set -+# CONFIG_SA1100_USB is not set -+# CONFIG_SA1100_USB_NETLINK is not set -+# CONFIG_SA1100_USB_CHAR is not set -+# CONFIG_SA1100_SSP is not set -+ -+# -+# AT91RM9200 Implementations -+# -+# CONFIG_ARCH_AT91RM9200DK is not set -+ -+# -+# Intel PXA250/210 Implementations -+# -+CONFIG_ARCH_LUBBOCK=y -+# CONFIG_ARCH_PXA_IDP is not set -+# CONFIG_ARCH_PXA_CERF is not set -+# CONFIG_ARCH_TRIZEPS2 is not set -+CONFIG_SA1111=y -+# CONFIG_PXA_USB is not set -+# CONFIG_PXA_USB_NETLINK is not set -+# CONFIG_PXA_USB_CHAR is not set -+ -+# -+# CLPS711X/EP721X Implementations -+# -+# CONFIG_ARCH_AUTCPU12 is not set -+# CONFIG_ARCH_CDB89712 is not set -+# CONFIG_ARCH_CLEP7312 is not set -+# CONFIG_ARCH_EDB7211 is not set -+# CONFIG_ARCH_FORTUNET is not set -+# CONFIG_ARCH_GUIDEA07 is not set -+# CONFIG_ARCH_P720T is not set -+# CONFIG_ARCH_EP7211 is not set -+# CONFIG_ARCH_EP7212 is not set -+# CONFIG_ARCH_ACORN is not set -+# CONFIG_FOOTBRIDGE is not set -+# CONFIG_FOOTBRIDGE_HOST is not set -+# CONFIG_FOOTBRIDGE_ADDIN is not set -+ -+# -+# Processor Type -+# -+CONFIG_CPU_32=y -+# CONFIG_CPU_26 is not set -+# CONFIG_CPU_ARM610 is not set -+# CONFIG_CPU_ARM710 is not set -+# CONFIG_CPU_ARM720T is not set -+# CONFIG_CPU_ARM920T is not set -+# CONFIG_CPU_ARM922T is not set -+# CONFIG_PLD is not set -+# CONFIG_CPU_ARM926T is not set -+# CONFIG_CPU_ARM1020 is not set -+# CONFIG_CPU_ARM1026 is not set -+# CONFIG_CPU_SA110 is not set -+# CONFIG_CPU_SA1100 is not set -+CONFIG_CPU_32v5=y -+CONFIG_CPU_XSCALE=y -+# CONFIG_XSCALE_CACHE_ERRATA is not set -+# CONFIG_CPU_32v3 is not set -+# CONFIG_CPU_32v4 is not set -+ -+# -+# Processor Features -+# -+# CONFIG_DISCONTIGMEM is not set -+ -+# -+# General setup -+# -+# CONFIG_PCI is not set -+# CONFIG_ISA is not set -+# CONFIG_ISA_DMA is not set -+# CONFIG_ZBOOT_ROM is not set -+CONFIG_ZBOOT_ROM_TEXT=0 -+CONFIG_ZBOOT_ROM_BSS=0 -+CONFIG_CPU_FREQ=y -+CONFIG_HOTPLUG=y -+ -+# -+# PCMCIA/CardBus support -+# -+CONFIG_PCMCIA=y -+# CONFIG_I82092 is not set -+# CONFIG_I82365 is not set -+# CONFIG_TCIC is not set -+# CONFIG_PCMCIA_CLPS6700 is not set -+# CONFIG_PCMCIA_SA1100 is not set -+CONFIG_PCMCIA_PXA=y -+ -+# -+# MMC device drivers -+# -+CONFIG_MMC=m -+CONFIG_MMC_PXA=m -+CONFIG_MMC_BLOCK=m -+CONFIG_MMC_PARTITIONS=y -+CONFIG_NET=y -+CONFIG_SYSVIPC=y -+# CONFIG_BSD_PROCESS_ACCT is not set -+CONFIG_SYSCTL=y -+# CONFIG_XIP_KERNEL is not set -+ -+# -+# At least one math emulation must be selected -+# -+CONFIG_FPE_NWFPE=y -+# CONFIG_FPE_NWFPE_XP is not set -+# CONFIG_FPE_FASTFPE is not set -+CONFIG_KCORE_ELF=y -+# CONFIG_KCORE_AOUT is not set -+# CONFIG_BINFMT_AOUT is not set -+CONFIG_BINFMT_ELF=y -+# CONFIG_BINFMT_MISC is not set -+CONFIG_PM=y -+# CONFIG_ARTHUR is not set -+CONFIG_CMDLINE="root=/dev/nfs ip=bootp console=ttyS0,115200 mem=32M" -+CONFIG_LEDS=y -+CONFIG_LEDS_TIMER=y -+CONFIG_LEDS_CPU=y -+CONFIG_ALIGNMENT_TRAP=y -+ -+# -+# Parallel port support -+# -+# CONFIG_PARPORT is not set -+ -+# -+# Memory Technology Devices (MTD) -+# -+CONFIG_MTD=y -+# CONFIG_MTD_DEBUG is not set -+CONFIG_MTD_PARTITIONS=y -+# CONFIG_MTD_CONCAT is not set -+CONFIG_MTD_REDBOOT_PARTS=y -+# CONFIG_MTD_CMDLINE_PARTS is not set -+# CONFIG_MTD_AFS_PARTS is not set -+ -+# -+# User Modules And Translation Layers -+# -+CONFIG_MTD_CHAR=y -+CONFIG_MTD_BLOCK=y -+# CONFIG_FTL is not set -+# CONFIG_NFTL is not set -+ -+# -+# RAM/ROM/Flash chip drivers -+# -+CONFIG_MTD_CFI=y -+# CONFIG_MTD_JEDECPROBE is not set -+CONFIG_MTD_GEN_PROBE=y -+CONFIG_MTD_CFI_ADV_OPTIONS=y -+CONFIG_MTD_CFI_NOSWAP=y -+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set -+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set -+CONFIG_MTD_CFI_GEOMETRY=y -+# CONFIG_MTD_CFI_B1 is not set -+CONFIG_MTD_CFI_B2=y -+CONFIG_MTD_CFI_B4=y -+# CONFIG_MTD_CFI_B8 is not set -+CONFIG_MTD_CFI_I1=y -+CONFIG_MTD_CFI_I2=y -+# CONFIG_MTD_CFI_I4 is not set -+# CONFIG_MTD_CFI_I8 is not set -+CONFIG_MTD_CFI_INTELEXT=y -+# CONFIG_MTD_CFI_AMDSTD is not set -+# CONFIG_MTD_CFI_STAA is not set -+# CONFIG_MTD_RAM is not set -+# CONFIG_MTD_ROM is not set -+# CONFIG_MTD_ABSENT is not set -+# CONFIG_MTD_OBSOLETE_CHIPS is not set -+# CONFIG_MTD_AMDSTD is not set -+# CONFIG_MTD_SHARP is not set -+# CONFIG_MTD_JEDEC is not set -+ -+# -+# Mapping drivers for chip access -+# -+# CONFIG_MTD_PHYSMAP is not set -+CONFIG_MTD_LUBBOCK=y -+# CONFIG_MTD_NORA is not set -+# CONFIG_MTD_ARM_INTEGRATOR is not set -+# CONFIG_MTD_CDB89712 is not set -+# CONFIG_MTD_SA1100 is not set -+# CONFIG_MTD_DC21285 is not set -+# CONFIG_MTD_IQ80310 is not set -+# CONFIG_MTD_FORTUNET is not set -+# CONFIG_MTD_EPXA is not set -+# CONFIG_MTD_AUTCPU12 is not set -+# CONFIG_MTD_EDB7312 is not set -+# CONFIG_MTD_IMPA7 is not set -+# CONFIG_MTD_CEIVA is not set -+# CONFIG_MTD_PCI is not set -+# CONFIG_MTD_PCMCIA is not set -+ -+# -+# Self-contained MTD device drivers -+# -+# CONFIG_MTD_PMC551 is not set -+# CONFIG_MTD_SLRAM is not set -+# CONFIG_MTD_MTDRAM is not set -+# CONFIG_MTD_BLKMTD is not set -+ -+# -+# Disk-On-Chip Device Drivers -+# -+# CONFIG_MTD_DOC1000 is not set -+# CONFIG_MTD_DOC2000 is not set -+# CONFIG_MTD_DOC2001 is not set -+# CONFIG_MTD_DOCPROBE is not set -+ -+# -+# NAND Flash Device Drivers -+# -+# CONFIG_MTD_NAND is not set -+ -+# -+# Plug and Play configuration -+# -+# CONFIG_PNP is not set -+# CONFIG_ISAPNP is not set -+ -+# -+# Block devices -+# -+# CONFIG_BLK_DEV_FD is not set -+# CONFIG_BLK_DEV_XD is not set -+# CONFIG_PARIDE is not set -+# CONFIG_BLK_CPQ_DA is not set -+# CONFIG_BLK_CPQ_CISS_DA is not set -+# CONFIG_CISS_SCSI_TAPE is not set -+# CONFIG_BLK_DEV_DAC960 is not set -+# CONFIG_BLK_DEV_UMEM is not set -+# CONFIG_BLK_DEV_LOOP is not set -+# CONFIG_BLK_DEV_NBD is not set -+# CONFIG_BLK_DEV_RAM is not set -+# CONFIG_BLK_DEV_INITRD is not set -+# CONFIG_BLK_STATS is not set -+ -+# -+# Multi-device support (RAID and LVM) -+# -+# CONFIG_MD is not set -+# CONFIG_BLK_DEV_MD is not set -+# CONFIG_MD_LINEAR is not set -+# CONFIG_MD_RAID0 is not set -+# CONFIG_MD_RAID1 is not set -+# CONFIG_MD_RAID5 is not set -+# CONFIG_MD_MULTIPATH is not set -+# CONFIG_BLK_DEV_LVM is not set -+ -+# -+# Networking options -+# -+# CONFIG_PACKET is not set -+# CONFIG_NETLINK_DEV is not set -+# CONFIG_NETFILTER is not set -+# CONFIG_FILTER is not set -+CONFIG_UNIX=y -+CONFIG_INET=y -+# CONFIG_IP_MULTICAST is not set -+# CONFIG_IP_ADVANCED_ROUTER is not set -+CONFIG_IP_PNP=y -+# CONFIG_IP_PNP_DHCP is not set -+CONFIG_IP_PNP_BOOTP=y -+# CONFIG_IP_PNP_RARP is not set -+# CONFIG_NET_IPIP is not set -+# CONFIG_NET_IPGRE is not set -+# CONFIG_ARPD is not set -+# CONFIG_INET_ECN is not set -+# CONFIG_SYN_COOKIES is not set -+# CONFIG_IPV6 is not set -+# CONFIG_KHTTPD is not set -+# CONFIG_ATM is not set -+# CONFIG_VLAN_8021Q is not set -+ -+# -+# -+# -+# CONFIG_IPX is not set -+# CONFIG_ATALK is not set -+ -+# -+# Appletalk devices -+# -+# CONFIG_DEV_APPLETALK is not set -+# CONFIG_DECNET is not set -+# CONFIG_BRIDGE is not set -+# CONFIG_X25 is not set -+# CONFIG_LAPB is not set -+# CONFIG_LLC is not set -+# CONFIG_NET_DIVERT is not set -+# CONFIG_ECONET is not set -+# CONFIG_WAN_ROUTER is not set -+# CONFIG_NET_FASTROUTE is not set -+# CONFIG_NET_HW_FLOWCONTROL is not set -+ -+# -+# QoS and/or fair queueing -+# -+# CONFIG_NET_SCHED is not set -+ -+# -+# Network testing -+# -+# CONFIG_NET_PKTGEN is not set -+ -+# -+# Network device support -+# -+CONFIG_NETDEVICES=y -+ -+# -+# ARCnet devices -+# -+# CONFIG_ARCNET is not set -+# CONFIG_DUMMY is not set -+# CONFIG_BONDING is not set -+# CONFIG_EQUALIZER is not set -+# CONFIG_TUN is not set -+# CONFIG_ETHERTAP is not set -+ -+# -+# Ethernet (10 or 100Mbit) -+# -+CONFIG_NET_ETHERNET=y -+# CONFIG_ARM_AM79C961A is not set -+# CONFIG_ARM_CIRRUS is not set -+# CONFIG_SUNLANCE is not set -+# CONFIG_SUNBMAC is not set -+# CONFIG_SUNQE is not set -+# CONFIG_SUNGEM is not set -+# CONFIG_NET_VENDOR_3COM is not set -+# CONFIG_LANCE is not set -+CONFIG_NET_VENDOR_SMC=y -+# CONFIG_WD80x3 is not set -+# CONFIG_ULTRAMCA is not set -+# CONFIG_ULTRA is not set -+# CONFIG_ULTRA32 is not set -+# CONFIG_SMC9194 is not set -+CONFIG_SMC91X=y -+# CONFIG_NET_VENDOR_RACAL is not set -+# CONFIG_NET_ISA is not set -+# CONFIG_NET_PCI is not set -+# CONFIG_NET_POCKET is not set -+ -+# -+# Ethernet (1000 Mbit) -+# -+# CONFIG_ACENIC is not set -+# CONFIG_DL2K is not set -+# CONFIG_E1000 is not set -+# CONFIG_MYRI_SBUS is not set -+# CONFIG_NS83820 is not set -+# CONFIG_HAMACHI is not set -+# CONFIG_YELLOWFIN is not set -+# CONFIG_R8169 is not set -+# CONFIG_SK98LIN is not set -+# CONFIG_TIGON3 is not set -+# CONFIG_FDDI is not set -+# CONFIG_HIPPI is not set -+# CONFIG_PLIP is not set -+# CONFIG_PPP is not set -+# CONFIG_SLIP is not set -+ -+# -+# Wireless LAN (non-hamradio) -+# -+# CONFIG_NET_RADIO is not set -+ -+# -+# Token Ring devices -+# -+# CONFIG_TR is not set -+# CONFIG_NET_FC is not set -+# CONFIG_RCPCI is not set -+# CONFIG_SHAPER is not set -+ -+# -+# Wan interfaces -+# -+# CONFIG_WAN is not set -+ -+# -+# PCMCIA network device support -+# -+CONFIG_NET_PCMCIA=y -+# CONFIG_PCMCIA_3C589 is not set -+# CONFIG_PCMCIA_3C574 is not set -+# CONFIG_PCMCIA_FMVJ18X is not set -+CONFIG_PCMCIA_PCNET=y -+# CONFIG_PCMCIA_AXNET is not set -+# CONFIG_PCMCIA_NMCLAN is not set -+# CONFIG_PCMCIA_SMC91C92 is not set -+# CONFIG_PCMCIA_XIRC2PS is not set -+# CONFIG_ARCNET_COM20020_CS is not set -+# CONFIG_PCMCIA_IBMTR is not set -+# CONFIG_NET_PCMCIA_RADIO is not set -+ -+# -+# Amateur Radio support -+# -+# CONFIG_HAMRADIO is not set -+ -+# -+# IrDA (infrared) support -+# -+# CONFIG_IRDA is not set -+ -+# -+# ATA/ATAPI/MFM/RLL support -+# -+CONFIG_IDE=y -+ -+# -+# IDE, ATA and ATAPI Block devices -+# -+CONFIG_BLK_DEV_IDE=y -+ -+# -+# Please see Documentation/ide.txt for help/info on IDE drives -+# -+# CONFIG_BLK_DEV_HD_IDE is not set -+# CONFIG_BLK_DEV_HD is not set -+CONFIG_BLK_DEV_IDEDISK=y -+# CONFIG_IDEDISK_MULTI_MODE is not set -+# CONFIG_IDEDISK_STROKE is not set -+CONFIG_BLK_DEV_IDECS=y -+# CONFIG_BLK_DEV_IDECD is not set -+# CONFIG_BLK_DEV_IDETAPE is not set -+# CONFIG_BLK_DEV_IDEFLOPPY is not set -+# CONFIG_BLK_DEV_IDESCSI is not set -+# CONFIG_IDE_TASK_IOCTL is not set -+ -+# -+# IDE chipset support/bugfixes -+# -+# CONFIG_BLK_DEV_CMD640 is not set -+# CONFIG_BLK_DEV_CMD640_ENHANCED is not set -+# CONFIG_BLK_DEV_ISAPNP is not set -+# CONFIG_IDE_CHIPSETS is not set -+# CONFIG_IDEDMA_AUTO is not set -+# CONFIG_DMA_NONPCI is not set -+CONFIG_BLK_DEV_IDE_MODES=y -+# CONFIG_BLK_DEV_ATARAID is not set -+# CONFIG_BLK_DEV_ATARAID_PDC is not set -+# CONFIG_BLK_DEV_ATARAID_HPT is not set -+# CONFIG_BLK_DEV_ATARAID_SII is not set -+ -+# -+# SCSI support -+# -+# CONFIG_SCSI is not set -+ -+# -+# I2O device support -+# -+# CONFIG_I2O is not set -+# CONFIG_I2O_BLOCK is not set -+# CONFIG_I2O_LAN is not set -+# CONFIG_I2O_SCSI is not set -+# CONFIG_I2O_PROC is not set -+ -+# -+# ISDN subsystem -+# -+# CONFIG_ISDN is not set -+ -+# -+# Input core support -+# -+CONFIG_INPUT=y -+# CONFIG_INPUT_KEYBDEV is not set -+# CONFIG_INPUT_MOUSEDEV is not set -+# CONFIG_INPUT_JOYDEV is not set -+CONFIG_INPUT_EVDEV=y -+# CONFIG_INPUT_MX1TS is not set -+ -+# -+# Character devices -+# -+CONFIG_VT=y -+# CONFIG_VT_CONSOLE is not set -+CONFIG_SERIAL=y -+CONFIG_SERIAL_CONSOLE=y -+# CONFIG_SERIAL_EXTENDED is not set -+# CONFIG_SERIAL_NONSTANDARD is not set -+ -+# -+# Serial drivers -+# -+# CONFIG_SERIAL_ANAKIN is not set -+# CONFIG_SERIAL_ANAKIN_CONSOLE is not set -+# CONFIG_SERIAL_AMBA is not set -+# CONFIG_SERIAL_AMBA_CONSOLE is not set -+# CONFIG_SERIAL_CLPS711X is not set -+# CONFIG_SERIAL_CLPS711X_CONSOLE is not set -+# CONFIG_SERIAL_21285 is not set -+# CONFIG_SERIAL_21285_OLD is not set -+# CONFIG_SERIAL_21285_CONSOLE is not set -+# CONFIG_SERIAL_UART00 is not set -+# CONFIG_SERIAL_UART00_CONSOLE is not set -+# CONFIG_SERIAL_SA1100 is not set -+# CONFIG_SERIAL_SA1100_CONSOLE is not set -+# CONFIG_SERIAL_OMAHA is not set -+# CONFIG_SERIAL_OMAHA_CONSOLE is not set -+# CONFIG_SERIAL_AT91 is not set -+# CONFIG_SERIAL_AT91_CONSOLE is not set -+# CONFIG_SERIAL_8250 is not set -+# CONFIG_SERIAL_8250_CONSOLE is not set -+# CONFIG_SERIAL_8250_EXTENDED is not set -+# CONFIG_SERIAL_8250_MANY_PORTS is not set -+# CONFIG_SERIAL_8250_SHARE_IRQ is not set -+# CONFIG_SERIAL_8250_DETECT_IRQ is not set -+# CONFIG_SERIAL_8250_MULTIPORT is not set -+# CONFIG_SERIAL_8250_HUB6 is not set -+CONFIG_UNIX98_PTYS=y -+CONFIG_UNIX98_PTY_COUNT=256 -+ -+# -+# I2C support -+# -+# CONFIG_I2C is not set -+ -+# -+# L3 serial bus support -+# -+# CONFIG_L3 is not set -+# CONFIG_L3_ALGOBIT is not set -+# CONFIG_L3_BIT_SA1100_GPIO is not set -+ -+# -+# Other L3 adapters -+# -+# CONFIG_L3_SA1111 is not set -+# CONFIG_BIT_SA1100_GPIO is not set -+ -+# -+# Mice -+# -+CONFIG_BUSMOUSE=y -+# CONFIG_ATIXL_BUSMOUSE is not set -+# CONFIG_LOGIBUSMOUSE is not set -+# CONFIG_MS_BUSMOUSE is not set -+CONFIG_MOUSE=y -+CONFIG_PSMOUSE=y -+# CONFIG_82C710_MOUSE is not set -+# CONFIG_PC110_PAD is not set -+# CONFIG_MK712_MOUSE is not set -+ -+# -+# Joysticks -+# -+# CONFIG_INPUT_GAMEPORT is not set -+# CONFIG_INPUT_NS558 is not set -+# CONFIG_INPUT_LIGHTNING is not set -+# CONFIG_INPUT_PCIGAME is not set -+# CONFIG_INPUT_CS461X is not set -+# CONFIG_INPUT_EMU10K1 is not set -+# CONFIG_INPUT_SERIO is not set -+# CONFIG_INPUT_SERPORT is not set -+ -+# -+# Joysticks -+# -+# CONFIG_INPUT_ANALOG is not set -+# CONFIG_INPUT_A3D is not set -+# CONFIG_INPUT_ADI is not set -+# CONFIG_INPUT_COBRA is not set -+# CONFIG_INPUT_GF2K is not set -+# CONFIG_INPUT_GRIP is not set -+# CONFIG_INPUT_INTERACT is not set -+# CONFIG_INPUT_TMDC is not set -+# CONFIG_INPUT_SIDEWINDER is not set -+# CONFIG_INPUT_IFORCE_USB is not set -+# CONFIG_INPUT_IFORCE_232 is not set -+# CONFIG_INPUT_WARRIOR is not set -+# CONFIG_INPUT_MAGELLAN is not set -+# CONFIG_INPUT_SPACEORB is not set -+# CONFIG_INPUT_SPACEBALL is not set -+# CONFIG_INPUT_STINGER is not set -+# CONFIG_INPUT_DB9 is not set -+# CONFIG_INPUT_GAMECON is not set -+# CONFIG_INPUT_TURBOGRAFX is not set -+# CONFIG_QIC02_TAPE is not set -+# CONFIG_IPMI_HANDLER is not set -+# CONFIG_IPMI_PANIC_EVENT is not set -+# CONFIG_IPMI_DEVICE_INTERFACE is not set -+# CONFIG_IPMI_KCS is not set -+# CONFIG_IPMI_WATCHDOG is not set -+ -+# -+# Watchdog Cards -+# -+# CONFIG_WATCHDOG is not set -+# CONFIG_SCx200_GPIO is not set -+# CONFIG_AMD_PM768 is not set -+# CONFIG_NVRAM is not set -+# CONFIG_RTC is not set -+CONFIG_PXA_RTC=y -+# CONFIG_DTLK is not set -+# CONFIG_R3964 is not set -+# CONFIG_APPLICOM is not set -+ -+# -+# Ftape, the floppy tape device driver -+# -+# CONFIG_FTAPE is not set -+# CONFIG_AGP is not set -+# CONFIG_DRM is not set -+ -+# -+# PCMCIA character devices -+# -+# CONFIG_PCMCIA_SERIAL_CS is not set -+# CONFIG_SYNCLINK_CS is not set -+ -+# -+# Multimedia devices -+# -+# CONFIG_VIDEO_DEV is not set -+ -+# -+# File systems -+# -+# CONFIG_QUOTA is not set -+# CONFIG_AUTOFS_FS is not set -+# CONFIG_AUTOFS4_FS is not set -+# CONFIG_REISERFS_FS is not set -+# CONFIG_REISERFS_CHECK is not set -+# CONFIG_REISERFS_PROC_INFO is not set -+# CONFIG_ADFS_FS is not set -+# CONFIG_ADFS_FS_RW is not set -+# CONFIG_AFFS_FS is not set -+# CONFIG_HFS_FS is not set -+# CONFIG_BEFS_FS is not set -+# CONFIG_BEFS_DEBUG is not set -+# CONFIG_BFS_FS is not set -+# CONFIG_EXT3_FS is not set -+# CONFIG_JBD is not set -+# CONFIG_JBD_DEBUG is not set -+CONFIG_FAT_FS=y -+CONFIG_MSDOS_FS=y -+# CONFIG_UMSDOS_FS is not set -+# CONFIG_VFAT_FS is not set -+# CONFIG_EFS_FS is not set -+# CONFIG_JFFS_FS is not set -+CONFIG_JFFS2_FS=y -+CONFIG_JFFS2_FS_DEBUG=0 -+# CONFIG_CRAMFS is not set -+# CONFIG_CRAMFS_LINEAR is not set -+# CONFIG_CRAMFS_LINEAR_XIP is not set -+# CONFIG_ROOT_CRAMFS_LINEAR is not set -+# CONFIG_TMPFS is not set -+CONFIG_RAMFS=y -+# CONFIG_ISO9660_FS is not set -+# CONFIG_JOLIET is not set -+# CONFIG_ZISOFS is not set -+# CONFIG_JFS_FS is not set -+# CONFIG_JFS_DEBUG is not set -+# CONFIG_JFS_STATISTICS is not set -+# CONFIG_MINIX_FS is not set -+# CONFIG_VXFS_FS is not set -+# CONFIG_NTFS_FS is not set -+# CONFIG_NTFS_RW is not set -+# CONFIG_HPFS_FS is not set -+CONFIG_PROC_FS=y -+CONFIG_DEVFS_FS=y -+CONFIG_DEVFS_MOUNT=y -+# CONFIG_DEVFS_DEBUG is not set -+CONFIG_DEVPTS_FS=y -+# CONFIG_QNX4FS_FS is not set -+# CONFIG_QNX4FS_RW is not set -+# CONFIG_ROMFS_FS is not set -+CONFIG_EXT2_FS=y -+# CONFIG_SYSV_FS is not set -+# CONFIG_UDF_FS is not set -+# CONFIG_UDF_RW is not set -+# CONFIG_UFS_FS is not set -+# CONFIG_UFS_FS_WRITE is not set -+ -+# -+# Network File Systems -+# -+# CONFIG_CODA_FS is not set -+# CONFIG_INTERMEZZO_FS is not set -+CONFIG_NFS_FS=y -+# CONFIG_NFS_V3 is not set -+CONFIG_ROOT_NFS=y -+# CONFIG_NFSD is not set -+# CONFIG_NFSD_V3 is not set -+# CONFIG_NFSD_TCP is not set -+CONFIG_SUNRPC=y -+CONFIG_LOCKD=y -+# CONFIG_SMB_FS is not set -+# CONFIG_NCP_FS is not set -+# CONFIG_NCPFS_PACKET_SIGNING is not set -+# CONFIG_NCPFS_IOCTL_LOCKING is not set -+# CONFIG_NCPFS_STRONG is not set -+# CONFIG_NCPFS_NFS_NS is not set -+# CONFIG_NCPFS_OS2_NS is not set -+# CONFIG_NCPFS_SMALLDOS is not set -+# CONFIG_NCPFS_NLS is not set -+# CONFIG_NCPFS_EXTRAS is not set -+# CONFIG_ZISOFS_FS is not set -+ -+# -+# Partition Types -+# -+# CONFIG_PARTITION_ADVANCED is not set -+CONFIG_MSDOS_PARTITION=y -+# CONFIG_SMB_NLS is not set -+CONFIG_NLS=y -+ -+# -+# Native Language Support -+# -+CONFIG_NLS_DEFAULT="iso8859-1" -+# CONFIG_NLS_CODEPAGE_437 is not set -+# CONFIG_NLS_CODEPAGE_737 is not set -+# CONFIG_NLS_CODEPAGE_775 is not set -+# CONFIG_NLS_CODEPAGE_850 is not set -+# CONFIG_NLS_CODEPAGE_852 is not set -+# CONFIG_NLS_CODEPAGE_855 is not set -+# CONFIG_NLS_CODEPAGE_857 is not set -+# CONFIG_NLS_CODEPAGE_860 is not set -+# CONFIG_NLS_CODEPAGE_861 is not set -+# CONFIG_NLS_CODEPAGE_862 is not set -+# CONFIG_NLS_CODEPAGE_863 is not set -+# CONFIG_NLS_CODEPAGE_864 is not set -+# CONFIG_NLS_CODEPAGE_865 is not set -+# CONFIG_NLS_CODEPAGE_866 is not set -+# CONFIG_NLS_CODEPAGE_869 is not set -+# CONFIG_NLS_CODEPAGE_936 is not set -+# CONFIG_NLS_CODEPAGE_950 is not set -+# CONFIG_NLS_CODEPAGE_932 is not set -+# CONFIG_NLS_CODEPAGE_949 is not set -+# CONFIG_NLS_CODEPAGE_874 is not set -+# CONFIG_NLS_ISO8859_8 is not set -+# CONFIG_NLS_CODEPAGE_1250 is not set -+# CONFIG_NLS_CODEPAGE_1251 is not set -+CONFIG_NLS_ISO8859_1=y -+# CONFIG_NLS_ISO8859_2 is not set -+# CONFIG_NLS_ISO8859_3 is not set -+# CONFIG_NLS_ISO8859_4 is not set -+# CONFIG_NLS_ISO8859_5 is not set -+# CONFIG_NLS_ISO8859_6 is not set -+# CONFIG_NLS_ISO8859_7 is not set -+# CONFIG_NLS_ISO8859_9 is not set -+# CONFIG_NLS_ISO8859_13 is not set -+# CONFIG_NLS_ISO8859_14 is not set -+# CONFIG_NLS_ISO8859_15 is not set -+# CONFIG_NLS_KOI8_R is not set -+# CONFIG_NLS_KOI8_U is not set -+# CONFIG_NLS_UTF8 is not set -+ -+# -+# Console drivers -+# -+CONFIG_PC_KEYMAP=y -+# CONFIG_VGA_CONSOLE is not set -+ -+# -+# Frame-buffer support -+# -+CONFIG_FB=y -+CONFIG_DUMMY_CONSOLE=y -+# CONFIG_FB_ACORN is not set -+# CONFIG_FB_ANAKIN is not set -+# CONFIG_FB_CLPS711X is not set -+# CONFIG_FB_SA1100 is not set -+# CONFIG_FB_DBMX1 is not set -+CONFIG_FB_PXA=y -+# CONFIG_FB_PXA_8BPP is not set -+CONFIG_FB_PXA_16BPP=y -+# CONFIG_FB_PXA_QVGA is not set -+# CONFIG_FB_CYBER2000 is not set -+# CONFIG_FB_VIRTUAL is not set -+# CONFIG_FBCON_ADVANCED is not set -+CONFIG_FBCON_CFB2=y -+CONFIG_FBCON_CFB4=y -+CONFIG_FBCON_CFB8=y -+CONFIG_FBCON_CFB16=y -+CONFIG_FBCON_FONTWIDTH8_ONLY=y -+# CONFIG_FBCON_FONTS is not set -+CONFIG_FONT_8x8=y -+CONFIG_FONT_8x16=y -+ -+# -+# Sound -+# -+CONFIG_SOUND=y -+# CONFIG_SOUND_ALI5455 is not set -+# CONFIG_SOUND_BT878 is not set -+# CONFIG_SOUND_CMPCI is not set -+# CONFIG_SOUND_EMU10K1 is not set -+# CONFIG_MIDI_EMU10K1 is not set -+# CONFIG_SOUND_FUSION is not set -+# CONFIG_SOUND_CS4281 is not set -+# CONFIG_SOUND_ES1370 is not set -+# CONFIG_SOUND_ES1371 is not set -+# CONFIG_SOUND_ESSSOLO1 is not set -+# CONFIG_SOUND_MAESTRO is not set -+# CONFIG_SOUND_MAESTRO3 is not set -+# CONFIG_SOUND_FORTE is not set -+# CONFIG_SOUND_ICH is not set -+# CONFIG_SOUND_RME96XX is not set -+# CONFIG_SOUND_SONICVIBES is not set -+# CONFIG_SOUND_TRIDENT is not set -+# CONFIG_SOUND_MSNDCLAS is not set -+# CONFIG_SOUND_MSNDPIN is not set -+# CONFIG_SOUND_VIA82CXXX is not set -+# CONFIG_MIDI_VIA82CXXX is not set -+# CONFIG_SOUND_OSS is not set -+# CONFIG_SOUND_VIDC is not set -+# CONFIG_SOUND_WAVEARTIST is not set -+CONFIG_SOUND_PXA_AC97=y -+# CONFIG_SOUND_TVMIXER is not set -+ -+# -+# Multimedia Capabilities Port drivers -+# -+# CONFIG_MCP is not set -+# CONFIG_MCP_SA1100 is not set -+# CONFIG_MCP_UCB1200 is not set -+# CONFIG_MCP_UCB1200_AUDIO is not set -+# CONFIG_MCP_UCB1200_TS is not set -+CONFIG_MCP_UCB1400_TS=y -+ -+# -+# USB support -+# -+# CONFIG_USB is not set -+ -+# -+# Bluetooth support -+# -+# CONFIG_BLUEZ is not set -+ -+# -+# Kernel hacking -+# -+CONFIG_FRAME_POINTER=y -+CONFIG_DEBUG_USER=y -+CONFIG_DEBUG_INFO=y -+# CONFIG_NO_PGT_CACHE is not set -+CONFIG_DEBUG_KERNEL=y -+# CONFIG_DEBUG_SLAB is not set -+CONFIG_MAGIC_SYSRQ=y -+# CONFIG_DEBUG_SPINLOCK is not set -+# CONFIG_DEBUG_WAITQ is not set -+CONFIG_DEBUG_BUGVERBOSE=y -+CONFIG_DEBUG_ERRORS=y -+CONFIG_DEBUG_LL=y -+# CONFIG_DEBUG_DC21285_PORT is not set -+# CONFIG_DEBUG_CLPS711X_UART2 is not set -+ -+# -+# Library routines -+# -+CONFIG_ZLIB_INFLATE=y -+CONFIG_ZLIB_DEFLATE=y ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/def-configs/pxa_idp 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,933 @@ -+# -+# Automatically generated by make menuconfig: don't edit -+# -+CONFIG_ARM=y -+# CONFIG_EISA is not set -+# CONFIG_SBUS is not set -+# CONFIG_MCA is not set -+CONFIG_UID16=y -+CONFIG_RWSEM_GENERIC_SPINLOCK=y -+# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set -+# CONFIG_GENERIC_BUST_SPINLOCK is not set -+# CONFIG_GENERIC_ISA_DMA is not set -+ -+# -+# Code maturity level options -+# -+CONFIG_EXPERIMENTAL=y -+# CONFIG_OBSOLETE is not set -+ -+# -+# Loadable module support -+# -+CONFIG_MODULES=y -+# CONFIG_MODVERSIONS is not set -+CONFIG_KMOD=y -+ -+# -+# System Type -+# -+# CONFIG_ARCH_ANAKIN is not set -+# CONFIG_ARCH_ARCA5K is not set -+# CONFIG_ARCH_CLPS7500 is not set -+# CONFIG_ARCH_CLPS711X is not set -+# CONFIG_ARCH_CO285 is not set -+CONFIG_ARCH_PXA=y -+# CONFIG_ARCH_EBSA110 is not set -+# CONFIG_ARCH_CAMELOT is not set -+# CONFIG_ARCH_FOOTBRIDGE is not set -+# CONFIG_ARCH_INTEGRATOR is not set -+# CONFIG_ARCH_OMAHA is not set -+# CONFIG_ARCH_L7200 is not set -+# CONFIG_ARCH_MX1ADS is not set -+# CONFIG_ARCH_RPC is not set -+# CONFIG_ARCH_RISCSTATION is not set -+# CONFIG_ARCH_SA1100 is not set -+# CONFIG_ARCH_SHARK is not set -+ -+# -+# Archimedes/A5000 Implementations -+# -+# CONFIG_ARCH_ARC is not set -+# CONFIG_ARCH_A5K is not set -+ -+# -+# Footbridge Implementations -+# -+# CONFIG_ARCH_CATS is not set -+# CONFIG_ARCH_PERSONAL_SERVER is not set -+# CONFIG_ARCH_EBSA285_ADDIN is not set -+# CONFIG_ARCH_EBSA285_HOST is not set -+# CONFIG_ARCH_NETWINDER is not set -+ -+# -+# SA11x0 Implementations -+# -+# CONFIG_SA1100_ACCELENT is not set -+# CONFIG_SA1100_ASSABET is not set -+# CONFIG_ASSABET_NEPONSET is not set -+# CONFIG_SA1100_ADSBITSY is not set -+# CONFIG_SA1100_BRUTUS is not set -+# CONFIG_SA1100_CEP is not set -+# CONFIG_SA1100_CERF is not set -+# CONFIG_SA1100_H3100 is not set -+# CONFIG_SA1100_H3600 is not set -+# CONFIG_SA1100_H3800 is not set -+# CONFIG_SA1100_H3XXX is not set -+# CONFIG_SA1100_EXTENEX1 is not set -+# CONFIG_SA1100_FLEXANET is not set -+# CONFIG_SA1100_FREEBIRD is not set -+# CONFIG_SA1100_FRODO is not set -+# CONFIG_SA1100_GRAPHICSCLIENT is not set -+# CONFIG_SA1100_GRAPHICSMASTER is not set -+# CONFIG_SA1100_BADGE4 is not set -+# CONFIG_SA1100_JORNADA720 is not set -+# CONFIG_SA1100_HUW_WEBPANEL is not set -+# CONFIG_SA1100_ITSY is not set -+# CONFIG_SA1100_LART is not set -+# CONFIG_SA1100_NANOENGINE is not set -+# CONFIG_SA1100_OMNIMETER is not set -+# CONFIG_SA1100_PANGOLIN is not set -+# CONFIG_SA1100_PLEB is not set -+# CONFIG_SA1100_PT_SYSTEM3 is not set -+# CONFIG_SA1100_SHANNON is not set -+# CONFIG_SA1100_SHERMAN is not set -+# CONFIG_SA1100_SIMPAD is not set -+# CONFIG_SA1100_SIMPUTER is not set -+# CONFIG_SA1100_PFS168 is not set -+# CONFIG_SA1100_VICTOR is not set -+# CONFIG_SA1100_XP860 is not set -+# CONFIG_SA1100_YOPY is not set -+# CONFIG_SA1100_USB is not set -+# CONFIG_SA1100_USB_NETLINK is not set -+# CONFIG_SA1100_USB_CHAR is not set -+# CONFIG_H3600_SLEEVE is not set -+ -+# -+# Intel PXA250/210 Implementations -+# -+# CONFIG_ARCH_LUBBOCK is not set -+CONFIG_ARCH_PXA_IDP=y -+# CONFIG_ARCH_PXA_CERF is not set -+CONFIG_PXA_USB=m -+CONFIG_PXA_USB_NETLINK=m -+CONFIG_PXA_USB_CHAR=m -+ -+# -+# CLPS711X/EP721X Implementations -+# -+# CONFIG_ARCH_AUTCPU12 is not set -+# CONFIG_ARCH_CDB89712 is not set -+# CONFIG_ARCH_CLEP7312 is not set -+# CONFIG_ARCH_EDB7211 is not set -+# CONFIG_ARCH_P720T is not set -+# CONFIG_ARCH_FORTUNET is not set -+# CONFIG_ARCH_EP7211 is not set -+# CONFIG_ARCH_EP7212 is not set -+# CONFIG_ARCH_ACORN is not set -+# CONFIG_FOOTBRIDGE is not set -+# CONFIG_FOOTBRIDGE_HOST is not set -+# CONFIG_FOOTBRIDGE_ADDIN is not set -+CONFIG_CPU_32=y -+# CONFIG_CPU_26 is not set -+# CONFIG_CPU_ARM610 is not set -+# CONFIG_CPU_ARM710 is not set -+# CONFIG_CPU_ARM720T is not set -+# CONFIG_CPU_ARM920T is not set -+# CONFIG_CPU_ARM922T is not set -+# CONFIG_PLD is not set -+# CONFIG_CPU_ARM926T is not set -+# CONFIG_CPU_ARM1020 is not set -+# CONFIG_CPU_ARM1026 is not set -+# CONFIG_CPU_SA110 is not set -+# CONFIG_CPU_SA1100 is not set -+CONFIG_CPU_32v5=y -+CONFIG_CPU_XSCALE=y -+# CONFIG_XSCALE_CACHE_ERRATA is not set -+# CONFIG_CPU_32v3 is not set -+# CONFIG_CPU_32v4 is not set -+# CONFIG_DISCONTIGMEM is not set -+ -+# -+# General setup -+# -+# CONFIG_PCI is not set -+# CONFIG_ISA is not set -+# CONFIG_ISA_DMA is not set -+# CONFIG_ZBOOT_ROM is not set -+CONFIG_ZBOOT_ROM_TEXT=0 -+CONFIG_ZBOOT_ROM_BSS=0 -+CONFIG_HOTPLUG=y -+ -+# -+# PCMCIA/CardBus support -+# -+CONFIG_PCMCIA=y -+# CONFIG_I82092 is not set -+# CONFIG_I82365 is not set -+# CONFIG_TCIC is not set -+# CONFIG_PCMCIA_CLPS6700 is not set -+# CONFIG_PCMCIA_SA1100 is not set -+CONFIG_PCMCIA_PXA=y -+CONFIG_NET=y -+CONFIG_SYSVIPC=y -+# CONFIG_BSD_PROCESS_ACCT is not set -+CONFIG_SYSCTL=y -+CONFIG_FPE_NWFPE=y -+# CONFIG_FPE_FASTFPE is not set -+CONFIG_KCORE_ELF=y -+# CONFIG_KCORE_AOUT is not set -+# CONFIG_BINFMT_AOUT is not set -+CONFIG_BINFMT_ELF=y -+# CONFIG_BINFMT_MISC is not set -+CONFIG_PM=y -+# CONFIG_ARTHUR is not set -+CONFIG_CMDLINE="root=/dev/mtdblock2 init=/linuxrc console=ttyS0,115200" -+CONFIG_LEDS=y -+CONFIG_LEDS_TIMER=y -+CONFIG_LEDS_CPU=y -+CONFIG_ALIGNMENT_TRAP=y -+ -+# -+# Parallel port support -+# -+# CONFIG_PARPORT is not set -+ -+# -+# Memory Technology Devices (MTD) -+# -+CONFIG_MTD=y -+# CONFIG_MTD_DEBUG is not set -+CONFIG_MTD_PARTITIONS=y -+# CONFIG_MTD_CONCAT is not set -+# CONFIG_MTD_REDBOOT_PARTS is not set -+# CONFIG_MTD_CMDLINE_PARTS is not set -+# CONFIG_MTD_AFS_PARTS is not set -+CONFIG_MTD_CHAR=y -+CONFIG_MTD_BLOCK=y -+# CONFIG_FTL is not set -+# CONFIG_NFTL is not set -+ -+# -+# RAM/ROM/Flash chip drivers -+# -+CONFIG_MTD_CFI=y -+# CONFIG_MTD_JEDECPROBE is not set -+CONFIG_MTD_GEN_PROBE=y -+CONFIG_MTD_CFI_ADV_OPTIONS=y -+CONFIG_MTD_CFI_NOSWAP=y -+# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set -+# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set -+CONFIG_MTD_CFI_GEOMETRY=y -+# CONFIG_MTD_CFI_B1 is not set -+# CONFIG_MTD_CFI_B2 is not set -+CONFIG_MTD_CFI_B4=y -+# CONFIG_MTD_CFI_B8 is not set -+# CONFIG_MTD_CFI_I1 is not set -+CONFIG_MTD_CFI_I2=y -+# CONFIG_MTD_CFI_I4 is not set -+# CONFIG_MTD_CFI_I8 is not set -+CONFIG_MTD_CFI_INTELEXT=y -+# CONFIG_MTD_CFI_AMDSTD is not set -+# CONFIG_MTD_RAM is not set -+# CONFIG_MTD_ROM is not set -+# CONFIG_MTD_ABSENT is not set -+# CONFIG_MTD_OBSOLETE_CHIPS is not set -+# CONFIG_MTD_AMDSTD is not set -+# CONFIG_MTD_SHARP is not set -+# CONFIG_MTD_JEDEC is not set -+ -+# -+# Mapping drivers for chip access -+# -+# CONFIG_MTD_PHYSMAP is not set -+CONFIG_MTD_LUBBOCK=y -+# CONFIG_MTD_NORA is not set -+# CONFIG_MTD_ARM_INTEGRATOR is not set -+# CONFIG_MTD_CDB89712 is not set -+# CONFIG_MTD_SA1100 is not set -+# CONFIG_MTD_DC21285 is not set -+# CONFIG_MTD_IQ80310 is not set -+# CONFIG_MTD_FORTUNET is not set -+# CONFIG_MTD_PXA_CERF is not set -+# CONFIG_MTD_EPXA10DB is not set -+# CONFIG_MTD_AUTCPU12 is not set -+# CONFIG_MTD_EDB7312 is not set -+# CONFIG_MTD_IMPA7 is not set -+CONFIG_ASI_MTD0_SIZE=40000 -+CONFIG_ASI_MTD1_SIZE=100000 -+CONFIG_ASI_MTD2_SIZE=1e00000 -+# CONFIG_MTD_PCI is not set -+ -+# -+# Self-contained MTD device drivers -+# -+# CONFIG_MTD_PMC551 is not set -+# CONFIG_MTD_SLRAM is not set -+# CONFIG_MTD_MTDRAM is not set -+# CONFIG_MTD_BLKMTD is not set -+# CONFIG_MTD_DOC1000 is not set -+# CONFIG_MTD_DOC2000 is not set -+# CONFIG_MTD_DOC2001 is not set -+# CONFIG_MTD_DOCPROBE is not set -+ -+# -+# NAND Flash Device Drivers -+# -+# CONFIG_MTD_NAND is not set -+ -+# -+# Plug and Play configuration -+# -+# CONFIG_PNP is not set -+# CONFIG_ISAPNP is not set -+ -+# -+# Block devices -+# -+# CONFIG_BLK_DEV_FD is not set -+# CONFIG_BLK_DEV_XD is not set -+# CONFIG_PARIDE is not set -+# CONFIG_BLK_CPQ_DA is not set -+# CONFIG_BLK_CPQ_CISS_DA is not set -+# CONFIG_CISS_SCSI_TAPE is not set -+# CONFIG_BLK_DEV_DAC960 is not set -+# CONFIG_BLK_DEV_UMEM is not set -+CONFIG_BLK_DEV_LOOP=y -+# CONFIG_BLK_DEV_NBD is not set -+CONFIG_BLK_DEV_RAM=y -+CONFIG_BLK_DEV_RAM_SIZE=4096 -+CONFIG_BLK_DEV_INITRD=y -+ -+# -+# Multi-device support (RAID and LVM) -+# -+# CONFIG_MD is not set -+# CONFIG_BLK_DEV_MD is not set -+# CONFIG_MD_LINEAR is not set -+# CONFIG_MD_RAID0 is not set -+# CONFIG_MD_RAID1 is not set -+# CONFIG_MD_RAID5 is not set -+# CONFIG_MD_MULTIPATH is not set -+# CONFIG_BLK_DEV_LVM is not set -+ -+# -+# Networking options -+# -+CONFIG_PACKET=y -+# CONFIG_PACKET_MMAP is not set -+# CONFIG_NETLINK_DEV is not set -+# CONFIG_NETFILTER is not set -+# CONFIG_FILTER is not set -+CONFIG_UNIX=y -+CONFIG_INET=y -+# CONFIG_IP_MULTICAST is not set -+# CONFIG_IP_ADVANCED_ROUTER is not set -+# CONFIG_IP_PNP is not set -+# CONFIG_NET_IPIP is not set -+# CONFIG_NET_IPGRE is not set -+# CONFIG_ARPD is not set -+# CONFIG_INET_ECN is not set -+# CONFIG_SYN_COOKIES is not set -+# CONFIG_IPV6 is not set -+# CONFIG_KHTTPD is not set -+# CONFIG_ATM is not set -+# CONFIG_VLAN_8021Q is not set -+# CONFIG_IPX is not set -+# CONFIG_ATALK is not set -+ -+# -+# Appletalk devices -+# -+# CONFIG_DEV_APPLETALK is not set -+# CONFIG_DECNET is not set -+# CONFIG_BRIDGE is not set -+# CONFIG_X25 is not set -+# CONFIG_LAPB is not set -+# CONFIG_LLC is not set -+# CONFIG_NET_DIVERT is not set -+# CONFIG_ECONET is not set -+# CONFIG_WAN_ROUTER is not set -+# CONFIG_NET_FASTROUTE is not set -+# CONFIG_NET_HW_FLOWCONTROL is not set -+ -+# -+# QoS and/or fair queueing -+# -+# CONFIG_NET_SCHED is not set -+ -+# -+# Network testing -+# -+# CONFIG_NET_PKTGEN is not set -+ -+# -+# Network device support -+# -+CONFIG_NETDEVICES=y -+ -+# -+# ARCnet devices -+# -+# CONFIG_ARCNET is not set -+# CONFIG_DUMMY is not set -+# CONFIG_BONDING is not set -+# CONFIG_EQUALIZER is not set -+# CONFIG_TUN is not set -+# CONFIG_ETHERTAP is not set -+ -+# -+# Ethernet (10 or 100Mbit) -+# -+CONFIG_NET_ETHERNET=y -+# CONFIG_ARM_AM79C961A is not set -+# CONFIG_ARM_CIRRUS is not set -+# CONFIG_SUNLANCE is not set -+# CONFIG_SUNBMAC is not set -+# CONFIG_SUNQE is not set -+# CONFIG_SUNGEM is not set -+# CONFIG_NET_VENDOR_3COM is not set -+# CONFIG_LANCE is not set -+CONFIG_NET_VENDOR_SMC=y -+# CONFIG_WD80x3 is not set -+# CONFIG_ULTRAMCA is not set -+# CONFIG_ULTRA is not set -+# CONFIG_ULTRA32 is not set -+# CONFIG_SMC9194 is not set -+CONFIG_SMC91111=m -+# CONFIG_NET_VENDOR_RACAL is not set -+# CONFIG_NET_ISA is not set -+# CONFIG_NET_PCI is not set -+CONFIG_NET_POCKET=y -+# CONFIG_DE600 is not set -+# CONFIG_DE620 is not set -+ -+# -+# Ethernet (1000 Mbit) -+# -+# CONFIG_ACENIC is not set -+# CONFIG_DL2K is not set -+# CONFIG_MYRI_SBUS is not set -+# CONFIG_NS83820 is not set -+# CONFIG_HAMACHI is not set -+# CONFIG_YELLOWFIN is not set -+# CONFIG_SK98LIN is not set -+# CONFIG_TIGON3 is not set -+# CONFIG_FDDI is not set -+# CONFIG_HIPPI is not set -+# CONFIG_PLIP is not set -+# CONFIG_PPP is not set -+# CONFIG_SLIP is not set -+ -+# -+# Wireless LAN (non-hamradio) -+# -+CONFIG_NET_RADIO=y -+# CONFIG_STRIP is not set -+CONFIG_WAVELAN=m -+# CONFIG_ARLAN is not set -+CONFIG_AIRONET4500=y -+# CONFIG_AIRONET4500_NONCS is not set -+# CONFIG_AIRONET4500_PROC is not set -+CONFIG_HERMES=m -+CONFIG_PCMCIA_HERMES=m -+CONFIG_AIRO_CS=m -+CONFIG_NET_WIRELESS=y -+ -+# -+# Token Ring devices -+# -+# CONFIG_TR is not set -+# CONFIG_NET_FC is not set -+# CONFIG_RCPCI is not set -+# CONFIG_SHAPER is not set -+ -+# -+# Wan interfaces -+# -+# CONFIG_WAN is not set -+ -+# -+# PCMCIA network device support -+# -+CONFIG_NET_PCMCIA=y -+# CONFIG_PCMCIA_3C589 is not set -+# CONFIG_PCMCIA_3C574 is not set -+# CONFIG_PCMCIA_FMVJ18X is not set -+CONFIG_PCMCIA_PCNET=m -+# CONFIG_PCMCIA_AXNET is not set -+CONFIG_PCMCIA_NMCLAN=m -+CONFIG_PCMCIA_SMC91C92=m -+CONFIG_PCMCIA_XIRC2PS=m -+# CONFIG_ARCNET_COM20020_CS is not set -+# CONFIG_PCMCIA_IBMTR is not set -+CONFIG_NET_PCMCIA_RADIO=y -+CONFIG_PCMCIA_RAYCS=m -+CONFIG_PCMCIA_NETWAVE=m -+CONFIG_PCMCIA_WAVELAN=m -+CONFIG_AIRONET4500_CS=m -+ -+# -+# Amateur Radio support -+# -+# CONFIG_HAMRADIO is not set -+ -+# -+# IrDA (infrared) support -+# -+CONFIG_IRDA=m -+CONFIG_IRLAN=m -+# CONFIG_IRNET is not set -+CONFIG_IRCOMM=m -+CONFIG_IRDA_ULTRA=y -+# CONFIG_IRDA_CACHE_LAST_LSAP is not set -+# CONFIG_IRDA_FAST_RR is not set -+CONFIG_IRDA_DEBUG=y -+ -+# -+# Infrared-port device drivers -+# -+CONFIG_IRTTY_SIR=m -+# CONFIG_IRPORT_SIR is not set -+# CONFIG_DONGLE is not set -+# CONFIG_USB_IRDA is not set -+# CONFIG_NSC_FIR is not set -+# CONFIG_WINBOND_FIR is not set -+# CONFIG_TOSHIBA_FIR is not set -+# CONFIG_SMC_IRCC_FIR is not set -+# CONFIG_ALI_FIR is not set -+# CONFIG_VLSI_FIR is not set -+CONFIG_PXA_FIR=m -+ -+# -+# ATA/ATAPI/MFM/RLL support -+# -+CONFIG_IDE=y -+ -+# -+# IDE, ATA and ATAPI Block devices -+# -+CONFIG_BLK_DEV_IDE=y -+# CONFIG_BLK_DEV_HD_IDE is not set -+# CONFIG_BLK_DEV_HD is not set -+CONFIG_BLK_DEV_IDEDISK=y -+# CONFIG_IDEDISK_MULTI_MODE is not set -+# CONFIG_IDEDISK_STROKE is not set -+# CONFIG_BLK_DEV_IDEDISK_VENDOR is not set -+# CONFIG_BLK_DEV_IDEDISK_FUJITSU is not set -+# CONFIG_BLK_DEV_IDEDISK_IBM is not set -+# CONFIG_BLK_DEV_IDEDISK_MAXTOR is not set -+# CONFIG_BLK_DEV_IDEDISK_QUANTUM is not set -+# CONFIG_BLK_DEV_IDEDISK_SEAGATE is not set -+# CONFIG_BLK_DEV_IDEDISK_WD is not set -+# CONFIG_BLK_DEV_COMMERIAL is not set -+# CONFIG_BLK_DEV_TIVO is not set -+CONFIG_BLK_DEV_IDECS=m -+# CONFIG_BLK_DEV_IDECD is not set -+# CONFIG_BLK_DEV_IDETAPE is not set -+# CONFIG_BLK_DEV_IDEFLOPPY is not set -+# CONFIG_BLK_DEV_IDESCSI is not set -+# CONFIG_IDE_TASK_IOCTL is not set -+# CONFIG_BLK_DEV_CMD640 is not set -+# CONFIG_BLK_DEV_CMD640_ENHANCED is not set -+# CONFIG_BLK_DEV_ISAPNP is not set -+# CONFIG_IDE_CHIPSETS is not set -+# CONFIG_IDEDMA_AUTO is not set -+# CONFIG_DMA_NONPCI is not set -+# CONFIG_BLK_DEV_IDE_MODES is not set -+# CONFIG_BLK_DEV_ATARAID is not set -+# CONFIG_BLK_DEV_ATARAID_PDC is not set -+# CONFIG_BLK_DEV_ATARAID_HPT is not set -+ -+# -+# SCSI support -+# -+# CONFIG_SCSI is not set -+ -+# -+# I2O device support -+# -+# CONFIG_I2O is not set -+# CONFIG_I2O_BLOCK is not set -+# CONFIG_I2O_LAN is not set -+# CONFIG_I2O_SCSI is not set -+# CONFIG_I2O_PROC is not set -+ -+# -+# ISDN subsystem -+# -+# CONFIG_ISDN is not set -+ -+# -+# Input core support -+# -+CONFIG_INPUT=y -+CONFIG_INPUT_KEYBDEV=m -+CONFIG_INPUT_MOUSEDEV=m -+CONFIG_INPUT_MOUSEDEV_SCREEN_X=640 -+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480 -+# CONFIG_INPUT_JOYDEV is not set -+CONFIG_INPUT_EVDEV=y -+ -+# -+# Character devices -+# -+CONFIG_VT=y -+# CONFIG_VT_CONSOLE is not set -+CONFIG_SERIAL=y -+CONFIG_SERIAL_CONSOLE=y -+# CONFIG_SERIAL_EXTENDED is not set -+# CONFIG_SERIAL_NONSTANDARD is not set -+ -+# -+# Serial drivers -+# -+# CONFIG_SERIAL_ANAKIN is not set -+# CONFIG_SERIAL_ANAKIN_CONSOLE is not set -+# CONFIG_SERIAL_AMBA is not set -+# CONFIG_SERIAL_AMBA_CONSOLE is not set -+# CONFIG_SERIAL_CLPS711X is not set -+# CONFIG_SERIAL_CLPS711X_CONSOLE is not set -+# CONFIG_SERIAL_21285 is not set -+# CONFIG_SERIAL_21285_OLD is not set -+# CONFIG_SERIAL_21285_CONSOLE is not set -+# CONFIG_SERIAL_UART00 is not set -+# CONFIG_SERIAL_UART00_CONSOLE is not set -+# CONFIG_SERIAL_SA1100 is not set -+# CONFIG_SERIAL_SA1100_CONSOLE is not set -+# CONFIG_SERIAL_OMAHA is not set -+# CONFIG_SERIAL_OMAHA_CONSOLE is not set -+# CONFIG_SERIAL_8250 is not set -+# CONFIG_SERIAL_8250_CONSOLE is not set -+# CONFIG_SERIAL_8250_EXTENDED is not set -+# CONFIG_SERIAL_8250_MANY_PORTS is not set -+# CONFIG_SERIAL_8250_SHARE_IRQ is not set -+# CONFIG_SERIAL_8250_DETECT_IRQ is not set -+# CONFIG_SERIAL_8250_MULTIPORT is not set -+# CONFIG_SERIAL_8250_HUB6 is not set -+# CONFIG_IDP_KEYB is not set -+CONFIG_MATRIX_KEYBOARD=y -+# CONFIG_SA1111_PS2_KEYB is not set -+CONFIG_UNIX98_PTYS=y -+CONFIG_UNIX98_PTY_COUNT=256 -+ -+# -+# I2C support -+# -+# CONFIG_I2C is not set -+ -+# -+# L3 serial bus support -+# -+# CONFIG_L3 is not set -+# CONFIG_L3_ALGOBIT is not set -+# CONFIG_L3_BIT_SA1100_GPIO is not set -+# CONFIG_L3_SA1111 is not set -+# CONFIG_BIT_SA1100_GPIO is not set -+ -+# -+# Mice -+# -+CONFIG_BUSMOUSE=y -+# CONFIG_ATIXL_BUSMOUSE is not set -+# CONFIG_LOGIBUSMOUSE is not set -+# CONFIG_MS_BUSMOUSE is not set -+CONFIG_MOUSE=y -+CONFIG_PSMOUSE=y -+# CONFIG_82C710_MOUSE is not set -+# CONFIG_PC110_PAD is not set -+# CONFIG_MK712_MOUSE is not set -+ -+# -+# Joysticks -+# -+# CONFIG_INPUT_GAMEPORT is not set -+# CONFIG_INPUT_NS558 is not set -+# CONFIG_INPUT_LIGHTNING is not set -+# CONFIG_INPUT_PCIGAME is not set -+# CONFIG_INPUT_CS461X is not set -+# CONFIG_INPUT_EMU10K1 is not set -+# CONFIG_INPUT_SERIO is not set -+# CONFIG_INPUT_SERPORT is not set -+# CONFIG_INPUT_ANALOG is not set -+# CONFIG_INPUT_A3D is not set -+# CONFIG_INPUT_ADI is not set -+# CONFIG_INPUT_COBRA is not set -+# CONFIG_INPUT_GF2K is not set -+# CONFIG_INPUT_GRIP is not set -+# CONFIG_INPUT_INTERACT is not set -+# CONFIG_INPUT_TMDC is not set -+# CONFIG_INPUT_SIDEWINDER is not set -+# CONFIG_INPUT_IFORCE_USB is not set -+# CONFIG_INPUT_IFORCE_232 is not set -+# CONFIG_INPUT_WARRIOR is not set -+# CONFIG_INPUT_MAGELLAN is not set -+# CONFIG_INPUT_SPACEORB is not set -+# CONFIG_INPUT_SPACEBALL is not set -+# CONFIG_INPUT_STINGER is not set -+# CONFIG_INPUT_DB9 is not set -+# CONFIG_INPUT_GAMECON is not set -+# CONFIG_INPUT_TURBOGRAFX is not set -+# CONFIG_QIC02_TAPE is not set -+ -+# -+# Watchdog Cards -+# -+# CONFIG_WATCHDOG is not set -+# CONFIG_NVRAM is not set -+# CONFIG_RTC is not set -+# CONFIG_PXA_RTC is not set -+# CONFIG_DTLK is not set -+# CONFIG_R3964 is not set -+# CONFIG_APPLICOM is not set -+ -+# -+# Ftape, the floppy tape device driver -+# -+# CONFIG_FTAPE is not set -+# CONFIG_AGP is not set -+# CONFIG_DRM is not set -+ -+# -+# PCMCIA character devices -+# -+CONFIG_PCMCIA_SERIAL_CS=m -+ -+# -+# Multimedia devices -+# -+# CONFIG_VIDEO_DEV is not set -+ -+# -+# File systems -+# -+# CONFIG_QUOTA is not set -+# CONFIG_AUTOFS_FS is not set -+# CONFIG_AUTOFS4_FS is not set -+# CONFIG_REISERFS_FS is not set -+# CONFIG_REISERFS_CHECK is not set -+# CONFIG_REISERFS_PROC_INFO is not set -+# CONFIG_ADFS_FS is not set -+# CONFIG_ADFS_FS_RW is not set -+# CONFIG_AFFS_FS is not set -+# CONFIG_HFS_FS is not set -+# CONFIG_BFS_FS is not set -+CONFIG_EXT3_FS=m -+CONFIG_JBD=m -+# CONFIG_JBD_DEBUG is not set -+CONFIG_FAT_FS=m -+CONFIG_MSDOS_FS=m -+# CONFIG_UMSDOS_FS is not set -+CONFIG_VFAT_FS=m -+# CONFIG_EFS_FS is not set -+# CONFIG_JFFS_FS is not set -+CONFIG_JFFS2_FS=y -+CONFIG_JFFS2_FS_DEBUG=0 -+CONFIG_CRAMFS=y -+# CONFIG_TMPFS is not set -+CONFIG_RAMFS=y -+# CONFIG_ISO9660_FS is not set -+# CONFIG_JOLIET is not set -+# CONFIG_ZISOFS is not set -+# CONFIG_MINIX_FS is not set -+# CONFIG_VXFS_FS is not set -+# CONFIG_NTFS_FS is not set -+# CONFIG_NTFS_RW is not set -+# CONFIG_HPFS_FS is not set -+CONFIG_PROC_FS=y -+CONFIG_DEVFS_FS=y -+CONFIG_DEVFS_MOUNT=y -+# CONFIG_DEVFS_DEBUG is not set -+CONFIG_DEVPTS_FS=y -+# CONFIG_QNX4FS_FS is not set -+# CONFIG_QNX4FS_RW is not set -+# CONFIG_ROMFS_FS is not set -+CONFIG_EXT2_FS=y -+# CONFIG_SYSV_FS is not set -+# CONFIG_UDF_FS is not set -+# CONFIG_UDF_RW is not set -+# CONFIG_UFS_FS is not set -+# CONFIG_UFS_FS_WRITE is not set -+ -+# -+# Network File Systems -+# -+# CONFIG_CODA_FS is not set -+# CONFIG_INTERMEZZO_FS is not set -+CONFIG_NFS_FS=y -+CONFIG_NFS_V3=y -+# CONFIG_ROOT_NFS is not set -+# CONFIG_NFSD is not set -+# CONFIG_NFSD_V3 is not set -+CONFIG_SUNRPC=y -+CONFIG_LOCKD=y -+CONFIG_LOCKD_V4=y -+# CONFIG_SMB_FS is not set -+# CONFIG_NCP_FS is not set -+# CONFIG_NCPFS_PACKET_SIGNING is not set -+# CONFIG_NCPFS_IOCTL_LOCKING is not set -+# CONFIG_NCPFS_STRONG is not set -+# CONFIG_NCPFS_NFS_NS is not set -+# CONFIG_NCPFS_OS2_NS is not set -+# CONFIG_NCPFS_SMALLDOS is not set -+# CONFIG_NCPFS_NLS is not set -+# CONFIG_NCPFS_EXTRAS is not set -+# CONFIG_ZISOFS_FS is not set -+CONFIG_ZLIB_FS_INFLATE=y -+ -+# -+# Partition Types -+# -+CONFIG_PARTITION_ADVANCED=y -+# CONFIG_ACORN_PARTITION is not set -+# CONFIG_OSF_PARTITION is not set -+# CONFIG_AMIGA_PARTITION is not set -+# CONFIG_ATARI_PARTITION is not set -+# CONFIG_MAC_PARTITION is not set -+CONFIG_MSDOS_PARTITION=y -+# CONFIG_BSD_DISKLABEL is not set -+# CONFIG_MINIX_SUBPARTITION is not set -+# CONFIG_SOLARIS_X86_PARTITION is not set -+# CONFIG_UNIXWARE_DISKLABEL is not set -+# CONFIG_LDM_PARTITION is not set -+# CONFIG_SGI_PARTITION is not set -+# CONFIG_ULTRIX_PARTITION is not set -+# CONFIG_SUN_PARTITION is not set -+# CONFIG_SMB_NLS is not set -+CONFIG_NLS=y -+ -+# -+# Native Language Support -+# -+CONFIG_NLS_DEFAULT="iso8859-1" -+CONFIG_NLS_CODEPAGE_437=m -+# CONFIG_NLS_CODEPAGE_737 is not set -+# CONFIG_NLS_CODEPAGE_775 is not set -+# CONFIG_NLS_CODEPAGE_850 is not set -+# CONFIG_NLS_CODEPAGE_852 is not set -+# CONFIG_NLS_CODEPAGE_855 is not set -+# CONFIG_NLS_CODEPAGE_857 is not set -+# CONFIG_NLS_CODEPAGE_860 is not set -+# CONFIG_NLS_CODEPAGE_861 is not set -+# CONFIG_NLS_CODEPAGE_862 is not set -+# CONFIG_NLS_CODEPAGE_863 is not set -+# CONFIG_NLS_CODEPAGE_864 is not set -+# CONFIG_NLS_CODEPAGE_865 is not set -+# CONFIG_NLS_CODEPAGE_866 is not set -+# CONFIG_NLS_CODEPAGE_869 is not set -+# CONFIG_NLS_CODEPAGE_936 is not set -+# CONFIG_NLS_CODEPAGE_950 is not set -+# CONFIG_NLS_CODEPAGE_932 is not set -+# CONFIG_NLS_CODEPAGE_949 is not set -+# CONFIG_NLS_CODEPAGE_874 is not set -+# CONFIG_NLS_ISO8859_8 is not set -+# CONFIG_NLS_CODEPAGE_1250 is not set -+# CONFIG_NLS_CODEPAGE_1251 is not set -+CONFIG_NLS_ISO8859_1=y -+# CONFIG_NLS_ISO8859_2 is not set -+# CONFIG_NLS_ISO8859_3 is not set -+# CONFIG_NLS_ISO8859_4 is not set -+# CONFIG_NLS_ISO8859_5 is not set -+# CONFIG_NLS_ISO8859_6 is not set -+# CONFIG_NLS_ISO8859_7 is not set -+# CONFIG_NLS_ISO8859_9 is not set -+# CONFIG_NLS_ISO8859_13 is not set -+# CONFIG_NLS_ISO8859_14 is not set -+# CONFIG_NLS_ISO8859_15 is not set -+# CONFIG_NLS_KOI8_R is not set -+# CONFIG_NLS_KOI8_U is not set -+# CONFIG_NLS_UTF8 is not set -+ -+# -+# Console drivers -+# -+CONFIG_PC_KEYMAP=y -+# CONFIG_VGA_CONSOLE is not set -+ -+# -+# Frame-buffer support -+# -+CONFIG_FB=y -+CONFIG_DUMMY_CONSOLE=y -+# CONFIG_FB_ACORN is not set -+# CONFIG_FB_ANAKIN is not set -+# CONFIG_FB_CLPS711X is not set -+# CONFIG_FB_SA1100 is not set -+CONFIG_FB_PXA=y -+# CONFIG_FB_CYBER2000 is not set -+# CONFIG_FB_VIRTUAL is not set -+# CONFIG_FBCON_ADVANCED is not set -+CONFIG_FBCON_CFB2=y -+CONFIG_FBCON_CFB4=y -+CONFIG_FBCON_CFB8=y -+CONFIG_FBCON_CFB16=y -+# CONFIG_FBCON_FONTWIDTH8_ONLY is not set -+# CONFIG_FBCON_FONTS is not set -+CONFIG_FONT_8x8=y -+CONFIG_FONT_8x16=y -+ -+# -+# Sound -+# -+CONFIG_SOUND=y -+# CONFIG_SOUND_BT878 is not set -+# CONFIG_SOUND_CMPCI is not set -+# CONFIG_SOUND_EMU10K1 is not set -+# CONFIG_MIDI_EMU10K1 is not set -+# CONFIG_SOUND_FUSION is not set -+# CONFIG_SOUND_CS4281 is not set -+# CONFIG_SOUND_ES1370 is not set -+# CONFIG_SOUND_ES1371 is not set -+# CONFIG_SOUND_ESSSOLO1 is not set -+# CONFIG_SOUND_MAESTRO is not set -+# CONFIG_SOUND_MAESTRO3 is not set -+# CONFIG_SOUND_ICH is not set -+# CONFIG_SOUND_RME96XX is not set -+# CONFIG_SOUND_SONICVIBES is not set -+# CONFIG_SOUND_TRIDENT is not set -+# CONFIG_SOUND_MSNDCLAS is not set -+# CONFIG_SOUND_MSNDPIN is not set -+# CONFIG_SOUND_VIA82CXXX is not set -+# CONFIG_MIDI_VIA82CXXX is not set -+# CONFIG_SOUND_OSS is not set -+# CONFIG_SOUND_WAVEARTIST is not set -+CONFIG_SOUND_PXA_AC97=y -+# CONFIG_SOUND_TVMIXER is not set -+ -+# -+# Multimedia Capabilities Port drivers -+# -+# CONFIG_MCP is not set -+# CONFIG_MCP_SA1100 is not set -+# CONFIG_MCP_UCB1200 is not set -+# CONFIG_MCP_UCB1200_AUDIO is not set -+# CONFIG_MCP_UCB1200_TS is not set -+CONFIG_MCP_UCB1400_TS=m -+ -+# -+# USB support -+# -+# CONFIG_USB is not set -+ -+# -+# Bluetooth support -+# -+# CONFIG_BLUEZ is not set -+ -+# -+# Kernel hacking -+# -+CONFIG_FRAME_POINTER=y -+CONFIG_DEBUG_USER=y -+# CONFIG_DEBUG_INFO is not set -+# CONFIG_NO_PGT_CACHE is not set -+CONFIG_DEBUG_KERNEL=y -+CONFIG_DEBUG_SLAB=y -+# CONFIG_MAGIC_SYSRQ is not set -+# CONFIG_DEBUG_SPINLOCK is not set -+# CONFIG_DEBUG_WAITQ is not set -+CONFIG_DEBUG_BUGVERBOSE=y -+CONFIG_DEBUG_ERRORS=y -+# CONFIG_DEBUG_LL is not set -+# CONFIG_DEBUG_DC21285_PORT is not set -+# CONFIG_DEBUG_CLPS711X_UART2 is not set ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/def-configs/trizeps2 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,873 @@ -+# -+# Automatically generated by make menuconfig: don't edit -+# -+CONFIG_ARM=y -+# CONFIG_EISA is not set -+# CONFIG_SBUS is not set -+# CONFIG_MCA is not set -+CONFIG_UID16=y -+CONFIG_RWSEM_GENERIC_SPINLOCK=y -+# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set -+# CONFIG_GENERIC_BUST_SPINLOCK is not set -+# CONFIG_GENERIC_ISA_DMA is not set -+ -+# -+# Code maturity level options -+# -+CONFIG_EXPERIMENTAL=y -+# CONFIG_OBSOLETE is not set -+ -+# -+# Loadable module support -+# -+CONFIG_MODULES=y -+# CONFIG_MODVERSIONS is not set -+CONFIG_KMOD=y -+ -+# -+# System Type -+# -+# CONFIG_ARCH_ANAKIN is not set -+# CONFIG_ARCH_ARCA5K is not set -+# CONFIG_ARCH_CLPS7500 is not set -+# CONFIG_ARCH_CLPS711X is not set -+# CONFIG_ARCH_CO285 is not set -+CONFIG_ARCH_PXA=y -+# CONFIG_ARCH_EBSA110 is not set -+# CONFIG_ARCH_CAMELOT is not set -+# CONFIG_ARCH_FOOTBRIDGE is not set -+# CONFIG_ARCH_INTEGRATOR is not set -+# CONFIG_ARCH_OMAHA is not set -+# CONFIG_ARCH_L7200 is not set -+# CONFIG_ARCH_MX1ADS is not set -+# CONFIG_ARCH_RPC is not set -+# CONFIG_ARCH_RISCSTATION is not set -+# CONFIG_ARCH_SA1100 is not set -+# CONFIG_ARCH_SHARK is not set -+ -+# -+# Archimedes/A5000 Implementations -+# -+# CONFIG_ARCH_ARC is not set -+# CONFIG_ARCH_A5K is not set -+ -+# -+# Footbridge Implementations -+# -+# CONFIG_ARCH_CATS is not set -+# CONFIG_ARCH_PERSONAL_SERVER is not set -+# CONFIG_ARCH_EBSA285_ADDIN is not set -+# CONFIG_ARCH_EBSA285_HOST is not set -+# CONFIG_ARCH_NETWINDER is not set -+ -+# -+# SA11x0 Implementations -+# -+# CONFIG_SA1100_ACCELENT is not set -+# CONFIG_SA1100_ASSABET is not set -+# CONFIG_ASSABET_NEPONSET is not set -+# CONFIG_SA1100_ADSBITSY is not set -+# CONFIG_SA1100_BRUTUS is not set -+# CONFIG_SA1100_CEP is not set -+# CONFIG_SA1100_CERF is not set -+# CONFIG_SA1100_H3100 is not set -+# CONFIG_SA1100_H3600 is not set -+# CONFIG_SA1100_H3800 is not set -+# CONFIG_SA1100_H3XXX is not set -+# CONFIG_SA1100_EXTENEX1 is not set -+# CONFIG_SA1100_FLEXANET is not set -+# CONFIG_SA1100_FREEBIRD is not set -+# CONFIG_SA1100_FRODO is not set -+# CONFIG_SA1100_GRAPHICSCLIENT is not set -+# CONFIG_SA1100_GRAPHICSMASTER is not set -+# CONFIG_SA1100_BADGE4 is not set -+# CONFIG_SA1100_JORNADA720 is not set -+# CONFIG_SA1100_HUW_WEBPANEL is not set -+# CONFIG_SA1100_ITSY is not set -+# CONFIG_SA1100_LART is not set -+# CONFIG_SA1100_NANOENGINE is not set -+# CONFIG_SA1100_OMNIMETER is not set -+# CONFIG_SA1100_PANGOLIN is not set -+# CONFIG_SA1100_PLEB is not set -+# CONFIG_SA1100_PT_SYSTEM3 is not set -+# CONFIG_SA1100_SHANNON is not set -+# CONFIG_SA1100_SHERMAN is not set -+# CONFIG_SA1100_SIMPAD is not set -+# CONFIG_SA1100_SIMPUTER is not set -+# CONFIG_SA1100_PFS168 is not set -+# CONFIG_SA1100_VICTOR is not set -+# CONFIG_SA1100_XP860 is not set -+# CONFIG_SA1100_YOPY is not set -+# CONFIG_SA1100_USB is not set -+# CONFIG_SA1100_USB_NETLINK is not set -+# CONFIG_SA1100_USB_CHAR is not set -+# CONFIG_H3600_SLEEVE is not set -+ -+# -+# Intel PXA250/210 Implementations -+# -+# CONFIG_ARCH_LUBBOCK is not set -+# CONFIG_ARCH_PXA_IDP is not set -+# CONFIG_ARCH_PXA_CERF is not set -+CONFIG_ARCH_TRIZEPS2=y -+CONFIG_TRIZEPS2=y -+CONFIG_PXA_USB=y -+# CONFIG_PXA_USB_NETLINK is not set -+# CONFIG_PXA_USB_CHAR is not set -+ -+# -+# CLPS711X/EP721X Implementations -+# -+# CONFIG_ARCH_AUTCPU12 is not set -+# CONFIG_ARCH_CDB89712 is not set -+# CONFIG_ARCH_CLEP7312 is not set -+# CONFIG_ARCH_EDB7211 is not set -+# CONFIG_ARCH_P720T is not set -+# CONFIG_ARCH_FORTUNET is not set -+# CONFIG_ARCH_EP7211 is not set -+# CONFIG_ARCH_EP7212 is not set -+# CONFIG_ARCH_ACORN is not set -+# CONFIG_FOOTBRIDGE is not set -+# CONFIG_FOOTBRIDGE_HOST is not set -+# CONFIG_FOOTBRIDGE_ADDIN is not set -+CONFIG_CPU_32=y -+# CONFIG_CPU_26 is not set -+# CONFIG_CPU_ARM610 is not set -+# CONFIG_CPU_ARM710 is not set -+# CONFIG_CPU_ARM720T is not set -+# CONFIG_CPU_ARM920T is not set -+# CONFIG_CPU_ARM922T is not set -+# CONFIG_PLD is not set -+# CONFIG_CPU_ARM926T is not set -+# CONFIG_CPU_ARM1020 is not set -+# CONFIG_CPU_ARM1026 is not set -+# CONFIG_CPU_SA110 is not set -+# CONFIG_CPU_SA1100 is not set -+CONFIG_CPU_32v5=y -+CONFIG_CPU_XSCALE=y -+# CONFIG_XSCALE_CACHE_ERRATA is not set -+# CONFIG_CPU_32v3 is not set -+# CONFIG_CPU_32v4 is not set -+# CONFIG_DISCONTIGMEM is not set -+ -+# -+# General setup -+# -+# CONFIG_PCI is not set -+# CONFIG_ISA is not set -+# CONFIG_ISA_DMA is not set -+# CONFIG_ZBOOT_ROM is not set -+CONFIG_ZBOOT_ROM_TEXT=0 -+CONFIG_ZBOOT_ROM_BSS=0 -+CONFIG_HOTPLUG=y -+ -+# -+# PCMCIA/CardBus support -+# -+CONFIG_PCMCIA=y -+# CONFIG_I82092 is not set -+# CONFIG_I82365 is not set -+# CONFIG_TCIC is not set -+# CONFIG_PCMCIA_CLPS6700 is not set -+# CONFIG_PCMCIA_SA1100 is not set -+CONFIG_PCMCIA_PXA=y -+CONFIG_NET=y -+CONFIG_SYSVIPC=y -+# CONFIG_BSD_PROCESS_ACCT is not set -+CONFIG_SYSCTL=y -+CONFIG_FPE_NWFPE=y -+# CONFIG_FPE_FASTFPE is not set -+CONFIG_KCORE_ELF=y -+# CONFIG_KCORE_AOUT is not set -+# CONFIG_BINFMT_AOUT is not set -+CONFIG_BINFMT_ELF=y -+# CONFIG_BINFMT_MISC is not set -+# CONFIG_PM is not set -+# CONFIG_ARTHUR is not set -+CONFIG_CMDLINE="root=/dev/mtdblock3 rw console=ttyS0,38400 mem=32M noinitrd init=/linuxrc" -+CONFIG_ALIGNMENT_TRAP=y -+ -+# -+# Parallel port support -+# -+# CONFIG_PARPORT is not set -+ -+# -+# Memory Technology Devices (MTD) -+# -+CONFIG_MTD=y -+# CONFIG_MTD_DEBUG is not set -+CONFIG_MTD_PARTITIONS=y -+# CONFIG_MTD_CONCAT is not set -+CONFIG_MTD_REDBOOT_PARTS=y -+CONFIG_MTD_CMDLINE_PARTS=y -+# CONFIG_MTD_AFS_PARTS is not set -+CONFIG_MTD_CHAR=y -+CONFIG_MTD_BLOCK=y -+# CONFIG_FTL is not set -+# CONFIG_NFTL is not set -+ -+# -+# RAM/ROM/Flash chip drivers -+# -+CONFIG_MTD_CFI=y -+# CONFIG_MTD_JEDECPROBE is not set -+CONFIG_MTD_GEN_PROBE=y -+# CONFIG_MTD_CFI_ADV_OPTIONS is not set -+CONFIG_MTD_CFI_INTELEXT=y -+# CONFIG_MTD_CFI_AMDSTD is not set -+# CONFIG_MTD_RAM is not set -+# CONFIG_MTD_ROM is not set -+# CONFIG_MTD_ABSENT is not set -+# CONFIG_MTD_OBSOLETE_CHIPS is not set -+# CONFIG_MTD_AMDSTD is not set -+# CONFIG_MTD_SHARP is not set -+# CONFIG_MTD_JEDEC is not set -+ -+# -+# Mapping drivers for chip access -+# -+# CONFIG_MTD_PHYSMAP is not set -+# CONFIG_MTD_LUBBOCK is not set -+# CONFIG_MTD_NORA is not set -+# CONFIG_MTD_ARM_INTEGRATOR is not set -+# CONFIG_MTD_CDB89712 is not set -+# CONFIG_MTD_SA1100 is not set -+# CONFIG_MTD_DC21285 is not set -+# CONFIG_MTD_IQ80310 is not set -+# CONFIG_MTD_FORTUNET is not set -+# CONFIG_MTD_PXA_CERF is not set -+# CONFIG_MTD_EPXA10DB is not set -+# CONFIG_MTD_AUTCPU12 is not set -+# CONFIG_MTD_EDB7312 is not set -+# CONFIG_MTD_IMPA7 is not set -+CONFIG_MTD_TRIZEPS2=y -+# CONFIG_MTD_PCI is not set -+ -+# -+# Self-contained MTD device drivers -+# -+# CONFIG_MTD_PMC551 is not set -+# CONFIG_MTD_SLRAM is not set -+# CONFIG_MTD_MTDRAM is not set -+# CONFIG_MTD_BLKMTD is not set -+# CONFIG_MTD_DOC1000 is not set -+# CONFIG_MTD_DOC2000 is not set -+# CONFIG_MTD_DOC2001 is not set -+# CONFIG_MTD_DOCPROBE is not set -+ -+# -+# NAND Flash Device Drivers -+# -+# CONFIG_MTD_NAND is not set -+ -+# -+# Plug and Play configuration -+# -+# CONFIG_PNP is not set -+# CONFIG_ISAPNP is not set -+ -+# -+# Block devices -+# -+# CONFIG_BLK_DEV_FD is not set -+# CONFIG_BLK_DEV_XD is not set -+# CONFIG_PARIDE is not set -+# CONFIG_BLK_CPQ_DA is not set -+# CONFIG_BLK_CPQ_CISS_DA is not set -+# CONFIG_CISS_SCSI_TAPE is not set -+# CONFIG_BLK_DEV_DAC960 is not set -+# CONFIG_BLK_DEV_UMEM is not set -+CONFIG_BLK_DEV_LOOP=y -+# CONFIG_BLK_DEV_NBD is not set -+# CONFIG_BLK_DEV_RAM is not set -+# CONFIG_BLK_DEV_INITRD is not set -+ -+# -+# Multi-device support (RAID and LVM) -+# -+# CONFIG_MD is not set -+# CONFIG_BLK_DEV_MD is not set -+# CONFIG_MD_LINEAR is not set -+# CONFIG_MD_RAID0 is not set -+# CONFIG_MD_RAID1 is not set -+# CONFIG_MD_RAID5 is not set -+# CONFIG_MD_MULTIPATH is not set -+# CONFIG_BLK_DEV_LVM is not set -+ -+# -+# Networking options -+# -+# CONFIG_PACKET is not set -+# CONFIG_NETLINK_DEV is not set -+# CONFIG_NETFILTER is not set -+# CONFIG_FILTER is not set -+CONFIG_UNIX=y -+CONFIG_INET=y -+# CONFIG_IP_MULTICAST is not set -+# CONFIG_IP_ADVANCED_ROUTER is not set -+CONFIG_IP_PNP=y -+# CONFIG_IP_PNP_DHCP is not set -+CONFIG_IP_PNP_BOOTP=y -+# CONFIG_IP_PNP_RARP is not set -+# CONFIG_NET_IPIP is not set -+# CONFIG_NET_IPGRE is not set -+# CONFIG_ARPD is not set -+# CONFIG_INET_ECN is not set -+# CONFIG_SYN_COOKIES is not set -+# CONFIG_IPV6 is not set -+# CONFIG_KHTTPD is not set -+# CONFIG_ATM is not set -+# CONFIG_VLAN_8021Q is not set -+# CONFIG_IPX is not set -+# CONFIG_ATALK is not set -+ -+# -+# Appletalk devices -+# -+# CONFIG_DEV_APPLETALK is not set -+# CONFIG_DECNET is not set -+# CONFIG_BRIDGE is not set -+# CONFIG_X25 is not set -+# CONFIG_LAPB is not set -+# CONFIG_LLC is not set -+# CONFIG_NET_DIVERT is not set -+# CONFIG_ECONET is not set -+# CONFIG_WAN_ROUTER is not set -+# CONFIG_NET_FASTROUTE is not set -+# CONFIG_NET_HW_FLOWCONTROL is not set -+ -+# -+# QoS and/or fair queueing -+# -+# CONFIG_NET_SCHED is not set -+ -+# -+# Network testing -+# -+# CONFIG_NET_PKTGEN is not set -+ -+# -+# Network device support -+# -+CONFIG_NETDEVICES=y -+ -+# -+# ARCnet devices -+# -+# CONFIG_ARCNET is not set -+# CONFIG_DUMMY is not set -+# CONFIG_BONDING is not set -+# CONFIG_EQUALIZER is not set -+# CONFIG_TUN is not set -+# CONFIG_ETHERTAP is not set -+ -+# -+# Ethernet (10 or 100Mbit) -+# -+CONFIG_NET_ETHERNET=y -+# CONFIG_ARM_AM79C961A is not set -+# CONFIG_ARM_CIRRUS is not set -+# CONFIG_SUNLANCE is not set -+# CONFIG_SUNBMAC is not set -+# CONFIG_SUNQE is not set -+# CONFIG_SUNGEM is not set -+# CONFIG_NET_VENDOR_3COM is not set -+# CONFIG_LANCE is not set -+CONFIG_NET_VENDOR_SMC=y -+# CONFIG_WD80x3 is not set -+# CONFIG_ULTRAMCA is not set -+# CONFIG_ULTRA is not set -+# CONFIG_ULTRA32 is not set -+CONFIG_SMC9194=y -+# CONFIG_NET_VENDOR_RACAL is not set -+# CONFIG_NET_ISA is not set -+# CONFIG_NET_PCI is not set -+# CONFIG_NET_POCKET is not set -+ -+# -+# Ethernet (1000 Mbit) -+# -+# CONFIG_ACENIC is not set -+# CONFIG_DL2K is not set -+# CONFIG_MYRI_SBUS is not set -+# CONFIG_NS83820 is not set -+# CONFIG_HAMACHI is not set -+# CONFIG_YELLOWFIN is not set -+# CONFIG_SK98LIN is not set -+# CONFIG_TIGON3 is not set -+# CONFIG_FDDI is not set -+# CONFIG_HIPPI is not set -+# CONFIG_PLIP is not set -+CONFIG_PPP=m -+# CONFIG_PPP_MULTILINK is not set -+# CONFIG_PPP_FILTER is not set -+CONFIG_PPP_ASYNC=m -+CONFIG_PPP_SYNC_TTY=m -+CONFIG_PPP_DEFLATE=m -+CONFIG_PPP_BSDCOMP=m -+# CONFIG_PPPOE is not set -+# CONFIG_SLIP is not set -+ -+# -+# Wireless LAN (non-hamradio) -+# -+CONFIG_NET_RADIO=y -+# CONFIG_STRIP is not set -+# CONFIG_WAVELAN is not set -+# CONFIG_ARLAN is not set -+# CONFIG_AIRONET4500 is not set -+# CONFIG_AIRONET4500_NONCS is not set -+# CONFIG_AIRONET4500_PROC is not set -+# CONFIG_HERMES is not set -+# CONFIG_PCMCIA_HERMES is not set -+CONFIG_AIRO_CS=m -+CONFIG_NET_WIRELESS=y -+ -+# -+# Token Ring devices -+# -+# CONFIG_TR is not set -+# CONFIG_NET_FC is not set -+# CONFIG_RCPCI is not set -+# CONFIG_SHAPER is not set -+ -+# -+# Wan interfaces -+# -+# CONFIG_WAN is not set -+ -+# -+# PCMCIA network device support -+# -+CONFIG_NET_PCMCIA=y -+# CONFIG_PCMCIA_3C589 is not set -+CONFIG_PCMCIA_3C574=m -+# CONFIG_PCMCIA_FMVJ18X is not set -+# CONFIG_PCMCIA_PCNET is not set -+# CONFIG_PCMCIA_AXNET is not set -+# CONFIG_PCMCIA_NMCLAN is not set -+# CONFIG_PCMCIA_SMC91C92 is not set -+# CONFIG_PCMCIA_XIRC2PS is not set -+# CONFIG_ARCNET_COM20020_CS is not set -+# CONFIG_PCMCIA_IBMTR is not set -+CONFIG_NET_PCMCIA_RADIO=y -+# CONFIG_PCMCIA_RAYCS is not set -+# CONFIG_PCMCIA_NETWAVE is not set -+# CONFIG_PCMCIA_WAVELAN is not set -+# CONFIG_AIRONET4500_CS is not set -+ -+# -+# Amateur Radio support -+# -+# CONFIG_HAMRADIO is not set -+ -+# -+# IrDA (infrared) support -+# -+# CONFIG_IRDA is not set -+ -+# -+# ATA/ATAPI/MFM/RLL support -+# -+CONFIG_IDE=m -+ -+# -+# IDE, ATA and ATAPI Block devices -+# -+CONFIG_BLK_DEV_IDE=m -+# CONFIG_BLK_DEV_HD_IDE is not set -+# CONFIG_BLK_DEV_HD is not set -+CONFIG_BLK_DEV_IDEDISK=m -+# CONFIG_IDEDISK_MULTI_MODE is not set -+# CONFIG_IDEDISK_STROKE is not set -+# CONFIG_BLK_DEV_IDEDISK_VENDOR is not set -+# CONFIG_BLK_DEV_IDEDISK_FUJITSU is not set -+# CONFIG_BLK_DEV_IDEDISK_IBM is not set -+# CONFIG_BLK_DEV_IDEDISK_MAXTOR is not set -+# CONFIG_BLK_DEV_IDEDISK_QUANTUM is not set -+# CONFIG_BLK_DEV_IDEDISK_SEAGATE is not set -+# CONFIG_BLK_DEV_IDEDISK_WD is not set -+# CONFIG_BLK_DEV_COMMERIAL is not set -+# CONFIG_BLK_DEV_TIVO is not set -+CONFIG_BLK_DEV_IDECS=m -+# CONFIG_BLK_DEV_IDECD is not set -+# CONFIG_BLK_DEV_IDETAPE is not set -+# CONFIG_BLK_DEV_IDEFLOPPY is not set -+# CONFIG_BLK_DEV_IDESCSI is not set -+# CONFIG_IDE_TASK_IOCTL is not set -+# CONFIG_BLK_DEV_CMD640 is not set -+# CONFIG_BLK_DEV_CMD640_ENHANCED is not set -+# CONFIG_BLK_DEV_ISAPNP is not set -+# CONFIG_IDE_CHIPSETS is not set -+# CONFIG_IDEDMA_AUTO is not set -+# CONFIG_DMA_NONPCI is not set -+# CONFIG_BLK_DEV_IDE_MODES is not set -+# CONFIG_BLK_DEV_ATARAID is not set -+# CONFIG_BLK_DEV_ATARAID_PDC is not set -+# CONFIG_BLK_DEV_ATARAID_HPT is not set -+ -+# -+# SCSI support -+# -+# CONFIG_SCSI is not set -+ -+# -+# I2O device support -+# -+# CONFIG_I2O is not set -+# CONFIG_I2O_BLOCK is not set -+# CONFIG_I2O_LAN is not set -+# CONFIG_I2O_SCSI is not set -+# CONFIG_I2O_PROC is not set -+ -+# -+# ISDN subsystem -+# -+# CONFIG_ISDN is not set -+ -+# -+# Input core support -+# -+# CONFIG_INPUT is not set -+# CONFIG_INPUT_KEYBDEV is not set -+# CONFIG_INPUT_MOUSEDEV is not set -+# CONFIG_INPUT_JOYDEV is not set -+# CONFIG_INPUT_EVDEV is not set -+ -+# -+# Character devices -+# -+CONFIG_VT=y -+# CONFIG_VT_CONSOLE is not set -+CONFIG_SERIAL=y -+CONFIG_SERIAL_CONSOLE=y -+# CONFIG_SERIAL_EXTENDED is not set -+# CONFIG_SERIAL_NONSTANDARD is not set -+ -+# -+# Serial drivers -+# -+# CONFIG_SERIAL_ANAKIN is not set -+# CONFIG_SERIAL_ANAKIN_CONSOLE is not set -+# CONFIG_SERIAL_AMBA is not set -+# CONFIG_SERIAL_AMBA_CONSOLE is not set -+# CONFIG_SERIAL_CLPS711X is not set -+# CONFIG_SERIAL_CLPS711X_CONSOLE is not set -+# CONFIG_SERIAL_21285 is not set -+# CONFIG_SERIAL_21285_OLD is not set -+# CONFIG_SERIAL_21285_CONSOLE is not set -+# CONFIG_SERIAL_UART00 is not set -+# CONFIG_SERIAL_UART00_CONSOLE is not set -+# CONFIG_SERIAL_SA1100 is not set -+# CONFIG_SERIAL_SA1100_CONSOLE is not set -+# CONFIG_SERIAL_OMAHA is not set -+# CONFIG_SERIAL_OMAHA_CONSOLE is not set -+# CONFIG_SERIAL_8250 is not set -+# CONFIG_SERIAL_8250_CONSOLE is not set -+# CONFIG_SERIAL_8250_EXTENDED is not set -+# CONFIG_SERIAL_8250_MANY_PORTS is not set -+# CONFIG_SERIAL_8250_SHARE_IRQ is not set -+# CONFIG_SERIAL_8250_DETECT_IRQ is not set -+# CONFIG_SERIAL_8250_MULTIPORT is not set -+# CONFIG_SERIAL_8250_HUB6 is not set -+CONFIG_UNIX98_PTYS=y -+CONFIG_UNIX98_PTY_COUNT=256 -+ -+# -+# I2C support -+# -+CONFIG_I2C=y -+# CONFIG_I2C_ALGOBIT is not set -+# CONFIG_I2C_ALGOPCF is not set -+CONFIG_I2C_PXA_ALGO=y -+CONFIG_I2C_PXA_ADAP=y -+CONFIG_I2C_CHARDEV=y -+CONFIG_I2C_PROC=y -+# CONFIG_I2C_DS1307 is not set -+ -+# -+# L3 serial bus support -+# -+# CONFIG_L3 is not set -+# CONFIG_L3_ALGOBIT is not set -+# CONFIG_L3_BIT_SA1100_GPIO is not set -+# CONFIG_L3_SA1111 is not set -+# CONFIG_BIT_SA1100_GPIO is not set -+ -+# -+# Mice -+# -+# CONFIG_BUSMOUSE is not set -+# CONFIG_MOUSE is not set -+ -+# -+# Joysticks -+# -+# CONFIG_INPUT_GAMEPORT is not set -+# CONFIG_QIC02_TAPE is not set -+ -+# -+# Watchdog Cards -+# -+# CONFIG_WATCHDOG is not set -+# CONFIG_NVRAM is not set -+# CONFIG_RTC is not set -+CONFIG_PXA_RTC=y -+# CONFIG_DTLK is not set -+# CONFIG_R3964 is not set -+# CONFIG_APPLICOM is not set -+ -+# -+# Ftape, the floppy tape device driver -+# -+# CONFIG_FTAPE is not set -+# CONFIG_AGP is not set -+# CONFIG_DRM is not set -+ -+# -+# PCMCIA character devices -+# -+# CONFIG_PCMCIA_SERIAL_CS is not set -+CONFIG_TRIZEPS2_TTLIO=m -+ -+# -+# Multimedia devices -+# -+# CONFIG_VIDEO_DEV is not set -+ -+# -+# File systems -+# -+# CONFIG_QUOTA is not set -+# CONFIG_AUTOFS_FS is not set -+# CONFIG_AUTOFS4_FS is not set -+# CONFIG_REISERFS_FS is not set -+# CONFIG_REISERFS_CHECK is not set -+# CONFIG_REISERFS_PROC_INFO is not set -+# CONFIG_ADFS_FS is not set -+# CONFIG_ADFS_FS_RW is not set -+# CONFIG_AFFS_FS is not set -+# CONFIG_HFS_FS is not set -+# CONFIG_BFS_FS is not set -+CONFIG_EXT3_FS=y -+CONFIG_JBD=y -+# CONFIG_JBD_DEBUG is not set -+CONFIG_FAT_FS=m -+CONFIG_MSDOS_FS=m -+# CONFIG_UMSDOS_FS is not set -+CONFIG_VFAT_FS=m -+# CONFIG_EFS_FS is not set -+# CONFIG_JFFS_FS is not set -+CONFIG_JFFS2_FS=y -+CONFIG_JFFS2_FS_DEBUG=0 -+# CONFIG_CRAMFS is not set -+CONFIG_TMPFS=y -+CONFIG_RAMFS=y -+# CONFIG_ISO9660_FS is not set -+# CONFIG_JOLIET is not set -+# CONFIG_ZISOFS is not set -+# CONFIG_MINIX_FS is not set -+# CONFIG_VXFS_FS is not set -+# CONFIG_NTFS_FS is not set -+# CONFIG_NTFS_RW is not set -+# CONFIG_HPFS_FS is not set -+CONFIG_PROC_FS=y -+# CONFIG_DEVFS_FS is not set -+# CONFIG_DEVFS_MOUNT is not set -+# CONFIG_DEVFS_DEBUG is not set -+CONFIG_DEVPTS_FS=y -+# CONFIG_QNX4FS_FS is not set -+# CONFIG_QNX4FS_RW is not set -+# CONFIG_ROMFS_FS is not set -+CONFIG_EXT2_FS=y -+# CONFIG_SYSV_FS is not set -+# CONFIG_UDF_FS is not set -+# CONFIG_UDF_RW is not set -+# CONFIG_UFS_FS is not set -+# CONFIG_UFS_FS_WRITE is not set -+ -+# -+# Network File Systems -+# -+# CONFIG_CODA_FS is not set -+# CONFIG_INTERMEZZO_FS is not set -+CONFIG_NFS_FS=m -+# CONFIG_NFS_V3 is not set -+# CONFIG_ROOT_NFS is not set -+# CONFIG_NFSD is not set -+# CONFIG_NFSD_V3 is not set -+CONFIG_SUNRPC=m -+CONFIG_LOCKD=m -+# CONFIG_SMB_FS is not set -+# CONFIG_NCP_FS is not set -+# CONFIG_NCPFS_PACKET_SIGNING is not set -+# CONFIG_NCPFS_IOCTL_LOCKING is not set -+# CONFIG_NCPFS_STRONG is not set -+# CONFIG_NCPFS_NFS_NS is not set -+# CONFIG_NCPFS_OS2_NS is not set -+# CONFIG_NCPFS_SMALLDOS is not set -+# CONFIG_NCPFS_NLS is not set -+# CONFIG_NCPFS_EXTRAS is not set -+# CONFIG_ZISOFS_FS is not set -+# CONFIG_ZLIB_FS_INFLATE is not set -+ -+# -+# Partition Types -+# -+# CONFIG_PARTITION_ADVANCED is not set -+CONFIG_MSDOS_PARTITION=y -+# CONFIG_SMB_NLS is not set -+CONFIG_NLS=y -+ -+# -+# Native Language Support -+# -+CONFIG_NLS_DEFAULT="iso8859-1" -+# CONFIG_NLS_CODEPAGE_437 is not set -+# CONFIG_NLS_CODEPAGE_737 is not set -+# CONFIG_NLS_CODEPAGE_775 is not set -+# CONFIG_NLS_CODEPAGE_850 is not set -+# CONFIG_NLS_CODEPAGE_852 is not set -+# CONFIG_NLS_CODEPAGE_855 is not set -+# CONFIG_NLS_CODEPAGE_857 is not set -+# CONFIG_NLS_CODEPAGE_860 is not set -+# CONFIG_NLS_CODEPAGE_861 is not set -+# CONFIG_NLS_CODEPAGE_862 is not set -+# CONFIG_NLS_CODEPAGE_863 is not set -+# CONFIG_NLS_CODEPAGE_864 is not set -+# CONFIG_NLS_CODEPAGE_865 is not set -+# CONFIG_NLS_CODEPAGE_866 is not set -+# CONFIG_NLS_CODEPAGE_869 is not set -+# CONFIG_NLS_CODEPAGE_936 is not set -+# CONFIG_NLS_CODEPAGE_950 is not set -+# CONFIG_NLS_CODEPAGE_932 is not set -+# CONFIG_NLS_CODEPAGE_949 is not set -+# CONFIG_NLS_CODEPAGE_874 is not set -+# CONFIG_NLS_ISO8859_8 is not set -+# CONFIG_NLS_CODEPAGE_1250 is not set -+# CONFIG_NLS_CODEPAGE_1251 is not set -+CONFIG_NLS_ISO8859_1=y -+# CONFIG_NLS_ISO8859_2 is not set -+# CONFIG_NLS_ISO8859_3 is not set -+# CONFIG_NLS_ISO8859_4 is not set -+# CONFIG_NLS_ISO8859_5 is not set -+# CONFIG_NLS_ISO8859_6 is not set -+# CONFIG_NLS_ISO8859_7 is not set -+# CONFIG_NLS_ISO8859_9 is not set -+# CONFIG_NLS_ISO8859_13 is not set -+# CONFIG_NLS_ISO8859_14 is not set -+# CONFIG_NLS_ISO8859_15 is not set -+# CONFIG_NLS_KOI8_R is not set -+# CONFIG_NLS_KOI8_U is not set -+# CONFIG_NLS_UTF8 is not set -+ -+# -+# Console drivers -+# -+CONFIG_PC_KEYMAP=y -+# CONFIG_VGA_CONSOLE is not set -+ -+# -+# Frame-buffer support -+# -+CONFIG_FB=y -+CONFIG_DUMMY_CONSOLE=y -+# CONFIG_FB_ACORN is not set -+# CONFIG_FB_ANAKIN is not set -+# CONFIG_FB_CLPS711X is not set -+# CONFIG_FB_SA1100 is not set -+CONFIG_FB_PXA=y -+# CONFIG_FB_CYBER2000 is not set -+# CONFIG_FB_VIRTUAL is not set -+CONFIG_FBCON_ADVANCED=y -+# CONFIG_FBCON_MFB is not set -+# CONFIG_FBCON_CFB2 is not set -+# CONFIG_FBCON_CFB4 is not set -+# CONFIG_FBCON_CFB8 is not set -+CONFIG_FBCON_CFB16=y -+# CONFIG_FBCON_CFB24 is not set -+# CONFIG_FBCON_CFB32 is not set -+# CONFIG_FBCON_AFB is not set -+# CONFIG_FBCON_ILBM is not set -+# CONFIG_FBCON_IPLAN2P2 is not set -+# CONFIG_FBCON_IPLAN2P4 is not set -+# CONFIG_FBCON_IPLAN2P8 is not set -+# CONFIG_FBCON_MAC is not set -+# CONFIG_FBCON_VGA_PLANES is not set -+# CONFIG_FBCON_VGA is not set -+# CONFIG_FBCON_HGA is not set -+CONFIG_FBCON_FONTWIDTH8_ONLY=y -+CONFIG_FBCON_FONTS=y -+# CONFIG_FONT_8x8 is not set -+# CONFIG_FONT_8x16 is not set -+# CONFIG_FONT_SUN8x16 is not set -+# CONFIG_FONT_PEARL_8x8 is not set -+CONFIG_FONT_ACORN_8x8=y -+ -+# -+# Sound -+# -+CONFIG_SOUND=y -+# CONFIG_SOUND_BT878 is not set -+# CONFIG_SOUND_CMPCI is not set -+# CONFIG_SOUND_EMU10K1 is not set -+# CONFIG_MIDI_EMU10K1 is not set -+# CONFIG_SOUND_FUSION is not set -+# CONFIG_SOUND_CS4281 is not set -+# CONFIG_SOUND_ES1370 is not set -+# CONFIG_SOUND_ES1371 is not set -+# CONFIG_SOUND_ESSSOLO1 is not set -+# CONFIG_SOUND_MAESTRO is not set -+# CONFIG_SOUND_MAESTRO3 is not set -+# CONFIG_SOUND_ICH is not set -+# CONFIG_SOUND_RME96XX is not set -+# CONFIG_SOUND_SONICVIBES is not set -+# CONFIG_SOUND_TRIDENT is not set -+# CONFIG_SOUND_MSNDCLAS is not set -+# CONFIG_SOUND_MSNDPIN is not set -+# CONFIG_SOUND_VIA82CXXX is not set -+# CONFIG_MIDI_VIA82CXXX is not set -+# CONFIG_SOUND_OSS is not set -+# CONFIG_SOUND_WAVEARTIST is not set -+CONFIG_SOUND_PXA_AC97=y -+# CONFIG_SOUND_TVMIXER is not set -+ -+# -+# Multimedia Capabilities Port drivers -+# -+CONFIG_MCP=y -+# CONFIG_MCP_SA1100 is not set -+# CONFIG_MCP_UCB1200 is not set -+# CONFIG_MCP_UCB1200_AUDIO is not set -+# CONFIG_MCP_UCB1200_TS is not set -+CONFIG_MCP_UCB1400_TS=y -+CONFIG_MCP_UCB1X00_TS_COMPAT=y -+ -+# -+# USB support -+# -+# CONFIG_USB is not set -+ -+# -+# Bluetooth support -+# -+# CONFIG_BLUEZ is not set -+ -+# -+# Kernel hacking -+# -+CONFIG_FRAME_POINTER=y -+CONFIG_DEBUG_USER=y -+CONFIG_DEBUG_INFO=y -+# CONFIG_NO_PGT_CACHE is not set -+CONFIG_DEBUG_KERNEL=y -+# CONFIG_DEBUG_SLAB is not set -+CONFIG_MAGIC_SYSRQ=y -+# CONFIG_DEBUG_SPINLOCK is not set -+# CONFIG_DEBUG_WAITQ is not set -+CONFIG_DEBUG_BUGVERBOSE=y -+CONFIG_DEBUG_ERRORS=y -+CONFIG_DEBUG_LL=y -+# CONFIG_DEBUG_DC21285_PORT is not set -+# CONFIG_DEBUG_CLPS711X_UART2 is not set ---- linux-2.4.25/arch/arm/kernel/Makefile~2.4.25-vrs2-pxa1.patch 2003-08-25 13:44:39.000000000 +0200 -+++ linux-2.4.25/arch/arm/kernel/Makefile 2004-03-31 17:15:11.000000000 +0200 -@@ -10,7 +10,7 @@ - HEAD_OBJ = head-$(PROCESSOR).o - ENTRY_OBJ = entry-$(PROCESSOR).o - --AFLAGS_head-armv.o := -DTEXTADDR=$(TEXTADDR) -+AFLAGS_head-armv.o := -DTEXTADDR=$(TEXTADDR) -DDATAADDR=$(DATAADDR) - AFLAGS_head-armo.o := -DTEXTADDR=$(TEXTADDR) - - # This is depreciated. -@@ -45,7 +45,7 @@ - $(CONFIG_FOOTBRIDGE) $(CONFIG_ARCH_EBSA110) \ - $(CONFIG_ARCH_SA1100) $(CONFIG_ARCH_CAMELOT) \ - $(CONFIG_ARCH_MX1ADS) $(CONFIG_ARCH_OMAHA) \ -- $(CONFIG_ARCH_AT91RM9200) -+ $(CONFIG_ARCH_AT91RM9200) $(CONFIG_ARCH_PXA) - - ifneq ($(findstring y,$(no-irq-arch)),y) - obj-y += irq-arch.o ---- linux-2.4.25/arch/arm/kernel/debug-armv.S~2.4.25-vrs2-pxa1.patch 2003-08-25 13:44:39.000000000 +0200 -+++ linux-2.4.25/arch/arm/kernel/debug-armv.S 2004-03-31 17:15:11.000000000 +0200 -@@ -221,6 +221,31 @@ - bne 1001b - .endm - -+#elif defined(CONFIG_ARCH_PXA) -+ -+ .macro addruart,rx -+ mrc p15, 0, \rx, c1, c0 -+ tst \rx, #1 @ MMU enabled? -+ moveq \rx, #0x40000000 @ physical -+ movne \rx, #io_p2v(0x40000000) @ virtual -+ orr \rx, \rx, #0x00100000 @ FFUART -+ .endm -+ -+ .macro senduart,rd,rx -+ str \rd, [\rx, #0] -+ .endm -+ -+ .macro busyuart,rd,rx -+1002: ldr \rd, [\rx, #0x14] -+ tst \rd, #(1 << 6) -+ beq 1002b -+ .endm -+ -+ .macro waituart,rd,rx -+1001: ldr \rd, [\rx, #0x14] -+ tst \rd, #(1 << 5) -+ beq 1001b -+ .endm - #elif defined(CONFIG_ARCH_CLPS7500) - .macro addruart,rx - mov \rx, #0xe0000000 ---- linux-2.4.25/arch/arm/kernel/entry-armv.S~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:08.000000000 +0200 -+++ linux-2.4.25/arch/arm/kernel/entry-armv.S 2004-03-31 17:15:11.000000000 +0200 -@@ -615,6 +615,27 @@ - .text - .endm - -+#elif CONFIG_ARCH_PXA -+ -+ .macro disable_fiq -+ .endm -+ -+ .macro get_irqnr_and_base, irqnr, irqstat, base, tmp -+ mov \base, #io_p2v(0x40000000) @ IIR Ctl = 0x40d00000 -+ add \base, \base, #0x00d00000 -+ ldr \irqstat, [\base, #0] @ ICIP -+ ldr \irqnr, [\base, #4] @ ICMR -+ ands \irqstat, \irqstat, \irqnr -+ beq 1001f -+ rsb \irqnr, \irqstat, #0 -+ and \irqstat, \irqstat, \irqnr -+ clz \irqnr, \irqstat -+ rsb \irqnr, \irqnr, #(31 - PXA_IRQ_SKIP) -+1001: -+ .endm -+ -+ .macro irq_prio_table -+ .endm - #else - #error Unknown architecture - #endif -@@ -891,9 +912,17 @@ - stmfd sp!, {r4 - sl, fp, lr} @ Store most regs on stack - mrs ip, cpsr - str ip, [sp, #-4]! @ Save cpsr_SVC -+#ifdef CONFIG_CPU_XSCALE -+ mra r4, r5, acc0 -+ stmfd sp!, {r4, r5} -+#endif - str sp, [r0, #TSS_SAVE] @ Save sp_SVC - ldr sp, [r1, #TSS_SAVE] @ Get saved sp_SVC - ldr r2, [r1, #TSS_DOMAIN] -+#ifdef CONFIG_CPU_XSCALE -+ ldmfd sp!, {r4, r5} -+ mar acc0, r4, r5 -+#endif - ldr ip, [sp], #4 - mcr p15, 0, r2, c3, c0 @ Set domain register - msr spsr, ip @ Save tasks CPSR into SPSR for this return ---- linux-2.4.25/arch/arm/kernel/head-armv.S~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:08.000000000 +0200 -+++ linux-2.4.25/arch/arm/kernel/head-armv.S 2004-03-31 17:15:11.000000000 +0200 -@@ -30,6 +30,7 @@ - * - * swapper_pg_dir, pgtbl and krnladr are all closely related. - */ -+#ifndef CONFIG_XIP_KERNEL - #if (TEXTADDR & 0xffff) != 0x8000 - #error TEXTADDR must start at 0xXXXX8000 - #endif -@@ -41,6 +42,26 @@ - adr \reg, stext - sub \reg, \reg, #0x4000 - .endm -+#else -+#if (DATAADDR & 0xffff) != 0x8000 -+#error DATAADDR must start at 0xXXXX8000 -+#endif -+ -+#define PAGE_OFFSET 0xc0000000 -+#ifdef CONFIG_ARCH_LUBBOCK -+#define PHYS_OFFSET 0xa0000000 -+#elif CONFIG_ARCH_OMAP -+#define PHYS_OFFSET 0x10000000 -+#endif -+ -+ .globl SYMBOL_NAME(swapper_pg_dir) -+ .equ SYMBOL_NAME(swapper_pg_dir), DATAADDR - 0x4000 -+ -+ .macro pgtbl, reg, rambase -+ ldr \reg, PGTBL -+ add \reg, \reg, #PHYS_OFFSET - PAGE_OFFSET -+ .endm -+#endif - - /* - * Since the page table is closely related to the kernel start address, we -@@ -131,6 +152,32 @@ - mov r1, #MACH_TYPE_L7200 - #endif - -+#ifdef CONFIG_XIP_KERNEL -+ -+#if defined(CONFIG_ARCH_LUBBOCK) -+ mov r1, #MACH_TYPE_LUBBOCK -+#endif -+ -+ @ Data cache might be active. -+ @ Be sure to flush kernel binary out of the cache, -+ @ whatever state it is, before it is turned off. -+ @ This is done by fetching through currently executed -+ @ memory to be sure we hit the same cache. -+ bic r2, pc, #0x1f -+ add r3, r2, #0x10000 @ 64 kb is quite enough... -+1: ldr r0, [r2], #32 -+ teq r2, r3 -+ bne 1b -+ mcr p15, 0, r0, c7, c10, 4 @ drain WB -+ mcr p15, 0, r0, c7, c7, 0 @ flush I & D caches -+ -+ @ disabling MMU and caches -+ mrc p15, 0, r0, c1, c0, 0 @ read control reg -+ bic r0, r0, #0x05 @ clear DC, MMU -+ bic r0, r0, #0x1000 @ clear Icache -+ mcr p15, 0, r0, c1, c0, 0 -+#endif -+ - mov r0, #F_BIT | I_BIT | MODE_SVC @ make sure svc mode - msr cpsr_c, r0 @ and all irqs disabled - bl __lookup_processor_type -@@ -179,6 +226,17 @@ - */ - .align 5 - __mmap_switched: -+#ifdef CONFIG_XIP_KERNEL -+ ldr r3, ETEXT @ data section copy -+ ldr r4, SDATA -+ ldr r5, EDATA -+1: -+ ldr r6, [r3], #4 -+ str r6, [r4], #4 -+ cmp r4, r5 -+ blo 1b -+#endif -+ - adr r3, __switch_data + 4 - ldmia r3, {r4, r5, r6, r7, r8, sp}@ r2 = compat - @ sp = stack pointer -@@ -233,6 +291,8 @@ - teq r0, r2 - bne 1b - -+#ifndef CONFIG_XIP_KERNEL -+ - /* - * Create identity mapping for first MB of kernel to - * cater for the MMU enable. This identity mapping -@@ -271,6 +331,43 @@ - add r3, r8, r2 @ flags + rambase - str r3, [r0] - -+#else /* CONFIG_XIP_KERNEL */ -+ -+ mov r3, pc, lsr #20 -+ mov r3, r3, lsl #20 @ phys kernel start -+ -+ add r0, r4, r3, lsr #18 -+ orr r3, r3, r8 -+ str r3, [r0] -+ -+ mov r0, #TEXTADDR & 0xff000000 -+ add r0, r0, #TEXTADDR & 0x00f00000 @ virt kernel start -+ add r0, r4, r0, lsr #18 -+ add r2, r3, #4 << 20 @ kernel + 4MB -+ -+1: -+ str r3, [r0], #4 -+ add r3, r3, #1 << 20 -+ cmp r3, r2 -+ bne 1b -+ -+ bic r3, r4, #0x000ff000 @ ram start -+ add r0, r4, r3, lsr #18 -+ orr r3, r3, r8 -+ str r3, [r0], #4 -+ -+ add r0, r3, #PAGE_OFFSET - PHYS_OFFSET -+ add r0, r4, r0, lsr #18 -+ add r2, r3, #4 << 20 @ ram + 4MB -+ -+1: -+ str r3, [r0], #4 -+ add r3, r3, #1 << 20 -+ cmp r3, r2 -+ bne 1b -+ -+#endif /* CONFIG_XIP_KERNEL */ -+ - bic r8, r8, #0x0c @ turn off cacheable - @ and bufferable bits - #ifdef CONFIG_DEBUG_LL -@@ -433,3 +530,13 @@ - mov pc, lr - 2: ldmib r4, {r5, r6, r7} @ found, get results - mov pc, lr -+ -+#ifdef CONFIG_XIP_KERNEL -+ -+PGTBL: .long SYMBOL_NAME(swapper_pg_dir) -+ -+ETEXT: .long SYMBOL_NAME(_endtext) -+SDATA: .long SYMBOL_NAME(_sdata) -+EDATA: .long SYMBOL_NAME(__bss_start) -+ -+#endif ---- linux-2.4.25/arch/arm/kernel/setup.c~2.4.25-vrs2-pxa1.patch 2003-08-25 13:44:39.000000000 +0200 -+++ linux-2.4.25/arch/arm/kernel/setup.c 2004-03-31 17:15:11.000000000 +0200 -@@ -55,6 +55,10 @@ - extern void reboot_setup(char *str); - extern int root_mountflags; - extern int _stext, _text, _etext, _edata, _end; -+#ifdef CONFIG_XIP_KERNEL -+extern int _endtext, _sdata; -+#endif -+ - - unsigned int processor_id; - unsigned int __machine_arch_type; -@@ -105,6 +109,109 @@ - #define lp1 io_res[1] - #define lp2 io_res[2] - -+#ifdef CONFIG_CPU_32 -+static const char *cache_types[16] = { -+ "write-through", -+ "write-back", -+ "write-back", -+ "undefined 3", -+ "undefined 4", -+ "undefined 5", -+ "write-back", -+ "write-back", -+ "undefined 8", -+ "undefined 9", -+ "undefined 10", -+ "undefined 11", -+ "undefined 12", -+ "undefined 13", -+ "undefined 14", -+ "undefined 15", -+}; -+ -+static const char *cache_clean[16] = { -+ "not required", -+ "read-block", -+ "cp15 c7 ops", -+ "undefined 3", -+ "undefined 4", -+ "undefined 5", -+ "cp15 c7 ops", -+ "cp15 c7 ops", -+ "undefined 8", -+ "undefined 9", -+ "undefined 10", -+ "undefined 11", -+ "undefined 12", -+ "undefined 13", -+ "undefined 14", -+ "undefined 15", -+}; -+ -+static const char *cache_lockdown[16] = { -+ "not supported", -+ "not supported", -+ "not supported", -+ "undefined 3", -+ "undefined 4", -+ "undefined 5", -+ "format A", -+ "format B", -+ "undefined 8", -+ "undefined 9", -+ "undefined 10", -+ "undefined 11", -+ "undefined 12", -+ "undefined 13", -+ "undefined 14", -+ "undefined 15", -+}; -+ -+#define CACHE_TYPE(x) (((x) >> 25) & 15) -+#define CACHE_S(x) ((x) & (1 << 24)) -+#define CACHE_DSIZE(x) (((x) >> 12) & 4095) /* only if S=1 */ -+#define CACHE_ISIZE(x) ((x) & 4095) -+ -+#define CACHE_SIZE(y) (((y) >> 6) & 7) -+#define CACHE_ASSOC(y) (((y) >> 3) & 7) -+#define CACHE_M(y) ((y) & (1 << 2)) -+#define CACHE_LINE(y) ((y) & 3) -+ -+static inline void dump_cache(const char *prefix, unsigned int cache) -+{ -+ unsigned int mult = 2 + (CACHE_M(cache) ? 1 : 0); -+ -+ printk("%s size %dK associativity %d line length %d sets %d\n", -+ prefix, -+ mult << (8 + CACHE_SIZE(cache)), -+ (mult << CACHE_ASSOC(cache)) >> 1, -+ 8 << CACHE_LINE(cache), -+ 1 << (6 + CACHE_SIZE(cache) - CACHE_ASSOC(cache) - -+ CACHE_LINE(cache))); -+} -+ -+static inline void dump_cpu_cache_id(void) -+{ -+ unsigned int cache_info; -+ -+ asm("mrc p15, 0, %0, c0, c0, 1" : "=r" (cache_info)); -+ -+ if (cache_info == processor_id) -+ return; -+ -+ printk("CPU: D %s cache\n", cache_types[CACHE_TYPE(cache_info)]); -+ if (CACHE_S(cache_info)) { -+ dump_cache("CPU: I cache", CACHE_ISIZE(cache_info)); -+ dump_cache("CPU: D cache", CACHE_DSIZE(cache_info)); -+ } else { -+ dump_cache("CPU: cache", CACHE_ISIZE(cache_info)); -+ } -+} -+ -+#else -+#define dump_cpu_cache_id() do { } while (0) -+#endif -+ - static void __init setup_processor(void) - { - extern struct proc_info_list __proc_info_begin, __proc_info_end; -@@ -272,7 +379,11 @@ - - kernel_code.start = __virt_to_phys(init_mm.start_code); - kernel_code.end = __virt_to_phys(init_mm.end_code - 1); -+#ifndef CONFIG_XIP_KERNEL - kernel_data.start = __virt_to_phys(init_mm.end_code); -+#else -+ kernel_data.start = __virt_to_phys(init_mm.start_data); -+#endif - kernel_data.end = __virt_to_phys(init_mm.brk - 1); - - for (i = 0; i < mi->nr_banks; i++) { -@@ -531,7 +642,12 @@ - } - - init_mm.start_code = (unsigned long) &_text; -+#ifndef CONFIG_XIP_KERNEL - init_mm.end_code = (unsigned long) &_etext; -+#else -+ init_mm.end_code = (unsigned long) &_endtext; -+ init_mm.start_data = (unsigned long) &_sdata; -+#endif - init_mm.end_data = (unsigned long) &_edata; - init_mm.brk = (unsigned long) &_end; - -@@ -568,6 +684,41 @@ - NULL - }; - -+static const char *proc_arch[16] = { -+ "undefined 0", -+ "4", -+ "4T", -+ "5", -+ "5T", -+ "5TE", -+ "undefined 6", -+ "undefined 7", -+ "undefined 8", -+ "undefined 9", -+ "undefined 10", -+ "undefined 11", -+ "undefined 12", -+ "undefined 13", -+ "undefined 14", -+ "undefined 15" -+}; -+ -+static void -+c_show_cache(struct seq_file *m, const char *type, unsigned int cache) -+{ -+ unsigned int mult = 2 + (CACHE_M(cache) ? 1 : 0); -+ -+ seq_printf(m, "%s size\t\t: %d\n" -+ "%s assoc\t\t: %d\n" -+ "%s line length\t: %d\n" -+ "%s sets\t\t: %d\n", -+ type, mult << (8 + CACHE_SIZE(cache)), -+ type, (mult << CACHE_ASSOC(cache)) >> 1, -+ type, 8 << CACHE_LINE(cache), -+ type, 1 << (6 + CACHE_SIZE(cache) - CACHE_ASSOC(cache) - -+ CACHE_LINE(cache))); -+} -+ - static int c_show(struct seq_file *m, void *v) - { - int i; -@@ -586,7 +737,60 @@ - if (elf_hwcap & (1 << i)) - seq_printf(m, "%s ", hwcap_str[i]); - -- seq_puts(m, "\n\n"); -+ seq_puts(m, "\n"); -+ -+ if ((processor_id & 0x0000f000) == 0x00000000) { -+ /* pre-ARM7 */ -+ seq_printf(m, "CPU part\t\t: %07x\n", processor_id >> 4); -+ } else if ((processor_id & 0x0000f000) == 0x00007000) { -+ /* ARM7 */ -+ seq_printf(m, "CPU implementor\t: 0x%02x\n" -+ "CPU architecture: %s\n" -+ "CPU variant\t: 0x%02x\n" -+ "CPU part\t: 0x%03x\n", -+ processor_id >> 24, -+ processor_id & (1 << 23) ? "4T" : "3", -+ (processor_id >> 16) & 127, -+ (processor_id >> 4) & 0xfff); -+ } else { -+ /* post-ARM7 */ -+ seq_printf(m, "CPU implementor\t: 0x%02x\n" -+ "CPU architecture: %s\n" -+ "CPU variant\t: 0x%x\n" -+ "CPU part\t: 0x%03x\n", -+ processor_id >> 24, -+ proc_arch[(processor_id >> 16) & 15], -+ (processor_id >> 20) & 15, -+ (processor_id >> 4) & 0xfff); -+ } -+ seq_printf(m, "CPU revision\t: %d\n", processor_id & 15); -+ -+#ifdef CONFIG_CPU_32 -+ { -+ unsigned int cache_info; -+ -+ asm("mrc p15, 0, %0, c0, c0, 1" : "=r" (cache_info)); -+ if (cache_info != processor_id) { -+ seq_printf(m, "Cache type\t: %s\n" -+ "Cache clean\t: %s\n" -+ "Cache lockdown\t: %s\n" -+ "Cache unified\t: %s\n", -+ cache_types[CACHE_TYPE(cache_info)], -+ cache_clean[CACHE_TYPE(cache_info)], -+ cache_lockdown[CACHE_TYPE(cache_info)], -+ CACHE_S(cache_info) ? "harvard" : "unified"); -+ -+ if (CACHE_S(cache_info)) { -+ c_show_cache(m, "I", CACHE_ISIZE(cache_info)); -+ c_show_cache(m, "D", CACHE_DSIZE(cache_info)); -+ } else { -+ c_show_cache(m, "Cache", CACHE_ISIZE(cache_info)); -+ } -+ } -+ } -+#endif -+ -+ seq_puts(m, "\n"); - - seq_printf(m, "Hardware\t: %s\n", machine_name); - seq_printf(m, "Revision\t: %04x\n", system_rev); ---- linux-2.4.25/arch/arm/lib/copy_page.S~2.4.25-vrs2-pxa1.patch 2001-03-07 04:44:35.000000000 +0100 -+++ linux-2.4.25/arch/arm/lib/copy_page.S 2004-03-31 17:15:11.000000000 +0200 -@@ -13,6 +13,8 @@ - #include <asm/assembler.h> - #include <asm/constants.h> - -+#define COPY_COUNT (PAGE_SZ/64 PLD( -1 )) -+ - .text - .align 5 - /* -@@ -23,9 +25,13 @@ - */ - ENTRY(copy_page) - stmfd sp!, {r4, lr} @ 2 -- mov r2, #PAGE_SZ/64 @ 1 -+ PLD( pld [r1, #0] ) -+ PLD( pld [r1, #32] ) -+ mov r2, #COPY_COUNT @ 1 - ldmia r1!, {r3, r4, ip, lr} @ 4+1 --1: stmia r0!, {r3, r4, ip, lr} @ 4 -+1: PLD( pld [r1, #64] ) -+ PLD( pld [r1, #96] ) -+2: stmia r0!, {r3, r4, ip, lr} @ 4 - ldmia r1!, {r3, r4, ip, lr} @ 4+1 - stmia r0!, {r3, r4, ip, lr} @ 4 - ldmia r1!, {r3, r4, ip, lr} @ 4+1 -@@ -33,6 +39,8 @@ - ldmia r1!, {r3, r4, ip, lr} @ 4 - subs r2, r2, #1 @ 1 - stmia r0!, {r3, r4, ip, lr} @ 4 -- ldmneia r1!, {r3, r4, ip, lr} @ 4 -- bne 1b @ 1 -+ ldmgtia r1!, {r3, r4, ip, lr} @ 4 -+ bgt 1b @ 1 -+ PLD( ldmeqia r1!, {r3, r4, ip, lr} ) -+ PLD( beq 2b ) - LOADREGS(fd, sp!, {r4, pc}) @ 3 ---- linux-2.4.25/arch/arm/lib/findbit.S~2.4.25-vrs2-pxa1.patch 2000-09-19 00:15:25.000000000 +0200 -+++ linux-2.4.25/arch/arm/lib/findbit.S 2004-03-31 17:15:11.000000000 +0200 -@@ -43,7 +43,15 @@ - /* - * One or more bits in the LSB of r3 are assumed to be set. - */ --.found: tst r3, #0x0f -+.found: -+#if __LINUX_ARM_ARCH__ >= 5 -+ rsb r1, r3, #0 -+ and r3, r3, r1 -+ clz r3, r3 -+ rsb r3, r3, #31 -+ add r0, r2, r3 -+#else -+ tst r3, #0x0f - addeq r2, r2, #4 - movne r3, r3, lsl #4 - tst r3, #0x30 -@@ -52,5 +60,6 @@ - tst r3, #0x40 - addeq r2, r2, #1 - mov r0, r2 -+#endif - RETINSTR(mov,pc,lr) - ---- linux-2.4.25/arch/arm/lib/getuser.S~2.4.25-vrs2-pxa1.patch 2002-08-03 02:39:42.000000000 +0200 -+++ linux-2.4.25/arch/arm/lib/getuser.S 2004-03-31 17:15:11.000000000 +0200 -@@ -18,7 +18,7 @@ - * Inputs: r0 contains the address - * Outputs: r0 is the error code - * r1, r2 contains the zero-extended value -- * lr corrupted -+ * ip, lr corrupted - * - * No other registers must be altered. (see include/asm-arm/uaccess.h - * for specific ASM register usage). -@@ -42,14 +42,14 @@ - - .global __get_user_2 - __get_user_2: -- bic r2, sp, #0x1f00 -- bic r2, r2, #0x00ff -- ldr r2, [r2, #TSK_ADDR_LIMIT] -- sub r2, r2, #2 -- cmp r0, r2 -+ bic ip, sp, #0x1f00 -+ bic ip, ip, #0x00ff -+ ldr ip, [ip, #TSK_ADDR_LIMIT] -+ sub ip, ip, #2 -+ cmp r0, ip - 2: ldrlsbt r1, [r0], #1 --3: ldrlsbt r2, [r0] -- orrls r1, r1, r2, lsl #8 -+3: ldrlsbt ip, [r0] -+ orrls r1, r1, ip, lsl #8 - movls r0, #0 - movls pc, lr - b __get_user_bad ---- linux-2.4.25/arch/arm/lib/memcpy.S~2.4.25-vrs2-pxa1.patch 2001-03-07 04:44:35.000000000 +0100 -+++ linux-2.4.25/arch/arm/lib/memcpy.S 2004-03-31 17:15:11.000000000 +0200 -@@ -8,6 +8,9 @@ - * published by the Free Software Foundation. - * - * ASM optimised string functions -+ * -+ * Big Endian, prefetching and code factorization provided by Nicolas Pitre: -+ * Copyright (C) 2002-2003 MontaVista Software, Inc. - */ - #include <linux/linkage.h> - #include <asm/assembler.h> -@@ -27,15 +30,16 @@ - - /* - * Prototype: void memcpy(void *to,const void *from,unsigned long n); -- * ARM3: cant use memcopy here!!! - */ - ENTRY(memcpy) - ENTRY(memmove) - ENTER -- cmp r1, r0 -- bcc 19f -+ subs ip, r0, r1 -+ cmphi r2, ip -+ bhi 18f - subs r2, r2, #4 - blt 6f -+ PLD( pld [r1, #0] ) - ands ip, r0, #3 - bne 7f - ands ip, r1, #3 -@@ -43,29 +47,59 @@ - - 1: subs r2, r2, #8 - blt 5f -- subs r2, r2, #0x14 -- blt 3f --2: ldmia r1!,{r3 - r9, ip} -- stmia r0!,{r3 - r9, ip} -+ subs r2, r2, #20 -+ blt 4f -+ -+ PLD( subs r2, r2, #65 ) -+ PLD( blt 3f ) -+ PLD( pld [r1, #32] ) -+ -+ PLD( @ cache alignment ) -+ PLD( ands ip, r1, #31 ) -+ PLD( pld [r1, #64] ) -+ PLD( beq 2f ) -+ PLD( rsb ip, ip, #32 ) -+ PLD( cmp r2, ip ) -+ PLD( pld [r1, #96] ) -+ PLD( blt 2f ) -+ PLD( cmp ip, #16 ) -+ PLD( sub r2, r2, ip ) -+ PLD( ldmgeia r1!, {r3 - r6} ) -+ PLD( stmgeia r0!, {r3 - r6} ) -+ PLD( beq 2f ) -+ PLD( and ip, ip, #15 ) -+ PLD( cmp ip, #8 ) -+ PLD( ldr r3, [r1], #4 ) -+ PLD( ldrge r4, [r1], #4 ) -+ PLD( ldrgt r5, [r1], #4 ) -+ PLD( str r3, [r0], #4 ) -+ PLD( strge r4, [r0], #4 ) -+ PLD( strgt r5, [r0], #4 ) -+ -+2: PLD( pld [r1, #96] ) -+3: ldmia r1!, {r3 - r9, ip} - subs r2, r2, #32 -+ stmia r0!, {r3 - r9, ip} - bge 2b -- cmn r2, #16 -+ PLD( cmn r2, #65 ) -+ PLD( bge 3b ) -+ PLD( add r2, r2, #65 ) -+4: cmn r2, #16 - ldmgeia r1!, {r3 - r6} -+ subge r2, r2, #16 - stmgeia r0!, {r3 - r6} -- subge r2, r2, #0x10 --3: adds r2, r2, #0x14 --4: ldmgeia r1!, {r3 - r5} -+ adds r2, r2, #20 -+ ldmgeia r1!, {r3 - r5} -+ subge r2, r2, #12 - stmgeia r0!, {r3 - r5} -- subges r2, r2, #12 -- bge 4b - 5: adds r2, r2, #8 - blt 6f - subs r2, r2, #4 - ldrlt r3, [r1], #4 - ldmgeia r1!, {r4, r5} -+ subge r2, r2, #4 - strlt r3, [r0], #4 - stmgeia r0!, {r4, r5} -- subge r2, r2, #4 - - 6: adds r2, r2, #4 - EXITEQ -@@ -92,122 +126,175 @@ - beq 1b - - 8: bic r1, r1, #3 -- ldr r7, [r1], #4 - cmp ip, #2 -- bgt 15f -- beq 11f -+ ldr lr, [r1], #4 -+ bgt 17f -+ beq 16f -+ -+ -+ .macro forward_copy_shift pull push -+ - cmp r2, #12 -- blt 10f -- sub r2, r2, #12 --9: mov r3, r7, lsr #8 -- ldmia r1!, {r4 - r7} -- orr r3, r3, r4, lsl #24 -- mov r4, r4, lsr #8 -- orr r4, r4, r5, lsl #24 -- mov r5, r5, lsr #8 -- orr r5, r5, r6, lsl #24 -- mov r6, r6, lsr #8 -- orr r6, r6, r7, lsl #24 -+ PLD( pld [r1, #0] ) -+ blt 14f -+ subs r2, r2, #28 -+ blt 12f -+ -+ PLD( subs r2, r2, #97 ) -+ PLD( blt 11f ) -+ PLD( pld [r1, #32] ) -+ -+ PLD( @ cache alignment ) -+ PLD( rsb ip, r1, #36 ) -+ PLD( pld [r1, #64] ) -+ PLD( ands ip, ip, #31 ) -+ PLD( pld [r1, #96] ) -+ PLD( beq 10f ) -+ PLD( cmp r2, ip ) -+ PLD( pld [r1, #128] ) -+ PLD( blt 10f ) -+ PLD( sub r2, r2, ip ) -+9: PLD( mov r3, lr, pull #\pull ) -+ PLD( ldr lr, [r1], #4 ) -+ PLD( subs ip, ip, #4 ) -+ PLD( orr r3, r3, lr, push #\push ) -+ PLD( str r3, [r0], #4 ) -+ PLD( bgt 9b ) -+ -+10: PLD( pld [r1, #128] ) -+11: mov r3, lr, pull #\pull -+ ldmia r1!, {r4 - r9, ip, lr} -+ subs r2, r2, #32 -+ orr r3, r3, r4, push #\push -+ mov r4, r4, pull #\pull -+ orr r4, r4, r5, push #\push -+ mov r5, r5, pull #\pull -+ orr r5, r5, r6, push #\push -+ mov r6, r6, pull #\pull -+ orr r6, r6, r7, push #\push -+ mov r7, r7, pull #\pull -+ orr r7, r7, r8, push #\push -+ mov r8, r8, pull #\pull -+ orr r8, r8, r9, push #\push -+ mov r9, r9, pull #\pull -+ orr r9, r9, ip, push #\push -+ mov ip, ip, pull #\pull -+ orr ip, ip, lr, push #\push -+ stmia r0!, {r3 - r9, ip} -+ bge 10b -+ PLD( cmn r2, #97 ) -+ PLD( bge 11b ) -+ PLD( add r2, r2, #97 ) -+ cmn r2, #16 -+ blt 13f -+12: mov r3, lr, pull #\pull -+ ldmia r1!, {r4 - r6, lr} -+ sub r2, r2, #16 -+ orr r3, r3, r4, push #\push -+ mov r4, r4, pull #\pull -+ orr r4, r4, r5, push #\push -+ mov r5, r5, pull #\pull -+ orr r5, r5, r6, push #\push -+ mov r6, r6, pull #\pull -+ orr r6, r6, lr, push #\push - stmia r0!, {r3 - r6} -- subs r2, r2, #16 -- bge 9b -- adds r2, r2, #12 -- blt 100f --10: mov r3, r7, lsr #8 -- ldr r7, [r1], #4 -+13: adds r2, r2, #28 -+ blt 15f -+14: mov r3, lr, pull #\pull -+ ldr lr, [r1], #4 - subs r2, r2, #4 -- orr r3, r3, r7, lsl #24 -+ orr r3, r3, lr, push #\push - str r3, [r0], #4 -- bge 10b --100: sub r1, r1, #3 -+ bge 14b -+15: -+ .endm -+ -+ -+ forward_copy_shift pull=8 push=24 -+ sub r1, r1, #3 - b 6b - --11: cmp r2, #12 -- blt 13f /* */ -- sub r2, r2, #12 --12: mov r3, r7, lsr #16 -- ldmia r1!, {r4 - r7} -- orr r3, r3, r4, lsl #16 -- mov r4, r4, lsr #16 -- orr r4, r4, r5, lsl #16 -- mov r5, r5, lsr #16 -- orr r5, r5, r6, lsl #16 -- mov r6, r6, lsr #16 -- orr r6, r6, r7,LSL#16 -- stmia r0!, {r3 - r6} -- subs r2, r2, #16 -- bge 12b -- adds r2, r2, #12 -- blt 14f --13: mov r3, r7, lsr #16 -- ldr r7, [r1], #4 -- subs r2, r2, #4 -- orr r3, r3, r7, lsl #16 -- str r3, [r0], #4 -- bge 13b --14: sub r1, r1, #2 -+16: forward_copy_shift pull=16 push=16 -+ sub r1, r1, #2 - b 6b - --15: cmp r2, #12 -- blt 17f -- sub r2, r2, #12 --16: mov r3, r7, lsr #24 -- ldmia r1!,{r4 - r7} -- orr r3, r3, r4, lsl #8 -- mov r4, r4, lsr #24 -- orr r4, r4, r5, lsl #8 -- mov r5, r5, lsr #24 -- orr r5, r5, r6, lsl #8 -- mov r6, r6, lsr #24 -- orr r6, r6, r7, lsl #8 -- stmia r0!, {r3 - r6} -- subs r2, r2, #16 -- bge 16b -- adds r2, r2, #12 -- blt 18f --17: mov r3, r7, lsr #24 -- ldr r7, [r1], #4 -- subs r2, r2, #4 -- orr r3, r3, r7, lsl#8 -- str r3, [r0], #4 -- bge 17b --18: sub r1, r1, #1 -+17: forward_copy_shift pull=24 push=8 -+ sub r1, r1, #1 - b 6b - - --19: add r1, r1, r2 -+18: add r1, r1, r2 - add r0, r0, r2 - subs r2, r2, #4 - blt 24f -+ PLD( pld [r1, #-4] ) - ands ip, r0, #3 - bne 25f - ands ip, r1, #3 - bne 26f - --20: subs r2, r2, #8 -+19: subs r2, r2, #8 - blt 23f -- subs r2, r2, #0x14 -+ subs r2, r2, #20 - blt 22f --21: ldmdb r1!, {r3 - r9, ip} -- stmdb r0!, {r3 - r9, ip} -+ -+ PLD( subs r2, r2, #96 ) -+ PLD( pld [r1, #-32] ) -+ PLD( blt 21f ) -+ -+ PLD( @ cache alignment ) -+ PLD( ands ip, r1, #31 ) -+ PLD( pld [r1, #-64] ) -+ PLD( beq 20f ) -+ PLD( cmp r2, ip ) -+ PLD( pld [r1, #-96] ) -+ PLD( blt 20f ) -+ PLD( cmp ip, #16 ) -+ PLD( sub r2, r2, ip ) -+ PLD( ldmgedb r1!, {r3 - r6} ) -+ PLD( stmgedb r0!, {r3 - r6} ) -+ PLD( beq 20f ) -+ PLD( and ip, ip, #15 ) -+ PLD( cmp ip, #8 ) -+ PLD( ldr r3, [r1, #-4]! ) -+ PLD( ldrge r4, [r1, #-4]! ) -+ PLD( ldrgt r5, [r1, #-4]! ) -+ PLD( str r3, [r0, #-4]! ) -+ PLD( strge r4, [r0, #-4]! ) -+ PLD( strgt r5, [r0, #-4]! ) -+ -+20: PLD( pld [r1, #-96] ) -+ PLD( pld [r1, #-128] ) -+21: ldmdb r1!, {r3 - r6} - subs r2, r2, #32 -- bge 21b --22: cmn r2, #16 -+ stmdb r0!, {r3 - r6} -+ ldmdb r1!, {r3 - r6} -+ stmgedb r0!, {r3 - r6} - ldmgedb r1!, {r3 - r6} - stmgedb r0!, {r3 - r6} -+ ldmgedb r1!, {r3 - r6} -+ subges r2, r2, #32 -+ stmdb r0!, {r3 - r6} -+ bge 20b -+ PLD( cmn r2, #96 ) -+ PLD( bge 21b ) -+ PLD( add r2, r2, #96 ) -+22: cmn r2, #16 -+ ldmgedb r1!, {r3 - r6} - subge r2, r2, #16 -+ stmgedb r0!, {r3 - r6} - adds r2, r2, #20 - ldmgedb r1!, {r3 - r5} -- stmgedb r0!, {r3 - r5} - subge r2, r2, #12 -+ stmgedb r0!, {r3 - r5} - 23: adds r2, r2, #8 - blt 24f - subs r2, r2, #4 - ldrlt r3, [r1, #-4]! - ldmgedb r1!, {r4, r5} -+ subge r2, r2, #4 - strlt r3, [r0, #-4]! - stmgedb r0!, {r4, r5} -- subge r2, r2, #4 - - 24: adds r2, r2, #4 - EXITEQ -@@ -230,89 +317,101 @@ - subs r2, r2, ip - blt 24b - ands ip, r1, #3 -- beq 20b -+ beq 19b - - 26: bic r1, r1, #3 -- ldr r3, [r1], #0 - cmp ip, #2 -- blt 34f -- beq 30f -- cmp r2, #12 -- blt 28f -- sub r2, r2, #12 --27: mov r7, r3, lsl #8 -- ldmdb r1!, {r3, r4, r5, r6} -- orr r7, r7, r6, lsr #24 -- mov r6, r6, lsl #8 -- orr r6, r6, r5, lsr #24 -- mov r5, r5, lsl #8 -- orr r5, r5, r4, lsr #24 -- mov r4, r4, lsl #8 -- orr r4, r4, r3, lsr #24 -- stmdb r0!, {r4, r5, r6, r7} -- subs r2, r2, #16 -- bge 27b -- adds r2, r2, #12 -- blt 29f --28: mov ip, r3, lsl #8 -- ldr r3, [r1, #-4]! -- subs r2, r2, #4 -- orr ip, ip, r3, lsr #24 -- str ip, [r0, #-4]! -- bge 28b --29: add r1, r1, #3 -- b 24b -+ ldr r3, [r1], #0 -+ blt 35f -+ beq 34f - --30: cmp r2, #12 -+ -+ .macro backward_copy_shift push pull -+ -+ cmp r2, #12 -+ PLD( pld [r1, #-4] ) - blt 32f -- sub r2, r2, #12 --31: mov r7, r3, lsl #16 -- ldmdb r1!, {r3, r4, r5, r6} -- orr r7, r7, r6, lsr #16 -- mov r6, r6, lsl #16 -- orr r6, r6, r5, lsr #16 -- mov r5, r5, lsl #16 -- orr r5, r5, r4, lsr #16 -- mov r4, r4, lsl #16 -- orr r4, r4, r3, lsr #16 -- stmdb r0!, {r4, r5, r6, r7} -- subs r2, r2, #16 -- bge 31b -- adds r2, r2, #12 -+ subs r2, r2, #28 -+ blt 30f -+ -+ PLD( subs r2, r2, #96 ) -+ PLD( pld [r1, #-32] ) -+ PLD( blt 29f ) -+ PLD( pld [r1, #-64] ) -+ -+ PLD( @ cache alignment ) -+ PLD( ands ip, r1, #31 ) -+ PLD( pld [r1, #-96] ) -+ PLD( beq 28f ) -+ PLD( cmp r2, ip ) -+ PLD( pld [r1, #-128] ) -+ PLD( blt 28f ) -+ PLD( sub r2, r2, ip ) -+27: PLD( mov r4, r3, push #\push ) -+ PLD( ldr r3, [r1, #-4]! ) -+ PLD( subs ip, ip, #4 ) -+ PLD( orr r4, r4, r3, pull #\pull ) -+ PLD( str r4, [r0, #-4]! ) -+ PLD( bgt 27b ) -+ -+28: PLD( pld [r1, #-128] ) -+29: mov lr, r3, push #\push -+ ldmdb r1!, {r3 - r9, ip} -+ subs r2, r2, #32 -+ orr lr, lr, ip, pull #\pull -+ mov ip, ip, push #\push -+ orr ip, ip, r9, pull #\pull -+ mov r9, r9, push #\push -+ orr r9, r9, r8, pull #\pull -+ mov r8, r8, push #\push -+ orr r8, r8, r7, pull #\pull -+ mov r7, r7, push #\push -+ orr r7, r7, r6, pull #\pull -+ mov r6, r6, push #\push -+ orr r6, r6, r5, pull #\pull -+ mov r5, r5, push #\push -+ orr r5, r5, r4, pull #\pull -+ mov r4, r4, push #\push -+ orr r4, r4, r3, pull #\pull -+ stmdb r0!, {r4 - r9, ip, lr} -+ bge 28b -+ PLD( cmn r2, #96 ) -+ PLD( bge 29b ) -+ PLD( add r2, r2, #96 ) -+ cmn r2, #16 -+ blt 31f -+30: mov r7, r3, push #\push -+ ldmdb r1!, {r3 - r6} -+ sub r2, r2, #16 -+ orr r7, r7, r6, pull #\pull -+ mov r6, r6, push #\push -+ orr r6, r6, r5, pull #\pull -+ mov r5, r5, push #\push -+ orr r5, r5, r4, pull #\pull -+ mov r4, r4, push #\push -+ orr r4, r4, r3, pull #\pull -+ stmdb r0!, {r4 - r7} -+31: adds r2, r2, #28 - blt 33f --32: mov ip, r3, lsl #16 -+32: mov r4, r3, push #\push - ldr r3, [r1, #-4]! - subs r2, r2, #4 -- orr ip, ip, r3, lsr #16 -- str ip, [r0, #-4]! -+ orr r4, r4, r3, pull #\pull -+ str r4, [r0, #-4]! - bge 32b --33: add r1, r1, #2 -+33: -+ .endm -+ -+ -+ backward_copy_shift push=8 pull=24 -+ add r1, r1, #3 - b 24b - --34: cmp r2, #12 -- blt 36f -- sub r2, r2, #12 --35: mov r7, r3, lsl #24 -- ldmdb r1!, {r3, r4, r5, r6} -- orr r7, r7, r6, lsr #8 -- mov r6, r6, lsl #24 -- orr r6, r6, r5, lsr #8 -- mov r5, r5, lsl #24 -- orr r5, r5, r4, lsr #8 -- mov r4, r4, lsl #24 -- orr r4, r4, r3, lsr #8 -- stmdb r0!, {r4, r5, r6, r7} -- subs r2, r2, #16 -- bge 35b -- adds r2, r2, #12 -- blt 37f --36: mov ip, r3, lsl #24 -- ldr r3, [r1, #-4]! -- subs r2, r2, #4 -- orr ip, ip, r3, lsr #8 -- str ip, [r0, #-4]! -- bge 36b --37: add r1, r1, #1 -+34: backward_copy_shift push=16 pull=16 -+ add r1, r1, #2 -+ b 24b -+ -+35: backward_copy_shift push=24 pull=8 -+ add r1, r1, #1 - b 24b - -- .align ---- linux-2.4.25/arch/arm/lib/uaccess.S~2.4.25-vrs2-pxa1.patch 2000-09-19 00:15:25.000000000 +0200 -+++ linux-2.4.25/arch/arm/lib/uaccess.S 2004-03-31 17:15:11.000000000 +0200 -@@ -43,6 +43,8 @@ - stmfd sp!, {r2, r4 - r7, lr} - cmp r2, #4 - blt .c2u_not_enough -+ PLD( pld [r1, #0] ) -+ PLD( pld [r0, #0] ) - ands ip, r0, #3 - bne .c2u_dest_not_aligned - .c2u_dest_aligned: -@@ -71,13 +73,26 @@ - sub r2, r2, ip - subs ip, ip, #32 - blt .c2u_0rem8lp -+ PLD( pld [r1, #28] ) -+ PLD( pld [r0, #28] ) -+ PLD( subs ip, ip, #64 ) -+ PLD( blt .c2u_0cpynopld ) -+ PLD( pld [r1, #60] ) -+ PLD( pld [r0, #60] ) - --.c2u_0cpy8lp: ldmia r1!, {r3 - r6} -+.c2u_0cpy8lp: -+ PLD( pld [r1, #92] ) -+ PLD( pld [r0, #92] ) -+.c2u_0cpynopld: ldmia r1!, {r3 - r6} - stmia r0!, {r3 - r6} @ Shouldnt fault - ldmia r1!, {r3 - r6} -- stmia r0!, {r3 - r6} @ Shouldnt fault - subs ip, ip, #32 -+ stmia r0!, {r3 - r6} @ Shouldnt fault - bpl .c2u_0cpy8lp -+ PLD( cmn ip, #64 ) -+ PLD( bge .c2u_0cpynopld ) -+ PLD( add ip, ip, #64 ) -+ - .c2u_0rem8lp: cmn ip, #16 - ldmgeia r1!, {r3 - r6} - stmgeia r0!, {r3 - r6} @ Shouldnt fault -@@ -115,9 +130,9 @@ - .c2u_1fupi: subs r2, r2, #4 - addmi ip, r2, #4 - bmi .c2u_1nowords -- mov r3, r7, lsr #8 -+ mov r3, r7, pull #8 - ldr r7, [r1], #4 -- orr r3, r3, r7, lsl #24 -+ orr r3, r3, r7, push #24 - USER( strt r3, [r0], #4) @ May fault - mov ip, r0, lsl #32 - PAGE_SHIFT - rsb ip, ip, #0 -@@ -128,50 +143,63 @@ - sub r2, r2, ip - subs ip, ip, #16 - blt .c2u_1rem8lp -+ PLD( pld [r1, #12] ) -+ PLD( pld [r0, #12] ) -+ PLD( subs ip, ip, #32 ) -+ PLD( blt .c2u_1cpynopld ) -+ PLD( pld [r1, #28] ) -+ PLD( pld [r0, #28] ) - --.c2u_1cpy8lp: mov r3, r7, lsr #8 -+.c2u_1cpy8lp: -+ PLD( pld [r1, #44] ) -+ PLD( pld [r0, #44] ) -+.c2u_1cpynopld: mov r3, r7, pull #8 - ldmia r1!, {r4 - r7} -- orr r3, r3, r4, lsl #24 -- mov r4, r4, lsr #8 -- orr r4, r4, r5, lsl #24 -- mov r5, r5, lsr #8 -- orr r5, r5, r6, lsl #24 -- mov r6, r6, lsr #8 -- orr r6, r6, r7, lsl #24 -- stmia r0!, {r3 - r6} @ Shouldnt fault - subs ip, ip, #16 -+ orr r3, r3, r4, push #24 -+ mov r4, r4, pull #8 -+ orr r4, r4, r5, push #24 -+ mov r5, r5, pull #8 -+ orr r5, r5, r6, push #24 -+ mov r6, r6, pull #8 -+ orr r6, r6, r7, push #24 -+ stmia r0!, {r3 - r6} @ Shouldnt fault - bpl .c2u_1cpy8lp -+ PLD( cmn ip, #32 ) -+ PLD( bge .c2u_1cpynopld ) -+ PLD( add ip, ip, #32 ) -+ - .c2u_1rem8lp: tst ip, #8 -- movne r3, r7, lsr #8 -+ movne r3, r7, pull #8 - ldmneia r1!, {r4, r7} -- orrne r3, r3, r4, lsl #24 -- movne r4, r4, lsr #8 -- orrne r4, r4, r7, lsl #24 -+ orrne r3, r3, r4, push #24 -+ movne r4, r4, pull #8 -+ orrne r4, r4, r7, push #24 - stmneia r0!, {r3 - r4} @ Shouldnt fault - tst ip, #4 -- movne r3, r7, lsr #8 -+ movne r3, r7, pull #8 - ldrne r7, [r1], #4 -- orrne r3, r3, r7, lsl #24 -+ orrne r3, r3, r7, push #24 - strnet r3, [r0], #4 @ Shouldnt fault - ands ip, ip, #3 - beq .c2u_1fupi --.c2u_1nowords: mov r3, r7, lsr #8 -+.c2u_1nowords: mov r3, r7, lsr #byte(1) - teq ip, #0 - beq .c2u_finished - cmp ip, #2 - USER( strbt r3, [r0], #1) @ May fault -- movge r3, r3, lsr #8 -+ movge r3, r7, lsr #byte(2) - USER( strgebt r3, [r0], #1) @ May fault -- movgt r3, r3, lsr #8 -+ movgt r3, r7, lsr #byte(3) - USER( strgtbt r3, [r0], #1) @ May fault - b .c2u_finished - - .c2u_2fupi: subs r2, r2, #4 - addmi ip, r2, #4 - bmi .c2u_2nowords -- mov r3, r7, lsr #16 -+ mov r3, r7, pull #16 - ldr r7, [r1], #4 -- orr r3, r3, r7, lsl #16 -+ orr r3, r3, r7, push #16 - USER( strt r3, [r0], #4) @ May fault - mov ip, r0, lsl #32 - PAGE_SHIFT - rsb ip, ip, #0 -@@ -182,39 +210,52 @@ - sub r2, r2, ip - subs ip, ip, #16 - blt .c2u_2rem8lp -+ PLD( pld [r1, #12] ) -+ PLD( pld [r0, #12] ) -+ PLD( subs ip, ip, #32 ) -+ PLD( blt .c2u_2cpynopld ) -+ PLD( pld [r1, #28] ) -+ PLD( pld [r0, #28] ) - --.c2u_2cpy8lp: mov r3, r7, lsr #16 -+.c2u_2cpy8lp: -+ PLD( pld [r1, #44] ) -+ PLD( pld [r0, #44] ) -+.c2u_2cpynopld: mov r3, r7, pull #16 - ldmia r1!, {r4 - r7} -- orr r3, r3, r4, lsl #16 -- mov r4, r4, lsr #16 -- orr r4, r4, r5, lsl #16 -- mov r5, r5, lsr #16 -- orr r5, r5, r6, lsl #16 -- mov r6, r6, lsr #16 -- orr r6, r6, r7, lsl #16 -- stmia r0!, {r3 - r6} @ Shouldnt fault - subs ip, ip, #16 -+ orr r3, r3, r4, push #16 -+ mov r4, r4, pull #16 -+ orr r4, r4, r5, push #16 -+ mov r5, r5, pull #16 -+ orr r5, r5, r6, push #16 -+ mov r6, r6, pull #16 -+ orr r6, r6, r7, push #16 -+ stmia r0!, {r3 - r6} @ Shouldnt fault - bpl .c2u_2cpy8lp -+ PLD( cmn ip, #32 ) -+ PLD( bge .c2u_2cpynopld ) -+ PLD( add ip, ip, #32 ) -+ - .c2u_2rem8lp: tst ip, #8 -- movne r3, r7, lsr #16 -+ movne r3, r7, pull #16 - ldmneia r1!, {r4, r7} -- orrne r3, r3, r4, lsl #16 -- movne r4, r4, lsr #16 -- orrne r4, r4, r7, lsl #16 -+ orrne r3, r3, r4, push #16 -+ movne r4, r4, pull #16 -+ orrne r4, r4, r7, push #16 - stmneia r0!, {r3 - r4} @ Shouldnt fault - tst ip, #4 -- movne r3, r7, lsr #16 -+ movne r3, r7, pull #16 - ldrne r7, [r1], #4 -- orrne r3, r3, r7, lsl #16 -+ orrne r3, r3, r7, push #16 - strnet r3, [r0], #4 @ Shouldnt fault - ands ip, ip, #3 - beq .c2u_2fupi --.c2u_2nowords: mov r3, r7, lsr #16 -+.c2u_2nowords: mov r3, r7, lsr #byte(2) - teq ip, #0 - beq .c2u_finished - cmp ip, #2 - USER( strbt r3, [r0], #1) @ May fault -- movge r3, r3, lsr #8 -+ movge r3, r7, lsr #byte(3) - USER( strgebt r3, [r0], #1) @ May fault - ldrgtb r3, [r1], #0 - USER( strgtbt r3, [r0], #1) @ May fault -@@ -223,9 +264,9 @@ - .c2u_3fupi: subs r2, r2, #4 - addmi ip, r2, #4 - bmi .c2u_3nowords -- mov r3, r7, lsr #24 -+ mov r3, r7, pull #24 - ldr r7, [r1], #4 -- orr r3, r3, r7, lsl #8 -+ orr r3, r3, r7, push #8 - USER( strt r3, [r0], #4) @ May fault - mov ip, r0, lsl #32 - PAGE_SHIFT - rsb ip, ip, #0 -@@ -236,41 +277,54 @@ - sub r2, r2, ip - subs ip, ip, #16 - blt .c2u_3rem8lp -+ PLD( pld [r1, #12] ) -+ PLD( pld [r0, #12] ) -+ PLD( subs ip, ip, #32 ) -+ PLD( blt .c2u_3cpynopld ) -+ PLD( pld [r1, #28] ) -+ PLD( pld [r0, #28] ) - --.c2u_3cpy8lp: mov r3, r7, lsr #24 -+.c2u_3cpy8lp: -+ PLD( pld [r1, #44] ) -+ PLD( pld [r0, #44] ) -+.c2u_3cpynopld: mov r3, r7, pull #24 - ldmia r1!, {r4 - r7} -- orr r3, r3, r4, lsl #8 -- mov r4, r4, lsr #24 -- orr r4, r4, r5, lsl #8 -- mov r5, r5, lsr #24 -- orr r5, r5, r6, lsl #8 -- mov r6, r6, lsr #24 -- orr r6, r6, r7, lsl #8 -- stmia r0!, {r3 - r6} @ Shouldnt fault - subs ip, ip, #16 -+ orr r3, r3, r4, push #8 -+ mov r4, r4, pull #24 -+ orr r4, r4, r5, push #8 -+ mov r5, r5, pull #24 -+ orr r5, r5, r6, push #8 -+ mov r6, r6, pull #24 -+ orr r6, r6, r7, push #8 -+ stmia r0!, {r3 - r6} @ Shouldnt fault - bpl .c2u_3cpy8lp -+ PLD( cmn ip, #32 ) -+ PLD( bge .c2u_3cpynopld ) -+ PLD( add ip, ip, #32 ) -+ - .c2u_3rem8lp: tst ip, #8 -- movne r3, r7, lsr #24 -+ movne r3, r7, pull #24 - ldmneia r1!, {r4, r7} -- orrne r3, r3, r4, lsl #8 -- movne r4, r4, lsr #24 -- orrne r4, r4, r7, lsl #8 -+ orrne r3, r3, r4, push #8 -+ movne r4, r4, pull #24 -+ orrne r4, r4, r7, push #8 - stmneia r0!, {r3 - r4} @ Shouldnt fault - tst ip, #4 -- movne r3, r7, lsr #24 -+ movne r3, r7, pull #24 - ldrne r7, [r1], #4 -- orrne r3, r3, r7, lsl #8 -+ orrne r3, r3, r7, push #8 - strnet r3, [r0], #4 @ Shouldnt fault - ands ip, ip, #3 - beq .c2u_3fupi --.c2u_3nowords: mov r3, r7, lsr #24 -+.c2u_3nowords: mov r3, r7, lsr #byte(3) - teq ip, #0 - beq .c2u_finished - cmp ip, #2 - USER( strbt r3, [r0], #1) @ May fault -- ldrge r3, [r1], #0 -+ ldrgeb r3, [r1], #1 - USER( strgebt r3, [r0], #1) @ May fault -- movgt r3, r3, lsr #8 -+ ldrgtb r3, [r1], #0 - USER( strgtbt r3, [r0], #1) @ May fault - b .c2u_finished - -@@ -302,6 +356,8 @@ - stmfd sp!, {r0, r2, r4 - r7, lr} - cmp r2, #4 - blt .cfu_not_enough -+ PLD( pld [r1, #0] ) -+ PLD( pld [r0, #0] ) - ands ip, r0, #3 - bne .cfu_dest_not_aligned - .cfu_dest_aligned: -@@ -329,13 +385,26 @@ - sub r2, r2, ip - subs ip, ip, #32 - blt .cfu_0rem8lp -+ PLD( pld [r1, #28] ) -+ PLD( pld [r0, #28] ) -+ PLD( subs ip, ip, #64 ) -+ PLD( blt .cfu_0cpynopld ) -+ PLD( pld [r1, #60] ) -+ PLD( pld [r0, #60] ) - --.cfu_0cpy8lp: ldmia r1!, {r3 - r6} @ Shouldnt fault -+.cfu_0cpy8lp: -+ PLD( pld [r1, #92] ) -+ PLD( pld [r0, #92] ) -+.cfu_0cpynopld: ldmia r1!, {r3 - r6} @ Shouldnt fault - stmia r0!, {r3 - r6} - ldmia r1!, {r3 - r6} @ Shouldnt fault -- stmia r0!, {r3 - r6} - subs ip, ip, #32 -+ stmia r0!, {r3 - r6} - bpl .cfu_0cpy8lp -+ PLD( cmn ip, #64 ) -+ PLD( bge .cfu_0cpynopld ) -+ PLD( add ip, ip, #64 ) -+ - .cfu_0rem8lp: cmn ip, #16 - ldmgeia r1!, {r3 - r6} @ Shouldnt fault - stmgeia r0!, {r3 - r6} -@@ -374,9 +443,9 @@ - .cfu_1fupi: subs r2, r2, #4 - addmi ip, r2, #4 - bmi .cfu_1nowords -- mov r3, r7, lsr #8 -+ mov r3, r7, pull #8 - USER( ldrt r7, [r1], #4) @ May fault -- orr r3, r3, r7, lsl #24 -+ orr r3, r3, r7, push #24 - str r3, [r0], #4 - mov ip, r1, lsl #32 - PAGE_SHIFT - rsb ip, ip, #0 -@@ -387,50 +456,63 @@ - sub r2, r2, ip - subs ip, ip, #16 - blt .cfu_1rem8lp -+ PLD( pld [r1, #12] ) -+ PLD( pld [r0, #12] ) -+ PLD( subs ip, ip, #32 ) -+ PLD( blt .cfu_1cpynopld ) -+ PLD( pld [r1, #28] ) -+ PLD( pld [r0, #28] ) - --.cfu_1cpy8lp: mov r3, r7, lsr #8 -+.cfu_1cpy8lp: -+ PLD( pld [r1, #44] ) -+ PLD( pld [r0, #44] ) -+.cfu_1cpynopld: mov r3, r7, pull #8 - ldmia r1!, {r4 - r7} @ Shouldnt fault -- orr r3, r3, r4, lsl #24 -- mov r4, r4, lsr #8 -- orr r4, r4, r5, lsl #24 -- mov r5, r5, lsr #8 -- orr r5, r5, r6, lsl #24 -- mov r6, r6, lsr #8 -- orr r6, r6, r7, lsl #24 -- stmia r0!, {r3 - r6} - subs ip, ip, #16 -+ orr r3, r3, r4, push #24 -+ mov r4, r4, pull #8 -+ orr r4, r4, r5, push #24 -+ mov r5, r5, pull #8 -+ orr r5, r5, r6, push #24 -+ mov r6, r6, pull #8 -+ orr r6, r6, r7, push #24 -+ stmia r0!, {r3 - r6} - bpl .cfu_1cpy8lp -+ PLD( cmn ip, #32 ) -+ PLD( bge .cfu_1cpynopld ) -+ PLD( add ip, ip, #32 ) -+ - .cfu_1rem8lp: tst ip, #8 -- movne r3, r7, lsr #8 -+ movne r3, r7, pull #8 - ldmneia r1!, {r4, r7} @ Shouldnt fault -- orrne r3, r3, r4, lsl #24 -- movne r4, r4, lsr #8 -- orrne r4, r4, r7, lsl #24 -+ orrne r3, r3, r4, push #24 -+ movne r4, r4, pull #8 -+ orrne r4, r4, r7, push #24 - stmneia r0!, {r3 - r4} - tst ip, #4 -- movne r3, r7, lsr #8 -+ movne r3, r7, pull #8 - USER( ldrnet r7, [r1], #4) @ May fault -- orrne r3, r3, r7, lsl #24 -+ orrne r3, r3, r7, push #24 - strne r3, [r0], #4 - ands ip, ip, #3 - beq .cfu_1fupi --.cfu_1nowords: mov r3, r7, lsr #8 -+.cfu_1nowords: mov r3, r7, lsr #byte(1) - teq ip, #0 - beq .cfu_finished - cmp ip, #2 - strb r3, [r0], #1 -- movge r3, r3, lsr #8 -+ movge r3, r7, lsr #byte(2) - strgeb r3, [r0], #1 -- movgt r3, r3, lsr #8 -+ movgt r3, r7, lsr #byte(3) - strgtb r3, [r0], #1 - b .cfu_finished - - .cfu_2fupi: subs r2, r2, #4 - addmi ip, r2, #4 - bmi .cfu_2nowords -- mov r3, r7, lsr #16 -+ mov r3, r7, pull #16 - USER( ldrt r7, [r1], #4) @ May fault -- orr r3, r3, r7, lsl #16 -+ orr r3, r3, r7, push #16 - str r3, [r0], #4 - mov ip, r1, lsl #32 - PAGE_SHIFT - rsb ip, ip, #0 -@@ -441,39 +523,52 @@ - sub r2, r2, ip - subs ip, ip, #16 - blt .cfu_2rem8lp -+ PLD( pld [r1, #12] ) -+ PLD( pld [r0, #12] ) -+ PLD( subs ip, ip, #32 ) -+ PLD( blt .cfu_2cpynopld ) -+ PLD( pld [r1, #28] ) -+ PLD( pld [r0, #28] ) - --.cfu_2cpy8lp: mov r3, r7, lsr #16 -+.cfu_2cpy8lp: -+ PLD( pld [r1, #44] ) -+ PLD( pld [r0, #44] ) -+.cfu_2cpynopld: mov r3, r7, pull #16 - ldmia r1!, {r4 - r7} @ Shouldnt fault -- orr r3, r3, r4, lsl #16 -- mov r4, r4, lsr #16 -- orr r4, r4, r5, lsl #16 -- mov r5, r5, lsr #16 -- orr r5, r5, r6, lsl #16 -- mov r6, r6, lsr #16 -- orr r6, r6, r7, lsl #16 -- stmia r0!, {r3 - r6} - subs ip, ip, #16 -+ orr r3, r3, r4, push #16 -+ mov r4, r4, pull #16 -+ orr r4, r4, r5, push #16 -+ mov r5, r5, pull #16 -+ orr r5, r5, r6, push #16 -+ mov r6, r6, pull #16 -+ orr r6, r6, r7, push #16 -+ stmia r0!, {r3 - r6} - bpl .cfu_2cpy8lp -+ PLD( cmn ip, #32 ) -+ PLD( bge .cfu_2cpynopld ) -+ PLD( add ip, ip, #32 ) -+ - .cfu_2rem8lp: tst ip, #8 -- movne r3, r7, lsr #16 -+ movne r3, r7, pull #16 - ldmneia r1!, {r4, r7} @ Shouldnt fault -- orrne r3, r3, r4, lsl #16 -- movne r4, r4, lsr #16 -- orrne r4, r4, r7, lsl #16 -+ orrne r3, r3, r4, push #16 -+ movne r4, r4, pull #16 -+ orrne r4, r4, r7, push #16 - stmneia r0!, {r3 - r4} - tst ip, #4 -- movne r3, r7, lsr #16 -+ movne r3, r7, pull #16 - USER( ldrnet r7, [r1], #4) @ May fault -- orrne r3, r3, r7, lsl #16 -+ orrne r3, r3, r7, push #16 - strne r3, [r0], #4 - ands ip, ip, #3 - beq .cfu_2fupi --.cfu_2nowords: mov r3, r7, lsr #16 -+.cfu_2nowords: mov r3, r7, lsr #byte(2) - teq ip, #0 - beq .cfu_finished - cmp ip, #2 - strb r3, [r0], #1 -- movge r3, r3, lsr #8 -+ movge r3, r7, lsr #byte(3) - strgeb r3, [r0], #1 - USER( ldrgtbt r3, [r1], #0) @ May fault - strgtb r3, [r0], #1 -@@ -482,9 +577,9 @@ - .cfu_3fupi: subs r2, r2, #4 - addmi ip, r2, #4 - bmi .cfu_3nowords -- mov r3, r7, lsr #24 -+ mov r3, r7, pull #24 - USER( ldrt r7, [r1], #4) @ May fault -- orr r3, r3, r7, lsl #8 -+ orr r3, r3, r7, push #8 - str r3, [r0], #4 - mov ip, r1, lsl #32 - PAGE_SHIFT - rsb ip, ip, #0 -@@ -495,41 +590,54 @@ - sub r2, r2, ip - subs ip, ip, #16 - blt .cfu_3rem8lp -+ PLD( pld [r1, #12] ) -+ PLD( pld [r0, #12] ) -+ PLD( subs ip, ip, #32 ) -+ PLD( blt .cfu_3cpynopld ) -+ PLD( pld [r1, #28] ) -+ PLD( pld [r0, #28] ) - --.cfu_3cpy8lp: mov r3, r7, lsr #24 -+.cfu_3cpy8lp: -+ PLD( pld [r1, #44] ) -+ PLD( pld [r0, #44] ) -+.cfu_3cpynopld: mov r3, r7, pull #24 - ldmia r1!, {r4 - r7} @ Shouldnt fault -- orr r3, r3, r4, lsl #8 -- mov r4, r4, lsr #24 -- orr r4, r4, r5, lsl #8 -- mov r5, r5, lsr #24 -- orr r5, r5, r6, lsl #8 -- mov r6, r6, lsr #24 -- orr r6, r6, r7, lsl #8 -+ orr r3, r3, r4, push #8 -+ mov r4, r4, pull #24 -+ orr r4, r4, r5, push #8 -+ mov r5, r5, pull #24 -+ orr r5, r5, r6, push #8 -+ mov r6, r6, pull #24 -+ orr r6, r6, r7, push #8 - stmia r0!, {r3 - r6} - subs ip, ip, #16 - bpl .cfu_3cpy8lp -+ PLD( cmn ip, #32 ) -+ PLD( bge .cfu_3cpynopld ) -+ PLD( add ip, ip, #32 ) -+ - .cfu_3rem8lp: tst ip, #8 -- movne r3, r7, lsr #24 -+ movne r3, r7, pull #24 - ldmneia r1!, {r4, r7} @ Shouldnt fault -- orrne r3, r3, r4, lsl #8 -- movne r4, r4, lsr #24 -- orrne r4, r4, r7, lsl #8 -+ orrne r3, r3, r4, push #8 -+ movne r4, r4, pull #24 -+ orrne r4, r4, r7, push #8 - stmneia r0!, {r3 - r4} - tst ip, #4 -- movne r3, r7, lsr #24 -+ movne r3, r7, pull #24 - USER( ldrnet r7, [r1], #4) @ May fault -- orrne r3, r3, r7, lsl #8 -+ orrne r3, r3, r7, push #8 - strne r3, [r0], #4 - ands ip, ip, #3 - beq .cfu_3fupi --.cfu_3nowords: mov r3, r7, lsr #24 -+.cfu_3nowords: mov r3, r7, lsr #byte(3) - teq ip, #0 - beq .cfu_finished - cmp ip, #2 - strb r3, [r0], #1 --USER( ldrget r3, [r1], #0) @ May fault -+USER( ldrgebt r3, [r1], #1) @ May fault - strgeb r3, [r0], #1 -- movgt r3, r3, lsr #8 -+USER( ldrgtbt r3, [r1], #1) @ May fault - strgtb r3, [r0], #1 - b .cfu_finished - -@@ -544,7 +652,7 @@ - ldr r1, [sp], #4 @ unsigned long count - subs r4, r1, r2 @ bytes left to copy - movne r1, r4 -- blne SYMBOL_NAME(__memzero) -+ blne __memzero - mov r0, r4 - LOADREGS(fd,sp!, {r4 - r7, pc}) - .previous ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/mach-pxa/Makefile 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,56 @@ -+# -+# Makefile for the linux kernel. -+# -+# Note! Dependencies are done automagically by 'make dep', which also -+# removes any old dependencies. DON'T put your own dependencies here -+# unless it's something special (ie not a .c file). -+ -+USE_STANDARD_AS_RULE := true -+ -+O_TARGET := pxa.o -+ -+obj-y := -+obj-m := -+obj-n := -+obj- := -+ -+export-objs := generic.o irq.o dma.o sa1111.o \ -+ usb_ctl.o usb_recv.o usb_send.o -+ -+# Common support (must be linked before board specific support) -+obj-y += generic.o irq.o dma.o -+obj-$(CONFIG_SA1111) += sa1111.o -+ -+# Specific board support -+obj-$(CONFIG_ARCH_CSB226) += csb226.o -+obj-$(CONFIG_ARCH_INNOKOM) += innokom.o -+obj-$(CONFIG_ARCH_LUBBOCK) += lubbock.o -+obj-$(CONFIG_ARCH_PXA_CERF) += cerf.o -+obj-$(CONFIG_ARCH_PXA_IDP) += idp.o -+obj-$(CONFIG_ARCH_TRIZEPS2) += trizeps2.o -+ -+# Support for blinky lights -+leds-y := leds.o -+leds-$(CONFIG_ARCH_CSB226) += leds-csb226.o -+leds-$(CONFIG_ARCH_INNOKOM) += leds-innokom.o -+leds-$(CONFIG_ARCH_LUBBOCK) += leds-lubbock.o -+leds-$(CONFIG_ARCH_PXA_IDP) += leds-idp.o -+leds-$(CONFIG_ARCH_PXA_CERF) += leds-cerf.o -+ -+obj-$(CONFIG_LEDS) += $(leds-y) -+ -+# PXA USB client support -+list-multi += pxausb_core.o -+pxausb_core-objs := usb_ctl.o usb_ep0.o usb_recv.o usb_send.o -+obj-$(CONFIG_PXA_USB) += pxausb_core.o -+obj-$(CONFIG_PXA_USB_NETLINK) += usb-eth.o -+obj-$(CONFIG_PXA_USB_CHAR) += usb-char.o -+ -+# Misc features -+obj-$(CONFIG_PM) += pm.o sleep.o -+obj-$(CONFIG_CPU_FREQ) += cpu-pxa.o -+ -+include $(TOPDIR)/Rules.make -+ -+pxausb_core.o: $(pxausb_core-objs) -+ $(LD) -r -o $@ $(pxausb_core-objs) ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/mach-pxa/cerf.c 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,266 @@ -+/* -+ * linux/arch/arm/mach-pxa/cerf.c -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ */ -+#include <linux/init.h> -+#include <linux/major.h> -+#include <linux/fs.h> -+#include <linux/interrupt.h> -+#include <linux/sched.h> -+ -+#include <asm/types.h> -+#include <asm/setup.h> -+#include <asm/memory.h> -+#include <asm/mach-types.h> -+#include <asm/hardware.h> -+#include <asm/irq.h> -+ -+#include <asm/mach/arch.h> -+#include <asm/mach/map.h> -+#include <asm/mach/irq.h> -+ -+#include <asm/io.h> -+#include <asm/arch/irq.h> -+ -+#include "generic.h" -+ -+/* -+ * Set this to zero to remove all the debug statements via -+ * dead code elimination. -+ */ -+#define DEBUGGING 1 -+ -+#if DEBUGGING -+static unsigned int cerf_debug = DEBUGGING; -+#else -+#define cerf_debug 0 -+#endif -+ -+static void __init cerf_init_irq(void) -+{ -+ pxa_init_irq(); -+ -+ if( cerf_debug > 1) -+ { -+#if 0 -+ GPDR0 = 0xc05b9130; -+ GPDR1 = 0xfcffab82; -+ GPDR2 = 0x0001ffff; -+#endif -+ -+ printk(KERN_INFO "Pin directions:\n"); -+ printk(KERN_INFO "GPDR0 0x%08x\n", GPDR0); -+ printk(KERN_INFO "GPDR1 0x%08x\n", GPDR1); -+ printk(KERN_INFO "GPDR2 0x%08x\n", GPDR2); -+ -+ printk(KERN_INFO "Pin State:\n"); -+ printk(KERN_INFO "GPLR0 0x%08x\n", GPLR0); -+ printk(KERN_INFO "GPLR1 0x%08x\n", GPLR1); -+ printk(KERN_INFO "GPLR2 0x%08x\n", GPLR2); -+ -+ printk(KERN_INFO "Rising Edge:\n"); -+ printk(KERN_INFO "GRER0 0x%08x\n", GRER0); -+ printk(KERN_INFO "GRER1 0x%08x\n", GRER1); -+ printk(KERN_INFO "GRER2 0x%08x\n", GRER2); -+ -+ printk(KERN_INFO "Falling Edge:\n"); -+ printk(KERN_INFO "GFER0 0x%08x\n", GFER0); -+ printk(KERN_INFO "GFER1 0x%08x\n", GFER1); -+ printk(KERN_INFO "GFER2 0x%08x\n", GFER2); -+ } -+ -+ /* set_GPIO_IRQ_edge has to be called before an irq can be requested */ -+ set_GPIO_IRQ_edge( 0, GPIO_FALLING_EDGE); /* CPLD */ -+#ifdef CONFIG_PXA_CERF_PDA -+ set_GPIO_IRQ_edge( 2, GPIO_RISING_EDGE); /* UART B Interrupt */ -+ set_GPIO_IRQ_edge( 3, GPIO_RISING_EDGE); /* UART A Interrupt */ -+ set_GPIO_IRQ_edge( 32, GPIO_RISING_EDGE); /* UCB1400 Interrupt */ -+#endif -+ set_GPIO_IRQ_edge( 14, GPIO_FALLING_EDGE); /* PCMCIA Card Detect */ -+ set_GPIO_IRQ_edge( 21, GPIO_RISING_EDGE); /* Ethernet Interrupt */ -+} -+ -+static int __init cerf_init(void) -+{ -+ /* -+ * All of the code that was here was SA1111 init code -+ * which we do not have. -+ */ -+ return 0; -+} -+ -+__initcall(cerf_init); -+ -+static void __init -+fixup_cerf(struct machine_desc *desc, struct param_struct *params, -+ char **cmdline, struct meminfo *mi) -+{ -+ SET_BANK (0, CERF_RAM_BASE, CERF_RAM_SIZE); -+ mi->nr_banks = 1; -+ -+#if 0 // Enable this stuff if you plan on not using jffs2 -+ setup_ramdisk (1, 0, 0, 8192); -+ setup_initrd (__phys_to_virt(0xa1000000), 4*1024*1024); -+ ROOT_DEV = MKDEV(RAMDISK_MAJOR,0); -+#endif -+} -+ -+/* -+ * IO map for the devices. -+ */ -+static struct map_desc cerf_io_desc[] __initdata = { -+ /* virtual physical length domain r w c b */ -+ { CERF_FLASH_BASE , CERF_FLASH_PHYS , CERF_FLASH_SIZE , DOMAIN_IO, 0, 1, 0, 0 }, -+ { CERF_ETH_BASE , CERF_ETH_PHYS , CERF_ETH_SIZE , DOMAIN_IO, 0, 1, 0, 0 }, -+#ifdef CONFIG_PXA_CERF_PDA -+ { CERF_BT_BASE , CERF_BT_PHYS , CERF_BT_SIZE , DOMAIN_IO, 0, 1, 0, 0 }, -+ { CERF_SERIAL_BASE, CERF_SERIAL_PHYS, CERF_SERIAL_SIZE, DOMAIN_IO, 0, 1, 0, 0 }, -+ { CERF_CPLD_BASE , CERF_CPLD_PHYS , CERF_CPLD_SIZE , DOMAIN_IO, 0, 1, 0, 0 }, -+#endif -+ -+ LAST_DESC -+}; -+ -+static void __init cerf_map_io(void) -+{ -+ pxa_map_io(); -+ iotable_init(cerf_io_desc); -+ -+ if( cerf_debug > 1) -+ { -+ printk(KERN_INFO "origMCS0 = 0x%08x\n", MSC0); -+ printk(KERN_INFO "origMCS1 = 0x%08x\n", MSC1); -+ printk(KERN_INFO "origMCS2 = 0x%08x\n", MSC2); -+ } -+ -+ /* setup memory timing for CS0/1 */ -+ MSC0 = MSC_CS(0, MSC_RBUFF(MSC_RBUFF_SLOW) | -+ MSC_RRR(3) | -+ MSC_RDN(15) | -+ MSC_RDF(13) | -+ MSC_RBW(0) | -+ MSC_RT(0)) | -+#ifdef CONFIG_PXA_CERF_PDA -+ MSC_CS(1, MSC_RBUFF(MSC_RBUFF_SLOW) | -+ MSC_RRR(7) | -+ MSC_RDN(15) | -+ MSC_RDF(15) | -+ MSC_RBW(1) | -+ MSC_RT(0)); -+#elif defined(CONFIG_PXA_CERF_BOARD) -+ MSC_CS(1, MSC_RBUFF(MSC_RBUFF_SLOW) | -+ MSC_RRR(1) | -+ MSC_RDN(2) | -+ MSC_RDF(4) | -+ MSC_RBW(0) | -+ MSC_RT(4)); -+#endif -+ printk(KERN_INFO "MCS0 = 0x%08x\n", MSC0); -+ -+ /* setup memory timing for CS2/3 */ -+ MSC1 = MSC_CS(2, MSC_RBUFF(MSC_RBUFF_SLOW) | -+ MSC_RRR(5) | -+ MSC_RDN(10) | -+ MSC_RDF(10) | -+ MSC_RBW(1) | -+ MSC_RT(0)) | -+ MSC_CS(3, MSC_RBUFF(MSC_RBUFF_SLOW) | -+ MSC_RRR(5) | -+ MSC_RDN(10) | -+ MSC_RDF(10) | -+ MSC_RBW(1) | -+ MSC_RT(0)); -+ printk(KERN_INFO "MCS1 = 0x%08x\n", MSC1); -+ -+ /* setup memory timing for CS4/5 */ -+ MSC2 = MSC_CS(4, MSC_RBUFF(MSC_RBUFF_SLOW) | -+ MSC_RRR(2) | -+ MSC_RDN(4) | -+ MSC_RDF(4) | -+ MSC_RBW(1) | -+ MSC_RT(0)) | -+ MSC_CS(5, MSC_RBUFF(MSC_RBUFF_SLOW) | -+ MSC_RRR(2) | -+ MSC_RDN(4) | -+ MSC_RDF(4) | -+ MSC_RBW(1) | -+ MSC_RT(0)); -+ printk(KERN_INFO "MCS2 = 0x%08x\n", MSC2); -+ -+#ifdef CONFIG_SOUND_PXA_AC97 -+ printk(KERN_INFO "Enabling sound amp for pxa cerf pda.\n"); -+ outw( CERF_PDA_SOUND_ENABLE, CERF_CPLD_BASE+CERF_PDA_CPLD_SOUND_ENA); -+#endif -+ -+#ifdef CONFIG_FB_PXA -+ printk(KERN_INFO "Setting LCD to brightness to %d/15\n", CERF_PDA_DEFAULT_BRIGHTNESS); -+ outw( CERF_PDA_DEFAULT_BRIGHTNESS, CERF_CPLD_BASE+CERF_PDA_CPLD_BRIGHTNESS); -+#endif -+ -+#ifdef CONFIG_IRDA -+ /* Enable IrDA UART (SIR)*/ -+ CKEN |= CKEN5_STUART; -+ -+ /* We want to get our goods from the STUART */ -+ set_GPIO_mode(GPIO46_STRXD_MD); -+ set_GPIO_mode(GPIO47_STTXD_MD); -+ -+ /* make sure FIR ICP is off */ -+ ICCR0 = 0; -+ -+ /* configure STUART to for SIR -+ * NOTE: RCVEIR and XMITIR must not be set at the same time! -+ * Start with receive in IR mode, and switch transmit to IR only -+ * when we need to send something in serial driver. -+ */ -+ STISR = IrSR_IR_RECEIVE_ON; -+#endif -+ -+#if 0 -+ /* Connect FIR ICP to GPIO pins */ -+ CKEN |= CKEN13_FICP; -+ set_GPIO_mode(GPIO46_ICPRXD_MD); -+ set_GPIO_mode(GPIO47_ICPTXD_MD); -+ ICCR0 = 0x1 | 0x18; //ICP unit enable -+#endif -+ -+#if 0 -+ /* Enable BT UART */ -+ CKEN |= CKEN7_BTUART; -+ set_GPIO_mode(GPIO42_BTRXD_MD); -+ set_GPIO_mode(GPIO43_BTTXD_MD); -+ set_GPIO_mode(GPIO44_BTCTS_MD); -+ set_GPIO_mode(GPIO45_BTRTS_MD); -+#endif -+ -+ if( cerf_debug > 1) -+ { -+ printk(KERN_INFO "GPDR0 0x%08x\n", GPDR0); -+ printk(KERN_INFO "GPDR1 0x%08x\n", GPDR1); -+ printk(KERN_INFO "GPDR2 0x%08x\n", GPDR2); -+ printk(KERN_INFO "GPLR0 0x%08x\n", GPLR0); -+ printk(KERN_INFO "GPLR1 0x%08x\n", GPLR1); -+ printk(KERN_INFO "GPLR2 0x%08x\n", GPLR2); -+ printk(KERN_INFO "GAFR0_L 0x%08x\n", GAFR0_L); -+ printk(KERN_INFO "GAFR0_U 0x%08x\n", GAFR0_U); -+ printk(KERN_INFO "GAFR1_L 0x%08x\n", GAFR1_L); -+ printk(KERN_INFO "GAFR1_U 0x%08x\n", GAFR1_U); -+ printk(KERN_INFO "GAFR2_L 0x%08x\n", GAFR2_L); -+ printk(KERN_INFO "GAFR2_U 0x%08x\n", GAFR2_U); -+ printk(KERN_INFO "CKEN = 0x%08x\n", CKEN); -+ printk(KERN_INFO "ICCR0 = 0x%08x\n", ICCR0); -+ printk(KERN_INFO "STISR = 0x%08x\n", STISR); -+ } -+} -+ -+MACHINE_START(PXA_CERF, "CerfBoard PXA Reference Board") -+ MAINTAINER("Intrinsyc Software Inc.") -+ BOOT_MEM(0xa0000000, 0x40000000, 0xfc000000) -+ BOOT_PARAMS(0xa0000100) -+ FIXUP(fixup_cerf) -+ MAPIO(cerf_map_io) -+ INITIRQ(cerf_init_irq) -+MACHINE_END ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/mach-pxa/cpu-pxa.c 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,240 @@ -+/* -+ * linux/arch/arm/mach-pxa/cpu-pxa.c -+ * -+ * Copyright (C) 2002,2003 Intrinsyc Software -+ * -+ * 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. -+ * -+ * History: -+ * 31-Jul-2002 : Initial version [FB] -+ * 29-Jan-2003 : added PXA255 support [FB] -+ * -+ * Note: -+ * -+ * Quote from erratum 134: -+ * ""If the operation of these peripherals would be adversely affected, -+ * then these peripherals would have to be disabled during a frequency -+ * change. (MMC,FFUART,STUART,BTUART,IRDA,SSP,UDC,AC97)"" -+ * -+ * This sounds like they are not sure what the bug is... -+ * If you run into problems with any of these peripherals, the effected -+ * driver should register with cpu freq notification and disable/enable -+ * the peripheral on CPUFREQ_PRECHANGE and CPUFREQ_POSTCHANGE. -+ * -+ * So far I've tested this code only under light load. It works for me. -+ * -+ * TODO: -+ * - determine min/max freq at runtime -+ * - determine pxbus value at runtime -+ * -+ */ -+ -+#include <linux/kernel.h> -+#include <linux/module.h> -+#include <linux/sched.h> -+#include <linux/init.h> -+#include <linux/cpufreq.h> -+ -+#include <asm/hardware.h> -+ -+#define DEBUGGING 1 -+ -+#if DEBUGGING -+static unsigned int freq_debug = DEBUGGING; -+#else -+#define freq_debug 0 -+#endif -+ -+typedef struct -+{ -+ unsigned int khz; -+ unsigned int cccr; -+ unsigned int pxbus; -+} pxa_freqs_t; -+ -+#define CCLKCFG_TURBO 0x1 -+#define CCLKCFG_FCS 0x2 -+ -+#define PXA250_REV_A1 0x1 -+#define PXA250_REV_B2 0x4 -+#define PXA25x_MIN_FREQ 99000 -+ -+//#define PXA25x_ALLOW_OVERCLOCK -+ -+#ifdef PXA25x_ALLOW_OVERCLOCK -+#warning *** Overclocking enabled - this may fry your hardware - you have been warned *** -+#define OC(x...) x -+#define PXA25x_MAX_FREQ 471000 -+#else -+#define OC(x...) -+#define PXA25x_MAX_FREQ 400000 -+#endif -+ -+/* If CONFIG_CPU_FREQ is turned on but we find (at runtime) -+ * we can't support scaling, try to handle requests gracefully. -+ */ -+static int supported; -+ -+static pxa_freqs_t pxa250_valid_freqs[] = -+{ -+ {199100, 0x141, 99}, /* mem= 99, run=199, turbo=199, PXbus= 99 */ -+ {298600, 0x1c1, 99}, /* mem= 99, run=199, turbo=298, PXbus= 99 */ -+ {398100, 0x241, 99}, /* mem= 99, run=199, turbo=398, PXbus= 99 */ -+ {0,0} -+}; -+ -+static pxa_freqs_t pxa255_valid_freqs[] = -+{ -+ { 99000, 0x121, 50}, /* mem= 99, run= 99, turbo= 99, PXbus= 50 */ -+OC( {118000, 0x122, 59},)/* mem=118, run=118, turbo=118, PXbus= 59 OC'd mem */ -+ {199100, 0x141, 99}, /* mem= 99, run=199, turbo=199, PXbus= 99 */ -+OC( {236000, 0x142,118},)/* mem=118, run=236, turbo=236, PXbus=118 OC'd mem */ -+ {298600, 0x1c1, 99}, /* mem= 99, run=199, turbo=298, PXbus= 99 */ -+OC( {354000, 0x1c2,118},)/* mem=118, run=236, turbo=354, PXbus=118 OC'd mem */ -+ {398099, 0x241, 99}, /* mem= 99, run=199, turbo=398, PXbus= 99 */ -+ {398100, 0x161,196}, /* mem= 99, run=398, turbo=398, PXbus=196 */ -+OC( {471000, 0x162,236},)/* mem=118, run=471, turbo=471, PXbus=236 OC'd mem/core/bus */ -+ {0,0} -+}; -+ -+static pxa_freqs_t *pxa_valid_freqs; -+ -+/* This should be called with a valid freq point that was -+ * obtained via pxa_validate_speed -+ */ -+static pxa_freqs_t * pxa_get_freq_info( unsigned int khz) -+{ -+ int i=0; -+ while( pxa_valid_freqs[i].khz) -+ { -+ if( pxa_valid_freqs[i].khz == khz) -+ return &pxa_valid_freqs[i]; -+ i++; -+ } -+ -+ /* shouldn't get here */ -+ return 0; -+} -+ -+/* find a valid frequency point */ -+static unsigned int pxa_validate_speed(unsigned int khz) -+{ -+ int i=0; -+ unsigned int vfreq = 0; -+ while( pxa_valid_freqs[i].khz && (khz >= pxa_valid_freqs[i].khz)) -+ { -+ vfreq = pxa_valid_freqs[i].khz; -+ i++; -+ } -+ return vfreq; -+} -+ -+/* This should be called with a valid freq point that was -+ * obtained via pxa_validate_speed -+ */ -+static void pxa_setspeed(unsigned int khz) -+{ -+ unsigned long flags; -+ unsigned int unused; -+ void *ramstart = phys_to_virt(0xa0000000); -+ pxa_freqs_t *freq_info; -+ -+ if( ! supported) return; -+ -+ freq_info = pxa_get_freq_info( khz); -+ -+ if( ! freq_info) return; -+ -+ CCCR = freq_info->cccr; -+ if( freq_debug) -+ printk(KERN_INFO "Changing CPU frequency to %d Mhz (PXbus=%dMhz).\n", -+ khz/1000, freq_info->pxbus); -+ -+ local_irq_save(flags); -+ __asm__ __volatile__("\ -+ ldr r4, [%1] @load MDREFR \n\ -+ b 2f \n\ -+ .align 5 \n\ -+1: \n\ -+ mcr p14, 0, %2, c6, c0, 0 @ set CCLKCFG[FCS] \n\ -+ \n\ -+ @ restart sdcke 0 / 1 \n\ -+ bic r5, r4, #(0x00001000 | 0x00008000) @ MDREFR_E0PIN | MDREFR_E1PIN \n\ -+ str r5, [%1] @clear \n\ -+ str r4, [%1] @restore \n\ -+ \n\ -+ @ Generate refresh cycles for all banks \n\ -+ ldr r4, [%3] \n\ -+ str r4, [%3] \n\ -+ str r4, [%3] \n\ -+ str r4, [%3] \n\ -+ str r4, [%3] \n\ -+ str r4, [%3] \n\ -+ str r4, [%3] \n\ -+ str r4, [%3] \n\ -+ str r4, [%3] \n\ -+ \n\ -+ b 3f \n\ -+2: b 1b \n\ -+3: nop \n\ -+ " -+ : "=&r" (unused) -+ : "r" (&MDREFR), "r" (CCLKCFG_TURBO|CCLKCFG_FCS), "r" (ramstart) -+ : "r4", "r5"); -+ local_irq_restore(flags); -+} -+ -+static int pxa_init_freqs( void) -+{ -+ int cpu_ver; -+ asm("mrc%? p15, 0, %0, c0, c0" : "=r" (cpu_ver)); -+ -+ if( (cpu_ver & 0xf) <= PXA250_REV_A1) -+ { -+ return 0; -+ } -+ -+ if( (cpu_ver & 0xf) <= PXA250_REV_B2) -+ { -+ if( freq_debug) printk(KERN_INFO "Using PXA250 frequency points.\n"); -+ pxa_valid_freqs = pxa250_valid_freqs; -+ } -+ else /* C0 and above */ -+ { -+ if( freq_debug) printk(KERN_INFO "Using PXA255 frequency points.\n"); -+ pxa_valid_freqs = pxa255_valid_freqs; -+ } -+ -+ return 1; -+} -+ -+static int __init pxa_clk_init(void) -+{ -+ if( pxa_init_freqs()) -+ { -+ if( freq_debug) printk(KERN_INFO "Registering CPU frequency change support.\n"); -+ supported = 1; -+ -+ cpufreq_init( get_clk_frequency_khz(0), PXA25x_MIN_FREQ, PXA25x_MAX_FREQ); -+ cpufreq_setfunctions(pxa_validate_speed, pxa_setspeed); -+ } -+ else -+ { -+ if( freq_debug) printk(KERN_INFO "Disabling CPU frequency change support.\n"); -+ /* Note that we have to initialize the generic code in order to -+ * release a lock (cpufreq_sem). Any registration for freq changes -+ * (e.g. lcd driver) will get blocked otherwise. -+ */ -+ cpufreq_init( 0, 0, 0); -+ cpufreq_setfunctions(pxa_validate_speed, pxa_setspeed); -+ } -+ -+ return 0; -+} -+ -+module_init(pxa_clk_init); -+ -+MODULE_AUTHOR ("Intrinsyc Software Inc."); -+MODULE_LICENSE("GPL"); ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/mach-pxa/csb226.c 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,180 @@ -+/* -+ * linux/arch/arm/mach-pxa/csb226.c -+ * -+ * (c) 2003 Robert Schwebel <r.schwebel@pengutronix.de>, Pengutronix -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+ */ -+ -+#include <linux/init.h> -+#include <linux/major.h> -+#include <linux/fs.h> -+#include <linux/interrupt.h> -+#include <linux/sched.h> -+ -+#include <asm/types.h> -+#include <asm/setup.h> -+#include <asm/memory.h> -+#include <asm/mach-types.h> -+#include <asm/hardware.h> -+#include <asm/irq.h> -+ -+#include <asm/mach/arch.h> -+#include <asm/mach/map.h> -+#include <asm/mach/irq.h> -+ -+#include <asm/arch/irq.h> -+#include <asm/arch/irqs.h> -+#include <asm/hardware/sa1111.h> -+ -+#include "generic.h" -+ -+static unsigned long csb226_irq_en_mask; -+ -+static void csb226_mask_and_ack_irq(unsigned int irq) -+{ -+ int csb226_irq = (irq - CSB226_IRQ(0)); -+ csb226_irq_en_mask &= ~(1 << csb226_irq); -+ CSB226_IRQ_MASK_EN &= ~(1 << csb226_irq); -+ CSB226_IRQ_SET_CLR &= ~(1 << csb226_irq); -+} -+ -+static void csb226_mask_irq(unsigned int irq) -+{ -+ int csb226_irq = (irq - CSB226_IRQ(0)); -+ csb226_irq_en_mask &= ~(1 << csb226_irq); -+ CSB226_IRQ_MASK_EN &= ~(1 << csb226_irq); -+} -+ -+static void csb226_unmask_irq(unsigned int irq) -+{ -+ int csb226_irq = (irq - CSB226_IRQ(0)); -+ csb226_irq_en_mask |= (1 << csb226_irq); -+ CSB226_IRQ_MASK_EN |= (1 << csb226_irq); -+} -+ -+void csb226_irq_demux(int irq, void *dev_id, struct pt_regs *regs) -+{ -+ unsigned long irq_status; -+ int i; -+ -+ while ((irq_status = CSB226_IRQ_SET_CLR & csb226_irq_en_mask)) { -+ for (i = 0; i < 6; i++) { -+ if(irq_status & (1<<i)) -+ do_IRQ(CSB226_IRQ(i), regs); -+ } -+ } -+} -+ -+/* FIXME: this should not be necessary on csb226 */ -+static struct irqaction csb226_irq = { -+ name: "CSB226 FPGA", -+ handler: csb226_irq_demux, -+ flags: SA_INTERRUPT -+}; -+ -+static void __init csb226_init_irq(void) -+{ -+ int irq; -+ -+ pxa_init_irq(); -+ -+ /* setup extra csb226 irqs */ -+/* RS: ??? -+ for(irq = CSB226_IRQ(0); irq <= CSB226_IRQ(5); irq++) -+ { -+ irq_desc[irq].valid = 1; -+ irq_desc[irq].probe_ok = 1; -+ irq_desc[irq].mask_ack = csb226_mask_and_ack_irq; -+ irq_desc[irq].mask = csb226_mask_irq; -+ irq_desc[irq].unmask = csb226_unmask_irq; -+ } -+ -+ set_GPIO_IRQ_edge(GPIO_CSB226_IRQ, GPIO_FALLING_EDGE); -+ setup_arm_irq(IRQ_GPIO_CSB226_IRQ, &csb226_irq); -+*/ -+} -+ -+/* FIXME: not necessary on CSB226? */ -+static int __init csb226_init(void) -+{ -+ int ret; -+ -+ return 0; -+} -+ -+__initcall(csb226_init); -+ -+static void __init -+fixup_csb226(struct machine_desc *desc, struct param_struct *params, -+ char **cmdline, struct meminfo *mi) -+{ -+ SET_BANK (0, 0xa0000000, 64*1024*1024); -+ mi->nr_banks = 1; -+#if 0 -+ setup_ramdisk (1, 0, 0, 8192); -+ setup_initrd (__phys_to_virt(0xa1000000), 4*1024*1024); -+ ROOT_DEV = MKDEV(RAMDISK_MAJOR,0); -+#endif -+} -+ -+/* FIXME: shouldn't this be moved to arch/arm/mach-pxa/mm.c? [RS] */ -+static struct map_desc csb226_io_desc[] __initdata = { -+ /* virtual physical length domain r w c b */ -+// { 0xf4000000, 0x04000000, 0x00ffffff, DOMAIN_IO, 1, 1, 0, 0 }, /* HT4562B PS/2 controller */ -+ { 0xf8000000, 0x08000000, 1024*1024, DOMAIN_IO, 0, 1, 0, 0 }, /* CS8900 LAN controller */ -+// { 0xe0000000, 0x20000000, 0x0fffffff, DOMAIN_IO, 1, 1, 0, 0 }, /* CompactFlash */ -+#if 0 -+ { 0xf0000000, 0x08000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 }, /* CPLD */ -+ { 0xf1000000, 0x0c000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 }, /* LAN91C96 IO */ -+ { 0xf1100000, 0x0e000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 }, /* LAN91C96 Attr */ -+ { 0xf4000000, 0x10000000, 0x00400000, DOMAIN_IO, 0, 1, 0, 0 }, /* SA1111 */ -+#endif -+ LAST_DESC -+}; -+ -+static void __init csb226_map_io(void) -+{ -+ pxa_map_io(); -+ iotable_init(csb226_io_desc); -+ -+ /* This enables the BTUART */ -+ CKEN |= CKEN7_BTUART; -+ set_GPIO_mode(GPIO42_BTRXD_MD); -+ set_GPIO_mode(GPIO43_BTTXD_MD); -+ set_GPIO_mode(GPIO44_BTCTS_MD); -+ set_GPIO_mode(GPIO45_BTRTS_MD); -+ -+ /* This is for the CS8900 chip select */ -+ set_GPIO_mode(GPIO78_nCS_2_MD); -+ -+ /* setup sleep mode values */ -+ PWER = 0x00000002; -+ PFER = 0x00000000; -+ PRER = 0x00000002; -+ PGSR0 = 0x00008000; -+ PGSR1 = 0x003F0202; -+ PGSR2 = 0x0001C000; -+ PCFR |= PCFR_OPDE; -+} -+ -+MACHINE_START(CSB226, "Cogent CSB226 Development Platform") -+ MAINTAINER("Robert Schwebel, Pengutronix") -+ BOOT_MEM(0xa0000000, 0x40000000, io_p2v(0x40000000)) -+ BOOT_PARAMS(0xa0000100) -+ FIXUP(fixup_csb226) -+ MAPIO(csb226_map_io) -+ INITIRQ(csb226_init_irq) -+MACHINE_END ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/mach-pxa/dma.c 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,131 @@ -+/* -+ * linux/arch/arm/mach-pxa/dma.c -+ * -+ * PXA DMA registration and IRQ dispatching -+ * -+ * Author: Nicolas Pitre -+ * Created: Nov 15, 2001 -+ * Copyright: MontaVista Software Inc. -+ * -+ * 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/module.h> -+#include <linux/init.h> -+#include <linux/kernel.h> -+#include <linux/sched.h> -+#include <linux/errno.h> -+ -+#include <asm/system.h> -+#include <asm/irq.h> -+#include <asm/hardware.h> -+#include <asm/dma.h> -+ -+ -+static struct dma_channel { -+ char *name; -+ void (*irq_handler)(int, void *, struct pt_regs *); -+ void *data; -+} dma_channels[16]; -+ -+ -+int pxa_request_dma (char *name, pxa_dma_prio prio, -+ void (*irq_handler)(int, void *, struct pt_regs *), -+ void *data) -+{ -+ unsigned long flags; -+ int i, found = 0; -+ -+ /* basic sanity checks */ -+ if (!name || !irq_handler) -+ return -EINVAL; -+ -+ local_irq_save(flags); -+ -+ /* try grabbing a DMA channel with the requested priority */ -+ for (i = prio; i < prio + (prio == DMA_PRIO_LOW) ? 8 : 4; i++) { -+ if (!dma_channels[i].name) { -+ found = 1; -+ break; -+ } -+ } -+ -+ if (!found) { -+ /* requested prio group is full, try hier priorities */ -+ for (i = prio-1; i >= 0; i--) { -+ if (!dma_channels[i].name) { -+ found = 1; -+ break; -+ } -+ } -+ } -+ -+ if (found) { -+ DCSR(i) = DCSR_STARTINTR|DCSR_ENDINTR|DCSR_BUSERR; -+ dma_channels[i].name = name; -+ dma_channels[i].irq_handler = irq_handler; -+ dma_channels[i].data = data; -+ } else { -+ printk (KERN_WARNING "No more available DMA channels for %s\n", name); -+ i = -ENODEV; -+ } -+ -+ local_irq_restore(flags); -+ return i; -+} -+ -+void pxa_free_dma (int dma_ch) -+{ -+ unsigned long flags; -+ -+ if (!dma_channels[dma_ch].name) { -+ printk (KERN_CRIT __FUNCTION__ -+ ": trying to free channel %d which is already freed\n", -+ dma_ch); -+ return; -+ } -+ -+ local_irq_save(flags); -+ DCSR(dma_ch) = DCSR_STARTINTR|DCSR_ENDINTR|DCSR_BUSERR; -+ dma_channels[dma_ch].name = NULL; -+ local_irq_restore(flags); -+} -+ -+static void dma_irq_handler(int irq, void *dev_id, struct pt_regs *regs) -+{ -+ int i, dint = DINT; -+ -+ for (i = 0; i < 16; i++) { -+ if (dint & (1 << i)) { -+ struct dma_channel *channel = &dma_channels[i]; -+ if (channel->name && channel->irq_handler) { -+ channel->irq_handler(i, channel->data, regs); -+ } else { -+ /* -+ * IRQ for an unregistered DMA channel: -+ * let's clear the interrupts and disable it. -+ */ -+ printk (KERN_WARNING "spurious IRQ for DMA channel %d\n", i); -+ DCSR(i) = DCSR_STARTINTR|DCSR_ENDINTR|DCSR_BUSERR; -+ } -+ } -+ } -+} -+ -+static int __init pxa_dma_init (void) -+{ -+ int ret; -+ -+ ret = request_irq (IRQ_DMA, dma_irq_handler, 0, "DMA", NULL); -+ if (ret) -+ printk (KERN_CRIT "Wow! Can't register IRQ for DMA\n"); -+ return ret; -+} -+ -+__initcall(pxa_dma_init); -+ -+EXPORT_SYMBOL(pxa_request_dma); -+EXPORT_SYMBOL(pxa_free_dma); -+ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/mach-pxa/generic.c 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,142 @@ -+/* -+ * linux/arch/arm/mach-pxa/generic.c -+ * -+ * Author: Nicolas Pitre -+ * Created: Jun 15, 2001 -+ * Copyright: MontaVista Software Inc. -+ * -+ * Code common to all PXA machines. -+ * -+ * 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. -+ * -+ * Since this file should be linked before any other machine specific file, -+ * the __initcall() here will be executed first. This serves as default -+ * initialization stuff for PXA machines which can be overriden later if -+ * need be. -+ */ -+#include <linux/config.h> -+#include <linux/module.h> -+#include <linux/kernel.h> -+#include <linux/init.h> -+#include <linux/delay.h> -+#include <linux/pm.h> -+ -+#include <asm/hardware.h> -+#include <asm/system.h> -+#include <asm/pgtable.h> -+#include <asm/mach/map.h> -+ -+#include "generic.h" -+ -+/* -+ * Various clock factors driven by the CCCR register. -+ */ -+ -+/* Crystal Frequency to Memory Frequency Multiplier (L) */ -+static unsigned char L_clk_mult[32] = { 0, 27, 32, 36, 40, 45, 0, }; -+ -+/* Memory Frequency to Run Mode Frequency Multiplier (M) */ -+static unsigned char M_clk_mult[4] = { 0, 1, 2, 4 }; -+ -+/* Run Mode Frequency to Turbo Mode Frequency Multiplier (N) */ -+/* Note: we store the value N * 2 here. */ -+static unsigned char N2_clk_mult[8] = { 0, 0, 2, 3, 4, 0, 6, 0 }; -+ -+/* Crystal clock */ -+#define BASE_CLK 3686400 -+ -+/* -+ * Get the clock frequency as reflected by CCCR and the turbo flag. -+ * We assume these values have been applied via a fcs. -+ * If info is not 0 we also display the current settings. -+ */ -+unsigned int get_clk_frequency_khz( int info) -+{ -+ unsigned long cccr, turbo; -+ unsigned int l, L, m, M, n2, N; -+ -+ cccr = CCCR; -+ asm( "mrc\tp14, 0, %0, c6, c0, 0" : "=r" (turbo) ); -+ -+ l = L_clk_mult[(cccr >> 0) & 0x1f]; -+ m = M_clk_mult[(cccr >> 5) & 0x03]; -+ n2 = N2_clk_mult[(cccr >> 7) & 0x07]; -+ -+ L = l * BASE_CLK; -+ M = m * L; -+ N = n2 * M / 2; -+ -+ if( info) -+ { -+ L += 5000; -+ printk( KERN_INFO "Memory clock: %d.%02dMHz (*%d)\n", -+ L / 1000000, (L % 1000000) / 10000, l ); -+ M += 5000; -+ printk( KERN_INFO "Run Mode clock: %d.%02dMHz (*%d)\n", -+ M / 1000000, (M % 1000000) / 10000, m ); -+ N += 5000; -+ printk( KERN_INFO "Turbo Mode clock: %d.%02dMHz (*%d.%d, %sactive)\n", -+ N / 1000000, (N % 1000000) / 10000, n2 / 2, (n2 % 2) * 5, -+ (turbo & 1) ? "" : "in" ); -+ } -+ -+ return (turbo & 1) ? (N/1000) : (M/1000); -+} -+ -+EXPORT_SYMBOL(get_clk_frequency_khz); -+ -+/* -+ * Return the current lclk requency in units of 10kHz -+ */ -+unsigned int get_lclk_frequency_10khz(void) -+{ -+ return L_clk_mult[(CCCR >> 0) & 0x1f] * BASE_CLK / 10000; -+} -+ -+EXPORT_SYMBOL(get_lclk_frequency_10khz); -+ -+/* -+ * Handy function to set GPIO alternate functions -+ */ -+ -+void set_GPIO_mode(int gpio_mode) -+{ -+ long flags; -+ int gpio = gpio_mode & GPIO_MD_MASK_NR; -+ int fn = (gpio_mode & GPIO_MD_MASK_FN) >> 8; -+ int gafr; -+ -+ local_irq_save(flags); -+ if (gpio_mode & GPIO_MD_MASK_DIR) -+ GPDR(gpio) |= GPIO_bit(gpio); -+ else -+ GPDR(gpio) &= ~GPIO_bit(gpio); -+ gafr = GAFR(gpio) & ~(0x3 << (((gpio) & 0xf)*2)); -+ GAFR(gpio) = gafr | (fn << (((gpio) & 0xf)*2)); -+ local_irq_restore(flags); -+} -+ -+EXPORT_SYMBOL(set_GPIO_mode); -+ -+/* -+ * Note that 0xfffe0000-0xffffffff is reserved for the vector table and -+ * cache flush area. -+ */ -+static struct map_desc standard_io_desc[] __initdata = { -+ /* virtual physical length domain r w c b */ -+ { 0xf6000000, 0x20000000, 0x01000000, DOMAIN_IO, 0, 1, 0, 0 }, /* PCMCIA0 IO */ -+ { 0xf7000000, 0x30000000, 0x01000000, DOMAIN_IO, 0, 1, 0, 0 }, /* PCMCIA1 IO */ -+ { 0xf8000000, 0x40000000, 0x01800000, DOMAIN_IO, 0, 1, 0, 0 }, /* Devs */ -+ { 0xfa000000, 0x44000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 }, /* LCD */ -+ { 0xfc000000, 0x48000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 }, /* Mem Ctl */ -+ { 0xff000000, 0x00000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 }, /* UNCACHED_PHYS_0 */ -+ LAST_DESC -+}; -+ -+void __init pxa_map_io(void) -+{ -+ iotable_init(standard_io_desc); -+ get_clk_frequency_khz( 1); -+} ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/mach-pxa/generic.h 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,19 @@ -+/* -+ * linux/arch/arm/mach-pxa/generic.h -+ * -+ * Author: Nicolas Pitre -+ * Copyright: MontaVista Software Inc. -+ * -+ * 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. -+ */ -+ -+extern void __init pxa_map_io(void); -+extern void __init pxa_init_irq(void); -+ -+#define SET_BANK(__nr,__start,__size) \ -+ mi->bank[__nr].start = (__start), \ -+ mi->bank[__nr].size = (__size), \ -+ mi->bank[__nr].node = (((unsigned)(__start) - PHYS_OFFSET) >> 27) -+ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/mach-pxa/idp.c 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,142 @@ -+/* -+ * linux/arch/arm/mach-pxa/idp.c -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * Copyright (c) 2001 Cliff Brake, Accelent Systems Inc. -+ * -+ * 2001-09-13: Cliff Brake <cbrake@accelent.com> -+ * Initial code -+ */ -+#include <linux/init.h> -+#include <linux/major.h> -+#include <linux/fs.h> -+#include <linux/interrupt.h> -+#include <linux/sched.h> -+ -+#include <asm/types.h> -+#include <asm/setup.h> -+#include <asm/memory.h> -+#include <asm/mach-types.h> -+#include <asm/hardware.h> -+#include <asm/irq.h> -+ -+#include <asm/mach/arch.h> -+#include <asm/mach/map.h> -+#include <asm/mach/irq.h> -+ -+#include <asm/arch/irq.h> -+ -+#include "generic.h" -+ -+#define PXA_IDP_REV02 -+ -+#ifndef PXA_IDP_REV02 -+/* shadow registers for write only registers */ -+unsigned int idp_cpld_led_control_shadow = 0x1; -+unsigned int idp_cpld_periph_pwr_shadow = 0xd; -+unsigned int ipd_cpld_cir_shadow = 0; -+unsigned int idp_cpld_kb_col_high_shadow = 0; -+unsigned int idp_cpld_kb_col_low_shadow = 0; -+unsigned int idp_cpld_pccard_en_shadow = 0xC3; -+unsigned int idp_cpld_gpioh_dir_shadow = 0; -+unsigned int idp_cpld_gpioh_value_shadow = 0; -+unsigned int idp_cpld_gpiol_dir_shadow = 0; -+unsigned int idp_cpld_gpiol_value_shadow = 0; -+ -+/* -+ * enable all LCD signals -- they should still be on -+ * write protect flash -+ * enable all serial port transceivers -+ */ -+ -+unsigned int idp_control_port_shadow = ((0x7 << 21) | /* LCD power */ -+ (0x1 << 19) | /* disable flash write enable */ -+ (0x7 << 9)); /* enable serial port transeivers */ -+ -+#endif -+ -+static int __init idp_init(void) -+{ -+ printk("idp_init()\n"); -+ return 0; -+} -+ -+__initcall(idp_init); -+ -+static void __init idp_init_irq(void) -+{ -+ pxa_init_irq(); -+} -+ -+static void __init -+fixup_idp(struct machine_desc *desc, struct param_struct *params, -+ char **cmdline, struct meminfo *mi) -+{ -+#ifdef PXA_IDP_REV02 -+ SET_BANK (0, 0xa0000000, 64*1024*1024); -+#else -+ SET_BANK (0, 0xa0000000, 32*1024*1024); -+#endif -+ mi->nr_banks = 1; -+#if 0 -+ setup_ramdisk (1, 0, 0, 8192); -+ setup_initrd (__phys_to_virt(0xa1000000), 4*1024*1024); -+ ROOT_DEV = MKDEV(RAMDISK_MAJOR,0); -+#endif -+} -+ -+static struct map_desc idp_io_desc[] __initdata = { -+ /* virtual physical length domain r w c b */ -+ -+ -+#ifndef PXA_IDP_REV02 -+ { IDP_CTRL_PORT_BASE, -+ IDP_CTRL_PORT_PHYS, -+ IDP_CTRL_PORT_SIZE, -+ DOMAIN_IO, -+ 0, 1, 0, 0 }, -+#endif -+ -+ { IDP_IDE_BASE, -+ IDP_IDE_PHYS, -+ IDP_IDE_SIZE, -+ DOMAIN_IO, -+ 0, 1, 0, 0 }, -+ { IDP_ETH_BASE, -+ IDP_ETH_PHYS, -+ IDP_ETH_SIZE, -+ DOMAIN_IO, -+ 0, 1, 0, 0 }, -+ { IDP_COREVOLT_BASE, -+ IDP_COREVOLT_PHYS, -+ IDP_COREVOLT_SIZE, -+ DOMAIN_IO, -+ 0, 1, 0, 0 }, -+ { IDP_CPLD_BASE, -+ IDP_CPLD_PHYS, -+ IDP_CPLD_SIZE, -+ DOMAIN_IO, -+ 0, 1, 0, 0 }, -+ -+ LAST_DESC -+}; -+ -+static void __init idp_map_io(void) -+{ -+ pxa_map_io(); -+ iotable_init(idp_io_desc); -+ -+ set_GPIO_IRQ_edge(IRQ_TO_GPIO(TOUCH_PANEL_IRQ), TOUCH_PANEL_IRQ_EDGE); -+ set_GPIO_IRQ_edge(IRQ_TO_GPIO(SMC_IRQ), GPIO_RISING_EDGE); -+} -+ -+MACHINE_START(PXA_IDP, "Accelent Xscale IDP") -+ MAINTAINER("Accelent Systems Inc.") -+ BOOT_MEM(0xa0000000, 0x40000000, 0xfc000000) -+ FIXUP(fixup_idp) -+ MAPIO(idp_map_io) -+ INITIRQ(idp_init_irq) -+MACHINE_END ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/mach-pxa/innokom.c 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,129 @@ -+/* -+ * linux/arch/arm/mach-pxa/innokom.c -+ * -+ * (c) 2003 Robert Schwebel <r.schwebel@pengutronix.de>, Pengutronix -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+ */ -+ -+#include <linux/init.h> -+#include <linux/major.h> -+#include <linux/fs.h> -+#include <linux/interrupt.h> -+#include <linux/sched.h> -+ -+#include <asm/types.h> -+#include <asm/setup.h> -+#include <asm/memory.h> -+#include <asm/mach-types.h> -+#include <asm/hardware.h> -+#include <asm/irq.h> -+ -+#include <asm/mach/arch.h> -+#include <asm/mach/map.h> -+#include <asm/mach/irq.h> -+ -+#include <asm/arch/irq.h> -+#include <asm/arch/irqs.h> -+#include <asm/hardware/sa1111.h> -+ -+#include "generic.h" -+ -+ -+static void __init innokom_init_irq(void) -+{ -+ pxa_init_irq(); -+} -+ -+ -+void sw_update_handler( int irq, void* dev_id,struct pt_regs* regs) -+{ -+} -+ -+ -+void reset_handler( int irq, void* dev_id,struct pt_regs* regs) -+{ -+} -+ -+ -+static int __init innokom_init(void) -+{ -+ int sw_irq = GPIO_2_80_TO_IRQ(11); /* software update button */ -+ int reset_irq = GPIO_2_80_TO_IRQ(3); /* reset button */ -+ -+ set_GPIO_IRQ_edge(11,GPIO_FALLING_EDGE); -+ if (request_irq(sw_irq,sw_update_handler,SA_INTERRUPT,"software update button",NULL)) -+ printk(KERN_INFO "innokom: can't get assigned irq %i\n",sw_irq); -+ -+ set_GPIO_IRQ_edge(3,GPIO_FALLING_EDGE); -+ if (request_irq(reset_irq,reset_handler,SA_INTERRUPT,"reset button",NULL)) -+ printk(KERN_INFO "innokom: can't get assigned irq %i\n",reset_irq); -+ -+ return 0; -+} -+ -+ -+__initcall(innokom_init); -+ -+ -+static void __init -+fixup_innokom(struct machine_desc *desc, struct param_struct *params, -+ char **cmdline, struct meminfo *mi) -+{ -+ /* we probably want to get this information from the bootloader later */ -+ SET_BANK (0, 0xa0000000, 64*1024*1024); -+ mi->nr_banks = 1; -+} -+ -+ -+/* memory mapping */ -+static struct map_desc innokom_io_desc[] __initdata = { -+/* virtual physical length domain r w c b */ -+ { INNOKOM_ETH_BASE, INNOKOM_ETH_PHYS, INNOKOM_ETH_SIZE, DOMAIN_IO, 0, 1, 0, 0 }, /* ETH SMSC 91111 */ -+ LAST_DESC -+}; -+ -+static void __init innokom_map_io(void) -+{ -+ pxa_map_io(); -+ iotable_init(innokom_io_desc); -+ -+ /* Enable the BTUART */ -+ CKEN |= CKEN7_BTUART; -+ set_GPIO_mode(GPIO42_BTRXD_MD); -+ set_GPIO_mode(GPIO43_BTTXD_MD); -+ set_GPIO_mode(GPIO44_BTCTS_MD); -+ set_GPIO_mode(GPIO45_BTRTS_MD); -+ -+ set_GPIO_mode(GPIO33_nCS_5_MD); /* SMSC network chip */ -+ -+ /* setup sleep mode values */ -+ PWER = 0x00000002; -+ PFER = 0x00000000; -+ PRER = 0x00000002; -+ PGSR0 = 0x00008000; -+ PGSR1 = 0x003F0202; -+ PGSR2 = 0x0001C000; -+ PCFR |= PCFR_OPDE; -+} -+ -+MACHINE_START(INNOKOM, "Auerswald Innokom") -+ MAINTAINER("Robert Schwebel, Pengutronix") -+ BOOT_MEM(0xa0000000, 0x40000000, io_p2v(0x40000000)) -+ BOOT_PARAMS(0xa0000100) -+ FIXUP(fixup_innokom) -+ MAPIO(innokom_map_io) -+ INITIRQ(innokom_init_irq) -+MACHINE_END ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/mach-pxa/irq.c 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,282 @@ -+/* -+ * linux/arch/arm/mach-pxa/irq.c -+ * -+ * Generic PXA IRQ handling, GPIO IRQ demultiplexing, etc. -+ * -+ * Author: Nicolas Pitre -+ * Created: Jun 15, 2001 -+ * Copyright: MontaVista Software Inc. -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ */ -+ -+#include <linux/init.h> -+#include <linux/module.h> -+#include <linux/sched.h> -+#include <linux/interrupt.h> -+#include <linux/ptrace.h> -+ -+#include <asm/hardware.h> -+#include <asm/irq.h> -+#include <asm/mach/irq.h> -+#include <asm/arch/irq.h> -+ -+#include "generic.h" -+ -+ -+/* -+ * PXA GPIO edge detection for IRQs: -+ * IRQs are generated on Falling-Edge, Rising-Edge, or both. -+ * This must be called *before* the appropriate IRQ is registered. -+ * Use this instead of directly setting GRER/GFER. -+ */ -+ -+static int GPIO_IRQ_rising_edge[3]; -+static int GPIO_IRQ_falling_edge[3]; -+ -+void set_GPIO_IRQ_edge (int gpio_nr, int edge) -+{ -+ long flags; -+ local_irq_save(flags); -+ set_GPIO_mode(gpio_nr | GPIO_IN); -+ if (edge & GPIO_FALLING_EDGE) -+ set_bit (gpio_nr, GPIO_IRQ_falling_edge); -+ else -+ clear_bit (gpio_nr, GPIO_IRQ_falling_edge); -+ if (edge & GPIO_RISING_EDGE) -+ set_bit (gpio_nr, GPIO_IRQ_rising_edge); -+ else -+ clear_bit (gpio_nr, GPIO_IRQ_rising_edge); -+ irq_desc[IRQ_GPIO(gpio_nr)].valid = 1; -+ local_irq_restore(flags); -+} -+ -+EXPORT_SYMBOL(set_GPIO_IRQ_edge); -+ -+ -+/* -+ * We don't need to ACK IRQs on the PXA unless they're GPIOs -+ * this is for IRQs known as PXA_IRQ([10...31]). -+ */ -+ -+static void pxa_mask_irq(unsigned int irq) -+{ -+ ICMR &= ~(1 << (irq + PXA_IRQ_SKIP)); -+} -+ -+static void pxa_unmask_irq(unsigned int irq) -+{ -+ ICMR |= (1 << (irq + PXA_IRQ_SKIP)); -+} -+ -+/* -+ * GPIO IRQs must be acknoledged. This is for GPIO 0 and 1. -+ */ -+ -+static void pxa_mask_and_ack_GPIO_0_1_irq(unsigned int irq) -+{ -+ ICMR &= ~(1 << (irq + PXA_IRQ_SKIP)); -+ GEDR0 = (1 << (irq - IRQ_GPIO0)); -+} -+ -+static void pxa_mask_GPIO_0_1_irq(unsigned int irq) -+{ -+ ICMR &= ~(1 << (irq + PXA_IRQ_SKIP)); -+} -+ -+static void pxa_unmask_GPIO_0_1_irq(unsigned int irq) -+{ -+ int gpio = irq - IRQ_GPIO0; -+ GRER0 = (GRER0 & ~(1 << gpio))|(GPIO_IRQ_rising_edge[0] & (1 << gpio)); -+ GFER0 = (GFER0 & ~(1 << gpio))|(GPIO_IRQ_falling_edge[0] & (1 << gpio)); -+ ICMR |= (1 << (irq + PXA_IRQ_SKIP)); -+} -+ -+/* -+ * Demux handler for GPIO 2-80 edge detect interrupts -+ */ -+ -+static int GPIO_2_80_enabled[3]; /* enabled i.e. unmasked GPIO IRQs */ -+static int GPIO_2_80_spurious[3]; /* GPIOs that triggered when masked */ -+ -+static void pxa_GPIO_2_80_demux(int irq, void *dev_id, -+ struct pt_regs *regs) -+{ -+ int i, gedr, spurious; -+ -+ while ((gedr = (GEDR0 & ~3))) { -+ /* -+ * We don't want to clear GRER/GFER when the corresponding -+ * IRQ is masked because we could miss a level transition -+ * i.e. an IRQ which need servicing as soon as it is -+ * unmasked. However, such situation should happen only -+ * during the loop below. Thus all IRQs which aren't -+ * enabled at this point are considered spurious. Those -+ * are cleared but only de-activated if they happen twice. -+ */ -+ spurious = gedr & ~GPIO_2_80_enabled[0]; -+ if (spurious) { -+ GEDR0 = spurious; -+ GRER0 &= ~(spurious & GPIO_2_80_spurious[0]); -+ GFER0 &= ~(spurious & GPIO_2_80_spurious[0]); -+ GPIO_2_80_spurious[0] |= spurious; -+ gedr ^= spurious; -+ if (!gedr) continue; -+ } -+ -+ for (i = 2; i < 32; ++i) { -+ if (gedr & (1<<i)) { -+ do_IRQ (IRQ_GPIO(2) + i - 2, regs); -+ } -+ } -+ } -+ while ((gedr = GEDR1)) { -+ spurious = gedr & ~GPIO_2_80_enabled[1]; -+ if (spurious) { -+ GEDR1 = spurious; -+ GRER1 &= ~(spurious & GPIO_2_80_spurious[1]); -+ GFER1 &= ~(spurious & GPIO_2_80_spurious[1]); -+ GPIO_2_80_spurious[1] |= spurious; -+ gedr ^= spurious; -+ if (!gedr) continue; -+ } -+ -+ for (i = 0; i < 32; ++i) { -+ if (gedr & (1<<i)) { -+ do_IRQ (IRQ_GPIO(32) + i, regs); -+ } -+ } -+ } -+ while ((gedr = (GEDR2 & 0x0001ffff))) { -+ spurious = gedr & ~GPIO_2_80_enabled[2]; -+ if (spurious) { -+ GEDR2 = spurious; -+ GRER2 &= ~(spurious & GPIO_2_80_spurious[2]); -+ GFER2 &= ~(spurious & GPIO_2_80_spurious[2]); -+ GPIO_2_80_spurious[2] |= spurious; -+ gedr ^= spurious; -+ if (!gedr) continue; -+ } -+ -+ for (i = 0; i < 17; ++i) { -+ if (gedr & (1<<i)) { -+ do_IRQ (IRQ_GPIO(64) + i, regs); -+ } -+ } -+ } -+} -+ -+static struct irqaction GPIO_2_80_irqaction = { -+ name: "GPIO 2-80", -+ handler: pxa_GPIO_2_80_demux, -+ flags: SA_INTERRUPT -+}; -+ -+#define GRER_x(i) (*(&GRER0 + (i))) -+#define GFER_x(i) (*(&GFER0 + (i))) -+#define GEDR_x(i) (*(&GEDR0 + (i))) -+#define GPLR_x(i) (*(&GPLR0 + (i))) -+ -+static void pxa_mask_and_ack_GPIO_2_80_irq(unsigned int irq) -+{ -+ int gpio_nr = IRQ_TO_GPIO_2_80(irq); -+ int mask = 1 << (gpio_nr & 0x1f); -+ int index = gpio_nr >> 5; -+ GPIO_2_80_spurious[index] &= ~mask; -+ GPIO_2_80_enabled[index] &= ~mask; -+ GEDR_x(index) = mask; -+} -+ -+static void pxa_mask_GPIO_2_80_irq(unsigned int irq) -+{ -+ int gpio_nr = IRQ_TO_GPIO_2_80(irq); -+ int mask = 1 << (gpio_nr & 0x1f); -+ int index = gpio_nr >> 5; -+ GPIO_2_80_spurious[index] &= ~mask; -+ GPIO_2_80_enabled[index] &= ~mask; -+} -+ -+static void pxa_unmask_GPIO_2_80_irq(unsigned int irq) -+{ -+ int gpio_nr = IRQ_TO_GPIO_2_80(irq); -+ int mask = 1 << (gpio_nr & 0x1f); -+ int index = gpio_nr >> 5; -+ if (GPIO_2_80_spurious[index] & mask) { -+ /* -+ * We don't want to miss an interrupt that would have occurred -+ * while it was masked. Simulate it if it is the case. -+ */ -+ int state = GPLR_x(index); -+ if (((state & GPIO_IRQ_rising_edge[index]) | -+ (~state & GPIO_IRQ_falling_edge[index])) & mask) -+ { -+ /* just in case it gets referenced: */ -+ struct pt_regs dummy; -+ -+ memzero(&dummy, sizeof(dummy)); -+ do_IRQ(irq, &dummy); -+ -+ /* we are being called recursively from do_IRQ() */ -+ return; -+ } -+ } -+ GPIO_2_80_enabled[index] |= mask; -+ GRER_x(index) = -+ (GRER_x(index) & ~mask) | (GPIO_IRQ_rising_edge[index] & mask); -+ GFER_x(index) = -+ (GFER_x(index) & ~mask) | (GPIO_IRQ_falling_edge[index] & mask); -+} -+ -+ -+void __init pxa_init_irq(void) -+{ -+ int irq; -+ -+ /* disable all IRQs */ -+ ICMR = 0; -+ -+ /* all IRQs are IRQ, not FIQ */ -+ ICLR = 0; -+ -+ /* clear all GPIO edge detects */ -+ GFER0 = GFER1 = GFER2 = 0; -+ GRER0 = GRER1 = GRER2 = 0; -+ GEDR0 = GEDR0; -+ GEDR1 = GEDR1; -+ GEDR2 = GEDR2; -+ -+ /* only unmasked interrupts kick us out of idle */ -+ ICCR = 1; -+ -+ for (irq = PXA_IRQ(PXA_IRQ_SKIP); irq <= PXA_IRQ(31); irq++) { -+ irq_desc[irq].valid = 1; -+ irq_desc[irq].probe_ok = 0; -+ irq_desc[irq].mask_ack = pxa_mask_irq; -+ irq_desc[irq].mask = pxa_mask_irq; -+ irq_desc[irq].unmask = pxa_unmask_irq; -+ } -+ -+ /* -+ * Note: GPIO IRQs are initially invalid until set_GPIO_IRQ_edge() -+ * is called at least once. -+ */ -+ -+ for (irq = IRQ_GPIO0; irq <= IRQ_GPIO1; irq++) { -+ irq_desc[irq].valid = 0; -+ irq_desc[irq].probe_ok = 1; -+ irq_desc[irq].mask_ack = pxa_mask_and_ack_GPIO_0_1_irq; -+ irq_desc[irq].mask = pxa_mask_GPIO_0_1_irq; -+ irq_desc[irq].unmask = pxa_unmask_GPIO_0_1_irq; -+ } -+ -+ for (irq = IRQ_GPIO(2); irq <= IRQ_GPIO(80); irq++) { -+ irq_desc[irq].valid = 0; -+ irq_desc[irq].probe_ok = 1; -+ irq_desc[irq].mask_ack = pxa_mask_and_ack_GPIO_2_80_irq; -+ irq_desc[irq].mask = pxa_mask_GPIO_2_80_irq; -+ irq_desc[irq].unmask = pxa_unmask_GPIO_2_80_irq; -+ } -+ setup_arm_irq( IRQ_GPIO_2_80, &GPIO_2_80_irqaction ); -+} ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/mach-pxa/leds-cerf.c 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,135 @@ -+/* -+ * linux/arch/arm/mach-pxa/leds-cerf.c -+ * -+ * Copyright (C) 2000 John Dorsey <john+@cs.cmu.edu> -+ * -+ * Copyright (c) 2001 Jeff Sutherland <jeffs@accelent.com> -+ * -+ * Original (leds-footbridge.c) by Russell King -+ * -+ * 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/config.h> -+#include <linux/init.h> -+ -+#include <asm/hardware.h> -+#include <asm/leds.h> -+#include <asm/system.h> -+ -+#include "leds.h" -+ -+ -+#define LED_STATE_ENABLED 1 -+#define LED_STATE_CLAIMED 2 -+ -+static unsigned int led_state; -+static unsigned int hw_led_state; -+ -+void pxa_cerf_leds_event(led_event_t evt) -+{ -+ unsigned long flags; -+ -+ local_irq_save(flags); -+ -+ switch (evt) { -+ case led_start: -+ hw_led_state = CERF_HEARTBEAT_LED; -+ led_state = LED_STATE_ENABLED; -+ break; -+ -+ case led_stop: -+ led_state &= ~LED_STATE_ENABLED; -+ break; -+ -+ case led_claim: -+ led_state |= LED_STATE_CLAIMED; -+ hw_led_state = CERF_HEARTBEAT_LED; -+ break; -+ -+ case led_release: -+ led_state &= ~LED_STATE_CLAIMED; -+ hw_led_state = CERF_HEARTBEAT_LED; -+ break; -+ -+#ifdef CONFIG_LEDS_TIMER -+ case led_timer: -+ if (!(led_state & LED_STATE_CLAIMED)) -+ hw_led_state ^= CERF_HEARTBEAT_LED; -+ break; -+#endif -+ -+#ifdef CONFIG_LEDS_CPU -+ case led_idle_start: -+ if (!(led_state & LED_STATE_CLAIMED)) -+ hw_led_state |= CERF_SYS_BUSY_LED; -+ break; -+ -+ case led_idle_end: -+ if (!(led_state & LED_STATE_CLAIMED)) -+ hw_led_state &= ~CERF_SYS_BUSY_LED; -+ break; -+#endif -+ -+ case led_halted: -+ break; -+ -+ case led_green_on: -+ if (led_state & LED_STATE_CLAIMED) -+ hw_led_state &= ~CERF_HEARTBEAT_LED; -+ break; -+ -+ case led_green_off: -+ if (led_state & LED_STATE_CLAIMED) -+ hw_led_state |= CERF_HEARTBEAT_LED; -+ break; -+ -+ case led_amber_on: -+ break; -+ -+ case led_amber_off: -+ break; -+ -+#ifndef CONFIG_PXA_CERF_PDA -+ case led_red_on: -+ if (led_state & LED_STATE_CLAIMED) -+ hw_led_state &= ~CERF_SYS_BUSY_LED; -+ break; -+ -+ case led_red_off: -+ if (led_state & LED_STATE_CLAIMED) -+ hw_led_state |= CERF_SYS_BUSY_LED; -+ break; -+#endif -+ default: -+ break; -+ } -+ -+ if (led_state & LED_STATE_ENABLED) -+ { -+ switch (hw_led_state) { -+ case 0: // all on -+ CERF_HEARTBEAT_LED_ON; -+ CERF_SYS_BUSY_LED_ON; -+ break; -+ case 1: // turn off heartbeat, status on: -+ CERF_HEARTBEAT_LED_OFF; -+ CERF_SYS_BUSY_LED_ON; -+ break; -+ case 2: // status off, heartbeat on: -+ CERF_HEARTBEAT_LED_ON; -+ CERF_SYS_BUSY_LED_OFF; -+ break; -+ case 3: // turn them both off... -+ CERF_HEARTBEAT_LED_OFF; -+ CERF_SYS_BUSY_LED_OFF; -+ break; -+ default: -+ break; -+ } -+ } -+ local_irq_restore(flags); -+} ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/mach-pxa/leds-idp.c 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,112 @@ -+/* -+ * linux/arch/arm/mach-pxa/leds-idp.c -+ * -+ * Copyright (C) 2000 John Dorsey <john+@cs.cmu.edu> -+ * -+ * Copyright (c) 2001 Jeff Sutherland <jeffs@accelent.com> -+ * -+ * Original (leds-footbridge.c) by Russell King -+ * -+ * Macros for actual LED manipulation should be in machine specific -+ * files in this 'mach' directory. -+ */ -+ -+ -+#include <linux/config.h> -+#include <linux/init.h> -+ -+#include <asm/hardware.h> -+#include <asm/leds.h> -+#include <asm/system.h> -+ -+#include "leds.h" -+ -+#define LED_STATE_ENABLED 1 -+#define LED_STATE_CLAIMED 2 -+ -+static unsigned int led_state; -+static unsigned int hw_led_state; -+ -+void idp_leds_event(led_event_t evt) -+{ -+ unsigned long flags; -+ -+ local_irq_save(flags); -+ -+ switch (evt) { -+ case led_start: -+ hw_led_state = IDP_HB_LED | IDP_BUSY_LED; -+ led_state = LED_STATE_ENABLED; -+ break; -+ -+ case led_stop: -+ led_state &= ~LED_STATE_ENABLED; -+ break; -+ -+ case led_claim: -+ led_state |= LED_STATE_CLAIMED; -+ hw_led_state = IDP_HB_LED | IDP_BUSY_LED; -+ break; -+ -+ case led_release: -+ led_state &= ~LED_STATE_CLAIMED; -+ hw_led_state = IDP_HB_LED | IDP_BUSY_LED; -+ break; -+ -+#ifdef CONFIG_LEDS_TIMER -+ case led_timer: -+ if (!(led_state & LED_STATE_CLAIMED)) -+ hw_led_state ^= IDP_HB_LED; -+ break; -+#endif -+ -+#ifdef CONFIG_LEDS_CPU -+ case led_idle_start: -+ if (!(led_state & LED_STATE_CLAIMED)) -+ hw_led_state |= IDP_BUSY_LED; -+ break; -+ -+ case led_idle_end: -+ if (!(led_state & LED_STATE_CLAIMED)) -+ hw_led_state &= ~IDP_BUSY_LED; -+ break; -+#endif -+ -+ case led_halted: -+ break; -+ -+ case led_green_on: -+ if (led_state & LED_STATE_CLAIMED) -+ hw_led_state &= ~IDP_HB_LED; -+ break; -+ -+ case led_green_off: -+ if (led_state & LED_STATE_CLAIMED) -+ hw_led_state |= IDP_HB_LED; -+ break; -+ -+ case led_amber_on: -+ break; -+ -+ case led_amber_off: -+ break; -+ -+ case led_red_on: -+ if (led_state & LED_STATE_CLAIMED) -+ hw_led_state &= ~IDP_BUSY_LED; -+ break; -+ -+ case led_red_off: -+ if (led_state & LED_STATE_CLAIMED) -+ hw_led_state |= IDP_BUSY_LED; -+ break; -+ -+ default: -+ break; -+ } -+ -+ if (led_state & LED_STATE_ENABLED) -+ IDP_WRITE_LEDS(hw_led_state); -+ -+ local_irq_restore(flags); -+} ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/mach-pxa/leds-lubbock.c 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,134 @@ -+/* -+ * linux/arch/arm/mach-pxa/leds-lubbock.c -+ * -+ * Copyright (C) 2000 John Dorsey <john+@cs.cmu.edu> -+ * -+ * Copyright (c) 2001 Jeff Sutherland <jeffs@accelent.com> -+ * -+ * Original (leds-footbridge.c) by Russell King -+ * -+ * See leds.h for bit definitions. The first version defines D28 on the -+ * Lubbock dev board as the heartbeat, and D27 as the Sys_busy led. -+ * There's plenty more if you're interested in adding them :) -+ */ -+ -+ -+#include <linux/config.h> -+#include <linux/init.h> -+ -+#include <asm/hardware.h> -+#include <asm/leds.h> -+#include <asm/system.h> -+ -+#include "leds.h" -+ -+ -+#define LED_STATE_ENABLED 1 -+#define LED_STATE_CLAIMED 2 -+ -+static unsigned int led_state; -+static unsigned int hw_led_state; -+ -+void lubbock_leds_event(led_event_t evt) -+{ -+ unsigned long flags; -+ -+ local_irq_save(flags); -+ -+ switch (evt) { -+ case led_start: -+ hw_led_state = HEARTBEAT_LED | SYS_BUSY_LED; -+ led_state = LED_STATE_ENABLED; -+ break; -+ -+ case led_stop: -+ led_state &= ~LED_STATE_ENABLED; -+ break; -+ -+ case led_claim: -+ led_state |= LED_STATE_CLAIMED; -+ hw_led_state = HEARTBEAT_LED | SYS_BUSY_LED; -+ break; -+ -+ case led_release: -+ led_state &= ~LED_STATE_CLAIMED; -+ hw_led_state = HEARTBEAT_LED | SYS_BUSY_LED; -+ break; -+ -+#ifdef CONFIG_LEDS_TIMER -+ case led_timer: -+ if (!(led_state & LED_STATE_CLAIMED)) -+ hw_led_state ^= HEARTBEAT_LED; -+ break; -+#endif -+ -+#ifdef CONFIG_LEDS_CPU -+ case led_idle_start: -+ if (!(led_state & LED_STATE_CLAIMED)) -+ hw_led_state |= SYS_BUSY_LED; -+ break; -+ -+ case led_idle_end: -+ if (!(led_state & LED_STATE_CLAIMED)) -+ hw_led_state &= ~SYS_BUSY_LED; -+ break; -+#endif -+ -+ case led_halted: -+ break; -+ -+ case led_green_on: -+ if (led_state & LED_STATE_CLAIMED) -+ hw_led_state &= ~HEARTBEAT_LED; -+ break; -+ -+ case led_green_off: -+ if (led_state & LED_STATE_CLAIMED) -+ hw_led_state |= HEARTBEAT_LED; -+ break; -+ -+ case led_amber_on: -+ break; -+ -+ case led_amber_off: -+ break; -+ -+ case led_red_on: -+ if (led_state & LED_STATE_CLAIMED) -+ hw_led_state &= ~SYS_BUSY_LED; -+ break; -+ -+ case led_red_off: -+ if (led_state & LED_STATE_CLAIMED) -+ hw_led_state |= SYS_BUSY_LED; -+ break; -+ -+ default: -+ break; -+ } -+ -+ if (led_state & LED_STATE_ENABLED) -+ { -+ switch (hw_led_state) { -+ case 0: // all on -+ HEARTBEAT_LED_ON; -+ SYS_BUSY_LED_ON; -+ break; -+ case 1: // turn off heartbeat, status on: -+ HEARTBEAT_LED_OFF; -+ SYS_BUSY_LED_ON; -+ break; -+ case 2: // status off, heartbeat on: -+ HEARTBEAT_LED_ON; -+ SYS_BUSY_LED_OFF; -+ break; -+ case 3: // turn them both off... -+ HEARTBEAT_LED_OFF; -+ SYS_BUSY_LED_OFF; -+ break; -+ default: -+ break; -+ } -+ } -+ local_irq_restore(flags); -+} ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/mach-pxa/leds.c 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,32 @@ -+/* -+ * linux/arch/arm/mach-pxa/leds.c -+ * -+ * xscale LEDs dispatcher -+ * -+ * Copyright (C) 2001 Nicolas Pitre -+ * -+ * Copyright (c) 2001 Jeff Sutherland, Accelent Systems Inc. -+ */ -+#include <linux/config.h> -+#include <linux/init.h> -+ -+#include <asm/leds.h> -+#include <asm/mach-types.h> -+ -+#include "leds.h" -+ -+static int __init -+pxa_leds_init(void) -+{ -+ if (machine_is_lubbock()) -+ leds_event = lubbock_leds_event; -+ if (machine_is_pxa_idp()) -+ leds_event = idp_leds_event; -+ if (machine_is_pxa_cerf()) -+ leds_event = pxa_cerf_leds_event; -+ -+ leds_event(led_start); -+ return 0; -+} -+ -+__initcall(pxa_leds_init); ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/mach-pxa/leds.h 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,12 @@ -+/* -+ * include/asm-arm/arch-pxa/leds.h -+ * -+ * Copyright (c) 2001 Jeff Sutherland, Accelent Systems Inc. -+ * -+ * blinky lights for various PXA-based systems: -+ * -+ */ -+ -+extern void lubbock_leds_event(led_event_t evt); -+extern void idp_leds_event(led_event_t evt); -+extern void pxa_cerf_leds_event(led_event_t evt); ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/mach-pxa/lubbock.c 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,157 @@ -+/* -+ * linux/arch/arm/mach-pxa/lubbock.c -+ * -+ * Support for the Intel DBPXA250 Development Platform. -+ * -+ * Author: Nicolas Pitre -+ * Created: Jun 15, 2001 -+ * Copyright: MontaVista Software Inc. -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ */ -+#include <linux/init.h> -+#include <linux/major.h> -+#include <linux/fs.h> -+#include <linux/interrupt.h> -+#include <linux/sched.h> -+#include <linux/bitops.h> -+ -+#include <asm/types.h> -+#include <asm/setup.h> -+#include <asm/memory.h> -+#include <asm/mach-types.h> -+#include <asm/hardware.h> -+#include <asm/irq.h> -+ -+#include <asm/mach/arch.h> -+#include <asm/mach/map.h> -+#include <asm/mach/irq.h> -+ -+#include <asm/arch/irq.h> -+#include <asm/hardware/sa1111.h> -+ -+#include "generic.h" -+ -+#ifdef CONFIG_SA1111 -+ #include "sa1111.h" -+#endif -+ -+ -+static unsigned long lubbock_irq_enabled; -+ -+static void lubbock_mask_irq(unsigned int irq) -+{ -+ int lubbock_irq = (irq - LUBBOCK_IRQ(0)); -+ LUB_IRQ_MASK_EN = (lubbock_irq_enabled &= ~(1 << lubbock_irq)); -+} -+ -+static void lubbock_unmask_irq(unsigned int irq) -+{ -+ int lubbock_irq = (irq - LUBBOCK_IRQ(0)); -+ /* the irq can be acknowledged only if deasserted, so it's done here */ -+ LUB_IRQ_SET_CLR &= ~(1 << lubbock_irq); -+ LUB_IRQ_MASK_EN = (lubbock_irq_enabled |= (1 << lubbock_irq)); -+} -+ -+void lubbock_irq_demux(int irq, void *dev_id, struct pt_regs *regs) -+{ -+ unsigned long pending = LUB_IRQ_SET_CLR & lubbock_irq_enabled; -+ do { -+ GEDR(0) = GPIO_bit(0); /* clear useless edge notification */ -+ if (likely(pending)) -+ do_IRQ( LUBBOCK_IRQ(0) + __ffs(pending), regs ); -+ pending = LUB_IRQ_SET_CLR & lubbock_irq_enabled; -+ } while (pending); -+} -+ -+static struct irqaction lubbock_irq = { -+ name: "Lubbock FPGA", -+ handler: lubbock_irq_demux, -+ flags: SA_INTERRUPT -+}; -+ -+static void __init lubbock_init_irq(void) -+{ -+ int irq; -+ -+ pxa_init_irq(); -+ -+ /* setup extra lubbock irqs */ -+ for(irq = LUBBOCK_IRQ(0); irq <= LUBBOCK_LAST_IRQ; irq++) { -+ irq_desc[irq].valid = 1; -+ irq_desc[irq].probe_ok = 1; -+ irq_desc[irq].mask_ack = lubbock_mask_irq; -+ irq_desc[irq].mask = lubbock_mask_irq; -+ irq_desc[irq].unmask = lubbock_unmask_irq; -+ } -+ -+ set_GPIO_IRQ_edge(GPIO_LUBBOCK_IRQ, GPIO_FALLING_EDGE); -+ setup_arm_irq(IRQ_GPIO_LUBBOCK_IRQ, &lubbock_irq); -+} -+ -+static int __init lubbock_init(void) -+{ -+ int ret; -+ -+ ret = sa1111_probe(LUBBOCK_SA1111_BASE); -+ if (ret) -+ return ret; -+ sa1111_wake(); -+ sa1111_init_irq(LUBBOCK_SA1111_IRQ); -+ return 0; -+} -+ -+__initcall(lubbock_init); -+ -+static void __init -+fixup_lubbock(struct machine_desc *desc, struct param_struct *params, -+ char **cmdline, struct meminfo *mi) -+{ -+ /* Some boards have 32MB some 64MB. Let's use a safe default */ -+ SET_BANK (0, 0xa0000000, 32*1024*1024); -+ mi->nr_banks = 1; -+} -+ -+static struct map_desc lubbock_io_desc[] __initdata = { -+ /* virtual physical length domain r w c b */ -+ { 0xf0000000, 0x08000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 }, /* CPLD */ -+ { 0xf1000000, 0x0c000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 }, /* LAN91C96 IO */ -+ { 0xf1100000, 0x0e000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 }, /* LAN91C96 Attr */ -+ { 0xf4000000, 0x10000000, 0x00400000, DOMAIN_IO, 0, 1, 0, 0 }, /* SA1111 */ -+ LAST_DESC -+}; -+ -+static void __init lubbock_map_io(void) -+{ -+ pxa_map_io(); -+ iotable_init(lubbock_io_desc); -+ -+ /* This enables the BTUART */ -+ CKEN |= CKEN7_BTUART; -+ set_GPIO_mode(GPIO42_BTRXD_MD); -+ set_GPIO_mode(GPIO43_BTTXD_MD); -+ set_GPIO_mode(GPIO44_BTCTS_MD); -+ set_GPIO_mode(GPIO45_BTRTS_MD); -+ -+ /* This is for the SMC chip select */ -+ set_GPIO_mode(GPIO79_nCS_3_MD); -+ -+ /* setup sleep mode values */ -+ PWER = 0x00000002; -+ PFER = 0x00000000; -+ PRER = 0x00000002; -+ PGSR0 = 0x00008000; -+ PGSR1 = 0x003F0202; -+ PGSR2 = 0x0001C000; -+ PCFR |= PCFR_OPDE; -+} -+ -+MACHINE_START(LUBBOCK, "Intel DBPXA250 Development Platform") -+ MAINTAINER("MontaVista Software Inc.") -+ BOOT_MEM(0xa0000000, 0x40000000, io_p2v(0x40000000)) -+ FIXUP(fixup_lubbock) -+ MAPIO(lubbock_map_io) -+ INITIRQ(lubbock_init_irq) -+MACHINE_END ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/mach-pxa/pm.c 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,265 @@ -+/* -+ * PXA250/210 Power Management Routines -+ * -+ * Original code for the SA11x0: -+ * Copyright (c) 2001 Cliff Brake <cbrake@accelent.com> -+ * -+ * Modified for the PXA250 by Nicolas Pitre: -+ * Copyright (c) 2002 Monta Vista Software, Inc. -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License. -+ */ -+ -+#include <linux/config.h> -+#include <linux/init.h> -+#include <linux/pm.h> -+#include <linux/slab.h> -+#include <linux/sched.h> -+#include <linux/interrupt.h> -+#include <linux/sysctl.h> -+#include <linux/errno.h> -+ -+#include <asm/hardware.h> -+#include <asm/memory.h> -+#include <asm/system.h> -+#include <asm/leds.h> -+ -+ -+/* -+ * Debug macros -+ */ -+#undef DEBUG -+ -+extern void pxa_cpu_suspend(void); -+extern void pxa_cpu_resume(void); -+ -+#define SAVE(x) sleep_save[SLEEP_SAVE_##x] = x -+#define RESTORE(x) x = sleep_save[SLEEP_SAVE_##x] -+ -+/* -+ * List of global PXA peripheral registers to preserve. -+ * More ones like CP and general purpose register values are preserved -+ * with the stack pointer in sleep.S. -+ */ -+enum { SLEEP_SAVE_START = 0, -+ -+ SLEEP_SAVE_OSCR, SLEEP_SAVE_OIER, -+ SLEEP_SAVE_OSMR0, SLEEP_SAVE_OSMR1, SLEEP_SAVE_OSMR2, SLEEP_SAVE_OSMR3, -+ -+ SLEEP_SAVE_GPDR0, SLEEP_SAVE_GPDR1, SLEEP_SAVE_GPDR2, -+ SLEEP_SAVE_GRER0, SLEEP_SAVE_GRER1, SLEEP_SAVE_GRER2, -+ SLEEP_SAVE_GFER0, SLEEP_SAVE_GFER1, SLEEP_SAVE_GFER2, -+ SLEEP_SAVE_GAFR0_L, SLEEP_SAVE_GAFR1_L, SLEEP_SAVE_GAFR2_L, -+ SLEEP_SAVE_GAFR0_U, SLEEP_SAVE_GAFR1_U, SLEEP_SAVE_GAFR2_U, -+ -+ SLEEP_SAVE_FFIER, SLEEP_SAVE_FFLCR, SLEEP_SAVE_FFMCR, -+ SLEEP_SAVE_FFSPR, SLEEP_SAVE_FFISR, -+ SLEEP_SAVE_FFDLL, SLEEP_SAVE_FFDLH, -+ -+ SLEEP_SAVE_ICMR, -+ SLEEP_SAVE_CKEN, -+ -+ SLEEP_SAVE_CKSUM, -+ -+ SLEEP_SAVE_SIZE -+}; -+ -+ -+int pm_do_suspend(void) -+{ -+ unsigned long sleep_save[SLEEP_SAVE_SIZE]; -+ unsigned long checksum = 0; -+ int i; -+ -+ cli(); -+ clf(); -+ -+ leds_event(led_stop); -+ -+ /* preserve current time */ -+ RCNR = xtime.tv_sec; -+ -+ /* -+ * Temporary solution. This won't be necessary once -+ * we move pxa support into the serial/* driver -+ * Save the FF UART -+ */ -+ SAVE(FFIER); -+ SAVE(FFLCR); -+ SAVE(FFMCR); -+ SAVE(FFSPR); -+ SAVE(FFISR); -+ FFLCR |= 0x80; -+ SAVE(FFDLL); -+ SAVE(FFDLH); -+ FFLCR &= 0xef; -+ -+ /* save vital registers */ -+ SAVE(OSCR); -+ SAVE(OSMR0); -+ SAVE(OSMR1); -+ SAVE(OSMR2); -+ SAVE(OSMR3); -+ SAVE(OIER); -+ -+ SAVE(GPDR0); SAVE(GPDR1); SAVE(GPDR2); -+ SAVE(GRER0); SAVE(GRER1); SAVE(GRER2); -+ SAVE(GFER0); SAVE(GFER1); SAVE(GFER2); -+ SAVE(GAFR0_L); SAVE(GAFR0_U); -+ SAVE(GAFR1_L); SAVE(GAFR1_U); -+ SAVE(GAFR2_L); SAVE(GAFR2_U); -+ -+ SAVE(ICMR); -+ ICMR = 0; -+ -+ SAVE(CKEN); -+ CKEN = 0; -+ -+ /* Note: wake up source are set up in each machine specific files */ -+ -+ /* clear GPIO transition detect bits */ -+ GEDR0 = GEDR0; GEDR1 = GEDR1; GEDR2 = GEDR2; -+ -+ /* Clear sleep reset status */ -+ RCSR = RCSR_SMR; -+ -+ /* set resume return address */ -+ PSPR = virt_to_phys(pxa_cpu_resume); -+ -+ /* before sleeping, calculate and save a checksum */ -+ for (i = 0; i < SLEEP_SAVE_SIZE - 1; i++) -+ checksum += sleep_save[i]; -+ sleep_save[SLEEP_SAVE_CKSUM] = checksum; -+ -+ /* *** go zzz *** */ -+ pxa_cpu_suspend(); -+ -+ /* after sleeping, validate the checksum */ -+ checksum = 0; -+ for (i = 0; i < SLEEP_SAVE_SIZE - 1; i++) -+ checksum += sleep_save[i]; -+ -+ /* if invalid, display message and wait for a hardware reset */ -+ if (checksum != sleep_save[SLEEP_SAVE_CKSUM]) { -+#ifdef CONFIG_ARCH_LUBBOCK -+ LUB_HEXLED = 0xbadbadc5; -+#endif -+ while (1); -+ } -+ -+ /* ensure not to come back here if it wasn't intended */ -+ PSPR = 0; -+ -+ /* restore registers */ -+ RESTORE(GPDR0); RESTORE(GPDR1); RESTORE(GPDR2); -+ RESTORE(GRER0); RESTORE(GRER1); RESTORE(GRER2); -+ RESTORE(GFER0); RESTORE(GFER1); RESTORE(GFER2); -+ RESTORE(GAFR0_L); RESTORE(GAFR0_U); -+ RESTORE(GAFR1_L); RESTORE(GAFR1_U); -+ RESTORE(GAFR2_L); RESTORE(GAFR2_U); -+ -+ PSSR = PSSR_PH; -+ -+ RESTORE(OSMR0); -+ RESTORE(OSMR1); -+ RESTORE(OSMR2); -+ RESTORE(OSMR3); -+ RESTORE(OSCR); -+ RESTORE(OIER); -+ -+ RESTORE(CKEN); -+ -+ ICLR = 0; -+ ICCR = 1; -+ RESTORE(ICMR); -+ -+ /* -+ * Temporary solution. This won't be necessary once -+ * we move pxa support into the serial/* driver. -+ * Restore the FF UART. -+ */ -+ RESTORE(FFMCR); -+ RESTORE(FFSPR); -+ RESTORE(FFLCR); -+ FFLCR |= 0x80; -+ RESTORE(FFDLH); -+ RESTORE(FFDLL); -+ RESTORE(FFLCR); -+ RESTORE(FFISR); -+ FFFCR = 0x07; -+ RESTORE(FFIER); -+ -+ /* restore current time */ -+ xtime.tv_sec = RCNR; -+ -+#ifdef DEBUG -+ printk(KERN_DEBUG "*** made it back from resume\n"); -+#endif -+ -+ leds_event(led_start); -+ -+ sti(); -+ -+ return 0; -+} -+ -+unsigned long sleep_phys_sp(void *sp) -+{ -+ return virt_to_phys(sp); -+} -+ -+#ifdef CONFIG_SYSCTL -+/* -+ * ARGH! ACPI people defined CTL_ACPI in linux/acpi.h rather than -+ * linux/sysctl.h. -+ * -+ * This means our interface here won't survive long - it needs a new -+ * interface. Quick hack to get this working - use sysctl id 9999. -+ */ -+#warning ACPI broke the kernel, this interface needs to be fixed up. -+#define CTL_ACPI 9999 -+#define ACPI_S1_SLP_TYP 19 -+ -+/* -+ * Send us to sleep. -+ */ -+static int sysctl_pm_do_suspend(void) -+{ -+ int retval; -+ -+ retval = pm_send_all(PM_SUSPEND, (void *)3); -+ -+ if (retval == 0) { -+ retval = pm_do_suspend(); -+ -+ pm_send_all(PM_RESUME, (void *)0); -+ } -+ -+ return retval; -+} -+ -+static struct ctl_table pm_table[] = -+{ -+ {ACPI_S1_SLP_TYP, "suspend", NULL, 0, 0600, NULL, (proc_handler *)&sysctl_pm_do_suspend}, -+ {0} -+}; -+ -+static struct ctl_table pm_dir_table[] = -+{ -+ {CTL_ACPI, "pm", NULL, 0, 0555, pm_table}, -+ {0} -+}; -+ -+/* -+ * Initialize power interface -+ */ -+static int __init pm_init(void) -+{ -+ register_sysctl_table(pm_dir_table, 1); -+ return 0; -+} -+ -+__initcall(pm_init); -+ -+#endif ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/mach-pxa/pxa_usb.h 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,230 @@ -+/* -+ * pxa_usb.h -+ * -+ * Public interface to the pxa USB core. For use by client modules -+ * like usb-eth and usb-char. -+ * -+ * 02-May-2002 -+ * Frank Becker (Intrinsyc) - derived from sa1100_usb.h -+ * -+ */ -+ -+#ifndef _PXA_USB_H -+#define _PXA_USB_H -+#include <asm/byteorder.h> -+ -+typedef void (*usb_callback_t)(int flag, int size); -+ -+/* in usb_ctl.c (see also descriptor methods at bottom of file) */ -+ -+// Open the USB client for client and initialize data structures -+// to default values, but _do not_ start UDC. -+int pxa_usb_open( const char * client_name ); -+ -+// Start UDC running -+int pxa_usb_start( void ); -+ -+// Immediately stop udc, fire off completion routines w/-EINTR -+int pxa_usb_stop( void ) ; -+ -+// Disconnect client from usb core -+int pxa_usb_close( void ) ; -+ -+// set notify callback for when core reaches configured state -+// return previous pointer (if any) -+typedef void (*usb_notify_t)(void); -+usb_notify_t pxa_set_configured_callback( usb_notify_t callback ); -+ -+/* in usb_send.c */ -+int pxa_usb_xmitter_avail( void ); -+int pxa_usb_send(char *buf, int len, usb_callback_t callback); -+void sa110a_usb_send_reset(void); -+ -+/* in usb_recev.c */ -+int pxa_usb_recv(char *buf, int len, usb_callback_t callback); -+void pxa_usb_recv_reset(void); -+ -+////////////////////////////////////////////////////////////////////////////// -+// Descriptor Management -+////////////////////////////////////////////////////////////////////////////// -+ -+#define DescriptorHeader \ -+ __u8 bLength; \ -+ __u8 bDescriptorType -+ -+ -+// --- Device Descriptor ------------------- -+ -+typedef struct { -+ DescriptorHeader; -+ __u16 bcdUSB; /* USB specification revision number in BCD */ -+ __u8 bDeviceClass; /* USB class for entire device */ -+ __u8 bDeviceSubClass; /* USB subclass information for entire device */ -+ __u8 bDeviceProtocol; /* USB protocol information for entire device */ -+ __u8 bMaxPacketSize0; /* Max packet size for endpoint zero */ -+ __u16 idVendor; /* USB vendor ID */ -+ __u16 idProduct; /* USB product ID */ -+ __u16 bcdDevice; /* vendor assigned device release number */ -+ __u8 iManufacturer; /* index of manufacturer string */ -+ __u8 iProduct; /* index of string that describes product */ -+ __u8 iSerialNumber; /* index of string containing device serial number */ -+ __u8 bNumConfigurations; /* number fo configurations */ -+} __attribute__ ((packed)) device_desc_t; -+ -+// --- Configuration Descriptor ------------ -+ -+typedef struct { -+ DescriptorHeader; -+ __u16 wTotalLength; /* total # of bytes returned in the cfg buf 4 this cfg */ -+ __u8 bNumInterfaces; /* number of interfaces in this cfg */ -+ __u8 bConfigurationValue; /* used to uniquely ID this cfg */ -+ __u8 iConfiguration; /* index of string describing configuration */ -+ __u8 bmAttributes; /* bitmap of attributes for ths cfg */ -+ __u8 MaxPower; /* power draw in 2ma units */ -+} __attribute__ ((packed)) config_desc_t; -+ -+// bmAttributes: -+enum { -+ USB_CONFIG_REMOTEWAKE=0x20, -+ USB_CONFIG_SELFPOWERED=0x40, -+ USB_CONFIG_BUSPOWERED=0x80 -+}; -+ -+// MaxPower: -+#define USB_POWER( x) ((x)>>1) /* convert mA to descriptor units of A for MaxPower */ -+ -+// --- Interface Descriptor --------------- -+ -+typedef struct { -+ DescriptorHeader; -+ __u8 bInterfaceNumber; /* Index uniquely identfying this interface */ -+ __u8 bAlternateSetting; /* ids an alternate setting for this interface */ -+ __u8 bNumEndpoints; /* number of endpoints in this interface */ -+ __u8 bInterfaceClass; /* USB class info applying to this interface */ -+ __u8 bInterfaceSubClass; /* USB subclass info applying to this interface */ -+ __u8 bInterfaceProtocol; /* USB protocol info applying to this interface */ -+ __u8 iInterface; /* index of string describing interface */ -+} __attribute__ ((packed)) intf_desc_t; -+ -+// --- Endpoint Descriptor --------------- -+ -+typedef struct { -+ DescriptorHeader; -+ __u8 bEndpointAddress; /* 0..3 ep num, bit 7: 0 = 0ut 1= in */ -+ __u8 bmAttributes; /* 0..1 = 0: ctrl, 1: isoc, 2: bulk 3: intr */ -+ __u16 wMaxPacketSize; /* data payload size for this ep in this cfg */ -+ __u8 bInterval; /* polling interval for this ep in this cfg */ -+} __attribute__ ((packed)) ep_desc_t; -+ -+// bEndpointAddress: -+enum { -+ USB_OUT =0, -+ USB_IN =1 -+}; -+ -+#define USB_EP_ADDRESS(a,d) (((a)&0xf) | ((d) << 7)) -+// bmAttributes: -+enum { -+ USB_EP_CNTRL =0, -+ USB_EP_BULK =2, -+ USB_EP_INT =3, -+ USB_EP_ISO =4 -+}; -+ -+// --- String Descriptor ------------------- -+ -+typedef struct { -+ DescriptorHeader; -+ __u16 bString[1]; /* unicode string .. actaully 'n' __u16s */ -+} __attribute__ ((packed)) string_desc_t; -+ -+/*======================================================= -+ * Handy helpers when working with above -+ * -+ */ -+// these are x86-style 16 bit "words" ... -+#define make_word_c( w ) __constant_cpu_to_le16(w) -+#define make_word( w ) __cpu_to_le16(w) -+ -+// descriptor types -+enum { -+ USB_DESC_DEVICE = 1, -+ USB_DESC_CONFIG = 2, -+ USB_DESC_STRING = 3, -+ USB_DESC_INTERFACE = 4, -+ USB_DESC_ENDPOINT = 5 -+}; -+ -+ -+/*======================================================= -+ * Default descriptor layout for SA-1100 and SA-1110 UDC -+ */ -+ -+enum { -+ UNUSED = 0, -+ -+ BULK_IN1 = 1, -+ BULK_OUT1 = 2, -+ ISO_IN1 = 3, -+ ISO_OUT1 = 4, -+ INT_IN1 = 5, -+ -+ BULK_IN2 = 6, -+ BULK_OUT2 = 7, -+ ISO_IN2 = 8, -+ ISO_OUT2 = 9, -+ INT_IN2 = 10, -+ -+ BULK_IN3 = 11, -+ BULK_OUT3 = 12, -+ ISO_IN3 = 13, -+ ISO_OUT3 = 14, -+ INT_IN3 = 15 -+} /*endpoint_type*/; -+ -+/* "config descriptor buffer" - that is, one config, -+ ..one interface and 2 endpoints */ -+struct cdb { -+ config_desc_t cfg; -+ intf_desc_t intf; -+ ep_desc_t ep1; -+ ep_desc_t ep2; -+} __attribute__ ((packed)); -+ -+/* all SA device descriptors */ -+typedef struct { -+ device_desc_t dev; /* device descriptor */ -+ struct cdb b; /* bundle of descriptors for this cfg */ -+} __attribute__ ((packed)) desc_t; -+ -+ -+/*======================================================= -+ * Descriptor API -+ */ -+ -+/* Get the address of the statically allocated desc_t structure -+ in the usb core driver. Clients can modify this between -+ the time they call pxa_usb_open() and pxa_usb_start() -+*/ -+desc_t * -+pxa_usb_get_descriptor_ptr( void ); -+ -+ -+/* Set a pointer to the string descriptor at "index". The driver -+ ..has room for 8 string indicies internally. Index zero holds -+ ..a LANGID code and is set to US English by default. Inidices -+ ..1-7 are available for use in the config descriptors as client's -+ ..see fit. This pointer is assumed to be good as long as the -+ ..SA usb core is open (so statically allocate them). Returnes -EINVAL -+ ..if index out of range */ -+int pxa_usb_set_string_descriptor( int index, string_desc_t * p ); -+ -+/* reverse of above */ -+string_desc_t * -+pxa_usb_get_string_descriptor( int index ); -+ -+/* kmalloc() a string descriptor and convert "p" to unicode in it */ -+string_desc_t * -+pxa_usb_kmalloc_string_descriptor( const char * p ); -+ -+#endif /* _PXA_USB_H */ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/mach-pxa/sa1111.c 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,3 @@ -+#include "../mach-sa1100/sa1111.c" -+ -+ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/mach-pxa/sa1111.h 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,2 @@ -+#include "../mach-sa1100/sa1111.h" -+ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/mach-pxa/sleep.S 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,150 @@ -+/* -+ * Low-level PXA250/210 sleep/wakeUp support -+ * -+ * Initial SA1110 code: -+ * Copyright (c) 2001 Cliff Brake <cbrake@accelent.com> -+ * -+ * Adapted for PXA by Nicolas Pitre: -+ * Copyright (c) 2002 Monta Vista Software, Inc. -+ * -+ * This program is free software; you can redistribute it and/or -+ * modify it under the terms of the GNU General Public License. -+ */ -+ -+#include <linux/config.h> -+#include <linux/linkage.h> -+#include <asm/assembler.h> -+#include <asm/hardware.h> -+ -+ .text -+ -+/* -+ * pxa_cpu_suspend() -+ * -+ * Forces CPU into sleep state -+ */ -+ -+ENTRY(pxa_cpu_suspend) -+ -+ mra r2, r3, acc0 -+ stmfd sp!, {r2 - r12, lr} @ save registers on stack -+ -+ @ get coprocessor registers -+ mrc p15, 0, r4, c15, c1, 0 @ CP access reg -+ mrc p15, 0, r5, c13, c0, 0 @ PID -+ mrc p15, 0, r6, c3, c0, 0 @ domain ID -+ mrc p15, 0, r7, c2, c0, 0 @ translation table base addr -+ mrc p15, 0, r8, c1, c1, 0 @ auxiliary control reg -+ mrc p15, 0, r9, c1, c0, 0 @ control reg -+ -+ @ store them plus current virtual stack ptr on stack -+ mov r10, sp -+ stmfd sp!, {r4 - r10} -+ -+ @ preserve phys address of stack -+ mov r0, sp -+ bl sleep_phys_sp -+ ldr r1, =sleep_save_sp -+ str r0, [r1] -+ -+ @ clean data cache -+ bl cpu_xscale_cache_clean_invalidate_all -+ -+ @ Put the processor to sleep -+ @ (also workaround for sighting 28071) -+ -+ @ prepare value for sleep mode -+ mov r1, #3 @ sleep mode -+ -+ @ prepare to put SDRAM into self-refresh manually -+ ldr r4, =MDREFR -+ ldr r5, [r4] -+ orr r5, r5, #MDREFR_SLFRSH -+ -+ @ prepare pointer to physical address 0 (virtual mapping in generic.c) -+ mov r2, #UNCACHED_PHYS_0 -+ -+ @ align execution to a cache line -+ b 1f -+ -+ .ltorg -+ .align 5 -+1: -+ -+ @ All needed values are now in registers. -+ @ These last instructions should be in cache -+ -+ @ put SDRAM into self-refresh -+ str r5, [r4] -+ -+ @ force address lines low by reading at physical address 0 -+ ldr r3, [r2] -+ -+ @ enter sleep mode -+ mcr p14, 0, r1, c7, c0, 0 -+ -+20: nop -+ b 20b @ loop waiting for sleep -+ -+/* -+ * cpu_pxa_resume() -+ * -+ * entry point from bootloader into kernel during resume -+ * -+ * Note: Yes, part of the following code is located into the .data section. -+ * This is to allow sleep_save_sp to be accessed with a relative load -+ * while we can't rely on any MMU translation. We could have put -+ * sleep_save_sp in the .text section as well, but some setups might -+ * insist on it to be truely read-only. -+ */ -+ -+ .data -+ .align 5 -+ENTRY(pxa_cpu_resume) -+ mov r0, #I_BIT | F_BIT | MODE_SVC @ set SVC, irqs off -+ msr cpsr_c, r0 -+ -+ ldr r0, sleep_save_sp @ stack phys addr -+ ldr r2, =resume_after_mmu @ its absolute virtual address -+ ldmfd r0, {r4 - r9, sp} @ CP regs + virt stack ptr -+ -+ mov r1, #0 -+ mcr p15, 0, r1, c8, c7, 0 @ invalidate I & D TLBs -+ mcr p15, 0, r1, c7, c7, 0 @ invalidate I & D caches, BTB -+ -+#ifdef CONFIG_XSCALE_CACHE_ERRATA -+ bic r9, r9, #0x0004 @ see cpu_xscale_proc_init -+#endif -+ -+ mcr p15, 0, r4, c15, c1, 0 @ CP access reg -+ mcr p15, 0, r5, c13, c0, 0 @ PID -+ mcr p15, 0, r6, c3, c0, 0 @ domain ID -+ mcr p15, 0, r7, c2, c0, 0 @ translation table base addr -+ mcr p15, 0, r8, c1, c1, 0 @ auxiliary control reg -+ b resume_turn_on_mmu @ cache align execution -+ -+ .align 5 -+resume_turn_on_mmu: -+ mcr p15, 0, r9, c1, c0, 0 @ turn on MMU, caches, etc. -+ -+ @ Let us ensure we jump to resume_after_mmu only when the mcr above -+ @ actually took effect. They call it the "cpwait" operation. -+ mrc p15, 0, r1, c2, c0, 0 @ queue a dependency on CP15 -+ sub pc, r2, r1, lsr #32 @ jump to virtual addr -+ nop -+ nop -+ nop -+ -+sleep_save_sp: -+ .word 0 @ preserve stack phys ptr here -+ -+ .text -+resume_after_mmu: -+#ifdef CONFIG_XSCALE_CACHE_ERRATA -+ bl cpu_xscale_proc_init -+#endif -+ ldmfd sp!, {r2, r3} -+ mar acc0, r2, r3 -+ ldmfd sp!, {r4 - r12, pc} @ return to caller -+ -+ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/mach-pxa/trizeps2.c 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,105 @@ -+/* -+ * linux/arch/arm/mach-pxa/trizeps2.c -+ * -+ * Support for the Keith&Koep MT6N Development Platform. -+ * -+ * Author: Luc De Cock -+ * Created: Jan 13, 2003 -+ * Copyright: Teradyne DS, Ltd. -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ */ -+#include <linux/init.h> -+#include <linux/major.h> -+#include <linux/fs.h> -+#include <linux/interrupt.h> -+#include <linux/sched.h> -+ -+#include <asm/types.h> -+#include <asm/setup.h> -+#include <asm/memory.h> -+#include <asm/mach-types.h> -+#include <asm/hardware.h> -+#include <asm/irq.h> -+ -+#include <asm/mach/arch.h> -+#include <asm/mach/map.h> -+#include <asm/mach/irq.h> -+ -+#include <asm/arch/irq.h> -+ -+#include "generic.h" -+ -+static unsigned long trizeps2_irq_en_mask; -+unsigned short trizeps2_bcr_shadow = 0x50; // 0x70 -+ -+ -+static void __init trizeps2_init_irq(void) -+{ -+ int irq; -+ -+ pxa_init_irq(); -+ -+ set_GPIO_IRQ_edge(GPIO_ETHERNET_IRQ, GPIO_RISING_EDGE); -+} -+ -+static int __init trizeps2_init(void) -+{ -+ /* Configure the BCR register */ -+ unsigned short *bcr = (unsigned short *) TRIZEPS2_BCR_BASE; -+ -+ *bcr = trizeps2_bcr_shadow; -+ return 0; -+} -+ -+__initcall(trizeps2_init); -+ -+static void __init -+fixup_trizeps2(struct machine_desc *desc, struct param_struct *params, -+ char **cmdline, struct meminfo *mi) -+{ -+#ifdef TRIZEPS2_MEM_64MB -+ SET_BANK (0, 0xa0000000, 64*1024*1024); -+#else -+ SET_BANK (0, 0xa0000000, 32*1024*1024); -+#endif -+ mi->nr_banks = 1; -+} -+ -+static struct map_desc trizeps2_io_desc[] __initdata = { -+ /* virtual physical length domain r w c b */ -+ { 0xf0000000, 0x0e000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 }, /* BCR */ -+ { 0xf0100000, 0x0c000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 }, /* PCMCIA STATUS */ -+ { 0xf1000000, 0x0c800000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 }, /* LAN91C96 IO */ -+ { 0xf1100000, 0x0e000000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 }, /* LAN91C96 Attr */ -+ { 0xf2000000, 0x0d800000, 0x00100000, DOMAIN_IO, 0, 1, 0, 0 }, /* TTL-IO */ -+ LAST_DESC -+}; -+ -+static void __init trizeps2_map_io(void) -+{ -+ pxa_map_io(); -+ iotable_init(trizeps2_io_desc); -+ -+ /* This is for the SMC chip select */ -+ set_GPIO_mode(GPIO79_nCS_3_MD); -+ -+ /* setup sleep mode values */ -+ PWER = 0x00000002; -+ PFER = 0x00000000; -+ PRER = 0x00000002; -+ PGSR0 = 0x00008000; -+ PGSR1 = 0x003F0202; -+ PGSR2 = 0x0001C000; -+ PCFR |= PCFR_OPDE; -+} -+ -+MACHINE_START(TRIZEPS2, "Keith-n-Koep MT6N Development Platform") -+ MAINTAINER("Luc De Cock") -+ BOOT_MEM(0xa0000000, 0x40000000, io_p2v(0x40000000)) -+ FIXUP(fixup_trizeps2) -+ MAPIO(trizeps2_map_io) -+ INITIRQ(trizeps2_init_irq) -+MACHINE_END ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/mach-pxa/usb-char.c 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,719 @@ -+/* -+ * (C) Copyright 2000-2001 Extenex Corporation -+ * -+ * 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. -+ * -+ * usb-char.c -+ * -+ * Miscellaneous character device interface for SA1100 USB function -+ * driver. -+ * -+ * Background: -+ * The SA1100 function driver ported from the Compaq Itsy project -+ * has an interface, usb-eth.c, to feed network packets over the -+ * usb wire and into the Linux TCP/IP stack. -+ * -+ * This file replaces that one with a simple character device -+ * interface that allows unstructured "byte pipe" style reads and -+ * writes over the USB bulk endpoints by userspace programs. -+ * -+ * A new define, CONFIG_SA1100_USB_NETLINK, has been created that, -+ * when set, (the default) causes the ethernet interface to be used. -+ * When not set, this more pedestrian character interface is linked -+ * in instead. -+ * -+ * Please see linux/Documentation/arm/SA1100/SA1100_USB for details. -+ * -+ * ward.willats@extenex.com -+ * -+ * To do: -+ * - Can't dma into ring buffer directly with pci_map/unmap usb_recv -+ * uses and get bytes out at the same time DMA is going on. Investigate: -+ * a) changing usb_recv to use alloc_consistent() at client request; or -+ * b) non-ring-buffer based data structures. In the meantime, I am using -+ * a bounce buffer. Simple, but wasteful. -+ */ -+ -+#include <linux/module.h> -+#include <linux/config.h> -+#include <linux/miscdevice.h> -+#include <linux/slab.h> -+#include <linux/init.h> -+#include <linux/cache.h> -+#include <linux/poll.h> -+#include <linux/circ_buf.h> -+#include <linux/timer.h> -+ -+#include <asm/io.h> -+#include <asm/semaphore.h> -+#include <asm/proc/page.h> -+#include <asm/mach-types.h> -+ -+#include "usb-char.h" -+#include "pxa_usb.h" -+ -+ -+ -+////////////////////////////////////////////////////////////////////////////// -+// Driver Options -+////////////////////////////////////////////////////////////////////////////// -+ -+#define VERSION "0.4" -+ -+ -+#define VERBOSITY 1 -+ -+#if VERBOSITY -+# define PRINTK(x, a...) printk (x, ## a) -+#else -+# define PRINTK(x, a...) /**/ -+#endif -+ -+////////////////////////////////////////////////////////////////////////////// -+// Globals - Macros - Enums - Structures -+////////////////////////////////////////////////////////////////////////////// -+#ifndef MIN -+#define MIN( a, b ) ((a)<(b)?(a):(b)) -+#endif -+ -+typedef int bool; enum { false = 0, true = 1 }; -+ -+static const char pszMe[] = "usbchr: "; -+ -+static wait_queue_head_t wq_read; -+static wait_queue_head_t wq_write; -+static wait_queue_head_t wq_poll; -+ -+/* Serialze multiple writers onto the transmit hardware -+.. since we sleep the writer during transmit to stay in -+.. sync. (Multiple writers don't make much sense, but..) */ -+static DECLARE_MUTEX( xmit_sem ); -+ -+// size of usb DATA0/1 packets. 64 is standard maximum -+// for bulk transport, though most hosts seem to be able -+// to handle larger. -+#define TX_PACKET_SIZE 64 -+#define RX_PACKET_SIZE 64 -+#define RBUF_SIZE (4*PAGE_SIZE) -+ -+static struct wcirc_buf { -+ char *buf; -+ int in; -+ int out; -+} rx_ring = { NULL, 0, 0 }; -+ -+static struct { -+ unsigned long cnt_rx_complete; -+ unsigned long cnt_rx_errors; -+ unsigned long bytes_rx; -+ unsigned long cnt_tx_timeouts; -+ unsigned long cnt_tx_errors; -+ unsigned long bytes_tx; -+} charstats; -+ -+ -+static char * tx_buf = NULL; -+static char * packet_buffer = NULL; -+static int sending = 0; -+static int usb_ref_count = 0; -+static int last_tx_result = 0; -+static int last_rx_result = 0; -+static int last_tx_size = 0; -+static struct timer_list tx_timer; -+ -+////////////////////////////////////////////////////////////////////////////// -+// Prototypes -+////////////////////////////////////////////////////////////////////////////// -+static char * what_the_f( int e ); -+static void free_txrx_buffers( void ); -+static void twiddle_descriptors( void ); -+static void free_string_descriptors( void ) ; -+static int usbc_open( struct inode *pInode, struct file *pFile ); -+static void rx_done_callback_packet_buffer( int flag, int size ); -+ -+static void tx_timeout( unsigned long ); -+static void tx_done_callback( int flag, int size ); -+ -+static ssize_t usbc_read( struct file *, char *, size_t, loff_t * ); -+static ssize_t usbc_write( struct file *, const char *, size_t, loff_t * ); -+static unsigned int usbc_poll( struct file *pFile, poll_table * pWait ); -+static int usbc_ioctl( struct inode *pInode, struct file *pFile, -+ unsigned int nCmd, unsigned long argument ); -+static int usbc_close( struct inode *pInode, struct file *pFile ); -+ -+#ifdef CONFIG_SA1100_EXTENEX1 -+static void extenex_configured_notify_proc( void ); -+#endif -+////////////////////////////////////////////////////////////////////////////// -+// Private Helpers -+////////////////////////////////////////////////////////////////////////////// -+ -+static char * what_the_f( int e ) -+{ -+ char * p; -+ switch( e ) { -+ case 0: -+ p = "noErr"; -+ break; -+ case -ENODEV: -+ p = "ENODEV - usb not in config state"; -+ break; -+ case -EBUSY: -+ p = "EBUSY - another request on the hardware"; -+ break; -+ case -EAGAIN: -+ p = "EAGAIN"; -+ break; -+ case -EINTR: -+ p = "EINTR - interrupted\n"; -+ break; -+ case -EPIPE: -+ p = "EPIPE - zero length xfer\n"; -+ break; -+ default: -+ p = "????"; -+ break; -+ } -+ return p; -+} -+ -+static void free_txrx_buffers( void ) -+{ -+ if ( rx_ring.buf != NULL ) { -+ kfree( rx_ring.buf ); -+ rx_ring.buf = NULL; -+ } -+ if ( packet_buffer != NULL ) { -+ kfree( packet_buffer ); -+ packet_buffer = NULL; -+ } -+ if ( tx_buf != NULL ) { -+ kfree( tx_buf ); -+ tx_buf = NULL; -+ } -+} -+ -+/* twiddle_descriptors() -+ * It is between open() and start(). Setup descriptors. -+ */ -+static void twiddle_descriptors( void ) -+{ -+ desc_t * pDesc = pxa_usb_get_descriptor_ptr(); -+ string_desc_t * pString; -+ -+ pDesc->b.ep1.wMaxPacketSize = make_word_c( RX_PACKET_SIZE ); -+ pDesc->b.ep1.bmAttributes = USB_EP_BULK; -+ pDesc->b.ep2.wMaxPacketSize = make_word_c( TX_PACKET_SIZE ); -+ pDesc->b.ep2.bmAttributes = USB_EP_BULK; -+ -+ if ( machine_is_extenex1() ) { -+#ifdef CONFIG_SA1100_EXTENEX1 -+ pDesc->dev.idVendor = make_word_c( 0xC9F ); -+ pDesc->dev.idProduct = 1; -+ pDesc->dev.bcdDevice = make_word_c( 0x0001 ); -+ pDesc->b.cfg.bmAttributes = USB_CONFIG_SELFPOWERED; -+ pDesc->b.cfg.MaxPower = 0; -+ -+ pString = pxa_usb_kmalloc_string_descriptor( "Extenex" ); -+ if ( pString ) { -+ pxa_usb_set_string_descriptor( 1, pString ); -+ pDesc->dev.iManufacturer = 1; -+ } -+ -+ pString = pxa_usb_kmalloc_string_descriptor( "Handheld Theater" ); -+ if ( pString ) { -+ pxa_usb_set_string_descriptor( 2, pString ); -+ pDesc->dev.iProduct = 2; -+ } -+ -+ pString = pxa_usb_kmalloc_string_descriptor( "00000000" ); -+ if ( pString ) { -+ pxa_usb_set_string_descriptor( 3, pString ); -+ pDesc->dev.iSerialNumber = 3; -+ } -+ -+ pString = pxa_usb_kmalloc_string_descriptor( "HHT Bulk Transfer" ); -+ if ( pString ) { -+ pxa_usb_set_string_descriptor( 4, pString ); -+ pDesc->b.intf.iInterface = 4; -+ } -+ pxa_set_configured_callback( extenex_configured_notify_proc ); -+#endif -+ } -+} -+ -+static void free_string_descriptors( void ) -+{ -+ if ( machine_is_extenex1() ) { -+ string_desc_t * pString; -+ int i; -+ for( i = 1 ; i <= 4 ; i++ ) { -+ pString = pxa_usb_get_string_descriptor( i ); -+ if ( pString ) -+ kfree( pString ); -+ } -+ } -+} -+ -+////////////////////////////////////////////////////////////////////////////// -+// ASYNCHRONOUS -+////////////////////////////////////////////////////////////////////////////// -+static void kick_start_rx( void ) -+{ -+ if ( usb_ref_count ) { -+ int total_space = CIRC_SPACE( rx_ring.in, rx_ring.out, RBUF_SIZE ); -+ if ( total_space >= RX_PACKET_SIZE ) { -+ pxa_usb_recv( packet_buffer, -+ RX_PACKET_SIZE, -+ rx_done_callback_packet_buffer -+ ); -+ } -+ } -+} -+/* -+ * rx_done_callback_packet_buffer() -+ * We have completed a DMA xfer into the temp packet buffer. -+ * Move to ring. -+ * -+ * flag values: -+ * on init, -EAGAIN -+ * on reset, -EINTR -+ * on RPE, -EIO -+ * on short packet -EPIPE -+ */ -+static void -+rx_done_callback_packet_buffer( int flag, int size ) -+{ -+ charstats.cnt_rx_complete++; -+ -+ if ( flag == 0 || flag == -EPIPE ) { -+ size_t n; -+ -+ charstats.bytes_rx += size; -+ -+ n = CIRC_SPACE_TO_END( rx_ring.in, rx_ring.out, RBUF_SIZE ); -+ n = MIN( n, size ); -+ size -= n; -+ -+ memcpy( &rx_ring.buf[ rx_ring.in ], packet_buffer, n ); -+ rx_ring.in = (rx_ring.in + n) & (RBUF_SIZE-1); -+ memcpy( &rx_ring.buf[ rx_ring.in ], packet_buffer + n, size ); -+ rx_ring.in = (rx_ring.in + size) & (RBUF_SIZE-1); -+ -+ wake_up_interruptible( &wq_read ); -+ wake_up_interruptible( &wq_poll ); -+ -+ last_rx_result = 0; -+ -+ kick_start_rx(); -+ -+ } else if ( flag != -EAGAIN ) { -+ charstats.cnt_rx_errors++; -+ last_rx_result = flag; -+ wake_up_interruptible( &wq_read ); -+ wake_up_interruptible( &wq_poll ); -+ } -+ else /* init, start a read */ -+ kick_start_rx(); -+} -+ -+ -+static void tx_timeout( unsigned long unused ) -+{ -+ printk( "%stx timeout\n", pszMe ); -+ pxa_usb_send_reset(); -+ charstats.cnt_tx_timeouts++; -+} -+ -+ -+// on init, -EAGAIN -+// on reset, -EINTR -+// on TPE, -EIO -+static void tx_done_callback( int flags, int size ) -+{ -+ if ( flags == 0 ) -+ charstats.bytes_tx += size; -+ else -+ charstats.cnt_tx_errors++; -+ last_tx_size = size; -+ last_tx_result = flags; -+ sending = 0; -+ wake_up_interruptible( &wq_write ); -+ wake_up_interruptible( &wq_poll ); -+} -+ -+ -+////////////////////////////////////////////////////////////////////////////// -+// Workers -+////////////////////////////////////////////////////////////////////////////// -+ -+static int usbc_open( struct inode *pInode, struct file *pFile ) -+{ -+ int retval = 0; -+ -+ PRINTK( KERN_DEBUG "%sopen()\n", pszMe ); -+ -+ /* start usb core */ -+ retval = pxa_usb_open( "usb-char" ); -+ if ( retval ) return retval; -+ -+ /* allocate memory */ -+ if ( usb_ref_count == 0 ) { -+ tx_buf = (char*) kmalloc( TX_PACKET_SIZE, GFP_KERNEL | GFP_DMA ); -+ if ( tx_buf == NULL ) { -+ printk( "%sARGHH! COULD NOT ALLOCATE TX BUFFER\n", pszMe ); -+ goto malloc_fail; -+ } -+ rx_ring.buf = -+ (char*) kmalloc( RBUF_SIZE, GFP_KERNEL ); -+ -+ if ( rx_ring.buf == NULL ) { -+ printk( "%sARGHH! COULD NOT ALLOCATE RX BUFFER\n", pszMe ); -+ goto malloc_fail; -+ } -+ -+ packet_buffer = -+ (char*) kmalloc( RX_PACKET_SIZE, GFP_KERNEL | GFP_DMA ); -+ -+ if ( packet_buffer == NULL ) { -+ printk( "%sARGHH! COULD NOT ALLOCATE RX PACKET BUFFER\n", pszMe ); -+ goto malloc_fail; -+ } -+ rx_ring.in = rx_ring.out = 0; -+ memset( &charstats, 0, sizeof( charstats ) ); -+ sending = 0; -+ last_tx_result = 0; -+ last_tx_size = 0; -+ } -+ -+ /* modify default descriptors */ -+ twiddle_descriptors(); -+ -+ retval = pxa_usb_start(); -+ if ( retval ) { -+ printk( "%sAGHH! Could not USB core\n", pszMe ); -+ free_txrx_buffers(); -+ return retval; -+ } -+ usb_ref_count++; /* must do _before_ kick_start() */ -+ MOD_INC_USE_COUNT; -+ kick_start_rx(); -+ return 0; -+ -+ malloc_fail: -+ free_txrx_buffers(); -+ return -ENOMEM; -+} -+ -+/* -+ * Read endpoint. Note that you can issue a read to an -+ * unconfigured endpoint. Eventually, the host may come along -+ * and configure underneath this module and data will appear. -+ */ -+static ssize_t usbc_read( struct file *pFile, char *pUserBuffer, -+ size_t stCount, loff_t *pPos ) -+{ -+ ssize_t retval; -+ int flags; -+ DECLARE_WAITQUEUE( wait, current ); -+ -+ PRINTK( KERN_DEBUG "%sread()\n", pszMe ); -+ -+ local_irq_save( flags ); -+ if ( last_rx_result == 0 ) { -+ local_irq_restore( flags ); -+ } else { /* an error happended and receiver is paused */ -+ local_irq_restore( flags ); -+ last_rx_result = 0; -+ kick_start_rx(); -+ } -+ -+ add_wait_queue( &wq_read, &wait ); -+ while( 1 ) { -+ ssize_t bytes_avail; -+ ssize_t bytes_to_end; -+ -+ set_current_state( TASK_INTERRUPTIBLE ); -+ -+ /* snap ring buf state */ -+ local_irq_save( flags ); -+ bytes_avail = CIRC_CNT( rx_ring.in, rx_ring.out, RBUF_SIZE ); -+ bytes_to_end = CIRC_CNT_TO_END( rx_ring.in, rx_ring.out, RBUF_SIZE ); -+ local_irq_restore( flags ); -+ -+ if ( bytes_avail != 0 ) { -+ ssize_t bytes_to_move = MIN( stCount, bytes_avail ); -+ retval = 0; // will be bytes transfered -+ if ( bytes_to_move != 0 ) { -+ size_t n = MIN( bytes_to_end, bytes_to_move ); -+ if ( copy_to_user( pUserBuffer, -+ &rx_ring.buf[ rx_ring.out ], -+ n ) ) { -+ retval = -EFAULT; -+ break; -+ } -+ bytes_to_move -= n; -+ retval += n; -+ // might go 1 char off end, so wrap -+ rx_ring.out = ( rx_ring.out + n ) & (RBUF_SIZE-1); -+ if ( copy_to_user( pUserBuffer + n, -+ &rx_ring.buf[ rx_ring.out ], -+ bytes_to_move ) -+ ) { -+ retval = -EFAULT; -+ break; -+ } -+ rx_ring.out += bytes_to_move; // cannot wrap -+ retval += bytes_to_move; -+ kick_start_rx(); -+ } -+ break; -+ } -+ else if ( last_rx_result ) { -+ retval = last_rx_result; -+ break; -+ } -+ else if ( pFile->f_flags & O_NONBLOCK ) { // no data, can't sleep -+ retval = -EAGAIN; -+ break; -+ } -+ else if ( signal_pending( current ) ) { // no data, can sleep, but signal -+ retval = -ERESTARTSYS; -+ break; -+ } -+ schedule(); // no data, can sleep -+ } -+ set_current_state( TASK_RUNNING ); -+ remove_wait_queue( &wq_read, &wait ); -+ -+ if ( retval < 0 ) -+ printk( "%sread error %d - %s\n", pszMe, retval, what_the_f( retval ) ); -+ return retval; -+} -+ -+/* -+ * Write endpoint. This routine attempts to break the passed in buffer -+ * into usb DATA0/1 packet size chunks and send them to the host. -+ * (The lower-level driver tries to do this too, but easier for us -+ * to manage things here.) -+ * -+ * We are at the mercy of the host here, in that it must send an IN -+ * token to us to pull this data back, so hopefully some higher level -+ * protocol is expecting traffic to flow in that direction so the host -+ * is actually polling us. To guard against hangs, a 5 second timeout -+ * is used. -+ * -+ * This routine takes some care to only report bytes sent that have -+ * actually made it across the wire. Thus we try to stay in lockstep -+ * with the completion routine and only have one packet on the xmit -+ * hardware at a time. Multiple simultaneous writers will get -+ * "undefined" results. -+ * -+ */ -+static ssize_t usbc_write( struct file *pFile, const char * pUserBuffer, -+ size_t stCount, loff_t *pPos ) -+{ -+ ssize_t retval = 0; -+ ssize_t stSent = 0; -+ -+ DECLARE_WAITQUEUE( wait, current ); -+ -+ PRINTK( KERN_DEBUG "%swrite() %d bytes\n", pszMe, stCount ); -+ -+ down( &xmit_sem ); // only one thread onto the hardware at a time -+ -+ while( stCount != 0 && retval == 0 ) { -+ int nThisTime = MIN( TX_PACKET_SIZE, stCount ); -+ copy_from_user( tx_buf, pUserBuffer, nThisTime ); -+ sending = nThisTime; -+ retval = pxa_usb_send( tx_buf, nThisTime, tx_done_callback ); -+ if ( retval < 0 ) { -+ char * p = what_the_f( retval ); -+ printk( "%sCould not queue xmission. rc=%d - %s\n", -+ pszMe, retval, p ); -+ sending = 0; -+ break; -+ } -+ /* now have something on the diving board */ -+ add_wait_queue( &wq_write, &wait ); -+ tx_timer.expires = jiffies + ( HZ * 5 ); -+ add_timer( &tx_timer ); -+ while( 1 ) { -+ set_current_state( TASK_INTERRUPTIBLE ); -+ if ( sending == 0 ) { /* it jumped into the pool */ -+ del_timer( &tx_timer ); -+ retval = last_tx_result; -+ if ( retval == 0 ) { -+ stSent += last_tx_size; -+ pUserBuffer += last_tx_size; -+ stCount -= last_tx_size; -+ } -+ else -+ printk( "%sxmission error rc=%d - %s\n", -+ pszMe, retval, what_the_f(retval) ); -+ break; -+ } -+ else if ( signal_pending( current ) ) { -+ del_timer( &tx_timer ); -+ printk( "%ssignal\n", pszMe ); -+ retval = -ERESTARTSYS; -+ break; -+ } -+ schedule(); -+ } -+ set_current_state( TASK_RUNNING ); -+ remove_wait_queue( &wq_write, &wait ); -+ } -+ -+ up( &xmit_sem ); -+ -+ if ( 0 == retval ) -+ retval = stSent; -+ return retval; -+} -+ -+static unsigned int usbc_poll( struct file *pFile, poll_table * pWait ) -+{ -+ unsigned int retval = 0; -+ -+ PRINTK( KERN_DEBUG "%poll()\n", pszMe ); -+ -+ poll_wait( pFile, &wq_poll, pWait ); -+ -+ if ( CIRC_CNT( rx_ring.in, rx_ring.out, RBUF_SIZE ) ) -+ retval |= POLLIN | POLLRDNORM; -+ if ( pxa_usb_xmitter_avail() ) -+ retval |= POLLOUT | POLLWRNORM; -+ return retval; -+} -+ -+static int usbc_ioctl( struct inode *pInode, struct file *pFile, -+ unsigned int nCmd, unsigned long argument ) -+{ -+ int retval = 0; -+ -+ switch( nCmd ) { -+ -+ case USBC_IOC_FLUSH_RECEIVER: -+ pxa_usb_recv_reset(); -+ rx_ring.in = rx_ring.out = 0; -+ break; -+ -+ case USBC_IOC_FLUSH_TRANSMITTER: -+ pxa_usb_send_reset(); -+ break; -+ -+ case USBC_IOC_FLUSH_ALL: -+ pxa_usb_recv_reset(); -+ rx_ring.in = rx_ring.out = 0; -+ pxa_usb_send_reset(); -+ break; -+ -+ default: -+ retval = -ENOIOCTLCMD; -+ break; -+ -+ } -+ return retval; -+} -+ -+ -+static int usbc_close( struct inode *pInode, struct file * pFile ) -+{ -+ PRINTK( KERN_DEBUG "%sclose()\n", pszMe ); -+ if ( --usb_ref_count == 0 ) { -+ down( &xmit_sem ); -+ pxa_usb_stop(); -+ free_txrx_buffers(); -+ free_string_descriptors(); -+ del_timer( &tx_timer ); -+ pxa_usb_close(); -+ up( &xmit_sem ); -+ } -+ MOD_DEC_USE_COUNT; -+ return 0; -+} -+ -+#ifdef CONFIG_SA1100_EXTENEX1 -+#include "../../../drivers/char/ex_gpio.h" -+void extenex_configured_notify_proc( void ) -+{ -+ if ( exgpio_play_string( "440,1:698,1" ) == -EAGAIN ) -+ printk( "%sWanted to BEEP but ex_gpio not open\n", pszMe ); -+} -+#endif -+////////////////////////////////////////////////////////////////////////////// -+// Initialization -+////////////////////////////////////////////////////////////////////////////// -+ -+static struct file_operations usbc_fops = { -+ owner: THIS_MODULE, -+ open: usbc_open, -+ read: usbc_read, -+ write: usbc_write, -+ poll: usbc_poll, -+ ioctl: usbc_ioctl, -+ release: usbc_close, -+}; -+ -+static struct miscdevice usbc_misc_device = { -+ USBC_MINOR, "usb_char", &usbc_fops -+}; -+ -+/* -+ * usbc_init() -+ */ -+ -+int __init usbc_init( void ) -+{ -+ int rc; -+ -+ if ( (rc = misc_register( &usbc_misc_device )) != 0 ) { -+ printk( KERN_WARNING "%sCould not register device 10, " -+ "%d. (%d)\n", pszMe, USBC_MINOR, rc ); -+ return -EBUSY; -+ } -+ -+ // initialize wait queues -+ init_waitqueue_head( &wq_read ); -+ init_waitqueue_head( &wq_write ); -+ init_waitqueue_head( &wq_poll ); -+ -+ // initialize tx timeout timer -+ init_timer( &tx_timer ); -+ tx_timer.function = tx_timeout; -+ -+ printk( KERN_INFO "USB Function Character Driver Interface" -+ " - %s, (C) 2001, Extenex Corp.\n", VERSION -+ ); -+ -+ return rc; -+} -+ -+void __exit usbc_exit( void ) -+{ -+} -+ -+EXPORT_NO_SYMBOLS; -+ -+module_init(usbc_init); -+module_exit(usbc_exit); -+ -+ -+ -+// end: usb-char.c -+ -+ -+ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/mach-pxa/usb-char.h 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,34 @@ -+/* -+ * Copyright (C) 2001 Extenex Corporation -+ * -+ * usb-char.h -+ * -+ * Character device emulation client for SA-1100 client usb core. -+ * -+ * -+ * -+ */ -+#ifndef _USB_CHAR_H -+#define _USB_CHAR_H -+ -+#define USBC_MAJOR 10 /* miscellaneous character device */ -+#define USBC_MINOR 240 /* in the "reserved for local use" range */ -+ -+#define USBC_MAGIC 0x8E -+ -+/* zap everything in receive ring buffer */ -+#define USBC_IOC_FLUSH_RECEIVER _IO( USBC_MAGIC, 0x01 ) -+ -+/* reset transmitter */ -+#define USBC_IOC_FLUSH_TRANSMITTER _IO( USBC_MAGIC, 0x02 ) -+ -+/* do both of above */ -+#define USBC_IOC_FLUSH_ALL _IO( USBC_MAGIC, 0x03 ) -+ -+ -+ -+ -+ -+ -+#endif /* _USB_CHAR_H */ -+ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/mach-pxa/usb-eth.c 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,479 @@ -+/* -+ * Ethernet driver for the PXA USB client function -+ * Copyright (c) 2001 by Nicolas Pitre -+ * -+ * This code was loosely inspired by the original initial ethernet test driver -+ * Copyright (c) Compaq Computer Corporation, 1999 -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * This is still work in progress... -+ * -+ * 19/02/2001 - Now we are compatible with generic usbnet driver. green@iXcelerator.com -+ * 09/03/2001 - Dropped 'framing' scheme, as it seems to cause a lot of problems with little benefit. -+ * Now, since we do not know what size of packet we are receiving -+ * last usb packet in sequence will always be less than max packet -+ * receive endpoint can accept. -+ * Now the only way to check correct start of frame is to compare -+ * MAC address. Also now we are stalling on each receive error. -+ * -+ * 15/03/2001 - Using buffer to get data from UDC. DMA needs to have 8 byte -+ * aligned buffer, but this breaks IP code (unaligned access). -+ * -+ * 01/04/2001 - stall endpoint operations appeared to be very unstable, so -+ * they are disabled now. -+ * -+ * 03/06/2001 - Readded "zerocopy" receive path (tunable). -+ * -+ */ -+ -+// Define DMA_NO_COPY if you want data to arrive directly into the -+// receive network buffers, instead of arriving into bounce buffer -+// and then get copied to network buffer. -+// This does not work correctly right now. -+#undef DMA_NO_COPY -+ -+#include <linux/module.h> -+#include <linux/init.h> -+#include <linux/sched.h> -+#include <linux/kernel.h> -+#include <linux/errno.h> -+#include <linux/timer.h> -+ -+#include <linux/netdevice.h> -+#include <linux/etherdevice.h> -+#include <linux/skbuff.h> -+#include <linux/random.h> -+ -+#include "pxa_usb.h" -+ -+ -+#define ETHERNET_VENDOR_ID 0x49f -+#define ETHERNET_PRODUCT_ID 0x505A -+#define MAX_PACKET 32768 -+#define MIN(a, b) (((a) < (b)) ? (a) : (b)) -+ -+// Should be global, so that insmod can change these -+int usb_rsize=64; -+int usb_wsize=64; -+ -+static struct usbe_info_t { -+ struct net_device *dev; -+ u16 packet_id; -+ struct net_device_stats stats; -+} usbe_info; -+ -+static char usb_eth_name[16] = "usbf"; -+static struct net_device usb_eth_device; -+static struct sk_buff *cur_tx_skb, *next_tx_skb; -+static struct sk_buff *cur_rx_skb, *next_rx_skb; -+static volatile int terminating; -+#ifndef DMA_NO_COPY -+static char *dmabuf; // we need that, as dma expect it's buffers to be aligned on 8 bytes boundary -+#endif -+ -+static int usb_change_mtu (struct net_device *net, int new_mtu) -+{ -+ if (new_mtu <= sizeof (struct ethhdr) || new_mtu > MAX_PACKET) -+ return -EINVAL; -+ // no second zero-length packet read wanted after mtu-sized packets -+ if (((new_mtu + sizeof (struct ethhdr)) % usb_rsize) == 0) -+ return -EDOM; -+ -+ net->mtu = new_mtu; -+ return 0; -+} -+ -+static struct sk_buff * -+usb_new_recv_skb(void) -+{ -+ struct sk_buff *skb = alloc_skb( 2 + sizeof (struct ethhdr) + usb_eth_device.mtu,GFP_ATOMIC); -+ -+ if (skb) { -+ skb_reserve(skb, 2); -+ } -+ return skb; -+} -+ -+static u8 bcast_hwaddr[ETH_ALEN]={0xff,0xff,0xff,0xff,0xff,0xff}; -+static void -+usb_recv_callback(int flag, int size) -+{ -+ struct sk_buff *skb; -+ -+ if (terminating) -+ return; -+ -+ skb = cur_rx_skb; -+ -+ /* flag validation */ -+ if (flag == 0) { -+ if ( skb_tailroom (skb) < size ) { // hey! we are overloaded!!! -+ usbe_info.stats.rx_over_errors++; -+ goto error; -+ } -+#ifndef DMA_NO_COPY -+ memcpy(skb->tail,dmabuf,size); -+#endif -+ skb_put(skb, size); -+ } else { -+ if (flag == -EIO) { -+ usbe_info.stats.rx_errors++; -+ } -+ goto error; -+ } -+ -+ -+ /* -+ * If the real size of the packet is divisible by usb_rsize -+ * an extra byte will be added. Thus size == usb_rsize -+ * should only happen if more data is to come. -+ */ -+ /* validate packet length */ -+ if (size == usb_rsize ) { -+ /* packet not complete yet */ -+ skb = NULL; -+ } -+ -+ /* -+ * At this point skb is non null if we have a complete packet. -+ * If so take a fresh skb right away and restart USB receive without -+ * further delays, then process the packet. Otherwise resume USB -+ * receive on the current skb and exit. -+ */ -+ -+ if (skb) -+ cur_rx_skb = next_rx_skb; -+#ifndef DMA_NO_COPY -+ pxa_usb_recv(dmabuf, usb_rsize, -+ usb_recv_callback); -+#else -+ pxa_usb_recv(cur_rx_skb->tail, MIN(usb_rsize, skb_tailroom (cur_rx_skb)), -+ usb_recv_callback); -+#endif -+ if (!skb) -+ return; -+ -+ next_rx_skb = usb_new_recv_skb(); -+ if (!next_rx_skb) { -+ /* -+ * We can't aford loosing buffer space... -+ * So we drop the current packet and recycle its skb. -+ */ -+ printk("%s: can't allocate new skb\n", __FUNCTION__); -+ usbe_info.stats.rx_dropped++; -+ skb_trim(skb, 0); -+ next_rx_skb = skb; -+ return; -+ } -+ if ( skb->len >= sizeof(struct ethhdr)) { -+ if (memcmp(skb->data,usb_eth_device.dev_addr,ETH_ALEN) && memcmp(skb->data,bcast_hwaddr,ETH_ALEN) ) { -+ // This frame is not for us. nor it is broadcast -+ usbe_info.stats.rx_frame_errors++; -+ kfree_skb(skb); -+ goto error; -+ } -+ -+#if 0 -+{ -+ int i; -+ -+ for (i = 0; i < skb->len; i++) -+ { -+ printk("%02X ", skb->data[i]); -+ if( (i%8)==7) printk("\n"); -+ } -+ printk("...\n"); -+} -+#endif -+ -+ } -+ -+ if (skb->len) { -+ int status; -+// FIXME: eth_copy_and_csum "small" packets to new SKB (small < ~200 bytes) ? -+ -+ skb->dev = &usb_eth_device; -+ skb->protocol = eth_type_trans (skb, &usb_eth_device); -+ usbe_info.stats.rx_packets++; -+ usbe_info.stats.rx_bytes += skb->len; -+ skb->ip_summed = CHECKSUM_NONE; -+ status = netif_rx (skb); -+ if (status != NET_RX_SUCCESS) -+ printk("netif_rx failed with code %d\n",status); -+ } else { -+error: -+//printk("ERROR... tailroom=%d size=%d len=%d flag=%d\n", skb_tailroom(skb), size, skb->len, flag); -+ /* -+ * Error due to HW addr mismatch, or IO error. -+ * Recycle the current skb and reset USB reception. -+ */ -+ skb_trim(cur_rx_skb, 0); -+// if ( flag == -EINTR || flag == -EAGAIN ) // only if we are coming out of stall -+#ifndef DMA_NO_COPY -+ pxa_usb_recv(dmabuf, usb_rsize, usb_recv_callback); -+#else -+ pxa_usb_recv(cur_rx_skb->tail, MIN(usb_rsize, skb_tailroom (cur_rx_skb)), usb_recv_callback); -+#endif -+ } -+} -+ -+ -+static void -+usb_send_callback(int flag, int size) -+{ -+ struct net_device *dev = usbe_info.dev; -+ struct net_device_stats *stats; -+ struct sk_buff *skb=cur_tx_skb; -+ int ret; -+ -+ if (terminating) -+ return; -+ -+ stats = &usbe_info.stats; -+ switch (flag) { -+ case 0: -+ stats->tx_packets++; -+ stats->tx_bytes += size; -+ break; -+ case -EIO: -+ stats->tx_errors++; -+ break; -+ default: -+ stats->tx_dropped++; -+ break; -+ } -+ -+ cur_tx_skb = next_tx_skb; -+ next_tx_skb = NULL; -+ dev_kfree_skb_irq(skb); -+ if (!cur_tx_skb) -+ return; -+ -+ dev->trans_start = jiffies; -+ ret = pxa_usb_send(cur_tx_skb->data, cur_tx_skb->len, usb_send_callback); -+ if (ret) { -+ /* If the USB core can't accept the packet, we drop it. */ -+ dev_kfree_skb_irq(cur_tx_skb); -+ cur_tx_skb = NULL; -+ usbe_info.stats.tx_carrier_errors++; -+ } -+ netif_wake_queue(dev); -+} -+ -+static int -+usb_eth_xmit(struct sk_buff *skb, struct net_device *dev) -+{ -+ int ret; -+ long flags; -+ -+ if (next_tx_skb) { -+ printk("%s: called with next_tx_skb != NULL\n", __FUNCTION__); -+ return 1; -+ } -+ -+ if (skb_shared (skb)) { -+ struct sk_buff *skb2 = skb_unshare(skb, GFP_ATOMIC); -+ if (!skb2) { -+ usbe_info.stats.tx_dropped++; -+ dev_kfree_skb(skb); -+ return 1; -+ } -+ skb = skb2; -+ } -+ -+ if ((skb->len % usb_wsize) == 0) { -+ skb->len++; // other side will ignore this one, anyway. -+ } -+ -+ save_flags_cli(flags); -+ if (cur_tx_skb) { -+ next_tx_skb = skb; -+ netif_stop_queue(dev); -+ } else { -+ cur_tx_skb = skb; -+ dev->trans_start = jiffies; -+ ret = pxa_usb_send(skb->data, skb->len, usb_send_callback); -+ if (ret) { -+ /* If the USB core can't accept the packet, we drop it. */ -+ dev_kfree_skb(skb); -+ cur_tx_skb = NULL; -+ usbe_info.stats.tx_carrier_errors++; -+ } -+ } -+ restore_flags(flags); -+ return 0; -+} -+ -+static void -+usb_xmit_timeout(struct net_device *dev ) -+{ -+ pxa_usb_send_reset(); -+ dev->trans_start = jiffies; -+ netif_wake_queue(dev); -+} -+ -+ -+static int -+usb_eth_open(struct net_device *dev) -+{ -+ int rc; -+ rc = pxa_usb_open( "usb-eth" ); -+ if ( rc == 0 ) { -+ string_desc_t * pstr; -+ desc_t * pd = pxa_usb_get_descriptor_ptr(); -+ -+ pd->b.ep1.wMaxPacketSize = make_word( usb_rsize ); -+ pd->b.ep2.wMaxPacketSize = make_word( usb_wsize ); -+ pd->dev.idVendor = ETHERNET_VENDOR_ID; -+ pd->dev.idProduct = ETHERNET_PRODUCT_ID; -+ pstr = pxa_usb_kmalloc_string_descriptor( "PXA USB NIC" ); -+ if ( pstr ) { -+ pxa_usb_set_string_descriptor( 1, pstr ); -+ pd->dev.iProduct = 1; -+ } -+ rc = pxa_usb_start(); -+ } -+ -+ if( rc == 0) -+ { -+ terminating = 0; -+ cur_tx_skb = next_tx_skb = NULL; -+ cur_rx_skb = usb_new_recv_skb(); -+ next_rx_skb = usb_new_recv_skb(); -+ if (!cur_rx_skb || !next_rx_skb) { -+ printk("%s: can't allocate new skb\n", __FUNCTION__); -+ if (cur_rx_skb) -+ kfree_skb(cur_rx_skb); -+ if (next_rx_skb) -+ kfree_skb(next_rx_skb); -+ -+ pxa_usb_stop(); -+ pxa_usb_close(); -+ return -ENOMEM;; -+ } -+ -+ MOD_INC_USE_COUNT; -+#ifndef DMA_NO_COPY -+ pxa_usb_recv(dmabuf, usb_rsize, usb_recv_callback); -+#else -+ pxa_usb_recv(cur_rx_skb->tail, MIN(usb_rsize, skb_tailroom (cur_rx_skb)), -+ usb_recv_callback); -+#endif -+ } -+ -+ return rc; -+} -+ -+static int -+usb_eth_release(struct net_device *dev) -+{ -+ string_desc_t * pstr; -+ -+ terminating = 1; -+ pxa_usb_send_reset(); -+ pxa_usb_recv_reset(); -+ if (cur_tx_skb) -+ kfree_skb(cur_tx_skb); -+ if (next_tx_skb) -+ kfree_skb(next_tx_skb); -+ if (cur_rx_skb) -+ kfree_skb(cur_rx_skb); -+ if (next_rx_skb) -+ kfree_skb(next_rx_skb); -+ -+ pxa_usb_stop(); -+ pxa_usb_close(); -+ if ( (pstr = pxa_usb_get_string_descriptor(1)) != NULL ) -+ kfree( pstr ); -+ -+ MOD_DEC_USE_COUNT; -+ return 0; -+} -+ -+static struct net_device_stats * -+usb_eth_stats(struct net_device *dev) -+{ -+ struct usbe_info_t *priv = (struct usbe_info_t*) dev->priv; -+ struct net_device_stats *stats=NULL; -+ -+ if (priv) -+ stats = &priv->stats; -+ return stats; -+} -+ -+static int -+usb_eth_probe(struct net_device *dev) -+{ -+ u8 node_id [ETH_ALEN]; -+ -+ get_random_bytes (node_id, sizeof node_id); -+ node_id [0] &= 0xfe; // clear multicast bit -+ -+ /* -+ * Assign the hardware address of the board: -+ * generate it randomly, as there can be many such -+ * devices on the bus. -+ */ -+ memcpy (dev->dev_addr, node_id, sizeof node_id); -+ -+ dev->open = usb_eth_open; -+ dev->change_mtu = usb_change_mtu; -+ dev->stop = usb_eth_release; -+ dev->hard_start_xmit = usb_eth_xmit; -+ dev->get_stats = usb_eth_stats; -+ dev->watchdog_timeo = 1*HZ; -+ dev->tx_timeout = usb_xmit_timeout; -+ dev->priv = &usbe_info; -+ -+ usbe_info.dev = dev; -+ -+ /* clear the statistics */ -+ memset(&usbe_info.stats, 0, sizeof(struct net_device_stats)); -+ -+ ether_setup(dev); -+ dev->flags &= ~IFF_MULTICAST; -+ dev->flags &= ~IFF_BROADCAST; -+ //dev->flags |= IFF_NOARP; -+ -+ return 0; -+} -+ -+#ifdef MODULE -+MODULE_PARM(usb_rsize, "1i"); -+MODULE_PARM_DESC(usb_rsize, "number of bytes in packets from host to pxa"); -+MODULE_PARM(usb_wsize, "1i"); -+MODULE_PARM_DESC(usb_wsize, "number of bytes in packets from pxa to host"); -+#endif -+ -+static int __init -+usb_eth_init(void) -+{ -+#ifndef DMA_NO_COPY -+ dmabuf = kmalloc( usb_rsize, GFP_KERNEL | GFP_DMA ); -+ if (!dmabuf) -+ return -ENOMEM; -+#endif -+ strncpy(usb_eth_device.name, usb_eth_name, IFNAMSIZ); -+ usb_eth_device.init = usb_eth_probe; -+ if (register_netdev(&usb_eth_device) != 0) -+ return -EIO; -+ -+ printk( KERN_INFO "USB Function Ethernet Driver Interface\n"); -+ -+ return 0; -+} -+ -+static void __exit -+usb_eth_cleanup(void) -+{ -+#ifndef DMA_NO_COPY -+ kfree(dmabuf); -+#endif -+ unregister_netdev(&usb_eth_device); -+} -+ -+module_init(usb_eth_init); -+module_exit(usb_eth_cleanup); ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/mach-pxa/usb_ctl.c 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,769 @@ -+/* -+ * Copyright (C) Compaq Computer Corporation, 1998, 1999 -+ * Copyright (C) Extenex Corporation, 2001 -+ * Copyright (C) Intrinsyc, Inc., 2002 -+ * -+ * PXA USB controller core driver. -+ * -+ * This file provides interrupt routing and overall coordination -+ * of the endpoints. -+ * -+ * Please see: -+ * linux/Documentation/arm/SA1100/SA1100_USB -+ * for more info. -+ * -+ * 02-May-2002 -+ * Frank Becker (Intrinsyc) - derived from sa1100 usb_ctl.c -+ * -+ */ -+#include <linux/config.h> -+#include <linux/module.h> -+#include <linux/init.h> -+#include <linux/kernel.h> -+#include <linux/sched.h> -+#include <linux/proc_fs.h> -+#include <linux/tqueue.h> -+#include <linux/delay.h> -+#include <linux/slab.h> -+#include <asm/io.h> -+#include <asm/dma.h> -+#include <asm/irq.h> -+#include <asm/mach-types.h> -+ -+#include "pxa_usb.h" -+#include "usb_ctl.h" -+ -+//#define DEBUG 1 -+ -+#if DEBUG -+static unsigned int usb_debug = DEBUG; -+#else -+#define usb_debug 0 /* gcc will remove all the debug code for us */ -+#endif -+ -+////////////////////////////////////////////////////////////////////////////// -+// Prototypes -+////////////////////////////////////////////////////////////////////////////// -+ -+int usbctl_next_state_on_event( int event ); -+static void udc_int_hndlr(int, void *, struct pt_regs *); -+static void initialize_descriptors( void ); -+static void soft_connect_hook( int enable ); -+static void udc_disable(void); -+static void udc_enable(void); -+ -+#if CONFIG_PROC_FS -+#define PROC_NODE_NAME "driver/pxausb" -+static int usbctl_read_proc(char *page, char **start, off_t off, -+ int count, int *eof, void *data); -+#endif -+ -+////////////////////////////////////////////////////////////////////////////// -+// Globals -+////////////////////////////////////////////////////////////////////////////// -+static const char pszMe[] = "usbctl: "; -+struct usb_info_t usbd_info; /* global to ep0, usb_recv, usb_send */ -+ -+/* device descriptors */ -+static desc_t desc; -+ -+#define MAX_STRING_DESC 8 -+static string_desc_t * string_desc_array[ MAX_STRING_DESC ]; -+static string_desc_t sd_zero; /* special sd_zero holds language codes */ -+ -+// called when configured -+static usb_notify_t configured_callback = NULL; -+ -+enum { -+ kStateZombie = 0, -+ kStateZombieSuspend = 1, -+ kStateDefault = 2, -+ kStateDefaultSuspend = 3, -+ kStateAddr = 4, -+ kStateAddrSuspend = 5, -+ kStateConfig = 6, -+ kStateConfigSuspend = 7 -+}; -+ -+/* -+ * FIXME: The PXA UDC handles several host device requests without user -+ * notification/intervention. The table could be collapsed quite a bit... -+ */ -+static int device_state_machine[8][6] = { -+// suspend reset resume adddr config deconfig -+/* zombie */ { kStateZombieSuspend , kStateDefault, kStateZombie , kError , kError , kError }, -+/* zom sus */ { kStateZombieSuspend , kStateDefault, kStateZombie , kError , kError , kError }, -+/* default */ { kStateDefaultSuspend, kStateDefault, kStateDefault, kStateAddr, kStateConfig, kError }, -+/* def sus */ { kStateDefaultSuspend, kStateDefault, kStateDefault, kError , kError , kError }, -+/* addr */ { kStateAddrSuspend , kStateDefault, kStateAddr , kError , kStateConfig, kError }, -+/* addr sus */{ kStateAddrSuspend , kStateDefault, kStateAddr , kError , kError , kError }, -+/* config */ { kStateConfigSuspend , kStateDefault, kStateConfig , kError , kError , kStateDefault }, -+/* cfg sus */ { kStateConfigSuspend , kStateDefault, kStateConfig , kError , kError , kError } -+}; -+ -+/* "device state" is the usb device framework state, as opposed to the -+ "state machine state" which is whatever the driver needs and is much -+ more fine grained -+*/ -+static int sm_state_to_device_state[8] = { -+// zombie zom suspend -+USB_STATE_POWERED, USB_STATE_SUSPENDED, -+// default default sus -+USB_STATE_DEFAULT, USB_STATE_SUSPENDED, -+// addr addr sus -+USB_STATE_ADDRESS, USB_STATE_SUSPENDED, -+// config config sus -+USB_STATE_CONFIGURED, USB_STATE_SUSPENDED -+}; -+ -+static char * state_names[8] = -+{ "zombie", "zombie suspended", -+ "default", "default suspended", -+ "address", "address suspended", -+ "configured", "config suspended" -+}; -+ -+static char * event_names[6] = -+{ "suspend", "reset", "resume", -+ "address assigned", "configure", "de-configure" -+}; -+ -+static char * device_state_names[] = -+{ "not attached", "attached", "powered", "default", -+ "address", "configured", "suspended" }; -+ -+static int sm_state = kStateZombie; -+ -+////////////////////////////////////////////////////////////////////////////// -+// Async -+////////////////////////////////////////////////////////////////////////////// -+ -+/* The UDCCR reg contains mask and interrupt status bits, -+ * so using '|=' isn't safe as it may ack an interrupt. -+ */ -+ -+void udc_set_mask_UDCCR( int mask ) -+{ -+ UDCCR = (UDCCR & UDCCR_MASK_BITS) | (mask & UDCCR_MASK_BITS); -+} -+ -+void udc_clear_mask_UDCCR( int mask) -+{ -+ UDCCR = (UDCCR & UDCCR_MASK_BITS) & ~(mask & UDCCR_MASK_BITS); -+} -+ -+void udc_ack_int_UDCCR( int mask) -+{ -+ /* udccr contains the bits we dont want to change */ -+ __u32 udccr = UDCCR & UDCCR_MASK_BITS; -+ -+ UDCCR = udccr | (mask & ~UDCCR_MASK_BITS); -+} -+ -+static void -+udc_int_hndlr(int irq, void *dev_id, struct pt_regs *regs) -+{ -+ __u32 status = UDCCR; -+ __u32 ir0_status = USIR0; -+ __u32 ir1_status = USIR1; -+ __u32 uicr0 = UICR0; -+ __u32 uicr1 = UICR1; -+ -+ //mask ints -+ udc_set_mask_UDCCR( UDCCR_REM | UDCCR_SRM); -+ UICR0 = 0xff; -+ UICR1 = 0xff; -+ -+ if( usb_debug > 2) -+ { -+ printk("%s--- udc_int_hndlr\n" -+ "UDCCR=0x%08x UDCCS0=0x%08x UDCCS1=0x%08x UDCCS2=0x%08x\n" -+ "USIR0=0x%08x USIR1=0x%08x UICR0=0x%08x UICR1=0x%08x\n", -+ pszMe, status, UDCCS0, UDCCS1, UDCCS2, ir0_status, ir1_status, uicr0, uicr1); -+ } -+ -+ /* SUSpend Interrupt Request */ -+ if ( status & UDCCR_SUSIR ) -+ { -+ udc_ack_int_UDCCR( UDCCR_SUSIR); -+ if( usb_debug) printk("%sSuspend...\n", pszMe); -+ usbctl_next_state_on_event( kEvSuspend ); -+ } -+ -+ /* RESume Interrupt Request */ -+ if ( status & UDCCR_RESIR ) -+ { -+ udc_ack_int_UDCCR( UDCCR_RESIR); -+ if( usb_debug) printk("%sResume...\n", pszMe); -+ usbctl_next_state_on_event( kEvResume ); -+ } -+ -+ /* ReSeT Interrupt Request - UDC has been reset */ -+ if ( status & UDCCR_RSTIR ) -+ { -+ /* clear the reset interrupt */ -+ udc_ack_int_UDCCR( UDCCR_RSTIR); -+ -+ /* check type of reset */ -+ if( (UDCCR & UDCCR_UDA) == 0) -+ { -+ /* reset assertion took place, nothing to do */ -+ if( usb_debug) printk("%sReset assertion...\n", pszMe); -+ } -+ -+ /* ok, it's a reset negation, go on with reset */ -+ else if ( usbctl_next_state_on_event( kEvReset ) != kError ) -+ { -+ /* starting reset sequence now... */ -+ if( usb_debug) printk("%sResetting\n", pszMe); -+ -+ ep0_reset(); -+ ep_bulk_in1_reset(); -+ ep_bulk_out1_reset(); -+ -+ usbctl_next_state_on_event( kEvConfig ); -+ } -+ else -+ { -+ printk("%sUnexpected reset\n", pszMe); -+ } -+ } -+ else -+ { -+ /* ep0 int */ -+ if (ir0_status & USIR0_IR0) -+ ep0_int_hndlr(); -+ -+ /* transmit bulk */ -+ if (ir0_status & USIR0_IR1) -+ ep_bulk_in1_int_hndlr(ir0_status); -+ -+ /* receive bulk */ -+ if ( ir0_status & USIR0_IR2) -+ ep_bulk_out1_int_hndlr(ir0_status); -+ -+ while (UDCCS2 & UDCCS_BO_RNE) -+ { -+ if( usb_debug) printk("More Bulk-out data...\n"); -+ ep_bulk_out1_int_hndlr(ir0_status); -+ } -+ } -+ -+ UICR0 = uicr0; -+ UICR1 = uicr1; -+ udc_clear_mask_UDCCR( UDCCR_SRM | UDCCR_REM); /* enable suspend/resume, reset */ -+ -+ /* clear all endpoint ints */ -+ USIR0 |= 0xff; -+ USIR1 |= 0xff; -+ -+ if( usb_debug > 2) -+ { -+ printk("%sudc_int_hndlr\n" -+ "UDCCR=0x%08x UDCCS0=0x%08x UDCCS1=0x%08x UDCCS2=0x%08x\n" -+ "USIR0=0x%08x USIR1=0x%08x UICR0=0x%08x UICR1=0x%08x\n", -+ pszMe, UDCCR, UDCCS0, UDCCS1, UDCCS2, USIR0, USIR1, UICR0, UICR1); -+ } -+} -+ -+////////////////////////////////////////////////////////////////////////////// -+// Public Interface -+////////////////////////////////////////////////////////////////////////////// -+ -+/* Open PXA usb core on behalf of a client, but don't start running */ -+ -+int -+pxa_usb_open( const char * client ) -+{ -+ if ( usbd_info.client_name != NULL ) -+ { -+ printk( "%sUnable to register %s (%s already registered).\n", -+ pszMe, client, usbd_info.client_name ); -+ return -EBUSY; -+ } -+ -+ usbd_info.client_name = (char*) client; -+ memset(&usbd_info.stats, 0, sizeof(struct usb_stats_t)); -+ memset(string_desc_array, 0, sizeof(string_desc_array)); -+ -+ /* hack to start in zombie suspended state */ -+ sm_state = kStateZombieSuspend; -+ usbd_info.state = USB_STATE_SUSPENDED; -+ -+ /* create descriptors for enumeration */ -+ initialize_descriptors(); -+ -+ printk( "%s%s registered.\n", pszMe, client ); -+ return 0; -+} -+ -+/* Start running. Must have called usb_open (above) first */ -+int -+pxa_usb_start( void ) -+{ -+ if ( usbd_info.client_name == NULL ) { -+ printk( "%s%s - no client registered\n", -+ pszMe, __FUNCTION__ ); -+ return -EPERM; -+ } -+ -+ /* start UDC internal machinery running */ -+ udc_enable(); -+ udelay( 100 ); -+ -+ /* flush DMA and fire through some -EAGAINs */ -+ ep_bulk_out1_init( usbd_info.dmach_rx ); -+ ep_bulk_in1_init( usbd_info.dmach_tx ); -+ -+ /* give endpoint notification we are starting */ -+ ep_bulk_out1_state_change_notify( USB_STATE_SUSPENDED ); -+ ep_bulk_in1_state_change_notify( USB_STATE_SUSPENDED ); -+ -+ /* enable any platform specific hardware */ -+ soft_connect_hook( 1 ); -+ -+ /* enable suspend/resume, reset */ -+ udc_clear_mask_UDCCR( UDCCR_SRM | UDCCR_REM); -+ /* enable ep0, ep1, ep2 */ -+ UICR0 &= ~(UICR0_IM0 | UICR0_IM1 | UICR0_IM2); -+ -+ if( usb_debug) printk( "%sStarted %s\n", pszMe, usbd_info.client_name ); -+ return 0; -+} -+ -+/* Stop USB core from running */ -+int -+pxa_usb_stop( void ) -+{ -+ if ( usbd_info.client_name == NULL ) { -+ printk( "%s%s - no client registered\n", -+ pszMe, __FUNCTION__ ); -+ return -EPERM; -+ } -+ /* mask everything */ -+ /* disable suspend/resume, reset */ -+ udc_set_mask_UDCCR( UDCCR_SRM | UDCCR_REM); -+ /* disable ep0, ep1, ep2 */ -+ UICR0 |= (UICR0_IM0 | UICR0_IM1 | UICR0_IM2); -+ -+ ep_bulk_out1_reset(); -+ ep_bulk_in1_reset(); -+ -+ udc_disable(); -+ if( usb_debug) printk( "%sStopped %s\n", pszMe, usbd_info.client_name ); -+ return 0; -+} -+ -+/* Tell PXA core client is through using it */ -+int -+pxa_usb_close( void ) -+{ -+ if ( usbd_info.client_name == NULL ) { -+ printk( "%s%s - no client registered\n", -+ pszMe, __FUNCTION__ ); -+ return -EPERM; -+ } -+ printk( "%s%s closed.\n", pszMe, (char*)usbd_info.client_name ); -+ usbd_info.client_name = NULL; -+ return 0; -+} -+ -+/* set a proc to be called when device is configured */ -+usb_notify_t pxa_set_configured_callback( usb_notify_t func ) -+{ -+ usb_notify_t retval = configured_callback; -+ configured_callback = func; -+ return retval; -+} -+ -+/*==================================================== -+ * Descriptor Manipulation. -+ * Use these between open() and start() above to setup -+ * the descriptors for your device. -+ * -+ */ -+ -+/* get pointer to static default descriptor */ -+desc_t * -+pxa_usb_get_descriptor_ptr( void ) { return &desc; } -+ -+/* optional: set a string descriptor */ -+int -+pxa_usb_set_string_descriptor( int i, string_desc_t * p ) -+{ -+ int retval; -+ if ( i < MAX_STRING_DESC ) { -+ string_desc_array[i] = p; -+ retval = 0; -+ } else { -+ retval = -EINVAL; -+ } -+ return retval; -+} -+ -+/* optional: get a previously set string descriptor */ -+string_desc_t * -+pxa_usb_get_string_descriptor( int i ) -+{ -+ return ( i < MAX_STRING_DESC ) -+ ? string_desc_array[i] -+ : NULL; -+} -+ -+ -+/* optional: kmalloc and unicode up a string descriptor */ -+string_desc_t * -+pxa_usb_kmalloc_string_descriptor( const char * p ) -+{ -+ string_desc_t * pResult = NULL; -+ -+ if ( p ) { -+ int len = strlen( p ); -+ int uni_len = len * sizeof( __u16 ); -+ pResult = (string_desc_t*) kmalloc( uni_len + 2, GFP_KERNEL ); /* ugh! */ -+ if ( pResult != NULL ) { -+ int i; -+ pResult->bLength = uni_len + 2; -+ pResult->bDescriptorType = USB_DESC_STRING; -+ for( i = 0; i < len ; i++ ) { -+ pResult->bString[i] = make_word( (__u16) p[i] ); -+ } -+ } -+ } -+ return pResult; -+} -+ -+////////////////////////////////////////////////////////////////////////////// -+// Exports to rest of driver -+////////////////////////////////////////////////////////////////////////////// -+ -+/* called by the int handler here and the two endpoint files when interesting -+ .."events" happen */ -+ -+int -+usbctl_next_state_on_event( int event ) -+{ -+ int next_state = device_state_machine[ sm_state ][ event ]; -+ if ( next_state != kError ) -+ { -+ int next_device_state = sm_state_to_device_state[ next_state ]; -+ if( usb_debug) printk( "%s%s --> [%s] --> %s. Device in %s state.\n", -+ pszMe, state_names[ sm_state ], event_names[ event ], -+ state_names[ next_state ], device_state_names[ next_device_state ] ); -+ -+ sm_state = next_state; -+ if ( usbd_info.state != next_device_state ) -+ { -+ if ( configured_callback != NULL -+ && -+ next_device_state == USB_STATE_CONFIGURED -+ && -+ usbd_info.state != USB_STATE_SUSPENDED -+ ) { -+ configured_callback(); -+ } -+ usbd_info.state = next_device_state; -+ -+ ep_bulk_out1_state_change_notify( next_device_state ); -+ ep_bulk_in1_state_change_notify( next_device_state ); -+ } -+ } -+#if 1 -+ else -+ printk( "%s%s --> [%s] --> ??? is an error.\n", -+ pszMe, state_names[ sm_state ], event_names[ event ] ); -+#endif -+ return next_state; -+} -+ -+////////////////////////////////////////////////////////////////////////////// -+// Private Helpers -+////////////////////////////////////////////////////////////////////////////// -+ -+/* setup default descriptors */ -+ -+static void -+initialize_descriptors(void) -+{ -+ desc.dev.bLength = sizeof( device_desc_t ); -+ desc.dev.bDescriptorType = USB_DESC_DEVICE; -+ desc.dev.bcdUSB = 0x100; /* 1.0 */ -+ desc.dev.bDeviceClass = 0xFF; /* vendor specific */ -+ desc.dev.bDeviceSubClass = 0; -+ desc.dev.bDeviceProtocol = 0; -+ desc.dev.bMaxPacketSize0 = 16; /* ep0 max fifo size */ -+ desc.dev.idVendor = 0; /* vendor ID undefined */ -+ desc.dev.idProduct = 0; /* product */ -+ desc.dev.bcdDevice = 0; /* vendor assigned device release num */ -+ desc.dev.iManufacturer = 0; /* index of manufacturer string */ -+ desc.dev.iProduct = 0; /* index of product description string */ -+ desc.dev.iSerialNumber = 0; /* index of string holding product s/n */ -+ desc.dev.bNumConfigurations = 1; -+ -+ desc.b.cfg.bLength = sizeof( config_desc_t ); -+ desc.b.cfg.bDescriptorType = USB_DESC_CONFIG; -+ desc.b.cfg.wTotalLength = make_word_c( sizeof(struct cdb) ); -+ desc.b.cfg.bNumInterfaces = 1; -+ desc.b.cfg.bConfigurationValue = 1; -+ desc.b.cfg.iConfiguration = 0; -+ desc.b.cfg.bmAttributes = USB_CONFIG_BUSPOWERED; -+ desc.b.cfg.MaxPower = USB_POWER( 500 ); -+ -+ desc.b.intf.bLength = sizeof( intf_desc_t ); -+ desc.b.intf.bDescriptorType = USB_DESC_INTERFACE; -+ desc.b.intf.bInterfaceNumber = 0; /* unique intf index*/ -+ desc.b.intf.bAlternateSetting = 0; -+ desc.b.intf.bNumEndpoints = 2; -+ desc.b.intf.bInterfaceClass = 0xFF; /* vendor specific */ -+ desc.b.intf.bInterfaceSubClass = 0; -+ desc.b.intf.bInterfaceProtocol = 0; -+ desc.b.intf.iInterface = 0; -+ -+/* -+ * FIXME... -+ * The host usbnet driver expects EP1=out EP2=in. On the PXA UDC EP1=in, EP2=out -+ */ -+ desc.b.ep1.bLength = sizeof( ep_desc_t ); -+ desc.b.ep1.bDescriptorType = USB_DESC_ENDPOINT; -+ desc.b.ep1.bEndpointAddress = USB_EP_ADDRESS( 1, USB_IN ); -+ desc.b.ep1.bmAttributes = USB_EP_BULK; -+ desc.b.ep1.wMaxPacketSize = make_word_c( 64 ); -+ desc.b.ep1.bInterval = 0; -+ -+ desc.b.ep2.bLength = sizeof( ep_desc_t ); -+ desc.b.ep2.bDescriptorType = USB_DESC_ENDPOINT; -+ desc.b.ep2.bEndpointAddress = USB_EP_ADDRESS( 2, USB_OUT ); -+ desc.b.ep2.bmAttributes = USB_EP_BULK; -+ desc.b.ep2.wMaxPacketSize = make_word_c( 64 ); -+ desc.b.ep2.bInterval = 0; -+ -+// FIXME: Add support for all endpoint... -+ -+ /* set language */ -+ /* See: http://www.usb.org/developers/data/USB_LANGIDs.pdf */ -+ sd_zero.bDescriptorType = USB_DESC_STRING; -+ sd_zero.bLength = sizeof( string_desc_t ); -+ sd_zero.bString[0] = make_word_c( 0x409 ); /* American English */ -+ pxa_usb_set_string_descriptor( 0, &sd_zero ); -+} -+ -+/* soft_connect_hook() -+ * Some devices have platform-specific circuitry to make USB -+ * not seem to be plugged in, even when it is. This allows -+ * software to control when a device 'appears' on the USB bus -+ * (after Linux has booted and this driver has loaded, for -+ * example). If you have such a circuit, control it here. -+ */ -+static void -+soft_connect_hook( int enable ) -+{ -+} -+ -+/* disable the UDC at the source */ -+static void -+udc_disable(void) -+{ -+ soft_connect_hook( 0 ); -+ /* clear UDC-enable */ -+ udc_clear_mask_UDCCR( UDCCR_UDE); -+ -+ /* Disable clock for USB device */ -+ CKEN &= ~CKEN11_USB; -+} -+ -+ -+/* enable the udc at the source */ -+static void -+udc_enable(void) -+{ -+ /* Enable clock for USB device */ -+ CKEN |= CKEN11_USB; -+ -+ /* try to clear these bits before we enable the udc */ -+ udc_ack_int_UDCCR( UDCCR_SUSIR); -+ udc_ack_int_UDCCR( UDCCR_RSTIR); -+ udc_ack_int_UDCCR( UDCCR_RESIR); -+ -+ /* set UDC-enable */ -+ udc_set_mask_UDCCR( UDCCR_UDE); -+ if( (UDCCR & UDCCR_UDA) == 0) -+ { -+ /* There's a reset on the bus, -+ * clear the interrupt bit and keep going -+ */ -+ udc_ack_int_UDCCR( UDCCR_RSTIR); -+ } -+ -+ /* "USB test mode" to work around errata 40-42 (stepping a0, a1) -+ * which could result in missing packets and interrupts. -+ * Supposedly this turns off double buffering for all endpoints. -+ */ -+ if( usb_debug) printk( "USB RES1=%x RES2=%x RES3=%x\n", UDC_RES1, UDC_RES2, UDC_RES3); -+ UDC_RES1 = 0x00; -+ UDC_RES2 = 0x00; -+ if( usb_debug) printk( "USB RES1=%x RES2=%x RES3=%x\n", UDC_RES1, UDC_RES2, UDC_RES3); -+} -+ -+////////////////////////////////////////////////////////////////////////////// -+// Proc Filesystem Support -+////////////////////////////////////////////////////////////////////////////// -+ -+#if CONFIG_PROC_FS -+ -+#define SAY( fmt, args... ) p += sprintf(p, fmt, ## args ) -+#define SAYV( num ) p += sprintf(p, num_fmt, "Value", num ) -+#define SAYC( label, yn ) p += sprintf(p, yn_fmt, label, yn ) -+#define SAYS( label, v ) p += sprintf(p, cnt_fmt, label, v ) -+ -+static int usbctl_read_proc(char *page, char **start, off_t off, -+ int count, int *eof, void *data) -+{ -+ const char * num_fmt = "%25.25s: %8.8lX\n"; -+ const char * cnt_fmt = "%25.25s: %lu\n"; -+ const char * yn_fmt = "%25.25s: %s\n"; -+ const char * yes = "YES"; -+ const char * no = "NO"; -+ unsigned long v; -+ char * p = page; -+ int len; -+ -+ SAY( "PXA USB Controller Core\n" ); -+ SAY( "Active Client: %s\n", usbd_info.client_name ? usbd_info.client_name : "none"); -+ SAY( "USB state: %s (%s) %d\n", -+ device_state_names[ sm_state_to_device_state[ sm_state ] ], -+ state_names[ sm_state ], -+ sm_state ); -+ -+ SAYS( "ep0 bytes read", usbd_info.stats.ep0_bytes_read ); -+ SAYS( "ep0 bytes written", usbd_info.stats.ep0_bytes_written ); -+ SAYS( "ep0 FIFO read failures", usbd_info.stats.ep0_fifo_write_failures ); -+ SAYS( "ep0 FIFO write failures", usbd_info.stats.ep0_fifo_write_failures ); -+ -+ SAY( "\n" ); -+ -+ v = UDCCR; -+ SAY( "\nUDC Control Register\n" ); -+ SAYV( v ); -+ SAYC( "UDC Enabled", ( v & UDCCR_UDE ) ? yes : no ); -+ SAYC( "UDC Active", ( v & UDCCR_UDA ) ? yes : no ); -+ SAYC( "Suspend/Resume interrupts masked", ( v & UDCCR_SRM ) ? yes : no ); -+ SAYC( "Reset interrupts masked", ( v & UDCCR_REM ) ? yes : no ); -+ SAYC( "Reset pending", ( v & UDCCR_RSTIR ) ? yes : no ); -+ SAYC( "Suspend pending", ( v & UDCCR_SUSIR ) ? yes : no ); -+ SAYC( "Resume pending", ( v & UDCCR_RESIR ) ? yes : no ); -+ -+ len = ( p - page ) - off; -+ if ( len < 0 ) -+ len = 0; -+ *eof = ( len <=count ) ? 1 : 0; -+ *start = page + off; -+ return len; -+} -+ -+#endif /* CONFIG_PROC_FS */ -+ -+#if 0 -+static void irq_handler(int channel, void *data, struct pt_regs *regs) -+{ -+ if( channel == usbd_info.dmach_rx) -+ { -+ printk( "USB receive DMA\n"); -+ } -+ else if( channel == usbd_info.dmach_tx) -+ { -+ printk( "USB transmit DMA\n"); -+ } -+ else -+ { -+ printk( "USB unknown DMA channel\n"); -+ } -+} -+#endif -+ -+////////////////////////////////////////////////////////////////////////////// -+// Module Initialization and Shutdown -+////////////////////////////////////////////////////////////////////////////// -+/* -+ * usbctl_init() -+ * Module load time. Allocate dma and interrupt resources. Setup /proc fs -+ * entry. Leave UDC disabled. -+ */ -+int __init usbctl_init( void ) -+{ -+ int retval = 0; -+ -+ udc_disable(); -+ -+ memset( &usbd_info, 0, sizeof( usbd_info ) ); -+ -+#if CONFIG_PROC_FS -+ create_proc_read_entry ( PROC_NODE_NAME, 0, NULL, usbctl_read_proc, NULL); -+#endif -+ -+#if 0 -+ /* setup rx dma */ -+ usbd_info.dmach_rx = pxa_request_dma("USB receive", DMA_PRIO_MEDIUM, irq_handler, 0 /*data; DMA_Ser0UDCRd*/); -+ if (usbd_info.dmach_rx < 0) { -+ printk("%sunable to register for rx dma rc=%d\n", pszMe, usbd_info.dmach_rx ); -+ goto err_rx_dma; -+ } -+ -+ /* setup tx dma */ -+ usbd_info.dmach_tx = pxa_request_dma("USB receive", DMA_PRIO_MEDIUM, irq_handler, 0 /*data; DMA_Ser0UDCRd*/); -+ if (usbd_info.dmach_tx < 0) { -+ printk("%sunable to register for tx dma rc=%d\n",pszMe,usbd_info.dmach_tx); -+ goto err_tx_dma; -+ } -+#endif -+ -+ /* now allocate the IRQ. */ -+ retval = request_irq(IRQ_USB, udc_int_hndlr, SA_INTERRUPT, "PXA USB core", NULL); -+ if (retval) { -+ printk("%sCouldn't request USB irq rc=%d\n",pszMe, retval); -+ goto err_irq; -+ } -+ -+ printk( "PXA USB Controller Core Initialized\n"); -+ return 0; -+ -+err_irq: -+#if 0 -+ pxa_free_dma(usbd_info.dmach_tx); -+ usbd_info.dmach_tx = 0; -+err_tx_dma: -+ pxa_free_dma(usbd_info.dmach_rx); -+ usbd_info.dmach_rx = 0; -+err_rx_dma: -+#endif -+ return retval; -+} -+/* -+ * usbctl_exit() -+ * Release DMA and interrupt resources -+ */ -+void __exit usbctl_exit( void ) -+{ -+ printk("Unloading PXA USB Controller\n"); -+ -+ udc_disable(); -+ -+#if CONFIG_PROC_FS -+ remove_proc_entry ( PROC_NODE_NAME, NULL); -+#endif -+ -+ pxa_free_dma(usbd_info.dmach_rx); -+ pxa_free_dma(usbd_info.dmach_tx); -+ free_irq(IRQ_USB, NULL); -+} -+ -+module_init( usbctl_init ); -+module_exit( usbctl_exit ); -+ -+EXPORT_SYMBOL( pxa_usb_open ); -+EXPORT_SYMBOL( pxa_usb_start ); -+EXPORT_SYMBOL( pxa_usb_stop ); -+EXPORT_SYMBOL( pxa_usb_close ); -+EXPORT_SYMBOL( pxa_usb_get_descriptor_ptr ); -+EXPORT_SYMBOL( pxa_usb_set_string_descriptor ); -+EXPORT_SYMBOL( pxa_usb_get_string_descriptor ); -+EXPORT_SYMBOL( pxa_usb_kmalloc_string_descriptor ); ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/mach-pxa/usb_ctl.h 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,89 @@ -+/* -+ * Copyright (C) Compaq Computer Corporation, 1998, 1999 -+ * Copyright (C) Extenex Corporation 2001 -+ * Copyright (C) Intrinsyc, Inc., 2002 -+ * -+ * usb_ctl.h -+ * -+ * PRIVATE interface used to share info among components of the PXA USB -+ * core: usb_ctl, usb_ep0, usb_recv and usb_send. Clients of the USB core -+ * should use pxa_usb.h. -+ * -+ * 02-May-2002 -+ * Frank Becker (Intrinsyc) - derived from sa1100 usb_ctl.h -+ * -+ */ -+ -+#ifndef _USB_CTL_H -+#define _USB_CTL_H -+ -+/* Interrupt mask bits and UDC enable bit */ -+#define UDCCR_MASK_BITS (UDCCR_REM | UDCCR_SRM | UDCCR_UDE) -+ -+/* -+ * These states correspond to those in the USB specification v1.0 -+ * in chapter 8, Device Framework. -+ */ -+enum { -+ USB_STATE_NOTATTACHED =0, -+ USB_STATE_ATTACHED =1, -+ USB_STATE_POWERED =2, -+ USB_STATE_DEFAULT =3, -+ USB_STATE_ADDRESS =4, -+ USB_STATE_CONFIGURED =5, -+ USB_STATE_SUSPENDED =6 -+}; -+ -+struct usb_stats_t { -+ unsigned long ep0_fifo_write_failures; -+ unsigned long ep0_bytes_written; -+ unsigned long ep0_fifo_read_failures; -+ unsigned long ep0_bytes_read; -+}; -+ -+struct usb_info_t -+{ -+ char * client_name; -+ dmach_t dmach_tx, dmach_rx; -+ int state; -+ unsigned char address; -+ struct usb_stats_t stats; -+}; -+ -+/* in usb_ctl.c */ -+extern struct usb_info_t usbd_info; -+ -+/* -+ * Function Prototypes -+ */ -+enum { -+ kError =-1, -+ kEvSuspend =0, -+ kEvReset =1, -+ kEvResume =2, -+ kEvAddress =3, -+ kEvConfig =4, -+ kEvDeConfig =5 -+}; -+int usbctl_next_state_on_event( int event ); -+ -+/* endpoint zero */ -+void ep0_reset(void); -+void ep0_int_hndlr(void); -+ -+/* receiver */ -+void ep_bulk_out1_state_change_notify( int new_state ); -+int ep_bulk_out1_recv(void); -+int ep_bulk_out1_init(int chn); -+void ep_bulk_out1_int_hndlr(int status); -+void ep_bulk_out1_reset(void); -+void ep_bulk_out1_stall(void); -+ -+/* xmitter */ -+void ep_bulk_in1_state_change_notify( int new_state ); -+void ep_bulk_in1_reset(void); -+int ep_bulk_in1_init(int chn); -+void ep_bulk_in1_int_hndlr(int status); -+void ep_bulk_in1_stall(void); -+ -+#endif /* _USB_CTL_H */ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/mach-pxa/usb_ep0.c 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,556 @@ -+/* -+ * Copyright (C) Extenex Corporation 2001 -+ * Copyright (C) Compaq Computer Corporation, 1998, 1999 -+ * Copyright (C) Intrinsyc, Inc., 2002 -+ * -+ * PXA USB controller driver - Endpoint zero management -+ * -+ * Please see: -+ * linux/Documentation/arm/SA1100/SA1100_USB -+ * for more info. -+ * -+ * 02-May-2002 -+ * Frank Becker (Intrinsyc) - derived from sa1100 usb_ctl.c -+ * -+ */ -+ -+#include <linux/config.h> -+#include <linux/module.h> -+#include <linux/init.h> -+#include <linux/proc_fs.h> -+#include <linux/tqueue.h> -+#include <linux/delay.h> -+#include <linux/sched.h> -+#include <linux/slab.h> -+#include <asm/io.h> -+#include <asm/dma.h> -+#include <asm/irq.h> -+ -+#include "pxa_usb.h" /* public interface */ -+#include "usb_ctl.h" /* private stuff */ -+#include "usb_ep0.h" -+ -+ -+// 1 == lots of trace noise, 0 = only "important' stuff -+#define VERBOSITY 0 -+ -+enum { true = 1, false = 0 }; -+typedef int bool; -+#ifndef MIN -+#define MIN( a, b ) ((a)<(b)?(a):(b)) -+#endif -+ -+#if 1 && !defined( ASSERT ) -+# define ASSERT(expr) \ -+if(!(expr)) { \ -+ printk( "Assertion failed! %s,%s,%s,line=%d\n",\ -+#expr,__FILE__,__FUNCTION__,__LINE__); \ -+} -+#else -+# define ASSERT(expr) -+#endif -+ -+#if VERBOSITY -+#define PRINTKD(fmt, args...) printk( fmt , ## args) -+#else -+#define PRINTKD(fmt, args...) -+#endif -+ -+static EP0_state ep0_state = EP0_IDLE; -+ -+/*************************************************************************** -+ Prototypes -+ ***************************************************************************/ -+/* "setup handlers" -- the main functions dispatched to by the -+ .. isr. These represent the major "modes" of endpoint 0 operation */ -+static void sh_setup_begin(void); /* setup begin (idle) */ -+static void sh_write( void ); /* writing data */ -+static int read_fifo( usb_dev_request_t * p ); -+static void write_fifo( void ); -+static void get_descriptor( usb_dev_request_t * pReq ); -+static void queue_and_start_write( void * p, int req, int act ); -+ -+/*************************************************************************** -+ Inline Helpers -+ ***************************************************************************/ -+ -+inline int type_code_from_request( __u8 by ) { return (( by >> 4 ) & 3); } -+ -+/* print string descriptor */ -+static inline void psdesc( string_desc_t * p ) -+{ -+ int i; -+ int nchars = ( p->bLength - 2 ) / sizeof( __u16 ); -+ printk( "'" ); -+ for( i = 0 ; i < nchars ; i++ ) { -+ printk( "%c", (char) p->bString[i] ); -+ } -+ printk( "'\n" ); -+} -+ -+#if VERBOSITY -+/* "pcs" == "print control status" */ -+static inline void pcs( void ) -+{ -+ __u32 foo = UDCCS0; -+ printk( "%08x: %s %s %s %s %s %s\n", -+ foo, -+ foo & UDCCS0_SA ? "SA" : "", -+ foo & UDCCS0_OPR ? "OPR" : "", -+ foo & UDCCS0_RNE ? "RNE" : "", -+ foo & UDCCS0_SST ? "SST" : "", -+ foo & UDCCS0_FST ? "FST" : "", -+ foo & UDCCS0_DRWF ? "DRWF" : "" -+ ); -+} -+static inline void preq( usb_dev_request_t * pReq ) -+{ -+ static char * tnames[] = { "dev", "intf", "ep", "oth" }; -+ static char * rnames[] = { "std", "class", "vendor", "???" }; -+ char * psz; -+ switch( pReq->bRequest ) { -+ case GET_STATUS: psz = "get stat"; break; -+ case CLEAR_FEATURE: psz = "clr feat"; break; -+ case SET_FEATURE: psz = "set feat"; break; -+ case SET_ADDRESS: psz = "set addr"; break; -+ case GET_DESCRIPTOR: psz = "get desc"; break; -+ case SET_DESCRIPTOR: psz = "set desc"; break; -+ case GET_CONFIGURATION: psz = "get cfg"; break; -+ case SET_CONFIGURATION: psz = "set cfg"; break; -+ case GET_INTERFACE: psz = "get intf"; break; -+ case SET_INTERFACE: psz = "set intf"; break; -+ case SYNCH_FRAME: psz = "synch frame"; break; -+ default: psz = "unknown"; break; -+ } -+ printk( "- [%s: %s req to %s. dir=%s]\n", psz, -+ rnames[ (pReq->bmRequestType >> 5) & 3 ], -+ tnames[ pReq->bmRequestType & 3 ], -+ ( pReq->bmRequestType & 0x80 ) ? "in" : "out" ); -+} -+ -+#else -+static inline void pcs( void ){} -+static inline void preq( usb_dev_request_t *x){} -+#endif -+ -+/*************************************************************************** -+ Globals -+ ***************************************************************************/ -+static const char pszMe[] = "usbep0: "; -+ -+/* pointer to current setup handler */ -+static void (*current_handler)(void) = sh_setup_begin; -+ -+/* global write struct to keep write -+ ..state around across interrupts */ -+static struct { -+ unsigned char *p; -+ int bytes_left; -+} wr; -+ -+/*************************************************************************** -+ Public Interface -+ ***************************************************************************/ -+ -+/* reset received from HUB (or controller just went nuts and reset by itself!) -+ so udc core has been reset, track this state here */ -+void ep0_reset(void) -+{ -+ PRINTKD( "%sep0_reset\n", pszMe); -+ /* reset state machine */ -+ current_handler = sh_setup_begin; -+ wr.p = NULL; -+ wr.bytes_left = 0; -+ usbd_info.address=0; -+} -+ -+/* handle interrupt for endpoint zero */ -+void ep0_int_hndlr( void ) -+{ -+ PRINTKD( "%sep0_int_hndlr\n", pszMe); -+ pcs(); -+ (*current_handler)(); -+} -+ -+/*************************************************************************** -+ Setup Handlers -+ ***************************************************************************/ -+/* -+ * sh_setup_begin() -+ * This setup handler is the "idle" state of endpoint zero. It looks for OPR -+ * (OUT packet ready) to see if a setup request has been been received from the -+ * host. -+ * -+ */ -+static void sh_setup_begin( void ) -+{ -+ usb_dev_request_t req; -+ int request_type; -+ int n; -+ __u32 cs_reg_in = UDCCS0; -+ -+ PRINTKD( "%ssh_setup_begin\n", pszMe); -+ -+ /* Be sure out packet ready, otherwise something is wrong */ -+ if ( (cs_reg_in & UDCCS0_OPR) == 0 ) { -+ /* we can get here early...if so, we'll int again in a moment */ -+ PRINTKD( "%ssetup begin: no OUT packet available. Exiting\n", pszMe ); -+ goto sh_sb_end; -+ } -+ -+ if( ((cs_reg_in & UDCCS0_SA) == 0) && (ep0_state == EP0_IN_DATA_PHASE)) -+ { -+ PRINTKD( "%ssetup begin: premature status\n", pszMe ); -+ -+ /* premature status, reset tx fifo and go back to idle state*/ -+ UDCCS0 = UDCCS0_OPR | UDCCS0_FTF; -+ -+ ep0_state = EP0_IDLE; -+ return; -+ } -+ -+ if( (UDCCS0 & UDCCS0_RNE) == 0) -+ { -+ /* zero-length OUT? */ -+ printk( "%ssetup begin: zero-length OUT?\n", pszMe ); -+ goto sh_sb_end; -+ } -+ -+ /* read the setup request */ -+ n = read_fifo( &req ); -+ if ( n != sizeof( req ) ) { -+ printk( "%ssetup begin: fifo READ ERROR wanted %d bytes got %d. " -+ " Stalling out...\n", -+ pszMe, sizeof( req ), n ); -+ /* force stall, serviced out */ -+ UDCCS0 = UDCCS0_FST; -+ goto sh_sb_end; -+ } -+ -+ /* Is it a standard request? (not vendor or class request) */ -+ request_type = type_code_from_request( req.bmRequestType ); -+ if ( request_type != 0 ) { -+ printk( "%ssetup begin: unsupported bmRequestType: %d ignored\n", -+ pszMe, request_type ); -+ goto sh_sb_end; -+ } -+ -+#if VERBOSITY -+ { -+ unsigned char * pdb = (unsigned char *) &req; -+ PRINTKD( "%2.2X %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X %2.2X ", -+ pdb[0], pdb[1], pdb[2], pdb[3], pdb[4], pdb[5], pdb[6], pdb[7] -+ ); -+ preq( &req ); -+ } -+#endif -+ -+ /* Handle it */ -+ switch( req.bRequest ) { -+ -+ case SET_ADDRESS: -+ PRINTKD( "%sSET_ADDRESS handled by UDC\n", pszMe); -+ break; -+#if 0 /* NOT_NEEDED */ -+ -+ case SET_FEATURE: -+ PRINTKD( "%sSET_FEATURE handled by UDC\n", pszMe); -+ break; -+ -+ case CLEAR_FEATURE: -+ PRINTKD( "%sCLEAR_FEATURE handled by UDC\n", pszMe); -+ break; -+ -+ case GET_CONFIGURATION: -+ PRINTKD( "%sGET_CONFIGURATION handled by UDC\n", pszMe ); -+ break; -+ -+ case GET_STATUS: -+ PRINTKD( "%s%sGET_STATUS handled by UDC\n", pszMe ); -+ break; -+ -+ case GET_INTERFACE: -+ PRINTKD( "%sGET_INTERFACE handled by UDC\n", pszMe); -+ break; -+ -+ case SYNCH_FRAME: -+ PRINTKD( "%sSYNCH_FRAME handled by UDC\n", pszMe ); -+ break; -+#endif -+ -+ case GET_DESCRIPTOR: -+ PRINTKD( "%sGET_DESCRIPTOR\n", pszMe ); -+ get_descriptor( &req ); -+ break; -+ -+ case SET_INTERFACE: -+ PRINTKD( "%sSET_INTERFACE TODO...\n", pszMe); -+ break; -+ -+ case SET_DESCRIPTOR: -+ PRINTKD( "%sSET_DESCRIPTOR TODO...\n", pszMe ); -+ break; -+ -+ case SET_CONFIGURATION: -+ PRINTKD( "%sSET_CONFIGURATION %d\n", pszMe, req.wValue); -+ -+/* -+ * FIXME: Something is not quite right here... I only ever get a -+ * de-configure from the host. Ignoring it for now, since usb -+ * ethernet won't do anything unless usb is 'configured'. -+ * -+ */ -+#if 0 -+ switch( req.wValue) -+ { -+ case 0: -+ /* configured */ -+ usbctl_next_state_on_event( kEvConfig ); -+ break; -+ case 1: -+ /* de-configured */ -+ usbctl_next_state_on_event( kEvDeConfig ); -+ break; -+ default: -+ PRINTKD( "%sSET_CONFIGURATION: unknown configuration value (%d)\n", pszMe, req.wValue); -+ break; -+ } -+#endif -+ break; -+ default : -+ printk("%sunknown request 0x%x\n", pszMe, req.bRequest); -+ break; -+ } /* switch( bRequest ) */ -+ -+sh_sb_end: -+ return; -+} -+ -+/* -+ * sh_write() -+ * -+ * Due to UDC bugs we push everything into the fifo in one go. -+ * Using interrupts just didn't work right... -+ * This should be ok, since control request are small. -+ */ -+static void sh_write() -+{ -+ PRINTKD( "sh_write\n" ); -+ do -+ { -+ write_fifo(); -+ } while( ep0_state != EP0_END_XFER); -+} -+ -+/*************************************************************************** -+ Other Private Subroutines -+ ***************************************************************************/ -+/* -+ * queue_and_start_write() -+ * data == data to send -+ * req == bytes host requested -+ * act == bytes we actually have -+ * -+ * Sets up the global "wr"-ite structure and load the outbound FIFO -+ * with data. -+ * -+ */ -+static void queue_and_start_write( void * data, int req, int act ) -+{ -+ PRINTKD( "write start: bytes requested=%d actual=%d\n", req, act); -+ -+ wr.p = (unsigned char*) data; -+ wr.bytes_left = MIN( act, req ); -+ -+ ep0_state = EP0_IN_DATA_PHASE; -+ sh_write(); -+ -+ return; -+} -+/* -+ * write_fifo() -+ * Stick bytes in the endpoint zero FIFO. -+ * -+ */ -+static void write_fifo( void ) -+{ -+ int bytes_this_time = MIN( wr.bytes_left, EP0_FIFO_SIZE ); -+ int bytes_written = 0; -+ -+ while( bytes_this_time-- ) { -+// PRINTKD( "%2.2X ", *wr.p ); -+ UDDR0 = *wr.p++; -+ bytes_written++; -+ } -+ wr.bytes_left -= bytes_written; -+ -+ usbd_info.stats.ep0_bytes_written += bytes_written; -+ -+ if( (wr.bytes_left==0)) -+ { -+ wr.p = NULL; /* be anal */ -+ -+ if(bytes_written < EP0_FIFO_SIZE) -+ { -+ int count; -+ int udccs0; -+ -+ /* We always end the transfer with a short or zero length packet */ -+ ep0_state = EP0_END_XFER; -+ current_handler = sh_setup_begin; -+ -+ /* Let the packet go... */ -+ UDCCS0 = UDCCS0_IPR; -+ -+ /* Wait until we get to status-stage, then ack. -+ * -+ * When the UDC sets the UDCCS0[OPR] bit, an interrupt -+ * is supposed to be generated (see 12.5.1 step 14ff, PXA Dev Manual). -+ * That approach didn't work out. Usually a new SETUP command was -+ * already in the fifo. I tried many approaches but was always losing -+ * at least some OPR interrupts. Thus the polling below... -+ */ -+ count = 1000; -+ udccs0 = UDCCS0; -+ do -+ { -+ if( (UDCCS0 & UDCCS0_OPR)) -+ { -+ /* clear OPR, generate ack */ -+ UDCCS0 = UDCCS0_OPR; -+ break; -+ } -+ count--; -+ udelay(1); -+ } while( count); -+ -+ PRINTKD( "write fifo: count=%d UDCCS0=%x UDCCS0=%x\n", count, udccs0, UDCCS0); -+ } -+ } -+ /* something goes poopy if I dont wait here ... */ -+ udelay(500); -+ -+ PRINTKD( "write fifo: bytes sent=%d, bytes left=%d\n", bytes_written, wr.bytes_left); -+} -+ -+/* -+ * read_fifo() -+ * Read bytes out of FIFO and put in request. -+ * Called to do the initial read of setup requests -+ * from the host. Return number of bytes read. -+ * -+ */ -+static int read_fifo( usb_dev_request_t * request ) -+{ -+ int bytes_read = 0; -+ unsigned char * pOut = (unsigned char*) request; -+ -+ int udccs0 = UDCCS0; -+ -+ if( (udccs0 & SETUP_READY) == SETUP_READY) -+ { -+ /* ok it's a setup command */ -+ while( UDCCS0 & UDCCS0_RNE) -+ { -+ if( bytes_read >= sizeof( usb_dev_request_t)) -+ { -+ /* We've already read enought o fill usb_dev_request_t. -+ * Our tummy is full. Go barf... -+ */ -+ printk( "%sread_fifo(): read failure\n", pszMe ); -+ usbd_info.stats.ep0_fifo_read_failures++; -+ break; -+ } -+ -+ *pOut++ = UDDR0; -+ bytes_read++; -+ } -+ } -+ PRINTKD( "read_fifo %d bytes\n", bytes_read ); -+ -+ /* clear SA & OPR */ -+ UDCCS0 = SETUP_READY; -+ -+ usbd_info.stats.ep0_bytes_read += bytes_read; -+ return bytes_read; -+} -+ -+/* -+ * get_descriptor() -+ * Called from sh_setup_begin to handle data return -+ * for a GET_DESCRIPTOR setup request. -+ */ -+static void get_descriptor( usb_dev_request_t * pReq ) -+{ -+ string_desc_t * pString; -+ ep_desc_t * pEndpoint = 0; -+ -+ desc_t * pDesc = pxa_usb_get_descriptor_ptr(); -+ int type = pReq->wValue >> 8; -+ int idx = pReq->wValue & 0xFF; -+ -+// PRINTKD( "%sget_descriptor for %d\n", pszMe, type ); -+ switch( type ) { -+ case USB_DESC_DEVICE: -+ queue_and_start_write( &pDesc->dev, -+ pReq->wLength, -+ pDesc->dev.bLength ); -+ break; -+ -+ // return config descriptor buffer, cfg, intf, 2 ep -+ case USB_DESC_CONFIG: -+ queue_and_start_write( &pDesc->b, -+ pReq->wLength, -+ sizeof( struct cdb ) ); -+ break; -+ -+ // not quite right, since doesn't do language code checking -+ case USB_DESC_STRING: -+ pString = pxa_usb_get_string_descriptor( idx ); -+ if ( pString ) { -+ if ( idx != 0 ) { // if not language index -+ printk( "%sReturn string %d: ", pszMe, idx ); -+ psdesc( pString ); -+ } -+ queue_and_start_write( pString, -+ pReq->wLength, -+ pString->bLength ); -+ } -+ else { -+ printk("%sunkown string index %d Stall.\n", pszMe, idx ); -+ } -+ break; -+ -+ case USB_DESC_INTERFACE: -+ if ( idx == pDesc->b.intf.bInterfaceNumber ) { -+ queue_and_start_write( &pDesc->b.intf, -+ pReq->wLength, -+ pDesc->b.intf.bLength ); -+ } -+ break; -+ -+ case USB_DESC_ENDPOINT: /* correct? 21Feb01ww */ -+ if ( idx == 1 ) -+ pEndpoint = &pDesc->b.ep1; //[BULK_IN1]; -+ else if ( idx == 2 ) -+ pEndpoint = &pDesc->b.ep2; //[BULK_OUT1]; -+ else -+ pEndpoint = NULL; -+ if ( pEndpoint ) { -+ queue_and_start_write( pEndpoint, -+ pReq->wLength, -+ pEndpoint->bLength ); -+ } else { -+ printk("%sunkown endpoint index %d Stall.\n", pszMe, idx ); -+ } -+ break; -+ -+ -+ default : -+ printk("%sunknown descriptor type %d. Stall.\n", pszMe, type ); -+ break; -+ -+ } -+} -+ -+/* end usb_ep0.c - who needs this comment? */ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/mach-pxa/usb_ep0.h 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,66 @@ -+/* -+ * Copyright (C) Intrinsyc, Inc., 2002 -+ * -+ * usb_ep0.h - PXA USB controller driver. -+ * Endpoint zero management -+ * -+ * Please see: -+ * linux/Documentation/arm/SA1100/SA1100_USB -+ * for details. -+ * -+ * 02-May-2002 -+ * Frank Becker (Intrinsyc) - -+ * -+ */ -+ -+#ifndef __USB_EP0_H -+#define __USB_EP0_H -+ -+#define EP0_FIFO_SIZE 16 -+#define SETUP_READY (UDCCS0_SA | UDCCS0_OPR) -+ -+/*================================================ -+ * USB Protocol Stuff -+ */ -+ -+/* Request Codes */ -+enum { -+ GET_STATUS =0, -+ CLEAR_FEATURE =1, -+ /* reserved =2 */ -+ SET_FEATURE =3, -+ /* reserved =4 */ -+ SET_ADDRESS =5, -+ GET_DESCRIPTOR =6, -+ SET_DESCRIPTOR =7, -+ GET_CONFIGURATION =8, -+ SET_CONFIGURATION =9, -+ GET_INTERFACE =10, -+ SET_INTERFACE =11, -+ SYNCH_FRAME =12 -+}; -+ -+typedef enum { -+ EP0_IDLE, -+ EP0_IN_DATA_PHASE, -+ EP0_END_XFER, -+ EP0_OUT_DATA_PHASE -+} EP0_state; -+ -+/* USB Device Requests */ -+typedef struct -+{ -+ __u8 bmRequestType; -+ __u8 bRequest; -+ __u16 wValue; -+ __u16 wIndex; -+ __u16 wLength; -+} usb_dev_request_t __attribute__ ((packed)); -+ -+/* Data extraction from usb_request_t fields */ -+enum { -+ kTargetDevice =0, -+ kTargetInterface=1, -+ kTargetEndpoint =2 -+}; -+#endif ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/mach-pxa/usb_recv.c 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,173 @@ -+/* -+ * Generic receive layer for the PXA USB client function -+ * -+ * This code was loosely inspired by the original version which was -+ * Copyright (c) Compaq Computer Corporation, 1998-1999 -+ * Copyright (c) 2001 by Nicolas Pitre -+ * -+ * 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. -+ * -+ * 02-May-2002 -+ * Frank Becker (Intrinsyc) - derived from sa1100 usb_recv.c -+ * -+ * TODO: Add support for DMA. -+ * -+ */ -+ -+#include <linux/module.h> -+#include <linux/pci.h> -+#include <linux/errno.h> -+#include <asm/dma.h> -+#include <asm/system.h> -+ -+#include "pxa_usb.h" -+#include "usb_ctl.h" -+ -+#if DEBUG -+static unsigned int usb_debug = DEBUG; -+#else -+#define usb_debug 0 /* gcc will remove all the debug code for us */ -+#endif -+ -+static char *ep_bulk_out1_buf; -+static int ep_bulk_out1_len; -+static int ep_bulk_out1_remain; -+static usb_callback_t ep_bulk_out1_callback; -+static int rx_pktsize; -+ -+static void -+ep_bulk_out1_start(void) -+{ -+ /* disable DMA */ -+ UDCCS2 &= ~UDCCS_BO_DME; -+ -+ /* enable interrupts for endpoint 2 (bulk out) */ -+ UICR0 &= ~UICR0_IM2; -+} -+ -+static void -+ep_bulk_out1_done(int flag) -+{ -+ int size = ep_bulk_out1_len - ep_bulk_out1_remain; -+ -+ if (!ep_bulk_out1_len) -+ return; -+ -+ ep_bulk_out1_len = 0; -+ if (ep_bulk_out1_callback) { -+ ep_bulk_out1_callback(flag, size); -+ } -+} -+ -+void -+ep_bulk_out1_state_change_notify( int new_state ) -+{ -+} -+ -+void -+ep_bulk_out1_stall( void ) -+{ -+ /* SET_FEATURE force stall at UDC */ -+ UDCCS2 |= UDCCS_BO_FST; -+} -+ -+int -+ep_bulk_out1_init(int chn) -+{ -+ desc_t * pd = pxa_usb_get_descriptor_ptr(); -+ rx_pktsize = __le16_to_cpu( pd->b.ep1.wMaxPacketSize ); -+ ep_bulk_out1_done(-EAGAIN); -+ return 0; -+} -+ -+void -+ep_bulk_out1_reset(void) -+{ -+ desc_t * pd = pxa_usb_get_descriptor_ptr(); -+ rx_pktsize = __le16_to_cpu( pd->b.ep1.wMaxPacketSize ); -+ UDCCS2 &= ~UDCCS_BO_FST; -+ ep_bulk_out1_done(-EINTR); -+} -+ -+void -+ep_bulk_out1_int_hndlr(int udcsr) -+{ -+ int status = UDCCS2; -+ if( usb_debug) printk("ep_bulk_out1_int_hndlr: UDCCS2=%x\n", status); -+ -+ if( (status & (UDCCS_BO_RNE | UDCCS_BO_RSP)) == UDCCS_BO_RSP) -+ { -+ /* zero-length packet */ -+ } -+ -+ if( status & UDCCS_BO_RNE) -+ { -+ int len; -+ int i; -+ char *buf = ep_bulk_out1_buf + ep_bulk_out1_len - ep_bulk_out1_remain; -+ -+ /* bytes in FIFO */ -+ len = (UBCR2 & 0xff) +1; -+ -+ if( usb_debug) printk("usb_recv: " -+ "len=%d out1_len=%d out1_remain=%d\n", -+ len,ep_bulk_out1_len,ep_bulk_out1_remain); -+ -+ if( len > ep_bulk_out1_remain) -+ { -+ /* FIXME: if this happens, we need a temporary overflow buffer */ -+ printk("usb_recv: Buffer overwrite warning...\n"); -+ len = ep_bulk_out1_remain; -+ } -+ -+ /* read data out of fifo */ -+ for( i=0; i<len; i++) -+ { -+ *buf++ = UDDR2 & 0xff; -+ } -+ -+ ep_bulk_out1_remain -= len; -+ ep_bulk_out1_done((len) ? 0 : -EPIPE); -+ } -+ -+ /* ack RPC - FIXME: '|=' we may ack SST here, too */ -+ UDCCS2 |= UDCCS_BO_RPC; -+ return; -+} -+ -+int -+pxa_usb_recv(char *buf, int len, usb_callback_t callback) -+{ -+ int flags; -+ -+ if (ep_bulk_out1_len) -+ return -EBUSY; -+ -+ local_irq_save(flags); -+ ep_bulk_out1_buf = buf; -+ ep_bulk_out1_len = len; -+ ep_bulk_out1_callback = callback; -+ ep_bulk_out1_remain = len; -+ ep_bulk_out1_start(); -+ local_irq_restore(flags); -+ -+ return 0; -+} -+ -+void -+pxa_usb_recv_reset(void) -+{ -+ ep_bulk_out1_reset(); -+} -+ -+void -+pxa_usb_recv_stall(void) -+{ -+ ep_bulk_out1_stall(); -+} -+ -+EXPORT_SYMBOL(pxa_usb_recv_stall); -+EXPORT_SYMBOL(pxa_usb_recv); -+EXPORT_SYMBOL(pxa_usb_recv_reset); ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/mach-pxa/usb_send.c 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,190 @@ -+/* -+ * Generic xmit layer for the PXA USB client function -+ * -+ * This code was loosely inspired by the original version which was -+ * Copyright (c) Compaq Computer Corporation, 1998-1999 -+ * Copyright (c) 2001 by Nicolas Pitre -+ * -+ * 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. -+ * -+ * 02-May-2002 -+ * Frank Becker (Intrinsyc) - derived from sa1100 usb_send.c -+ * -+ * TODO: Add support for DMA. -+ * -+ */ -+ -+#include <linux/module.h> -+#include <linux/pci.h> -+#include <linux/errno.h> -+#include <asm/hardware.h> -+#include <asm/dma.h> -+#include <asm/system.h> -+#include <asm/byteorder.h> -+ -+#include "pxa_usb.h" -+#include "usb_ctl.h" -+ -+#if DEBUG -+static unsigned int usb_debug = DEBUG; -+#else -+#define usb_debug 0 /* gcc will remove all the debug code for us */ -+#endif -+ -+static char *ep_bulk_in1_buf; -+static int ep_bulk_in1_len; -+static int ep_bulk_in1_remain; -+static usb_callback_t ep_bulk_in1_callback; -+static int tx_pktsize; -+ -+/* device state is changing, async */ -+void -+ep_bulk_in1_state_change_notify( int new_state ) -+{ -+} -+ -+/* set feature stall executing, async */ -+void -+ep_bulk_in1_stall( void ) -+{ -+ UDCCS1 |= UDCCS_BI_FST; -+} -+ -+static void -+ep_bulk_in1_send_packet(void) -+{ -+ int i; -+ char *buf = ep_bulk_in1_buf + ep_bulk_in1_len - ep_bulk_in1_remain; -+ int out_size = tx_pktsize; -+ -+ if( usb_debug) printk( "ep_bulk_in1_send_packet: UICR0=%x UDCCS1=%x\n", UICR0, UDCCS1); -+ -+ if( out_size > ep_bulk_in1_remain) -+ { -+ out_size = ep_bulk_in1_remain; -+ } -+ -+ for( i=0; i<out_size; i++) -+ { -+ UDDR1 = *buf++; -+ } -+ -+ UDCCS1 = UDCCS_BI_TPC; -+ if( out_size < tx_pktsize) -+ { -+ /* short packet */ -+ UDCCS1 = UDCCS_BI_TSP; -+ } -+ ep_bulk_in1_remain -= out_size; -+ -+ if( usb_debug) printk( "ep_bulk_in1_send_packet: " -+ "UICR0=%x UDCCS1=%x send bytes=%d left=%d\n", -+ UICR0, UDCCS1, out_size, ep_bulk_in1_remain); -+} -+ -+static void -+ep_bulk_in1_start(void) -+{ -+ if (!ep_bulk_in1_len) -+ return; -+ -+ UICR0 &= ~UICR0_IM1; -+ -+ ep_bulk_in1_send_packet(); -+} -+ -+static void -+ep_bulk_in1_done(int flag) -+{ -+ int size = ep_bulk_in1_len - ep_bulk_in1_remain; -+ if (ep_bulk_in1_len) { -+ ep_bulk_in1_len = 0; -+ if (ep_bulk_in1_callback) -+ ep_bulk_in1_callback(flag, size); -+ } -+} -+ -+int -+ep_bulk_in1_init(int chn) -+{ -+ desc_t * pd = pxa_usb_get_descriptor_ptr(); -+ tx_pktsize = __le16_to_cpu( pd->b.ep2.wMaxPacketSize ); -+ ep_bulk_in1_done(-EAGAIN); -+ return 0; -+} -+ -+void -+ep_bulk_in1_reset(void) -+{ -+ desc_t * pd = pxa_usb_get_descriptor_ptr(); -+ tx_pktsize = __le16_to_cpu( pd->b.ep2.wMaxPacketSize ); -+ UDCCS1 &= ~UDCCS_BI_FST; -+ ep_bulk_in1_done(-EINTR); -+} -+ -+void -+ep_bulk_in1_int_hndlr(int usir0) -+{ -+ int status = UDCCS1; -+ -+ if (ep_bulk_in1_remain != 0) { -+ /* more data to go */ -+ ep_bulk_in1_start(); -+ } else { -+ if( status & UDCCS_BI_TPC) -+ { -+ UDCCS1 = UDCCS_BI_TPC; -+ } -+ ep_bulk_in1_done(0); -+ } -+} -+ -+int -+pxa_usb_send(char *buf, int len, usb_callback_t callback) -+{ -+ int flags; -+ -+ if( usb_debug) printk( "pxa_usb_send: " -+ "data len=%d state=%d blen=%d\n", -+ len, usbd_info.state, ep_bulk_in1_len); -+ -+ if (usbd_info.state != USB_STATE_CONFIGURED) -+ return -ENODEV; -+ -+ if (ep_bulk_in1_len) -+ return -EBUSY; -+ -+ local_irq_save(flags); -+ ep_bulk_in1_buf = buf; -+ ep_bulk_in1_len = len; -+ ep_bulk_in1_callback = callback; -+ ep_bulk_in1_remain = len; -+ ep_bulk_in1_start(); -+ local_irq_restore(flags); -+ -+ return 0; -+} -+ -+ -+void -+pxa_usb_send_reset(void) -+{ -+ ep_bulk_in1_reset(); -+} -+ -+int -+pxa_usb_xmitter_avail( void ) -+{ -+ if (usbd_info.state != USB_STATE_CONFIGURED) -+ return -ENODEV; -+ if (ep_bulk_in1_len) -+ return -EBUSY; -+ return 0; -+} -+ -+ -+EXPORT_SYMBOL(pxa_usb_xmitter_avail); -+EXPORT_SYMBOL(pxa_usb_send); -+EXPORT_SYMBOL(pxa_usb_send_reset); ---- linux-2.4.25/arch/arm/mach-sa1100/sa1111-ohci.c~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/arch/arm/mach-sa1100/sa1111-ohci.c 2004-03-31 17:15:11.000000000 +0200 -@@ -54,7 +54,7 @@ - * address as its return value, and the DMA address via - * the dma_addr_t pointer. - */ -- vbuf = consistent_alloc(GFP_KERNEL | GFP_DMA, 4, &dma_buf); -+ vbuf = consistent_alloc(GFP_KERNEL | GFP_DMA, 4, &dma_buf, 0); - - SADTSA = (unsigned long)dma_buf; - SADTCA = 4; ---- linux-2.4.25/arch/arm/mach-sa1100/sa1111.c~2.4.25-vrs2-pxa1.patch 2003-08-25 13:44:39.000000000 +0200 -+++ linux-2.4.25/arch/arm/mach-sa1100/sa1111.c 2004-03-31 17:15:11.000000000 +0200 -@@ -243,9 +243,15 @@ - * First, set up the 3.6864MHz clock on GPIO 27 for the SA-1111: - * (SA-1110 Developer's Manual, section 9.1.2.1) - */ -+#if CONFIG_ARCH_SA1100 - GAFR |= GPIO_32_768kHz; - GPDR |= GPIO_32_768kHz; - TUCR = TUCR_3_6864MHz; -+#elif CONFIG_ARCH_PXA -+ set_GPIO_mode(GPIO11_3_6MHz_MD); -+#else -+#error missing clock setup -+#endif - - /* - * Turn VCO on, and disable PLL Bypass. -@@ -300,6 +306,8 @@ - SBI_SMCR = smcr; - } - -+#ifdef CONFIG_ARCH_SA1100 -+ - /* - * Disable the memory bus request/grant signals on the SA1110 to - * ensure that we don't receive spurious memory requests. We set -@@ -341,5 +349,7 @@ - local_irq_restore(flags); - } - -+#endif -+ - EXPORT_SYMBOL(sa1111_wake); - EXPORT_SYMBOL(sa1111_doze); ---- linux-2.4.25/arch/arm/mm/Makefile~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/arch/arm/mm/Makefile 2004-03-31 17:15:11.000000000 +0200 -@@ -44,6 +44,7 @@ - p-$(CONFIG_CPU_ARM1026) += proc-arm1026.o - p-$(CONFIG_CPU_SA110) += proc-sa110.o - p-$(CONFIG_CPU_SA1100) += proc-sa110.o -+p-$(CONFIG_CPU_XSCALE) += proc-xscale.o - - # Integrator follows "new style" - # Soon, others will do too, and we can get rid of this ---- linux-2.4.25/arch/arm/mm/consistent.c~2.4.25-vrs2-pxa1.patch 2003-08-25 13:44:39.000000000 +0200 -+++ linux-2.4.25/arch/arm/mm/consistent.c 2004-03-31 17:15:11.000000000 +0200 -@@ -37,7 +37,8 @@ - * - * Note that this does *not* zero the allocated area! - */ --void *consistent_alloc(int gfp, size_t size, dma_addr_t *dma_handle) -+void *consistent_alloc(int gfp, size_t size, dma_addr_t *dma_handle, -+ unsigned long cache_flags) - { - struct page *page, *end, *free; - unsigned long order; -@@ -55,7 +56,7 @@ - goto no_page; - - *dma_handle = page_to_bus(page); -- ret = __ioremap(page_to_pfn(page) << PAGE_SHIFT, size, 0); -+ ret = __ioremap(page_to_pfn(page) << PAGE_SHIFT, size, cache_flags); - if (!ret) - goto no_remap; - -@@ -106,7 +107,7 @@ - #endif - gfp |= GFP_DMA; - -- return consistent_alloc(gfp, size, handle); -+ return consistent_alloc(gfp, size, handle, 0); - } - - /* ---- linux-2.4.25/arch/arm/mm/init.c~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/arch/arm/mm/init.c 2004-03-31 17:15:11.000000000 +0200 -@@ -49,6 +49,9 @@ - static unsigned long totalram_pages; - extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; - extern char _stext, _text, _etext, _end, __init_begin, __init_end; -+#ifdef CONFIG_XIP_KERNEL -+extern char _endtext, _sdata; -+#endif - extern unsigned long phys_initrd_start; - extern unsigned long phys_initrd_size; - -@@ -347,7 +350,11 @@ - * Register the kernel text and data with bootmem. - * Note that this can only be in node 0. - */ -+#ifdef CONFIG_XIP_KERNEL -+ reserve_bootmem_node(pgdat, __pa(&_sdata), &_end - &_sdata); -+#else - reserve_bootmem_node(pgdat, __pa(&_stext), &_end - &_stext); -+#endif - - #ifdef CONFIG_CPU_32 - /* -@@ -601,8 +608,13 @@ - unsigned int codepages, datapages, initpages; - int i, node; - -+#ifndef CONFIG_XIP_KERNEL - codepages = &_etext - &_text; - datapages = &_end - &_etext; -+#else -+ codepages = &_endtext - &_text; -+ datapages = &_end - &_sdata; -+#endif - initpages = &__init_end - &__init_begin; - - high_memory = (void *)__va(meminfo.end); -@@ -658,11 +670,13 @@ - - void free_initmem(void) - { -+#ifndef CONFIG_XIP_KERNEL - if (!machine_is_integrator()) { - free_area((unsigned long)(&__init_begin), - (unsigned long)(&__init_end), - "init"); - } -+#endif - } - - #ifdef CONFIG_BLK_DEV_INITRD ---- linux-2.4.25/arch/arm/mm/mm-armv.c~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/arch/arm/mm/mm-armv.c 2004-03-31 17:15:11.000000000 +0200 -@@ -356,6 +356,19 @@ - p ++; - #endif - -+#ifdef CONFIG_XIP_KERNEL -+ p->physical = KERNEL_XIP_BASE_PHYS; -+ p->virtual = KERNEL_XIP_BASE_VIRT; -+ p->length = PGDIR_SIZE * 8; -+ p->domain = DOMAIN_KERNEL; -+ p->prot_read = 0; /* r=0, b=0 --> read-only for kernel mode */ -+ p->prot_write = 0; -+ p->cacheable = 1; -+ p->bufferable = 1; -+ -+ p ++; -+#endif -+ - /* - * Go through the initial mappings, but clear out any - * pgdir entries that are not in the description. -@@ -386,7 +399,7 @@ - init_maps->prot_read = 0; - init_maps->prot_write = 0; - init_maps->cacheable = 1; -- init_maps->bufferable = 0; -+ init_maps->bufferable = 1; - - create_mapping(init_maps); - ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/mm/proc-xscale.S 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,1086 @@ -+/* -+ * linux/arch/arm/mm/proc-xscale.S -+ * -+ * Author: Nicolas Pitre -+ * Created: November 2000 -+ * Copyright: (C) 2000, 2001 MontaVista Software Inc. -+ * -+ * 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. -+ * -+ * MMU functions for the Intel XScale CPUs -+ * -+ * 2001 Aug 21: -+ * some contributions by Brett Gaines <brett.w.gaines@intel.com> -+ * Copyright 2001 by Intel Corp. -+ * -+ * 2001 Sep 08: -+ * Completely revisited, many important fixes -+ * Nicolas Pitre <nico@cam.org> -+ */ -+ -+#include <linux/config.h> -+#include <linux/linkage.h> -+#include <asm/assembler.h> -+#include <asm/constants.h> -+#include <asm/procinfo.h> -+#include <asm/hardware.h> -+#include <asm/proc/pgtable.h> -+ -+/* -+ * Some knobs for cache allocation policy. -+ * Allocate on write may or may not be beneficial depending on the memory -+ * usage pattern of your main application. Write through cache is definitely -+ * a performance loss in most cases, but might be used for special purposes. -+ */ -+#define PMD_CACHE_WRITE_ALLOCATE 1 -+#define PTE_CACHE_WRITE_ALLOCATE 1 -+#define CACHE_WRITE_THROUGH 0 -+ -+/* -+ * There are errata that say that dirty status bits in the cache may get -+ * corrupted. The workaround significantly affects performance, and the bug -+ * _might_ just not be that visible or critical to you, so it is configurable. -+ * Let's hope a future core revision will tell us this was only a bad dream. -+ * But in the mean time the risk and tradeoff is yours to decide.... -+ */ -+#ifdef CONFIG_XSCALE_CACHE_ERRATA -+#undef CACHE_WRITE_THROUGH -+#define CACHE_WRITE_THROUGH 1 -+#endif -+ -+/* -+ * This is the maximum size of an area which will be flushed. If the area -+ * is larger than this, then we flush the whole cache -+ */ -+#define MAX_AREA_SIZE 32768 -+ -+/* -+ * the cache line size of the I and D cache -+ */ -+#define CACHELINESIZE 32 -+ -+/* -+ * the size of the data cache -+ */ -+#define CACHESIZE 32768 -+ -+/* -+ * and the page size -+ */ -+#define PAGESIZE 4096 -+ -+/* -+ * Virtual address used to allocate the cache when flushed -+ * -+ * This must be an address range which is _never_ used. It should -+ * apparently have a mapping in the corresponding page table for -+ * compatibility with future CPUs that _could_ require it. For instance we -+ * don't care. -+ * -+ * This must be aligned on a 2*CACHESIZE boundary. The code selects one of -+ * the 2 areas in alternance each time the clean_d_cache macro is used. -+ * Without this the XScale core exhibits cache eviction problems and no one -+ * knows why. -+ * -+ * Reminder: the vector table is located at 0xffff0000-0xffff0fff. -+ */ -+#define CLEAN_ADDR 0xfffe0000 -+ -+/* -+ * This macro is used to wait for a CP15 write and is needed -+ * when we have to ensure that the last operation to the co-pro -+ * was completed before continuing with operation. -+ */ -+ .macro cpwait, rd -+ mrc p15, 0, \rd, c2, c0, 0 @ arbitrary read of cp15 -+ mov \rd, \rd @ wait for completion -+ sub pc, pc, #4 @ flush instruction pipeline -+ .endm -+ -+ .macro cpwait_ret, lr, rd -+ mrc p15, 0, \rd, c2, c0, 0 @ arbitrary read of cp15 -+ sub pc, \lr, \rd, LSR #32 @ wait for completion and -+ @ flush instruction pipeline -+ .endm -+ -+#if !CACHE_WRITE_THROUGH -+ -+/* -+ * This macro cleans the entire dcache using line allocate. -+ * The main loop has been unrolled to reduce loop overhead. -+ * rd and rs are two scratch registers. -+ */ -+ .macro clean_d_cache, rd, rs -+ ldr \rs, =clean_addr -+ ldr \rd, [\rs] -+ eor \rd, \rd, #CACHESIZE -+ str \rd, [\rs] -+ add \rs, \rd, #CACHESIZE -+1: mcr p15, 0, \rd, c7, c2, 5 @ allocate D cache line -+ add \rd, \rd, #CACHELINESIZE -+ mcr p15, 0, \rd, c7, c2, 5 @ allocate D cache line -+ add \rd, \rd, #CACHELINESIZE -+ mcr p15, 0, \rd, c7, c2, 5 @ allocate D cache line -+ add \rd, \rd, #CACHELINESIZE -+ mcr p15, 0, \rd, c7, c2, 5 @ allocate D cache line -+ add \rd, \rd, #CACHELINESIZE -+ teq \rd, \rs -+ bne 1b -+ .endm -+ -+ .macro clean_d_line, rd -+ mcr p15, 0, \rd, c7, c10, 1 -+ .endm -+ -+ .data -+clean_addr: .word CLEAN_ADDR -+ -+#else -+ -+/* -+ * If cache is write-through, there is no need to clean it. -+ * Simply invalidating will do. -+ */ -+ -+ .macro clean_d_cache, rd, rs -+ mcr p15, 0, \rd, c7, c6, 0 -+ .endm -+ -+ /* let's try to skip this needless operations at least within loops */ -+ .macro clean_d_line, rd -+ .endm -+ -+#endif -+ -+ .text -+ -+/* -+ * cpu_xscale_data_abort() -+ * -+ * obtain information about current aborted instruction. -+ * Note: we read user space. This means we might cause a data -+ * abort here if the I-TLB and D-TLB aren't seeing the same -+ * picture. Unfortunately, this does happen. We live with it. -+ * -+ * r2 = address of aborted instruction -+ * r3 = saved SPSR -+ * -+ * Returns: -+ * r0 = address of abort -+ * r1 = FSR, bit 11 = write -+ * r3 = corrupted -+ */ -+ .align 5 -+ENTRY(cpu_xscale_data_abort) -+ mrc p15, 0, r1, c5, c0, 0 @ get FSR -+ mrc p15, 0, r0, c6, c0, 0 @ get FAR -+ ldr r3, [r2] @ read aborted instruction -+ bic r1, r1, #1 << 11 @ clear bits 11 of FSR -+ tst r3, #1 << 20 @ check write -+ orreq r1, r1, #1 << 11 -+ mov pc, lr -+ -+/* -+ * cpu_xscale_check_bugs() -+ */ -+ENTRY(cpu_xscale_check_bugs) -+ mrs ip, cpsr -+ bic ip, ip, #F_BIT -+ msr cpsr, ip -+ mov pc, lr -+ -+#ifndef CONFIG_XSCALE_CACHE_ERRATA -+/* -+ * cpu_xscale_proc_init() -+ * -+ * Nothing too exciting at the moment -+ */ -+ENTRY(cpu_xscale_proc_init) -+ mov pc, lr -+#else -+/* -+ * We enable the cache here, but we make sure all the status bits for dirty -+ * lines are cleared as well (see PXA250 erratum #120). -+ */ -+ENTRY(cpu_xscale_proc_init) -+ @ enable data cache -+ ldr r0, cr_p -+ ldmia r0, {r1, r2} -+ orr r1, r1, #0x4 -+ orr r2, r2, #0x4 -+ stmia r0, {r1, r2} -+ mcr p15, 0, r1, c1, c0, 0 -+ cpwait r0 -+ -+ @ invalidate data cache -+ mcr p15, 0, r0, c7, c6, 0 -+ -+ @ fill main cache with write-through lines -+ bic r0, pc, #0x1f -+ add r1, r0, #CACHESIZE -+1: ldr r2, [r0], #32 -+ cmp r0, r1 -+ bne 1b -+ -+ @ enable test feature to force all fills to the mini-cache -+ mov r1, #0x8 -+ mcr p15, 0, r1, c15, c15, 3 -+ -+ @ fill mini-cache with write-through lines (2kbytes, 64 lines) -+ add r1, r0, #2048 -+2: ldr r2, [r0], #32 -+ cmp r0, r1 -+ bne 2b -+ -+ @ disable test feature to force all fills to the mini-cache -+ mov r1, #0x0 -+ mcr p15, 0, r1, c15, c15, 3 -+ -+ @ invalidate data cache again -+ mcr p15, 0, r1, c7, c6, 0 -+ mov pc, lr -+ -+cr_p: .long SYMBOL_NAME(cr_alignment) -+#endif -+ -+/* -+ * cpu_xscale_proc_fin() -+ */ -+ENTRY(cpu_xscale_proc_fin) -+ str lr, [sp, #-4]! -+ mov r0, #F_BIT|I_BIT|SVC_MODE -+ msr cpsr_c, r0 -+ mrc p15, 0, r0, c1, c0, 0 @ ctrl register -+ bic r0, r0, #0x1800 @ ...IZ........... -+ bic r0, r0, #0x0006 @ .............CA. -+ mcr p15, 0, r0, c1, c0, 0 @ disable caches -+ bl cpu_xscale_cache_clean_invalidate_all @ clean caches -+ ldr pc, [sp], #4 -+ -+/* -+ * cpu_xscale_reset(loc) -+ * -+ * Perform a soft reset of the system. Put the CPU into the -+ * same state as it would be if it had been reset, and branch -+ * to what would be the reset vector. -+ * -+ * loc: location to jump to for soft reset -+ */ -+ .align 5 -+ENTRY(cpu_xscale_reset) -+ mov r1, #F_BIT|I_BIT|SVC_MODE -+ msr cpsr_c, r1 @ reset CPSR -+ mrc p15, 0, r1, c1, c0, 0 @ ctrl register -+ bic r1, r1, #0x0086 @ ........B....CA. -+ bic r1, r1, #0x1900 @ ...IZ..S........ -+ mcr p15, 0, r1, c1, c0, 0 @ ctrl register -+ mcr p15, 0, ip, c7, c7, 0 @ invalidate I,D caches & BTB -+ bic r1, r1, #0x0001 @ ...............M -+ mcr p15, 0, r1, c1, c0, 0 @ ctrl register -+ @ CAUTION: MMU turned off from this point. We count on the pipeline -+ @ already containing those two last instructions to survive. -+ mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs -+ mov pc, r0 -+ -+/* -+ * cpu_xscale_do_idle(type) -+ * -+ * Cause the processor to idle -+ * -+ * type: -+ * 0 = slow idle -+ * 1 = fast idle -+ * 2 = switch to slow processor clock -+ * 3 = switch to fast processor clock -+ * -+ * For now we do nothing but go to idle mode for every case -+ * -+ * XScale supports clock switching, but using idle mode support -+ * allows external hardware to react to system state changes. -+ */ -+ .align 5 -+ -+ENTRY(cpu_xscale_do_idle) -+ mov r0, #1 -+ mcr p14, 0, r0, c7, c0, 0 @ Go to IDLE -+ mov pc, lr -+ -+/* ================================= CACHE ================================ */ -+ -+/* -+ * cpu_xscale_cache_clean_invalidate_all (void) -+ * -+ * clean and invalidate all cache lines -+ * -+ * Note: -+ * 1. We should preserve r0 at all times. -+ * 2. Even if this function implies cache "invalidation" by its name, -+ * we don't need to actually use explicit invalidation operations -+ * since the goal is to discard all valid references from the cache -+ * and the cleaning of it already has that effect. -+ * 3. Because of 2 above and the fact that kernel space memory is always -+ * coherent across task switches there is no need to worry about -+ * inconsistencies due to interrupts, ence no irq disabling. -+ */ -+ .align 5 -+ENTRY(cpu_xscale_cache_clean_invalidate_all) -+ mov r2, #1 -+cpu_xscale_cache_clean_invalidate_all_r2: -+ clean_d_cache r0, r1 -+ teq r2, #0 -+ mcrne p15, 0, ip, c7, c5, 0 @ Invalidate I cache & BTB -+ mcr p15, 0, ip, c7, c10, 4 @ Drain Write (& Fill) Buffer -+ mov pc, lr -+ -+/* -+ * cpu_xscale_cache_clean_invalidate_range(start, end, flags) -+ * -+ * clean and invalidate all cache lines associated with this area of memory -+ * -+ * start: Area start address -+ * end: Area end address -+ * flags: nonzero for I cache as well -+ */ -+ .align 5 -+ENTRY(cpu_xscale_cache_clean_invalidate_range) -+ bic r0, r0, #CACHELINESIZE - 1 @ round down to cache line -+ sub r3, r1, r0 -+ cmp r3, #MAX_AREA_SIZE -+ bhi cpu_xscale_cache_clean_invalidate_all_r2 -+1: clean_d_line r0 @ Clean D cache line -+ mcr p15, 0, r0, c7, c6, 1 @ Invalidate D cache line -+ add r0, r0, #CACHELINESIZE -+ cmp r0, r1 -+ blo 1b -+ teq r2, #0 -+ mcr p15, 0, ip, c7, c10, 4 @ Drain Write (& Fill) Buffer -+ moveq pc, lr -+ sub r0, r0, r3 -+1: mcr p15, 0, r0, c7, c5, 1 @ Invalidate I cache line -+ add r0, r0, #CACHELINESIZE -+ cmp r0, r1 -+ blo 1b -+ mcr p15, 0, ip, c7, c5, 6 @ Invalidate BTB -+ mov pc, lr -+ -+/* -+ * cpu_xscale_flush_ram_page(page) -+ * -+ * clean all cache lines associated with this memory page -+ * -+ * page: page to clean -+ */ -+ .align 5 -+ENTRY(cpu_xscale_flush_ram_page) -+#if !CACHE_WRITE_THROUGH -+ mov r1, #PAGESIZE -+1: mcr p15, 0, r0, c7, c10, 1 @ Clean D cache line -+ add r0, r0, #CACHELINESIZE -+ mcr p15, 0, r0, c7, c10, 1 @ Clean D cache line -+ add r0, r0, #CACHELINESIZE -+ subs r1, r1, #2 * CACHELINESIZE -+ bne 1b -+#endif -+ mcr p15, 0, ip, c7, c10, 4 @ Drain Write (& Fill) Buffer -+ mov pc, lr -+ -+/* ================================ D-CACHE =============================== */ -+ -+/* -+ * cpu_xscale_dcache_invalidate_range(start, end) -+ * -+ * throw away all D-cached data in specified region without an obligation -+ * to write them back. Note however that on XScale we must clean all -+ * entries also due to hardware errata (80200 A0 & A1 only). -+ * -+ * start: virtual start address -+ * end: virtual end address -+ */ -+ .align 5 -+ENTRY(cpu_xscale_dcache_invalidate_range) -+ mrc p15, 0, r2, c0, c0, 0 @ Read part no. -+ eor r2, r2, #0x69000000 -+ eor r2, r2, #0x00052000 @ 80200 XX part no. -+ bics r2, r2, #0x1 @ Clear LSB in revision field -+ moveq r2, #0 -+ beq cpu_xscale_cache_clean_invalidate_range @ An 80200 A0 or A1 -+ -+ tst r0, #CACHELINESIZE - 1 -+ mcrne p15, 0, r0, c7, c10, 1 @ Clean D cache line -+ tst r1, #CACHELINESIZE - 1 -+ mcrne p15, 0, r1, c7, c10, 1 @ Clean D cache line -+ bic r0, r0, #CACHELINESIZE - 1 @ round down to cache line -+1: mcr p15, 0, r0, c7, c6, 1 @ Invalidate D cache line -+ add r0, r0, #CACHELINESIZE -+ cmp r0, r1 -+ blo 1b -+ mov pc, lr -+ -+/* -+ * cpu_xscale_dcache_clean_range(start, end) -+ * -+ * For the specified virtual address range, ensure that all caches contain -+ * clean data, such that peripheral accesses to the physical RAM fetch -+ * correct data. -+ * -+ * start: virtual start address -+ * end: virtual end address -+ */ -+ .align 5 -+ENTRY(cpu_xscale_dcache_clean_range) -+#if !CACHE_WRITE_THROUGH -+ bic r0, r0, #CACHELINESIZE - 1 -+ sub r2, r1, r0 -+ cmp r2, #MAX_AREA_SIZE -+ movhi r2, #0 -+ bhi cpu_xscale_cache_clean_invalidate_all_r2 -+ -+1: mcr p15, 0, r0, c7, c10, 1 @ Clean D cache line -+ add r0, r0, #CACHELINESIZE -+ mcr p15, 0, r0, c7, c10, 1 @ Clean D cache line -+ add r0, r0, #CACHELINESIZE -+ cmp r0, r1 -+ blo 1b -+#endif -+ mcr p15, 0, ip, c7, c10, 4 @ Drain Write (& Fill) Buffer -+ mov pc, lr -+ -+/* -+ * cpu_xscale_clean_dcache_page(page) -+ * -+ * Cleans a single page of dcache so that if we have any future aliased -+ * mappings, they will be consistent at the time that they are created. -+ * -+ * Note: -+ * 1. we don't need to flush the write buffer in this case. [really? -Nico] -+ * 2. we don't invalidate the entries since when we write the page -+ * out to disk, the entries may get reloaded into the cache. -+ */ -+ .align 5 -+ENTRY(cpu_xscale_dcache_clean_page) -+#if !CACHE_WRITE_THROUGH -+ mov r1, #PAGESIZE -+1: mcr p15, 0, r0, c7, c10, 1 @ Clean D cache line -+ add r0, r0, #CACHELINESIZE -+ mcr p15, 0, r0, c7, c10, 1 @ Clean D cache line -+ add r0, r0, #CACHELINESIZE -+ mcr p15, 0, r0, c7, c10, 1 @ Clean D cache line -+ add r0, r0, #CACHELINESIZE -+ mcr p15, 0, r0, c7, c10, 1 @ Clean D cache line -+ add r0, r0, #CACHELINESIZE -+ subs r1, r1, #4 * CACHELINESIZE -+ bne 1b -+#endif -+ mcr p15, 0, ip, c7, c10, 4 @ Drain Write (& Fill) Buffer -+ mov pc, lr -+ -+/* -+ * cpu_xscale_dcache_clean_entry(addr) -+ * -+ * Clean the specified entry of any caches such that the MMU -+ * translation fetches will obtain correct data. -+ * -+ * addr: cache-unaligned virtual address -+ */ -+ .align 5 -+ENTRY(cpu_xscale_dcache_clean_entry) -+ mcr p15, 0, r0, c7, c10, 1 @ Clean D cache line -+ mcr p15, 0, ip, c7, c10, 4 @ Drain Write (& Fill) Buffer -+ mov pc, lr -+ -+/* ================================ I-CACHE =============================== */ -+ -+/* -+ * cpu_xscale_icache_invalidate_range(start, end) -+ * -+ * invalidate a range of virtual addresses from the Icache -+ * -+ * start: virtual start address -+ * end: virtual end address -+ * -+ * Note: This is vaguely defined as supposed to bring the dcache and the -+ * icache in sync by the way this function is used. -+ */ -+ .align 5 -+ENTRY(cpu_xscale_icache_invalidate_range) -+ bic r0, r0, #CACHELINESIZE - 1 -+1: clean_d_line r0 @ Clean D cache line -+ mcr p15, 0, r0, c7, c5, 1 @ Invalidate I cache line -+ add r0, r0, #CACHELINESIZE -+ cmp r0, r1 -+ blo 1b -+ mcr p15, 0, ip, c7, c5, 6 @ Invalidate BTB -+ mcr p15, 0, ip, c7, c10, 4 @ Drain Write (& Fill) Buffer -+ mov pc, lr -+ -+/* -+ * cpu_xscale_icache_invalidate_page(page) -+ * -+ * invalidate all Icache lines associated with this area of memory -+ * -+ * page: page to invalidate -+ */ -+ .align 5 -+ENTRY(cpu_xscale_icache_invalidate_page) -+ mov r1, #PAGESIZE -+1: mcr p15, 0, r0, c7, c5, 1 @ Invalidate I cache line -+ add r0, r0, #CACHELINESIZE -+ mcr p15, 0, r0, c7, c5, 1 @ Invalidate I cache line -+ add r0, r0, #CACHELINESIZE -+ mcr p15, 0, r0, c7, c5, 1 @ Invalidate I cache line -+ add r0, r0, #CACHELINESIZE -+ mcr p15, 0, r0, c7, c5, 1 @ Invalidate I cache line -+ add r0, r0, #CACHELINESIZE -+ subs r1, r1, #4 * CACHELINESIZE -+ bne 1b -+ mcr p15, 0, r0, c7, c5, 6 @ Invalidate BTB -+ mov pc, lr -+ -+/* ================================ CACHE LOCKING============================ -+ * -+ * The XScale MicroArchitecture implements support for locking entries into -+ * the data and instruction cache. The following functions implement the core -+ * low level instructions needed to accomplish the locking. The developer's -+ * manual states that the code that performs the locking must be in non-cached -+ * memory. To accomplish this, the code in xscale-cache-lock.c copies the -+ * following functions from the cache into a non-cached memory region that -+ * is allocated through consistent_alloc(). -+ * -+ */ -+ .align 5 -+/* -+ * xscale_icache_lock -+ * -+ * r0: starting address to lock -+ * r1: end address to lock -+ */ -+ENTRY(xscale_icache_lock) -+ -+iLockLoop: -+ bic r0, r0, #CACHELINESIZE - 1 -+ mcr p15, 0, r0, c9, c1, 0 @ lock into cache -+ cmp r0, r1 @ are we done? -+ add r0, r0, #CACHELINESIZE @ advance to next cache line -+ bls iLockLoop -+ mov pc, lr -+ -+/* -+ * xscale_icache_unlock -+ */ -+ENTRY(xscale_icache_unlock) -+ mcr p15, 0, r0, c9, c1, 1 @ Unlock icache -+ mov pc, lr -+ -+/* -+ * xscale_dcache_lock -+ * -+ * r0: starting address to lock -+ * r1: end address to lock -+ */ -+ENTRY(xscale_dcache_lock) -+ mcr p15, 0, ip, c7, c10, 4 @ Drain Write (& Fill) Buffer -+ mov r2, #1 -+ mcr p15, 0, r2, c9, c2, 0 @ Put dcache in lock mode -+ cpwait ip @ Wait for completion -+ -+ mrs r2, cpsr -+ orr r3, r2, #F_BIT | I_BIT -+dLockLoop: -+ msr cpsr_c, r3 -+ mcr p15, 0, r0, c7, c10, 1 @ Write back line if it is dirty -+ mcr p15, 0, r0, c7, c6, 1 @ Flush/invalidate line -+ msr cpsr_c, r2 -+ ldr ip, [r0], #CACHELINESIZE @ Preload 32 bytes into cache from -+ @ location [r0]. Post-increment -+ @ r3 to next cache line -+ cmp r0, r1 @ Are we done? -+ bls dLockLoop -+ -+ mcr p15, 0, ip, c7, c10, 4 @ Drain Write (& Fill) Buffer -+ mov r2, #0 -+ mcr p15, 0, r2, c9, c2, 0 @ Get out of lock mode -+ cpwait_ret lr, ip -+ -+/* -+ * xscale_dcache_unlock -+ */ -+ENTRY(xscale_dcache_unlock) -+ mcr p15, 0, ip, c7, c10, 4 @ Drain Write (& Fill) Buffer -+ mcr p15, 0, ip, c9, c2, 1 @ Unlock cache -+ mov pc, lr -+ -+/* -+ * Needed to determine the length of the code that needs to be copied. -+ */ -+ .align 5 -+ENTRY(xscale_cache_dummy) -+ mov pc, lr -+ -+/* ================================== TLB ================================= */ -+ -+/* -+ * cpu_xscale_tlb_invalidate_all() -+ * -+ * Invalidate all TLB entries -+ */ -+ .align 5 -+ENTRY(cpu_xscale_tlb_invalidate_all) -+ mcr p15, 0, ip, c7, c10, 4 @ Drain Write (& Fill) Buffer -+ mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs -+ cpwait_ret lr, ip -+ -+/* -+ * cpu_xscale_tlb_invalidate_range(start, end) -+ * -+ * invalidate TLB entries covering the specified range -+ * -+ * start: range start address -+ * end: range end address -+ */ -+ .align 5 -+ENTRY(cpu_xscale_tlb_invalidate_range) -+ bic r0, r0, #(PAGESIZE - 1) & 0x00ff -+ bic r0, r0, #(PAGESIZE - 1) & 0xff00 -+ sub r3, r1, r0 -+ cmp r3, #256 * PAGESIZE @ arbitrary, should be tuned -+ bhi cpu_xscale_tlb_invalidate_all -+ mcr p15, 0, ip, c7, c10, 4 @ Drain Write (& Fill) Buffer -+1: mcr p15, 0, r0, c8, c6, 1 @ invalidate D TLB entry -+ mcr p15, 0, r0, c8, c5, 1 @ invalidate I TLB entry -+ add r0, r0, #PAGESIZE -+ cmp r0, r1 -+ blo 1b -+ cpwait_ret lr, ip -+ -+/* -+ * cpu_xscale_tlb_invalidate_page(page, flags) -+ * -+ * invalidate the TLB entries for the specified page. -+ * -+ * page: page to invalidate -+ * flags: non-zero if we include the I TLB -+ */ -+ .align 5 -+ENTRY(cpu_xscale_tlb_invalidate_page) -+ mcr p15, 0, ip, c7, c10, 4 @ Drain Write (& Fill) Buffer -+ teq r1, #0 -+ mcr p15, 0, r0, c8, c6, 1 @ invalidate D TLB entry -+ mcrne p15, 0, r3, c8, c5, 1 @ invalidate I TLB entry -+ cpwait_ret lr, ip -+ -+/* ================================ TLB LOCKING============================== -+ * -+ * The XScale MicroArchitecture implements support for locking entries into -+ * the Instruction and Data TLBs. The following functions provide the -+ * low level support for supporting these under Linux. xscale-lock.c -+ * implements some higher level management code. Most of the following -+ * is taken straight out of the Developer's Manual. -+ */ -+ -+/* -+ * Lock I-TLB entry -+ * -+ * r0: Virtual address to translate and lock -+ */ -+ .align 5 -+ENTRY(xscale_itlb_lock) -+ mrs r2, cpsr -+ orr r3, r2, #F_BIT | I_BIT -+ msr cpsr_c, r3 @ Disable interrupts -+ mcr p15, 0, r0, c8, c5, 1 @ Invalidate I-TLB entry -+ mcr p15, 0, r0, c10, c4, 0 @ Translate and lock -+ msr cpsr_c, r2 @ Restore interrupts -+ cpwait_ret lr, ip -+ -+/* -+ * Lock D-TLB entry -+ * -+ * r0: Virtual address to translate and lock -+ */ -+ .align 5 -+ENTRY(xscale_dtlb_lock) -+ mrs r2, cpsr -+ orr r3, r2, #F_BIT | I_BIT -+ msr cpsr_c, r3 @ Disable interrupts -+ mcr p15, 0, r0, c8, c6, 1 @ Invalidate D-TLB entry -+ mcr p15, 0, r0, c10, c8, 0 @ Translate and lock -+ msr cpsr_c, r2 @ Restore interrupts -+ cpwait_ret lr, ip -+ -+/* -+ * Unlock all I-TLB entries -+ */ -+ .align 5 -+ENTRY(xscale_itlb_unlock) -+ mcr p15, 0, ip, c10, c4, 1 @ Unlock I-TLB -+ mcr p15, 0, ip, c8, c5, 0 @ Invalidate I-TLB -+ cpwait_ret lr, ip -+ -+/* -+ * Unlock all D-TLB entries -+ */ -+ENTRY(xscale_dtlb_unlock) -+ mcr p15, 0, ip, c10, c8, 1 @ Unlock D-TBL -+ mcr p15, 0, ip, c8, c6, 0 @ Invalidate D-TLB -+ cpwait_ret lr, ip -+ -+/* =============================== PageTable ============================== */ -+ -+/* -+ * cpu_xscale_set_pgd(pgd) -+ * -+ * Set the translation base pointer to be as described by pgd. -+ * -+ * pgd: new page tables -+ */ -+ .align 5 -+ENTRY(cpu_xscale_set_pgd) -+ clean_d_cache r1, r2 -+ mcr p15, 0, ip, c7, c5, 0 @ Invalidate I cache & BTB -+ mcr p15, 0, ip, c7, c10, 4 @ Drain Write (& Fill) Buffer -+ mcr p15, 0, r0, c2, c0, 0 @ load page table pointer -+ mcr p15, 0, ip, c8, c7, 0 @ invalidate I & D TLBs -+ cpwait_ret lr, ip -+ -+/* -+ * cpu_xscale_set_pmd(pmdp, pmd) -+ * -+ * Set a level 1 translation table entry, and clean it out of -+ * any caches such that the MMUs can load it correctly. -+ * -+ * pmdp: pointer to PMD entry -+ * pmd: PMD value to store -+ */ -+ .align 5 -+ENTRY(cpu_xscale_set_pmd) -+#if PMD_CACHE_WRITE_ALLOCATE && !CACHE_WRITE_THROUGH -+ and r2, r1, #PMD_TYPE_MASK|PMD_SECT_CACHEABLE|PMD_SECT_BUFFERABLE -+ cmp r2, #PMD_TYPE_SECT|PMD_SECT_CACHEABLE|PMD_SECT_BUFFERABLE -+ orreq r1, r1, #PMD_SECT_TEX(1) -+#elif CACHE_WRITE_THROUGH -+ and r2, r1, #PMD_TYPE_MASK|PMD_SECT_CACHEABLE|PMD_SECT_BUFFERABLE -+ cmp r2, #PMD_TYPE_SECT|PMD_SECT_CACHEABLE|PMD_SECT_BUFFERABLE -+ biceq r1, r1, #PMD_SECT_BUFFERABLE -+#endif -+ str r1, [r0] -+ mov ip, #0 -+ mcr p15, 0, r0, c7, c10, 1 @ Clean D cache line -+ mcr p15, 0, ip, c7, c10, 4 @ Drain Write (& Fill) Buffer -+ mov pc, lr -+ -+/* -+ * cpu_xscale_set_pte(ptep, pte) -+ * -+ * Set a PTE and flush it out -+ * -+ * Errata 40: must set memory to write-through for user read-only pages. -+ */ -+ .align 5 -+ENTRY(cpu_xscale_set_pte) -+ str r1, [r0], #-1024 @ linux version -+ -+ bic r2, r1, #0xff0 -+ orr r2, r2, #PTE_TYPE_EXT @ extended page -+ -+ eor r3, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_WRITE | L_PTE_DIRTY -+ -+ tst r3, #L_PTE_USER | L_PTE_EXEC @ User or Exec? -+ orrne r2, r2, #PTE_EXT_AP_URO_SRW @ yes -> user r/o, system r/w -+ -+ tst r3, #L_PTE_WRITE | L_PTE_DIRTY @ Write and Dirty? -+ orreq r2, r2, #PTE_EXT_AP_UNO_SRW @ yes -> user n/a, system r/w -+ @ combined with user -> user r/w -+ -+ @ -+ @ Handle the X bit. We want to set this bit for the minicache -+ @ (U = E = B = W = 0, C = 1) or when write allocate is enabled, -+ @ and we have a writeable, cacheable region. If we ignore the -+ @ U and E bits, we can allow user space to use the minicache as -+ @ well. -+ @ -+ @ X = C & ~W & ~B -+ @ | C & W & B & write_allocate -+ @ -+ eor ip, r1, #L_PTE_CACHEABLE -+ tst ip, #L_PTE_CACHEABLE | L_PTE_WRITE | L_PTE_BUFFERABLE -+#if PTE_CACHE_WRITE_ALLOCATE && !CACHE_WRITE_THROUGH -+ eorne ip, r1, #L_PTE_CACHEABLE | L_PTE_WRITE | L_PTE_BUFFERABLE -+ tstne ip, #L_PTE_CACHEABLE | L_PTE_WRITE | L_PTE_BUFFERABLE -+#endif -+ orreq r2, r2, #PTE_EXT_TEX(1) -+ -+#if CACHE_WRITE_THROUGH -+ tst r1, #L_PTE_CACHEABLE -+ bicne r2, r2, #L_PTE_BUFFERABLE @ clear B only if C is set -+#else -+ @ -+ @ Errata 40: The B bit must be cleared for a user read-only -+ @ cacheable page. -+ @ -+ @ B = B & ~((U|E) & C & ~W) -+ @ -+ and ip, r1, #L_PTE_USER | L_PTE_EXEC | L_PTE_WRITE | L_PTE_CACHEABLE -+ teq ip, #L_PTE_USER | L_PTE_CACHEABLE -+ teqne ip, #L_PTE_EXEC | L_PTE_CACHEABLE -+ teqne ip, #L_PTE_USER | L_PTE_EXEC | L_PTE_CACHEABLE -+ biceq r2, r2, #PTE_BUFFERABLE -+#endif -+ -+ tst r3, #L_PTE_PRESENT | L_PTE_YOUNG @ Present and Young? -+ movne r2, #0 @ no -> fault -+ -+ str r2, [r0] @ hardware version -+ -+ @ We try to map 64K page entries when possible. -+ @ We do that for kernel space only since the usage pattern from -+ @ the setting of VM area is quite simple. User space is not worth -+ @ the implied complexity because of ever randomly changing PTEs -+ @ (page aging, swapout, etc) requiring constant coherency checks. -+ @ Since PTEs are usually set in increasing order, we test the -+ @ possibility for a large page only when given the last PTE of a -+ @ 64K boundary. -+ tsteq r1, #L_PTE_USER -+ andeq r1, r0, #(15 << 2) -+ teqeq r1, #(15 << 2) -+ beq 1f -+ -+ mov ip, #0 -+ mcr p15, 0, r0, c7, c10, 1 @ Clean D cache line -+ mcr p15, 0, ip, c7, c10, 4 @ Drain Write (& Fill) Buffer -+ mov pc, lr -+ -+ @ See if we have 16 identical PTEs but with consecutive base addresses -+1: bic r3, r2, #0x0000f000 -+ mov r1, #0x0000f000 -+2: eor r2, r2, r3 -+ teq r2, r1 -+ bne 4f -+ subs r1, r1, #0x00001000 -+ ldr r2, [r0, #-4]! -+ bne 2b -+ eors r2, r2, r3 -+ bne 4f -+ -+ @ Now create our LARGE PTE from the current EXT one. -+ bic r3, r3, #PTE_TYPE_MASK -+ orr r3, r3, #PTE_TYPE_LARGE -+ and r2, r3, #0x30 @ EXT_AP --> LARGE_AP0 -+ orr r2, r2, r2, lsl #2 @ add LARGE_AP1 -+ orr r2, r2, r2, lsl #4 @ add LARGE_AP3 + LARGE_AP2 -+ and r1, r3, #0x3c0 @ EXT_TEX -+ bic r3, r3, #0x3c0 -+ orr r2, r2, r1, lsl #(12 - 6) @ --> LARGE_TEX -+ orr r2, r2, r3 @ add remaining bits -+ -+ @ then put it in the pagetable -+ mov r3, r2 -+3: strd r2, [r0], #8 -+ tst r0, #(15 << 2) -+ bne 3b -+ -+ @ Then sync the 2 corresponding cache lines -+ sub r0, r0, #(16 << 2) -+ mcr p15, 0, r0, c7, c10, 1 @ Clean D cache line -+4: orr r0, r0, #(15 << 2) -+ mcr p15, 0, r0, c7, c10, 1 @ Clean D cache line -+ mov ip, #0 -+ mcr p15, 0, ip, c7, c10, 4 @ Drain Write (& Fill) Buffer -+ mov pc, lr -+ -+ .ltorg -+ -+cpu_manu_name: -+ .asciz "Intel" -+ -+cpu_80200_name: -+ .asciz "XScale-80200" -+ -+cpu_pxa210_name: -+ .asciz "XScale-PXA210" -+ -+cpu_pxa250_name: -+ .asciz "XScale-PXA250" -+ -+cpu_pxa255_name: -+ .asciz "XScale-PXA255" -+ -+ .align -+ -+ .section ".text.init", #alloc, #execinstr -+ -+__xscale_setup: -+ mov r0, #F_BIT|I_BIT|SVC_MODE -+ msr cpsr_c, r0 -+ mcr p15, 0, ip, c7, c7, 0 @ invalidate I, D caches & BTB -+ mcr p15, 0, ip, c7, c10, 4 @ Drain Write (& Fill) Buffer -+ mcr p15, 0, ip, c8, c7, 0 @ invalidate I, D TLBs -+ mcr p15, 0, r4, c2, c0, 0 @ load page table pointer -+ mov r0, #0x1f @ Domains 0, 1 = client -+ mcr p15, 0, r0, c3, c0, 0 @ load domain access register -+ mov r0, #1 @ Allow user space to access -+ mcr p15, 0, r0, c15, c1, 0 @ ... CP 0 only. -+#if CACHE_WRITE_THROUGH -+ mov r0, #0x20 -+#else -+ mov r0, #0x00 -+#endif -+ mcr p15, 0, r0, c1, c1, 0 @ set auxiliary control reg -+ mrc p15, 0, r0, c1, c0, 0 @ get control register -+ bic r0, r0, #0x0200 @ ......R......... -+ bic r0, r0, #0x0082 @ ........B.....A. -+ orr r0, r0, #0x0005 @ .............C.M -+ orr r0, r0, #0x3900 @ ..VIZ..S........ -+#ifdef CONFIG_XSCALE_CACHE_ERRATA -+ bic r0, r0, #0x0004 @ see cpu_xscale_proc_init -+#endif -+ mov pc, lr -+ -+ .text -+ -+/* -+ * Purpose : Function pointers used to access above functions - all calls -+ * come through these -+ */ -+ -+ .type xscale_processor_functions, #object -+ENTRY(xscale_processor_functions) -+ .word cpu_xscale_data_abort -+ .word cpu_xscale_check_bugs -+ .word cpu_xscale_proc_init -+ .word cpu_xscale_proc_fin -+ .word cpu_xscale_reset -+ .word cpu_xscale_do_idle -+ -+ /* cache */ -+ .word cpu_xscale_cache_clean_invalidate_all -+ .word cpu_xscale_cache_clean_invalidate_range -+ .word cpu_xscale_flush_ram_page -+ -+ /* dcache */ -+ .word cpu_xscale_dcache_invalidate_range -+ .word cpu_xscale_dcache_clean_range -+ .word cpu_xscale_dcache_clean_page -+ .word cpu_xscale_dcache_clean_entry -+ -+ /* icache */ -+ .word cpu_xscale_icache_invalidate_range -+ .word cpu_xscale_icache_invalidate_page -+ -+ /* tlb */ -+ .word cpu_xscale_tlb_invalidate_all -+ .word cpu_xscale_tlb_invalidate_range -+ .word cpu_xscale_tlb_invalidate_page -+ -+ /* pgtable */ -+ .word cpu_xscale_set_pgd -+ .word cpu_xscale_set_pmd -+ .word cpu_xscale_set_pte -+ .size xscale_processor_functions, . - xscale_processor_functions -+ -+ .type cpu_80200_info, #object -+cpu_80200_info: -+ .long cpu_manu_name -+ .long cpu_80200_name -+ .size cpu_80200_info, . - cpu_80200_info -+ -+ .type cpu_pxa210_info, #object -+cpu_pxa210_info: -+ .long cpu_manu_name -+ .long cpu_pxa210_name -+ .size cpu_pxa210_info, . - cpu_pxa210_info -+ -+ .type cpu_pxa250_info, #object -+cpu_pxa250_info: -+ .long cpu_manu_name -+ .long cpu_pxa250_name -+ .size cpu_pxa250_info, . - cpu_pxa250_info -+ -+ .type cpu_pxa255_info, #object -+cpu_pxa255_info: -+ .long cpu_manu_name -+ .long cpu_pxa255_name -+ .size cpu_pxa255_info, . - cpu_pxa255_info -+ -+ .type cpu_arch_name, #object -+cpu_arch_name: -+ .asciz "armv5te" -+ .size cpu_arch_name, . - cpu_arch_name -+ -+ .type cpu_elf_name, #object -+cpu_elf_name: -+ .asciz "v5" -+ .size cpu_elf_name, . - cpu_elf_name -+ .align -+ -+ .section ".proc.info", #alloc, #execinstr -+ -+ .type __80200_proc_info,#object -+__80200_proc_info: -+ .long 0x69052000 -+ .long 0xfffffff0 -+#if CACHE_WRITE_THROUGH -+ .long 0x00000c0a -+#else -+ .long 0x00000c0e -+#endif -+ b __xscale_setup -+ .long cpu_arch_name -+ .long cpu_elf_name -+ .long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP|HWCAP_XSCALE -+ .long cpu_80200_info -+ .long xscale_processor_functions -+ .size __80200_proc_info, . - __80200_proc_info -+ -+ .type __pxa210_proc_info,#object -+__pxa210_proc_info: -+ .long 0x69052120 -+ .long 0xfffff3f0 -+#if CACHE_WRITE_THROUGH -+ .long 0x00000c0a -+#else -+ .long 0x00000c0e -+#endif -+ b __xscale_setup -+ .long cpu_arch_name -+ .long cpu_elf_name -+ .long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP|HWCAP_XSCALE -+ .long cpu_pxa210_info -+ .long xscale_processor_functions -+ .size __pxa210_proc_info, . - __pxa210_proc_info -+ -+ .type __pxa250_proc_info,#object -+__pxa250_proc_info: -+ .long 0x69052100 -+ .long 0xfffff7f0 -+#if CACHE_WRITE_THROUGH -+ .long 0x00000c0a -+#else -+ .long 0x00000c0e -+#endif -+ b __xscale_setup -+ .long cpu_arch_name -+ .long cpu_elf_name -+ .long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP|HWCAP_XSCALE -+ .long cpu_pxa250_info -+ .long xscale_processor_functions -+ .size __pxa250_proc_info, . - __pxa250_proc_info -+ -+ .type __pxa255_proc_info,#object -+__pxa255_proc_info: -+ .long 0x69052d00 -+ .long 0xfffffff0 -+#if CACHE_WRITE_THROUGH -+ .long 0x00000c0a -+#else -+ .long 0x00000c0e -+#endif -+ b __xscale_setup -+ .long cpu_arch_name -+ .long cpu_elf_name -+ .long HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP|HWCAP_XSCALE -+ .long cpu_pxa255_info -+ .long xscale_processor_functions -+ .size __pxa255_proc_info, . - __pxa255_proc_info -+ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/arch/arm/vmlinux-armv-xip.lds.in 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,125 @@ -+/* -+ * ld script to make ARM Linux kernel -+ * -+ * (C) Copyright 2001 Lineo Japan, Inc. -+ * -+ * May be copied or modified under the terms of the GNU General Public -+ * License. See linux/COPYING for more information. -+ * -+ * Based on arch/arm/vmlinux-armv.lds.in -+ * -+ * taken from the i386 version by Russell King -+ * Written by Martin Mares <mj@atrey.karlin.mff.cuni.cz> -+ */ -+OUTPUT_ARCH(arm) -+ENTRY(stext) -+SECTIONS -+{ -+ . = TEXTADDR; -+ .init : { /* Init code and data */ -+ _stext = .; -+ __init_begin = .; -+ *(.text.init) -+ __proc_info_begin = .; -+ *(.proc.info) -+ __proc_info_end = .; -+ __arch_info_begin = .; -+ *(.arch.info) -+ __arch_info_end = .; -+ __tagtable_begin = .; -+ *(.taglist) -+ __tagtable_end = .; -+ . = ALIGN(16); -+ __setup_start = .; -+ *(.setup.init) -+ __setup_end = .; -+ __initcall_start = .; -+ *(.initcall.init) -+ __initcall_end = .; -+ . = ALIGN(4096); -+ __init_end = .; -+ } -+ -+ /DISCARD/ : { /* Exit code and data */ -+ *(.text.exit) -+ *(.data.exit) -+ *(.exitcall.exit) -+ } -+ -+ .text : { /* Real text segment */ -+ _text = .; /* Text and read-only data */ -+ *(.text) -+ *(.fixup) -+ *(.gnu.warning) -+ *(.text.lock) /* out-of-line lock text */ -+ *(.rodata) -+ *(.rodata.*) -+ *(.glue_7) -+ *(.glue_7t) -+ *(.kstrtab) -+ *(.got) /* Global offset table */ -+ *(.got.plt) -+ -+ _etext = .; /* End of text section */ -+ } -+ -+ . = ALIGN(16); -+ __ex_table : { /* Exception table */ -+ __start___ex_table = .; -+ *(__ex_table) -+ __stop___ex_table = .; -+ } -+ -+ __ksymtab : { /* Kernel symbol table */ -+ __start___ksymtab = .; -+ *(__ksymtab) -+ __stop___ksymtab = .; -+ } -+ -+ _endtext = .; -+ -+ . = DATAADDR; -+ -+ _sdata = .; -+ -+ . = ALIGN(8192); -+ -+ .data : { -+ /* -+ * first, the init task union, aligned -+ * to an 8192 byte boundary. -+ */ -+ *(.init.task) -+ -+ /* -+ * then the cacheline aligned data -+ */ -+ . = ALIGN(32); -+ *(.data.cacheline_aligned) -+ -+ /* -+ * and the usual data section -+ */ -+ *(.data) -+ CONSTRUCTORS -+ -+ *(.data.init) -+ -+ _edata = .; -+ } -+ -+ .bss : { -+ __bss_start = .; /* BSS */ -+ *(.bss) -+ *(COMMON) -+ _end = . ; -+ } -+ /* Stabs debugging sections. */ -+ .stab 0 : { *(.stab) } -+ .stabstr 0 : { *(.stabstr) } -+ .stab.excl 0 : { *(.stab.excl) } -+ .stab.exclstr 0 : { *(.stab.exclstr) } -+ .stab.index 0 : { *(.stab.index) } -+ .stab.indexstr 0 : { *(.stab.indexstr) } -+ .comment 0 : { *(.comment) } -+} ---- linux-2.4.25/drivers/Makefile~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/drivers/Makefile 2004-03-31 17:15:11.000000000 +0200 -@@ -25,6 +25,7 @@ - subdir-$(CONFIG_NUBUS) += nubus - subdir-$(CONFIG_TC) += tc - subdir-$(CONFIG_VT) += video -+subdir-$(CONFIG_MMC) += mmc - subdir-$(CONFIG_MAC) += macintosh - subdir-$(CONFIG_PPC32) += macintosh - subdir-$(CONFIG_USB) += usb ---- linux-2.4.25/drivers/char/Config.in~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/drivers/char/Config.in 2004-03-31 17:15:11.000000000 +0200 -@@ -253,6 +253,7 @@ - dep_tristate ' DC21285 watchdog' CONFIG_21285_WATCHDOG $CONFIG_FOOTBRIDGE - dep_tristate ' NetWinder WB83C977 watchdog' CONFIG_977_WATCHDOG $CONFIG_ARCH_NETWINDER - dep_tristate ' SA1100 watchdog' CONFIG_SA1100_WATCHDOG $CONFIG_ARCH_SA1100 -+ dep_tristate ' PXA250/210 watchdog' CONFIG_SA1100_WATCHDOG $CONFIG_ARCH_PXA - dep_tristate ' EPXA watchdog' CONFIG_EPXA_WATCHDOG $CONFIG_ARCH_CAMELOT - dep_tristate ' Omaha watchdog' CONFIG_OMAHA_WATCHDOG $CONFIG_ARCH_OMAHA - dep_tristate ' AT91RM9200 watchdog' CONFIG_AT91_WATCHDOG $CONFIG_ARCH_AT91RM9200 -@@ -335,6 +336,9 @@ - if [ "$CONFIG_ARCH_SA1100" = "y" ]; then - tristate 'SA1100 Real Time Clock' CONFIG_SA1100_RTC - fi -+if [ "$CONFIG_ARCH_PXA" = "y" ]; then -+ tristate 'PXA250/210 Real Time Clock' CONFIG_PXA_RTC -+fi - if [ "$CONFIG_ARCH_OMAHA" = "y" ]; then - tristate 'Omaha Real Time Clock' CONFIG_OMAHA_RTC - fi -@@ -417,4 +421,8 @@ - dep_tristate 'HP OB600 C/CT Pop-up mouse support' CONFIG_OBMOUSE $CONFIG_INPUT_MOUSEDEV - fi - -+if [ "$CONFIG_ARCH_TRIZEPS2" = "y" ]; then -+ tristate ' MT6N TTL I/O suport' CONFIG_TRIZEPS2_TTLIO -+fi -+ - endmenu ---- linux-2.4.25/drivers/char/Makefile~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/drivers/char/Makefile 2004-03-31 17:15:11.000000000 +0200 -@@ -280,6 +280,7 @@ - obj-$(CONFIG_MIPS_RTC) += mips_rtc.o - obj-$(CONFIG_SGI_IP27_RTC) += ip27-rtc.o - obj-$(CONFIG_SA1100_RTC) += sa1100-rtc.o -+obj-$(CONFIG_PXA_RTC) += sa1100-rtc.o - obj-$(CONFIG_OMAHA_RTC) += omaha-rtc.o - ifeq ($(CONFIG_PPC),) - obj-$(CONFIG_NVRAM) += nvram.o ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/char/mt6n_ttl.c 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,316 @@ -+/* -+ * Trizeps-2 MT6N development board TTL-IO interface for Linux -+ * -+ * Copyright (C) 2003 Luc De Cock -+ * -+ * This driver allows use of the TTL-IO interface on the MT6N -+ * from user space. It exports the /dev/ttlio interface supporting -+ * some ioctl() and also the /proc/driver/ttlio pseudo-file -+ * for status information. -+ * -+ * The ioctls can be used to set individual TTL output lines. -+ * Only ioctls are supported. -+ * -+ * 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. -+ * -+ * Based on other minimal char device drivers, like Alan's -+ * watchdog, Ted's random, Paul's rtc, etc. etc. -+ * -+ * 1.00 Luc De Cock: initial version. -+ */ -+ -+#define TTLIO_VERSION "1.00" -+ -+ -+#include <linux/config.h> -+#include <linux/module.h> -+#include <linux/kernel.h> -+#include <linux/types.h> -+#include <linux/miscdevice.h> -+#include <linux/fcntl.h> -+#include <linux/init.h> -+#include <linux/poll.h> -+#include <linux/proc_fs.h> -+ -+#include <asm/io.h> -+#include <asm/uaccess.h> -+#include <asm/system.h> -+#include <asm/hardware.h> -+#include <asm/irq.h> -+ -+/* Writing to the register sets the output lines -+* Reading from the register returns the status of the input lines -+*/ -+static unsigned short *ttlio_base = (unsigned short *) TRIZEPS2_TTLIO_BASE; -+static unsigned short ttlio_shadow = 0; -+ -+/* interrupt stuff */ -+static struct fasync_struct *ttlio_async_queue; -+static DECLARE_WAIT_QUEUE_HEAD(ttlio_wait); -+static int ttlio_irq_arrived = 0; -+static spinlock_t ttlio_lock; -+static unsigned short ttlio_in = 0; -+static volatile unsigned long teller = 0; -+ -+ -+static int ttlio_ioctl(struct inode *inode, struct file *file, -+ unsigned int cmd, unsigned long arg); -+ -+static int ttlio_read_proc(char *page, char **start, off_t off, -+ int count, int *eof, void *data); -+ -+ -+static void ttlio_interrupt(int irq, void *dev_id, struct pt_regs *regs) -+{ -+ ttlio_in = *ttlio_base; -+ -+ ttlio_irq_arrived = 1; -+ teller++; -+ -+ /* wake up the waiting process */ -+ wake_up_interruptible(&ttlio_wait); -+ kill_fasync(&ttlio_async_queue, SIGIO, POLL_IN); -+} -+ -+/* -+ * Now all the various file operations that we export. -+ */ -+ -+static int ttlio_ioctl(struct inode *inode, struct file *file, unsigned int cmd, -+ unsigned long arg) -+{ -+ unsigned long ttlio_val; -+ -+ switch (cmd) { -+ case TTLIO_RESET: /* clear all lines */ -+ { -+ *ttlio_base = 0; -+ return 0; -+ } -+ case TTLIO_GET: /* get state of TTL input lines */ -+ { -+ ttlio_val = *ttlio_base; -+ return put_user(ttlio_val, (unsigned long *)arg); -+ } -+ case TTLIO_SET: /* set state of TTL output lines */ -+ { -+ unsigned long user_val; -+ if (copy_from_user(&user_val, arg, sizeof(unsigned long))) -+ return -EFAULT; -+ ttlio_shadow |= (unsigned short) user_val; -+ *ttlio_base = ttlio_shadow; -+ return 0; -+ } -+ case TTLIO_UNSET: /* unset (clear) state of TTL output lines */ -+ { -+ unsigned long user_val; -+ if (copy_from_user(&user_val, arg, sizeof(unsigned long))) -+ return -EFAULT; -+ ttlio_shadow &= ~((unsigned short) user_val); -+ *ttlio_base = ttlio_shadow; -+ return 0; -+ } -+ case 100: /* get counter */ -+ { -+ return put_user(teller, (unsigned long *)arg); -+ } -+ case 101: /* reset counter */ -+ { -+ teller = 0; -+ return 0; -+ } -+ default: -+ return -ENOTTY; -+ } -+ return 0; -+} -+ -+static ssize_t ttlio_read(struct file *file, char *buf, -+ size_t count, loff_t *ppos) -+{ -+ DECLARE_WAITQUEUE(wait, current); -+ unsigned short data; -+ ssize_t retval; -+ -+ if (count < sizeof(unsigned short)) -+ return -EINVAL; -+ -+ if (file->f_flags & O_NONBLOCK) { -+ spin_lock_irq(&ttlio_lock); -+ data = *ttlio_base; -+ spin_unlock_irq(&ttlio_lock); -+ retval = put_user(data, (unsigned short *) buf); -+ if (!retval) -+ retval = sizeof(unsigned short); -+ return retval; -+ } -+ /* blocking read: wait for interrupt */ -+ add_wait_queue(&ttlio_wait, &wait); -+ set_current_state(TASK_INTERRUPTIBLE); -+ for (;;) { -+ spin_lock_irq(&ttlio_lock); -+ data = *ttlio_base; -+ if (ttlio_irq_arrived) { -+ ttlio_irq_arrived = 0; -+ break; -+ } -+ spin_unlock_irq(&ttlio_lock); -+ -+ if (signal_pending(current)) { -+ retval = -ERESTARTSYS; -+ goto out; -+ } -+ schedule(); -+ } -+ -+ spin_unlock_irq(&ttlio_lock); -+ retval = put_user(data, (unsigned short *)buf); -+ if (!retval) -+ retval = sizeof(unsigned short); -+ -+out: -+ set_current_state(TASK_RUNNING); -+ remove_wait_queue(&ttlio_wait, &wait); -+ return retval; -+} -+ -+static ssize_t ttlio_write(struct file *file, -+ const char *buf, size_t count, loff_t *ppos) -+{ -+ unsigned short content; -+ -+ if (count < sizeof(unsigned short)) -+ return -EINVAL; -+ -+ if (copy_from_user (&content, buf, sizeof(unsigned short))) -+ return -EFAULT; -+ -+ ttlio_shadow = content; -+ *ttlio_base = ttlio_shadow; -+ -+ *ppos += sizeof(unsigned short); -+ -+ return sizeof(unsigned short); -+} -+ -+static int ttlio_open(struct inode *inode, struct file *file) -+{ -+ ttlio_irq_arrived = 0; -+ return 0; -+} -+ -+static int ttlio_fasync(int fd, struct file *filp, int on) -+{ -+ return fasync_helper(fd, filp, on, &ttlio_async_queue); -+} -+ -+static unsigned int ttlio_poll(struct file *file, poll_table *wait) -+{ -+ poll_wait(file, &ttlio_wait, wait); -+ return ttlio_irq_arrived ? 0 : POLLIN | POLLRDNORM; -+} -+ -+static loff_t ttlio_llseek(struct file *file, loff_t offset, int origin) -+{ -+ return -ESPIPE; -+} -+ -+/* -+ * The various file operations we support. -+ */ -+ -+static struct file_operations ttlio_fops = { -+ owner: THIS_MODULE, -+ llseek: ttlio_llseek, -+ read: ttlio_read, -+ poll: ttlio_poll, -+ write: ttlio_write, -+ ioctl: ttlio_ioctl, -+ open: ttlio_open, -+ fasync: ttlio_fasync, -+}; -+ -+static struct miscdevice ttlio_dev = { -+ TTLIO_MINOR, -+ "ttlio", -+ &ttlio_fops -+}; -+ -+static int __init ttlio_init(void) -+{ -+ printk(KERN_INFO "MT6N TTL-I/O driver (release %s)\n", -+ TTLIO_VERSION); -+ -+ misc_register(&ttlio_dev); -+ create_proc_read_entry ("driver/ttlio", 0, 0, ttlio_read_proc, NULL); -+ -+ set_GPIO_IRQ_edge(GPIO_TTLIO_IRQ, GPIO_FALLING_EDGE); -+ if (request_irq(TTLIO_IRQ, ttlio_interrupt, SA_INTERRUPT, "ttlio irq", NULL)) { -+ printk(KERN_ERR "ttlio: irq %d already in use\n", TTLIO_IRQ); -+ return 1; -+ } -+ return 0; -+} -+ -+static void __exit ttlio_exit(void) -+{ -+ free_irq(TTLIO_IRQ, NULL); -+ remove_proc_entry ("driver/ttlio", NULL); -+ misc_deregister(&ttlio_dev); -+} -+ -+module_init(ttlio_init); -+module_exit(ttlio_exit); -+EXPORT_NO_SYMBOLS; -+ -+/* -+ * Info exported via "/proc/driver/ttlio". -+ */ -+ -+static int ttlio_proc_output(char *buf) -+{ -+ char *p; -+ unsigned short val; -+ int i; -+ -+ p = buf; -+ -+ p += sprintf(p, "input : "); -+ /* write the state of the input lines */ -+ val = *ttlio_base; -+ for (i = 0; i < 8*sizeof(unsigned short); i++) { -+ *p++ = (val & 1) ? '1' : '0'; -+ val >>= 1; -+ } -+ *p = 0; -+ p += sprintf(p, "\noutput: "); -+ /* write the state of the output lines */ -+ val = ttlio_shadow; -+ for (i = 0; i < 8*sizeof(unsigned short); i++) { -+ *p++ = (val & 1) ? '1' : '0'; -+ val >>= 1; -+ } -+ *p = 0; -+ p += sprintf(p, "\n"); -+ -+ return p - buf; -+} -+ -+static int ttlio_read_proc(char *page, char **start, off_t off, -+ int count, int *eof, void *data) -+{ -+ int len = ttlio_proc_output (page); -+ if (len <= off+count) *eof = 1; -+ *start = page + off; -+ len -= off; -+ if (len > count) len = count; -+ if (len < 0) len = 0; -+ return len; -+} -+ -+MODULE_AUTHOR("Luc De Cock"); -+MODULE_DESCRIPTION("MT6N TTL-I/O driver"); -+MODULE_LICENSE("GPL"); ---- linux-2.4.25/drivers/char/sa1100-rtc.c~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/drivers/char/sa1100-rtc.c 2004-03-31 17:15:11.000000000 +0200 -@@ -1,5 +1,6 @@ - /* - * Real Time Clock interface for Linux on StrongARM SA1100 -+ * and XScale PXA250/210. - * - * Copyright (c) 2000 Nils Faerber - * -@@ -470,5 +471,5 @@ - module_exit(rtc_exit); - - MODULE_AUTHOR("Nils Faerber <nils@@kernelconcepts.de>"); --MODULE_DESCRIPTION("SA1100 Realtime Clock Driver (RTC)"); -+MODULE_DESCRIPTION("SA1100/PXA Realtime Clock Driver (RTC)"); - EXPORT_NO_SYMBOLS; ---- linux-2.4.25/drivers/char/sa1100_wdt.c~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/drivers/char/sa1100_wdt.c 2004-03-31 17:15:11.000000000 +0200 -@@ -1,5 +1,5 @@ - /* -- * Watchdog driver for the SA11x0 -+ * Watchdog driver for the SA11x0/PXA - * - * (c) Copyright 2000 Oleg Drokin <green@crimea.edu> - * Based on SoftDog driver by Alan Cox <alan@redhat.com> -@@ -35,13 +35,20 @@ - - #define TIMER_MARGIN 60 /* (secs) Default is 1 minute */ - --static int sa1100_margin = TIMER_MARGIN; /* in seconds */ -+static int timer_margin = TIMER_MARGIN; /* in seconds */ - static int sa1100wdt_users; - static int pre_margin; - #ifdef MODULE --MODULE_PARM(sa1100_margin,"i"); -+MODULE_PARM(timer_margin,"i"); - #endif - -+static void sa1100dog_ping( void) -+{ -+ /* reload counter with (new) margin */ -+ pre_margin=3686400 * timer_margin; -+ OSMR3 = OSCR + pre_margin; -+} -+ - /* - * Allow only one person to hold it open - */ -@@ -51,9 +58,7 @@ - if(test_and_set_bit(1,&sa1100wdt_users)) - return -EBUSY; - MOD_INC_USE_COUNT; -- /* Activate SA1100 Watchdog timer */ -- pre_margin=3686400 * sa1100_margin; -- OSMR3 = OSCR + pre_margin; -+ sa1100dog_ping(); - OSSR = OSSR_M3; - OWER = OWER_WME; - OIER |= OIER_E3; -@@ -93,8 +98,11 @@ - unsigned int cmd, unsigned long arg) - { - static struct watchdog_info ident = { -- identity: "SA1100 Watchdog", -+ identity: "PXA/SA1100 Watchdog", -+ options: WDIOF_SETTIMEOUT, -+ firmware_version: 0, - }; -+ int new_margin; - - switch(cmd){ - default: -@@ -108,6 +116,16 @@ - case WDIOC_KEEPALIVE: - OSMR3 = OSCR + pre_margin; - return 0; -+ case WDIOC_SETTIMEOUT: -+ if (get_user(new_margin, (int *)arg)) -+ return -EFAULT; -+ if (new_margin < 1) -+ return -EINVAL; -+ timer_margin = new_margin; -+ sa1100dog_ping(); -+ /* Fall */ -+ case WDIOC_GETTIMEOUT: -+ return put_user(timer_margin, (int *)arg); - } - } - -@@ -123,7 +141,11 @@ - static struct miscdevice sa1100dog_miscdev= - { - WATCHDOG_MINOR, -- "SA1100 watchdog", -+#if defined(CONFIG_SA1100_WATCHDOG) -+ "SA1100_watchdog", -+#elif defined(CONFIG_PXA_WATCHDOG) -+ "PXA_watchdog", -+#endif - &sa1100dog_fops - }; - -@@ -136,7 +158,7 @@ - if (ret) - return ret; - -- printk("SA1100 Watchdog Timer: timer margin %d sec\n", sa1100_margin); -+ printk("SA1100/PXA Watchdog Timer: timer margin %d sec\n", timer_margin); - - return 0; - } ---- linux-2.4.25/drivers/char/serial.c~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/drivers/char/serial.c 2004-03-31 17:15:11.000000000 +0200 -@@ -133,6 +133,16 @@ - #endif - #endif - -+#ifdef CONFIG_ARCH_PXA -+#define pxa_port(x) ((x) == PORT_PXA) -+#define pxa_buggy_port(x) ({ \ -+ int cpu_ver; asm("mrc%? p15, 0, %0, c0, c0" : "=r" (cpu_ver)); \ -+ ((x) == PORT_PXA && (cpu_ver & ~1) == 0x69052100); }) -+#else -+#define pxa_port(x) (0) -+#define pxa_buggy_port(x) (0) -+#endif -+ - /* Set of debugging defines */ - - #undef SERIAL_DEBUG_INTR -@@ -311,6 +321,7 @@ - { "XR16850", 128, UART_CLEAR_FIFO | UART_USE_FIFO | - UART_STARTECH }, - { "RSA", 2048, UART_CLEAR_FIFO | UART_USE_FIFO }, -+ { "PXA UART", 32, UART_CLEAR_FIFO | UART_USE_FIFO }, - { 0, 0} - }; - -@@ -424,6 +435,9 @@ - case SERIAL_IO_MEM: - return readb((unsigned long) info->iomem_base + - (offset<<info->iomem_reg_shift)); -+ case SERIAL_IO_MEM32: -+ return readl((unsigned long) info->iomem_base + -+ (offset<<info->iomem_reg_shift)); - default: - return inb(info->port + offset); - } -@@ -443,6 +457,10 @@ - writeb(value, (unsigned long) info->iomem_base + - (offset<<info->iomem_reg_shift)); - break; -+ case SERIAL_IO_MEM32: -+ writel(value, (unsigned long) info->iomem_base + -+ (offset<<info->iomem_reg_shift)); -+ break; - default: - outb(value, info->port+offset); - } -@@ -1306,6 +1324,16 @@ - } - #endif - -+#ifdef CONFIG_ARCH_PXA -+ if (state->type == PORT_PXA) { -+ switch ((long)state->iomem_base) { -+ case (long)&FFUART: CKEN |= CKEN6_FFUART; break; -+ case (long)&BTUART: CKEN |= CKEN7_BTUART; break; -+ case (long)&STUART: CKEN |= CKEN5_STUART; break; -+ } -+ } -+#endif -+ - /* - * Clear the FIFO buffers and disable them - * (they will be reenabled in change_speed()) -@@ -1403,6 +1431,8 @@ - { - if (state->irq != 0) - info->MCR |= UART_MCR_OUT2; -+ if (pxa_buggy_port(state->type) && state->irq != 0) -+ info->MCR ^= UART_MCR_OUT2; - } - info->MCR |= ALPHA_KLUDGE_MCR; /* Don't ask */ - serial_outp(info, UART_MCR, info->MCR); -@@ -1411,6 +1441,8 @@ - * Finally, enable interrupts - */ - info->IER = UART_IER_MSI | UART_IER_RLSI | UART_IER_RDI; -+ if (pxa_port(state->type)) -+ info->IER |= UART_IER_UUE | UART_IER_RTOIE; - serial_outp(info, UART_IER, info->IER); /* enable interrupts */ - - #ifdef CONFIG_SERIAL_MANY_PORTS -@@ -1542,6 +1574,8 @@ - } else - #endif - info->MCR &= ~UART_MCR_OUT2; -+ if (pxa_buggy_port(state->type)) -+ info->MCR ^= UART_MCR_OUT2; - info->MCR |= ALPHA_KLUDGE_MCR; /* Don't ask */ - - /* disable break condition */ -@@ -1567,6 +1601,20 @@ - state->baud_base = SERIAL_RSA_BAUD_BASE_LO; - #endif - -+#ifdef CONFIG_ARCH_PXA -+ if (state->type == PORT_PXA -+#ifdef CONFIG_SERIAL_CONSOLE -+ && sercons.index != info->line -+#endif -+ ) { -+ switch ((long)state->iomem_base) { -+ case (long)&FFUART: CKEN &= ~CKEN6_FFUART; break; -+ case (long)&BTUART: CKEN &= ~CKEN7_BTUART; break; -+ case (long)&STUART: CKEN &= ~CKEN5_STUART; break; -+ } -+ } -+#endif -+ - - (void)serial_in(info, UART_RX); /* read data port to reset things */ - -@@ -1857,6 +1905,8 @@ - save_flags(flags); cli(); - info->IER |= UART_IER_THRI; - serial_out(info, UART_IER, info->IER); -+ if (pxa_buggy_port(info->state->type)) -+ rs_interrupt_single(info->state->irq, NULL, NULL); - restore_flags(flags); - } - -@@ -1933,6 +1983,11 @@ - && !(info->IER & UART_IER_THRI)) { - info->IER |= UART_IER_THRI; - serial_out(info, UART_IER, info->IER); -+ if (pxa_buggy_port(info->state->type)) { -+ save_flags(flags); cli(); -+ rs_interrupt_single(info->state->irq, NULL, NULL); -+ restore_flags(flags); -+ } - } - return ret; - } -@@ -1990,6 +2045,8 @@ - /* Make sure transmit interrupts are on */ - info->IER |= UART_IER_THRI; - serial_out(info, UART_IER, info->IER); -+ if (pxa_buggy_port(info->state->type)) -+ rs_interrupt_single(info->state->irq, NULL, NULL); - } - } - -@@ -5517,7 +5574,6 @@ - for (i = 0, state = rs_table; i < NR_PORTS; i++,state++) { - state->magic = SSTATE_MAGIC; - state->line = i; -- state->type = PORT_UNKNOWN; - state->custom_divisor = 0; - state->close_delay = 5*HZ/10; - state->closing_wait = 30*HZ; -@@ -5531,14 +5587,18 @@ - state->irq = irq_cannonicalize(state->irq); - if (state->hub6) - state->io_type = SERIAL_IO_HUB6; -- if (state->port && check_region(state->port,8)) -+ if (state->port && check_region(state->port,8)) { -+ state->type = PORT_UNKNOWN; - continue; -+ } - #ifdef CONFIG_MCA - if ((state->flags & ASYNC_BOOT_ONLYMCA) && !MCA_bus) - continue; - #endif -- if (state->flags & ASYNC_BOOT_AUTOCONF) -+ if (state->flags & ASYNC_BOOT_AUTOCONF) { -+ state->type = PORT_UNKNOWN; - autoconfig(state); -+ } - } - for (i = 0, state = rs_table; i < NR_PORTS; i++,state++) { - if (state->type == PORT_UNKNOWN) -@@ -5858,6 +5918,8 @@ - */ - ier = serial_in(info, UART_IER); - serial_out(info, UART_IER, 0x00); -+ if (pxa_port(info->state->type)) -+ serial_out(info, UART_IER, UART_IER_UUE); - - /* - * Now, do each character -@@ -6009,6 +6071,8 @@ - serial_out(info, UART_DLM, quot >> 8); /* MS of divisor */ - serial_out(info, UART_LCR, cval); /* reset DLAB */ - serial_out(info, UART_IER, 0); -+ if (pxa_port(info->state->type)) -+ serial_out(info, UART_IER, UART_IER_UUE); - serial_out(info, UART_MCR, UART_MCR_DTR | UART_MCR_RTS); - - /* ---- linux-2.4.25/drivers/i2c/Config.in~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/drivers/i2c/Config.in 2004-03-31 17:15:11.000000000 +0200 -@@ -54,6 +54,11 @@ - fi - fi - -+ if [ "$CONFIG_ARCH_PXA" = "y" ]; then -+ dep_tristate 'PXA I2C Algorithm' CONFIG_I2C_PXA_ALGO $CONFIG_I2C -+ dep_tristate 'PXA I2C Adapter' CONFIG_I2C_PXA_ADAP $CONFIG_I2C_PXA_ALGO -+ fi -+ - if [ "$CONFIG_ALL_PPC" = "y" ] ; then - dep_tristate 'Keywest I2C interface in Apple Core99 machines' CONFIG_I2C_KEYWEST $CONFIG_I2C - fi ---- linux-2.4.25/drivers/i2c/Makefile~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/drivers/i2c/Makefile 2004-03-31 17:15:11.000000000 +0200 -@@ -6,7 +6,7 @@ - - export-objs := i2c-core.o i2c-algo-bit.o i2c-algo-pcf.o \ - i2c-algo-ite.o i2c-algo-sibyte.o i2c-algo-sgi.o \ -- i2c-proc.o -+ i2c-algo-pxa.o i2c-proc.o - - # Init order: core, chardev, bit adapters, pcf adapters - -@@ -35,6 +35,10 @@ - obj-$(CONFIG_I2C_MAX1617) += i2c-max1617.o - obj-$(CONFIG_I2C_ALGO_SGI) += i2c-algo-sgi.o - -+# PXA adapters -+obj-$(CONFIG_I2C_PXA_ALGO) += i2c-algo-pxa.o -+obj-$(CONFIG_I2C_PXA_ADAP) += i2c-adap-pxa.o -+ - # This is needed for automatic patch generation: sensors code starts here - # This is needed for automatic patch generation: sensors code ends here - ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/i2c/i2c-adap-pxa.c 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,396 @@ -+/* -+ * i2c_adap_pxa.c -+ * -+ * I2C adapter for the PXA I2C bus access. -+ * -+ * Copyright (C) 2002 Intrinsyc Software Inc. -+ * -+ * 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. -+ * -+ * History: -+ * Apr 2002: Initial version [CS] -+ * Jun 2002: Properly seperated algo/adap [FB] -+ * Jan 2003: Fixed several bugs concerning interrupt handling [Kai-Uwe Bloem] -+ * Jan 2003: added limited signal handling [Kai-Uwe Bloem] -+ */ -+ -+#include <linux/kernel.h> -+#include <linux/module.h> -+ -+#include <linux/i2c.h> -+#include <linux/i2c-id.h> -+#include <linux/init.h> -+#include <linux/time.h> -+#include <linux/sched.h> -+#include <linux/delay.h> -+#include <linux/errno.h> -+ -+#include <asm/hardware.h> -+#include <asm/irq.h> -+#include <asm/arch/irqs.h> /* for IRQ_I2C */ -+ -+#include "i2c-pxa.h" -+ -+/* -+ * Set this to zero to remove all debug statements via dead code elimination. -+ */ -+//#define DEBUG 1 -+ -+#if DEBUG -+static unsigned int i2c_debug = DEBUG; -+#else -+#define i2c_debug 0 -+#endif -+ -+static int irq = 0; -+static volatile int i2c_pending = 0; /* interrupt pending when 1 */ -+static volatile int bus_error = 0; -+static volatile int tx_finished = 0; -+static volatile int rx_finished = 0; -+ -+static wait_queue_head_t i2c_wait; -+static void i2c_pxa_transfer( int lastbyte, int receive, int midbyte); -+ -+/* place a byte in the transmit register */ -+static void i2c_pxa_write_byte(u8 value) -+{ -+ IDBR = value; -+} -+ -+/* read byte in the receive register */ -+static u8 i2c_pxa_read_byte(void) -+{ -+ return (u8) (0xff & IDBR); -+} -+ -+static void i2c_pxa_start(void) -+{ -+ unsigned long icr = ICR; -+ icr |= ICR_START; -+ icr &= ~(ICR_STOP | ICR_ALDIE | ICR_ACKNAK); -+ ICR = icr; -+ -+ bus_error=0; /* clear any bus_error from previous txfers */ -+ tx_finished=0; /* clear rx and tx interrupts from previous txfers */ -+ rx_finished=0; -+ i2c_pending = 0; -+} -+ -+static void i2c_pxa_repeat_start(void) -+{ -+ unsigned long icr = ICR; -+ icr |= ICR_START; -+ icr &= ~(ICR_STOP | ICR_ALDIE); -+ ICR = icr; -+ -+ bus_error=0; /* clear any bus_error from previous txfers */ -+ tx_finished=0; /* clear rx and tx interrupts from previous txfers */ -+ rx_finished=0; -+ i2c_pending = 0; -+} -+ -+static void i2c_pxa_stop(void) -+{ -+ unsigned long icr = ICR; -+ icr |= ICR_STOP; -+ icr &= ~(ICR_START); -+ ICR = icr; -+} -+ -+static void i2c_pxa_midbyte(void) -+{ -+ unsigned long icr = ICR; -+ icr &= ~(ICR_START | ICR_STOP); -+ ICR = icr; -+} -+ -+static void i2c_pxa_abort(void) -+{ -+ unsigned long timeout = jiffies + HZ/4; -+ -+#ifdef PXA_ABORT_MA -+ while ((long)(timeout - jiffies) > 0 && (ICR & ICR_TB)) { -+ set_current_state(TASK_INTERRUPTIBLE); -+ schedule_timeout(1); -+ } -+ -+ ICR |= ICR_MA; -+ udelay(100); -+#else -+ while ((long)(timeout - jiffies) > 0 && (IBMR & 0x1) == 0) { -+ i2c_pxa_transfer( 1, I2C_RECEIVE, 1); -+ set_current_state(TASK_INTERRUPTIBLE); -+ schedule_timeout(1); -+ } -+#endif -+ ICR &= ~(ICR_MA | ICR_START | ICR_STOP); -+} -+ -+static int i2c_pxa_wait_bus_not_busy( void) -+{ -+ int timeout = DEF_TIMEOUT; -+ -+ while (timeout-- && (ISR & ISR_IBB)) { -+ udelay(100); /* wait for 100 us */ -+ } -+ -+ return (timeout<=0); -+} -+ -+static void i2c_pxa_wait_for_ite(void){ -+ unsigned long flags; -+ if (irq > 0) { -+ save_flags_cli(flags); -+ if (i2c_pending == 0) { -+ interruptible_sleep_on_timeout(&i2c_wait, I2C_SLEEP_TIMEOUT ); -+ } -+ i2c_pending = 0; -+ restore_flags(flags); -+ } else { -+ udelay(100); -+ } -+} -+ -+static int i2c_pxa_wait_for_int( int wait_type) -+{ -+ int timeout = DEF_TIMEOUT; -+#ifdef DEBUG -+ if (bus_error) -+ printk(KERN_INFO"i2c_pxa_wait_for_int: Bus error on enter\n"); -+ if (rx_finished) -+ printk(KERN_INFO"i2c_pxa_wait_for_int: Receive interrupt on enter\n"); -+ if (tx_finished) -+ printk(KERN_INFO"i2c_pxa_wait_for_int: Transmit interrupt on enter\n"); -+#endif -+ -+ if (wait_type == I2C_RECEIVE){ /* wait on receive */ -+ -+ do { -+ i2c_pxa_wait_for_ite(); -+ } while (!(rx_finished) && timeout-- && !signal_pending(current)); -+ -+#ifdef DEBUG -+ if (timeout<0){ -+ if (tx_finished) -+ printk("Error: i2c-algo-pxa.o: received a tx" -+ " interrupt while waiting on a rx in wait_for_int"); -+ } -+#endif -+ } else { /* wait on transmit */ -+ -+ do { -+ i2c_pxa_wait_for_ite(); -+ } while (!(tx_finished) && timeout-- && !signal_pending(current)); -+ -+#ifdef DEBUG -+ if (timeout<0){ -+ if (rx_finished) -+ printk("Error: i2c-algo-pxa.o: received a rx" -+ " interrupt while waiting on a tx in wait_for_int"); -+ } -+#endif -+ } -+ -+ udelay(ACK_DELAY); /* this is needed for the bus error */ -+ -+ tx_finished=0; -+ rx_finished=0; -+ -+ if (bus_error){ -+ bus_error=0; -+ if( i2c_debug > 2)printk("wait_for_int: error - no ack.\n"); -+ return BUS_ERROR; -+ } -+ -+ if (signal_pending(current)) { -+ return (-ERESTARTSYS); -+ } else if (timeout < 0) { -+ if( i2c_debug > 2)printk("wait_for_int: timeout.\n"); -+ return(-EIO); -+ } else -+ return(0); -+} -+ -+static void i2c_pxa_transfer( int lastbyte, int receive, int midbyte) -+{ -+ if( lastbyte) -+ { -+ if( receive==I2C_RECEIVE) ICR |= ICR_ACKNAK; -+ i2c_pxa_stop(); -+ } -+ else if( midbyte) -+ { -+ i2c_pxa_midbyte(); -+ } -+ ICR |= ICR_TB; -+} -+ -+static void i2c_pxa_reset( void) -+{ -+#ifdef DEBUG -+ printk("Resetting I2C Controller Unit\n"); -+#endif -+ -+ /* abort any transfer currently under way */ -+ i2c_pxa_abort(); -+ -+ /* reset according to 9.8 */ -+ ICR = ICR_UR; -+ ISR = I2C_ISR_INIT; -+ ICR &= ~ICR_UR; -+ -+ /* set the global I2C clock on */ -+ CKEN |= CKEN14_I2C; -+ -+ /* set our slave address */ -+ ISAR = I2C_PXA_SLAVE_ADDR; -+ -+ /* set control register values */ -+ ICR = I2C_ICR_INIT; -+ -+ /* clear any leftover states from prior transmissions */ -+ i2c_pending = rx_finished = tx_finished = bus_error = 0; -+ -+ /* enable unit */ -+ ICR |= ICR_IUE; -+ udelay(100); -+} -+ -+static void i2c_pxa_handler(int this_irq, void *dev_id, struct pt_regs *regs) -+{ -+ int status, wakeup = 0; -+ status = (ISR); -+ -+ if (status & ISR_BED){ -+ (ISR) |= ISR_BED; -+ bus_error=ISR_BED; -+ wakeup = 1; -+ } -+ if (status & ISR_ITE){ -+ (ISR) |= ISR_ITE; -+ tx_finished=ISR_ITE; -+ wakeup = 1; -+ } -+ if (status & ISR_IRF){ -+ (ISR) |= ISR_IRF; -+ rx_finished=ISR_IRF; -+ wakeup = 1; -+ } -+ if (wakeup) { -+ i2c_pending = 1; -+ wake_up_interruptible(&i2c_wait); -+ } -+} -+ -+static int i2c_pxa_resource_init( void) -+{ -+ init_waitqueue_head(&i2c_wait); -+ -+ if (request_irq(IRQ_I2C, &i2c_pxa_handler, SA_INTERRUPT, "I2C_PXA", 0) < 0) { -+ irq = 0; -+ if( i2c_debug) -+ printk(KERN_INFO "I2C: Failed to register I2C irq %i\n", IRQ_I2C); -+ return -ENODEV; -+ }else{ -+ irq = IRQ_I2C; -+ enable_irq(irq); -+ } -+ return 0; -+} -+ -+static void i2c_pxa_resource_release( void) -+{ -+ if( irq > 0) -+ { -+ disable_irq(irq); -+ free_irq(irq,0); -+ irq=0; -+ } -+} -+ -+static void i2c_pxa_inc_use(struct i2c_adapter *adap) -+{ -+#ifdef MODULE -+ MOD_INC_USE_COUNT; -+#endif -+} -+ -+static void i2c_pxa_dec_use(struct i2c_adapter *adap) -+{ -+#ifdef MODULE -+ MOD_DEC_USE_COUNT; -+#endif -+} -+ -+static int i2c_pxa_client_register(struct i2c_client *client) -+{ -+ return 0; -+} -+ -+static int i2c_pxa_client_unregister(struct i2c_client *client) -+{ -+ return 0; -+} -+ -+static struct i2c_algo_pxa_data i2c_pxa_data = { -+ write_byte: i2c_pxa_write_byte, -+ read_byte: i2c_pxa_read_byte, -+ -+ start: i2c_pxa_start, -+ repeat_start: i2c_pxa_repeat_start, -+ stop: i2c_pxa_stop, -+ abort: i2c_pxa_abort, -+ -+ wait_bus_not_busy: i2c_pxa_wait_bus_not_busy, -+ wait_for_interrupt: i2c_pxa_wait_for_int, -+ transfer: i2c_pxa_transfer, -+ reset: i2c_pxa_reset, -+ -+ udelay: 10, -+ timeout: DEF_TIMEOUT, -+}; -+ -+static struct i2c_adapter i2c_pxa_ops = { -+ name: "PXA-I2C-Adapter", -+ id: I2C_ALGO_PXA, -+ algo_data: &i2c_pxa_data, -+ inc_use: i2c_pxa_inc_use, -+ dec_use: i2c_pxa_dec_use, -+ client_register: i2c_pxa_client_register, -+ client_unregister: i2c_pxa_client_unregister, -+ retries: 2, -+}; -+ -+extern int i2c_pxa_add_bus(struct i2c_adapter *); -+extern int i2c_pxa_del_bus(struct i2c_adapter *); -+ -+static int __init i2c_adap_pxa_init(void) -+{ -+ if( i2c_pxa_resource_init() == 0) { -+ -+ if (i2c_pxa_add_bus(&i2c_pxa_ops) < 0) { -+ i2c_pxa_resource_release(); -+ printk(KERN_INFO "I2C: Failed to add bus\n"); -+ return -ENODEV; -+ } -+ } else { -+ return -ENODEV; -+ } -+ -+ printk(KERN_INFO "I2C: Successfully added bus\n"); -+ -+ return 0; -+} -+ -+static void i2c_adap_pxa_exit(void) -+{ -+ i2c_pxa_del_bus( &i2c_pxa_ops); -+ i2c_pxa_resource_release(); -+ -+ printk(KERN_INFO "I2C: Successfully removed bus\n"); -+} -+ -+module_init(i2c_adap_pxa_init); -+module_exit(i2c_adap_pxa_exit); ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/i2c/i2c-algo-pxa.c 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,376 @@ -+/* -+ * i2c-algo-pxa.c -+ * -+ * I2C algorithm for the PXA I2C bus access. -+ * Byte driven algorithm similar to pcf. -+ * -+ * Copyright (C) 2002 Intrinsyc Software Inc. -+ * -+ * 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. -+ * -+ * History: -+ * Apr 2002: Initial version [CS] -+ * Jun 2002: Properly seperated algo/adap [FB] -+ * Jan 2003: added limited signal handling [Kai-Uwe Bloem] -+ * Jan 2003: allow SMBUS_QUICK as valid msg [FB] -+ * -+ */ -+#include <linux/kernel.h> -+#include <linux/module.h> -+ -+#include <linux/init.h> -+#include <linux/delay.h> -+#include <linux/errno.h> -+#include <linux/i2c.h> /* struct i2c_msg and others */ -+#include <linux/i2c-id.h> -+ -+#include "i2c-pxa.h" -+ -+/* -+ * Set this to zero to remove all the debug statements via dead code elimination. -+ */ -+//#define DEBUG 1 -+ -+#if DEBUG -+static unsigned int i2c_debug = DEBUG; -+#else -+#define i2c_debug 0 -+#endif -+ -+static int pxa_scan = 1; -+ -+static int i2c_pxa_valid_messages( struct i2c_msg msgs[], int num) -+{ -+ int i; -+ if (num < 1 || num > MAX_MESSAGES){ -+ if( i2c_debug) -+ printk(KERN_INFO "Invalid number of messages (max=%d, num=%d)\n", -+ MAX_MESSAGES, num); -+ return -EINVAL; -+ } -+ -+ /* check consistency of our messages */ -+ for (i=0;i<num;i++){ -+ if (&msgs[i]==NULL){ -+ if( i2c_debug) printk(KERN_INFO "Msgs is NULL\n"); -+ return -EINVAL; -+ } else { -+ if (msgs[i].len < 0 || msgs[i].buf == NULL){ -+ if( i2c_debug)printk(KERN_INFO "Length is less than zero"); -+ return -EINVAL; -+ } -+ } -+ } -+ -+ return 1; -+} -+ -+static int i2c_pxa_readbytes(struct i2c_adapter *i2c_adap, char *buf, -+ int count, int last) -+{ -+ -+ int i, timeout=0; -+ struct i2c_algo_pxa_data *adap = i2c_adap->algo_data; -+ -+ /* increment number of bytes to read by one -- read dummy byte */ -+ for (i = 0; i <= count; i++) { -+ if (i!=0){ -+ /* set ACK to NAK for last received byte ICR[ACKNAK] = 1 -+ only if not a repeated start */ -+ -+ if ((i == count) && last) { -+ adap->transfer( last, I2C_RECEIVE, 0); -+ }else{ -+ adap->transfer( 0, I2C_RECEIVE, 1); -+ } -+ -+ timeout = adap->wait_for_interrupt(I2C_RECEIVE); -+ -+#ifdef DEBUG -+ if (timeout==BUS_ERROR){ -+ printk(KERN_INFO "i2c_pxa_readbytes: bus error -> forcing reset\n"); -+ adap->reset(); -+ return I2C_RETRY; -+ } else -+#endif -+ if (timeout == -ERESTARTSYS) { -+ adap->abort(); -+ return timeout; -+ } else -+ if (timeout){ -+#ifdef DEBUG -+ printk(KERN_INFO "i2c_pxa_readbytes: timeout -> forcing reset\n"); -+#endif -+ adap->reset(); -+ return I2C_RETRY; -+ } -+ -+ } -+ -+ if (i) { -+ buf[i - 1] = adap->read_byte(); -+ } else { -+ adap->read_byte(); /* dummy read */ -+ } -+ } -+ return (i - 1); -+} -+ -+static int i2c_pxa_sendbytes(struct i2c_adapter *i2c_adap, const char *buf, -+ int count, int last) -+{ -+ -+ struct i2c_algo_pxa_data *adap = i2c_adap->algo_data; -+ int wrcount, timeout; -+ -+ for (wrcount=0; wrcount<count; ++wrcount) { -+ -+ adap->write_byte(buf[wrcount]); -+ if ((wrcount==(count-1)) && last) { -+ adap->transfer( last, I2C_TRANSMIT, 0); -+ }else{ -+ adap->transfer( 0, I2C_TRANSMIT, 1); -+ } -+ -+ timeout = adap->wait_for_interrupt(I2C_TRANSMIT); -+ -+#ifdef DEBUG -+ if (timeout==BUS_ERROR) { -+ printk(KERN_INFO "i2c_pxa_sendbytes: bus error -> forcing reset.\n"); -+ adap->reset(); -+ return I2C_RETRY; -+ } else -+#endif -+ if (timeout == -ERESTARTSYS) { -+ adap->abort(); -+ return timeout; -+ } else -+ if (timeout) { -+#ifdef DEBUG -+ printk(KERN_INFO "i2c_pxa_sendbytes: timeout -> forcing reset\n"); -+#endif -+ adap->reset(); -+ return I2C_RETRY; -+ } -+ } -+ return (wrcount); -+} -+ -+ -+static inline int i2c_pxa_set_ctrl_byte(struct i2c_algo_pxa_data * adap, struct i2c_msg *msg) -+{ -+ u16 flags = msg->flags; -+ u8 addr; -+ addr = (u8) ( (0x7f & msg->addr) << 1 ); -+ if (flags & I2C_M_RD ) -+ addr |= 1; -+ if (flags & I2C_M_REV_DIR_ADDR ) -+ addr ^= 1; -+ adap->write_byte(addr); -+ return 0; -+} -+ -+static int i2c_pxa_do_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msgs[], int num) -+{ -+ struct i2c_algo_pxa_data * adap; -+ struct i2c_msg *pmsg=NULL; -+ int i; -+ int ret=0, timeout; -+ -+ adap = i2c_adap->algo_data; -+ -+ timeout = adap->wait_bus_not_busy(); -+ -+ if (timeout) { -+ return I2C_RETRY; -+ } -+ -+ for (i = 0;ret >= 0 && i < num; i++) { -+ int last = i + 1 == num; -+ pmsg = &msgs[i]; -+ -+ ret = i2c_pxa_set_ctrl_byte(adap,pmsg); -+ -+ /* Send START */ -+ if (i == 0) { -+ adap->start(); -+ }else{ -+ adap->repeat_start(); -+ } -+ -+ adap->transfer(0, I2C_TRANSMIT, 0); -+ -+ /* Wait for ITE (transmit empty) */ -+ timeout = adap->wait_for_interrupt(I2C_TRANSMIT); -+ -+#ifdef DEBUG -+ /* Check for ACK (bus error) */ -+ if (timeout==BUS_ERROR){ -+ printk(KERN_INFO "i2c_pxa_do_xfer: bus error -> forcing reset\n"); -+ adap->reset(); -+ return I2C_RETRY; -+ } else -+#endif -+ if (timeout == -ERESTARTSYS) { -+ adap->abort(); -+ return timeout; -+ } else -+ if (timeout) { -+#ifdef DEBUG -+ printk(KERN_INFO "i2c_pxa_do_xfer: timeout -> forcing reset\n"); -+#endif -+ adap->reset(); -+ return I2C_RETRY; -+ } -+/* FIXME: handle arbitration... */ -+#if 0 -+ /* Check for bus arbitration loss */ -+ if (adap->arbitration_loss()){ -+ printk("Arbitration loss detected \n"); -+ adap->reset(); -+ return I2C_RETRY; -+ } -+#endif -+ -+ /* Read */ -+ if (pmsg->flags & I2C_M_RD) { -+ /* read bytes into buffer*/ -+ ret = i2c_pxa_readbytes(i2c_adap, pmsg->buf, pmsg->len, last); -+#if DEBUG > 2 -+ if (ret != pmsg->len) { -+ printk(KERN_INFO"i2c_pxa_do_xfer: read %d/%d bytes.\n", -+ ret, pmsg->len); -+ } else { -+ printk(KERN_INFO"i2c_pxa_do_xfer: read %d bytes.\n",ret); -+ } -+#endif -+ } else { /* Write */ -+ ret = i2c_pxa_sendbytes(i2c_adap, pmsg->buf, pmsg->len, last); -+#if DEBUG > 2 -+ if (ret != pmsg->len) { -+ printk(KERN_INFO"i2c_pxa_do_xfer: wrote %d/%d bytes.\n", -+ ret, pmsg->len); -+ } else { -+ printk(KERN_INFO"i2c_pxa_do_xfer: wrote %d bytes.\n",ret); -+ } -+#endif -+ } -+ } -+ -+ if (ret<0){ -+ return ret; -+ }else{ -+ return i; -+ } -+} -+ -+static int i2c_pxa_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msgs[], int num) -+{ -+ int retval = i2c_pxa_valid_messages( msgs, num); -+ if( retval > 0) -+ { -+ int i; -+ for (i=i2c_adap->retries; i>=0; i--){ -+ int retval = i2c_pxa_do_xfer(i2c_adap,msgs,num); -+ if (retval!=I2C_RETRY){ -+ return retval; -+ } -+ if( i2c_debug)printk(KERN_INFO"Retrying transmission \n"); -+ udelay(100); -+ } -+ if( i2c_debug)printk(KERN_INFO"Retried %i times\n",i2c_adap->retries); -+ return -EREMOTEIO; -+ -+ } -+ return retval; -+} -+ -+struct i2c_algorithm i2c_pxa_algorithm = { -+ name: "PXA-I2C-Algorithm", -+ id: I2C_ALGO_PXA, -+ master_xfer: i2c_pxa_xfer, -+ smbus_xfer: NULL, -+ slave_send: NULL, -+ slave_recv: NULL, -+ algo_control: NULL, -+}; -+ -+/* -+ * registering functions to load algorithms at runtime -+ */ -+int i2c_pxa_add_bus(struct i2c_adapter *i2c_adap) -+{ -+ struct i2c_algo_pxa_data *adap = i2c_adap->algo_data; -+ -+ printk(KERN_INFO"I2C: Adding %s.\n", i2c_adap->name); -+ -+ i2c_adap->algo = &i2c_pxa_algorithm; -+ -+ MOD_INC_USE_COUNT; -+ -+ /* register new adapter to i2c module... */ -+ i2c_add_adapter(i2c_adap); -+ -+ adap->reset(); -+ -+ /* scan bus */ -+ if (pxa_scan) { -+ int i; -+ printk(KERN_INFO "I2C: Scanning bus "); -+ for (i = 0x02; i < 0xff; i+=2) { -+ if( i==(I2C_PXA_SLAVE_ADDR<<1)) continue; -+ -+ if (adap->wait_bus_not_busy()) { -+ printk(KERN_INFO "I2C: scanning bus %s - TIMEOUTed.\n", -+ i2c_adap->name); -+ return -EIO; -+ } -+ adap->write_byte(i); -+ adap->start(); -+ adap->transfer(0, I2C_TRANSMIT, 0); -+ -+ if ((adap->wait_for_interrupt(I2C_TRANSMIT) != BUS_ERROR)) { -+ printk("(%02x)",i>>1); -+ adap->abort(); -+ } else { -+// printk("."); -+ adap->stop(); -+ } -+ udelay(adap->udelay); -+ } -+ printk("\n"); -+ } -+ return 0; -+} -+ -+int i2c_pxa_del_bus(struct i2c_adapter *i2c_adap) -+{ -+ int res; -+ if ((res = i2c_del_adapter(i2c_adap)) < 0) -+ return res; -+ -+ MOD_DEC_USE_COUNT; -+ -+ printk(KERN_INFO "I2C: Removing %s.\n", i2c_adap->name); -+ -+ return 0; -+} -+ -+static int __init i2c_algo_pxa_init (void) -+{ -+ printk(KERN_INFO "I2C: PXA algorithm module loaded.\n"); -+ return 0; -+} -+ -+EXPORT_SYMBOL(i2c_pxa_add_bus); -+EXPORT_SYMBOL(i2c_pxa_del_bus); -+ -+MODULE_PARM(pxa_scan, "i"); -+MODULE_PARM_DESC(pxa_scan, "Scan for active chips on the bus"); -+ -+MODULE_AUTHOR("Intrinsyc Software Inc."); -+MODULE_LICENSE("GPL"); -+ -+module_init(i2c_algo_pxa_init); ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/i2c/i2c-pxa.h 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,76 @@ -+/* -+ * i2c_pxa.h -+ * -+ * Copyright (C) 2002 Intrinsyc Software Inc. -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ */ -+#ifndef _I2C_PXA_H_ -+#define _I2C_PXA_H_ -+ -+struct i2c_algo_pxa_data -+{ -+ void (*write_byte) (u8 value); -+ u8 (*read_byte) (void); -+ void (*start) (void); -+ void (*repeat_start) (void); -+ void (*stop) (void); -+ void (*abort) (void); -+ int (*wait_bus_not_busy) (void); -+ int (*wait_for_interrupt) (int wait_type); -+ void (*transfer) (int lastbyte, int receive, int midbyte); -+ void (*reset) (void); -+ -+ int udelay; -+ int timeout; -+}; -+ -+#define DEF_TIMEOUT 3 -+#define BUS_ERROR (-EREMOTEIO) -+#define ACK_DELAY 0 /* time to delay before checking bus error */ -+#define MAX_MESSAGES 65536 /* maximum number of messages to send */ -+ -+#define I2C_SLEEP_TIMEOUT 2 /* time to sleep for on i2c transactions */ -+#define I2C_RETRY (-2000) /* an error has occurred retry transmit */ -+#define I2C_TRANSMIT 1 -+#define I2C_RECEIVE 0 -+#define I2C_PXA_SLAVE_ADDR 0x1 /* slave pxa unit address */ -+#define I2C_ICR_INIT (ICR_BEIE | ICR_IRFIE | ICR_ITEIE | ICR_GCD | ICR_SCLE) /* ICR initialization value */ -+/* ICR initialize bit values -+* -+* 15. FM 0 (100 Khz operation) -+* 14. UR 0 (No unit reset) -+* 13. SADIE 0 (Disables the unit from interrupting on slave addresses -+* matching its slave address) -+* 12. ALDIE 0 (Disables the unit from interrupt when it loses arbitration -+* in master mode) -+* 11. SSDIE 0 (Disables interrupts from a slave stop detected, in slave mode) -+* 10. BEIE 1 (Enable interrupts from detected bus errors, no ACK sent) -+* 9. IRFIE 1 (Enable interrupts from full buffer received) -+* 8. ITEIE 1 (Enables the I2C unit to interrupt when transmit buffer empty) -+* 7. GCD 1 (Disables i2c unit response to general call messages as a slave) -+* 6. IUE 0 (Disable unit until we change settings) -+* 5. SCLE 1 (Enables the i2c clock output for master mode (drives SCL) -+* 4. MA 0 (Only send stop with the ICR stop bit) -+* 3. TB 0 (We are not transmitting a byte initially) -+* 2. ACKNAK 0 (Send an ACK after the unit receives a byte) -+* 1. STOP 0 (Do not send a STOP) -+* 0. START 0 (Do not send a START) -+* -+*/ -+ -+#define I2C_ISR_INIT 0x7FF /* status register init */ -+/* I2C status register init values -+ * -+ * 10. BED 1 (Clear bus error detected) -+ * 9. SAD 1 (Clear slave address detected) -+ * 7. IRF 1 (Clear IDBR Receive Full) -+ * 6. ITE 1 (Clear IDBR Transmit Empty) -+ * 5. ALD 1 (Clear Arbitration Loss Detected) -+ * 4. SSD 1 (Clear Slave Stop Detected) -+ */ -+ -+#endif ---- linux-2.4.25/drivers/misc/Config.in~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/drivers/misc/Config.in 2004-03-31 17:15:11.000000000 +0200 -@@ -13,5 +13,6 @@ - dep_tristate 'Support for UCB1200 / UCB1300' CONFIG_MCP_UCB1200 $CONFIG_MCP - dep_tristate ' Audio / Telephony interface support' CONFIG_MCP_UCB1200_AUDIO $CONFIG_MCP_UCB1200 $CONFIG_SOUND - dep_tristate ' Touchscreen interface support' CONFIG_MCP_UCB1200_TS $CONFIG_MCP_UCB1200 -+dep_tristate ' UCB1400 Touchscreen support' CONFIG_MCP_UCB1400_TS $CONFIG_ARCH_PXA $CONFIG_SOUND - - endmenu ---- linux-2.4.25/drivers/misc/Makefile~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/drivers/misc/Makefile 2004-03-31 17:15:11.000000000 +0200 -@@ -11,13 +11,15 @@ - - O_TARGET := misc.o - --export-objs := mcp-core.o mcp-sa1100.o ucb1x00-core.o -+export-objs := mcp-core.o mcp-sa1100.o mcp-pxa.o \ -+ ucb1x00-core.o - --obj-$(CONFIG_MCP) += mcp-core.o --obj-$(CONFIG_MCP_SA1100) += mcp-sa1100.o -+obj-$(CONFIG_MCP_SA1100) += mcp-core.o mcp-sa1100.o - obj-$(CONFIG_MCP_UCB1200) += ucb1x00-core.o - obj-$(CONFIG_MCP_UCB1200_AUDIO) += ucb1x00-audio.o - obj-$(CONFIG_MCP_UCB1200_TS) += ucb1x00-ts.o -+obj-$(CONFIG_MCP_UCB1400_TS) += mcp-pxa.o ucb1x00-core.o ucb1x00-ts.o -+obj-$(CONFIG_PXA_CERF_PDA) += cerf_ucb1400gpio.o - - include $(TOPDIR)/Rules.make - ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/misc/cerf_ucb1400gpio.c 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,189 @@ -+/* -+ * cerf_ucb1400gpio.c -+ * -+ * UCB1400 GPIO control stuff for the cerf. -+ * -+ * Copyright (C) 2002 Intrinsyc Software Inc. -+ * -+ * 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. -+ * -+ * History: -+ * Mar 2002: Initial version [FB] -+ * Jun 2002: Removed ac97 dependency [FB] -+ * -+ */ -+#include <linux/config.h> -+#include <linux/module.h> -+#include <linux/kernel.h> -+#include <linux/sched.h> -+#include <linux/errno.h> -+#include <linux/string.h> -+#include <linux/ctype.h> -+#include <linux/mm.h> -+#include <linux/init.h> -+#include <linux/delay.h> -+ -+#include <asm/system.h> -+#include <asm/hardware.h> -+#include <asm/io.h> -+#include <asm/irq.h> -+#include <asm/uaccess.h> -+ -+#include "ucb1x00.h" -+ -+/* -+ * Set this to zero to remove all the debug statements via -+ * dead code elimination. -+ */ -+#define DEBUGGING 0 -+ -+#if DEBUGGING -+static unsigned int ucb_debug = DEBUGGING; -+#else -+#define ucb_debug 0 -+#endif -+ -+#define UP 1 -+#define DOWN 0 -+ -+/* -- -- */ -+ -+void cerf_ucb1400gpio_lcd_enable( void) -+{ -+ struct ucb1x00 * ucb = ucb1x00_get(); -+ if( ucb_debug > 2) printk( KERN_INFO "Enabling LCD.\n"); -+ /* Enable [not] LCD_RESET to enable the LCD display */ -+ ucb1x00_io_set_dir( ucb, 0, UCB1400_GPIO_LCD_RESET); -+ ucb1x00_io_write( ucb, UCB1400_GPIO_LCD_RESET, 0); -+ -+ /* Enable the Contrast circuit */ -+ ucb1x00_io_set_dir( ucb, 0, UCB1400_GPIO_CONT_ENA); -+ ucb1x00_io_write( ucb, UCB1400_GPIO_CONT_ENA, 0); -+} -+ -+void cerf_ucb1400gpio_lcd_disable( void) -+{ -+ struct ucb1x00 * ucb = ucb1x00_get(); -+ if( ucb_debug > 2) printk( KERN_INFO "Disabling LCD.\n"); -+ /* Disable the Contrast circuit */ -+ ucb1x00_io_set_dir( ucb, 0, UCB1400_GPIO_CONT_ENA); -+ ucb1x00_io_write( ucb, 0, UCB1400_GPIO_CONT_ENA); -+ -+ /* Disable [not] LCD_RESET to enable the LCD display */ -+ ucb1x00_io_set_dir( ucb, 0, UCB1400_GPIO_LCD_RESET); -+ ucb1x00_io_write( ucb, 0, UCB1400_GPIO_LCD_RESET); -+} -+ -+void cerf_ucb1400gpio_lcd_contrast_step( int direction) -+{ -+ struct ucb1x00 * ucb = ucb1x00_get(); -+ // Assert the chip select and the up modifier -+ ucb1x00_io_set_dir( ucb, 0, -+ (UCB1400_GPIO_CONT_CS | -+ UCB1400_GPIO_CONT_DOWN | -+ UCB1400_GPIO_CONT_INC)); -+ -+ if( direction == DOWN) -+ { -+ if( ucb_debug > 3) -+ printk(KERN_INFO "cerf_ucb1400gpio_lcd_contrast_step: " -+ "stepping up\n"); -+ //goin' up -+ ucb1x00_io_write( ucb, UCB1400_GPIO_CONT_DOWN, 0); -+ } -+ else -+ { -+ if( ucb_debug > 3) -+ printk(KERN_INFO "cerf_ucb1400gpio_lcd_contrast_step: " -+ "stepping down\n"); -+ //goin' down -+ ucb1x00_io_write( ucb, 0, UCB1400_GPIO_CONT_DOWN); -+ } -+ -+ ucb1x00_io_write( ucb, 0, UCB1400_GPIO_CONT_CS); -+ -+ // Assert the line up, down then up again -+ ucb1x00_io_write( ucb, 0, UCB1400_GPIO_CONT_INC); -+ udelay(1); -+ ucb1x00_io_write( ucb, UCB1400_GPIO_CONT_INC, 0); -+ udelay(1); -+ ucb1x00_io_write( ucb, 0, UCB1400_GPIO_CONT_INC); -+ -+ // Deassert the chip select and the up modifier -+ ucb1x00_io_write( ucb, 0, UCB1400_GPIO_CONT_DOWN); -+ ucb1x00_io_write( ucb, UCB1400_GPIO_CONT_CS, 0); -+} -+ -+/* -- -- */ -+ -+void cerf_ucb1400gpio_irda_enable( void) -+{ -+ struct ucb1x00 * ucb = ucb1x00_get(); -+ printk( KERN_INFO "Enabling IRDA.\n"); -+ /* Enable IRDA (active low) */ -+ ucb1x00_io_set_dir( ucb, 0, UCB1400_GPIO_IRDA_ENABLE); -+ ucb1x00_io_write( ucb, 0, UCB1400_GPIO_IRDA_ENABLE); -+} -+ -+void cerf_ucb1400gpio_irda_disable( void) -+{ -+ struct ucb1x00 * ucb = ucb1x00_get(); -+ printk( KERN_INFO "Disabling IRDA.\n"); -+ /* Disable IRDA (active low) */ -+ ucb1x00_io_set_dir( ucb, 0, UCB1400_GPIO_IRDA_ENABLE); -+ ucb1x00_io_write( ucb, UCB1400_GPIO_IRDA_ENABLE, 0); -+} -+ -+/* -- -- */ -+ -+void cerf_ucb1400gpio_bt_enable( void) -+{ -+ struct ucb1x00 * ucb = ucb1x00_get(); -+ printk( KERN_INFO "Enabling Bluetooth.\n"); -+ /* Enable BT (active low) */ -+ ucb1x00_io_set_dir( ucb, 0, UCB1400_GPIO_BT_ENABLE); -+ ucb1x00_io_write( ucb, 0, UCB1400_GPIO_BT_ENABLE); -+} -+ -+void cerf_ucb1400gpio_bt_disable( void) -+{ -+ struct ucb1x00 * ucb = ucb1x00_get(); -+ printk( KERN_INFO "Disabling Bluetooth.\n"); -+ /* Disable BT (active low) */ -+ ucb1x00_io_set_dir( ucb, 0, UCB1400_GPIO_BT_ENABLE); -+ ucb1x00_io_write( ucb, UCB1400_GPIO_BT_ENABLE, 0); -+} -+ -+/* -- -- */ -+ -+/* -- Enable Bluetooth and IRDA automatically via pseudo module -- */ -+#if defined(CONFIG_BLUEZ) || defined(CONFIG_IRDA) -+static int __init cerf_ucb1400gpio_module_init (void) -+{ -+#ifdef CONFIG_BLUEZ -+ cerf_ucb1400gpio_bt_enable(); -+#endif -+ -+#ifdef CONFIG_IRDA -+ cerf_ucb1400gpio_irda_enable(); -+#endif -+ return 0; -+} -+ -+static void __exit cerf_ucb1400gpio_module_exit (void) -+{ -+#ifdef CONFIG_BLUEZ -+ cerf_ucb1400gpio_bt_disable(); -+#endif -+ -+#ifdef CONFIG_IRDA -+ cerf_ucb1400gpio_irda_disable(); -+#endif -+} -+ -+module_init(cerf_ucb1400gpio_module_init); -+module_exit(cerf_ucb1400gpio_module_exit); -+#endif -+ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/misc/mcp-pxa.c 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,57 @@ -+/* -+ * linux/drivers/misc/mcp-pxa.c -+ * -+ * 2002-01-10 Jeff Sutherland <jeffs@accelent.com> -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License. -+ * -+ * NOTE: This is a quick hack to gain access to the aclink codec's -+ * touch screen facility. Its audio is handled by a separate -+ * (non-mcp) driver at the present time. -+ */ -+ -+#include <linux/module.h> -+#include <linux/types.h> -+#include <linux/ac97_codec.h> -+ -+#include "mcp.h" -+ -+ -+extern int pxa_ac97_get(struct ac97_codec **codec); -+extern void pxa_ac97_put(void); -+ -+ -+struct mcp *mcp_get(void) -+{ -+ struct ac97_codec *codec; -+ if (pxa_ac97_get(&codec) < 0) -+ return NULL; -+ return (struct mcp *)codec; -+} -+ -+void mcp_reg_write(struct mcp *mcp, unsigned int reg, unsigned int val) -+{ -+ struct ac97_codec *codec = (struct ac97_codec *)mcp; -+ codec->codec_write(codec, reg, val); -+} -+ -+unsigned int mcp_reg_read(struct mcp *mcp, unsigned int reg) -+{ -+ struct ac97_codec *codec = (struct ac97_codec *)mcp; -+ return codec->codec_read(codec, reg); -+} -+ -+void mcp_enable(struct mcp *mcp) -+{ -+ /* -+ * Should we do something here to make sure the aclink -+ * codec is alive??? -+ * A: not for now --NP -+ */ -+} -+ -+void mcp_disable(struct mcp *mcp) -+{ -+} ---- linux-2.4.25/drivers/misc/mcp.h~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/drivers/misc/mcp.h 2004-03-31 17:15:11.000000000 +0200 -@@ -10,16 +10,22 @@ - #ifndef MCP_H - #define MCP_H - -+#ifdef CONFIG_ARCH_SA1100 -+#include <asm/dma.h> -+#endif -+ - struct mcp { - struct module *owner; - spinlock_t lock; - int use_count; - unsigned int sclk_rate; - unsigned int rw_timeout; -+#ifdef CONFIG_ARCH_SA1100 - dma_device_t dma_audio_rd; - dma_device_t dma_audio_wr; - dma_device_t dma_telco_rd; - dma_device_t dma_telco_wr; -+#endif - void (*set_telecom_divisor)(struct mcp *, unsigned int); - void (*set_audio_divisor)(struct mcp *, unsigned int); - void (*reg_write)(struct mcp *, unsigned int, unsigned int); ---- linux-2.4.25/drivers/misc/ucb1x00-core.c~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/drivers/misc/ucb1x00-core.c 2004-03-31 17:15:11.000000000 +0200 -@@ -23,12 +23,18 @@ - #include <linux/errno.h> - #include <linux/interrupt.h> - #include <linux/pm.h> -+#include <linux/tqueue.h> -+#include <linux/config.h> - --#include <asm/dma.h> --#include <asm/hardware.h> - #include <asm/irq.h> - #include <asm/mach-types.h> -+ -+#ifdef CONFIG_ARCH_SA1100 -+#include <asm/arch/assabet.h> - #include <asm/arch/shannon.h> -+#endif -+ -+#include <asm/hardware.h> - - #include "ucb1x00.h" - -@@ -155,6 +161,10 @@ - * - * If called for a synchronised ADC conversion, it may sleep - * with the ADC semaphore held. -+ * -+ * See ucb1x00.h for definition of the UCB_ADC_DAT macro. It -+ * addresses a bug in the ucb1200/1300 which, of course, Philips -+ * decided to finally fix in the ucb1400 ;-) -jws - */ - unsigned int ucb1x00_adc_read(struct ucb1x00 *ucb, int adc_channel, int sync) - { -@@ -218,22 +228,75 @@ - * Since we need to read an internal register, we must re-enable - * SIBCLK to talk to the chip. We leave the clock running until - * we have finished processing all interrupts from the chip. -+ * -+ * A restriction with interrupts exists when using the ucb1400, as -+ * the codec read/write routines may sleep while waiting for codec -+ * access completion and uses semaphores for access control to the -+ * AC97 bus. A complete codec read cycle could take anywhere from -+ * 60 to 100uSec so we *definitely* don't want to spin inside the -+ * interrupt handler waiting for codec access. So, we handle the -+ * interrupt by scheduling a RT kernel thread to run in process -+ * context instead of interrupt context. - */ --static void ucb1x00_irq(int irqnr, void *devid, struct pt_regs *regs) -+ -+static int ucb1x00_thread(void *_ucb) - { -- struct ucb1x00 *ucb = devid; -+ struct task_struct *tsk = current; -+ DECLARE_WAITQUEUE(wait, tsk); -+ struct ucb1x00 *ucb = _ucb; - struct ucb1x00_irq *irq; - unsigned int isr, i; - -- ucb1x00_enable(ucb); -- isr = ucb1x00_reg_read(ucb, UCB_IE_STATUS); -- ucb1x00_reg_write(ucb, UCB_IE_CLEAR, isr); -- ucb1x00_reg_write(ucb, UCB_IE_CLEAR, 0); -+ ucb->rtask = tsk; - -- for (i = 0, irq = ucb->irq_handler; i < 16 && isr; i++, isr >>= 1, irq++) -- if (isr & 1 && irq->fn) -- irq->fn(i, irq->devid); -- ucb1x00_disable(ucb); -+ daemonize(); -+ reparent_to_init(); -+ tsk->tty = NULL; -+ tsk->policy = SCHED_FIFO; -+ tsk->rt_priority = 1; -+ strcpy(tsk->comm, "kUCB1x00d"); -+ -+ /* only want to receive SIGKILL */ -+ spin_lock_irq(&tsk->sigmask_lock); -+ siginitsetinv(&tsk->blocked, sigmask(SIGKILL)); -+ recalc_sigpending(tsk); -+ spin_unlock_irq(&tsk->sigmask_lock); -+ -+ add_wait_queue(&ucb->irq_wait, &wait); -+ set_task_state(tsk, TASK_INTERRUPTIBLE); -+ complete(&ucb->complete); -+ -+ for (;;) { -+ if (signal_pending(tsk)) -+ break; -+ enable_irq(ucb->irq); -+ schedule(); -+ -+ ucb1x00_enable(ucb); -+ isr = ucb1x00_reg_read(ucb, UCB_IE_STATUS); -+ ucb1x00_reg_write(ucb, UCB_IE_CLEAR, isr); -+ ucb1x00_reg_write(ucb, UCB_IE_CLEAR, 0); -+ -+ for (i = 0, irq = ucb->irq_handler; -+ i < 16 && isr; -+ i++, isr >>= 1, irq++) -+ if (isr & 1 && irq->fn) -+ irq->fn(i, irq->devid); -+ ucb1x00_disable(ucb); -+ -+ set_task_state(tsk, TASK_INTERRUPTIBLE); -+ } -+ -+ remove_wait_queue(&ucb->irq_wait, &wait); -+ ucb->rtask = NULL; -+ complete_and_exit(&ucb->complete, 0); -+} -+ -+static void ucb1x00_irq(int irqnr, void *devid, struct pt_regs *regs) -+{ -+ struct ucb1x00 *ucb = devid; -+ disable_irq(irqnr); -+ wake_up(&ucb->irq_wait); - } - - /** -@@ -291,6 +354,11 @@ - spin_lock_irqsave(&ucb->lock, flags); - - ucb1x00_enable(ucb); -+ -+ /* This prevents spurious interrupts on the UCB1400 */ -+ ucb1x00_reg_write(ucb, UCB_IE_CLEAR, 1 << idx); -+ ucb1x00_reg_write(ucb, UCB_IE_CLEAR, 0); -+ - if (edges & UCB_RISING) { - ucb->irq_ris_enbl |= 1 << idx; - ucb1x00_reg_write(ucb, UCB_IE_RIS, ucb->irq_ris_enbl); -@@ -456,6 +524,7 @@ - unsigned int irq_gpio_pin = 0; - int irq, default_irq = NO_IRQ; - -+#ifdef CONFIG_ARCH_SA1100 - if (machine_is_adsbitsy()) - default_irq = IRQ_GPCIN4; - -@@ -514,12 +583,40 @@ - } - #endif - -+#endif /* CONFIG_ARCH_SA1100 */ -+ -+#ifdef CONFIG_ARCH_PXA_IDP -+ if (machine_is_pxa_idp()) { -+ default_irq = TOUCH_PANEL_IRQ; -+ irq_gpio_pin = IRQ_TO_GPIO_2_80(TOUCH_PANEL_IRQ); -+ GPDR(irq_gpio_pin) &= ~GPIO_bit(irq_gpio_pin); -+ } -+#endif -+ -+#ifdef CONFIG_ARCH_TRIZEPS2 -+ if (machine_is_trizeps2()) { -+ default_irq = TOUCH_PANEL_IRQ; -+ irq_gpio_pin = IRQ_TO_GPIO_2_80(TOUCH_PANEL_IRQ); -+ GPDR(irq_gpio_pin) &= ~GPIO_bit(irq_gpio_pin); -+ } -+#endif -+ -+ -+#ifdef CONFIG_PXA_CERF_PDA -+ if (machine_is_pxa_cerf()) { -+ irq_gpio_pin = CERF_GPIO_UCB1400_IRQ; -+ } -+#endif -+ - /* - * Eventually, this will disappear. - */ - if (irq_gpio_pin) -+#ifdef CONFIG_ARCH_PXA_IDP -+ set_GPIO_IRQ_edge(irq_gpio_pin, GPIO_FALLING_EDGE); -+#else - set_GPIO_IRQ_edge(irq_gpio_pin, GPIO_RISING_EDGE); -- -+#endif - irq = ucb1x00_detect_irq(ucb); - if (irq != NO_IRQ) { - if (default_irq != NO_IRQ && irq != default_irq) -@@ -541,21 +638,7 @@ - - struct ucb1x00 *my_ucb; - --/** -- * ucb1x00_get - get the UCB1x00 structure describing a chip -- * @ucb: UCB1x00 structure describing chip -- * -- * Return the UCB1x00 structure describing a chip. -- * -- * FIXME: Currently very noddy indeed, which currently doesn't -- * matter since we only support one chip. -- */ --struct ucb1x00 *ucb1x00_get(void) --{ -- return my_ucb; --} -- --static int __init ucb1x00_init(void) -+static int ucb1x00_init_helper(void) - { - struct mcp *mcp; - unsigned int id; -@@ -568,23 +651,28 @@ - mcp_enable(mcp); - id = mcp_reg_read(mcp, UCB_ID); - -- if (id != UCB_ID_1200 && id != UCB_ID_1300) { -+ if (id != UCB_ID_1200 && id != UCB_ID_1300 && id != UCB_ID_1400) { - printk(KERN_WARNING "UCB1x00 ID not found: %04x\n", id); - goto out; - } - -+ /* distinguish between UCB1400 revs 1B and 2A */ -+ if (id == UCB_ID_1400 && mcp_reg_read(mcp, 0x00) == 0x002a) -+ id = UCB_ID_1400_BUGGY; -+ - my_ucb = kmalloc(sizeof(struct ucb1x00), GFP_KERNEL); - ret = -ENOMEM; - if (!my_ucb) - goto out; - -+#ifdef CONFIG_ARCH_SA1100 - if (machine_is_shannon()) { - /* reset the codec */ - GPDR |= SHANNON_GPIO_CODEC_RESET; - GPCR = SHANNON_GPIO_CODEC_RESET; - GPSR = SHANNON_GPIO_CODEC_RESET; -- - } -+#endif - - memset(my_ucb, 0, sizeof(struct ucb1x00)); - -@@ -599,13 +687,12 @@ - if (ret) - goto out; - -+ init_waitqueue_head(&my_ucb->irq_wait); - ret = request_irq(my_ucb->irq, ucb1x00_irq, 0, "UCB1x00", my_ucb); - if (ret) { - printk(KERN_ERR "ucb1x00: unable to grab irq%d: %d\n", - my_ucb->irq, ret); -- kfree(my_ucb); -- my_ucb = NULL; -- goto out; -+ goto irq_err; - } - - #ifdef CONFIG_PM -@@ -616,16 +703,55 @@ - my_ucb->pmdev->data = my_ucb; - #endif - -+ init_completion(&my_ucb->complete); -+ ret = kernel_thread(ucb1x00_thread, my_ucb, CLONE_FS | CLONE_FILES); -+ if (ret >= 0) { -+ wait_for_completion(&my_ucb->complete); -+ ret = 0; -+ goto out; -+ } -+ -+ free_irq(my_ucb->irq, my_ucb); -+irq_err: -+ kfree(my_ucb); -+ my_ucb = NULL; - out: - mcp_disable(mcp); - no_mcp: - return ret; - } - -+/** -+ * ucb1x00_get - get the UCB1x00 structure describing a chip -+ * @ucb: UCB1x00 structure describing chip -+ * -+ * Return the UCB1x00 structure describing a chip. -+ * -+ * FIXME: Currently very noddy indeed, which currently doesn't -+ * matter since we only support one chip. -+ */ -+struct ucb1x00 *ucb1x00_get(void) -+{ -+ if( !my_ucb) ucb1x00_init_helper(); -+ -+ return my_ucb; -+} -+ -+static int __init ucb1x00_init(void) -+{ -+ /* check if driver is already initialized */ -+ if( my_ucb) return 0; -+ -+ return ucb1x00_init_helper(); -+} -+ - static void __exit ucb1x00_exit(void) - { -+ send_sig(SIGKILL, my_ucb->rtask, 1); -+ wait_for_completion(&my_ucb->complete); - free_irq(my_ucb->irq, my_ucb); - kfree(my_ucb); -+ my_ucb = 0; - } - - module_init(ucb1x00_init); ---- linux-2.4.25/drivers/misc/ucb1x00-ts.c~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/drivers/misc/ucb1x00-ts.c 2004-03-31 17:15:11.000000000 +0200 -@@ -35,7 +35,11 @@ - /* - * Define this if you want the UCB1x00 stuff to talk to the input layer - */ -+#ifdef CONFIG_INPUT -+#define USE_INPUT -+#else - #undef USE_INPUT -+#endif - - #ifndef USE_INPUT - -@@ -73,7 +77,7 @@ - struct pm_dev *pmdev; - #endif - -- wait_queue_head_t irq_wait; -+ struct semaphore irq_wait; - struct semaphore sem; - struct completion init_exit; - struct task_struct *rtask; -@@ -259,6 +263,11 @@ - input_report_abs(&ts->idev, ABS_PRESSURE, pressure); - } - -+static inline void ucb1x00_ts_event_release(struct ucb1x00_ts *ts) -+{ -+ input_report_abs(&ts->idev, ABS_PRESSURE, 0); -+} -+ - static int ucb1x00_ts_open(struct input_dev *idev) - { - struct ucb1x00_ts *ts = (struct ucb1x00_ts *)idev; -@@ -304,10 +313,15 @@ - */ - static inline void ucb1x00_ts_mode_int(struct ucb1x00_ts *ts) - { -- ucb1x00_reg_write(ts->ucb, UCB_TS_CR, -- UCB_TS_CR_TSMX_POW | UCB_TS_CR_TSPX_POW | -- UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_GND | -- UCB_TS_CR_MODE_INT); -+ if (ts->ucb->id == UCB_ID_1400_BUGGY) -+ ucb1x00_reg_write(ts->ucb, UCB_TS_CR, -+ UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_GND | -+ UCB_TS_CR_MODE_INT); -+ else -+ ucb1x00_reg_write(ts->ucb, UCB_TS_CR, -+ UCB_TS_CR_TSMX_POW | UCB_TS_CR_TSPX_POW | -+ UCB_TS_CR_TSMY_GND | UCB_TS_CR_TSPY_GND | -+ UCB_TS_CR_MODE_INT); - } - - /* -@@ -397,13 +411,13 @@ - /* - * This is a RT kernel thread that handles the ADC accesses - * (mainly so we can use semaphores in the UCB1200 core code -- * to serialise accesses to the ADC). -+ * to serialise accesses to the ADC). The UCB1400 access -+ * functions are expected to be able to sleep as well. - */ - static int ucb1x00_thread(void *_ts) - { - struct ucb1x00_ts *ts = _ts; - struct task_struct *tsk = current; -- DECLARE_WAITQUEUE(wait, tsk); - int valid; - - ts->rtask = tsk; -@@ -429,10 +443,8 @@ - - valid = 0; - -- add_wait_queue(&ts->irq_wait, &wait); - for (;;) { - unsigned int x, y, p, val; -- signed long timeout; - - ts->restart = 0; - -@@ -457,8 +469,6 @@ - val = ucb1x00_reg_read(ts->ucb, UCB_TS_CR); - - if (val & (UCB_TS_CR_TSPX_LOW | UCB_TS_CR_TSMX_LOW)) { -- set_task_state(tsk, TASK_INTERRUPTIBLE); -- - ucb1x00_enable_irq(ts->ucb, UCB_IRQ_TSPX, UCB_FALLING); - ucb1x00_disable(ts->ucb); - -@@ -471,7 +481,15 @@ - valid = 0; - } - -- timeout = MAX_SCHEDULE_TIMEOUT; -+ /* -+ * Since ucb1x00_enable_irq() might sleep due -+ * to the way the UCB1400 regs are accessed, we -+ * can't use set_task_state() before that call, -+ * and not changing state before enabling the -+ * interrupt is racy. A semaphore solves all -+ * those issues quite nicely. -+ */ -+ down_interruptible(&ts->irq_wait); - } else { - ucb1x00_disable(ts->ucb); - -@@ -486,16 +504,13 @@ - } - - set_task_state(tsk, TASK_INTERRUPTIBLE); -- timeout = HZ / 100; -+ schedule_timeout(HZ / 100); - } - -- schedule_timeout(timeout); - if (signal_pending(tsk)) - break; - } - -- remove_wait_queue(&ts->irq_wait, &wait); -- - ts->rtask = NULL; - ucb1x00_ts_evt_clear(ts); - complete_and_exit(&ts->init_exit, 0); -@@ -509,7 +524,7 @@ - { - struct ucb1x00_ts *ts = id; - ucb1x00_disable_irq(ts->ucb, UCB_IRQ_TSPX, UCB_FALLING); -- wake_up(&ts->irq_wait); -+ up(&ts->irq_wait); - } - - static int ucb1x00_ts_startup(struct ucb1x00_ts *ts) -@@ -525,7 +540,7 @@ - if (ts->rtask) - panic("ucb1x00: rtask running?"); - -- init_waitqueue_head(&ts->irq_wait); -+ sema_init(&ts->irq_wait, 0); - ret = ucb1x00_hook_irq(ts->ucb, UCB_IRQ_TSPX, ucb1x00_ts_irq, ts); - if (ret < 0) - goto out; -@@ -585,7 +600,7 @@ - * after sleep. - */ - ts->restart = 1; -- wake_up(&ts->irq_wait); -+ up(&ts->irq_wait); - } - return 0; - } ---- linux-2.4.25/drivers/misc/ucb1x00.h~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/drivers/misc/ucb1x00.h 2004-03-31 17:15:11.000000000 +0200 -@@ -10,8 +10,47 @@ - #ifndef UCB1200_H - #define UCB1200_H - -+#ifdef CONFIG_ARCH_PXA -+ -+/* ucb1400 aclink register mappings: */ -+ -+#define UCB_IO_DATA 0x5a -+#define UCB_IO_DIR 0x5c -+#define UCB_IE_RIS 0x5e -+#define UCB_IE_FAL 0x60 -+#define UCB_IE_STATUS 0x62 -+#define UCB_IE_CLEAR 0x62 -+#define UCB_TS_CR 0x64 -+#define UCB_ADC_CR 0x66 -+#define UCB_ADC_DATA 0x68 -+#define UCB_ID 0x7e /* 7c is mfr id, 7e part id (from aclink spec) */ -+ -+#define UCB_ADC_DAT(x) ((x) & 0x3ff) -+ -+#else -+ -+/* ucb1x00 SIB register mappings: */ -+ - #define UCB_IO_DATA 0x00 - #define UCB_IO_DIR 0x01 -+#define UCB_IE_RIS 0x02 -+#define UCB_IE_FAL 0x03 -+#define UCB_IE_STATUS 0x04 -+#define UCB_IE_CLEAR 0x04 -+#define UCB_TC_A 0x05 -+#define UCB_TC_B 0x06 -+#define UCB_AC_A 0x07 -+#define UCB_AC_B 0x08 -+#define UCB_TS_CR 0x09 -+#define UCB_ADC_CR 0x0a -+#define UCB_ADC_DATA 0x0b -+#define UCB_ID 0x0c -+#define UCB_MODE 0x0d -+ -+#define UCB_ADC_DAT(x) (((x) & 0x7fe0) >> 5) -+ -+#endif -+ - - #define UCB_IO_0 (1 << 0) - #define UCB_IO_1 (1 << 1) -@@ -24,10 +63,6 @@ - #define UCB_IO_8 (1 << 8) - #define UCB_IO_9 (1 << 9) - --#define UCB_IE_RIS 0x02 --#define UCB_IE_FAL 0x03 --#define UCB_IE_STATUS 0x04 --#define UCB_IE_CLEAR 0x04 - #define UCB_IE_ADC (1 << 11) - #define UCB_IE_TSPX (1 << 12) - #define UCB_IE_TSMX (1 << 13) -@@ -36,11 +71,9 @@ - - #define UCB_IRQ_TSPX 12 - --#define UCB_TC_A 0x05 - #define UCB_TC_A_LOOP (1 << 7) /* UCB1200 */ - #define UCB_TC_A_AMPL (1 << 7) /* UCB1300 */ - --#define UCB_TC_B 0x06 - #define UCB_TC_B_VOICE_ENA (1 << 3) - #define UCB_TC_B_CLIP (1 << 4) - #define UCB_TC_B_ATT (1 << 6) -@@ -49,14 +82,11 @@ - #define UCB_TC_B_IN_ENA (1 << 14) - #define UCB_TC_B_OUT_ENA (1 << 15) - --#define UCB_AC_A 0x07 --#define UCB_AC_B 0x08 - #define UCB_AC_B_LOOP (1 << 8) - #define UCB_AC_B_MUTE (1 << 13) - #define UCB_AC_B_IN_ENA (1 << 14) - #define UCB_AC_B_OUT_ENA (1 << 15) - --#define UCB_TS_CR 0x09 - #define UCB_TS_CR_TSMX_POW (1 << 0) - #define UCB_TS_CR_TSPX_POW (1 << 1) - #define UCB_TS_CR_TSMY_POW (1 << 2) -@@ -72,7 +102,6 @@ - #define UCB_TS_CR_TSPX_LOW (1 << 12) - #define UCB_TS_CR_TSMX_LOW (1 << 13) - --#define UCB_ADC_CR 0x0a - #define UCB_ADC_SYNC_ENA (1 << 0) - #define UCB_ADC_VREFBYP_CON (1 << 1) - #define UCB_ADC_INP_TSPX (0 << 2) -@@ -87,15 +116,13 @@ - #define UCB_ADC_START (1 << 7) - #define UCB_ADC_ENA (1 << 15) - --#define UCB_ADC_DATA 0x0b - #define UCB_ADC_DAT_VAL (1 << 15) --#define UCB_ADC_DAT(x) (((x) & 0x7fe0) >> 5) - --#define UCB_ID 0x0c - #define UCB_ID_1200 0x1004 - #define UCB_ID_1300 0x1005 -+#define UCB_ID_1400 0x4304 -+#define UCB_ID_1400_BUGGY 0x4303 /* fake ID */ - --#define UCB_MODE 0x0d - #define UCB_MODE_DYN_VFLAG_ENA (1 << 12) - #define UCB_MODE_AUD_OFF_CAN (1 << 13) - -@@ -115,6 +142,9 @@ - unsigned int irq; - struct semaphore adc_sem; - spinlock_t io_lock; -+ wait_queue_head_t irq_wait; -+ struct completion complete; -+ struct task_struct *rtask; - u16 id; - u16 io_dir; - u16 io_out; ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/mmc/Config.in 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,12 @@ -+mainmenu_option next_comment -+comment 'MMC device drivers' -+tristate 'Multi Media Card support' CONFIG_MMC -+if [ "$CONFIG_MMC" = "y" -o "$CONFIG_MMC" = "m" ]; then -+ dep_tristate 'PXA250 MMC driver' CONFIG_MMC_PXA $CONFIG_MMC -+ dep_tristate 'MMC block driver' CONFIG_MMC_BLOCK $CONFIG_MMC -+ if [ "$CONFIG_MMC_BLOCK" = "y" -o "$CONFIG_MMC_BLOCK" = "m" ]; then -+ bool ' MMC partitioning support' CONFIG_MMC_PARTITIONS -+ fi -+fi -+endmenu -+ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/mmc/Makefile 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,14 @@ -+# -+# Makefile for MMC drivers -+# -+ -+export-objs := mmc_core.o -+ -+obj-$(CONFIG_MMC) += mmc_core.o # mmc_test.o -+obj-$(CONFIG_MMC_BLOCK) += mmc_block.o -+obj-$(CONFIG_MMC_PXA) += mmc_pxa.o -+# EXTRA_CFLAGS += -DCONFIG_MMC_DEBUG -DCONFIG_MMC_DEBUG_VERBOSE=2 -+ -+O_TARGET := mmcdrivers.o -+ -+include $(TOPDIR)/Rules.make ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/mmc/error.h 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,70 @@ -+/* -+ * linux/include/linux/mmc/error.h -+ * -+ * Author: Vladimir Shebordaev -+ * Copyright: MontaVista Software Inc. -+ * -+ * $Id$ -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ */ -+#ifndef __MMC_ERROR_H__ -+#define __MMC_ERROR_H__ -+ -+/* MMC protocol card error codes */ -+#define MMC_CARD_STATUS_OUT_OF_RANGE (1<<31) -+#define MMC_CARD_STATUS_ADDRESS_ERROR (1<<30) -+#define MMC_CARD_STATUS_BLOCK_LEN_ERROR (1<<29) -+#define MMC_CARD_STATUS_ERASE_SEQ_ERROR (1<<28) -+#define MMC_CARD_STATUS_ERASE_PARAM (1<<27) -+#define MMC_CARD_STATUS_WP_VIOLATION (1<<26) -+#define MMC_CARD_STATUS_CARD_IS_LOCKED (1<<25) -+#define MMC_CARD_STATUS_LOCK_UNLOCK_FAILED (1<<24) -+#define MMC_CARD_STATUS_COM_CRC_ERROR (1<<23) -+#define MMC_CARD_STATUS_ILLEGAL_COMMAND (1<<22) -+#define MMC_CARD_STATUS_CARD_ECC_FAILED (1<<21) -+#define MMC_CARD_STATUS_CC_ERROR (1<<20) -+#define MMC_CARD_STATUS_ERROR (1<<19) -+#define MMC_CARD_STATUS_UNDERRUN (1<<18) -+#define MMC_CARD_STATUS_OVERRUN (1<<17) -+#define MMC_CARD_STATUS_CID_CSD_OVERWRITE (1<<16) -+#define MMC_CARD_STATUS_ERASE_RESET (1<<13) -+ -+#define MMC_ERROR( fmt, args... ) printk( KERN_ERR "%s(): " fmt, __FUNCTION__, ##args ) -+ -+/* -+ * Error codes returned by MMC subsystem functions and -+ * error reporting function prototypes -+ */ -+enum _mmc_error { -+/* controller errors */ -+ MMC_ERROR_GENERIC = -10000, -+ MMC_ERROR_CRC_WRITE_ERROR = -10001, -+ MMC_ERROR_CRC_READ_ERROR = -10002, -+ MMC_ERROR_RES_CRC_ERROR = -10003, -+ MMC_ERROR_READ_TIME_OUT = -10004, -+ MMC_ERROR_TIME_OUT_RESPONSE = -10005, -+ MMC_ERROR_INVAL = -10006, -+/* protocol errors reported in card status (R1 response) */ -+ MMC_ERROR_OUT_OF_RANGE = -10007, -+ MMC_ERROR_ADDRESS_ERROR = -10008, -+ MMC_ERROR_BLOCK_LEN_ERROR = -10009, -+ MMC_ERROR_ERASE_SEQ_ERROR = -10010, -+ MMC_ERROR_ERASE_PARAM = -10011, -+ MMC_ERROR_WP_VIOLATION = -10012, -+ MMC_ERROR_CARD_IS_LOCKED = -10013, -+ MMC_ERROR_LOCK_UNLOCK_FAILED = -10014, -+ MMC_ERROR_COM_CRC_ERROR = -10015, -+ MMC_ERROR_ILLEGAL_COMMAND = -10016, -+ MMC_ERROR_CARD_ECC_FAILED = -10017, -+ MMC_ERROR_CC_ERROR = -10018, -+ MMC_ERROR_ERROR = -10019, -+ MMC_ERROR_UNDERRUN = -10020, -+ MMC_ERROR_OVERRUN = -10021, -+ MMC_ERROR_CID_CSD_OVERWRITE = -10022, -+ /* FIXME: incomplete */ -+ MMC_ERROR_ERASE_RESET = -10025 -+}; -+#endif /* __MMC_ERROR_H__ */ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/mmc/mmc.h 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,463 @@ -+/* -+ * linux/drivers/mmc/mmc.h -+ * -+ * Author: Vladimir Shebordaev -+ * Copyright: MontaVista Software Inc. -+ * -+ * $Id$ -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ */ -+#ifndef __MMC_P_H__ -+#define __MMC_P_H__ -+ -+#ifdef __KERNEL__ -+ -+#include <linux/types.h> -+#include <linux/slab.h> -+ -+#include <linux/spinlock.h> -+ -+#ifdef CONFIG_PROC_FS -+#include <linux/proc_fs.h> -+#endif -+ -+#include <asm/semaphore.h> -+#include <mmc/types.h> -+#include <mmc/mmc.h> -+ -+#include "types.h" -+ -+#include "error.h" -+ -+#define MMC_CONTROLLERS_MAX (4) -+#define MMC_CARDS_MAX (16) -+ -+/* test device */ -+#define MMC_TEST_MAJOR (240) -+#define MMC_TEST_TRANSFER_MODE_DEFAULT MMC_TRANSFER_MODE_BLOCK_SINGLE -+ -+/* block device */ -+#define MMC_BLOCK_MAJOR (241) /* FIXME: MMC_MAJOR */ -+#define MMC_BLOCK_DEVICES_MAX (1<<MINORBITS) /* FIXME */ -+#define MMC_BLOCK_SECT_SIZE (512) /* FIXME */ -+#define MMC_BLOCK_PARTNBITS (3) -+ -+/* Device minor number encoding: -+ * [7:6] - host -+ * [5:3] - card slot number -+ * [2:0] - partition number -+ */ -+#define MMC_MINOR_HOST_SHIFT (6) -+#define MMC_MINOR_CARD_MASK (0x07) -+ -+/* -+ * MMC controller abstraction -+ */ -+enum _mmc_controller_state { -+ MMC_CONTROLLER_ABSENT = 0, -+ MMC_CONTROLLER_FOUND, -+ MMC_CONTROLLER_INITIALIZED, -+ MMC_CONTROLLER_UNPLUGGED -+}; -+ -+enum _mmc_dir { -+ MMC_READ = 1, -+ MMC_WRITE -+}; -+ -+enum _mmc_buftype { -+ MMC_USER = 1, -+ MMC_KERNEL -+}; -+ -+struct _mmc_data_transfer_req_rec { -+ mmc_dir_t cmd; /* read or write operation requested */ -+ mmc_transfer_mode_t mode; /* requested data transfer mode */ -+ mmc_buftype_t type; /* whether supplied buffer resides in user or kernel space */ -+ char *buf; /* poiner to the caller's buffer */ -+ ssize_t cnt; /* number of bytes to transfer */ -+ loff_t addr; /* card address */ -+ ssize_t blksz; /* block size as for CSD[READ_BL_LEN] or CSD[WRITE_BL_LEN] */ -+ ssize_t nob; /* number of blocks to transfer */ -+}; -+ -+struct _mmc_controller_tmpl_rec { -+ struct module *owner; /* driver module */ -+ char name[16]; -+ -+ const ssize_t block_size_max; /* max acceptable block size */ -+ const ssize_t nob_max; /* max blocks per one data transfer */ -+ -+ int (*probe)( mmc_controller_t ); /* hardware probe */ -+ int (*init)( mmc_controller_t ); /* initialize, e.g. request irq, DMA and allocate buffers */ -+ void (*remove)( mmc_controller_t ); /* free resources */ -+#if 0 /* CONFIG_HOTPLUG */ -+ void (*attach)( void ); /|* controller hotplug callbacks *|/ -+ void (*detach)( void ); -+#endif -+#ifdef CONFIG_PM -+ int (*suspend)( mmc_controller_t ); /* power management callbacks */ -+ void (*resume)( mmc_controller_t ); -+#endif -+ -+/* MMC protocol macros, v3.4, p.120 */ -+ int (*init_card_stack)( mmc_controller_t ); -+ int (*update_acq)( mmc_controller_t ); /* update card stack management data */ -+ int (*single_card_acq)( mmc_controller_t ); -+ int (*check_card_stack)( mmc_controller_t ); -+ int (*setup_card)( mmc_controller_t, mmc_card_t ); -+ int (*stream_read)( mmc_controller_t, mmc_data_transfer_req_t ); -+ int (*read_block)( mmc_controller_t, mmc_data_transfer_req_t ); -+ int (*read_mblock)( mmc_controller_t, mmc_data_transfer_req_t ); -+ int (*stream_write)( mmc_controller_t, mmc_data_transfer_req_t ); -+ int (*write_block)( mmc_controller_t, mmc_data_transfer_req_t ); -+ int (*write_mblock)( mmc_controller_t, mmc_data_transfer_req_t ); -+/* TODO: -+ int (*sg_io)( mmc_controller_t, sg_list_t ); -+*/ -+/* TODO: -+ * 1) erase group macros -+ * int (*erase_group)( mmc_controller_t, mmc_erase_group_info_t ); -+ * 2) write protection macros; -+ * int (*set_write_prot)( mmc_controller_t, mmc_write_protection_info_t ) -+ * 3) lock/password management macros; -+ */ -+}; -+ -+#ifndef MMC_CTRLR_BLKSZ_DEFAULT -+#define MMC_CTRLR_BLKSZ_DEFAULT (512) -+#endif -+ -+#ifndef MMC_CTRLR_NOB_DEFAULT -+#define MMC_CTRLR_NOB_DEFAULT (1) -+#endif -+ -+struct _mmc_card_rec { -+/* public card interface */ -+ struct _mmc_card_info_rec info; /* see <linux/mmc/mmc.h> */ -+ -+/* private kernel specific data */ -+ mmc_state_t state; /* card's state as per last operation */ -+ mmc_card_t next; /* link to the stack */ -+ mmc_controller_t ctrlr; /* back reference to the controller */ -+ int usage; /* reference count */ -+ int slot; /* card's number for device reference */ -+/* TODO: async I/O queue */ -+#ifdef CONFIG_PROC_FS -+ proc_dir_entry_t proc; -+ char proc_name[16]; -+#endif -+ unsigned long card_data[0] /* card specific data */ -+ __attribute__((aligned (sizeof(unsigned long)))); -+}; -+ -+struct _mmc_card_stack_rec { -+ mmc_card_t first; /* first card on the stack */ -+ mmc_card_t last; /* last card on the stack */ -+ mmc_card_t selected; /* currently selected card */ -+ int ncards; -+}; -+ -+struct _mmc_controller_rec { -+ mmc_controller_state_t state; /* found, initialized, unplugged... */ -+ int usage; /* reference count */ -+ int slot; /* host's number for device reference */ -+ semaphore_t io_sem; /* I/O serialization */ -+ rwsemaphore_t update_sem; /* card stack check/update serialization */ -+ -+ mmc_controller_tmpl_t tmpl; /* methods provided by the driver */ -+ mmc_card_stack_rec_t stack; /* card stack management data */ -+ -+ u32 rca_next; /* next RCA to assign */ -+ int slot_next; /* next slot number to assign */ -+#ifdef CONFIG_PROC_FS -+ char proc_name[16]; -+ proc_dir_entry_t proc; -+#endif -+ unsigned long host_data[0] /* driver can request some extra space */ -+ __attribute__((aligned (sizeof(unsigned long)))); -+}; -+ -+/* -+ * MMC core interface -+ */ -+enum _mmc_reg_type { -+ MMC_REG_TYPE_USER = 1, -+ MMC_REG_TYPE_HOST, -+ MMC_REG_TYPE_CARD -+}; -+ -+struct _mmc_notifier_rec { -+ struct _mmc_notifier_rec *next; -+ mmc_notifier_fn_t add; -+ mmc_notifier_fn_t remove; -+}; -+ -+enum _mmc_response { -+ MMC_NORESPONSE = 1, -+ MMC_R1, -+ MMC_R2, -+ MMC_R3, -+ MMC_R4, -+ MMC_R5 -+}; -+ -+#undef EXTERN -+#ifndef __MMC_CORE_IMPLEMENTATION__ -+#define EXTERN extern -+#else -+#define EXTERN /* empty */ -+#endif -+ -+EXTERN void *mmc_register( mmc_reg_type_t, void *, size_t ); -+EXTERN void mmc_unregister( mmc_reg_type_t, void * ); -+EXTERN int mmc_update_card_stack( int ); -+ -+EXTERN mmc_card_t mmc_get_card( int, int );/* get reference to the card */ -+EXTERN void mmc_put_card( mmc_card_t ); /* release card reference */ -+ -+EXTERN int mmc_notify_add( mmc_card_t ); /* user notification */ -+EXTERN int mmc_notify_remove( mmc_card_t ); -+ -+EXTERN ssize_t mmc_read( mmc_card_t, mmc_transfer_mode_t, char *, size_t, loff_t * ); /* generic read */ -+EXTERN ssize_t mmc_write( mmc_card_t, mmc_transfer_mode_t, const char *, size_t, loff_t * ); /* generic write */ -+EXTERN int mmc_ioctl( mmc_card_t, unsigned int, unsigned long ); /* generic ioctl */ -+/* -+ * TODO: [?m.b. ioctl()] to erase, lock and write protect -+ * 1) mmc_erase -+ * 2) mmc_write_prot -+ * 3) mmc_lock -+ */ -+#undef EXTERN -+ -+static inline mmc_card_t __mmc_card_alloc( size_t extra ) -+{ -+ mmc_card_t ret = kmalloc( sizeof( mmc_card_rec_t ) + extra, GFP_KERNEL ); -+ -+ if ( ret ) { -+ memset( ret, 0, sizeof( mmc_card_rec_t ) + extra ); -+ } -+ -+ return ret; -+} -+ -+static inline void __mmc_card_free( mmc_card_t card ) -+{ -+ if ( card ) { -+ kfree( card ); -+ } -+} -+ -+static inline mmc_card_stack_t __mmc_card_stack_init( mmc_card_stack_t stack ) -+{ -+ mmc_card_stack_t ret = NULL; -+ if ( stack ) { -+ memset( stack, 0, sizeof( mmc_card_stack_rec_t ) ); -+ ret = stack; -+ } -+ return ret; -+} -+ -+static inline mmc_card_stack_t __mmc_card_stack_add( mmc_card_stack_t stack, mmc_card_t card ) -+{ -+ mmc_card_stack_t ret = NULL; -+ -+ if ( stack && card ) { -+ card->next = NULL; -+ -+ if ( stack->first ) { -+ stack->last->next = card; -+ stack->last = card; -+ } else -+ stack->first = stack->last = card; -+ -+ ++stack->ncards; -+ ret = stack; -+ } -+ return ret; -+} -+ -+static inline mmc_card_stack_t __mmc_card_stack_remove( mmc_card_stack_t stack, mmc_card_t card ) -+{ -+ mmc_card_stack_t ret = NULL; -+ register mmc_card_t prev; -+ int found = FALSE; -+ -+ if ( !stack || !card ) -+ goto error; -+ -+ if ( stack->ncards > 0 ) { -+ if ( stack->first == card ) { -+ stack->first = stack->first->next; -+ if ( stack->last == card ) -+ stack->last = stack->last->next; -+ found = TRUE; -+ } else { -+ for ( prev = stack->first; prev; prev = prev->next ) -+ if ( prev->next == card ) { -+ found = TRUE; -+ break; -+ } -+ if ( found ) { -+ if ( prev->next == stack->last ) -+ stack->last = prev->next; -+ prev->next = prev->next->next; -+ } -+ } -+ if ( found ) { -+ --stack->ncards; -+ ret = stack; -+ } -+ } -+error: -+ return ret; -+} -+ -+static inline void __mmc_card_stack_free( mmc_card_stack_t stack ) -+{ -+ mmc_card_t card, next; -+ -+ if ( stack && (stack->ncards > 0) ) { -+ card = stack->first; -+ while ( card ) { -+ next = card->next; -+ kfree( card ); -+ card = next; -+ } -+ __mmc_card_stack_init( stack ); -+ } -+} -+ -+static inline int __mmc_card_stack_foreach( mmc_card_stack_t stack, mmc_notifier_fn_t fn, int unplugged_also ) -+{ -+ int ret = 0; -+ register mmc_card_t card = NULL; -+ -+ if ( stack && fn ) { -+ for ( card = stack->first; card; card = card->next ) -+ if ( (card->state != MMC_CARD_STATE_UNPLUGGED) -+ || unplugged_also ) -+ if ( fn( card ) ) { -+ ret = -card->slot; -+ break; -+ } -+ } -+ -+ return ret; -+} -+ -+/* -+ * Debugging macros -+ */ -+#ifdef CONFIG_MMC_DEBUG -+ -+#define MMC_DEBUG_LEVEL0 (0) /* major */ -+#define MMC_DEBUG_LEVEL1 (1) -+#define MMC_DEBUG_LEVEL2 (2) /* device */ -+#define MMC_DEBUG_LEVEL3 (3) /* protocol */ -+#define MMC_DEBUG_LEVEL4 (4) /* everything */ -+ -+#define MMC_DEBUG(n, args...) \ -+if (n <= CONFIG_MMC_DEBUG_VERBOSE) { \ -+ printk(KERN_INFO __FUNCTION__ "(): " args); \ -+} -+#define __ENTER0( ) MMC_DEBUG( MMC_DEBUG_LEVEL2, "entry\n" ); -+#define __LEAVE0( ) MMC_DEBUG( MMC_DEBUG_LEVEL2, "exit\n" ); -+#define __ENTER( format, args... ) MMC_DEBUG( MMC_DEBUG_LEVEL2, "entry: " format "\n", args ); -+#define __LEAVE( format, args... ) MMC_DEBUG( MMC_DEBUG_LEVEL2, "exit: " format "\n", args ); -+ -+#define MMC_DUMP_CSD( card ) MMC_DEBUG( MMC_DEBUG_LEVEL3, \ -+"CSD register:\n" \ -+" csd_structure=%u\n" \ -+" spec_vers=%u\n" \ -+" taac=%x\n" \ -+" nsac=%x\n" \ -+" tran_speed=%x\n" \ -+" ccc=%x\n" \ -+" read_bl_len=%u\n" \ -+" read_bl_partial=%u\n" \ -+" write_blk_misalign=%u\n" \ -+" read_blk_misalign=%u\n" \ -+" dsr_imp=%u\n" \ -+" c_size=%u\n" \ -+" vdd_r_curr_min=%u\n" \ -+" vdd_r_curr_max=%u\n" \ -+" vdd_w_curr_min=%u\n" \ -+" vdd_w_curr_max=%u\n" \ -+" c_size_mult=%u\n" \ -+" erase_grp_size=%u\n" \ -+" erase_grp_mult=%u\n" \ -+" wp_grp_size=%u\n" \ -+" wp_grp_enable=%u\n" \ -+" default_ecc=%u\n" \ -+" r2w_factor=%u\n" \ -+" write_bl_len=%u\n" \ -+" write_bl_partial=%u\n" \ -+" content_prot_app=%u\n" \ -+" file_format_grp=%u\n" \ -+" copy=%u\n" \ -+" perm_write_protect=%d\n" \ -+" tmp_write_protect=%d\n" \ -+" file_format=%d\n" \ -+" ecc=%d\n", \ -+card->info.csd.csd_structure, \ -+card->info.csd.spec_vers, \ -+card->info.csd.taac, \ -+card->info.csd.nsac, \ -+card->info.csd.tran_speed, \ -+card->info.csd.ccc, \ -+card->info.csd.read_bl_len, \ -+card->info.csd.read_bl_partial, \ -+card->info.csd.write_blk_misalign, \ -+card->info.csd.read_blk_misalign, \ -+card->info.csd.dsr_imp, \ -+card->info.csd.c_size, \ -+card->info.csd.vdd_r_curr_min, \ -+card->info.csd.vdd_r_curr_max, \ -+card->info.csd.vdd_w_curr_min, \ -+card->info.csd.vdd_w_curr_max, \ -+card->info.csd.c_size_mult, \ -+card->info.csd.erase_grp_size, \ -+card->info.csd.erase_grp_mult, \ -+card->info.csd.wp_grp_size, \ -+card->info.csd.wp_grp_enable, \ -+card->info.csd.default_ecc, \ -+card->info.csd.r2w_factor, \ -+card->info.csd.write_bl_len, \ -+card->info.csd.write_bl_partial, \ -+card->info.csd.content_prot_app, \ -+card->info.csd.file_format_grp, \ -+card->info.csd.copy, \ -+card->info.csd.perm_write_protect, \ -+card->info.csd.tmp_write_protect, \ -+card->info.csd.file_format, \ -+card->info.csd.ecc ); -+ -+#else /* CONFIG_MMC_DEBUG */ -+#define MMC_DEBUG(n, args...) /* empty */ -+#define __ENTER0( ) /* empty */ -+#define __LEAVE0( ) /* empty */ -+#define __ENTER( args... ) /* empty */ -+#define __LEAVE( args... ) /* empty */ -+#define MMC_DUMP_CSD( card ) /* empty */ -+#endif /* CONFIG_MMC_DEBUG */ -+ -+/* -+ * Miscellaneous defines -+ */ -+#ifndef MMC_DUMP_R1 -+#define MMC_DUMP_R1( ctrlr ) /* empty */ -+#endif -+#ifndef MMC_DUMP_R2 -+#define MMC_DUMP_R2( ctrlr ) /* empty */ -+#endif -+#ifndef MMC_DUMP_R3 -+#define MMC_DUMP_R3( ctrlr ) /* empty */ -+#endif -+ -+#endif /* __KERNEL__ */ -+ -+#endif /* __MMC_P_H__ */ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/mmc/mmc_block.c 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,989 @@ -+/* -+ * linux/drivers/mmc/mmc_block.c -+ * driver for the block device on the MMC card -+ * -+ * Author: Vladimir Shebordaev -+ * Copyright: MontaVista Software Inc. -+ * -+ * $Id$ -+ * -+ * 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/version.h> -+#include <linux/config.h> -+#include <linux/types.h> -+#include <linux/module.h> -+#include <linux/init.h> -+#include <linux/devfs_fs_kernel.h> -+#include <linux/kernel.h> -+#include <linux/slab.h> -+#include <linux/hdreg.h> -+#include <linux/blkpg.h> -+#include <asm/uaccess.h> -+ -+#include <mmc/types.h> -+#include <mmc/mmc.h> -+ -+#include "types.h" -+#include "mmc.h" -+#include "error.h" -+ -+#define MAJOR_NR MMC_BLOCK_MAJOR -+#define MAJOR_NAME "mmc" -+#define DEVICE_NAME "mmc_block" -+#define DEVICE_REQUEST mmc_block_request -+#define DEVICE_NR(device) (device) -+#define DEVICE_ON(device) -+#define DEVICE_OFF(device) -+#define DEVICE_NO_RANDOM -+#include <linux/blk.h> -+/* for old kernels... */ -+#ifndef QUEUE_EMPTY -+#define QUEUE_EMPTY (!CURRENT) -+#endif -+#if LINUX_VERSION_CODE < 0x20300 -+#define QUEUE_PLUGGED (blk_dev[MAJOR_NR].plug_tq.sync) -+#else -+#define QUEUE_PLUGGED (blk_dev[MAJOR_NR].request_queue.plugged) -+#endif -+ -+ -+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,14) -+#define BLK_INC_USE_COUNT MOD_INC_USE_COUNT -+#define BLK_DEC_USE_COUNT MOD_DEC_USE_COUNT -+#else -+#define BLK_INC_USE_COUNT do {} while(0) -+#define BLK_DEC_USE_COUNT do {} while(0) -+#endif -+ -+#define MMC_BLOCK_RAW_DEVICE( device ) ((device>>MMC_BLOCK_PARTNBITS)<<MMC_BLOCK_PARTNBITS) -+#define MMC_BLOCK_MKDEV( host, slot ) \ -+ MKDEV( MMC_BLOCK_MAJOR, \ -+ (host<<MMC_MINOR_HOST_SHIFT) \ -+ | (slot<<MMC_BLOCK_PARTNBITS) ) -+ -+typedef struct _mmc_block_device mmc_block_device_rec_t; -+typedef struct _mmc_block_device *mmc_block_device_t; -+ -+struct _mmc_block_device { -+ mmc_card_t card; -+ int host; -+ int slot; -+ kdev_t rdev; -+ int usage; -+ semaphore_t sem; -+}; -+ -+static int mmc_block_blk_sizes[1<<MINORBITS]; -+static int mmc_block_blk_blksizes[1<<MINORBITS]; -+static int mmc_block_hardsect_sizes[1<<MINORBITS]; -+static struct hd_struct mmc_block_partitions[1<<MINORBITS]; -+ -+/* Accessed under device table lock */ -+static gendisk_rec_t mmc_block_gendisk = { -+ major: MMC_BLOCK_MAJOR, -+ major_name: MAJOR_NAME, -+ minor_shift: MMC_BLOCK_PARTNBITS, -+ max_p: (1<<MMC_BLOCK_PARTNBITS), -+ sizes: mmc_block_blk_sizes, -+ part: mmc_block_partitions -+}; -+ -+static mmc_block_device_rec_t mmc_block_device[1<<MINORBITS]; -+static rwsemaphore_t mmc_block_device_sem; -+ -+static inline void __mmc_block_rdlock_devices( void ) -+{ -+ down_read( &mmc_block_device_sem ); -+} -+ -+static inline void __mmc_block_rdunlock_devices( void ) -+{ -+ up_read( &mmc_block_device_sem ); -+} -+ -+static inline void __mmc_block_wrlock_devices( void ) -+{ -+ down_write( &mmc_block_device_sem ); -+} -+ -+static inline void __mmc_block_wrunlock_devices( void ) -+{ -+ up_write( &mmc_block_device_sem ); -+} -+ -+static inline void __mmc_block_lock_device( kdev_t rdev ) -+{ -+ __mmc_block_rdlock_devices(); -+ down( &mmc_block_device[MINOR( rdev )].sem ); -+} -+ -+static inline void __mmc_block_unlock_device( kdev_t rdev ) -+{ -+ up( &mmc_block_device[MINOR( rdev )].sem ); -+ __mmc_block_rdunlock_devices(); -+} -+ -+static inline void __mmc_block_device_init( int minor ) -+{ -+ mmc_block_device_t dev = &mmc_block_device[minor]; -+ -+ dev->usage = 0; -+ dev->card = NULL; -+ dev->host = minor >> MMC_MINOR_HOST_SHIFT; -+ dev->slot = (minor & MMC_MINOR_CARD_MASK)>>MMC_BLOCK_PARTNBITS; -+ dev->rdev = MKDEV( MMC_BLOCK_MAJOR, minor ); -+} -+ -+static inline int __mmc_block_validate_device( kdev_t rdev ) -+{ -+ int ret = -1; -+ int minor = MINOR( rdev ); -+ -+ if ( mmc_block_device[minor].card -+ && (mmc_block_gendisk.part[minor].nr_sects > 0) ) -+ ret = 0; -+ -+ return ret; -+} -+ -+static inline int __mmc_block_invalidate_card( mmc_card_t card, int invalidate ) -+{ -+ int ret = 0; -+ kdev_t start; -+ int minor; -+ -+ __ENTER( "card = 0x%p", card ); -+ -+ if ( card && card->ctrlr ) { -+ register int i; -+ -+ start = MMC_BLOCK_MKDEV( card->ctrlr->slot, card->slot ); -+ minor = MINOR( start ); -+ -+ __mmc_block_wrlock_devices(); -+ for ( i = mmc_block_gendisk.max_p - 1; i >= 0; --i ) { -+ if ( invalidate ) -+ invalidate_device( start + i, 0 ); -+ -+ __mmc_block_device_init( minor + i ); -+ -+ mmc_block_gendisk.part[minor + i].nr_sects = 0; -+ mmc_block_gendisk.part[minor + i].start_sect = 0; -+ } -+ __mmc_block_wrunlock_devices(); -+ } -+ -+ __LEAVE( "ret=%d", ret ); -+ return ret; -+} -+ -+static inline int mmc_block_invalidate_card( int host, int slot, int invalidate ) -+{ -+ int ret = 0; -+ kdev_t start; -+ int minor; -+ -+ __ENTER( "host=%d slot=%d", host, slot ); -+ -+ if ( (host >= 0) && (slot >= 0) ) { -+ register int i; -+ mmc_card_t card = NULL; -+ -+ start = MMC_BLOCK_MKDEV( host, slot ); -+ minor = MINOR( start ); -+ -+ __mmc_block_wrlock_devices(); -+ for ( i = mmc_block_gendisk.max_p - 1; i >= 0; --i ) { -+ if ( !card ) -+ card = mmc_block_device[minor + i].card; -+ -+ if ( invalidate ) -+ invalidate_device( start + i, 0 ); -+ -+ __mmc_block_device_init( minor + i ); -+ -+ mmc_block_gendisk.part[minor + i].nr_sects = 0; -+ mmc_block_gendisk.part[minor + i].start_sect = 0; -+ } -+ if ( card ) -+ mmc_put_card( card ); -+ __mmc_block_wrunlock_devices(); -+ } -+ -+ __LEAVE( "ret=%d", ret ); -+ return ret; -+} -+ -+/* Get device reference locked for writing */ -+static inline mmc_block_device_t __mmc_block_get_device( kdev_t rdev ) -+{ -+ mmc_block_device_t ret = NULL; -+ u8 minor = MINOR( rdev ); -+ int host_no, card_no; -+ -+ __ENTER( "rdev=%x:%x", MAJOR( rdev ), MINOR( rdev ) ); -+ -+ host_no = minor >> MMC_MINOR_HOST_SHIFT; -+ if ( host_no >= MMC_CONTROLLERS_MAX ) -+ goto error; -+ -+ card_no = (minor & MMC_MINOR_CARD_MASK)>>MMC_BLOCK_PARTNBITS; -+ if ( card_no >= MMC_CARDS_MAX ) -+ goto error; -+ -+ __mmc_block_lock_device( rdev ); -+ if ( __mmc_block_validate_device( rdev ) ) { -+ __mmc_block_unlock_device( rdev ); -+ goto error; -+ } -+ -+ ret = &mmc_block_device[minor]; -+ MMC_DEBUG( MMC_DEBUG_LEVEL2, "(%x:%x) card=%p, dusage=%d\n", -+ MAJOR( ret->rdev ), MINOR( ret->rdev ), -+ ret->card, ret->usage ); -+error: -+ __LEAVE( "ret=0x%p", ret ); -+ return ret; -+} -+ -+/* Unlocks the device */ -+static inline void __mmc_block_put_device( mmc_block_device_t dev ) -+{ -+ __ENTER0(); -+ -+ if ( dev ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL2, "(%x:%x) card=%p, dusage=%d\n", -+ MAJOR( dev->rdev ), MINOR( dev->rdev ), -+ dev->card, dev->usage ); -+ __mmc_block_unlock_device( dev->rdev ); -+ } -+ -+ __LEAVE0(); -+} -+ -+/* Atomically increases use count of the valid device */ -+static inline mmc_block_device_t mmc_block_get_device( kdev_t rdev ) -+{ -+ mmc_block_device_t ret = NULL; -+ -+ __ENTER0(); -+ -+ ret = __mmc_block_get_device( rdev ); -+ if ( !ret ) -+ goto error; -+ -+ ret->usage++; -+ __mmc_block_put_device( ret ); -+error: -+ __LEAVE( "ret=0x%p dusage=%d card=0x%p cusage=%d", -+ ret, ret ? ret->usage : -1, -+ ret ? ret->card : NULL, -+ ret ? (ret->card ? ret->card->usage : -1) : -1 ); -+ return ret; -+} -+ -+/* Check is there references to the card */ -+static inline int __mmc_block_check_card( kdev_t rdev ) -+{ -+ int ret = TRUE; -+ int start = MINOR( MMC_BLOCK_RAW_DEVICE( rdev ) ); -+ register int i; -+ -+ for ( i = 0; i < mmc_block_gendisk.max_p; i++ ) -+ if ( mmc_block_device[start + i].usage > 0 ) { -+ ret = FALSE; -+ break; -+ } -+ -+ return ret; -+} -+ -+/* Atomically decreases device use count */ -+static inline void mmc_block_put_device( mmc_block_device_t dev ) -+{ -+ __ENTER0(); -+ -+ if ( dev ) { -+ int invalidate = FALSE; -+ -+ __mmc_block_get_device( dev->rdev ); -+ if ( dev->usage > 0 ) -+ --dev->usage; -+ -+ if ( dev->usage ) { -+ __mmc_block_put_device( dev ); -+ goto out; -+ -+ } else { -+ int host, slot; -+ mmc_card_t card = NULL; -+ -+ invalidate = __mmc_block_check_card( dev->rdev ); -+ if ( invalidate ) { -+ host = dev->card->ctrlr->slot; -+ slot = dev->card->slot; -+ -+ if ( dev->card ) { -+ card = dev->card; -+ mmc_put_card( dev->card ); -+ dev->card = NULL; -+ } -+ } -+ __mmc_block_put_device( dev ); -+ -+ if ( invalidate ) -+ __mmc_block_invalidate_card( card, TRUE ); -+ } -+ -+ } -+out: -+ __LEAVE0(); -+} -+ -+static int mmc_block_open( struct inode *inode, struct file *file ) -+{ -+ int ret = -ENODEV; -+ mmc_block_device_t dev = NULL; -+ -+ __ENTER0(); -+ -+ if ( !inode || !file ) -+ goto error; -+ -+ BLK_INC_USE_COUNT; -+ -+ check_disk_change( inode->i_rdev ); -+ -+ dev = mmc_block_get_device( inode->i_rdev ); -+ if ( !dev ) -+ goto error; -+ -+ dev = __mmc_block_get_device( inode->i_rdev ); -+ if ( !dev ) -+ goto error; -+ -+ if ( file->f_mode & FMODE_WRITE ) { /* FIXME */ -+ if ( dev->usage > 1 ) { -+ ret = -EBUSY; -+ __mmc_block_put_device( dev ); -+ mmc_block_put_device( dev ); -+ goto error; -+ } -+ } -+ -+ __mmc_block_put_device( dev ); -+ -+ if ( file ) -+ file->private_data = dev; -+ -+ ret = 0; -+ goto out; -+error: -+ BLK_DEC_USE_COUNT; -+out: -+ __LEAVE( "ret=%d", ret ); -+ return ret; -+} -+ -+static int mmc_block_release( struct inode *inode, struct file *file ) -+{ -+ int ret = -EINVAL; -+ mmc_block_device_t dev = NULL; -+ -+ __ENTER( "inode=0x%p file=0x%p rdev=(%x:%x)", inode, file, -+ inode ? MAJOR( inode->i_rdev ) : 0xff, -+ inode ? MINOR( inode->i_rdev ) : 0xff ); -+ -+ if ( !file && !inode ) -+ goto error; -+ -+ if ( file ) -+ dev = file->private_data; -+ else -+ dev = __mmc_block_get_device( inode->i_rdev ); -+ -+ if ( !dev ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, "invalid device\n" ); -+ goto error; -+ } -+ -+ if ( file ) { -+ mmc_block_put_device( dev ); -+ file->private_data = NULL; -+ -+ } else { -+ int invalidate = FALSE; -+ -+ if ( dev->usage > 0 ) -+ --dev->usage; -+ -+ if ( dev->usage ) { -+ __mmc_block_put_device( dev ); -+ goto out; -+ -+ } else { -+ int host, slot; -+ mmc_card_t card = NULL; -+ -+ invalidate = __mmc_block_check_card( dev->rdev ); -+ if ( invalidate ) { -+ host = dev->card->ctrlr->slot; -+ slot = dev->card->slot; -+ -+ if ( dev->card ) { -+ card = dev->card; -+ mmc_put_card( dev->card ); -+ dev->card = NULL; -+ } -+ } -+ __mmc_block_put_device( dev ); -+ -+ if ( invalidate ) -+ __mmc_block_invalidate_card( card, TRUE ); -+ -+ } -+ } -+ -+out: -+ BLK_DEC_USE_COUNT; -+ ret = 0; -+error: -+ __LEAVE0(); -+ return ret; -+} -+ -+static int mmc_block_check_disk_change( kdev_t rdev ) -+{ -+ int ret = 0; -+#if 0 -+ mmc_block_device_t dev = &mmc_block_device[MINOR( rdev )]; -+ -+ __mmc_block_lock_device( rdev ); -+ if ( !dev->card ) -+ ret = 1; -+ __mmc_block_unlock_device( rdev ); -+#else -+ ret = 1; -+#endif -+ return ret; -+} -+ -+static int mmc_block_revalidate( kdev_t rdev ) -+{ -+ int ret = 1; -+ mmc_card_t card; -+ mmc_block_device_t dev; -+ kdev_t start = MMC_BLOCK_RAW_DEVICE( rdev ); -+ int minor = MINOR( start ); -+ int host, slot; -+ int i; -+ -+ __ENTER0(); -+ -+ (void)mmc_update_card_stack( MINOR( start )>>MMC_MINOR_HOST_SHIFT ); -+ -+ __mmc_block_wrlock_devices(); -+ -+ dev = &mmc_block_device[minor]; -+ host = dev->host; -+ slot = dev->slot; -+ -+ if ( dev->card ) { /* card has not been changed actually */ -+ __mmc_block_wrunlock_devices(); -+ goto out; -+ -+ } else { -+ card = mmc_get_card( host, slot ); -+ if ( !card ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL2, "failed to get card: " -+ "host=%d, slot=%d\n", host, slot ); -+ __mmc_block_wrunlock_devices(); -+ goto error; -+ } -+ dev->card = card; -+ } -+ __mmc_block_wrunlock_devices(); -+ /* FIXME */ -+ __mmc_block_rdlock_devices(); /* handle the request for sector 0 */ -+ grok_partitions( &mmc_block_gendisk, MINOR( start ), -+ mmc_block_gendisk.max_p, -+ card->info.capacity>>9 /* sectors */ -+ ); -+ __mmc_block_rdunlock_devices(); -+ /* FIXME */ -+ __mmc_block_wrlock_devices(); -+ for ( i = start + mmc_block_gendisk.max_p - 1; i >= 0; --i ) { -+ int minor = MINOR( i ); -+ -+ dev = &mmc_block_device[minor]; -+ if ( mmc_block_gendisk.part[minor].nr_sects > 0 ) -+ dev->card = card; -+ } -+ __mmc_block_wrunlock_devices(); -+out: -+error: -+ __LEAVE( "ret=%d", ret ); -+ return ret; -+} -+ -+static void mmc_block_handle_request( void ) -+{ -+ struct request *request; -+ mmc_block_device_t dev; -+ mmc_card_t card; -+ char *buf; -+ loff_t pos; -+ unsigned int result = 0; -+ -+ for (;;) { -+ int minor; -+ -+ INIT_REQUEST; -+ request = CURRENT; -+ spin_unlock_irq( &io_request_lock ); -+ -+ minor = MINOR( request->rq_dev ); -+ dev = __mmc_block_get_device( request->rq_dev ); -+ if ( !dev ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL2, "invalid device (%x:%x)\n", -+ MAJOR( request->rq_dev ), minor ); -+ -+ goto end_req; -+ } -+ -+ card = dev->card; -+ (void)__mmc_block_put_device( dev ); -+ -+ MMC_DEBUG( MMC_DEBUG_LEVEL2, -+// printk( KERN_INFO __FUNCTION__"(): " -+ "request %p: cmd %i sec %li (nr. %li)\n", -+ CURRENT, CURRENT->cmd, CURRENT->sector, -+ CURRENT->current_nr_sectors ); -+ -+ if ( request->current_nr_sectors > -+ mmc_block_gendisk.part[minor].nr_sects ) -+ goto end_req; -+ -+ // Handle the request -+ // TODO: handle clusterred requests in multiple block transfer mode -+ buf = request->buffer; -+ pos = (mmc_block_gendisk.part[minor].start_sect + -+ request->sector) * MMC_BLOCK_SECT_SIZE; -+ -+ switch ( request->cmd ) -+ { -+ int i, ret; -+ -+ case READ: -+#if 0 -+ ret = mmc_read( card, -+ (request->current_nr_sectors > 1) ? -+ MMC_TRANSFER_MODE_BLOCK_MULTIPLE : -+ MMC_TRANSFER_MODE_BLOCK_SINGLE, -+ buf, -+ request->current_nr_sectors -+ * MMC_BLOCK_SECT_SIZE, /* FIXME */ -+ &pos ); -+ if ( ret < 0 ) -+ goto end_req; -+ -+#else -+ for ( i = 0; -+ i < request->current_nr_sectors; -+ i++ ) { -+ ret = mmc_read( card, -+ MMC_TRANSFER_MODE_BLOCK_SINGLE, -+ buf, -+ MMC_BLOCK_SECT_SIZE, /* FIXME */ -+ &pos ); -+ if ( ret < 0 ) -+ goto end_req; -+ else -+ buf += ret; -+ } -+#endif -+ result = 1; -+ break; -+ -+ case WRITE: -+ // TODO: Read only device -+#if 0 -+ ret = mmc_write( card, -+ (request->current_nr_sectors > 1) ? -+ MMC_TRANSFER_MODE_BLOCK_MULTIPLE : -+ MMC_TRANSFER_MODE_BLOCK_SINGLE, -+ buf, -+ request->current_nr_sectors -+ * MMC_BLOCK_SECT_SIZE, /* FIXME */ -+ &pos ); -+ if ( ret < 0 ) -+ goto end_req; -+ -+#else -+ for ( i = 0; -+ i < request->current_nr_sectors; -+ i++ ) { -+ ret = mmc_write( card, -+ MMC_TRANSFER_MODE_BLOCK_SINGLE, -+ buf, -+ MMC_BLOCK_SECT_SIZE, /* FIXME */ -+ &pos ); -+ if ( ret < 0 ) -+ goto end_req; -+ else -+ buf += ret; -+ } -+#endif -+ result = 1; -+ break; -+ } -+ -+end_req: -+ __LEAVE( "result=%d", result ); -+ spin_lock_irq( &io_request_lock ); -+ end_request( result ); -+ } -+} -+ -+static volatile int leaving = 0; -+static DECLARE_MUTEX_LOCKED( thread_sem ); -+static DECLARE_WAIT_QUEUE_HEAD( thr_wq ); -+static pid_t thr_id = -1; -+ -+int mmc_block_thread( void *arg ) -+{ -+ struct task_struct *task = current; -+ DECLARE_WAITQUEUE(wait, task); -+ -+ __ENTER0(); -+ -+ task->session = 1; -+ task->pgrp = 1; -+ task->flags |= PF_MEMALLOC; -+ strcpy( task->comm, "mmcblockd" ); -+ task->tty = NULL; -+ spin_lock_irq( &task->sigmask_lock ); -+ sigfillset( &task->blocked ); -+ recalc_sigpending( task ); -+ spin_unlock_irq( &task->sigmask_lock ); -+ exit_mm( task ); -+ exit_files( task ); -+ exit_sighand( task ); -+ exit_fs( task ); -+ -+ while ( !leaving ) { -+ add_wait_queue( &thr_wq, &wait); -+ set_current_state( TASK_INTERRUPTIBLE ); -+ spin_lock_irq( &io_request_lock ); -+ if ( QUEUE_EMPTY || QUEUE_PLUGGED ) { -+ spin_unlock_irq( &io_request_lock ); -+ schedule(); -+ remove_wait_queue( &thr_wq, &wait ); -+ } else { -+ remove_wait_queue( &thr_wq, &wait ); -+ set_current_state( TASK_RUNNING ); -+ mmc_block_handle_request(); /* handle the request */ -+ spin_unlock_irq( &io_request_lock ); -+ } -+ } -+ -+ up( &thread_sem ); -+ -+ __LEAVE0(); -+ return 0; -+} -+ -+#if LINUX_VERSION_CODE < 0x20300 -+#define RQFUNC_ARG void -+#else -+#define RQFUNC_ARG request_queue_t *q -+#endif -+ -+static void mmc_block_request( RQFUNC_ARG ) -+{ -+ wake_up( &thr_wq ); -+} -+ -+static int mmc_block_ioctl( struct inode * inode, struct file * file, -+ unsigned int cmd, unsigned long arg ) -+{ -+ int ret = -ENODEV; -+ mmc_block_device_t dev; -+ mmc_card_t card; -+ int minor; -+ __ENTER0(); -+ -+ if ( !inode || !file ) { -+ ret = -EINVAL; -+ goto error; -+ } -+ minor = MINOR( inode->i_rdev ); -+ -+ dev = __mmc_block_get_device( inode->i_rdev ); -+ if ( !dev ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, "invalid device\n" ); -+ goto error; -+ } -+ -+ card = dev->card; -+ __mmc_block_put_device( dev ); -+ -+ switch ( cmd ) { -+ case BLKGETSIZE: /* Return device size */ -+ { -+ unsigned long value; -+ -+ __mmc_block_rdlock_devices(); -+ value = mmc_block_gendisk.part[minor].nr_sects; -+ __mmc_block_rdunlock_devices(); -+ -+ if ( put_user( value, (unsigned long *) arg) ) { -+ ret = -EFAULT; -+ goto error; -+ } -+ } -+ break; -+ -+#ifdef BLKGETSIZE64 -+ case BLKGETSIZE64: -+ { -+ unsigned long value; -+ -+ __mmc_block_rdlock_devices(); -+ value = mmc_block_gendisk.part[minor].nr_sects; -+ __mmc_block_rdunlock_devices(); -+ -+ if ( put_user( (u64)value, (u64 *) arg) ) { -+ ret = -EFAULT; -+ goto error; -+ } -+ } -+ break; -+#endif -+ -+ case HDIO_GETGEO: -+ { -+ struct hd_geometry geo; -+ -+ ret = !access_ok( VERIFY_WRITE, arg, sizeof( geo ) ); -+ if ( ret ) { -+ ret = -EFAULT; -+ goto error; -+ } -+ -+ geo.heads = 1; -+ geo.sectors = 1; -+ -+ __mmc_block_rdlock_devices(); -+ geo.cylinders = mmc_block_gendisk.part[minor].nr_sects; -+ geo.start = mmc_block_gendisk.part[minor].start_sect; -+ __mmc_block_rdunlock_devices(); -+ -+ if ( copy_to_user( (int *)arg, &geo, sizeof( geo ) ) ) { -+ ret = -EFAULT; -+ goto error; -+ } -+ } -+ break; -+ -+ case BLKRRPART: -+ if ( !capable( CAP_SYS_ADMIN ) ) { -+ ret = -EACCES; -+ goto error; -+ } -+ (void)mmc_block_revalidate( inode->i_rdev ); -+ break; -+ -+ default: -+ ret = blk_ioctl( inode->i_rdev, cmd, arg ); -+ goto out; -+ } -+ -+ ret = 0; -+error: -+out: -+ __LEAVE( "ret=%d", ret ); -+ return ret; -+} -+ -+#if LINUX_VERSION_CODE < 0x20326 -+static struct file_operations mmc_block_fops = -+{ -+ open: mmc_block_open, -+ ioctl: mmc_block_ioctl, -+ release: mmc_block_release, -+ check_media_change: mmc_block_check_disk_change, -+ revalidate: mmc_block_revalidate, -+ read: block_read, -+ write: block_write -+}; -+#else -+static struct block_device_operations mmc_block_fops = -+{ -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,14) -+ owner: THIS_MODULE, -+#endif -+ open: mmc_block_open, -+ release: mmc_block_release, -+ ioctl: mmc_block_ioctl, -+ check_media_change: mmc_block_check_disk_change, -+ revalidate: mmc_block_revalidate -+}; -+#endif -+ -+ -+static int mmc_block_notify_add( mmc_card_t card ) -+{ -+ int ret = -1; -+ mmc_block_device_t dev; -+ kdev_t start; -+ int minor; -+ -+ __ENTER0(); -+ -+ if ( !card || !card->ctrlr ) -+ goto error; -+ -+ start = MMC_BLOCK_MKDEV( card->ctrlr->slot, card->slot ); -+ dev = &mmc_block_device[MINOR( start )]; -+ -+ __mmc_block_wrlock_devices(); -+ if ( !dev->card ) { -+ dev->card = card; -+ ret = 0; -+ } -+ __mmc_block_wrunlock_devices(); -+ -+ if ( !ret ) { -+ int i; -+ -+ /* allow to read partition table */ -+ __mmc_block_rdlock_devices(); -+ grok_partitions( &mmc_block_gendisk, MINOR( start ), -+ mmc_block_gendisk.max_p, -+ card->info.capacity>>9 /* sectors */ -+ ); -+ __mmc_block_rdunlock_devices(); -+ -+ __mmc_block_wrlock_devices(); -+ for ( i = start + mmc_block_gendisk.max_p - 1; i >= 0; --i ) { -+ minor = MINOR( i ); -+ dev = &mmc_block_device[minor]; -+ if ( mmc_block_gendisk.part[minor].nr_sects > 0 ) -+ dev->card = card; -+ } -+ __mmc_block_wrunlock_devices(); -+ } -+error: -+ __LEAVE( "ret=%d", ret ); -+ return ret; -+} -+ -+ -+static int mmc_block_notify_remove( mmc_card_t card ) -+{ -+ int ret = -1; -+ -+ __ENTER( "card=0x%p", card ); -+ -+ if ( card && card->ctrlr ) -+ ret = __mmc_block_invalidate_card( card, FALSE ); -+ -+ __LEAVE( "ret=%d", ret ); -+ return ret; -+} -+ -+static mmc_notifier_rec_t mmc_block_notifier = { -+ add: mmc_block_notify_add, -+ remove: mmc_block_notify_remove -+}; -+ -+static int __init mmc_block_module_init( void ) -+{ -+ int ret = -ENODEV; -+ int i; -+ -+ __ENTER0(); -+ -+ init_rwsem( &mmc_block_device_sem ); -+ -+ if ( devfs_register_blkdev( MAJOR_NR, MAJOR_NAME, &mmc_block_fops ) ) { -+ MMC_ERROR( "Can't allocate major number %d for MMC block devices.\n", MMC_BLOCK_MAJOR ); -+ ret = -EAGAIN; -+ goto error; -+ } -+ -+ for ( i = 0; i < (1<<MINORBITS); i++ ) { -+ __mmc_block_device_init( i ); -+ init_MUTEX( &mmc_block_device[i].sem ); -+ -+ /* We fill it in at open() time. */ -+ mmc_block_blk_sizes[i] = 0; -+ mmc_block_blk_blksizes[i] = BLOCK_SIZE; -+ mmc_block_hardsect_sizes[i] = 0; -+ } -+ -+ init_waitqueue_head( &thr_wq ); -+ /* Allow the block size to default to BLOCK_SIZE. */ -+ blksize_size[MAJOR_NR] = mmc_block_blk_blksizes; -+ hardsect_size[MAJOR_NR] = mmc_block_hardsect_sizes; -+ /* Gendisk stuff */ -+ memset( mmc_block_partitions, 0, sizeof( mmc_block_partitions ) ); -+ add_gendisk( &mmc_block_gendisk ); -+ -+/* FIXME: per controller request queue, I/O and card stack update threads */ -+ blk_init_queue( BLK_DEFAULT_QUEUE( MAJOR_NR ), &mmc_block_request ); -+ thr_id = kernel_thread( mmc_block_thread, NULL, -+ CLONE_FS|CLONE_FILES|CLONE_SIGHAND ); -+ -+ if ( !mmc_register( MMC_REG_TYPE_USER, &mmc_block_notifier, 0 ) ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, "failed to register with MMC core\n" ); -+ goto error; -+ } -+ -+ ret = 0; -+ goto out; -+error: -+ if ( thr_id != -1 ) { -+/* quit the thread */ -+ leaving = 1; -+ wake_up(&thr_wq); -+ -+ down(&thread_sem); -+ } -+ blksize_size[MAJOR_NR] = NULL; -+ blk_size[MAJOR_NR] = NULL; -+ hardsect_size[MAJOR_NR] = NULL; -+out: -+ __LEAVE0(); -+ return ret; -+} -+ -+static void __exit mmc_block_module_cleanup( void ) -+{ -+/* quit the thread */ -+ leaving = 1; -+ wake_up(&thr_wq); -+ -+ down(&thread_sem); -+ -+ mmc_unregister( MMC_REG_TYPE_USER, &mmc_block_notifier ); -+ del_gendisk( &mmc_block_gendisk ); -+ devfs_unregister_blkdev( MAJOR_NR, MAJOR_NAME ); -+ -+ blk_cleanup_queue( BLK_DEFAULT_QUEUE( MAJOR_NR ) ); -+ blksize_size[MAJOR_NR] = NULL; -+ blk_size[MAJOR_NR] = NULL; -+ hardsect_size[MAJOR_NR] = NULL; -+} -+ -+EXPORT_NO_SYMBOLS; -+ -+module_init( mmc_block_module_init ); -+module_exit( mmc_block_module_cleanup ); -+ -+ -+MODULE_LICENSE("GPL"); ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/mmc/mmc_core.c 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,1124 @@ -+/* -+ * linux/drivers/mmc/mmc_core.c -+ * MultiMediaCard subsystem core implementation -+ * -+ * Author: Vladimir Shebordaev -+ * Copyright: MontaVista Software Inc. -+ * -+ * $Id$ -+ * -+ * 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/version.h> -+#include <linux/config.h> -+#include <linux/init.h> -+#include <linux/module.h> -+#include <linux/errno.h> -+ -+#include <linux/slab.h> -+#include <asm/uaccess.h> -+#include <asm/semaphore.h> -+ -+#ifdef CONFIG_PM -+#include <linux/pm.h> -+#endif -+ -+#include <mmc/types.h> -+#include <mmc/mmc.h> -+#include <mmc/ioctl.h> -+ -+#include "types.h" -+ -+#define __MMC_CORE_IMPLEMENTATION__ -+#include "mmc.h" -+ -+/* MMC controllers registered in the system */ -+static mmc_controller_t mmc_controller[MMC_CONTROLLERS_MAX]; -+static int mmc_ncontrollers = 0; -+static rwsemaphore_t mmc_controller_sem; /* controller table lock */ -+#ifdef CONFIG_PM -+static struct pm_dev *mmc_pm_dev = NULL; -+#endif -+ -+/* users' notification list */ -+static mmc_notifier_t mmc_notifier = NULL; -+static rwsemaphore_t mmc_notifier_sem; /* notifiers' list lock */ -+#ifdef CONFIG_PROC_FS -+static proc_dir_entry_t mmc_proc_dir = NULL; -+#endif -+ -+/************************************************ -+ * service function prototypes and declarations * -+ ************************************************/ -+static inline int mmc_acquire_io( mmc_controller_t ctrlr, mmc_card_t card ) -+{ -+ int ret = -EIO; -+ -+ __ENTER0(); -+ -+ if ( !card || !ctrlr ) { -+ ret = -EINVAL; -+ goto error; -+ } -+#ifdef CONFIG_HOTPLUG -+/* TODO: account for controller removal */ -+#endif -+ down( &ctrlr->io_sem ); -+#if 0 -+ down_read( &ctrlr->update_sem ); /* FIXME */ -+ if ( card->state != MMC_CARD_STATE_UNPLUGGED ) -+ ret = 0; -+ up_read( &ctrlr->update_sem ); -+ -+ if ( ret ) -+ up( &ctrlr->io_sem ); -+#else -+ ret = 0; -+#endif -+ -+error: -+ __LEAVE( "ret=%d", ret ); -+ return ret; -+} -+ -+static inline void mmc_release_io( mmc_controller_t ctrlr, mmc_card_t card ) -+{ -+ __ENTER0(); -+#ifdef CONFIG_HOTPLUG -+/* TODO: account for controller removal */ -+#endif -+ if ( !card && !ctrlr ) { /* FIXME */ -+ MMC_DEBUG( MMC_DEBUG_LEVEL2, "bad card reference\n" ); -+ goto error; -+ } -+ up( &ctrlr->io_sem ); -+error: -+ __LEAVE0(); -+} -+ -+/* TODO: there should be a separate context to be awaken -+ * by the card intertion interrupt; called under ctrlr->update_sem -+ * held down by now */ -+static int __mmc_update_card_stack( mmc_controller_t ctrlr ) -+{ -+ int ret = -1; -+ mmc_card_t card, prev; -+ -+ __ENTER0(); -+ -+ if ( !ctrlr || !ctrlr->tmpl ) -+ goto error; -+ -+ /* check unplugged cards first... */ -+ if ( (ret = ctrlr->tmpl->check_card_stack( ctrlr )) ) -+ goto error; -+ -+ /* unregister unplugged cards and free 'em immediately */ -+ if ( ctrlr->stack.ncards > 0 ) { -+ prev = ctrlr->stack.first; -+ /* process the stack tail first */ -+ if ( prev->next ) { -+ card = prev->next; -+ while ( card ) { -+ if ( card->state == MMC_CARD_STATE_UNPLUGGED ) { -+ if ( ctrlr->stack.selected == card ) -+ ctrlr->stack.selected = NULL; -+#ifdef CONFIG_PROC_FS -+ if ( card->proc ) { -+ remove_proc_entry( card->proc_name, ctrlr->proc ); -+ card->proc = NULL; -+ } -+#endif -+ ctrlr->slot_next = card->slot; /* FIXME */ -+ prev->next = card->next; -+ if ( ctrlr->stack.last == card ) -+ ctrlr->stack.last = prev; -+ /* FIXME: controller use count */ -+ mmc_notify_remove( card ); -+ --ctrlr->stack.ncards; -+ if ( (ctrlr->usage > 0) && ctrlr->tmpl->owner ) { -+ --ctrlr->usage; -+ MMC_DEBUG( MMC_DEBUG_LEVEL2, -+ "'%s' use count " -+ "decreased (%d)\n", -+ ctrlr->tmpl->name, -+ ctrlr->usage ); -+ __MOD_DEC_USE_COUNT( -+ ctrlr->tmpl->owner ); -+ } -+ __mmc_card_free( card ); -+ -+ card = prev->next; -+ } -+ } -+ } -+ /* then the head */ -+ card = ctrlr->stack.first; -+ if ( card && (card->state == MMC_CARD_STATE_UNPLUGGED) ) { -+ if ( ctrlr->stack.selected == card ) -+ ctrlr->stack.selected = NULL; -+#ifdef CONFIG_PROC_FS -+ if ( card->proc ) { -+ remove_proc_entry( card->proc_name, ctrlr->proc ); -+ card->proc = NULL; -+ } -+#endif -+ ctrlr->slot_next = card->slot; /* FIXME */ -+ mmc_notify_remove( card ); /* FIXME: should unregister here */ -+ ctrlr->stack.first = card->next; -+ if ( ctrlr->stack.last == card ) -+ ctrlr->stack.last = NULL; -+ /* FIXME: controller use count */ -+ --ctrlr->stack.ncards; -+ if ( (ctrlr->usage > 0) && ctrlr->tmpl->owner ) { -+ --ctrlr->usage; -+ MMC_DEBUG( MMC_DEBUG_LEVEL2, "'%s' use count " -+ "decreased (%d)\n", ctrlr->tmpl->name, -+ ctrlr->usage ); -+ __MOD_DEC_USE_COUNT( ctrlr->tmpl->owner ); -+ } -+ __mmc_card_free( card ); -+ } -+ } -+ MMC_DEBUG( MMC_DEBUG_LEVEL2, "after stack check: ncards=%d" -+ " first=0x%x last=0x%x\n", ctrlr->stack.ncards, -+ ctrlr->stack.first, ctrlr->stack.last ); -+ /* ...then add newly inserted ones */ -+ if ( (ret = ctrlr->tmpl->update_acq( ctrlr )) ) -+ goto error; -+ /* ret = 0; */ -+error: -+ __LEAVE( "ret=%d", ret ); -+ return ret; -+} -+ -+/* -+ * 1) check error code returned by controller; it's up to -+ * controller to detect error conditions reported by the card -+ * and to abort data transfer requests properly (e.g. send -+ * CMD12(STOP_TRANSMISSION) to abort ADDRESS_ERROR multiple -+ * block transfers) -+ * 2) arrange for card stack update when necessary -+ * (all pending i/o requests must be held pending, -+ * update procedure must start immediately after -+ * error has been detected) -+ */ -+static inline int __mmc_check_error( mmc_card_t card, int err ) -+{ -+ int ret = -EIO; -+ mmc_controller_t ctrlr; -+ -+ __ENTER0(); -+ -+ if ( !card || !card->ctrlr ) -+ goto error; -+ -+ ctrlr = card->ctrlr; -+ -+ if ( err < 0 ) { -+ switch ( err ) { -+ /* bus error occurred */ -+ case MMC_ERROR_CRC_WRITE_ERROR: -+ case MMC_ERROR_CRC_READ_ERROR: -+ case MMC_ERROR_RES_CRC_ERROR: -+ case MMC_ERROR_READ_TIME_OUT: -+ case MMC_ERROR_TIME_OUT_RESPONSE: -+ down_write( &ctrlr->update_sem ); /* FIXME */ -+ if ( !__mmc_update_card_stack( ctrlr ) ) -+ ret = -ENXIO; -+ up_write( &ctrlr->update_sem ); -+ break; -+ } -+ } else -+ ret = err; -+error: -+ __LEAVE( "ret=%d", ret ); -+ return ret; -+} -+ -+static inline void __mmc_free_controller( mmc_controller_t ctrlr ) -+{ -+ if ( ctrlr ) { -+ if ( ctrlr->stack.ncards > 0 ) -+ __mmc_card_stack_free( &ctrlr->stack ); -+ kfree( ctrlr ); -+ } -+} -+ -+#ifdef CONFIG_PROC_FS -+static int mmc_proc_read_card_info( char *page, char **start, off_t off, int count, int *eof, void *data ) -+{ -+ int ret = -EINVAL; -+ mmc_card_t card = (mmc_card_t)data; -+ char *cp = page; -+ -+ if ( !card ) -+ goto error; -+ -+ down_read( &card->ctrlr->update_sem ); -+/* TODO: proc report -+ * Type: RO, RW or IO (by CCC) -+ * MID: 0x%02x card->info.cid.mid -+ * OID: 0x%04x card->info.cid.oid -+ * PNM: %s card->info.pnm -+ * PRV: %s card->info.prv -+ * PSN: 0x%08x card->info.cid.psn -+ * MDT: %s card->info.mdt -+ * Capacity: card->info.capacity (Bytes) -+ */ -+#if 1 -+ cp += sprintf( cp, "Capacity: %dKb.\n\n", (card->info.capacity>>10) ); -+#else /* TODO */ -+ cp += sprintf( cp, "Type : %s\n", card->info.type ); -+ cp += sprintf( cp, "MID : 0x%02x\n", card->info.cid.mid ); -+ cp += sprintf( cp, "OID : 0x%04x\n", card->info.cid.oid ); -+ cp += sprintf( cp, "PNM : %s\n", card->info.pnm ); -+ cp += sprintf( cp, "PRV : %s\n", card->info.prv ); -+ cp += sprintf( cp, "PSN : 0x%08x\n", card->info.cid.psn ); -+ cp += sprintf( cp, "MDT : %s\n", card->info.mdt ); -+ cp += sprintf( cp, "Capacity: %dKB\n", -+ (card->info.capacity>>10) ); -+#endif -+ up_read( &card->ctrlr->update_sem ); -+ -+ ret = cp - page; -+error: -+ return ret; -+} -+#endif -+ -+/************************************* -+ * MMC core interface implementation * -+ *************************************/ -+int mmc_notify_add( mmc_card_t card ) -+{ -+ int ret = 0; -+ mmc_notifier_t notifier; -+ -+ __ENTER0(); -+ if ( card ) { -+ for ( notifier = mmc_notifier; notifier; -+ notifier = notifier->next ) -+ if ( notifier->add ) -+ if ( (ret = notifier->add( card )) ) -+ break; -+ } -+ __LEAVE( "ret=%d", ret ); -+ return ret; -+} -+EXPORT_SYMBOL( mmc_notify_add ); -+ -+int mmc_notify_remove( mmc_card_t card ) -+{ -+ int ret = 0; -+ mmc_notifier_t notifier; -+ -+ __ENTER0(); -+ if ( card ) { -+ for ( notifier = mmc_notifier; notifier; -+ notifier = notifier->next ) -+ if ( notifier->remove ) -+ if ( (ret = notifier->remove( card )) ) -+ break; -+ } -+ __LEAVE( "ret=%d", ret ); -+ return ret; -+} -+EXPORT_SYMBOL( mmc_notify_remove ); -+ -+int mmc_update_card_stack( int host ) -+{ -+ int ret = -EINVAL; -+ mmc_controller_t ctrlr; -+ -+ __ENTER0(); -+ -+ if ( (host < 0) || (host >= MMC_CONTROLLERS_MAX) ) -+ goto error; -+ -+ down_read( &mmc_controller_sem ); -+ if ( (ctrlr = mmc_controller[host]) ) { -+ down_write( &ctrlr->update_sem ); -+ (void)__mmc_update_card_stack( ctrlr ); -+ up_write( &ctrlr->update_sem ); -+ } -+ up_read( &mmc_controller_sem ); -+ ret = 0; -+error: -+ __LEAVE( "ret=%d", ret ); -+ return ret; -+} -+EXPORT_SYMBOL( mmc_update_card_stack ); -+ -+ssize_t mmc_read( mmc_card_t card, mmc_transfer_mode_t mode, char *buf, size_t size, loff_t *paddr ) -+{ -+ ssize_t ret = -EIO; -+ mmc_controller_t ctrlr; -+ mmc_data_transfer_req_rec_t transfer; -+ -+ if ( !paddr ) { -+ ret = -EINVAL; -+ goto error; -+ } -+ -+ if ( !card ) { -+ ret = -ENODEV; -+ goto error; -+ } -+ -+ __ENTER( "card=%p usage=%d mode=%d buf=%p size=%d addr=%x", -+ card, card->usage, mode, buf, size, *paddr ); -+ -+ ctrlr = card->ctrlr; -+ if ( (ret = mmc_acquire_io( ctrlr, card )) ) -+ goto error; -+ -+ memset( &transfer, 0, sizeof( mmc_data_transfer_req_rec_t ) ); -+ transfer.cmd = MMC_READ; -+ transfer.mode = mode; -+ transfer.type = MMC_USER; /* FIXME: buffer cache */ -+ transfer.buf = buf; -+ transfer.addr = *paddr; -+ transfer.cnt = size; -+ -+/* max block size defined by CSD[read_bl_len] */ -+ transfer.blksz = card->info.read_bl_len; -+ transfer.nob = size / transfer.blksz; -+ if ( (size - (transfer.nob * transfer.blksz)) > 0 ) -+ transfer.nob++; -+ -+/* TODO: controller may restrict maximum block size; set block size -+ * and number of blocks that their accumulated length fit to -+ * CSD[READ_BL_LEN] not to bother with block misalignment in multiple -+ * block transfers */ -+ ctrlr = card->ctrlr; -+ if ( transfer.blksz > ctrlr->tmpl->block_size_max ) { -+ ret = -EINVAL; /* FIXME */ -+ goto error; -+ } -+ -+ if ( ctrlr->stack.selected != card ) { -+ if ( (ret = ctrlr->tmpl->setup_card( ctrlr, card )) ) -+ goto err_mmc; -+ ctrlr->stack.selected = card; -+ } -+ -+ switch( mode ) { -+ case MMC_TRANSFER_MODE_STREAM: -+ if ( !ctrlr->tmpl->stream_read ) { -+ ret = -ENXIO; -+ goto err_down; -+ } -+/* TODO: The max clock frequency for stream read operation is given by -+ the following formula: -+ max speed = min ( TRAN_SPEED, 8*2^(READ_BL_LEN) - NSAC/TAAC ) -+ -+ If the card is not able to sustain data transfer it will set the -+ UNDERRUN error bit in the status register, abort the transmission -+ and wait in the Data state for a stop command -+ */ -+ ret = ctrlr->tmpl->stream_read( ctrlr, &transfer ); -+ break; -+ -+ case MMC_TRANSFER_MODE_BLOCK_SINGLE: -+ if ( !ctrlr->tmpl->read_block ) { -+ ret = -ENXIO; -+ goto err_down; -+ } -+/* TODO: buffer size and data alignment (v3.4, p.29): -+ if CSD[READ_BL_PARTIAL] is set, smaller blocks whose starting -+ and ending address are entirely contained within one physical -+ block (as defined by CSD[READ_BL_LEN]) may also be transmitted -+ */ -+ transfer.type = MMC_KERNEL; /* FIXME */ -+ ret = ctrlr->tmpl->read_block( ctrlr, &transfer ); -+ break; -+ -+ case MMC_TRANSFER_MODE_BLOCK_MULTIPLE: -+ if ( !ctrlr->tmpl->read_mblock ) { -+ ret = -ENXIO; -+ goto err_down; -+ } -+ -+ if ( transfer.nob > ctrlr->tmpl->nob_max ) { -+ ret = -EINVAL; -+ goto error; -+ } -+/* TODO: buffer size and data alignment (v3.4, p.29): -+ if the host uses patrial blocks whose accumulated length is -+ not block aligned and block misalignment is not allowed, the -+ card should detect a block misalignment error condition at the -+ beginning of the first misaligned block -+ */ -+ transfer.type = MMC_KERNEL; /* FIXME */ -+ ret = ctrlr->tmpl->read_mblock( card->ctrlr, &transfer ); -+ break; -+ -+ default: -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, "request for unknown transfer type\n" ); -+ ret = -EINVAL; -+ } -+err_mmc: -+ ret = __mmc_check_error( card, ret ); -+ if ( ret >= 0 ) { -+ ret = size - transfer.cnt; -+ *paddr += ret; -+ } -+err_down: -+ mmc_release_io( ctrlr, card ); -+error: -+ __LEAVE("ret=%d", ret); -+ return ret; -+} -+EXPORT_SYMBOL( mmc_read ); -+ -+ssize_t mmc_write( mmc_card_t card, mmc_transfer_mode_t mode, const char *buf, size_t size, loff_t *paddr ) -+{ -+ ssize_t ret = -ESPIPE; -+ mmc_controller_t ctrlr; -+ mmc_data_transfer_req_rec_t transfer; -+ -+ if ( !paddr ) { -+ ret = -EINVAL; -+ goto error; -+ } -+ -+ if ( !card ) { -+ ret = -ENODEV; -+ goto error; -+ } -+ -+ __ENTER( "card=%p usage=%d mode=%d buf=%p size=%d addr=%llx", -+ card, card->usage, mode, buf, size, *paddr ); -+ -+ ctrlr = card->ctrlr; -+ if ( (ret = mmc_acquire_io( ctrlr, card )) ) -+ goto error; -+ -+ memset( &transfer, 0, sizeof( mmc_data_transfer_req_rec_t ) ); -+ transfer.cmd = MMC_WRITE; -+ transfer.mode = mode; -+ transfer.type = MMC_USER; /* FIXME: buffer cache */ -+ transfer.buf = (char *)buf; -+ transfer.addr = *paddr; -+ transfer.cnt = size; -+ -+/* max block size defined by CSD[write_bl_len] */ -+ transfer.blksz = card->info.write_bl_len; -+ transfer.nob = size / transfer.blksz; -+ if ( (size - (transfer.nob * transfer.blksz)) > 0 ) -+ transfer.nob++; -+ -+/* TODO: controller may restrict maximum block size; set block size -+ * and number of blocks that their accumulated length fit to -+ * CSD[WRITE_BL_LEN] not to bother with block misalignment in multiple -+ * block transfers */ -+ ctrlr = card->ctrlr; -+ if ( transfer.blksz > ctrlr->tmpl->block_size_max ) { -+ ret = -EINVAL; /* FIXME */ -+ goto error; -+ } -+ -+ if ( ctrlr->stack.selected != card ) { -+ if ( (ret = ctrlr->tmpl->setup_card( ctrlr, card )) ) -+ goto err_mmc; -+ ctrlr->stack.selected = card; -+ } -+ -+ transfer.cmd = MMC_WRITE; -+ transfer.mode = mode; -+ transfer.type = MMC_USER; -+ switch( mode ) { -+ case MMC_TRANSFER_MODE_STREAM: -+ if ( !ctrlr->tmpl->stream_write ) { -+ ret = -ENXIO; -+ goto err_down; -+ } -+ ret = ctrlr->tmpl->stream_write( ctrlr, &transfer ); -+ break; -+ -+ case MMC_TRANSFER_MODE_BLOCK_SINGLE: -+ if ( !ctrlr->tmpl->write_block ) { -+ ret = -ENXIO; -+ goto err_down; -+ } -+ transfer.type = MMC_KERNEL; /* FIXME */ -+ ret = ctrlr->tmpl->write_block( ctrlr, &transfer ); -+ break; -+ -+ case MMC_TRANSFER_MODE_BLOCK_MULTIPLE: -+ if ( !ctrlr->tmpl->write_mblock ) { -+ ret = -ENXIO; -+ goto err_down; -+ } -+ transfer.type = MMC_KERNEL; /* FIXME */ -+ ret = ctrlr->tmpl->write_mblock( card->ctrlr, &transfer ); -+ break; -+ -+ default: -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, "request for unknown transfer type\n" ); -+ } -+ -+err_mmc: -+ ret = __mmc_check_error( card, ret ); /* FIXME */ -+ if ( ret >= 0 ) { -+ ret = size - transfer.cnt; -+ *paddr += ret; -+ } -+err_down: -+ mmc_release_io( ctrlr, card ); -+error: -+ __LEAVE( "ret=%d", ret ); -+ return ret; -+} -+EXPORT_SYMBOL( mmc_write ); -+ -+int mmc_ioctl( mmc_card_t card, unsigned int cmd, unsigned long arg ) -+{ -+ int ret = -EINVAL; -+ mmc_controller_t ctrlr; -+ -+ if ( !card ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, "bad card reference\n" ) -+ goto error; -+ } -+ -+ ctrlr = card->ctrlr; -+ if ( mmc_acquire_io( ctrlr, card ) ) { -+ ret = -ENXIO; -+ goto error; -+ } -+ -+ switch ( cmd ) { -+ case IOCMMCGCARDESC: -+ if ( copy_to_user( (void *)arg, &card->info, sizeof( mmc_card_info_rec_t ) ) ) -+ ret = -EFAULT; -+ break; -+/* -+ * 1. TODO: erase region -+ * 2. TODO: set/unset write protection, lock/password -+ */ -+ default: -+ ret = -ENOIOCTLCMD; -+ } -+ -+ mmc_release_io( ctrlr, card ); -+error: -+ return ret; -+} -+EXPORT_SYMBOL( mmc_ioctl ); -+ -+/* -+ * registry stuff -+ */ -+mmc_card_t mmc_get_card( int host, int slot ) -+{ -+ mmc_card_t ret = NULL; -+ mmc_controller_t ctrlr = NULL; -+ int found; -+ -+ __ENTER( "host=%d, card=%d", host, slot ); -+ -+ if ( ((host < 0) || (host >= MMC_CONTROLLERS_MAX)) -+ && ((slot < 0) || (slot >= MMC_CARDS_MAX)) ) -+ goto error; -+ -+ down_read( &mmc_controller_sem ); -+ -+ if ( (ctrlr = mmc_controller[host]) ) { -+ down_write( &ctrlr->update_sem ); -+ if ( ctrlr->stack.ncards > 0 ) { -+ ret = ctrlr->stack.first; -+ found = FALSE; -+ while ( ret ) { -+ if ( (ret->slot == slot) && (ret->state != -+ MMC_CARD_STATE_UNPLUGGED) ) { -+ found = TRUE; -+ break; -+ } -+ ret = ret->next; -+ } -+ -+ if ( found ) { -+ if ( ctrlr->tmpl->owner ) { -+ ++ctrlr->usage; -+ MMC_DEBUG( MMC_DEBUG_LEVEL2, -+ "'%s' use count increased (%d)\n", -+ ctrlr->tmpl->name, ctrlr->usage ); -+ __MOD_INC_USE_COUNT( ctrlr->tmpl->owner ); -+ } -+ ++ret->usage; -+ } else -+ ret = NULL; -+ } -+ up_write( &ctrlr->update_sem ); -+ } -+ up_read( &mmc_controller_sem ); -+error: -+ __LEAVE("ret=0x%p usage=%d", ret, ret ? ret->usage : -1 ); -+ return ret; -+} -+EXPORT_SYMBOL( mmc_get_card ); -+ -+void mmc_put_card( mmc_card_t card ) -+{ -+ mmc_card_t tmp = NULL; -+ mmc_controller_t ctrlr; -+ int found; -+ -+ __ENTER( "card=0x%p", card ); -+ -+ if ( !card ) -+ goto error; -+ -+ ctrlr = card->ctrlr; -+ -+ down_read( &mmc_controller_sem ); -+ if ( !ctrlr || (ctrlr != mmc_controller[ctrlr->slot]) ) { -+ MMC_ERROR( "bad controller reference: ctrlr=0x%p\n", ctrlr ); -+ goto err_down; -+ } -+ -+ down_write( &ctrlr->update_sem ); -+ if ( ctrlr->stack.ncards > 0 ) { -+ tmp = ctrlr->stack.first; -+ found = FALSE; -+ while ( tmp ) { -+ if ( tmp == card ) { -+ found = TRUE; -+ break; -+ } -+ tmp = tmp->next; -+ } -+ -+ if ( found ) { -+ if ( tmp->usage > 0 ) { -+ --tmp->usage; -+ MMC_DEBUG( MMC_DEBUG_LEVEL2, "usage=%d" -+ "owner=0x%p\n", tmp->usage, -+ ctrlr->tmpl->owner ); -+ if ( !tmp->usage && (ctrlr->usage > 0) -+ && ctrlr->tmpl->owner ) { -+ --ctrlr->usage; -+ MMC_DEBUG( MMC_DEBUG_LEVEL2, -+ "'%s' use count " -+ "decreased (%d)\n", -+ ctrlr->tmpl->name, -+ ctrlr->usage ); -+ __MOD_DEC_USE_COUNT( -+ ctrlr->tmpl->owner ); -+ } -+ } -+ } else -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, "bad card reference\n" ); -+ -+ } -+ up_write( &ctrlr->update_sem ); -+err_down: -+ up_read( &mmc_controller_sem ); -+error: -+ __LEAVE( "found=%d", found ); -+ return; -+} -+EXPORT_SYMBOL( mmc_put_card ); -+ -+static inline void *mmc_register_user( mmc_notifier_t notifier ) -+{ -+ mmc_notifier_t ret = NULL, last = mmc_notifier; -+ -+ MOD_INC_USE_COUNT; -+ if ( notifier ) { -+ down_write( &mmc_notifier_sem ); -+ -+ notifier->next = NULL; -+ if ( !last ) { -+ mmc_notifier = notifier; -+ ret = notifier; -+ } else { -+ while ( last->next ) { -+ if ( last == notifier ) { -+ MOD_DEC_USE_COUNT; -+ break; -+ } -+ last = last->next; -+ } -+ if ( last != notifier ) { -+ last->next = notifier; -+ ret = notifier; -+ } -+ } -+ up_write( &mmc_notifier_sem ); -+ } -+/* notify new user about the cards present in the system */ -+ if ( ret && ret->add ) { -+ int i; -+ -+ down_read( &mmc_controller_sem ); -+ for ( i = 0; i < mmc_ncontrollers; i++ ) { -+ mmc_controller_t ctrlr = mmc_controller[i]; -+ -+ down_read( &ctrlr->update_sem ); /* FIXME */ -+ __mmc_card_stack_foreach( &ctrlr->stack, -+ ret->add, FALSE ); -+ up_read( &ctrlr->update_sem ); /* FIXME */ -+ } -+ up_read( &mmc_controller_sem ); -+ } -+/* error: */ -+ __LEAVE( "mmc_notifier=0x%p, mmc_notifier->next=0x%p", -+ mmc_notifier, mmc_notifier ? mmc_notifier->next : NULL ); -+ return ret; -+} -+ -+static inline mmc_controller_t mmc_register_controller( mmc_controller_tmpl_t tmpl, size_t extra ) -+{ -+ mmc_controller_t ret = NULL; -+ int found; -+ int i; -+ -+ MOD_INC_USE_COUNT; -+ -+ down_write( &mmc_controller_sem ); -+ -+ if ( mmc_ncontrollers >= MMC_CONTROLLERS_MAX ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, "there're too many controllers\n" ); -+ goto error; -+ } -+ -+ found = FALSE; -+ for ( i = 0; i < MMC_CONTROLLERS_MAX; i++ ) -+ if ( !mmc_controller[i] ) { -+ found = TRUE; -+ break; -+ } -+ -+ if ( !found ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, "there're no empty slots\n" ); -+ goto error; -+ } -+ -+ if ( !tmpl->init ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, "host template lacks 'init()'\n" ); -+ goto error; -+ } -+ -+ if ( !tmpl->probe ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, "host template lacks 'probe()'\n" ); -+ goto error; -+ } -+ -+ if ( !tmpl->init_card_stack ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, "host template lacks 'init_card_stack()'\n" ); -+ goto error; -+ } -+ -+ if ( !tmpl->update_acq ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, "host template lacks 'update_acq()'\n" ); -+ goto error; -+ } -+ -+ if ( !tmpl->check_card_stack ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, "host template lacks 'check_card_stack()'\n" ); -+ goto error; -+ } -+ -+ if ( !tmpl->setup_card ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, "host template lacks 'setup_card()'\n" ); -+ goto error; -+ } -+ -+ ret = kmalloc( sizeof( mmc_controller_rec_t ) + extra, GFP_ATOMIC ); /* FIXME: ISA + GFP_DMA */ -+ if ( !ret ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, "out of memory\n" ); -+ goto error; -+ } -+ -+ memset( ret, 0, sizeof( mmc_controller_rec_t ) + extra ); -+ -+ if ( (tmpl->probe( ret ) != 1) ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, "controller probe failed\n" ); -+ goto err_free; -+ } -+ -+ if ( tmpl->init( ret ) ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, "controller initialization failure\n" ); -+ goto err_free; -+ } -+ -+ ret->state = MMC_CONTROLLER_FOUND; -+ ret->slot = i; -+ ret->tmpl = tmpl; -+ init_MUTEX( &ret->io_sem ); -+ init_rwsem( &ret->update_sem ); -+#ifdef CONFIG_PROC_FS -+ if ( mmc_proc_dir ) { -+ snprintf( ret->proc_name, sizeof( ret->proc_name ), -+ "host%d", ret->slot ); -+ ret->proc = proc_mkdir( ret->proc_name, mmc_proc_dir ); -+ } -+#endif -+ -+/* initialize card stack */ -+ if ( ret->tmpl->init_card_stack( ret ) ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, "card stack initialization failure\n" ); -+ if ( ret->tmpl->remove ) -+ ret->tmpl->remove( ret ); /* FIXME */ -+ goto err_free; -+ } -+ -+ mmc_controller[ret->slot] = ret; -+ ++mmc_ncontrollers; -+ -+/* notify users */ -+ if ( ret->stack.ncards > 0 ) { -+ down_read( &mmc_notifier_sem ); -+ if ( (i = __mmc_card_stack_foreach( &ret->stack, mmc_notify_add, FALSE ) ) < 0 ) -+ MMC_ERROR( "device add notification failed at slot %d\n", -i ); -+ up_read( &mmc_notifier_sem ); -+ } -+ goto out; -+ -+err_free: -+#ifdef CONFIG_PROC_FS -+ if ( ret->proc ) -+ remove_proc_entry( ret->proc_name, mmc_proc_dir ); -+#endif -+ kfree( ret ); -+error: -+ ret = NULL; -+ MOD_DEC_USE_COUNT; -+out: -+ up_write( &mmc_controller_sem ); -+ return ret; -+} -+ -+static inline mmc_card_t mmc_register_card( mmc_card_t card ) -+{ -+ mmc_card_t ret = NULL; -+ mmc_controller_t ctrlr; -+ -+ if ( !card || !card->ctrlr ) -+ goto error; -+ -+ ctrlr = card->ctrlr; -+#ifdef CONFIG_PROC_FS -+ if ( ctrlr->proc ) { -+ snprintf( card->proc_name, sizeof( card->proc_name ), -+ "card%d", card->slot ); -+ card->proc = create_proc_read_entry( card->proc_name, -+ 0444, ctrlr->proc, -+ mmc_proc_read_card_info, card ); -+ } -+#endif -+ mmc_notify_add( card ); -+error: -+ return ret; -+} -+ -+void *mmc_register( mmc_reg_type_t reg_type, void *tmpl, size_t extra ) -+{ -+ void *ret = NULL; -+ -+ switch ( reg_type ) { -+ case MMC_REG_TYPE_CARD: -+ ret = mmc_register_card( (mmc_card_t)tmpl ); -+ break; -+ -+ case MMC_REG_TYPE_USER: -+ ret = mmc_register_user( (mmc_notifier_t)tmpl ); -+ break; -+ -+ case MMC_REG_TYPE_HOST: -+ ret = mmc_register_controller( (mmc_controller_tmpl_t)tmpl, extra ); -+ break; -+ -+ default: -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, "register request for unknown type\n" ); -+ } -+ -+ return ret; -+} -+EXPORT_SYMBOL( mmc_register ); -+ -+static inline void mmc_unregister_user( mmc_notifier_t notifier ) -+{ -+ mmc_notifier_t prev = mmc_notifier; -+ int found = FALSE; -+ -+ if ( notifier ) { -+ down_write( &mmc_notifier_sem ); -+ -+ if ( mmc_notifier == notifier) { -+ mmc_notifier = prev->next; -+ found = TRUE; -+ -+ } else if ( mmc_notifier ) { -+ while( prev ) { -+ if ( prev->next == notifier ) { -+ found = TRUE; -+ prev->next = prev->next->next; -+ break; -+ } -+ prev = prev->next; -+ } -+ } -+ -+ if ( found ) { -+ if ( notifier->remove ) { -+ int i; -+ -+ down_read( &mmc_controller_sem ); -+ for ( i = 0; i < mmc_ncontrollers; i++ ) { -+ mmc_controller_t ctrlr = -+ mmc_controller[i]; -+ -+ down_read( &ctrlr->update_sem ); -+ __mmc_card_stack_foreach( &ctrlr->stack, notifier->remove, FALSE ); -+ up_read( &ctrlr->update_sem ); -+ } -+ up_read( &mmc_controller_sem ); -+ } -+ } -+ -+ up_write( &mmc_notifier_sem ); -+ } -+ -+ MOD_DEC_USE_COUNT; -+} -+ -+static inline void mmc_unregister_controller( mmc_controller_t ctrlr ) -+{ -+ if ( !ctrlr || (mmc_controller[ctrlr->slot] != ctrlr ) ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, "bad unregister request\n" ); -+ goto error; -+ } -+ -+ down_write( &mmc_controller_sem ); -+ -+/* notify users */ -+ if ( ctrlr->stack.ncards > 0 ) { -+ int slot; -+ -+ down_read( &mmc_notifier_sem ); -+ if ( (slot = __mmc_card_stack_foreach( &ctrlr->stack, mmc_notify_remove, FALSE ) ) ) -+ MMC_ERROR( "device remove notification failed at slot %d\n", -slot ); -+ up_read( &mmc_notifier_sem ); -+ } -+ -+#ifdef CONFIG_PROC_FS -+ if ( ctrlr->proc ) -+ remove_proc_entry( ctrlr->proc_name, mmc_proc_dir ); -+#endif -+ -+ if ( ctrlr->tmpl && ctrlr->tmpl->remove ) -+ ctrlr->tmpl->remove( ctrlr ); -+ -+ mmc_controller[ctrlr->slot] = NULL; -+ --mmc_ncontrollers; -+ -+ __mmc_free_controller( ctrlr ); -+ -+ up_write( &mmc_controller_sem ); -+ MOD_DEC_USE_COUNT; -+error: -+ return; -+} -+ -+void mmc_unregister( mmc_reg_type_t reg_type, void *tmpl ) -+{ -+ switch ( reg_type ) { -+ case MMC_REG_TYPE_USER: -+ mmc_unregister_user( (mmc_notifier_t)tmpl ); -+ break; -+ -+ case MMC_REG_TYPE_HOST: -+ mmc_unregister_controller( (mmc_controller_t)tmpl ); -+ break; -+ -+ default: -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, "unregister request for unknown type\n" ); -+ } -+} -+EXPORT_SYMBOL( mmc_unregister ); -+ -+#ifdef CONFIG_PM -+/* power management support */ -+static int mmc_pm_callback( struct pm_dev *pmdev, pm_request_t pmreq, void *pmdata ) -+{ -+ int ret = -EINVAL; -+ mmc_controller_t ctrlr; -+ int i; -+ -+ __ENTER( "pmreq=%d", pmreq ); -+ -+ down_read( &mmc_controller_sem ); -+ -+ switch ( pmreq ) { -+ case PM_SUSPEND: -+ for ( ret = 0, i = 0; !ret && (i < mmc_ncontrollers); i++ ) { -+ ctrlr = mmc_controller[i]; -+ if ( ctrlr->tmpl->suspend ) -+ ret = ctrlr->tmpl->suspend( ctrlr ); -+ } -+ if ( !ret ) -+ break; -+ -+ case PM_RESUME: -+ for ( i = mmc_ncontrollers - 1; i >= 0; i-- ) { -+ ctrlr = mmc_controller[i]; -+ if ( ctrlr->tmpl->resume ) -+ ctrlr->tmpl->resume( ctrlr ); -+ } -+ ret = 0; -+ break; -+ -+ default: -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, "unsupported PM request %d\n", -+ pmreq ); -+ } -+ -+ up_read( &mmc_controller_sem ); -+/* error: */ -+ __LEAVE( "ret=%d", ret ); -+ return ret; -+} -+#endif -+ -+/* kernel module stuff */ -+static int __init mmc_core_module_init( void ) -+{ -+ int ret = -ENODEV; -+ -+ memset( &mmc_controller, 0, sizeof( mmc_controller ) ); -+ -+ init_rwsem( &mmc_controller_sem ); -+ init_rwsem( &mmc_notifier_sem ); -+#ifdef CONFIG_PM -+ if ( !(mmc_pm_dev = pm_register( PM_UNKNOWN_DEV, 0, mmc_pm_callback )) ) MMC_DEBUG( MMC_DEBUG_LEVEL0, "failed to register PM callback\n" ); -+#endif -+#ifdef CONFIG_PROC_FS -+ mmc_proc_dir = proc_mkdir( "mmc", NULL ); -+#endif -+ ret = 0; -+/* error: */ -+ return ret; -+} -+ -+static void __exit mmc_core_module_cleanup( void ) -+{ -+#ifdef CONFIG_PROC_FS -+ if ( mmc_proc_dir ) -+ remove_proc_entry( "mmc", NULL ); -+#endif -+#ifdef CONFIG_PM -+ pm_unregister( mmc_pm_dev ); -+#endif -+} -+ -+module_init( mmc_core_module_init ); -+module_exit( mmc_core_module_cleanup ); -+ -+MODULE_LICENSE( "GPL" ); -+ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/mmc/mmc_pxa.c 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,1902 @@ -+/* -+ * linux/drivers/mmc/mmc_pxa.c -+ * driver for Cotulla MMC controller -+ * -+ * Authors: Vladimir Shebordaev, Igor Oblakov -+ * Copyright: MontaVista Software Inc. -+ * -+ * $Id$ -+ * -+ * 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/version.h> -+#include <linux/config.h> -+#include <linux/kernel.h> -+#include <linux/init.h> -+#include <linux/module.h> -+#include <linux/errno.h> -+ -+#include <linux/slab.h> -+#include <linux/sched.h> -+#include <linux/delay.h> -+ -+#include <asm/hardware.h> -+#include <asm/io.h> -+#include <asm/irq.h> -+#include <asm/dma.h> -+ -+#include <asm/uaccess.h> -+#include <asm/semaphore.h> -+ -+#include <mmc/types.h> -+#include <mmc/mmc.h> -+#include <mmc/ioctl.h> -+ -+#include "types.h" -+#include "mmc.h" -+#include "mmc_pxa.h" -+ -+static mmc_controller_t host = NULL; -+ -+/* service routines */ -+static inline int pxa_mmc_check_state( mmc_controller_t ctrlr, pxa_mmc_state_t state ) -+{ -+ int ret = -1; -+ pxa_mmc_hostdata_t hostdata = (pxa_mmc_hostdata_t)ctrlr->host_data; -+ -+ if ( hostdata->state != state ) { -+ //MMC_DEBUG( MMC_DEBUG_LEVEL3, "state (%s vs %s)\n", PXA_MMC_STATE_LABEL( hostdata->state ), PXA_MMC_STATE_LABEL( state ) ); -+ goto error; -+ } -+ ret = 0; -+error: -+ return ret; -+} -+ -+static inline void pxa_mmc_set_state( mmc_controller_t ctrlr, pxa_mmc_state_t state ) -+{ -+ pxa_mmc_hostdata_t hostdata = (pxa_mmc_hostdata_t)ctrlr->host_data; -+ -+ hostdata->state = state; -+} -+ -+static inline int pxa_mmc_init_completion( mmc_controller_t ctrlr, u32 mask ) -+{ -+ int ret = -1; -+ pxa_mmc_hostdata_t hostdata = (pxa_mmc_hostdata_t)ctrlr->host_data; -+ -+ if ( xchg( &hostdata->busy, 1 ) ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "another interrupt " -+ "is already been expected\n" ); -+ goto error; -+ } -+ -+#if CONFIG_MMC_DEBUG_IRQ -+ hostdata->irqcnt = 1000; -+#endif -+ init_completion( &hostdata->completion ); -+ -+ MMC_I_MASK = MMC_I_MASK_ALL & ~mask; -+ ret = 0; -+error: -+ return ret; -+} -+ -+#if CONFIG_MMC_DEBUG_IRQ -+static struct timer_list timer; -+static void wait_timeo( unsigned long arg ) { -+ pxa_mmc_hostdata_t hostdata = (pxa_mmc_hostdata_t)arg; -+ hostdata->timeo = 1; -+ complete( &hostdata->completion ); -+ return; -+} -+#endif -+ -+static inline int pxa_mmc_wait_for_completion( mmc_controller_t ctrlr, u32 mask ) -+{ -+ int ret = -1; -+ pxa_mmc_hostdata_t hostdata = (pxa_mmc_hostdata_t)ctrlr->host_data; -+ -+ if ( !xchg( &hostdata->busy, 1 ) ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "there were no " -+ "interrupt awaited for\n" ); -+ goto error; -+ } -+ -+#if CONFIG_MMC_DEBUG_IRQ -+ hostdata->timeo = 0; -+ del_timer( &timer ); -+ timer.function = wait_timeo; -+ timer.expires = jiffies + 1UL*HZ; -+ timer.data = (unsigned long)hostdata; -+ add_timer( &timer ); -+#endif -+ wait_for_completion( &hostdata->completion ); -+#if CONFIG_MMC_DEBUG_IRQ -+ del_timer( &timer ); -+ if ( hostdata->timeo ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "irq timed out: " "mask=%x stat=%x\n", mask, MMC_STAT ); -+ goto error; -+ } -+#endif -+ /* verify interrupt */ -+ if ( (mask == ~0UL) || !( hostdata->mmc_i_reg & ~mask ) ) -+ ret = 0; -+ -+error: -+ xchg( &hostdata->busy, 0 ); -+ return ret; -+} -+ -+static inline int pxa_mmc_stop_bus_clock( mmc_controller_t ctrlr ) -+{ -+ int ret = -1; -+ -+ if ( !pxa_mmc_check_state( ctrlr, PXA_MMC_FSM_CLK_OFF ) ) -+ goto out; -+ -+ if ( !pxa_mmc_check_state( ctrlr, PXA_MMC_FSM_BUFFER_IN_TRANSIT ) ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "BUFFER_IN_TRANSIT\n" ); -+ goto error; -+ } -+ -+ if ( pxa_mmc_init_completion( ctrlr, MMC_I_MASK_CLK_IS_OFF ) ) -+ goto error; -+ -+ MMC_STRPCL = MMC_STRPCL_STOP_CLK; -+ -+ if ( pxa_mmc_wait_for_completion( ctrlr, MMC_I_REG_CLK_IS_OFF ) ) -+ goto error; -+ -+ //MMC_DEBUG( MMC_DEBUG_LEVEL3, "clock is off\n" ); -+ pxa_mmc_set_state( ctrlr, PXA_MMC_FSM_CLK_OFF ); -+out: -+ ret = 0; -+error: -+ return ret; -+} -+ -+static inline int pxa_mmc_start_bus_clock( mmc_controller_t ctrlr ) -+{ -+ int ret = -1; -+ pxa_mmc_hostdata_t hostdata = (pxa_mmc_hostdata_t)ctrlr->host_data; -+ -+ if ( (hostdata->state != PXA_MMC_FSM_CLK_OFF) -+ && (hostdata->state != PXA_MMC_FSM_END_IO) ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "illegal state %s\n", PXA_MMC_STATE_LABEL( hostdata->state ) ); -+ goto error; -+ } -+ -+ MMC_STRPCL = MMC_STRPCL_START_CLK; -+ wmb(); -+ //MMC_DEBUG( MMC_DEBUG_LEVEL3, "clock is on\n" ); -+ ret = 0; -+error: -+ return ret; -+} -+ -+/* -+int pxa_mmc_complete_cmd( mmc_controller_t ctrlr, mmc_response_fmt_t response ) -+ -+Effects: initializes completion to wait for END_CMD_RES intr, -+ waits for intr to occur, checks controller and card status -+Requiers: controller is in CLK_OFF state -+Modifies: moves controller to the END_CMD state -+Returns: -+*/ -+static mmc_error_t pxa_mmc_complete_cmd( mmc_controller_t ctrlr, mmc_response_fmt_t format, int send_abort ) -+{ -+ mmc_error_t ret = MMC_ERROR_GENERIC; -+ pxa_mmc_hostdata_t hostdata = (pxa_mmc_hostdata_t)ctrlr->host_data; -+ int mask, nwords; -+ u32 status; -+ -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "CMD%d(0x%04x%04x)\n", MMC_CMD & 0x3f, MMC_ARGH, MMC_ARGL); -+ -+/* FIXME: check arguments */ -+ -+ if ( (hostdata->state != PXA_MMC_FSM_CLK_OFF) -+ && (hostdata->state != PXA_MMC_FSM_END_IO) ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "illegal state %s\n", -+ PXA_MMC_STATE_LABEL( hostdata->state ) ); -+ goto error; -+ } -+ -+ mask = MMC_I_MASK_END_CMD_RES; -+ if ( pxa_mmc_init_completion( ctrlr, mask ) ) -+ goto error; -+ -+ MMC_PRTBUF = MMC_PRTBUF_BUF_FULL; -+/* start the clock */ -+ if ( pxa_mmc_start_bus_clock( ctrlr ) ) -+ goto error; -+ -+/* wait for END_CMD_RES intr */ -+ if ( pxa_mmc_wait_for_completion( ctrlr, MMC_I_REG_END_CMD_RES ) ) -+ goto error; -+ -+/* check status */ -+ if ( hostdata->mmc_stat & MMC_STAT_TIME_OUT_RESPONSE ) { -+ // MMC_DEBUG(MMC_DEBUG_LEVEL3, "response timeout\n"); -+ ret = MMC_ERROR_TIME_OUT_RESPONSE; -+ goto error; -+ -+ } else if ( hostdata->mmc_stat & MMC_STAT_READ_TIME_OUT ) { -+ // MMC_DEBUG(MMC_DEBUG_LEVEL3, "read timeout\n"); -+ ret = MMC_ERROR_READ_TIME_OUT; -+ goto error; -+ -+ } else if ( hostdata->mmc_stat & MMC_STAT_RES_CRC_ERROR ) { -+ // MMC_DEBUG(MMC_DEBUG_LEVEL3, "response crc err\n"); -+ ret = MMC_ERROR_RES_CRC_ERROR; -+ goto error; -+ -+ } else if ( hostdata->mmc_stat & MMC_STAT_CRC_READ_ERROR ) { -+ // MMC_DEBUG(MMC_DEBUG_LEVEL3, "read crc err\n"); -+ ret = MMC_ERROR_CRC_READ_ERROR; -+ goto error; -+ -+ } else if ( hostdata->mmc_stat & MMC_STAT_CRC_WRITE_ERROR ) { -+ // MMC_DEBUG(MMC_DEBUG_LEVEL3, "write crc err\n"); -+ ret = MMC_ERROR_CRC_WRITE_ERROR; -+ goto error; -+ } -+ -+ nwords = (format == MMC_NORESPONSE) ? 0 : -+ (format == MMC_R1) ? 3 : -+ (format == MMC_R2) ? 8 : -+ (format == MMC_R3) ? 3 : -+ -1; -+ ret = nwords; -+ if ( nwords > 0 ) { -+ register int i; -+ -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "nwords=%d\n", nwords ); -+ for ( i = nwords - 1; i >= 0 ; i-- ) { -+ u32 res = MMC_RES; -+ int ibase = i<<1; -+ -+ hostdata->mmc_res[ibase] = ((u8 *)&res)[0]; -+ hostdata->mmc_res[ibase + 1] = ((u8 *)&res)[1]; -+ --ret; -+ } -+#ifdef CONFIG_MMC_DEBUG -+ switch ( format ) { -+ case MMC_R1: -+ MMC_DUMP_R1( ctrlr ); -+ break; -+ case MMC_R2: -+ MMC_DUMP_R2( ctrlr ); -+ break; -+ case MMC_R3: -+ MMC_DUMP_R3( ctrlr ); -+ break; -+ default: -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, -+ "unknown response format\n" ); -+ ret = MMC_ERROR_GENERIC; -+ goto error; -+ } -+#endif -+ -+/* check card status for R1(b) commands */ -+ if ( format == MMC_R1 ) { -+ u8 cmd; -+ -+ ((u8 *)&status)[0] = hostdata->mmc_res[1]; -+ ((u8 *)&status)[1] = hostdata->mmc_res[2]; -+ ((u8 *)&status)[2] = hostdata->mmc_res[3]; -+ ((u8 *)&status)[3] = hostdata->mmc_res[4]; -+ cmd = PXA_MMC_RESPONSE( ctrlr, 5 )&0x3f; -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, -+ //printk( KERN_INFO __FUNCTION__"(): " -+ "cmd=%u status: 0x%08x\n", -+ cmd, status ); -+ switch ( cmd ) { -+ case 11: -+ case 18: -+ case 20: -+ case 25: -+ if ( !(status & 0x00000100) ) /* FIXME */ -+ goto mmc_error; -+ default: -+ break; -+ } -+ if ( status & MMC_CARD_STATUS_OUT_OF_RANGE ) { -+ ret = MMC_ERROR_OUT_OF_RANGE; -+ goto mmc_error; -+ } else if ( status & MMC_CARD_STATUS_ADDRESS_ERROR ) { -+ ret = MMC_ERROR_ADDRESS_ERROR; -+ goto mmc_error; -+ } else if ( status & MMC_CARD_STATUS_BLOCK_LEN_ERROR ) { -+ ret = MMC_ERROR_ADDRESS_ERROR; -+ goto mmc_error; -+ } else if ( status & MMC_CARD_STATUS_ERASE_SEQ_ERROR ) { -+ ret = MMC_ERROR_ERASE_SEQ_ERROR; -+ goto mmc_error; -+ } else if ( status & MMC_CARD_STATUS_ERASE_PARAM ) { -+ ret = MMC_ERROR_ERASE_PARAM; -+ goto mmc_error; -+ } else if ( status & MMC_CARD_STATUS_WP_VIOLATION ) { -+ ret = MMC_ERROR_WP_VIOLATION; -+ goto mmc_error; -+ } else if ( status & MMC_CARD_STATUS_CARD_IS_LOCKED ) { -+ ret = MMC_ERROR_CARD_IS_LOCKED; -+ goto mmc_error; -+ } else if ( status & MMC_CARD_STATUS_LOCK_UNLOCK_FAILED ) { -+ ret = MMC_ERROR_LOCK_UNLOCK_FAILED; -+ goto mmc_error; -+ } else if ( status & MMC_CARD_STATUS_COM_CRC_ERROR ) { -+ ret = MMC_ERROR_COM_CRC_ERROR; -+ goto mmc_error; -+ } else if ( status & MMC_CARD_STATUS_ILLEGAL_COMMAND ) { -+ ret = MMC_ERROR_ILLEGAL_COMMAND; -+ goto mmc_error; -+ } else if ( status & MMC_CARD_STATUS_CARD_ECC_FAILED ) { -+ ret = MMC_ERROR_CARD_ECC_FAILED; -+ goto mmc_error; -+ } else if ( status & MMC_CARD_STATUS_CC_ERROR ) { -+ ret = MMC_ERROR_CC_ERROR; -+ goto mmc_error; -+ } else if ( status & MMC_CARD_STATUS_ERROR ) { -+ ret = MMC_ERROR_ERROR; -+ goto mmc_error; -+ } else if ( status & MMC_CARD_STATUS_UNDERRUN ) { -+ ret = MMC_ERROR_UNDERRUN; -+ goto mmc_error; -+ } else if ( status & MMC_CARD_STATUS_OVERRUN ) { -+ ret = MMC_ERROR_OVERRUN; -+ goto mmc_error; -+ } else if ( status & MMC_CARD_STATUS_CID_CSD_OVERWRITE ) { -+ ret = MMC_ERROR_CID_CSD_OVERWRITE; -+ goto mmc_error; -+ } else if ( status & MMC_CARD_STATUS_ERASE_RESET ) { -+ ret = MMC_ERROR_ERASE_RESET; -+ goto mmc_error; -+ } -+ } -+ } -+ -+ if ( ret >= 0 ) -+ pxa_mmc_set_state( ctrlr, PXA_MMC_FSM_END_CMD ); -+ goto out; -+mmc_error: -+#if 1 -+ if ( send_abort ) { -+ /* send CMD12 to abort failed transfer */ -+ if ( (ret = pxa_mmc_stop_bus_clock( ctrlr )) ) -+ goto error; -+ -+ MMC_CMD = CMD(12); /* STOP_TRANSMISSION */ -+ MMC_CMDAT = MMC_CMDAT_R1; -+ -+ if ( (ret = pxa_mmc_complete_cmd( ctrlr, MMC_R1, FALSE )) ) -+ goto error; -+ -+ ret = -EIO; -+ goto error; -+ } -+#endif -+error: -+ /* move controller to the IDLE state */ -+ pxa_mmc_stop_bus_clock( ctrlr ); -+ pxa_mmc_set_state( ctrlr, PXA_MMC_FSM_IDLE ); -+out: -+ return ret; -+} -+ -+/* -+int pxa_mmc_complete_io( mmc_controller_t ctrlr, mmc_dir_t cmd, mmc_dir_t dir, mmc_transfer_mode_t mode ) -+ -+Effects: finilizes data transfer request -+Reqires: controller is in the END_BUFFER state -+Modifies: moves controller to the IDLE state -+Returns: zero upon success or error condition code otherwise -+ */ -+static mmc_error_t pxa_mmc_complete_io( mmc_controller_t ctrlr, mmc_dir_t dir, mmc_transfer_mode_t mode ) -+{ -+ int ret = MMC_ERROR_GENERIC; -+ -+ if ( pxa_mmc_check_state( ctrlr, PXA_MMC_FSM_END_IO ) ) -+ goto error; -+ -+ switch ( mode ) { -+ case MMC_TRANSFER_MODE_STREAM: /* FIXME */ -+ if ( dir == MMC_WRITE ) { -+ /* 1. wait for STOP_CMD intr */ -+ if ( (ret = pxa_mmc_init_completion( ctrlr, -+ MMC_I_MASK_STOP_CMD )) ) -+ goto error; -+ if ( (ret = pxa_mmc_wait_for_completion( ctrlr, -+ MMC_I_REG_STOP_CMD )) ) -+ goto error; -+ } -+ /* 2. send CMD12 */ -+ if ( (ret = pxa_mmc_stop_bus_clock( ctrlr )) ) -+ goto error; -+ -+ MMC_CMD = CMD(12); /* STOP_TRANSMISSION */ -+ MMC_CMDAT = MMC_CMDAT_R1; -+ if ( dir == MMC_WRITE ) -+ MMC_CMDAT |= MMC_CMDAT_BUSY; -+ -+ /* 3. wait for CMD12 to complete */ -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "ready for CMD12\n" ); -+ if ( (ret = pxa_mmc_complete_cmd( ctrlr, MMC_R1, FALSE )) ) -+ goto error; -+ -+ /* 4. wait for DATA_TRAN_DONE intr */ -+ if ( (ret = pxa_mmc_init_completion( ctrlr, -+ MMC_I_MASK_DATA_TRAN_DONE )) ) -+ goto error; -+ if ( (ret = pxa_mmc_wait_for_completion( ctrlr, -+ MMC_I_REG_DATA_TRAN_DONE )) ) -+ goto error; -+ -+ if ( dir == MMC_WRITE ) { -+ /* 5. wait for PRG_DONE intr */ -+ if ( (ret = pxa_mmc_init_completion( ctrlr, -+ MMC_I_MASK_PRG_DONE )) ) -+ goto error; -+ if ( (ret = pxa_mmc_wait_for_completion( ctrlr, -+ MMC_I_REG_PRG_DONE )) ) -+ goto error; -+ } -+ break; -+ case MMC_TRANSFER_MODE_BLOCK_MULTIPLE: -+ /* 1. wait for DATA_TRAN done intr */ -+ if ( (ret = pxa_mmc_init_completion( ctrlr, -+ MMC_I_MASK_DATA_TRAN_DONE )) ) -+ goto error; -+ if ( (ret = pxa_mmc_wait_for_completion( ctrlr, -+ MMC_I_REG_DATA_TRAN_DONE )) ) -+ goto error; -+ -+ /* 2. send CMD12 */ -+ if ( (ret = pxa_mmc_stop_bus_clock( ctrlr )) ) -+ goto error; -+ -+ MMC_CMD = CMD(12); /* STOP_TRANSMISSION */ -+ MMC_CMDAT = MMC_CMDAT_R1; -+ if ( dir == MMC_WRITE ) -+ MMC_CMDAT |= MMC_CMDAT_BUSY; -+ -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "CMD12\n" ); -+ if ( (ret = pxa_mmc_complete_cmd( ctrlr, MMC_R1, FALSE )) ) -+ goto error; -+ -+ if ( dir == MMC_WRITE ) { -+ /* 3. wait for PRG_DONE intr */ -+ if ( (ret = pxa_mmc_init_completion( ctrlr, -+ MMC_I_MASK_PRG_DONE )) ) -+ goto error; -+ if ( (ret = pxa_mmc_wait_for_completion( ctrlr, -+ MMC_I_REG_PRG_DONE )) ) -+ goto error; -+ } -+ break; -+ case MMC_TRANSFER_MODE_BLOCK_SINGLE: -+ /* 1. wait for DATA_TRAN_DONE intr */ -+ if ( (ret = pxa_mmc_init_completion( ctrlr, -+ MMC_I_MASK_DATA_TRAN_DONE )) ) -+ goto error; -+ if ( (ret = pxa_mmc_wait_for_completion( ctrlr, -+ MMC_I_REG_DATA_TRAN_DONE )) ) -+ goto error; -+ -+ if ( dir == MMC_WRITE ) { -+ /* 2. wait for PRG_DONE intr */ -+ if ( (ret = pxa_mmc_init_completion( ctrlr, -+ MMC_I_MASK_PRG_DONE )) ) -+ goto error; -+ if ( (ret = pxa_mmc_wait_for_completion( ctrlr, -+ MMC_I_REG_PRG_DONE )) ) -+ goto error; -+ } -+ break; -+ default: -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "unknown transfer mode\n" ); -+ goto error; -+ } -+/* move the controller to the IDLE state */ -+ if ( (ret = pxa_mmc_stop_bus_clock( ctrlr )) ) -+ goto error; -+ -+ pxa_mmc_set_state( ctrlr, PXA_MMC_FSM_IDLE ); -+ -+ ret = 0; -+error: -+ return ret; -+} -+ -+static inline int pxa_mmc_update_acq( mmc_controller_t ctrlr ) -+{ -+ int ret = -EINVAL; -+ pxa_mmc_hostdata_t hostdata = NULL; -+ mmc_card_t card = NULL; -+ mmc_card_stack_rec_t fake; -+ mmc_card_stack_t stack = &fake; -+ u16 argl = 0U, argh = 0U; -+ int ncards = 0; -+ -+ if ( !ctrlr ) -+ goto error; -+ -+ hostdata = (pxa_mmc_hostdata_t)ctrlr->host_data; -+ -+ __mmc_card_stack_init( stack ); -+ -+ /* max open-drain mode frequency is 400kHZ */ -+ MMC_CLKRT = MMC_CLKRT_0_3125MHZ; -+ MMC_RESTO = MMC_RES_TO_MAX; /* set response timeout */ -+ -+ /* discover and add cards to the stack */ -+ /* I. bus operation condition setup */ -+ /* 1) send CMD1 */ -+ if ( (ret = pxa_mmc_stop_bus_clock( ctrlr )) ) -+ goto err_free; -+ -+ argl = 0x0000; -+ argh = 0x0004; -+ -+ MMC_CMD = CMD(1); -+ MMC_ARGH = argh; -+ MMC_ARGL = argl; -+ -+ MMC_CMDAT = MMC_CMDAT_BUSY|MMC_CMDAT_R3; -+ -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "CMD1(0x%04x%04x)\n", argh, argl ); -+ ret = pxa_mmc_complete_cmd( ctrlr, MMC_R3, FALSE ); -+ if ( !ret ) { -+ argh = (PXA_MMC_RESPONSE( ctrlr, 4 ) << 8) -+ | PXA_MMC_RESPONSE( ctrlr, 3 ); -+ argl = (PXA_MMC_RESPONSE( ctrlr, 2 ) << 8) -+ | PXA_MMC_RESPONSE( ctrlr, 1 ); -+ -+ } else if ( ret != MMC_ERROR_TIME_OUT_RESPONSE ) -+ goto err_free; -+ -+ if ( !argh && !argl ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, -+ "assuming full voltage range support\n" ); -+ argh = 0x00ff; -+ argl = 0xff00; -+ } -+ -+ /* 2) continuously send CMD1 'till there're busy cards */ -+ for(;;) { -+ if ( (ret = pxa_mmc_stop_bus_clock( ctrlr )) ) -+ goto err_free; -+ -+ MMC_CMD = CMD(1); -+ MMC_ARGH = argh; -+ MMC_ARGL = argl; -+ -+ MMC_CMDAT = MMC_CMDAT_BUSY|MMC_CMDAT_R3; -+ -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "CMD1(0x%04x%04x)\n", argh, argl ); -+ ret = pxa_mmc_complete_cmd( ctrlr, MMC_R3, FALSE ); -+ if ( ret == MMC_ERROR_TIME_OUT_RESPONSE ) -+ break; -+ -+ else if ( !ret ) { -+ /* busy state reported by LOW signal level -+ * (MMC v3.2, p.58) -+ * -+ * Thanks to Alexander Samoutin :) -+ */ -+ if ( !(PXA_MMC_RESPONSE( ctrlr, 4 ) & 0x80) ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "busy state reported\n"); -+ udelay( 20 ); -+ continue; -+ } else -+ break; -+ } else -+ goto err_free; -+ } -+ -+/* II. card identification: the cards in Ready state -+ * are the only expected to respond -+ */ -+ for (;;) { -+ argh = 0U; -+ argl = 0U; -+ -+ /* 1) send CMD2 */ -+ if ( (ret = pxa_mmc_stop_bus_clock( ctrlr )) ) -+ goto err_free; -+ -+ MMC_CMD = CMD(2); -+ MMC_ARGH = 0x0003; -+ MMC_ARGL = 0xf300; -+ MMC_CMDAT = MMC_CMDAT_R2; -+ -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "CMD2(0x%04x%04x)\n", argh, argl ); -+ ret = pxa_mmc_complete_cmd( ctrlr, MMC_R2, FALSE ); -+ if ( ret == MMC_ERROR_TIME_OUT_RESPONSE ) -+ break; -+ -+ else if ( ret ) /* bus error */ -+ goto err_free; -+ -+ /* TODO: store CID for the card */ -+ -+ /* 2) assign RCA */ -+ if ( !++ctrlr->rca_next ) /* overflow */ -+ ++ctrlr->rca_next; -+ argh = ctrlr->rca_next; -+ -+ /* 3) send it to the card last responded (CMD3) */ -+ if ( (ret = pxa_mmc_stop_bus_clock( ctrlr )) ) -+ goto err_free; -+ -+ MMC_CMD = CMD(3); -+ MMC_ARGH = argh; -+ MMC_ARGL = argl; -+ MMC_CMDAT = MMC_CMDAT_R1; -+ -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "CMD3(0x%04x%04x)\n", argh, argl ); -+ ret = pxa_mmc_complete_cmd( ctrlr, MMC_R1, FALSE ); -+ if ( ret ) /* CMD3 failed */ -+ goto err_free; -+ -+ card = __mmc_card_alloc( sizeof( pxa_mmc_card_data_rec_t ) ); -+ if ( !card ) { -+ MMC_ERROR( "out of memory\n" ); -+ goto err_free; -+ } -+ -+ card->info.rca = argh; -+ card->slot = ctrlr->slot_next++; /* FIXME: minor encoding */ -+ card->ctrlr = ctrlr; -+ -+ if ( !__mmc_card_stack_add( stack, card ) ) -+ goto err_free; -+ -+ MMC_DEBUG( MMC_DEBUG_LEVEL2, "added card: " -+ "slot %d, RCA=0x%04x\n", card->slot, argh ); -+ ++ncards; -+ } -+ -+ if ( ncards ) { -+/* III. read CSD registers of all cards; DSR support also reported there */ -+ for ( card = stack->first; card; card = card->next ) { -+ pxa_mmc_card_data_t card_data = -+ (pxa_mmc_card_data_t)card->card_data; -+ -+ /* 1) send CMD9 */ -+ argh = card->info.rca; -+ argl = 0U; -+ -+ if ( (ret = pxa_mmc_stop_bus_clock( ctrlr )) ) -+ goto err_free; -+ -+ MMC_CMD = CMD(9); -+ MMC_ARGH = argh; -+ MMC_ARGL = argl; -+ MMC_CMDAT = MMC_CMDAT_R2; -+ -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, -+ "CMD9(0x%04x%04x)\n", argh, argl ); -+ if ( (ret = pxa_mmc_complete_cmd( ctrlr, MMC_R2, FALSE )) ) -+ goto err_free; -+ -+ memcpy( &card->info.csd, hostdata->mmc_res, 15 ); -+ MMC_DUMP_CSD( card ); -+ -+ card->info.read_bl_len = (1<<card->info.csd.read_bl_len); -+ card->info.write_bl_len = (1<<card->info.csd.write_bl_len); -+ card->info.capacity = (card->info.csd.c_size + 1) -+ * (1<<(card->info.csd.c_size_mult + 2)) -+ * card->info.read_bl_len; -+ MMC_DEBUG( MMC_DEBUG_LEVEL2, "card capacity=%dMb\n", -+ card->info.capacity>>20 ); -+ card->info.tran_speed = 20*1024; /* FIXME */ -+ card->info.transfer_mode = MMC_TRANSFER_MODE_BLOCK_SINGLE; -+ /* 2) set bus operation freq */ -+ card_data->clkrt = pxa_mmc_clkrt( card->info.tran_speed ); -+ /* 3) register card with MMC core */ -+ mmc_register( MMC_REG_TYPE_CARD, card, 0 ); -+ } -+/* IV. set DSR registers of the cards */ -+#if 0 /* TODO */ -+ if ( card->info.csd.dsr_imp ) { -+ set_dsr = TRUE; -+ /* calculate DSR */ -+ } -+#endif -+ } -+#if 0 /* TODO */ -+ if ( set_dsr ) { -+ /* send CMD4 */ -+ } -+#endif -+/* merge list of the newly inserted cards into controller card stack */ -+ if ( !ctrlr->stack.ncards ) { -+ ctrlr->stack.first = stack->first; -+ ctrlr->stack.last = stack->last; -+ } else -+ ctrlr->stack.last->next = stack->first; -+ -+ ctrlr->stack.ncards += stack->ncards; -+ -+ ret = 0; -+ goto out; -+err_free: -+ __mmc_card_stack_free( stack ); -+error: -+out: -+ return ret; -+} -+ -+/* MMC protocol macros: v3.4, p.120 */ -+static int pxa_mmc_init_card_stack( mmc_controller_t ctrlr ) -+{ -+ int ret = -EIO; -+ u16 argl = 0U, argh = 0U; -+ -+ if ( !ctrlr || ctrlr->stack.ncards ) { -+ ret = -EINVAL; -+ goto error; -+ } -+ -+ /* initialize stack */ -+ /* 1) send CMD0 */ -+ if ( (ret = pxa_mmc_stop_bus_clock( ctrlr )) ) -+ goto error; -+ -+ /* max open-drain mode frequency is 400kHZ */ -+ MMC_CLKRT = MMC_CLKRT_0_3125MHZ; -+ MMC_RESTO = MMC_RES_TO_MAX; /* set response timeout */ -+ MMC_SPI = MMC_SPI_DISABLE; -+ -+ MMC_CMD = CMD(0); /* CMD0 with zero argument */ -+ MMC_ARGH = argh; -+ MMC_ARGL = argl; -+ MMC_CMDAT = MMC_CMDAT_INIT; -+ -+ //MMC_DEBUG( MMC_DEBUG_LEVEL3, "CMD0(0x%04x%04x)\n", argh, argl ); -+ if ( (ret = pxa_mmc_complete_cmd( ctrlr, MMC_NORESPONSE, FALSE )) ) -+ goto error; -+ -+ /* update card stack */ -+ if ( (ret = pxa_mmc_update_acq( ctrlr )) ) -+ goto err_free; -+ -+ /* move the controller to the IDLE state */ -+ if ( (ret = pxa_mmc_stop_bus_clock( ctrlr )) ) -+ goto err_free; -+ -+ pxa_mmc_set_state( ctrlr, PXA_MMC_FSM_IDLE ); -+ -+ ret = 0; -+ MMC_DEBUG( MMC_DEBUG_LEVEL2, "ncards=%d\n", ctrlr->stack.ncards ); -+ goto out; -+ -+err_free: -+ __mmc_card_stack_free( &ctrlr->stack ); -+error: -+out: -+ return ret; -+} -+ -+static int pxa_mmc_check_card_stack( mmc_controller_t ctrlr ) -+{ -+ int ret = -1; -+ mmc_card_t card; -+ -+ if ( !ctrlr ) -+ goto error; -+ -+ if ( ctrlr->stack.ncards > 0 ) { -+/* for each card in the stack: */ -+ for( card = ctrlr->stack.first; card; card = card->next ) { -+ u16 argh = card->info.rca; -+ u16 argl = 0UL; -+ -+/* 1) send CMD9( card->rca ) */ -+ if ( pxa_mmc_stop_bus_clock( ctrlr ) ) -+ goto error; -+ -+ /* SanDisk's cards do not respond to CMD9 */ -+ MMC_CMD = CMD(13); -+ MMC_ARGH = argh; -+ MMC_ARGL = argl; -+ MMC_CMDAT = MMC_CMDAT_R1; -+ -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "CMD13(0x%04x%04x)\n", -+ argh, argl ); -+ ret = pxa_mmc_complete_cmd( ctrlr, MMC_R1, FALSE ); -+/* 2) if card responded, it is still there */ -+ if ( ret ) -+ card->state = MMC_CARD_STATE_UNPLUGGED; -+ } -+ } -+ ret = 0; -+error: -+ return ret; -+} -+ -+/* This procedure links the bus master with a single card -+ * 1) cross checks with the internal stack management data if a card still -+ * exists in the slot -+ * 2) send CMD7( card->public.rca ) -+ * 3) setup data path and controller options -+ */ -+static int pxa_mmc_setup_card( mmc_controller_t ctrlr, mmc_card_t card ) -+{ -+ int ret = -ENODEV; -+ pxa_mmc_hostdata_t hostdata; -+ pxa_mmc_card_data_t card_data; -+ u16 argh = 0U; -+#ifdef CONFIG_MMC_DEBUG -+ u16 argl = 0U; -+#endif -+ -+ if ( !ctrlr || !card ) { -+ ret = -EINVAL; -+ goto error; -+ } -+ -+ if ( card->ctrlr != ctrlr ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "card is on another bus\n" ); -+ goto error; -+ } -+ -+ hostdata = (pxa_mmc_hostdata_t)ctrlr->host_data; -+ card_data = (pxa_mmc_card_data_t)card->card_data; -+ -+ argh = card->info.rca; -+ -+/* select requested card */ -+ if ( (ret = pxa_mmc_stop_bus_clock( ctrlr )) ) -+ goto error; -+ -+ MMC_CMD = CMD(7); -+ MMC_ARGH = argh; -+ MMC_CMDAT = MMC_CMDAT_R1; -+ -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "CMD7(0x%04x%04x)\n", argh, argl ); -+ if ( (ret = pxa_mmc_complete_cmd( ctrlr, MMC_R1, FALSE )) ) -+ goto error; -+ -+/* set controller options */ -+#ifndef CONFIG_MMC_DEBUG -+ MMC_CLKRT = card_data->clkrt; -+#endif -+/* move the controller to the IDLE state */ -+ if ( (ret = pxa_mmc_stop_bus_clock( ctrlr )) ) -+ goto error; -+ -+ pxa_mmc_set_state( ctrlr, PXA_MMC_FSM_IDLE ); -+ -+ ret = 0; -+error: -+ return ret; -+} -+ -+static inline int pxa_mmc_iobuf_init( mmc_controller_t ctrlr, ssize_t cnt ) -+{ -+#ifdef PIO -+ pxa_mmc_hostdata_t hostdata = (pxa_mmc_hostdata_t)ctrlr->host_data; -+#endif -+#ifndef PIO -+/* TODO */ -+#else -+ hostdata->iobuf.buf.pos = hostdata->iobuf.iodata; -+ hostdata->iobuf.buf.cnt = cnt; -+#endif -+ return 0; -+} -+/* TODO: ssize_t pxa_mmc_read_buffer( mmc_controller_t ctrlr, ssize_t cnt ) -+effects: reads at most cnt bytes from the card to the controller I/O buffer; -+ takes care of partial data transfers -+requieres: -+modifies: ctrlr->iobuf -+returns: number of bytes actually transferred or negative error code if there were any errors -+ */ -+ssize_t pxa_mmc_read_buffer( mmc_controller_t ctrlr, ssize_t cnt ) -+{ -+ ssize_t ret = -EIO; -+ pxa_mmc_hostdata_t hostdata = (pxa_mmc_hostdata_t)ctrlr->host_data; -+#ifndef PIO -+ register int ndesc; -+ int chan = hostdata->iobuf.buf.chan; -+ pxa_dma_desc *desc; -+#endif -+ -+ if ( (hostdata->state != PXA_MMC_FSM_END_CMD) && (hostdata->state != PXA_MMC_FSM_END_BUFFER) ) { -+ goto error; -+ } -+ -+ if ( cnt > hostdata->iobuf.bufsz ) -+ cnt = hostdata->iobuf.bufsz; -+ -+ if ( (ret = pxa_mmc_iobuf_init( ctrlr, cnt )) ) -+ goto error; -+ -+ pxa_mmc_set_state( ctrlr, PXA_MMC_FSM_BUFFER_IN_TRANSIT ); -+#ifndef PIO -+ if ( pxa_mmc_init_completion( ctrlr, ~MMC_I_MASK_ALL ) ) /* FIXME */ -+ goto error; -+ -+ if ( (desc = hostdata->iobuf.buf.last_read_desc) ) { -+ desc->ddadr &= ~DDADR_STOP; -+ desc->dcmd &= ~(DCMD_ENDIRQEN|DCMD_LENGTH); -+ desc->dcmd |= (1<<5); -+ } -+/* 1) setup descriptors for DMA transfer from the device */ -+ ndesc = (cnt>>5) - 1; /* FIXME: partial read */ -+ desc = &hostdata->iobuf.buf.read_desc[ndesc]; -+ hostdata->iobuf.buf.last_read_desc = desc; -+ /* TODO: partial read */ -+ desc->ddadr |= DDADR_STOP; -+ desc->dcmd |= DCMD_ENDIRQEN; -+/* 2) start DMA channel */ -+ DDADR( chan ) = hostdata->iobuf.buf.read_desc_phys_addr; -+ DCSR( chan ) |= DCSR_RUN; -+#else -+ if ( pxa_mmc_init_completion( ctrlr, MMC_I_MASK_RXFIFO_RD_REQ ) ) -+ goto error; -+#endif -+ -+ if ( pxa_mmc_wait_for_completion( ctrlr, ~0UL ) ) -+ goto error; -+ -+ if ( pxa_mmc_check_state( ctrlr, PXA_MMC_FSM_END_BUFFER ) ) -+ goto error; -+ -+ if ( !(hostdata->mmc_stat & MMC_STAT_ERRORS) ) /* FIXME */ -+ ret = cnt; -+error: -+ return ret; -+} -+ -+ssize_t pxa_mmc_write_buffer( mmc_controller_t ctrlr, ssize_t cnt ) -+{ -+ ssize_t ret = -EIO; -+ pxa_mmc_hostdata_t hostdata = (pxa_mmc_hostdata_t)ctrlr->host_data; -+#ifndef PIO -+ register int ndesc; -+ int chan = hostdata->iobuf.buf.chan; -+ pxa_dma_desc *desc; -+#endif -+ -+ if ( (hostdata->state != PXA_MMC_FSM_END_CMD) -+ && (hostdata->state != PXA_MMC_FSM_END_BUFFER) ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "unexpected state (%s)\n", -+ PXA_MMC_STATE_LABEL( hostdata->state ) ); -+ goto error; -+ } -+ -+ if ( cnt > hostdata->iobuf.bufsz ) -+ cnt = hostdata->iobuf.bufsz; -+ -+ if ( (ret = pxa_mmc_iobuf_init( ctrlr, cnt )) ) -+ goto error; -+ -+ pxa_mmc_set_state( ctrlr, PXA_MMC_FSM_BUFFER_IN_TRANSIT ); -+#ifndef PIO -+ if ( pxa_mmc_init_completion( ctrlr, ~MMC_I_MASK_ALL ) ) /* FIXME */ -+ goto error; -+ if ( (desc = hostdata->iobuf.buf.last_write_desc) ) { -+ desc->ddadr &= ~DDADR_STOP; -+ desc->dcmd &= ~(DCMD_ENDIRQEN|DCMD_LENGTH); -+ desc->dcmd |= (1<<5); -+ } -+/* 1) setup descriptors for DMA transfer to the device */ -+ ndesc = (cnt>>5) - 1; /* FIXME: partial write */ -+ desc = &hostdata->iobuf.buf.write_desc[ndesc]; -+ /* TODO: partial write */ -+ hostdata->iobuf.buf.last_write_desc = desc; -+ desc->ddadr |= DDADR_STOP; -+ desc->dcmd |= DCMD_ENDIRQEN; -+/* 2) start DMA channel */ -+ DDADR( chan ) = hostdata->iobuf.buf.write_desc_phys_addr; -+ DCSR( chan ) |= DCSR_RUN; -+#else -+ if ( pxa_mmc_init_completion( ctrlr, MMC_I_MASK_TXFIFO_WR_REQ ) ) -+ goto error; -+#endif -+ if ( pxa_mmc_wait_for_completion( ctrlr, ~0UL ) ) -+ goto error; -+ -+ if ( pxa_mmc_check_state( ctrlr, PXA_MMC_FSM_END_BUFFER ) ) -+ goto error; -+ -+ if ( !(hostdata->mmc_stat & MMC_STAT_ERRORS) ) /* FIXME */ -+ ret = cnt; -+error: -+ return ret; -+} -+ -+/* TODO: ssize_t pxa_mmc_copy_from_buffer( ctrlr, mmc_buftype_t to, char *buf, ssize_t cnt ) -+effects: copies at most cnt bytes from the controller I/O buffer to the user or kernel buffer -+ pointed by buf -+requiers: -+modifies: -+returns: number of bytes actually transferred or negative error code if there were any errors -+ */ -+ssize_t pxa_mmc_copy_from_buffer( mmc_controller_t ctrlr, mmc_buftype_t to, char *buf, ssize_t cnt ) -+{ -+ ssize_t ret = -EIO; -+ pxa_mmc_hostdata_t hostdata = (pxa_mmc_hostdata_t)ctrlr->host_data; -+ -+#ifndef PIO -+/* TODO: check that DMA channel is not running */ -+#endif -+ switch ( to ) { -+ case MMC_USER: -+ if ( copy_to_user( buf, hostdata->iobuf.iodata, cnt ) ) { -+ ret = -EFAULT; -+ goto error; -+ } -+ break; -+ case MMC_KERNEL: -+ memcpy( buf, hostdata->iobuf.iodata, cnt ); -+ break; -+ default: -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "unknown buffer type\n" ); -+ goto error; -+ } -+ ret = cnt; -+error: -+ return ret; -+} -+ -+ssize_t pxa_mmc_copy_to_buffer( mmc_controller_t ctrlr, mmc_buftype_t to, char *buf, ssize_t cnt ) -+{ -+ ssize_t ret = -EIO; -+ pxa_mmc_hostdata_t hostdata = (pxa_mmc_hostdata_t)ctrlr->host_data; -+#ifndef PIO -+/* check that DMA channel is not running */ -+#endif -+ switch ( to ) { -+ case MMC_USER: -+ if ( copy_from_user( hostdata->iobuf.iodata, buf, cnt ) ) { -+ ret = -EFAULT; -+ goto error; -+ } -+ break; -+ case MMC_KERNEL: -+ memcpy( hostdata->iobuf.iodata, buf, cnt ); -+ break; -+ default: -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "unknown buffer type\n" ); -+ goto error; -+ } -+ ret = cnt; -+error: -+ return ret; -+} -+ -+/* This procedure sequentally passes the data from the user buffer to the card */ -+static int pxa_mmc_stream_read( mmc_controller_t ctrlr, mmc_data_transfer_req_t transfer ) -+{ -+ int ret = -EIO; -+ pxa_mmc_hostdata_t hostdata = (pxa_mmc_hostdata_t)ctrlr->host_data; -+ u16 argh = 0UL, argl = 0UL; -+ ssize_t size = 0; -+ -+ while ( transfer->cnt > 0 ) { -+ size = (transfer->cnt < hostdata->iobuf.blksz) ? -+ transfer->cnt : hostdata->iobuf.blksz; -+ /* 1. send CMD11 */ -+ if ( (ret = pxa_mmc_stop_bus_clock( ctrlr )) ) -+ goto error; -+ -+ argh = transfer->addr >> 16; -+ argl = transfer->addr; -+ /* 2. setup controller registers to start stream data transfer */ -+ MMC_CMD = CMD(11); /* READ_DAT_UNTIL_STOP */ -+ MMC_ARGH = argh; -+ MMC_ARGL = argl; -+ MMC_NOB = 0xffff; -+ MMC_BLKLEN = size; -+ MMC_CMDAT = MMC_CMDAT_R1|MMC_CMDAT_READ|MMC_CMDAT_STREAM|MMC_CMDAT_DATA_EN; -+#ifndef PIO -+ MMC_CMDAT |= MMC_CMDAT_MMC_DMA_EN; -+#endif -+ /* 3. wait for cmd to complete */ -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "CMD11(0x%04x%04x)\n", argh, argl ); -+ if ( (ret = pxa_mmc_complete_cmd( ctrlr, MMC_R1, TRUE )) ) -+ goto error; -+ -+ /* 4. transfer the data to the caller supplied buffer */ -+ if ( (ret = pxa_mmc_read_buffer( ctrlr, size )) < 0 ) -+ goto error; -+ -+ if ( (ret = pxa_mmc_copy_from_buffer( ctrlr, transfer->type, transfer->buf, ret )) < 0 ) -+ goto error; -+ -+ pxa_mmc_set_state( ctrlr, PXA_MMC_FSM_END_IO ); -+ -+ if ( (ret = pxa_mmc_complete_io( ctrlr, transfer->cmd, transfer->mode )) ) -+ goto error; -+ -+ transfer->buf += ret; -+ transfer->addr += ret; -+ transfer->cnt -= ret; -+ } -+ ret = 0; -+error: -+ return ret; -+} -+ -+/* This procedure reads a data block from a card at a given kernel address */ -+static int pxa_mmc_read_block( mmc_controller_t ctrlr, mmc_data_transfer_req_t transfer ) -+{ -+ int ret = -ENODEV; -+ u16 argh = 0UL, argl = 0UL; -+ -+/* send CMD16 (SET_BLOCK_LEN) when requested block size is not the default -+ * for the current card */ -+ if ( transfer->blksz != ctrlr->stack.selected->info.read_bl_len ) { -+ argh = transfer->blksz >> 16; -+ argl = transfer->blksz; -+ if ( (ret = pxa_mmc_stop_bus_clock( ctrlr )) ) -+ goto error; -+ -+ MMC_CMD = CMD(16); /* SET_BLOCK_LEN */ -+ MMC_ARGH = argh; -+ MMC_ARGL = argl; -+ MMC_CMDAT = MMC_CMDAT_R1; -+ -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, -+ "CMD16(0x%04x%04x)\n", argh, argl ); -+ if ( (ret = pxa_mmc_complete_cmd( ctrlr, MMC_R1, FALSE )) ) -+ goto error; -+ } -+ -+/* CMD17 (READ_SINGLE_BLOCK) */ -+ argh = transfer->addr >> 16; -+ argl = transfer->addr; -+ if ( (ret = pxa_mmc_stop_bus_clock( ctrlr )) ) -+ goto error; -+ -+ MMC_CMD = CMD(17); /* READ_SINGLE_BLOCK */ -+ MMC_ARGH = argh; -+ MMC_ARGL = argl; -+ MMC_CMDAT = MMC_CMDAT_R1|MMC_CMDAT_READ|MMC_CMDAT_BLOCK|MMC_CMDAT_DATA_EN; -+ MMC_NOB = 1; -+ MMC_BLKLEN = transfer->blksz; -+#ifndef PIO -+ MMC_CMDAT |= MMC_CMDAT_MMC_DMA_EN; -+#endif -+ -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "CMD17(0x%04x%04x)\n", argh, argl ); -+ if ( (ret = pxa_mmc_complete_cmd( ctrlr, MMC_R1, FALSE )) ) -+ goto error; -+ -+/* transfer the data to the caller supplied buffer */ -+ if ( (ret = pxa_mmc_read_buffer( ctrlr, transfer->blksz )) < 0 ) -+ goto error; -+ -+ if ( (ret = pxa_mmc_copy_from_buffer( ctrlr, transfer->type, transfer->buf, ret )) < 0 ) -+ goto error; -+ -+ transfer->buf += ret; -+ transfer->cnt -= ret; -+ transfer->nob -= 1; -+ -+ pxa_mmc_set_state( ctrlr, PXA_MMC_FSM_END_IO ); -+ -+ if ( (ret = pxa_mmc_complete_io( ctrlr, transfer->cmd, transfer->mode )) ) -+ goto error; -+ -+ ret = 0; -+error: -+ return ret; -+} -+ -+/* This procedure sequentally reads data blocks from -+ * a card to the user buffer. Controller options and block size -+ * are already set by setup_card(). Data alignment and partial -+ * data accessibility assumed to be checked by mmc_core */ -+static int pxa_mmc_read_mblock( mmc_controller_t ctrlr, mmc_data_transfer_req_t transfer ) -+{ -+ int ret = -EIO; -+ u16 argh = 0UL, argl = 0UL; -+ -+/* send CMD16 (SET_BLOCK_LEN) when requested block size is not the default -+ * for the current card */ -+ if ( transfer->blksz != ctrlr->stack.selected->info.read_bl_len ) { -+ argh = transfer->blksz >> 16; -+ argl = transfer->blksz; -+ if ( (ret = pxa_mmc_stop_bus_clock( ctrlr )) ) -+ goto error; -+ -+ MMC_CMD = CMD(16); /* SET_BLOCK_LEN */ -+ MMC_ARGH = argh; -+ MMC_ARGL = argl; -+ MMC_CMDAT = MMC_CMDAT_R1; -+ -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "CMD16(0x%04x%04x)\n", argh, argl ); -+ if ( (ret = pxa_mmc_complete_cmd( ctrlr, MMC_R1, FALSE )) ) -+ goto error; -+ } -+ -+ argh = transfer->addr >> 16; -+ argl = transfer->addr; -+/* 1. stop bus clock */ -+ if ( (ret = pxa_mmc_stop_bus_clock( ctrlr )) ) -+ goto error; -+ -+/* 2. setup controller registers to start multiple block transfer */ -+ MMC_CMD = CMD(18); /* READ_MULTIPLE_BLOCK */ -+ MMC_ARGH = argh; -+ MMC_ARGL = argl; -+ MMC_NOB = transfer->nob; -+ MMC_BLKLEN = transfer->blksz; -+ MMC_CMDAT = MMC_CMDAT_R1|MMC_CMDAT_READ|MMC_CMDAT_BLOCK|MMC_CMDAT_DATA_EN; -+#ifndef PIO -+ MMC_CMDAT |= MMC_CMDAT_MMC_DMA_EN; -+#endif -+ -+/* 3. start clock */ -+ if ( (ret = pxa_mmc_start_bus_clock( ctrlr )) ) -+ goto error; -+ -+/* 4. wait for cmd to complete */ -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "CMD18(0x%04x%04x)\n", argh, argl ); -+ if ( (ret = pxa_mmc_complete_cmd( ctrlr, MMC_R1, TRUE )) ) -+ goto error; -+ -+/* 6. transfer the data to the caller supplied buffer */ -+ while ( transfer->cnt > 0 ) { -+ if ( (ret = pxa_mmc_read_buffer( ctrlr, transfer->cnt )) < 0 ) -+ goto error; -+ -+ if ( (ret = pxa_mmc_copy_from_buffer( ctrlr, transfer->type, transfer->buf, ret )) < 0 ) -+ goto error; -+ -+ transfer->buf += ret; -+ transfer->cnt -= ret; -+ } -+ -+ pxa_mmc_set_state( ctrlr, PXA_MMC_FSM_END_IO ); -+ -+ if ( (ret = pxa_mmc_complete_io( ctrlr, transfer->cmd, transfer->mode )) ) -+ goto error; -+ -+ ret = 0; -+error: -+ return ret; -+} -+ -+/* Sequentally writes the data from a user buffer to the card */ -+static int pxa_mmc_stream_write( mmc_controller_t ctrlr, mmc_data_transfer_req_t transfer ) -+{ -+ int ret = -EIO; -+ pxa_mmc_hostdata_t hostdata = (pxa_mmc_hostdata_t)ctrlr->host_data; -+ u16 argh = 0UL, argl = 0UL; -+ ssize_t size = 0; -+ -+ __ENTER( "transfer: cmd=%d mode=%d type=%d blksz=%d " -+ "nob=%d buf=%p cnt=%d addr=%Lx", transfer->cmd, -+ transfer->mode, transfer->type, transfer->blksz, -+ transfer->nob, transfer->buf, transfer->cnt, transfer->addr ); -+ -+ argh = transfer->addr >> 16; -+ argl = transfer->addr; -+/* 1. stop bus clock */ -+ if ( (ret = pxa_mmc_stop_bus_clock( ctrlr )) ) -+ goto error; -+ -+/* 2. setup controller registers to start stream data transfer */ -+ MMC_CMD = CMD(20); /* WRITE_DAT_UNTIL_STOP */ -+ MMC_ARGH = argh; -+ MMC_ARGL = argl; -+ MMC_NOB = 0xffff; -+ MMC_BLKLEN = hostdata->iobuf.blksz; -+ MMC_CMDAT = MMC_CMDAT_R1|MMC_CMDAT_WRITE|MMC_CMDAT_STREAM|MMC_CMDAT_DATA_EN; -+#ifndef PIO -+ MMC_CMDAT |= MMC_CMDAT_MMC_DMA_EN; -+#endif -+ -+/* 3. wait for cmd to complete */ -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "CMD20(0x%04x%04x)\n", argh, argl ); -+ if ( (ret = pxa_mmc_complete_cmd( ctrlr, MMC_R1, TRUE )) ) -+ goto error; -+ -+/* 4. transfer the data to the caller supplied buffer */ -+ while ( transfer->cnt > 0 ) { -+ size = (transfer->cnt < hostdata->iobuf.blksz) ? -+ transfer->cnt : hostdata->iobuf.blksz; -+ if ( (ret = pxa_mmc_copy_to_buffer( ctrlr, -+ transfer->type, transfer->buf, size )) < 0 ) -+ goto error; -+ -+ if ( (ret = pxa_mmc_write_buffer( ctrlr, ret )) < 0 ) -+ goto error; -+ -+ transfer->buf += ret; -+ transfer->cnt -= ret; -+ } -+ -+ pxa_mmc_set_state( ctrlr, PXA_MMC_FSM_END_IO ); -+ -+ if ( (ret = pxa_mmc_complete_io( ctrlr, transfer->cmd, transfer->mode )) ) -+ goto error; -+ -+ ret = 0; -+error: -+ return ret; -+} -+ -+/* This procedure writes a data block to a card at a given address */ -+static int pxa_mmc_write_block( mmc_controller_t ctrlr, mmc_data_transfer_req_t transfer ) -+{ -+ int ret = -ENODEV; -+ u16 argh = 0UL, argl = 0UL; -+ -+/* send CMD16 (SET_BLOCK_LEN) when requested block size is not the default -+ * for the current card */ -+ if ( transfer->blksz != ctrlr->stack.selected->info.read_bl_len ) { -+ argh = transfer->blksz >> 16; -+ argl = transfer->blksz; -+ if ( (ret = pxa_mmc_stop_bus_clock( ctrlr )) ) -+ goto error; -+ -+ MMC_CMD = CMD(16); /* SET_BLOCK_LEN */ -+ MMC_ARGH = argh; -+ MMC_ARGL = argl; -+ MMC_CMDAT = MMC_CMDAT_R1; -+ -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "CMD16(0x%04x%04x)\n", argh, argl ); -+ if ( (ret = pxa_mmc_complete_cmd( ctrlr, MMC_R1, FALSE )) ) -+ goto error; -+ } -+ -+/* CMD17 (READ_SINGLE_BLOCK) */ -+ argh = transfer->addr >> 16; -+ argl = transfer->addr; -+ if ( (ret = pxa_mmc_stop_bus_clock( ctrlr )) ) -+ goto error; -+ -+ MMC_CMD = CMD(24); /* WRITE_BLOCK */ -+ MMC_ARGH = argh; -+ MMC_ARGL = argl; -+ MMC_CMDAT = MMC_CMDAT_R1|MMC_CMDAT_WRITE|MMC_CMDAT_BLOCK|MMC_CMDAT_DATA_EN; -+#ifndef PIO -+ MMC_CMDAT |= MMC_CMDAT_MMC_DMA_EN; -+#endif -+ MMC_NOB = 1; -+ MMC_BLKLEN = transfer->blksz; -+ -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "CMD24(0x%04x%04x)\n", argh, argl ); -+ if ( (ret = pxa_mmc_complete_cmd( ctrlr, MMC_R1, FALSE )) ) -+ goto error; -+ -+/* transfer the data to the caller supplied buffer */ -+ if ( (ret = pxa_mmc_copy_to_buffer( ctrlr, transfer->type, transfer->buf, transfer->cnt )) < 0 ) -+ goto error; -+ -+ if ( (ret = pxa_mmc_write_buffer( ctrlr, ret )) < 0 ) -+ goto error; -+ -+ transfer->buf += ret; -+ transfer->cnt -= ret; -+ transfer->nob -= 1; -+ -+ pxa_mmc_set_state( ctrlr, PXA_MMC_FSM_END_IO ); -+ -+ if ( (ret = pxa_mmc_complete_io( ctrlr, transfer->cmd, transfer->mode )) ) -+ goto error; -+ -+ ret = 0; -+error: -+ return ret; -+} -+ -+/* This procedure sequentally writes data blocks to a card at a given address */ -+static ssize_t pxa_mmc_write_mblock( mmc_controller_t ctrlr, mmc_data_transfer_req_t transfer ) -+{ -+ int ret = -EIO; -+ u16 argh = 0UL, argl = 0UL; -+ -+/* send CMD16 (SET_BLOCK_LEN) when requested block size is not the default -+ * for the current card */ -+ if ( transfer->blksz != ctrlr->stack.selected->info.write_bl_len ) { -+ argh = transfer->blksz >> 16; -+ argl = transfer->blksz; -+ if ( (ret = pxa_mmc_stop_bus_clock( ctrlr )) ) -+ goto error; -+ -+ MMC_CMD = CMD(16); /* SET_BLOCK_LEN */ -+ MMC_ARGH = argh; -+ MMC_ARGL = argl; -+ MMC_CMDAT = MMC_CMDAT_R1; -+ -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "CMD16(0x%04x%04x)\n", argh, argl ); -+ if ( (ret = pxa_mmc_complete_cmd( ctrlr, MMC_R1, FALSE )) ) -+ goto error; -+ } -+ -+ argh = transfer->addr >> 16; -+ argl = transfer->addr; -+/* 1. stop bus clock */ -+ if ( (ret = pxa_mmc_stop_bus_clock( ctrlr )) ) -+ goto error; -+ -+/* 2. setup controller registers to start multiple block transfer */ -+ MMC_CMD = CMD(25); /* WRITE_MULTIPLE_BLOCK */ -+ MMC_ARGH = argh; -+ MMC_ARGL = argl; -+ MMC_NOB = transfer->nob; -+ MMC_BLKLEN = transfer->blksz; -+ MMC_CMDAT = MMC_CMDAT_R1|MMC_CMDAT_WRITE|MMC_CMDAT_BLOCK|MMC_CMDAT_DATA_EN; -+#ifndef PIO -+ MMC_CMDAT |= MMC_CMDAT_MMC_DMA_EN; -+#endif -+ -+/* 3. start clock */ -+ if ( (ret = pxa_mmc_start_bus_clock( ctrlr )) ) -+ goto error; -+ -+/* 4. wait for cmd to complete */ -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "CMD25(0x%04x%04x)\n", argh, argl ); -+ if ( (ret = pxa_mmc_complete_cmd( ctrlr, MMC_R1, TRUE )) ) -+ goto error; -+ -+/* 6. transfer the data to the caller supplied buffer */ -+ while ( transfer->cnt > 0 ) { -+ if ( (ret = pxa_mmc_copy_to_buffer( ctrlr, transfer->type, -+ transfer->buf, transfer->cnt )) < 0 ) -+ goto error; -+ -+ if ( (ret = pxa_mmc_write_buffer( ctrlr, ret )) < 0 ) -+ goto error; -+ -+ transfer->buf += ret; -+ transfer->cnt -= ret; -+ } -+ -+ pxa_mmc_set_state( ctrlr, PXA_MMC_FSM_END_IO ); -+ -+ if ( (ret = pxa_mmc_complete_io( ctrlr, transfer->cmd, transfer->mode )) ) -+ goto error; -+ -+ ret = 0; -+error: -+ return ret; -+} -+ -+static void pxa_mmc_irq( int irq, void *dev_id, struct pt_regs *regs ) -+{ -+ mmc_controller_t ctrlr = (mmc_controller_t)dev_id; -+ pxa_mmc_hostdata_t hostdata = (pxa_mmc_hostdata_t)ctrlr->host_data; -+#ifdef PIO -+ register int i, cnt; -+ register char *buf; -+#endif -+ -+ hostdata->mmc_i_reg = MMC_I_REG; -+ hostdata->mmc_stat = MMC_STAT; -+ hostdata->mmc_cmdat = MMC_CMDAT; -+#if 0 -+ if (hostdata->mmc_i_reg != 0x0010) { -+ printk("IREG %08x", hostdata->mmc_i_reg); -+ if (hostdata->mmc_i_reg & 0x0001) printk(" DATA_TRAN_DONE"); -+ if (hostdata->mmc_i_reg & 0x0002) printk(" PRG_DONE"); -+ if (hostdata->mmc_i_reg & 0x0004) printk(" END_CMD"); -+ if (hostdata->mmc_i_reg & 0x0008) printk(" STOP_CMD"); -+ if (hostdata->mmc_i_reg & 0x0010) printk(" CLK_OFF"); -+ if (hostdata->mmc_i_reg & 0x0020) printk(" RX_FIFO"); -+ if (hostdata->mmc_i_reg & 0x0040) printk(" TX_FIFO"); -+ printk("\nSTAT %08x", hostdata->mmc_stat); -+ if (hostdata->mmc_stat & 0x0001) printk(" READ_TO"); -+ if (hostdata->mmc_stat & 0x0002) printk(" RESP_TO"); -+ if (hostdata->mmc_stat & 0x0004) printk(" WR_CRC"); -+ if (hostdata->mmc_stat & 0x0008) printk(" READ_CRC"); -+ if (hostdata->mmc_stat & 0x0010) printk(" SPI_RD_TKN"); -+ if (hostdata->mmc_stat & 0x0020) printk(" RESP_CRC"); -+ if (hostdata->mmc_stat & 0x0040) printk(" TX_FIFO"); -+ if (hostdata->mmc_stat & 0x0080) printk(" RX_FIFO"); -+ if (hostdata->mmc_stat & 0x0100) printk(" CLK"); -+ if (hostdata->mmc_stat & 0x0800) printk(" DATA_TRAN_DONE"); -+ if (hostdata->mmc_stat & 0x1000) printk(" PRG_DONE"); -+ if (hostdata->mmc_stat & 0x2000) printk(" END_CMD"); -+ printk("\n"); -+ } -+#endif -+ -+#if CONFIG_MMC_DEBUG_IRQ -+ if ( --hostdata->irqcnt <= 0 ) { -+ printk( KERN_INFO __FUNCTION__"(): irqcnt exceeded\n" ); -+ goto complete; -+ } -+#endif -+ switch ( hostdata->state ) { -+ case PXA_MMC_FSM_IDLE: -+ case PXA_MMC_FSM_CLK_OFF: -+ case PXA_MMC_FSM_END_IO: -+ case PXA_MMC_FSM_END_BUFFER: -+ case PXA_MMC_FSM_END_CMD: -+ goto complete; -+#ifdef PIO -+ case PXA_MMC_FSM_BUFFER_IN_TRANSIT: -+ if ( hostdata->mmc_stat & MMC_STAT_ERRORS ) -+ goto complete; -+ -+ buf = hostdata->iobuf.buf.pos; -+ cnt = (hostdata->iobuf.buf.cnt < 32) ? -+ hostdata->iobuf.buf.cnt : 32; -+ if ( hostdata->mmc_cmdat & MMC_CMDAT_WRITE ) { -+ if ( !(hostdata->mmc_stat & MMC_STAT_XMIT_FIFO_EMPTY) ) -+ break; -+ for ( i = 0; i < cnt; i++ ) -+ MMC_TXFIFO = *buf++; -+ if ( cnt < 32 ) -+ MMC_PRTBUF = MMC_PRTBUF_BUF_PART_FULL; -+ } else { /* i.e. MMC_CMDAT_READ */ -+ if( !(hostdata->mmc_stat & MMC_STAT_RECV_FIFO_FULL) ) -+ break; -+ for( i = 0; i < cnt; i++ ) -+ *buf++ = MMC_RXFIFO; -+ } -+ -+ hostdata->iobuf.buf.pos = buf; -+ hostdata->iobuf.buf.cnt -= i; -+ if ( hostdata->iobuf.buf.cnt <= 0 ) { -+ pxa_mmc_set_state( ctrlr, PXA_MMC_FSM_END_BUFFER ); -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "buffer transferred\n" ); -+ goto complete; -+ } -+ break; -+#endif /* PIO */ -+ default: -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "unexpected state %d\n", -+ hostdata->state ); -+ goto complete; -+ } -+ return; -+complete: -+ MMC_I_MASK = MMC_I_MASK_ALL; -+ complete( &hostdata->completion ); -+ return; -+} -+ -+#ifndef PIO -+static void pxa_mmc_dma_irq( int irq, void *dev_id, struct pt_regs *regs ) -+{ -+ mmc_controller_t ctrlr = (mmc_controller_t)dev_id; -+ pxa_mmc_hostdata_t hostdata = (pxa_mmc_hostdata_t)ctrlr->host_data; -+ u32 dcsr; -+ u32 ddadr; -+ int chan = hostdata->iobuf.buf.chan; -+ -+ ddadr = DDADR( chan ); -+ dcsr = DCSR( chan ); -+ DCSR( chan ) = dcsr & ~DCSR_STOPIRQEN; -+ -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, -+ "MMC DMA interrupt: chan=%d ddadr=0x%08x " -+ "dcmd=0x%08x dcsr=0x%08x\n", -+ chan, ddadr, DCMD( chan ), dcsr ); -+/* bus error */ -+ if ( dcsr & DCSR_BUSERR ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "bus error on DMA channel %d\n", -+ chan ); -+ pxa_mmc_set_state( ctrlr, PXA_MMC_FSM_ERROR ); -+ goto complete; -+ } -+/* data transfer completed */ -+ if ( dcsr & DCSR_ENDINTR ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "buffer transferred\n" ); -+ pxa_mmc_set_state( ctrlr, PXA_MMC_FSM_END_BUFFER ); -+ goto complete; -+ } -+ return; -+complete: -+ complete( &hostdata->completion ); -+ return; -+} -+#endif -+ -+ -+static int pxa_mmc_init( mmc_controller_t ctrlr ) -+{ -+ int ret = -ENODEV; -+ pxa_mmc_hostdata_t hostdata = (pxa_mmc_hostdata_t)ctrlr->host_data; -+#ifndef PIO -+ register int i; -+ register pxa_dma_desc *desc; -+#endif -+ -+/* hardware initialization */ -+/* I. prepare to transfer data */ -+/* 1. allocate buffer */ -+#ifndef PIO -+ hostdata->iobuf.buf.read_desc = consistent_alloc( GFP_KERNEL, -+ (PXA_MMC_IODATA_SIZE>>5) -+ * sizeof( pxa_dma_desc ), -+ &hostdata->iobuf.buf.read_desc_phys_addr, 0 ); -+ if ( !hostdata->iobuf.buf.read_desc ) { -+ ret = -ENOMEM; -+ goto error; -+ } -+ hostdata->iobuf.buf.write_desc = consistent_alloc( GFP_KERNEL, -+ (PXA_MMC_IODATA_SIZE>>5) -+ * sizeof( pxa_dma_desc ), -+ &hostdata->iobuf.buf.write_desc_phys_addr, 0 ); -+ if ( !hostdata->iobuf.buf.write_desc ) { -+ ret = -ENOMEM; -+ goto error; -+ } -+ hostdata->iobuf.iodata = consistent_alloc( GFP_ATOMIC, -+ PXA_MMC_IODATA_SIZE, -+ &hostdata->iobuf.buf.phys_addr, 0 ); -+#else -+ hostdata->iobuf.iodata = kmalloc( PXA_MMC_IODATA_SIZE, GFP_ATOMIC ); -+#endif -+ if ( !hostdata->iobuf.iodata ) { -+ ret = -ENOMEM; -+ goto error; -+ } -+/* 2. initialize iobuf */ -+ hostdata->iobuf.blksz = PXA_MMC_BLKSZ_MAX; -+ hostdata->iobuf.bufsz = PXA_MMC_IODATA_SIZE; -+ hostdata->iobuf.nob = PXA_MMC_BLOCKS_PER_BUFFER; -+#ifndef PIO -+ /* request DMA channel */ -+ if ( (hostdata->iobuf.buf.chan = pxa_request_dma( "MMC", DMA_PRIO_LOW, -+ pxa_mmc_dma_irq, ctrlr )) < 0 ) { -+ MMC_ERROR( "failed to request DMA channel\n" ); -+ goto error; -+ } -+ -+ DRCMRRXMMC = hostdata->iobuf.buf.chan | DRCMR_MAPVLD; -+ DRCMRTXMMC = hostdata->iobuf.buf.chan | DRCMR_MAPVLD; -+ -+ for ( i = 0; i < ((PXA_MMC_IODATA_SIZE>>5) - 1); i++ ) { -+ desc = &hostdata->iobuf.buf.read_desc[i]; -+ desc->ddadr = hostdata->iobuf.buf.read_desc_phys_addr -+ + ((i + 1) * sizeof( pxa_dma_desc )); -+ desc->dsadr = MMC_RXFIFO_PHYS_ADDR; -+ desc->dtadr = hostdata->iobuf.buf.phys_addr + (i<<5); -+ desc->dcmd = DCMD_FLOWSRC|DCMD_INCTRGADDR -+ |DCMD_WIDTH1|DCMD_BURST32|(1<<5); -+ -+ desc = &hostdata->iobuf.buf.write_desc[i]; -+ desc->ddadr = hostdata->iobuf.buf.write_desc_phys_addr -+ + ((i + 1) * sizeof( pxa_dma_desc )); -+ desc->dsadr = hostdata->iobuf.buf.phys_addr + (i<<5); -+ desc->dtadr = MMC_TXFIFO_PHYS_ADDR; -+ desc->dcmd = DCMD_FLOWTRG|DCMD_INCSRCADDR -+ |DCMD_WIDTH1|DCMD_BURST32|(1<<5); -+ } -+ desc = &hostdata->iobuf.buf.read_desc[i]; -+ desc->ddadr = (hostdata->iobuf.buf.read_desc_phys_addr + -+ (i + 1) * sizeof( pxa_dma_desc))|DDADR_STOP; -+ desc->dsadr = MMC_RXFIFO_PHYS_ADDR; -+ desc->dtadr = hostdata->iobuf.buf.phys_addr + (i<<5); -+ desc->dcmd = DCMD_FLOWSRC|DCMD_INCTRGADDR -+ |DCMD_WIDTH1|DCMD_BURST32|(1<<5); -+ -+ desc = &hostdata->iobuf.buf.write_desc[i]; -+ desc->ddadr = (hostdata->iobuf.buf.write_desc_phys_addr + -+ (i + 1) * sizeof( pxa_dma_desc))|DDADR_STOP; -+ desc->dsadr = hostdata->iobuf.buf.phys_addr + (i<<5); -+ desc->dtadr = MMC_TXFIFO_PHYS_ADDR; -+ desc->dcmd = DCMD_FLOWTRG|DCMD_INCSRCADDR -+ |DCMD_WIDTH1|DCMD_BURST32|(1<<5); -+#endif -+/* II. MMC */ -+/* 1) request irq */ -+ if ( request_irq( IRQ_MMC, pxa_mmc_irq, 0, "MMC", ctrlr ) ) { -+ MMC_ERROR( "failed to request IRQ_MMC\n" ); -+ goto error; -+ } -+ -+/* 2) initialize h/w and ctrlr */ -+ set_GPIO_mode( GPIO6_MMCCLK_MD ); -+ CKEN |= CKEN12_MMC; /* enable MMC unit clock */ -+ -+ ret = 0; -+ goto out; -+error: -+#ifndef PIO -+/* free DMA resources */ -+ if ( hostdata->iobuf.buf.chan >= 0 ) { -+ DRCMRRXMMC = 0; -+ DRCMRTXMMC = 0; -+ pxa_free_dma( hostdata->iobuf.buf.chan ); -+ } -+ if ( hostdata->iobuf.iodata ) -+ consistent_free( hostdata->iobuf.iodata, -+ PXA_MMC_IODATA_SIZE, -+ hostdata->iobuf.buf.phys_addr ); -+ if ( hostdata->iobuf.buf.read_desc ) -+ consistent_free( hostdata->iobuf.buf.read_desc, -+ (PXA_MMC_IODATA_SIZE>>5) -+ * sizeof( pxa_dma_desc ), -+ hostdata->iobuf.buf.read_desc_phys_addr ); -+ if ( hostdata->iobuf.buf.write_desc ) -+ consistent_free( hostdata->iobuf.buf.write_desc, -+ (PXA_MMC_IODATA_SIZE>>5) -+ * sizeof( pxa_dma_desc ), -+ hostdata->iobuf.buf.write_desc_phys_addr ); -+#else -+ kfree( hostdata->iobuf.iodata ); -+#endif -+out: -+ return ret; -+} -+ -+static void pxa_mmc_remove( mmc_controller_t ctrlr ) -+{ -+ pxa_mmc_hostdata_t hostdata = (pxa_mmc_hostdata_t)ctrlr->host_data; -+ -+/* 1) free buffer(s) */ -+#ifndef PIO -+ consistent_free( hostdata->iobuf.iodata, PXA_MMC_IODATA_SIZE, -+ hostdata->iobuf.buf.phys_addr ); -+ consistent_free( hostdata->iobuf.buf.read_desc, -+ (PXA_MMC_IODATA_SIZE>>5) -+ * sizeof( pxa_dma_desc ), -+ hostdata->iobuf.buf.read_desc_phys_addr ); -+ consistent_free( hostdata->iobuf.buf.write_desc, -+ (PXA_MMC_IODATA_SIZE>>5) -+ * sizeof( pxa_dma_desc ), -+ hostdata->iobuf.buf.write_desc_phys_addr ); -+/* 2) release DMA channel */ -+ if ( hostdata->iobuf.buf.chan >= 0 ) { -+ DRCMRRXMMC = 0; -+ DRCMRTXMMC = 0; -+ pxa_free_dma( hostdata->iobuf.buf.chan ); -+ } -+#else -+ kfree( hostdata->iobuf.iodata ); -+#endif -+/* II. MMC */ -+/* 1) release irq */ -+ free_irq( IRQ_MMC, ctrlr ); -+ CKEN &= ~CKEN12_MMC; /* disable MMC unit clock */ -+} -+ -+static int pxa_mmc_probe( mmc_controller_t ctrlr ) -+{ -+ return 1; -+} -+ -+#ifdef CONFIG_PM -+static int pxa_mmc_suspend( mmc_controller_t ctrlr ) -+{ -+ int ret = -EBUSY; -+ pxa_mmc_hostdata_t hostdata = (pxa_mmc_hostdata_t)ctrlr->host_data; -+ -+ MMC_DEBUG( MMC_DEBUG_LEVEL2, "state=%s\n", -+ PXA_MMC_STATE_LABEL( hostdata->state ) ); -+ -+ if ( hostdata->state == PXA_MMC_FSM_IDLE ) { -+ /* save registers */ -+ SAVED_MMC_CLKRT = MMC_CLKRT; -+ SAVED_MMC_RESTO = MMC_RESTO; -+ SAVED_MMC_SPI = MMC_SPI; -+ SAVED_DRCMRRXMMC = DRCMRRXMMC; -+ SAVED_DRCMRTXMMC = DRCMRTXMMC; -+ -+#if 0 /* FIXME */ -+ /* send CMD0 */ -+ if ( (ret = pxa_mmc_stop_bus_clock( ctrlr )) ) -+ goto error; -+ -+ MMC_CMD = CMD(0); /* CMD0 with zero argument */ -+ MMC_ARGH = 0UL; -+ MMC_ARGL = 0UL; -+ MMC_CMDAT = 0UL; -+ -+ MMC_DEBUG( MMC_DEBUG_LEVEL3, "CMD0(0x%04x%04x)\n", 0UL, 0UL ); -+ if ( (ret = pxa_mmc_complete_cmd( ctrlr, MMC_NORESPONSE, -+ FALSE )) ) -+ { -+ ret = -EIO; -+ goto error; -+ } -+#endif -+ -+ set_GPIO_mode( GPIO6_MMCCLK ); -+ CKEN &= ~CKEN12_MMC; /* disable MMC unit clock */ -+ -+ hostdata->suspended = TRUE; -+ ret = 0; -+ } -+error: -+ return ret; -+} -+ -+static void pxa_mmc_resume( mmc_controller_t ctrlr ) -+{ -+ pxa_mmc_hostdata_t hostdata = (pxa_mmc_hostdata_t)ctrlr->host_data; -+ -+ if ( hostdata->suspended == TRUE ) { -+ set_GPIO_mode( GPIO6_MMCCLK_MD ); -+ CKEN |= CKEN12_MMC; /* enable MMC unit clock */ -+ -+ /* restore registers */ -+ MMC_CLKRT = SAVED_MMC_CLKRT; -+ MMC_RESTO = SAVED_MMC_RESTO; -+ MMC_SPI = SAVED_MMC_SPI; -+ DRCMRRXMMC = SAVED_DRCMRRXMMC; -+ DRCMRTXMMC = SAVED_DRCMRTXMMC; -+ -+ hostdata->suspended = FALSE; -+ -+ mmc_update_card_stack( ctrlr->slot ); /* FIXME */ -+ } -+ -+ return; -+} -+#endif -+ -+static mmc_controller_tmpl_rec_t pxa_mmc_controller_tmpl_rec = { -+ owner: THIS_MODULE, -+ name: "PXA250", -+ block_size_max: PXA_MMC_BLKSZ_MAX, -+ nob_max: PXA_MMC_NOB_MAX, -+ probe: pxa_mmc_probe, -+ init: pxa_mmc_init, -+ remove: __devexit_p( pxa_mmc_remove ), -+#ifdef CONFIG_PM -+ suspend: pxa_mmc_suspend, -+ resume: pxa_mmc_resume, -+#endif /* CONFIG_PM */ -+ update_acq: pxa_mmc_update_acq, -+// single_card_acq: pxa_mmc_single_card_acq, -+ init_card_stack: pxa_mmc_init_card_stack, -+ check_card_stack: pxa_mmc_check_card_stack, -+ setup_card: pxa_mmc_setup_card, -+ stream_read: pxa_mmc_stream_read, -+ read_block: pxa_mmc_read_block, -+ read_mblock: pxa_mmc_read_mblock, -+ stream_write: pxa_mmc_stream_write, -+ write_block: pxa_mmc_write_block, -+ write_mblock: pxa_mmc_write_mblock -+ /* TODO -+ sg_io: pxa_mmc_sg_io -+ */ -+ /* TODO: -+ * erase, -+ * write protection, -+ * lock/password management methods -+ */ -+}; -+ -+static int __devinit mmc_pxa_module_init( void ) -+{ -+ int ret = -ENODEV; -+#ifdef CONFIG_ARCH_RAMSES -+ RAMSES_MMC_ON(); -+ udelay(1000); -+#endif -+ -+ host = mmc_register( MMC_REG_TYPE_HOST, &pxa_mmc_controller_tmpl_rec, -+ sizeof( pxa_mmc_hostdata_rec_t ) ); -+ if ( !host ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, -+ "failed to register with MMC core\n" ); -+ goto error; -+ } -+ -+ ret = 0; -+error: -+ return ret; -+} -+ -+static void __devexit mmc_pxa_module_cleanup( void ) -+{ -+ mmc_unregister( MMC_REG_TYPE_HOST, host ); -+#ifdef CONFIG_ARCH_RAMSES -+ RAMSES_MMC_OFF(); -+#endif -+} -+ -+EXPORT_NO_SYMBOLS; -+ -+MODULE_LICENSE( "GPL" ); -+ -+module_init( mmc_pxa_module_init ); -+module_exit( mmc_pxa_module_cleanup ); ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/mmc/mmc_pxa.h 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,278 @@ -+/* -+ * linux/drivers/mmc/mmc_pxa.h -+ * -+ * Author: Vladimir Shebordaev, Igor Oblakov -+ * Copyright: MontaVista Software Inc. -+ * -+ * $Id$ -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ */ -+#ifndef __MMC_PXA_P_H__ -+#define __MMC_PXA_P_H__ -+ -+#include <linux/completion.h> -+ -+#define PIO -+ -+/* PXA-250 MMC controller registers */ -+ -+/* MMC_STRPCL */ -+#define MMC_STRPCL_STOP_CLK (0x0001UL) -+#define MMC_STRPCL_START_CLK (0x0002UL) -+ -+/* MMC_STAT */ -+#define MMC_STAT_END_CMD_RES (0x0001UL << 13) -+#define MMC_STAT_PRG_DONE (0x0001UL << 12) -+#define MMC_STAT_DATA_TRAN_DONE (0x0001UL << 11) -+#define MMC_STAT_CLK_EN (0x0001UL << 8) -+#define MMC_STAT_RECV_FIFO_FULL (0x0001UL << 7) -+#define MMC_STAT_XMIT_FIFO_EMPTY (0x0001UL << 6) -+#define MMC_STAT_RES_CRC_ERROR (0x0001UL << 5) -+#define MMC_STAT_SPI_READ_ERROR_TOKEN (0x0001UL << 4) -+#define MMC_STAT_CRC_READ_ERROR (0x0001UL << 3) -+#define MMC_STAT_CRC_WRITE_ERROR (0x0001UL << 2) -+#define MMC_STAT_TIME_OUT_RESPONSE (0x0001UL << 1) -+#define MMC_STAT_READ_TIME_OUT (0x0001UL) -+ -+#define MMC_STAT_ERRORS (MMC_STAT_RES_CRC_ERROR|MMC_STAT_SPI_READ_ERROR_TOKEN\ -+ |MMC_STAT_CRC_READ_ERROR|MMC_STAT_TIME_OUT_RESPONSE\ -+ |MMC_STAT_READ_TIME_OUT) -+ -+/* MMC_CLKRT */ -+#define MMC_CLKRT_20MHZ (0x0000UL) -+#define MMC_CLKRT_10MHZ (0x0001UL) -+#define MMC_CLKRT_5MHZ (0x0002UL) -+#define MMC_CLKRT_2_5MHZ (0x0003UL) -+#define MMC_CLKRT_1_25MHZ (0x0004UL) -+#define MMC_CLKRT_0_625MHZ (0x0005UL) -+#define MMC_CLKRT_0_3125MHZ (0x0006UL) -+ -+/* MMC_SPI */ -+#define MMC_SPI_DISABLE (0x00UL) -+#define MMC_SPI_EN (0x01UL) -+#define MMC_SPI_CS_EN (0x01UL << 2) -+#define MMC_SPI_CS_ADDRESS (0x01UL << 3) -+#define MMC_SPI_CRC_ON (0x01UL << 1) -+ -+/* MMC_CMDAT */ -+#define MMC_CMDAT_MMC_DMA_EN (0x0001UL << 7) -+#define MMC_CMDAT_INIT (0x0001UL << 6) -+#define MMC_CMDAT_BUSY (0x0001UL << 5) -+#define MMC_CMDAT_STREAM (0x0001UL << 4) -+#define MMC_CMDAT_BLOCK (0x0000UL << 4) -+#define MMC_CMDAT_WRITE (0x0001UL << 3) -+#define MMC_CMDAT_READ (0x0000UL << 3) -+#define MMC_CMDAT_DATA_EN (0x0001UL << 2) -+#define MMC_CMDAT_R1 (0x0001UL) -+#define MMC_CMDAT_R2 (0x0002UL) -+#define MMC_CMDAT_R3 (0x0003UL) -+ -+/* MMC_RESTO */ -+#define MMC_RES_TO_MAX (0x007fUL) /* [6:0] */ -+ -+/* MMC_RDTO */ -+#define MMC_READ_TO_MAX (0x0ffffUL) /* [15:0] */ -+ -+/* MMC_BLKLEN */ -+#define MMC_BLK_LEN_MAX (0x03ffUL) /* [9:0] */ -+ -+/* MMC_PRTBUF */ -+#define MMC_PRTBUF_BUF_PART_FULL (0x01UL) -+#define MMC_PRTBUF_BUF_FULL (0x00UL ) -+ -+/* MMC_I_MASK */ -+#define MMC_I_MASK_TXFIFO_WR_REQ (0x01UL << 6) -+#define MMC_I_MASK_RXFIFO_RD_REQ (0x01UL << 5) -+#define MMC_I_MASK_CLK_IS_OFF (0x01UL << 4) -+#define MMC_I_MASK_STOP_CMD (0x01UL << 3) -+#define MMC_I_MASK_END_CMD_RES (0x01UL << 2) -+#define MMC_I_MASK_PRG_DONE (0x01UL << 1) -+#define MMC_I_MASK_DATA_TRAN_DONE (0x01UL) -+#define MMC_I_MASK_ALL (0x07fUL) -+ -+ -+/* MMC_I_REG */ -+#define MMC_I_REG_TXFIFO_WR_REQ (0x01UL << 6) -+#define MMC_I_REG_RXFIFO_RD_REQ (0x01UL << 5) -+#define MMC_I_REG_CLK_IS_OFF (0x01UL << 4) -+#define MMC_I_REG_STOP_CMD (0x01UL << 3) -+#define MMC_I_REG_END_CMD_RES (0x01UL << 2) -+#define MMC_I_REG_PRG_DONE (0x01UL << 1) -+#define MMC_I_REG_DATA_TRAN_DONE (0x01UL) -+#define MMC_I_REG_ALL (0x007fUL) -+ -+/* MMC_CMD */ -+#define MMC_CMD_INDEX_MAX (0x006fUL) /* [5:0] */ -+#define CMD(x) (x) -+ -+/* MMC_ARGH */ -+/* MMC_ARGL */ -+/* MMC_RES */ -+/* MMC_RXFIFO */ -+#define MMC_RXFIFO_PHYS_ADDR 0x41100040 //MMC_RXFIFO physical address -+/* MMC_TXFIFO */ -+#define MMC_TXFIFO_PHYS_ADDR 0x41100044 //MMC_TXFIFO physical address -+ -+/* implementation specific declarations */ -+#define PXA_MMC_BLKSZ_MAX (1<<9) /* actually 1023 */ -+#define PXA_MMC_NOB_MAX ((1<<16)-2) -+#define PXA_MMC_BLOCKS_PER_BUFFER (2) -+ -+#define PXA_MMC_IODATA_SIZE (PXA_MMC_BLOCKS_PER_BUFFER*PXA_MMC_BLKSZ_MAX) /* 1K */ -+ -+typedef enum _pxa_mmc_fsm { /* command processing FSM */ -+ PXA_MMC_FSM_IDLE = 1, -+ PXA_MMC_FSM_CLK_OFF, -+ PXA_MMC_FSM_END_CMD, -+ PXA_MMC_FSM_BUFFER_IN_TRANSIT, -+ PXA_MMC_FSM_END_BUFFER, -+ PXA_MMC_FSM_END_IO, -+ PXA_MMC_FSM_END_PRG, -+ PXA_MMC_FSM_ERROR -+} pxa_mmc_state_t; -+ -+#define PXA_MMC_STATE_LABEL( state ) (\ -+ (state == PXA_MMC_FSM_IDLE) ? "IDLE" :\ -+ (state == PXA_MMC_FSM_CLK_OFF) ? "CLK_OFF" :\ -+ (state == PXA_MMC_FSM_END_CMD) ? "END_CMD" :\ -+ (state == PXA_MMC_FSM_BUFFER_IN_TRANSIT) ? "IN_TRANSIT" :\ -+ (state == PXA_MMC_FSM_END_BUFFER) ? "END_BUFFER" :\ -+ (state == PXA_MMC_FSM_END_IO) ? "END_IO" :\ -+ (state == PXA_MMC_FSM_END_PRG) ? "END_PRG" : "UNKNOWN" ) -+ -+typedef enum _pxa_mmc_result { -+ PXA_MMC_NORMAL = 0, -+ PXA_MMC_INVALID_STATE = -1, -+ PXA_MMC_TIMEOUT = -2, -+ PXA_MMC_ERROR = -3 -+} pxa_mmc_result_t; -+ -+typedef u32 pxa_mmc_clkrt_t; -+ -+typedef char *pxa_mmc_iodata_t; -+#ifdef PIO -+typedef struct _pxa_mmc_piobuf_rec { -+ char *pos; /* current buffer position */ -+ int cnt; /* byte counter */ -+} pxa_mmc_piobuf_rec_t, *pxa_mmc_piobuf_t; -+#else /* i.e. DMA */ -+typedef struct _pxa_mmc_dmabuf_rec { /* TODO: buffer ring, DMA irq completion */ -+ int chan; /* dma channel no */ -+ dma_addr_t phys_addr; /* iodata physical address */ -+ pxa_dma_desc *read_desc; /* input descriptor array virtual address */ -+ pxa_dma_desc *write_desc; /* output descriptor array virtual address */ -+ dma_addr_t read_desc_phys_addr; /* descriptor array physical address */ -+ dma_addr_t write_desc_phys_addr; /* descriptor array physical address */ -+ pxa_dma_desc *last_read_desc; /* last input descriptor -+ * used by the previous transfer -+ */ -+ pxa_dma_desc *last_write_desc; /* last output descriptor -+ * used by the previous transfer -+ */ -+} pxa_mmc_dmabuf_rec_t, *pxa_mmc_dmabuf_t; -+#endif -+ -+typedef struct _pxa_mmc_iobuf_rec { -+ ssize_t blksz; /* current block size in bytes */ -+ ssize_t bufsz; /* buffer size for each transfer */ -+ ssize_t nob; /* number of blocks pers buffer */ -+#ifndef PIO -+ pxa_mmc_dmabuf_rec_t buf; /* i.e. DMA buffer ring on the iodata */ -+#else /* i.e. DMA */ -+ pxa_mmc_piobuf_rec_t buf; /* PIO buffer accounting */ -+#endif -+ pxa_mmc_iodata_t iodata; /* I/O data buffer */ -+} pxa_mmc_iobuf_rec_t, *pxa_mmc_iobuf_t; -+ -+typedef struct _pxa_mmc_hostdata_rec { -+ pxa_mmc_state_t state; /* FSM */ -+#ifdef CONFIG_PM -+ int suspended; -+#endif -+ pxa_mmc_iobuf_rec_t iobuf; /* data transfer state */ -+ -+ int busy; /* atomic busy flag */ -+ struct completion completion; /* completion */ -+#if CONFIG_MMC_DEBUG_IRQ -+ int irqcnt; -+ int timeo; -+#endif -+ -+/* cached controller state */ -+ u32 mmc_i_reg; /* interrupt last requested */ -+ u32 mmc_i_mask; /* mask to be set by intr handler */ -+ u32 mmc_stat; /* status register at the last intr */ -+ u32 mmc_cmdat; /* MMC_CMDAT at the last inr */ -+ u8 mmc_res[16]; /* response to the last command in host order */ -+ u32 saved_mmc_clkrt; -+ u32 saved_mmc_resto; -+ u32 saved_mmc_spi; -+ u32 saved_drcmrrxmmc; -+ u32 saved_drcmrtxmmc; -+ -+/* controller options */ -+ pxa_mmc_clkrt_t clkrt; /* current bus clock rate */ -+} pxa_mmc_hostdata_rec_t, *pxa_mmc_hostdata_t; -+ -+#define PXA_MMC_STATUS( ctrlr ) (((pxa_mmc_hostdata_t)ctrlr->host_data)->mmc_stat) -+#define PXA_MMC_RESPONSE( ctrlr, idx ) ((((pxa_mmc_hostdata_t)ctrlr->host_data)->mmc_res)[idx]) -+#define PXA_MMC_CLKRT( ctrlr ) (((pxa_mmc_hostdata_t)ctrlr->host_data)->clkrt) -+ -+#define SAVED_MMC_CLKRT (hostdata->saved_mmc_clkrt) -+#define SAVED_MMC_RESTO (hostdata->saved_mmc_resto) -+#define SAVED_MMC_SPI (hostdata->saved_mmc_spi) -+#define SAVED_DRCMRRXMMC (hostdata->saved_drcmrrxmmc ) -+#define SAVED_DRCMRTXMMC (hostdata->saved_drcmrtxmmc ) -+ -+static inline int pxa_mmc_clkrt( int speed ) -+{ -+ return MMC_CLKRT_20MHZ; /* TODO */ -+} -+ -+/* PXA MMC controller specific card data */ -+typedef struct _pxa_mmc_card_data_rec { -+ pxa_mmc_clkrt_t clkrt; /* clock rate to be set for the card */ -+} pxa_mmc_card_data_rec_t, *pxa_mmc_card_data_t; -+ -+#ifdef CONFIG_MMC_DEBUG -+#undef MMC_DUMP_R1 -+#undef MMC_DUMP_R2 -+#undef MMC_DUMP_R3 -+#define MMC_DUMP_R2( ctrlr ) MMC_DEBUG( MMC_DEBUG_LEVEL3, \ -+"R2 response: %02x %02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x\n", \ -+PXA_MMC_RESPONSE( ctrlr, 15 ), \ -+PXA_MMC_RESPONSE( ctrlr, 14 ), \ -+PXA_MMC_RESPONSE( ctrlr, 13 ), \ -+PXA_MMC_RESPONSE( ctrlr, 12 ), \ -+PXA_MMC_RESPONSE( ctrlr, 11 ), \ -+PXA_MMC_RESPONSE( ctrlr, 10 ), \ -+PXA_MMC_RESPONSE( ctrlr, 9 ), \ -+PXA_MMC_RESPONSE( ctrlr, 8 ), \ -+PXA_MMC_RESPONSE( ctrlr, 7 ), \ -+PXA_MMC_RESPONSE( ctrlr, 6 ), \ -+PXA_MMC_RESPONSE( ctrlr, 5 ), \ -+PXA_MMC_RESPONSE( ctrlr, 4 ), \ -+PXA_MMC_RESPONSE( ctrlr, 3 ), \ -+PXA_MMC_RESPONSE( ctrlr, 2 ), \ -+PXA_MMC_RESPONSE( ctrlr, 1 ), \ -+PXA_MMC_RESPONSE( ctrlr, 0 ) ); -+#define MMC_DUMP_R1( ctrlr ) MMC_DEBUG( MMC_DEBUG_LEVEL3, \ -+"R1(b) response: %02x %02x%02x%02x%02x\n", \ -+PXA_MMC_RESPONSE( ctrlr, 5 ), \ -+PXA_MMC_RESPONSE( ctrlr, 4 ), \ -+PXA_MMC_RESPONSE( ctrlr, 3 ), \ -+PXA_MMC_RESPONSE( ctrlr, 2 ), \ -+PXA_MMC_RESPONSE( ctrlr, 1 ) ); -+#define MMC_DUMP_R3( ctrlr ) MMC_DEBUG( MMC_DEBUG_LEVEL3, \ -+"R3 response: %02x %02x%02x%02x%02x\n", \ -+PXA_MMC_RESPONSE( ctrlr, 5 ), \ -+PXA_MMC_RESPONSE( ctrlr, 4 ), \ -+PXA_MMC_RESPONSE( ctrlr, 3 ), \ -+PXA_MMC_RESPONSE( ctrlr, 2 ), \ -+PXA_MMC_RESPONSE( ctrlr, 1 ) ); -+ -+#endif -+#endif /* __MMC_PXA_P_H__ */ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/mmc/mmc_test.c 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,538 @@ -+/* -+ * linux/drivers/mmc/mmc_test.c -+ * -+ * Author: Vladimir Shebordaev -+ * Copyright: MontaVista Software Inc. -+ * -+ * $Id$ -+ * -+ * 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/version.h> -+#include <linux/config.h> -+#include <linux/types.h> -+#include <linux/init.h> -+#include <linux/module.h> -+#include <linux/errno.h> -+ -+#include <linux/fs.h> -+#ifdef CONFIG_DEVFS_FS -+#include <linux/devfs_fs_kernel.h> -+#endif -+ -+#include <asm/uaccess.h> -+ -+#include <mmc/types.h> -+#include <mmc/mmc.h> -+#include <mmc/ioctl.h> -+ -+#include "types.h" -+#include "mmc.h" -+ -+typedef struct _mmc_test_device_rec mmc_test_device_rec_t; -+typedef struct _mmc_test_device_rec *mmc_test_device_t; -+ -+struct _mmc_test_device_rec { -+ mmc_card_t card; -+ mmc_transfer_mode_t transfer_mode; -+ int usage; -+#ifdef CONFIG_DEVFS_FS -+ devfs_handle_t devfs_handle; -+#endif -+}; -+ -+/* MMC device table */ -+static mmc_test_device_rec_t mmc_test_device[MMC_CONTROLLERS_MAX][MMC_CARDS_MAX]; -+static DECLARE_MUTEX(mmc_test_device_mutex); -+ -+static inline mmc_test_device_t __mmc_test_get_device( kdev_t rdev ) -+{ -+ mmc_test_device_t ret = NULL; -+ u8 minor = MINOR( rdev ); -+ int host_no, card_no; -+ -+ host_no = minor >> MMC_MINOR_HOST_SHIFT; -+ if ( host_no >= MMC_CONTROLLERS_MAX ) -+ goto error; -+ -+ card_no = minor & MMC_MINOR_CARD_MASK; -+ if ( card_no >= MMC_CARDS_MAX ) -+ goto error; -+ -+ ret = &mmc_test_device[host_no][card_no]; -+ if ( !ret->card ) { -+ ret->card = mmc_get_card( host_no, card_no ); -+ if ( !ret->card ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, "failed to get card: host=%d, card=%d\n", host_no, card_no ); -+ ret = NULL; -+ goto error; -+ } -+ -+ } -+ ++ret->usage; -+ -+error: -+ return ret; -+} -+ -+static inline void __mmc_test_put_device( mmc_test_device_t dev ) -+{ -+ mmc_put_card( dev->card ); -+ --dev->usage; -+} -+ -+static inline mmc_test_device_t mmc_test_get_device( kdev_t kdev ) -+{ -+ mmc_test_device_t ret = NULL; -+ -+ down( &mmc_test_device_mutex ); -+ ret = __mmc_test_get_device( kdev ); -+ up( &mmc_test_device_mutex ); -+ -+ return ret; -+} -+ -+static inline void mmc_test_put_device( mmc_test_device_t dev ) -+{ -+ if ( dev ) { -+ down( &mmc_test_device_mutex ); -+ __mmc_test_put_device( dev ); -+ if ( !dev->usage ) { -+ if ( dev->card ) { -+ if ( dev->card->usage ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, -+ "broken card reference\n" ); -+ } -+ memset( dev, 0, sizeof( mmc_test_device_rec_t ) ); -+ } -+ } -+ up( &mmc_test_device_mutex ); -+ } -+} -+ -+static inline int mmc_test_set_transfer_mode( mmc_test_device_t dev, mmc_transfer_mode_t mode ) -+{ -+ int ret = -1; -+ -+ if ( dev ) { -+ down( &mmc_test_device_mutex ); -+ dev->transfer_mode = mode; -+ ret = 0; -+ up( &mmc_test_device_mutex ); -+ } -+ return ret; -+} -+ -+static inline mmc_transfer_mode_t mmc_test_get_transfer_mode( mmc_test_device_t dev ) -+{ -+ mmc_transfer_mode_t ret = MMC_TRANSFER_MODE_UNDEFINED; -+ -+ if ( dev ) { -+ down( &mmc_test_device_mutex ); -+ ret = dev->transfer_mode; -+ up( &mmc_test_device_mutex ); -+ } -+ return ret; -+} -+ -+static int mmc_test_open( struct inode *inode, struct file *file ) -+{ -+ int ret = -ENODEV; -+ mmc_test_device_t dev = NULL; -+ -+ MOD_INC_USE_COUNT; -+ -+ __ENTER0( ); -+ dev = mmc_test_get_device( inode->i_rdev ); -+ if ( !dev || !dev->card ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, "failed to acquire device\n" ); -+ goto error; -+ } -+ -+ if ( dev->card->usage > 1 ) { -+ ret = -EBUSY; -+ goto error; -+ } -+ -+ dev->transfer_mode = MMC_TEST_TRANSFER_MODE_DEFAULT; /* FIXME: should check card CCC */ -+ file->private_data = dev; -+ -+ __LEAVE0( ); -+ return 0; -+error: -+ MOD_DEC_USE_COUNT; -+ mmc_test_put_device( dev ); -+ __LEAVE( "ret=%d", ret ); -+ return ret; -+} -+ -+static int mmc_test_release( struct inode *inode, struct file *file ) -+{ -+ int ret = -ENODEV; -+ mmc_test_device_t dev = (mmc_test_device_t)file->private_data; -+ -+ if ( !dev ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, "file->private_data == NULL\n" ); -+ goto error; -+ } -+ -+ __ENTER( "host=%d, card=%d", dev->card->ctrlr->slot, dev->card->slot ); -+ -+ file->private_data = NULL; -+ -+ mmc_test_put_device( dev ); -+ MOD_DEC_USE_COUNT; -+ -+ ret = 0; -+error: -+ __LEAVE( "ret=%d", ret ); -+ return ret; -+} -+ -+static ssize_t mmc_test_read( struct file *file, char *buf, size_t size, loff_t *ppos ) -+{ -+ ssize_t ret = -ENODEV; -+ ssize_t retsize = 0; -+ mmc_test_device_t dev = (mmc_test_device_t)file->private_data; -+ -+ __ENTER( "host=%d, card=%d, size=%d", dev->card->ctrlr->slot, dev->card->slot, size ); -+ -+ if ( !dev ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, "file->private_data == NULL\n" ); -+ goto error; -+ } -+ -+ switch ( dev->transfer_mode ) { -+ char *mbuf; -+ -+ case MMC_TRANSFER_MODE_BLOCK_SINGLE: -+ mbuf = kmalloc( 512, GFP_ATOMIC ); /* FIXME: actual read_bl_len or ctrlr->block_size_max whichever is less ), GFP_KERNEL */ -+ if ( !mbuf ) { -+ ret = -ENOMEM; -+ goto error; -+ } -+ -+ while( size > 0 ) { -+ int lsize = (size > 512) ? 512 : size; -+ -+ MMC_DEBUG( MMC_DEBUG_LEVEL4, -+ "before mmc_read mbuf=0x%x " -+ "lsize=%d ppos=0x%x *ppos=%d\n", -+ mbuf, lsize, ppos, *ppos ); -+ ret = mmc_read( dev->card, -+ MMC_TRANSFER_MODE_BLOCK_SINGLE, -+ mbuf, lsize, ppos ); -+ if ( ret <= 0 ) -+ break; -+ -+ /* Copy to user */ -+ if ( copy_to_user( buf, mbuf, ret ) ) { -+ ret = -EFAULT; -+ break; -+ } -+ retsize += ret; -+ buf += ret; -+ size -= ret; -+ } -+ -+ if ( retsize > 0 ) -+ ret = retsize; -+ kfree(mbuf); -+ break; -+ -+ case MMC_TRANSFER_MODE_BLOCK_MULTIPLE: -+ mbuf = kmalloc( 1024, GFP_ATOMIC ); /* FIXME */ -+ if ( !mbuf ) { -+ ret = -ENOMEM; -+ goto error; -+ } -+ -+ while( size > 0 ) { -+ int lsize = (size > 1024) ? 1024 : size; -+ -+ MMC_DEBUG( MMC_DEBUG_LEVEL4, -+ "before mmc_read mbuf=0x%x " -+ "lsize=%d ppos=0x%x *ppos=%d\n", -+ mbuf, lsize, ppos, *ppos ); -+ ret = mmc_read( dev->card, -+ MMC_TRANSFER_MODE_BLOCK_MULTIPLE, -+ mbuf, lsize, ppos ); -+ if ( ret <= 0 ) -+ break; -+ -+ /* Copy to user */ -+ if ( copy_to_user( buf, mbuf, ret ) ) { -+ ret = -EFAULT; -+ break; -+ } -+ retsize += ret; -+ buf += ret; -+ size -= ret; -+ } -+ -+ if ( retsize > 0 ) -+ ret = retsize; -+ kfree(mbuf); -+ break; -+ -+ case MMC_TRANSFER_MODE_STREAM: -+ ret = mmc_read( dev->card, dev->transfer_mode, -+ buf, size, ppos ); -+ break; -+ -+ default: -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, "invalid transfer mode\n" ); -+ } -+error: -+ __LEAVE( "ret=%d", ret ); -+ return ret; -+} -+ -+static ssize_t mmc_test_write( struct file *file, const char *buf, size_t size, loff_t *ppos ) -+{ -+ ssize_t ret = -ENODEV; -+ mmc_test_device_t dev = (mmc_test_device_t)file->private_data; -+ int retsize=0; -+ -+ __ENTER( "host=%d, card=%d, size=%d", dev->card->ctrlr->slot, dev->card->slot, size ); -+ -+ if ( !dev ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, "file->private_data == NULL\n" ); -+ goto error; -+ } -+ -+ switch ( dev->transfer_mode ) { -+ char *mbuf; -+ -+ case MMC_TRANSFER_MODE_BLOCK_SINGLE: -+ mbuf = kmalloc( 512, GFP_ATOMIC ); /* FIXME: actual write_bl_len or ctrlr->block_size_max whichever is less, GFP_KERNEL */ -+ if ( !mbuf ) { -+ ret = -ENOMEM; -+ goto error; -+ } -+ -+ while ( size > 0 ) { -+ int lsize = ( size > 512 ) ? 512 : size; -+ -+ /* Copy from user */ -+ if ( copy_from_user( mbuf, buf, lsize ) ) { -+ ret = -EFAULT; -+ break; -+ } -+ -+ ret = mmc_write( dev->card, -+ MMC_TRANSFER_MODE_BLOCK_SINGLE, -+ mbuf, lsize, ppos ); -+ if( ret <= 0 ) -+ break; -+ -+ retsize += ret; -+ buf += ret; -+ size -= ret; -+ } -+ -+ if ( retsize > 0 ) -+ ret = retsize; -+ -+ kfree( mbuf ); -+ break; -+ -+ case MMC_TRANSFER_MODE_BLOCK_MULTIPLE: -+ mbuf = kmalloc( 1024, GFP_ATOMIC ); /* FIXME */ -+ if ( !mbuf ) { -+ ret = -ENOMEM; -+ goto error; -+ } -+ -+ while( size > 0 ) { -+ int lsize = (size > 1024) ? 1024 : size; -+ -+ MMC_DEBUG( MMC_DEBUG_LEVEL4, -+ "before mmc_read mbuf=0x%x " -+ "lsize=%d ppos=0x%x *ppos=%d\n", -+ mbuf, lsize, ppos, *ppos ); -+ ret = mmc_write( dev->card, -+ MMC_TRANSFER_MODE_BLOCK_MULTIPLE, -+ mbuf, lsize, ppos ); -+ if ( ret <= 0 ) -+ break; -+ -+ /* Copy to user */ -+ if ( copy_to_user( (char *)buf, mbuf, ret ) ) { -+ ret = -EFAULT; -+ break; -+ } -+ retsize += ret; -+ buf += ret; -+ size -= ret; -+ } -+ -+ if ( retsize > 0 ) -+ ret = retsize; -+ kfree(mbuf); -+ break; -+ case MMC_TRANSFER_MODE_STREAM: -+ ret = mmc_write( dev->card, dev->transfer_mode, -+ buf, size, ppos ); -+ break; -+ -+ default: -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, "invalid transfer mode\n" ); -+ } -+error: -+ __LEAVE( "ret=%d", ret ); -+ return ret; -+} -+ -+static loff_t mmc_test_llseek( struct file *file, loff_t offset, int origin ) -+{ -+ loff_t ret = -ESPIPE; -+ mmc_test_device_t dev = (mmc_test_device_t)file->private_data; -+ mmc_card_t card; -+ -+ if ( !dev ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, "file->private_data == NULL\n" ); -+ ret = -ENODEV; -+ goto error; -+ } -+ -+ __ENTER( "host=%d, card=%d, off=%ld, orig=%d", dev->card->ctrlr->slot, dev->card->slot, (long)offset, origin ); -+ -+ card = dev->card; -+ -+ switch ( origin ) { -+ case SEEK_CUR: -+ file->f_pos += offset; -+ break; -+ -+ case SEEK_END: -+ file->f_pos = card->info.capacity + offset; -+ break; -+ -+ case SEEK_SET: -+ file->f_pos = offset; -+ break; -+ -+ default: -+ ret = -EINVAL; -+ goto error; -+ } -+ -+ ret = file->f_pos; -+error: -+ __LEAVE( "ret=%ld", (long)ret ); -+ return ret; -+} -+ -+static int mmc_test_ioctl( struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg ) -+{ -+ int ret = -ENODEV; -+ mmc_test_device_t dev = (mmc_test_device_t)file->private_data; -+ -+ if ( !dev ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, "file->private_data == NULL\n" ); -+ goto error; -+ } -+ -+ switch ( cmd ) { -+ case IOCMMCSTRNSMODE: -+ if ( get_user( ret, (int *)arg ) ) { -+ ret = -EFAULT; -+ goto error; -+ } -+ ret = mmc_test_set_transfer_mode( dev, ret ); -+ break; -+ -+ case IOCMMCGTRNSMODE: -+ ret = mmc_test_get_transfer_mode( dev ); -+ if ( put_user( ret, (int *)arg ) ) -+ ret = -EFAULT; -+ break; -+ -+ default: -+ ret = mmc_ioctl( dev->card, cmd, arg ); -+ } -+ -+error: -+ return ret; -+} -+ -+struct file_operations mmc_test_fops = { -+ owner: THIS_MODULE, -+ open: mmc_test_open, -+ release: mmc_test_release, -+ read: mmc_test_read, -+ write: mmc_test_write, -+ ioctl: mmc_test_ioctl, -+ llseek: mmc_test_llseek -+}; -+ -+#ifdef CONFIG_DEVFS_FS -+static int mmc_test_add_card( mmc_card_t card ) /* TODO */ -+{ -+ int ret = -1; -+ __ENTER( "host=%d, card=%d", card->ctrlr->slot, card->slot ); -+/* TODO: make kdev; register with devfs */ -+ __LEAVE0( ); -+ return ret; -+} -+ -+static int mmc_test_remove_card( mmc_card_t card ) /* TODO */ -+{ -+ int ret = -1; -+ __ENTER( "host=%d, card=%d", card->ctrlr->slot, card->slot ); -+/* TODO: make kdev; unregister with devfs */ -+ __LEAVE0( ); -+ return ret; -+} -+ -+static mmc_notifier_rec_t mmc_test_notifier = { -+ add: mmc_test_add_card, -+ remove: mmc_test_remove_card -+}; -+#endif /* CONFIG_DEVFS_FS */ -+ -+static int __init mmc_test_module_init( void ) -+{ -+ int ret = -ENODEV; -+ -+#ifdef CONFIG_DEVFS_FS -+ if ( !mmc_register( MMC_REG_TYPE_USER, &mmc_test_notifier, 0 ) ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, "failed to register with MMC core\n" ); -+ goto error; -+ } -+#else -+ mmc_register( MMC_REG_TYPE_USER, NULL, 0 ); -+ if ( register_chrdev( MMC_TEST_MAJOR, "mmc_test", &mmc_test_fops ) ) { -+ MMC_DEBUG( MMC_DEBUG_LEVEL0, -+ "failed to request device major number\n" ); -+ mmc_unregister( MMC_REG_TYPE_USER, NULL ); -+ goto error; -+ } -+#endif -+ -+ memset( mmc_test_device, 0, sizeof( mmc_test_device ) ); -+ -+ ret = 0; -+error: -+ return ret; -+} -+ -+static void __exit mmc_test_module_cleanup( void ) -+{ -+#ifdef CONFIG_DEVFS_FS -+ mmc_unregister( MMC_REG_TYPE_USER, &mmc_test_notifier ); -+#else -+ mmc_unregister( MMC_REG_TYPE_USER, NULL ); -+ unregister_chrdev( MMC_TEST_MAJOR, "mmc_test" ); -+#endif -+} -+ -+EXPORT_NO_SYMBOLS; -+ -+module_init( mmc_test_module_init ); -+module_exit( mmc_test_module_cleanup ); -+ -+MODULE_LICENSE("GPL"); ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/mmc/pm_test.c 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,29 @@ -+/* Power Managment Test Module. RTSoft Co. 2002 */ -+ -+/* The necessary header files */ -+ -+/* Standard in kernel modules */ -+#include <linux/kernel.h> /* We're doing kernel work */ -+#include <linux/module.h> /* Specifically, a module */ -+#define CONFIG_PM -+#include <linux/pm.h> -+ -+ -+static int pmdata = -1; -+ -+/* Initialize the module - register the proc file */ -+ -+int init_module() -+{ -+ pm_send_all(PM_SUSPEND,&pmdata); -+ return(0); -+} -+ -+ -+/* Cleanup - unregister our file from /proc */ -+void cleanup_module() -+{ -+ pm_send_all(PM_RESUME,NULL); -+} -+ -+MODULE_LICENSE( "GPL" ); ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/mmc/types.h 2004-03-31 17:15:11.000000000 +0200 -@@ -0,0 +1,59 @@ -+/* -+ * linux/drivers/mmc/types.h -+ * -+ * Author: Vladimir Shebordaev -+ * Copyright: MontaVista Software Inc. -+ * -+ * $Id$ -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ */ -+#ifndef __MMC_TYPES_P_H__ -+#define __MMC_TYPES_P_H__ -+ -+#ifdef __KERNEL__ -+#include <linux/kdev_t.h> -+ -+typedef enum _mmc_reg_type mmc_reg_type_t; -+typedef enum _mmc_response mmc_response_fmt_t; -+ -+/* MMC card private description */ -+typedef struct _mmc_card_rec mmc_card_rec_t; -+typedef struct _mmc_card_rec *mmc_card_t; -+typedef enum _mmc_dir mmc_dir_t; -+typedef enum _mmc_buftype mmc_buftype_t; -+ -+/* notifier declarations */ -+typedef struct _mmc_notifier_rec mmc_notifier_rec_t; -+typedef struct _mmc_notifier_rec *mmc_notifier_t; -+ -+typedef int (*mmc_notifier_fn_t) ( mmc_card_t ); -+ -+/* MMC card stack */ -+typedef struct _mmc_card_stack_rec mmc_card_stack_rec_t; -+typedef struct _mmc_card_stack_rec *mmc_card_stack_t; -+ -+typedef struct _mmc_data_transfer_req_rec mmc_data_transfer_req_rec_t; -+typedef struct _mmc_data_transfer_req_rec *mmc_data_transfer_req_t; -+ -+/* MMC controller */ -+typedef struct _mmc_controller_tmpl_rec mmc_controller_tmpl_rec_t; -+typedef struct _mmc_controller_tmpl_rec *mmc_controller_tmpl_t; -+ -+typedef enum _mmc_controller_state mmc_controller_state_t; -+typedef struct _mmc_controller_rec mmc_controller_rec_t; -+typedef struct _mmc_controller_rec *mmc_controller_t; -+ -+/* various kernel types */ -+typedef struct semaphore semaphore_t; -+typedef struct rw_semaphore rwsemaphore_t; -+typedef struct proc_dir_entry proc_dir_entry_rec_t; -+typedef struct proc_dir_entry *proc_dir_entry_t; -+typedef struct gendisk gendisk_rec_t; -+typedef struct gendisk *gendisk_t; -+#endif /* __KERNEL__ */ -+ -+#endif /* __MMC_TYPES_P_H__ */ -+ ---- linux-2.4.25/drivers/net/Config.in~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/drivers/net/Config.in 2004-03-31 17:15:11.000000000 +0200 -@@ -125,6 +125,7 @@ - dep_tristate ' SMC Ultra support' CONFIG_ULTRA $CONFIG_ISA - dep_tristate ' SMC Ultra32 EISA support' CONFIG_ULTRA32 $CONFIG_EISA - dep_tristate ' SMC 9194 support' CONFIG_SMC9194 $CONFIG_ISA -+ tristate ' SMC 91C9x/91C1xx support' CONFIG_SMC91X - fi - bool ' Racal-Interlan (Micom) NI cards' CONFIG_NET_VENDOR_RACAL - if [ "$CONFIG_NET_VENDOR_RACAL" = "y" ]; then ---- linux-2.4.25/drivers/net/Makefile~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/drivers/net/Makefile 2004-03-31 17:15:11.000000000 +0200 -@@ -137,6 +137,7 @@ - obj-$(CONFIG_SK_G16) += sk_g16.o - obj-$(CONFIG_HP100) += hp100.o - obj-$(CONFIG_SMC9194) += smc9194.o -+obj-$(CONFIG_SMC91X) += smc91x.o - obj-$(CONFIG_ARM_AM79C961A) += am79c961a.o - obj-$(CONFIG_ARM_ETHERH) += 8390.o - obj-$(CONFIG_WD80x3) += wd.o 8390.o ---- linux-2.4.25/drivers/net/cirrus.c~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/drivers/net/cirrus.c 2004-03-31 17:15:11.000000000 +0200 -@@ -67,6 +67,9 @@ - #elif CONFIG_ARCH_CDB89712 - # define CIRRUS_DEFAULT_IO ETHER_BASE + 0x300 - # define CIRRUS_DEFAULT_IRQ IRQ_EINT3 -+#elif CONFIG_ARCH_CSB226 -+# define CIRRUS_DEFAULT_IO 0xF8000000 -+# define CIRRUS_DEFAULT_IRQ IRQ_GPIO(14) - #else - # define CIRRUS_DEFAULT_IO 0 - # define CIRRUS_DEFAULT_IRQ 0 ---- linux-2.4.25/drivers/net/irda/Config.in~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/drivers/net/irda/Config.in 2004-03-31 17:15:11.000000000 +0200 -@@ -42,5 +42,7 @@ - if [ "$CONFIG_ARCH_SA1100" = "y" ]; then - dep_tristate 'SA1100 Internal IR' CONFIG_SA1100_FIR $CONFIG_IRDA $CONFIG_EXPERIMENTAL - fi -- -+if [ "$CONFIG_ARCH_PXA" = "y" ]; then -+ dep_tristate 'Intel PXA2xx Internal IR' CONFIG_PXA_FIR $CONFIG_IRDA $CONFIG_EXPERIMENTAL -+fi - endmenu ---- linux-2.4.25/drivers/net/irda/Makefile~2.4.25-vrs2-pxa1.patch 2004-02-18 14:36:31.000000000 +0100 -+++ linux-2.4.25/drivers/net/irda/Makefile 2004-03-31 17:15:12.000000000 +0200 -@@ -16,6 +16,7 @@ - obj-$(CONFIG_USB_IRDA) += irda-usb.o - obj-$(CONFIG_NSC_FIR) += nsc-ircc.o - obj-$(CONFIG_WINBOND_FIR) += w83977af_ir.o -+obj-$(CONFIG_PXA_FIR) += pxa_ir.o - obj-$(CONFIG_SA1100_FIR) += sa1100_ir.o - obj-$(CONFIG_TOSHIBA_OLD) += toshoboe.o - obj-$(CONFIG_TOSHIBA_FIR) += donauboe.o ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/net/irda/pxa_ir.c 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,1545 @@ -+/* -+ * linux/drivers/net/irda/pxa_ir.c -+ * -+ * Author: -+ * Alexey Lugovskoy RTSoft. -+ * lugovskoy@rtsoft.msk.ru -+ * -+ * Dmitrij Frasenyak RTSoft. -+ * sed@mipt.sw.ru -+ * -+ * 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. -+ * -+ * Infra-red SIR and FIR driver for the PXA 210/250 embedded microprocessors -+ * Based on linux/drivers/net/irda/sa1100_ir.c -+ * -+ */ -+ -+ -+#include <linux/config.h> -+#include <linux/module.h> -+#include <linux/types.h> -+#include <linux/init.h> -+#include <linux/errno.h> -+#include <linux/netdevice.h> -+#include <linux/slab.h> -+#include <linux/rtnetlink.h> -+#include <linux/interrupt.h> -+#include <linux/delay.h> -+#include <linux/ioport.h> -+#include <linux/delay.h> -+ -+#include <linux/pm.h> -+ -+#include <net/irda/irda.h> -+#include <net/irda/irmod.h> -+#include <net/irda/wrapper.h> -+#include <net/irda/irda_device.h> -+ -+#include <asm/irq.h> -+#include <asm/dma.h> -+#include <asm/hardware.h> -+#include <asm/mach-types.h> -+#include <asm/arch/lubbock.h> -+ -+ -+static int rx_count = 0; -+static int tx_count = 0; -+ -+/* -+ * Our netdevice. There is only ever one of these. -+ */ -+ -+static struct net_device *netdev; -+ -+struct pxa250_irda { -+ -+ unsigned char open; -+ -+ int speed; -+ int newspeed; -+ -+ struct sk_buff *txskb; -+ struct sk_buff *rxskb; -+ -+ -+ /* => FIR */ -+ unsigned int fir_irq; -+ int txdma_ch; -+ int rxdma_ch; -+ dma_addr_t txbuf_dma; -+ dma_addr_t rxbuf_dma; -+ void* txbuf_dma_virt; -+ void* rxbuf_dma_virt; -+ /* <= FIR*/ -+ struct net_device_stats stats; -+ struct irlap_cb *irlap; -+ struct pm_dev *pmdev; -+ struct qos_info qos; -+ -+ /* => SIR */ -+ iobuff_t tx_buff; -+ iobuff_t rx_buff; -+ /* <= SIR */ -+}; -+ -+#define IS_FIR(si) ((si)->speed >= 4000000) -+ -+#define HPSIR_MAX_RXLEN 2050 -+#define HPSIR_MAX_TXLEN 2050 -+#define TXBUFF_MAX_SIZE HPSIR_MAX_TXLEN -+#define SET_SIR_MODE STISR = STISR_RCVEIR | STISR_XMITIR | STISR_XMODE -+ -+/* -+ * If you want to disable debug information -+ * please uncomment line bellow -+ */ -+ -+#define PXA_FIR_DUMP_ENABLE -+#undef PXA_FIR_DUMP_ENABLE -+ -+ -+#define PXA_FIR_DEBUG_ENABLE -+#undef PXA_FIR_DEBUG_ENABLE -+ -+#define PXA_FIR_IRQ_DEBUG_ENABLE -+#undef PXA_FIR_IRQ_DEBUG_ENABLE -+ -+#ifdef PXA_FIR_DEBUG_ENABLE -+#define __ECHO_IN printk(KERN_ERR "%s: enter\n",__FUNCTION__); -+#define __ECHO_OUT printk(KERN_ERR "%s: exit\n",__FUNCTION__); -+#define DBG(args...) printk(KERN_ERR __FUNCTION__"():"args); -+#else -+#define __ECHO_IN -+#define __ECHO_OUT -+#define DBG(args...) -+#endif -+ -+#ifdef PXA_FIR_IRQ_DEBUG_ENABLE -+#define DBG_IRQ(args...) printk(KERN_ERR __FUNCTION__"():"args); -+#else -+#define DBG_IRQ(args...) -+#endif -+ -+ -+static int pxa250_irda_set_speed(struct net_device *dev,int speed); -+static void pxa250_start_rx_dma(struct net_device *dev); -+ -+ -+ -+/************************************************************************** -+ * Misc FIR/SIR functions * -+ **************************************************************************/ -+/* -+ * Allocate the receive buffer, unless it is already allocated. -+ */ -+ -+static int pxa250_irda_rx_alloc(struct pxa250_irda *si) -+{ -+ __ECHO_IN; -+ -+ if (si->rxskb) -+ return 0; -+ -+ si->rxskb = alloc_skb(HPSIR_MAX_RXLEN + 1, GFP_ATOMIC); -+ -+ if (!si->rxskb) { -+ printk(KERN_ERR "pxa250_ir: out of memory for RX SKB\n"); -+ return -ENOMEM; -+ } -+ -+ /* -+ * Align any IP headers that may be contained -+ * within the frame. -+ */ -+ skb_reserve(si->rxskb, 1); -+ -+ __ECHO_OUT; -+ -+ return 0; -+} -+ -+ -+ -+/************************************************************************** -+ * FIR * -+ **************************************************************************/ -+ -+ -+ -+ -+static inline void pxa250_dma_stop(int ch) -+{ -+ __ECHO_IN; -+ -+ DCSR(ch) &= ~DCSR_RUN; -+ -+ __ECHO_OUT; -+ -+} -+ -+ -+static void pxa250_ficp_rx_start(void) -+{ -+ ICCR0 = 0; -+ ICCR2 = 1 << 2 | 0 << 3 ; -+ ICCR0 = ICCR0_ITR ; -+ ICCR0 |= ICCR0_RIE | ICCR0_RXE ; -+} -+ -+/* -+ * Change Alternative Function encoding -+ * Enable ICP unit -+ * Disabe STUART unit -+ * Enable IRQ unit clock; -+ * Configure direction of GPIO used by ICP -+ */ -+ -+ -+static void pxa250_do_fir_GPIO_config(void) -+{ -+ /* -+ * Modify GPIO 46 and 47 Alternate Function -+ */ -+ -+ __ECHO_IN; -+ -+ /*Switch AF*/ -+ set_GPIO_mode (GPIO46_ICPRXD_MD); -+ set_GPIO_mode (GPIO47_ICPTXD_MD); -+ -+ if (machine_is_lubbock()) -+ LUB_MISC_WR |= 1 << 4; -+ -+ /*init clock*/ -+ CKEN |= CKEN13_FICP; -+ -+ __ECHO_OUT; -+} -+ -+/* -+ * Low level hardware configuration and startup. -+ */ -+ -+static int pxa250_fir_irda_startup(struct pxa250_irda *si) -+{ -+ -+ __ECHO_IN; -+ -+ /* -+ * Disable STUART -+ */ -+ -+ STIER &= ~IER_UUE; -+ -+ /*Disable STUART FIFO */ -+ STFCR = 0; -+ -+ /* -+ * Do low level configuration for HW AF and clock -+ */ -+ pxa250_do_fir_GPIO_config(); -+ -+ __ECHO_OUT; -+ return 0; -+} -+ -+ -+/* -+ * Aieeeeee .. we should never get here :( -+ */ -+static void pxa250_irda_rxdma_irq(int ch,void *id, struct pt_regs *regs) -+{ -+ struct net_device *dev=id; -+ struct pxa250_irda *si=dev->priv; -+ u_int dcsr; -+ -+ -+ __ECHO_IN; -+ -+ /* -+ * Make sure that irq is our. -+ */ -+ -+ if ( ch != si->rxdma_ch ) -+ /*just*/ return; -+ -+ /* -+ * Check status -+ */ -+ dcsr = DCSR(ch); -+ -+ DBG("DCSR=%x\n",dcsr); -+ -+ if (dcsr & DCSR_STOPSTATE ) -+ { -+ DBG_IRQ("Chanel %d in stop state\n",ch); -+ } -+ -+ if (dcsr & DCSR_BUSERR ) -+ { -+ /* -+ * BUS Error we must restart reception -+ */ -+ -+ DBG("PXA IrDA: bus error interrupt on channel %d\n", ch); -+ DCSR(ch) |= DCSR_BUSERR; -+ } -+ -+ if (dcsr & DCSR_ENDINTR ) -+ { -+ DBG("PXA IrDA: Normal end of dma channel %d - packet to big\n", ch); -+ DCSR(ch) |= DCSR_ENDINTR; -+ } -+ -+ /* no mater what restart rx*/ -+ pxa250_start_rx_dma(dev); -+ -+ return ; -+ -+} -+ -+ -+static void pxa250_irda_txdma_irq(int ch, void *id , struct pt_regs *regs) -+{ -+ struct net_device *dev=id; -+ struct pxa250_irda *si=dev->priv; -+ struct sk_buff *skb = si->txskb; -+ u_int dcsr; -+ -+ -+ __ECHO_IN; -+ DBG_IRQ("transmit\n"); -+ -+ -+ /* -+ * Make sure that irq is our. -+ */ -+ -+ if ( ch != si->txdma_ch ) -+ /*just*/ return; -+ -+ -+ /* -+ * Check status -+ */ -+ dcsr = DCSR(ch); -+ -+ DBG("DCSR=%x",dcsr); -+ -+ if (dcsr & DCSR_STOPSTATE ) -+ { -+ DBG("Chanel %d in stop state\n",ch); -+ } -+ -+ if (dcsr & DCSR_BUSERR ) -+ { -+ DBG("PXA IrDA: bus error interrupt on channel %d\n", ch); -+ DCSR(ch) |= DCSR_BUSERR; -+ si->txskb = NULL; -+ } -+ -+ if (dcsr & DCSR_ENDINTR ) -+ { -+ DBG("PXA IrDA: Normal end of dma channel %d\n", ch); -+ DCSR(ch) |= DCSR_ENDINTR; -+ si->txskb = NULL; -+ } -+ -+ /* -+ * Account and free the packet. -+ */ -+ if (skb) -+ { -+ si->stats.tx_packets ++; -+ si->stats.tx_bytes += skb->len; -+ dev_kfree_skb_irq(skb); -+ } -+ -+ /*Disable transceiver and enable receiver*/ -+ -+ if (si->newspeed) { -+ pxa250_irda_set_speed(dev, si->newspeed); -+ si->newspeed = 0; -+ } -+ -+ while (ICSR1 & ICSR1_TBY) -+ udelay(1); -+ -+ ICCR0 &= ~ICCR0_TXE; -+ -+ -+ enable_irq(si->fir_irq); -+ -+ ICCR0 |= ICCR0_RXE; -+ -+ /* -+ * Make sure that the TX queue is available for sending -+ * (for retries). TX has priority over RX at all times. -+ */ -+ netif_wake_queue(dev); -+ -+ __ECHO_OUT; -+} -+ -+ -+static void pxa250_start_rx_dma(struct net_device *dev) -+{ -+ struct pxa250_irda *si = dev->priv; -+ int ch=si->rxdma_ch; -+ -+ if (!si->rxskb) { -+ DBG("rx buffer went missing\n"); -+/* return; */ -+ } -+ -+ DCSR(ch)=0; -+ DCSR(ch)=DCSR_NODESC; -+ DSADR(ch) = __PREG(ICDR); -+ DTADR(ch) = si->rxbuf_dma; /* phisical address */; -+ -+ /* We should never do END_IRQ. !!!*/ -+ DCMD(ch) = DCMD_ENDIRQEN| DCMD_INCTRGADDR | DCMD_FLOWSRC | DCMD_BURST8 | DCMD_WIDTH1 | HPSIR_MAX_RXLEN; -+ -+ /* -+ * All right information will be available as soon as we set RXE flag -+ */ -+ -+ DCSR(ch) = DCSR_ENDINTR | DCSR_BUSERR; -+ DCSR(ch) = DCSR_RUN | DCSR_NODESC ; -+ -+} -+ -+ -+ -+ -+static int pxa250_get_rx_len(struct pxa250_irda *si) -+{ -+ /* -+ * DMA have to be stoped here -+ */ -+ -+ if ( ! (DCSR(si->rxdma_ch) & DCSR_STOPSTATE) ) -+ printk("warning dma have to be stoped befor counting len\n"); -+ -+ return ( HPSIR_MAX_RXLEN - ( DCMD(si->rxdma_ch) & DCMD_LENGTH ) ); -+ -+} -+ -+static void pxa250_irda_fir_error(struct net_device *dev) -+{ -+ struct pxa250_irda *si = dev->priv; -+ struct sk_buff *skb = si->rxskb; -+ int len; -+ int stat,data; -+ -+ __ECHO_IN; -+ -+ if (!skb) -+ { -+ printk("pxa250 fir_error: SKB is NULL!\n"); -+ return; -+ } -+ -+ /* -+ * Get the current data position. -+ */ -+ -+ len=pxa250_get_rx_len(si); -+ DBG("RXLEN=%d\n",len); -+ memcpy(skb->data, si->rxbuf_dma_virt, len); -+ -+ do { -+ /* -+ * Read Status, and then Data. -+ */ -+ stat = ICSR1; -+ rmb(); -+ data = ICDR; -+ if (stat & (ICSR1_CRE | ICSR1_ROR)) { -+ si->stats.rx_errors++; -+ if (stat & ICSR1_CRE) -+ si->stats.rx_crc_errors++; -+ if (stat & ICSR1_ROR) -+ si->stats.rx_frame_errors++; -+ } else -+ skb->data[len++] = data; -+ -+ /* -+ * If we hit the end of frame, there's -+ * no point in continuing. -+ */ -+ if (stat & ICSR1_EOF) -+ break; -+ } while (ICSR0 & ICSR0_EIF); -+ -+ if (stat & ICSR1_EOF) { -+ si->rxskb = NULL; -+ -+ skb_put(skb, len); -+ skb->dev = dev; -+ skb->mac.raw = skb->data; -+ skb->protocol = htons(ETH_P_IRDA); -+ si->stats.rx_packets++; -+ si->stats.rx_bytes += len; -+ -+ /* -+ * Before we pass the buffer up, allocate a new one. -+ */ -+ -+ si->rxskb = alloc_skb(HPSIR_MAX_RXLEN + 1, GFP_ATOMIC); -+ -+ if (!si->rxskb) { -+ printk(KERN_ERR "pxa250_ir: out of memory for RX SKB\n"); -+ return; -+ } -+ -+ /* -+ * Align any IP headers that may be contained -+ * within the frame. -+ */ -+ skb_reserve(si->rxskb, 1); -+ -+ netif_rx(skb); -+ } -+} -+ -+/* -+ * FIR format interrupt service routine. We only have to -+ * handle RX events; transmit events go via the TX DMA irq handler. -+ * -+ * No matter what, we disable RX, process, and then restart RX. -+ */ -+ -+static void pxa250_irda_fir_irq(int irq, void *dev_id, struct pt_regs *regs) -+{ -+ struct net_device *dev = dev_id; -+ struct pxa250_irda *si = dev->priv; -+ int status; -+ -+ /* -+ * Stop RX -+ */ -+ -+ __ECHO_IN; -+ -+ pxa250_dma_stop(si->rxdma_ch); -+ -+ -+ /* -+ * Framing error - we throw away the packet completely. -+ * Clearing RXE flushes the error conditions and data -+ * from the fifo. -+ */ -+ status=ICSR0; -+ -+ if (status & (ICSR0_FRE | ICSR0_RAB)) { -+ DBG_IRQ("Framing error or RAB\n"); -+ -+ si->stats.rx_errors++; -+ -+ if (ICSR0 & ICSR0_FRE) -+ si->stats.rx_frame_errors++; -+ -+ /* Clear RX fifo -+ * DMA will be cleared when we restart RX -+ * Should we check RNE after that? -+ */ -+ -+ ICCR0 &= ~ICCR0_RXE; -+ -+ /* -+ * Clear selected status bits now, so we -+ * don't miss them next time around. -+ */ -+ ICSR0 = status & (ICSR0_FRE | ICSR0_RAB); -+ } -+ -+ -+ /* -+ * Deal with any receive errors. The any of the lowest -+ * 8 bytes in the FIFO may contain an error. We must read -+ * them one by one. The "error" could even be the end of -+ * packet! -+ */ -+ if (ICSR0 & ICSR0_EIF) -+ pxa250_irda_fir_error(dev); -+ -+ /* -+ * No matter what happens, we must restart reception. -+ */ -+ -+ ICCR0 = 0; -+ pxa250_start_rx_dma(dev); -+ pxa250_ficp_rx_start(); -+ __ECHO_OUT; -+} -+ -+ -+ -+ -+ -+/************************************************************************** -+ * SIR * -+ **************************************************************************/ -+/* -+ * HP-SIR format interrupt service routines. -+ */ -+static void pxa250_sir_transmit(struct net_device *dev) -+{ -+ struct pxa250_irda *si = dev->priv; -+ -+ if (si->tx_buff.len) -+ { -+ /* Disable receiver and enable transmiter*/ -+ -+ -+ -+ STISR &= ~STISR_RCVEIR; -+// STISR |= STISR_XMITIR; -+ -+ -+ -+ disable_irq(dev->irq); -+ -+ do -+ { -+ -+ if (STLSR & LSR_TDRQ) -+ { -+ STTHR = *si->tx_buff.data++; -+ si->tx_buff.len -= 1; -+ -+ tx_count++; -+ } -+ -+ -+ } while (si->tx_buff.len); -+ -+ -+ if (si->tx_buff.len == 0) -+ { -+ -+ -+ si->stats.tx_packets++; -+ si->stats.tx_bytes += si->tx_buff.data - -+ si->tx_buff.head; -+ -+ /* -+ * We need to ensure that the transmitter has -+ * finished. -+ */ -+ -+ do -+ { -+ udelay(1); -+ -+ } -+ while ( ! (STLSR & LSR_TEMT) ); -+ -+ -+ /* -+ -+ * Ok, we've finished transmitting. Now enable -+ * the receiver. Sometimes we get a receive IRQ -+ * immediately after a transmit... -+ */ -+ -+ if (si->newspeed) -+ { -+ pxa250_irda_set_speed(dev, si->newspeed); -+ si->newspeed = 0; -+ } -+ -+ /* I'm hungry! */ -+ netif_wake_queue(dev); -+ } -+ -+ enable_irq (dev->irq); -+ STIER = (IER_RAVIE | IER_UUE | IER_RTIOE); -+ -+ STISR |= STISR_RCVEIR; -+// STISR &= ~STISR_XMITIR; -+ } -+} -+ -+static void pxa250_irda_hpsir_irq(struct net_device *dev) -+{ -+ struct pxa250_irda *si = dev->priv; -+ -+ /* -+ * Deal with any receive errors first. The bytes in error may be -+ * the only bytes in the receive FIFO, so we do this first. -+ */ -+ __ECHO_IN; -+ -+ while (STLSR & LSR_FIFOE) -+ { -+ int stat, data; -+ -+ stat = STLSR; -+ data = STRBR; -+ -+ -+ if (stat & (LSR_FE | LSR_OE | LSR_PE)) -+ -+ { -+ si->stats.rx_errors++; -+ if (stat & LSR_FE) -+ si->stats.rx_frame_errors++; -+ if (stat & LSR_OE) -+ si->stats.rx_fifo_errors++; -+ -+ } else -+ { -+ rx_count++; -+ async_unwrap_char(dev, &si->stats, &si->rx_buff, data); -+ } -+ -+ } -+ -+ /* -+ * We must clear certain bits. -+ */ -+ -+ if (STLSR & (LSR_DR)) -+ { -+ /* -+ * Fifo contains at least 1 character. -+ */ -+ do -+ { -+ int data; -+ -+ data = STRBR; -+ -+ async_unwrap_char(dev, &si->stats, &si->rx_buff, -+ data); /* was Ser2UTDR); Clo */ -+ rx_count++; -+ -+ } while (STLSR & LSR_DR); -+ -+ dev->last_rx = jiffies; -+ } -+ -+ __ECHO_OUT; -+} -+ -+static void pxa250_sir_irda_shutdown(struct pxa250_irda *si) -+{ -+ -+ STIER = 0; -+ STFCR = 0; -+ STISR = 0; -+ CKEN &= ~CKEN5_STUART; -+} -+ -+ -+/************************************************************************************/ -+ -+/*Low level init/uninstall function PM control and IrDA protocol stack registration */ -+ -+/* -+ * Set the IrDA communications speed. -+ * Interrupt have to be disabled here. -+ */ -+ -+static int pxa250_irda_startup(struct net_device *dev) -+{ -+ -+ -+ __ECHO_IN; -+ -+ /* -+ * Ensure that the ports for this device are setup correctly. -+ */ -+ -+ -+ set_GPIO_mode (GPIO46_STRXD_MD); -+ set_GPIO_mode (GPIO47_STTXD_MD); -+ -+ STMCR = MCR_OUT2; -+ STLCR = LCR_WLS1 | LCR_WLS0; -+ -+ SET_SIR_MODE; -+ CKEN |= CKEN5_STUART; -+ /* enable irq from stuart */ -+ ICMR |= ( 1 << 20 ); -+ -+ /*reset FIFO*/ -+ -+/* STFCR = FCR_TRFIFOE | FCR_RESETTF | FCR_RESETRF;// | FCR_ITL_16; -+ -+ STIER = IER_UUE | IER_RAVIE | IER_RTOIE; -+*/ -+ __ECHO_OUT; -+ -+ return 0; -+ -+} -+ -+ -+#ifdef CONFIG_PM -+/* -+ * Suspend the IrDA interface. -+ */ -+ -+static int pxa250_irda_shutdown(struct pxa250_irda *si) -+{ -+ -+ pxa250_sir_irda_shutdown(si); -+ return 0; -+ -+} -+ -+ -+static int pxa250_irda_suspend(struct net_device *dev, int state) -+{ -+ struct pxa250_irda *si = dev->priv; -+ -+ if (si && si->open) { -+ /* -+ * Stop the transmit queue -+ */ -+ if (IS_FIR(si)) -+ return -1; -+ -+ netif_stop_queue(dev); -+ disable_irq(dev->irq); -+ disable_irq(si->fir_irq); -+ pxa250_sir_irda_shutdown(si); -+ } -+ -+ return 0; -+} -+ -+/* -+ * Resume the IrDA interface. -+ */ -+ -+static int pxa250_irda_resume(struct net_device *dev) -+{ -+ struct pxa250_irda *si = dev->priv; -+ -+ __ECHO_IN; -+ -+ if (si && si->open) { -+ /* -+ * If we missed a speed change, initialise at the new speed -+ * directly. It is debatable whether this is actually -+ * required, but in the interests of continuing from where -+ * we left off it is desireable. The converse argument is -+ * that we should re-negotiate at 9600 baud again. -+ */ -+ if (si->newspeed) { -+ si->speed = si->newspeed; -+ si->newspeed = 0; -+ } -+ -+ pxa250_irda_startup(dev); -+ enable_irq(dev->irq); -+ -+ /* -+ * This automatically wakes up the queue -+ */ -+ netif_wake_queue(dev); -+ pxa250_irda_set_speed(dev,si->speed = 9600); -+ -+ } -+ -+ __ECHO_OUT; -+ return 0; -+} -+ -+static int pxa250_irda_pmproc(struct pm_dev *dev, pm_request_t rqst, void *data) -+{ -+ int ret; -+ -+ -+ if (!dev->data) -+ return -EINVAL; -+ -+ -+ switch (rqst) { -+ case PM_SUSPEND: -+ ret = pxa250_irda_suspend((struct net_device *)dev->data, -+ (int)data); -+ break; -+ -+ case PM_RESUME: -+ ret = pxa250_irda_resume((struct net_device *)dev->data); -+ break; -+ -+ default: -+ -+ ret = -EINVAL; -+ break; -+ } -+ -+ return ret; -+} -+#endif -+ -+ -+ -+ -+static void pxa250_irda_irq(int irq, void *dev_id, struct pt_regs *regs) -+{ -+ struct net_device *dev = dev_id; -+ -+ pxa250_irda_hpsir_irq(dev); -+ -+} -+ -+ -+static int pxa250_irda_hard_xmit(struct sk_buff *skb, struct net_device *dev) -+{ -+ struct pxa250_irda *si = dev->priv; -+ int speed = irda_get_next_speed(skb); -+ int mtt; -+ -+ __ECHO_IN; -+ -+ /* -+ * Does this packet contain a request to change the interface -+ * speed? If so, remember it until we complete the transmission -+ * of this frame. -+ */ -+ if (speed != si->speed && speed != -1) -+ si->newspeed = speed; -+ -+ /* -+ * If this is an empty frame, we can bypass a lot. -+ */ -+ if (skb->len == 0) { -+ if (si->newspeed) { -+ si->newspeed = 0; -+ pxa250_irda_set_speed(dev, speed); -+ } -+ dev_kfree_skb(skb); -+ return 0; -+ } -+ -+ -+ DBG("stop queue\n"); -+ netif_stop_queue(dev); -+ -+ if(!IS_FIR(si)) -+ { -+ -+ si->tx_buff.data = si->tx_buff.head; -+ si->tx_buff.len = async_wrap_skb(skb, si->tx_buff.data, -+ si->tx_buff.truesize); -+ -+ -+ pxa250_sir_transmit(dev); -+ -+ -+ -+ dev_kfree_skb(skb); -+ -+ dev->trans_start = jiffies; -+ -+ return 0; -+ } -+ else /* FIR */ -+ { -+ DBG("Enter FIR transmit\n"); -+ /* -+ * We must not be transmitting... -+ */ -+ if (si->txskb) -+ BUG(); -+ -+ disable_irq(si->fir_irq); -+ -+ netif_stop_queue(dev); -+ DBG("queue stoped\n"); -+ si->txskb = skb; -+ -+ /* we could not just map so we'll need some triks */ -+ /* skb->data may be not DMA capable -Sed- */ -+ -+ -+ if (skb->len > TXBUFF_MAX_SIZE) -+ { -+ printk (KERN_ERR "skb data too large\n"); -+ printk (KERN_ERR "len=%d",skb->len); -+ BUG(); -+ } -+ -+ -+ DBG("gonna copy %d bytes to txbuf\n",skb->len); -+ -+ memcpy (si->txbuf_dma_virt, skb->data , skb->len); -+ -+ /* Actual sending ;must not be receiving !!! */ -+ /* Write data and source address */ -+ -+ DBG("ICSR1 & RNE =%d\n",(ICSR1 & ICSR1_RNE) ? 1 : 0 ); -+ -+ /*Disable receiver and enable transifer */ -+ ICCR0 &= ~ICCR0_RXE; -+ -+ if (ICSR1 & ICSR1_TBY) -+ BUG(); -+ -+ ICCR0 |= ICCR0_TXE; -+ -+ DBG("FICP status %x\n",ICSR0); -+ -+ if (0){ -+ int i; -+ -+ DBG("sending packet\n"); -+ for (i=0;i<skb->len;i++) -+ (i % 64) ? printk ("%2x ",skb->data[i]) : printk ("%2x \n",skb->data[i]) ; -+ DBG(" done\n"); -+ -+ } -+ /* -+ * If we have a mean turn-around time, impose the specified -+ * specified delay. We could shorten this by timing from -+ * the point we received the packet. -+ */ -+ -+ mtt = irda_get_mtt(skb); -+ if(mtt) -+ udelay(mtt); -+ -+ DCSR(si->txdma_ch)=0; -+ DCSR(si->txdma_ch)=DCSR_NODESC; -+ DSADR(si->txdma_ch) = si->txbuf_dma; /* phisic address */ -+ DTADR(si->txdma_ch) = __PREG(ICDR); -+ -+ DCMD(si->txdma_ch) = DCMD_ENDIRQEN| DCMD_INCSRCADDR | DCMD_FLOWTRG | DCMD_BURST8 | DCMD_WIDTH1 | skb->len; -+ -+ DCSR(si->txdma_ch) = DCSR_ENDINTR | DCSR_BUSERR; -+ DCSR(si->txdma_ch) = DCSR_RUN | DCSR_NODESC ; -+ -+ DBG("FICP status %x\n",ICSR0); -+ -+ return 0; -+ } -+ -+} -+ -+static int -+pxa250_irda_ioctl(struct net_device *dev, struct ifreq *ifreq, int cmd) -+{ -+ struct if_irda_req *rq = (struct if_irda_req *)ifreq; -+ struct pxa250_irda *si = dev->priv; -+ int ret = -EOPNOTSUPP; -+ -+ __ECHO_IN; -+ -+ switch (cmd) { -+ case SIOCSBANDWIDTH: -+ if (capable(CAP_NET_ADMIN)) { -+ /* -+ * We are unable to set the speed if the -+ * device is not running. -+ */ -+ if (si->open) { -+ ret = pxa250_irda_set_speed(dev, -+ rq->ifr_baudrate); -+ } else { -+ printk("pxa250_irda_ioctl: SIOCSBANDWIDTH: !netif_running\n"); -+ ret = 0; -+ } -+ } -+ break; -+ -+ case SIOCSMEDIABUSY: -+ ret = -EPERM; -+ if (capable(CAP_NET_ADMIN)) { -+ irda_device_set_media_busy(dev, TRUE); -+ ret = 0; -+ } -+ break; -+ -+ case SIOCGRECEIVING: -+ rq->ifr_receiving = IS_FIR(si) ? 0 -+ : si->rx_buff.state != OUTSIDE_FRAME; -+ break; -+ -+ default: -+ break; -+ } -+ -+ __ECHO_OUT; -+ -+ return ret; -+} -+ -+static struct net_device_stats *pxa250_irda_stats(struct net_device *dev) -+{ -+ struct pxa250_irda *si = dev->priv; -+ return &si->stats; -+} -+ -+static int pxa250_irda_start(struct net_device *dev) -+{ -+ struct pxa250_irda *si = dev->priv; -+ int err; -+ unsigned int flags; -+ -+ -+ MOD_INC_USE_COUNT; -+ -+ __ECHO_IN; -+ si->speed = 9600; -+ -+ local_irq_save(flags); -+ -+ err = request_irq(si->fir_irq, pxa250_irda_fir_irq, 0, dev->name, dev); -+ if (err) -+ goto err_fir_irq; -+ -+ err = request_irq(dev->irq, pxa250_irda_irq, 0, dev->name, dev); -+ if (err) -+ goto err_irq; -+ -+ /* -+ * The interrupt must remain disabled for now. -+ */ -+ -+ disable_irq(dev->irq); -+ disable_irq(si->fir_irq); -+ -+ local_irq_restore(flags); -+ -+ -+ /* Allocate DMA channel for receiver (not used) */ -+ err = pxa_request_dma("IrDA receive", DMA_PRIO_LOW, pxa250_irda_rxdma_irq, dev); -+ if (err < 0 ) -+ goto err_rx_dma; -+ si->rxdma_ch=err; -+ -+ DRCMRRXICDR = DRCMR_MAPVLD | si->rxdma_ch; -+ -+ -+ /* Allocate DMA channel for transmit */ -+ err = pxa_request_dma("IrDA transmit", DMA_PRIO_LOW, pxa250_irda_txdma_irq , dev); -+ if (err < 0 ) -+ goto err_tx_dma; -+ -+ si->txdma_ch=err; -+ -+ /* -+ * Make sure that ICP will be able -+ * to assert the transmit dma request bit -+ * through the peripherals request bus (PREQ) -+ */ -+ -+ DRCMRTXICDR = DRCMR_MAPVLD | si->txdma_ch; -+ -+ DBG("rx(not used) channel=%d tx channel=%d\n",si->rxdma_ch,si->txdma_ch); -+ -+ /* allocate consistent buffers for dma access -+ * buffers have to be aligned and situated in dma capable memory region; -+ */ -+ si->rxbuf_dma_virt = consistent_alloc(GFP_KERNEL | GFP_DMA ,HPSIR_MAX_RXLEN , &si->rxbuf_dma); -+ if (! si->rxbuf_dma_virt ) -+ goto err_rxbuf_dma; -+ -+ si->txbuf_dma_virt = consistent_alloc(GFP_KERNEL | GFP_DMA, HPSIR_MAX_TXLEN, &si->txbuf_dma); -+ if (! si->txbuf_dma_virt ) -+ goto err_txbuf_dma; -+ -+ /* Alocate skb for receiver */ -+ err=pxa250_irda_rx_alloc(si); -+ if (err) -+ goto err_rx_alloc; -+ -+ /* -+ * Setup the serial port for the specified config. -+ */ -+ err = pxa250_irda_startup(dev); -+ if (err) -+ goto err_startup; -+ -+ pxa250_irda_set_speed(dev,si->speed = 9600); -+ -+ -+ /* -+ * Open a new IrLAP layer instance. -+ */ -+ si->irlap = irlap_open(dev, &si->qos, "pxa250"); -+ err = -ENOMEM; -+ if (!si->irlap) -+ goto err_irlap; -+ -+ /* -+ * Now enable the interrupt and start the queue -+ */ -+ si->open = 1; -+ enable_irq(dev->irq); -+ netif_start_queue(dev); -+ return 0; -+ -+err_irlap: -+ si->open = 0; -+ pxa250_sir_irda_shutdown(si); -+err_startup: -+ dev_kfree_skb(si->rxskb); -+err_rx_alloc: -+ consistent_free (si->txbuf_dma_virt,HPSIR_MAX_TXLEN,si->txbuf_dma); -+err_txbuf_dma: -+ consistent_free (si->rxbuf_dma_virt,HPSIR_MAX_RXLEN,si->rxbuf_dma); -+err_rxbuf_dma: -+ pxa_free_dma(si->txdma_ch); -+err_tx_dma: -+ pxa_free_dma(si->rxdma_ch); -+err_rx_dma: -+ free_irq(dev->irq, dev); -+err_irq: -+ free_irq(si->fir_irq, dev); -+err_fir_irq: -+ MOD_DEC_USE_COUNT; -+ return err; -+} -+ -+static int pxa250_irda_stop(struct net_device *dev) -+{ -+ struct pxa250_irda *si = dev->priv; -+ -+ printk(KERN_ERR "Irda stop... RX = %d TX = %d\n",rx_count,tx_count); -+ -+ disable_irq(dev->irq); -+ disable_irq(si->fir_irq); -+/* pxa250_irda_shutdown(si); */ -+ -+ /* -+ * If we have been doing DMA receive, make sure we -+ * tidy that up cleanly. -+ */ -+ if (si->rxskb) { -+ dev_kfree_skb(si->rxskb); -+ si->rxskb = NULL; -+ } -+ -+ /* Stop IrLAP */ -+ if (si->irlap) { -+ irlap_close(si->irlap); -+ si->irlap = NULL; -+ } -+ -+ consistent_free (si->txbuf_dma_virt,HPSIR_MAX_TXLEN,si->txbuf_dma); -+ consistent_free (si->rxbuf_dma_virt,HPSIR_MAX_RXLEN,si->rxbuf_dma); -+ pxa_free_dma(si->txdma_ch); -+ pxa_free_dma(si->rxdma_ch); -+ -+ netif_stop_queue(dev); -+ si->open = 0; -+ -+ /* -+ * Free resources -+ */ -+ free_irq(dev->irq, dev); -+ free_irq(si->fir_irq, dev); -+ -+ -+ MOD_DEC_USE_COUNT; -+ -+ return 0; -+} -+ -+static int pxa250_irda_init_iobuf(iobuff_t *io, int size) -+{ -+ io->head = kmalloc(size, GFP_KERNEL | GFP_DMA); -+ if (io->head != NULL) { -+ io->truesize = size; -+ io->in_frame = FALSE; -+ io->state = OUTSIDE_FRAME; -+ io->data = io->head; -+ } -+ return io->head ? 0 : -ENOMEM; -+} -+ -+ -+ -+ -+static int pxa250_stop_fir(struct net_device *dev) -+{ -+ struct pxa250_irda *si = dev->priv; -+ unsigned int flag; -+ -+ save_flags(flag); -+ cli(); -+ -+ pxa250_dma_stop(si->txdma_ch); -+ pxa250_dma_stop(si->rxdma_ch); -+ -+ if (si->txskb) -+ dev_kfree_skb_irq(si->txskb); -+ -+ ICCR0 &= ~(ICCR0_RXE | ICCR0_TXE ); -+ disable_irq(si->fir_irq); -+ CKEN &= ~CKEN13_FICP; -+ -+ restore_flags(flag); -+ -+ return 0; -+} -+ -+ -+ -+static int pxa250_irda_set_speed(struct net_device *dev, int speed) -+{ -+ struct pxa250_irda *si = dev->priv; -+ int brd, ret = -EINVAL; -+ static int last_fir_speed=0; -+ -+ __ECHO_IN; -+ -+ -+ -+ switch (speed) { -+ case 9600: case 19200: case 38400: -+ case 57600: case 115200: -+ -+ /* Baud rate fixed - Clo */ -+ -+ /* -+ * FIXME -+ */ -+ if (last_fir_speed) -+ { -+ -+ pxa250_stop_fir(dev); -+ set_GPIO_mode (GPIO46_STRXD_MD); -+ set_GPIO_mode (GPIO47_STTXD_MD); -+ -+ enable_irq(dev->irq); -+ netif_wake_queue(dev); -+ last_fir_speed=0; -+ } -+ -+ -+ LUB_MISC_WR &= ~(1 << 4); -+ -+ brd = 14745600 / (16 * speed); -+ -+ STLCR |= LCR_DLAB; -+ -+ STDLH = brd >> 8; /* Clo: set Divisor Latch High */ -+ STDLL = brd & 0xFF; /* Clo: set Devisor Latch Low */ -+ -+ STLCR &= ~LCR_DLAB; /* Clo: clear DLAB bit */ -+ -+ STMCR = MCR_OUT2; -+ -+ CKEN |= CKEN5_STUART; -+ -+ ICMR |= ( 1 << 20 ); -+ -+ STLCR = LCR_WLS1 | LCR_WLS0; -+ -+ SET_SIR_MODE; -+ -+ STFCR = FCR_TRFIFOE | FCR_RESETTF | FCR_RESETRF | FCR_ITL_1 ;// | FCR_ITL_16; -+ -+ STIER = IER_UUE | IER_RAVIE | IER_RTIOE; -+ -+ si->speed = speed; -+ -+ ret = 0; -+ break; -+ -+ case 4000000: -+ -+ if (last_fir_speed) -+ goto speed_out; -+ -+ disable_irq(dev->irq); -+ -+ pxa250_sir_irda_shutdown(si); -+ pxa250_fir_irda_startup(si); -+ pxa250_irda_rx_alloc(si); -+ ICCR0=0; -+ pxa250_start_rx_dma(dev); -+ pxa250_ficp_rx_start(); -+ -+ enable_irq(si->fir_irq); -+ DBG("enable FIR \n"); -+ si->speed = speed; -+ -+ netif_wake_queue(dev); -+ last_fir_speed=1; -+speed_out: -+ -+ ret=0; -+ -+ break; -+ -+ default: -+ break; -+ } -+ __ECHO_OUT; -+ -+ return ret; -+} -+ -+ -+static int pxa250_irda_net_init(struct net_device *dev) -+{ -+ struct pxa250_irda *si = dev->priv; -+ unsigned int baudrate_mask; -+ int err = -ENOMEM; -+ -+ si = kmalloc(sizeof(struct pxa250_irda), GFP_KERNEL); -+ if (!si) -+ goto out; -+ -+ memset(si, 0, sizeof(*si)); -+ -+ /* -+ * Initialise the HP-SIR buffers -+ */ -+ -+ err = pxa250_irda_init_iobuf(&si->rx_buff, 14384); -+ if (err) -+ goto out; -+ err = pxa250_irda_init_iobuf(&si->tx_buff, 4000); -+ if (err) -+ goto out_free_rx; -+ -+ si->fir_irq = IRQ_ICP; -+ dev->priv = si; -+ dev->hard_start_xmit = pxa250_irda_hard_xmit; -+ dev->open = pxa250_irda_start; -+ dev->stop = pxa250_irda_stop; -+ dev->do_ioctl = pxa250_irda_ioctl; -+ dev->get_stats = pxa250_irda_stats; -+ -+ irda_device_setup(dev); -+ irda_init_max_qos_capabilies(&si->qos); -+ -+ /* -+ * We support original IRDA up to 115k2. (we don't currently -+ * support 4Mbps). Min Turn Time set to 1ms or greater. -+ */ -+ baudrate_mask = IR_9600|IR_19200|IR_38400|IR_57600|IR_115200; -+ baudrate_mask |= IR_4000000 << 8; -+ si->qos.baud_rate.bits &= baudrate_mask; -+ si->qos.min_turn_time.bits = 7; -+ -+ irda_qos_bits_to_value(&si->qos); -+ -+#ifdef CONFIG_PM -+ /* -+ * Power-Management is optional. -+ */ -+ si->pmdev = pm_register(PM_SYS_DEV, PM_SYS_IRDA, pxa250_irda_pmproc); -+ if (si->pmdev) -+ si->pmdev->data = dev; -+#endif -+ -+ return 0; -+ -+ kfree(si->tx_buff.head); -+out_free_rx: -+ kfree(si->rx_buff.head); -+out: -+ kfree(si); -+ -+ return err; -+} -+ -+/* -+ * Remove all traces of this driver module from the kernel, so we can't be -+ * called. Note that the device has already been stopped, so we don't have -+ * to worry about interrupts or dma. -+ */ -+static void pxa250_irda_net_uninit(struct net_device *dev) -+{ -+ struct pxa250_irda *si = dev->priv; -+ -+ dev->hard_start_xmit = NULL; -+ dev->open = NULL; -+ dev->stop = NULL; -+ dev->do_ioctl = NULL; -+ dev->get_stats = NULL; -+ dev->priv = NULL; -+ -+ pm_unregister(si->pmdev); -+ -+ kfree(si->tx_buff.head); -+ kfree(si->rx_buff.head); -+ kfree(si); -+} -+ -+static int __init pxa250_irda_init(void) -+{ -+ struct net_device *dev; -+ int err; -+ -+ /* STUART */ -+ err = request_mem_region(__PREG(STRBR), 0x24, "IrDA") ? 0 : -EBUSY; -+ if (err) -+ goto err_mem_1; -+ -+ /* FIR */ -+ err = request_mem_region(__PREG(ICCR0), 0x1c, "IrDA") ? 0 : -EBUSY; -+ if (err) -+ goto err_mem_2; -+ -+ -+ rtnl_lock(); -+ dev = dev_alloc("irda%d", &err); -+ if (dev) { -+ dev->irq = IRQ_STUART; -+ dev->init = pxa250_irda_net_init; -+ dev->uninit = pxa250_irda_net_uninit; -+ -+ err = register_netdevice(dev); -+ -+ if (err) -+ kfree(dev); -+ else -+ netdev = dev; -+ } -+ rtnl_unlock(); -+ -+ if (err) { -+ release_mem_region(__PREG(ICCR0), 0x1c); -+err_mem_2: -+ release_mem_region(__PREG(STRBR), 0x24); -+ } -+err_mem_1: -+ return err; -+} -+ -+static void __exit pxa250_irda_exit(void) -+{ -+ struct net_device *dev = netdev; -+ -+ netdev = NULL; -+ if (dev) { -+ rtnl_lock(); -+ unregister_netdevice(dev); -+ rtnl_unlock(); -+ } -+ -+ release_mem_region(__PREG(ICCR0), 0x1c); -+ -+ release_mem_region(__PREG(STRBR), 0x24); -+ -+ /* -+ * We now know that the netdevice is no longer in use, and all -+ * references to our driver have been removed. The only structure -+ * which may still be present is the netdevice, which will get -+ * cleaned up by net/core/dev.c -+ */ -+} -+ -+module_init(pxa250_irda_init); -+module_exit(pxa250_irda_exit); -+ -+MODULE_AUTHOR("Alexey Lugovskoy Frasenyak Dmitrij"); -+MODULE_DESCRIPTION("PXA250 SIR/FIR"); -+MODULE_LICENSE("GPL"); -+EXPORT_NO_SYMBOLS; ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/net/smc91x.c 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,2123 @@ -+/*------------------------------------------------------------------------ -+ . smc91x.c -+ . This is a driver for SMSC's 91C9x/91C1xx single-chip Ethernet devices. -+ . -+ . Copyright (C) 1996 by Erik Stahlman -+ . Copyright (C) 2001 Standard Microsystems Corporation -+ . Developed by Simple Network Magic Corporation -+ . Copyright (C) 2003 Monta Vista Software, Inc. -+ . Unified SMC91x driver by Nicolas Pitre -+ . -+ . This program is free software; you can redistribute it and/or modify -+ . it under the terms of the GNU General Public License as published by -+ . the Free Software Foundation; either version 2 of the License, or -+ . (at your option) any later version. -+ . -+ . This program is distributed in the hope that it will be useful, -+ . but WITHOUT ANY WARRANTY; without even the implied warranty of -+ . MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ . GNU General Public License for more details. -+ . -+ . You should have received a copy of the GNU General Public License -+ . along with this program; if not, write to the Free Software -+ . Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+ . -+ . Arguments: -+ . io = for the base address -+ . irq = for the IRQ -+ . nowait = 0 for normal wait states, 1 eliminates additional wait states -+ . -+ . original author: -+ . Erik Stahlman <erik@vt.edu> -+ . -+ . hardware multicast code: -+ . Peter Cammaert <pc@denkart.be> -+ . -+ . contributors: -+ . Daris A Nevil <dnevil@snmc.com> -+ . Nicolas Pitre <nico@cam.org> -+ . -+ . History: -+ . 08/20/00 Arnaldo Melo fix kfree(skb) in smc_hardware_send_packet -+ . 12/15/00 Christian Jullien fix "Warning: kfree_skb on hard IRQ" -+ . 03/16/01 Daris A Nevil modified smc9194.c for use with LAN91C111 -+ . 08/22/01 Scott Anderson merge changes from smc9194 to smc91111 -+ . 08/21/01 Pramod B Bhardwaj added support for RevB of LAN91C111 -+ . 12/20/01 Jeff Sutherland initial port to Xscale PXA with DMA support -+ . 04/07/03 Nicolas Pitre unified SMC91x driver, killed irq races, -+ . more bus abstraction, big cleanup, etc. -+ ----------------------------------------------------------------------------*/ -+ -+static const char version[] = -+ "smc91x.c: v1.0, mar 07 2003 by Nicolas Pitre <nico@cam.org>\n"; -+ -+/* Debugging level */ -+#ifndef SMC_DEBUG -+#define SMC_DEBUG 0 -+#endif -+ -+ -+#include <linux/config.h> -+#include <linux/init.h> -+#include <linux/module.h> -+#include <linux/kernel.h> -+#include <linux/sched.h> -+#include <linux/slab.h> -+#include <linux/delay.h> -+#include <linux/timer.h> -+#include <linux/errno.h> -+#include <linux/ioport.h> -+ -+#include <linux/netdevice.h> -+#include <linux/etherdevice.h> -+#include <linux/skbuff.h> -+#ifdef CONFIG_PM -+#include <linux/pm.h> -+#endif -+ -+#include <asm/io.h> -+#include <asm/hardware.h> -+#include <asm/irq.h> -+ -+#include "smc91x.h" -+ -+ -+#ifdef CONFIG_ISA -+/* -+ . the LAN91C111 can be at any of the following port addresses. To change, -+ . for a slightly different card, you can add it to the array. Keep in -+ . mind that the array must end in zero. -+*/ -+static unsigned int smc_portlist[] __initdata = { -+ 0x200, 0x220, 0x240, 0x260, 0x280, 0x2A0, 0x2C0, 0x2E0, -+ 0x300, 0x320, 0x340, 0x360, 0x380, 0x3A0, 0x3C0, 0x3E0, 0 -+}; -+#endif /* CONFIG_ISA */ -+ -+#ifndef SMC_IOADDR -+# define SMC_IOADDR -1 -+#endif -+static int io = SMC_IOADDR; -+ -+#ifndef SMC_IRQ -+# define SMC_IRQ -1 -+#endif -+static int irq = SMC_IRQ; -+ -+#ifndef SMC_NOWAIT -+# define SMC_NOWAIT 0 -+#endif -+static int nowait = SMC_NOWAIT; -+ -+MODULE_PARM(io, "i"); -+MODULE_PARM(irq, "i"); -+MODULE_PARM(nowait, "i"); -+MODULE_PARM_DESC(io, "I/O base address"); -+MODULE_PARM_DESC(irq, "IRQ number"); -+MODULE_PARM_DESC(nowait, "set to 1 for no wait state"); -+ -+ -+/*------------------------------------------------------------------------ -+ . -+ . The internal workings of the driver. If you are changing anything -+ . here with the SMC stuff, you should have the datasheet and know -+ . what you are doing. -+ . -+ -------------------------------------------------------------------------*/ -+#define CARDNAME "LAN91x" -+ -+// Use power-down feature of the chip -+#define POWER_DOWN 1 -+ -+/* -+ . Wait time for memory to be free. This probably shouldn't be -+ . tuned that much, as waiting for this means nothing else happens -+ . in the system -+*/ -+#define MEMORY_WAIT_TIME 16 -+ -+/* -+ . This selects whether TX packets are sent one by one to the SMC91x internal -+ . memory ans throttled until transmission completes. This may prevent -+ . RX overruns a litle by keeping much of the memory free for RX packets -+ . but to the expense of reduced TX throughput and increased IRQ overhead. -+ . Note this is not a cure for a too slow data bus or too high IRQ latency. -+ */ -+#define THROTTLE_TX_PKTS 0 -+ -+ -+/* store this information for the driver.. */ -+struct smc_local { -+ -+ // If I have to wait until memory is available to send -+ // a packet, I will store the skbuff here, until I get the -+ // desired memory. Then, I'll send it out and free it. -+ struct sk_buff *saved_skb; -+ -+ // these are things that the kernel wants me to keep, so users -+ // can find out semi-useless statistics of how well the card is -+ // performing -+ struct net_device_stats stats; -+ -+ // version/revision of the SMC91x chip -+ int version; -+ -+ // Set to true during the auto-negotiation sequence -+ int autoneg_active; -+ -+ // Address of our PHY port -+ int phyaddr; -+ -+ // Type of PHY -+ int phytype; -+ -+ // Last contents of PHY Register 18 -+ int lastPhy18; -+ -+ // Contains the current active transmission mode -+ int tcr_cur_mode; -+ -+ // Contains the current active receive mode -+ int rcr_cur_mode; -+ -+ // Contains the current active receive/phy mode -+ int rpc_cur_mode; -+ int ctl_autoneg; -+ int ctl_rfduplx; -+ int ctl_rspeed; -+ -+#ifdef CONFIG_PM -+ struct pm_dev* pm; -+#endif -+ -+}; -+ -+ -+#if SMC_DEBUG > 2 -+#define PRINTK3(args...) printk(args) -+#else -+#define PRINTK3(args...) do { } while(0) -+#endif -+ -+#if SMC_DEBUG > 1 -+#define PRINTK2(args...) printk(args) -+#else -+#define PRINTK2(args...) do { } while(0) -+#endif -+ -+#if SMC_DEBUG > 0 -+#define PRINTK1(args...) printk(args) -+#define PRINTK(args...) printk(args) -+#else -+#define PRINTK1(args...) do { } while(0) -+#define PRINTK(args...) printk(KERN_DEBUG args) -+#endif -+ -+#if SMC_DEBUG > 3 -+static void PRINT_PKT(u_char *buf, int length) -+{ -+ int i; -+ int remainder; -+ int lines; -+ -+ lines = length / 16; -+ remainder = length % 16; -+ -+ for (i = 0; i < lines ; i ++) { -+ int cur; -+ for (cur = 0; cur < 8; cur++) { -+ u_char a, b; -+ a = *buf++; -+ b = *buf++; -+ printk("%02x%02x ", a, b); -+ } -+ printk("\n"); -+ } -+ for (i = 0; i < remainder/2 ; i++) { -+ u_char a, b; -+ a = *buf++; -+ b = *buf++; -+ printk("%02x%02x ", a, b ); -+ } -+ printk("\n"); -+} -+#else -+#define PRINT_PKT(x...) do { } while(0) -+#endif -+ -+ -+/* this enables an interrupt in the interrupt mask register */ -+#define SMC_ENABLE_INT(x) do { \ -+ unsigned long flags; \ -+ unsigned char mask; \ -+ local_irq_save(flags); \ -+ mask = SMC_GET_INT_MASK(); \ -+ mask |= (x); \ -+ SMC_SET_INT_MASK(mask); \ -+ local_irq_restore(flags); \ -+} while (0) -+ -+/* this disables an interrupt from the interrupt mask register */ -+#define SMC_DISABLE_INT(x) do { \ -+ unsigned long flags; \ -+ unsigned char mask; \ -+ local_irq_save(flags); \ -+ mask = SMC_GET_INT_MASK(); \ -+ mask &= ~(x); \ -+ SMC_SET_INT_MASK(mask); \ -+ local_irq_restore(flags); \ -+} while (0) -+ -+/* wait while MMU is busy */ -+#define SMC_WAIT_MMU_BUSY() do { \ -+ if (unlikely(SMC_GET_MMU_CMD() & MC_BUSY)) { \ -+ unsigned long timeout = jiffies + 2; \ -+ while (SMC_GET_MMU_CMD() & MC_BUSY) { \ -+ if (time_after(jiffies, timeout)) { \ -+ printk("%s: timeout %s line %d\n", \ -+ dev->name, __FILE__, __LINE__); \ -+ break; \ -+ } \ -+ } \ -+ } \ -+} while (0) -+ -+ -+/* this does a soft reset on the device */ -+static void -+smc_reset(struct net_device *dev) -+{ -+ unsigned long ioaddr = dev->base_addr; -+ struct smc_local *lp = (struct smc_local *)dev->priv; -+ int phyaddr = lp->phyaddr; -+ int status; -+ PRINTK2("%s: %s\n", dev->name, __FUNCTION__); -+ -+ /* This resets the registers mostly to defaults, but doesn't -+ affect EEPROM. That seems unnecessary */ -+ SMC_SELECT_BANK( 0 ); -+ SMC_SET_RCR( RCR_SOFTRST ); -+ -+ /* Setup the Configuration Register */ -+ /* This is necessary because the CONFIG_REG is not affected */ -+ /* by a soft reset */ -+ SMC_SELECT_BANK( 1 ); -+ SMC_SET_CONFIG( CONFIG_DEFAULT ); -+ -+ /* Setup for fast accesses if requested */ -+ /* If the card/system can't handle it then there will */ -+ /* be no recovery except for a hard reset or power cycle */ -+ if (nowait) -+ SMC_SET_CONFIG( SMC_GET_CONFIG() | CONFIG_NO_WAIT ); -+ -+#ifdef POWER_DOWN -+ /* Release from possible power-down state */ -+ /* Configuration register is not affected by Soft Reset */ -+ SMC_SELECT_BANK( 1 ); -+ SMC_SET_CONFIG( SMC_GET_CONFIG() | CONFIG_EPH_POWER_EN ); -+ status = smc_read_phy_register(ioaddr, phyaddr, PHY_CNTL_REG); -+ status &= ~PHY_CNTL_PDN; -+ smc_write_phy_register(ioaddr, phyaddr, PHY_CNTL_REG); -+#endif -+ -+ /* this should pause enough for the chip to be happy */ -+ udelay(1); -+ -+ /* Disable transmit and receive functionality */ -+ SMC_SELECT_BANK( 0 ); -+ SMC_SET_RCR( RCR_CLEAR ); -+ SMC_SET_TCR( TCR_CLEAR ); -+ -+ /* set the control register to automatically -+ release successfully transmitted packets, to make the best -+ use out of our limited memory */ -+ SMC_SELECT_BANK( 1 ); -+#if ! THROTTLE_TX_PKTS -+ SMC_SET_CTL( SMC_GET_CTL() | CTL_AUTO_RELEASE ); -+#else -+ SMC_SET_CTL( SMC_GET_CTL() & ~CTL_AUTO_RELEASE ); -+#endif -+ -+ /* Disable all interrupts */ -+ SMC_SELECT_BANK( 2 ); -+ SMC_SET_INT_MASK( 0 ); -+ -+ /* Reset the MMU */ -+ SMC_SET_MMU_CMD( MC_RESET ); -+ SMC_WAIT_MMU_BUSY(); -+} -+ -+/* Enable Interrupts, Receive, and Transmit */ -+static void -+smc_enable(struct net_device *dev) -+{ -+ unsigned long ioaddr = dev->base_addr; -+ struct smc_local *lp = (struct smc_local *)dev->priv; -+ int mask; -+ -+ PRINTK2("%s: %s\n", dev->name, __FUNCTION__); -+ -+ /* see the header file for options in TCR/RCR DEFAULT*/ -+ SMC_SELECT_BANK( 0 ); -+ SMC_SET_TCR( lp->tcr_cur_mode ); -+ SMC_SET_RCR( lp->rcr_cur_mode ); -+ -+ /* now, enable interrupts */ -+ mask = IM_EPH_INT|IM_RX_OVRN_INT|IM_RCV_INT; -+ if (lp->version >= 0x70) -+ mask |= IM_MDINT; -+ SMC_SELECT_BANK( 2 ); -+ SMC_SET_INT_MASK( mask ); -+} -+ -+/* this puts the device in an inactive state */ -+static void -+smc_shutdown(struct net_device *dev) -+{ -+ int ioaddr = dev->base_addr; -+ struct smc_local *lp = (struct smc_local *)dev->priv; -+ int phyaddr = lp->phyaddr; -+ int status; -+ -+ PRINTK2("%s: %s\n", CARDNAME, __FUNCTION__); -+ -+ /* no more interrupts for me */ -+ SMC_SELECT_BANK( 2 ); -+ SMC_SET_INT_MASK( 0 ); -+ -+ /* and tell the card to stay away from that nasty outside world */ -+ SMC_SELECT_BANK( 0 ); -+ SMC_SET_RCR( RCR_CLEAR ); -+ SMC_SET_TCR( TCR_CLEAR ); -+ -+#ifdef POWER_DOWN -+ status = smc_read_phy_register(ioaddr, phyaddr, PHY_CNTL_REG); -+ status |= PHY_CNTL_PDN; -+ smc_write_phy_register(ioaddr, phyaddr, PHY_CNTL_REG); -+ -+ /* finally, shut the chip down */ -+ SMC_SELECT_BANK( 1 ); -+ SMC_SET_CONFIG( SMC_GET_CONFIG() & ~CONFIG_EPH_POWER_EN ); -+#endif -+} -+ -+/* This is the procedure to handle the receipt of a packet. */ -+static inline void -+smc_rcv(struct net_device *dev) -+{ -+ struct smc_local *lp = (struct smc_local *)dev->priv; -+ unsigned long ioaddr = dev->base_addr; -+ unsigned int packet_number, status, packet_len; -+ -+ PRINTK3("%s: %s\n", dev->name, __FUNCTION__); -+ -+ packet_number = SMC_GET_RXFIFO(); -+ if (unlikely(packet_number & RXFIFO_REMPTY)) { -+ PRINTK("%s: smc_rcv with nothing on FIFO.\n", dev->name); -+ return; -+ } -+ -+ /* read from start of packet */ -+ SMC_SET_PTR( PTR_READ | PTR_RCV | PTR_AUTOINC ); -+ -+ /* First two words are status and packet length */ -+ SMC_GET_PKT_HDR(status, packet_len); -+ packet_len &= 0x07ff; /* mask off top bits */ -+ PRINTK2("%s: RX PNR 0x%x STATUS 0x%04x LENGTH 0x%04x (%d)\n", -+ dev->name, packet_number, status, -+ packet_len, packet_len); -+ -+ if (unlikely(status & RS_ERRORS)) { -+ lp->stats.rx_errors++; -+ if (status & RS_ALGNERR) -+ lp->stats.rx_frame_errors++; -+ if (status & (RS_TOOSHORT | RS_TOOLONG)) -+ lp->stats.rx_length_errors++; -+ if (status & RS_BADCRC) -+ lp->stats.rx_crc_errors++; -+ } else { -+ struct sk_buff *skb; -+ unsigned char *data; -+ unsigned int data_len; -+ -+ /* set multicast stats */ -+ if (status & RS_MULTICAST) -+ lp->stats.multicast++; -+ -+ /* -+ * Actual payload is packet_len - 4 (or 3 if odd byte). -+ * We want skb_reserve(2) and the final ctrl word -+ * (2 bytes, possibly containing the payload odd byte). -+ * Ence packet_len - 4 + 2 + 2. -+ */ -+ skb = dev_alloc_skb(packet_len); -+ if (unlikely(skb == NULL)) { -+ printk(KERN_NOTICE "%s: Low memory, packet dropped.\n", -+ dev->name); -+ lp->stats.rx_dropped++; -+ goto done; -+ } -+ -+ /* Align IP header to 32 bits */ -+ skb_reserve(skb, 2); -+ -+ /* BUG: the LAN91C111 rev A never sets this bit. Force it. */ -+ if (lp->version == 0x90) -+ status |= RS_ODDFRAME; -+ -+ /* -+ * If odd length: packet_len - 3, -+ * otherwise packet_len - 4. -+ */ -+ data_len = packet_len - ((status & RS_ODDFRAME) ? 3 : 4); -+ data = skb_put(skb, data_len); -+ SMC_PULL_DATA(data, packet_len - 2); -+ -+ PRINT_PKT(data, packet_len - 2); -+ -+ dev->last_rx = jiffies; -+ skb->dev = dev; -+ skb->protocol = eth_type_trans(skb, dev); -+ netif_rx(skb); -+ lp->stats.rx_packets++; -+ lp->stats.rx_bytes += data_len; -+ } -+ -+done: -+ SMC_WAIT_MMU_BUSY(); -+ SMC_SET_MMU_CMD( MC_RELEASE ); -+} -+ -+/* -+ * This is called to actually send a packet to the chip. -+ * Returns non-zero when successful. -+ */ -+static void -+smc_hardware_send_packet(struct net_device *dev) -+{ -+ struct smc_local *lp = (struct smc_local *)dev->priv; -+ unsigned long ioaddr = dev->base_addr; -+ struct sk_buff *skb = lp->saved_skb; -+ unsigned int packet_no, len; -+ unsigned char *buf; -+ -+ PRINTK3("%s: %s\n", dev->name, __FUNCTION__); -+ -+ if (unlikely(!skb)) { -+ printk ("%s: In XMIT with no packet to send\n", dev->name); -+ return; -+ } -+ -+ packet_no = SMC_GET_AR(); -+ if (unlikely(packet_no & AR_FAILED)) { -+ printk("%s: Memory allocation failed.\n", dev->name); -+ lp->saved_skb = NULL; -+ lp->stats.tx_errors++; -+ lp->stats.tx_fifo_errors++; -+ dev_kfree_skb_any(skb); -+ return; -+ } -+ -+ /* point to the beginning of the packet */ -+ SMC_SET_PN( packet_no ); -+ SMC_SET_PTR( PTR_AUTOINC ); -+ -+ buf = skb->data; -+ len = skb->len; -+ PRINTK2("%s: TX PNR 0x%x lENGTH 0x%04x (%d) BUF 9x%p\n", -+ dev->name, packet_no, len, len, buf); -+ PRINT_PKT(buf, len); -+ -+ /* -+ * Send the packet length ( +6 for status words, length, and ctl. -+ * The card will pad to 64 bytes with zeroes if packet is too small. -+ */ -+ SMC_PUT_PKT_HDR(0, len + 6); -+ -+ /* send the actual data */ -+ SMC_PUSH_DATA(buf, len & ~1); -+ -+ /* Send final ctl word with the last byte if there is one */ -+ SMC_outw( ((len & 1) ? (0x2000 | buf[len-1]) : 0), ioaddr, DATA_REG ); -+ -+ /* and let the chipset deal with it */ -+ SMC_SET_MMU_CMD( MC_ENQUEUE ); -+ SMC_ACK_INT( IM_TX_EMPTY_INT ); -+ -+ dev->trans_start = jiffies; -+ dev_kfree_skb_any(skb); -+ lp->saved_skb = NULL; -+ lp->stats.tx_packets++; -+ lp->stats.tx_bytes += len; -+} -+ -+/* -+ . Since I am not sure if I will have enough room in the chip's ram -+ . to store the packet, I call this routine which either sends it -+ . now, or set the card to generates an interrupt when ready -+ . for the packet. -+ */ -+static int -+smc_hard_start_xmit( struct sk_buff * skb, struct net_device * dev ) -+{ -+ struct smc_local *lp = (struct smc_local *)dev->priv; -+ unsigned long ioaddr = dev->base_addr; -+ unsigned int numPages, poll_count, status, saved_bank; -+ -+ PRINTK3("%s: %s\n", dev->name, __FUNCTION__); -+ -+ if (unlikely(lp->saved_skb != NULL)) { -+ /* THIS SHOULD NEVER HAPPEN. */ -+ printk( KERN_CRIT -+ "%s: Bad Craziness - sent packet while busy.\n", -+ dev->name ); -+ lp->stats.tx_errors++; -+ lp->stats.tx_aborted_errors++; -+ return 1; -+ } -+ lp->saved_skb = skb; -+ -+ /* -+ ** The MMU wants the number of pages to be the number of 256 bytes -+ ** 'pages', minus 1 ( since a packet can't ever have 0 pages :) ) -+ ** -+ ** The 91C111 ignores the size bits, but the code is left intact -+ ** for backwards and future compatibility. -+ ** -+ ** Pkt size for allocating is data length +6 (for additional status -+ ** words, length and ctl!) -+ ** -+ ** If odd size then last byte is included in ctl word. -+ */ -+ numPages = ((skb->len & ~1) + (6 - 1)) >> 8; -+ if (unlikely(numPages > 7)) { -+ printk("%s: Far too big packet error.\n", dev->name); -+ lp->saved_skb = NULL; -+ lp->stats.tx_errors++; -+ lp->stats.tx_dropped++; -+ dev_kfree_skb(skb); -+ return 0; -+ } -+ -+ /* now, try to allocate the memory */ -+ saved_bank = SMC_CURRENT_BANK(); -+ SMC_SELECT_BANK( 2 ); -+ SMC_SET_MMU_CMD( MC_ALLOC | numPages ); -+ -+ /* -+ * Poll the chip for a short amount of time in case the -+ * allocation succeeds quickly. -+ */ -+ poll_count = MEMORY_WAIT_TIME; -+ do { -+ status = SMC_GET_INT(); -+ if (status & IM_ALLOC_INT) { -+ SMC_ACK_INT( IM_ALLOC_INT ); -+ break; -+ } -+ } while (--poll_count); -+ -+ if (!poll_count) { -+ /* oh well, wait until the chip finds memory later */ -+ netif_stop_queue(dev); -+ PRINTK2("%s: TX memory allocation deferred.\n", dev->name); -+ SMC_ENABLE_INT( IM_ALLOC_INT ); -+ } else { -+ /* Send current packet immediately.. */ -+#if THROTTLE_TX_PKTS -+ netif_stop_queue(dev); -+#endif -+ smc_hardware_send_packet(dev); -+ SMC_ENABLE_INT( IM_TX_INT | IM_TX_EMPTY_INT ); -+ } -+ -+ SMC_SELECT_BANK( saved_bank ); -+ return 0; -+} -+ -+/* -+ . This handles a TX interrupt, which is only called when an error -+ . relating to a packet is sent or CTL_AUTO_RELEASE is not set. -+*/ -+static void -+smc_tx(struct net_device *dev) -+{ -+ unsigned long ioaddr = dev->base_addr; -+ struct smc_local *lp = (struct smc_local *)dev->priv; -+ unsigned int saved_packet, packet_no, tx_status, pkt_len; -+ -+ PRINTK3("%s: %s\n", dev->name, __FUNCTION__); -+ -+ /* If the TX FIFO is empty then nothing to do */ -+ packet_no = SMC_GET_TXFIFO(); -+ if (unlikely(packet_no & TXFIFO_TEMPTY)) { -+ PRINTK("%s: smc_tx with nothing on FIFO.\n", dev->name); -+ return; -+ } -+ -+ /* select packet to read from */ -+ saved_packet = SMC_GET_PN(); -+ SMC_SET_PN( packet_no ); -+ -+ /* read the first word (status word) from this packet */ -+ SMC_SET_PTR( PTR_AUTOINC | PTR_READ ); -+ SMC_GET_PKT_HDR(tx_status, pkt_len); -+ PRINTK2("%s: TX STATUS 0x%04x PNR 0x%02x\n", -+ dev->name, tx_status, packet_no); -+ -+ if (!(tx_status & TS_SUCCESS)) -+ lp->stats.tx_errors++; -+ if (tx_status & TS_LOSTCAR) -+ lp->stats.tx_carrier_errors++; -+ if (tx_status & TS_LATCOL) { -+ printk( KERN_DEBUG -+ "%s: Late collision occurred on last xmit.\n", -+ dev->name); -+ lp->stats.tx_window_errors++; -+ } -+ -+ /* kill the packet */ -+ SMC_WAIT_MMU_BUSY(); -+ SMC_SET_MMU_CMD( MC_FREEPKT ); -+ -+ /* Don't restore Packet Number Reg until busy bit is cleared */ -+ SMC_WAIT_MMU_BUSY(); -+ SMC_SET_PN( saved_packet ); -+ -+ /* re-enable transmit */ -+ SMC_SELECT_BANK( 0 ); -+ SMC_SET_TCR( lp->tcr_cur_mode ); -+ SMC_SELECT_BANK( 2 ); -+} -+ -+ -+//---PHY CONTROL AND CONFIGURATION----------------------------------------- -+ -+/*------------------------------------------------------------ -+ . Debugging function for viewing MII Management serial bitstream -+ .-------------------------------------------------------------*/ -+#if SMC_DEBUG > 3 -+static void -+PRINT_MII_STREAM(u_char *bits, int size) -+{ -+ int i; -+ -+ printk("BIT#:"); -+ for (i = 0; i < size; ++i) -+ printk("%d", i%10); -+ -+ printk("\nMDOE:"); -+ for (i = 0; i < size; ++i) { -+ if (bits[i] & MII_MDOE) -+ printk("1"); -+ else -+ printk("0"); -+ } -+ -+ printk("\nMDO :"); -+ for (i = 0; i < size; ++i) { -+ if (bits[i] & MII_MDO) -+ printk("1"); -+ else -+ printk("0"); -+ } -+ -+ printk("\nMDI :"); -+ for (i = 0; i < size; ++i) { -+ if (bits[i] & MII_MDI) -+ printk("1"); -+ else -+ printk("0"); -+ } -+ -+ printk("\n"); -+} -+#else -+#define PRINT_MII_STREAM(x...) -+#endif -+ -+/*------------------------------------------------------------ -+ . Reads a register from the MII Management serial interface -+ .-------------------------------------------------------------*/ -+static int -+smc_read_phy_register(unsigned long ioaddr, int phyaddr, int phyreg) -+{ -+ int oldBank; -+ int i, mask, mii_reg; -+ u_char bits[64]; -+ int input_idx, phydata; -+ int clk_idx = 0; -+ -+ // 32 consecutive ones on MDO to establish sync -+ for (i = 0; i < 32; ++i) -+ bits[clk_idx++] = MII_MDOE | MII_MDO; -+ -+ // Start code <01> -+ bits[clk_idx++] = MII_MDOE; -+ bits[clk_idx++] = MII_MDOE | MII_MDO; -+ -+ // Read command <10> -+ bits[clk_idx++] = MII_MDOE | MII_MDO; -+ bits[clk_idx++] = MII_MDOE; -+ -+ // Output the PHY address, msb first -+ mask = 0x10; -+ for (i = 0; i < 5; ++i) { -+ if (phyaddr & mask) -+ bits[clk_idx++] = MII_MDOE | MII_MDO; -+ else -+ bits[clk_idx++] = MII_MDOE; -+ -+ // Shift to next lowest bit -+ mask >>= 1; -+ } -+ -+ // Output the phy register number, msb first -+ mask = 0x10; -+ for (i = 0; i < 5; ++i) { -+ if (phyreg & mask) -+ bits[clk_idx++] = MII_MDOE | MII_MDO; -+ else -+ bits[clk_idx++] = MII_MDOE; -+ -+ // Shift to next lowest bit -+ mask >>= 1; -+ } -+ -+ // Tristate and turnaround (2 bit times) -+ bits[clk_idx++] = 0; -+ //bits[clk_idx++] = 0; -+ -+ // Input starts at this bit time -+ input_idx = clk_idx; -+ -+ // Will input 16 bits -+ for (i = 0; i < 16; ++i) -+ bits[clk_idx++] = 0; -+ -+ // Final clock bit -+ bits[clk_idx++] = 0; -+ -+ // Save the current bank -+ oldBank = SMC_CURRENT_BANK(); -+ -+ // Select bank 3 -+ SMC_SELECT_BANK( 3 ); -+ -+ // Get the current MII register value -+ mii_reg = SMC_GET_MII(); -+ -+ // Turn off all MII Interface bits -+ mii_reg &= ~(MII_MDOE|MII_MCLK|MII_MDI|MII_MDO); -+ -+ // Clock all 64 cycles -+ for (i = 0; i < sizeof bits; ++i) { -+ // Clock Low - output data -+ SMC_SET_MII( mii_reg | bits[i] ); -+ udelay(50); -+ -+ // Clock Hi - input data -+ SMC_SET_MII( mii_reg | bits[i] | MII_MCLK ); -+ udelay(50); -+ bits[i] |= SMC_GET_MII() & MII_MDI; -+ } -+ -+ // Return to idle state -+ // Set clock to low, data to low, and output tristated -+ SMC_SET_MII( mii_reg ); -+ udelay(50); -+ -+ // Restore original bank select -+ SMC_SELECT_BANK( oldBank ); -+ -+ // Recover input data -+ phydata = 0; -+ for (i = 0; i < 16; ++i) { -+ phydata <<= 1; -+ -+ if (bits[input_idx++] & MII_MDI) -+ phydata |= 0x0001; -+ } -+ -+ PRINTK3("%s: phyaddr=0x%x, phyreg=0x%x, phydata=0x%x\n", -+ __FUNCTION__, phyaddr, phyreg, phydata); -+ PRINT_MII_STREAM(bits, sizeof(bits)); -+ -+ return phydata; -+} -+ -+/*------------------------------------------------------------ -+ . Writes a register to the MII Management serial interface -+ .-------------------------------------------------------------*/ -+static void -+smc_write_phy_register( unsigned long ioaddr, int phyaddr, -+ int phyreg, int phydata ) -+{ -+ int oldBank; -+ int i, mask, mii_reg; -+ u_char bits[65]; -+ int clk_idx = 0; -+ -+ // 32 consecutive ones on MDO to establish sync -+ for (i = 0; i < 32; ++i) -+ bits[clk_idx++] = MII_MDOE | MII_MDO; -+ -+ // Start code <01> -+ bits[clk_idx++] = MII_MDOE; -+ bits[clk_idx++] = MII_MDOE | MII_MDO; -+ -+ // Write command <01> -+ bits[clk_idx++] = MII_MDOE; -+ bits[clk_idx++] = MII_MDOE | MII_MDO; -+ -+ // Output the PHY address, msb first -+ mask = 0x10; -+ for (i = 0; i < 5; ++i) { -+ if (phyaddr & mask) -+ bits[clk_idx++] = MII_MDOE | MII_MDO; -+ else -+ bits[clk_idx++] = MII_MDOE; -+ -+ // Shift to next lowest bit -+ mask >>= 1; -+ } -+ -+ // Output the phy register number, msb first -+ mask = 0x10; -+ for (i = 0; i < 5; ++i) { -+ if (phyreg & mask) -+ bits[clk_idx++] = MII_MDOE | MII_MDO; -+ else -+ bits[clk_idx++] = MII_MDOE; -+ -+ // Shift to next lowest bit -+ mask >>= 1; -+ } -+ -+ // Tristate and turnaround (2 bit times) -+ bits[clk_idx++] = 0; -+ bits[clk_idx++] = 0; -+ -+ // Write out 16 bits of data, msb first -+ mask = 0x8000; -+ for (i = 0; i < 16; ++i) { -+ if (phydata & mask) -+ bits[clk_idx++] = MII_MDOE | MII_MDO; -+ else -+ bits[clk_idx++] = MII_MDOE; -+ -+ // Shift to next lowest bit -+ mask >>= 1; -+ } -+ -+ // Final clock bit (tristate) -+ bits[clk_idx++] = 0; -+ -+ // Save the current bank -+ oldBank = SMC_CURRENT_BANK(); -+ -+ // Select bank 3 -+ SMC_SELECT_BANK( 3 ); -+ -+ // Get the current MII register value -+ mii_reg = SMC_GET_MII(); -+ -+ // Turn off all MII Interface bits -+ mii_reg &= ~(MII_MDOE|MII_MCLK|MII_MDI|MII_MDO); -+ -+ // Clock all cycles -+ for (i = 0; i < sizeof bits; ++i) { -+ // Clock Low - output data -+ SMC_SET_MII( mii_reg | bits[i] ); -+ udelay(50); -+ -+ // Clock Hi - input data -+ SMC_SET_MII( mii_reg | bits[i] | MII_MCLK ); -+ udelay(50); -+ bits[i] |= SMC_GET_MII() & MII_MDI; -+ } -+ -+ // Return to idle state -+ // Set clock to low, data to low, and output tristated -+ SMC_SET_MII( mii_reg ); -+ udelay(50); -+ -+ // Restore original bank select -+ SMC_SELECT_BANK( oldBank ); -+ -+ PRINTK3("%s: phyaddr=0x%x, phyreg=0x%x, phydata=0x%x\n", -+ __FUNCTION__, phyaddr, phyreg, phydata); -+ PRINT_MII_STREAM(bits, sizeof(bits)); -+} -+ -+ -+/*------------------------------------------------------------ -+ . Finds and reports the PHY address -+ .-------------------------------------------------------------*/ -+static int smc_detect_phy(struct net_device* dev) -+{ -+ struct smc_local *lp = (struct smc_local *)dev->priv; -+ unsigned long ioaddr = dev->base_addr; -+ int phy_id1, phy_id2; -+ int phyaddr; -+ int found = 0; -+ -+ PRINTK2("%s: %s\n", dev->name, __FUNCTION__); -+ -+ // Scan all 32 PHY addresses if necessary -+ for (phyaddr = 0; phyaddr < 32; ++phyaddr) { -+ // Read the PHY identifiers -+ phy_id1 = smc_read_phy_register(ioaddr, phyaddr, PHY_ID1_REG); -+ phy_id2 = smc_read_phy_register(ioaddr, phyaddr, PHY_ID2_REG); -+ -+ PRINTK3("%s: phy_id1=0x%x, phy_id2=0x%x\n", -+ dev->name, phy_id1, phy_id2); -+ -+ // Make sure it is a valid identifier -+ if ((phy_id2 > 0x0000) && (phy_id2 < 0xffff) && -+ (phy_id1 > 0x0000) && (phy_id1 < 0xffff)) { -+ if ((phy_id1 != 0x8000) && (phy_id2 != 0x8000)) { -+ // Save the PHY's address -+ lp->phyaddr = phyaddr; -+ found = 1; -+ break; -+ } -+ } -+ } -+ -+ if (!found) { -+ PRINTK("%s: No PHY found\n", dev->name); -+ return(0); -+ } -+ -+ // Set the PHY type -+ if ( (phy_id1 == 0x0016) && ((phy_id2 & 0xFFF0) == 0xF840 ) ) { -+ lp->phytype = PHY_LAN83C183; -+ PRINTK("%s: PHY=LAN83C183 (LAN91C111 Internal)\n", dev->name); -+ } -+ -+ if ( (phy_id1 == 0x0282) && ((phy_id2 & 0xFFF0) == 0x1C50) ) { -+ lp->phytype = PHY_LAN83C180; -+ PRINTK("%s: PHY=LAN83C180\n", dev->name); -+ } -+ -+ return 1; -+} -+ -+/*------------------------------------------------------------ -+ . Waits the specified number of milliseconds - kernel friendly -+ .-------------------------------------------------------------*/ -+static void -+smc_wait_ms(unsigned int ms) -+{ -+ if (!in_interrupt()) { -+ set_current_state(TASK_UNINTERRUPTIBLE); -+ schedule_timeout(1 + ms * HZ / 1000); -+ } else { -+ /* if this happens it must be fixed */ -+ printk( KERN_WARNING "%s: busy wait while in interrupt!\n", -+ __FUNCTION__); -+ mdelay(ms); -+ } -+} -+ -+/*------------------------------------------------------------ -+ . Sets the PHY to a configuration as determined by the user -+ .-------------------------------------------------------------*/ -+static int -+smc_phy_fixed(struct net_device *dev) -+{ -+ unsigned long ioaddr = dev->base_addr; -+ struct smc_local *lp = (struct smc_local *)dev->priv; -+ int phyaddr = lp->phyaddr; -+ int my_fixed_caps, cfg1; -+ -+ PRINTK3("%s: %s\n", dev->name, __FUNCTION__); -+ -+ // Enter Link Disable state -+ cfg1 = smc_read_phy_register(ioaddr, phyaddr, PHY_CFG1_REG); -+ cfg1 |= PHY_CFG1_LNKDIS; -+ smc_write_phy_register(ioaddr, phyaddr, PHY_CFG1_REG, cfg1); -+ -+ // Set our fixed capabilities -+ // Disable auto-negotiation -+ my_fixed_caps = 0; -+ -+ if (lp->ctl_rfduplx) -+ my_fixed_caps |= PHY_CNTL_DPLX; -+ -+ if (lp->ctl_rspeed == 100) -+ my_fixed_caps |= PHY_CNTL_SPEED; -+ -+ // Write our capabilities to the phy control register -+ smc_write_phy_register(ioaddr, phyaddr, PHY_CNTL_REG, my_fixed_caps); -+ -+ // Re-Configure the Receive/Phy Control register -+ SMC_SET_RPC( lp->rpc_cur_mode ); -+ -+ // Success -+ return(1); -+} -+ -+/*------------------------------------------------------------ -+ . Configures the specified PHY through the MII management interface -+ . using Autonegotiation. -+ . Calls smc_phy_fixed() if the user has requested a certain config. -+ .-------------------------------------------------------------*/ -+static void -+smc_phy_configure(struct net_device* dev) -+{ -+ unsigned long ioaddr = dev->base_addr; -+ struct smc_local *lp = (struct smc_local *)dev->priv; -+ int timeout; -+ int phyaddr; -+ int my_phy_caps; // My PHY capabilities -+ int my_ad_caps; // My Advertised capabilities -+ int status; -+ -+ PRINTK3("%s:smc_program_phy()\n", dev->name); -+ -+ // Set the blocking flag -+ lp->autoneg_active = 1; -+ -+ // Find the address and type of our phy -+ if (!smc_detect_phy(dev)) -+ goto smc_phy_configure_exit; -+ -+ // Get the detected phy address -+ phyaddr = lp->phyaddr; -+ -+ // Reset the PHY, setting all other bits to zero -+ smc_write_phy_register(ioaddr, phyaddr, PHY_CNTL_REG, PHY_CNTL_RST); -+ -+ // Wait for the reset to complete, or time out -+ timeout = 6; // Wait up to 3 seconds -+ while (timeout--) { -+ if (!(smc_read_phy_register(ioaddr, phyaddr, PHY_CNTL_REG) -+ & PHY_CNTL_RST)) -+ // reset complete -+ break; -+ smc_wait_ms(500); // wait 500 millisecs -+ if (signal_pending(current)) { // Exit anyway if signaled -+ PRINTK("%s: PHY reset interrupted by signal\n", -+ dev->name); -+ timeout = 0; -+ break; -+ } -+ } -+ -+ if (timeout < 1) { -+ printk("%s: PHY reset timed out\n", dev->name); -+ goto smc_phy_configure_exit; -+ } -+ -+ // Read PHY Register 18, Status Output -+ lp->lastPhy18 = smc_read_phy_register(ioaddr, phyaddr, PHY_INT_REG); -+ -+ // Enable PHY Interrupts (for register 18) -+ // Interrupts listed here are disabled -+ smc_write_phy_register(ioaddr, phyaddr, PHY_MASK_REG, -+ PHY_INT_LOSSSYNC | PHY_INT_CWRD | PHY_INT_SSD | -+ PHY_INT_ESD | PHY_INT_RPOL | PHY_INT_JAB | -+ PHY_INT_SPDDET | PHY_INT_DPLXDET); -+ -+ /* Configure the Receive/Phy Control register */ -+ SMC_SELECT_BANK( 0 ); -+ SMC_SET_RPC( lp->rpc_cur_mode ); -+ -+ // Copy our capabilities from PHY_STAT_REG to PHY_AD_REG -+ my_phy_caps = smc_read_phy_register(ioaddr, phyaddr, PHY_STAT_REG); -+ -+ // If the user requested no auto neg, then go set his request -+ if (!(lp->ctl_autoneg)) { -+ smc_phy_fixed(dev); -+ goto smc_phy_configure_exit; -+ } -+ -+ if( !( my_phy_caps & PHY_STAT_CAP_ANEG)) -+ { -+ printk(KERN_INFO "Auto negotiation NOT supported\n"); -+ smc_phy_fixed(dev); -+ goto smc_phy_configure_exit; -+ } -+ -+ my_ad_caps = PHY_AD_CSMA; // I am CSMA capable -+ -+ if (my_phy_caps & PHY_STAT_CAP_T4) -+ my_ad_caps |= PHY_AD_T4; -+ -+ if (my_phy_caps & PHY_STAT_CAP_TXF) -+ my_ad_caps |= PHY_AD_TX_FDX; -+ -+ if (my_phy_caps & PHY_STAT_CAP_TXH) -+ my_ad_caps |= PHY_AD_TX_HDX; -+ -+ if (my_phy_caps & PHY_STAT_CAP_TF) -+ my_ad_caps |= PHY_AD_10_FDX; -+ -+ if (my_phy_caps & PHY_STAT_CAP_TH) -+ my_ad_caps |= PHY_AD_10_HDX; -+ -+ // Disable capabilities not selected by our user -+ if (lp->ctl_rspeed != 100) -+ my_ad_caps &= ~(PHY_AD_T4|PHY_AD_TX_FDX|PHY_AD_TX_HDX); -+ -+ if (!lp->ctl_rfduplx) -+ my_ad_caps &= ~(PHY_AD_TX_FDX|PHY_AD_10_FDX); -+ -+ // Update our Auto-Neg Advertisement Register -+ smc_write_phy_register(ioaddr, phyaddr, PHY_AD_REG, my_ad_caps); -+ -+ // Read the register back. Without this, it appears that when -+ // auto-negotiation is restarted, sometimes it isn't ready and -+ // the link does not come up. -+ status = smc_read_phy_register(ioaddr, phyaddr, PHY_AD_REG); -+ -+ PRINTK2("%s: phy caps=%x\n", dev->name, my_phy_caps); -+ PRINTK2("%s: phy advertised caps=%x\n", dev->name, my_ad_caps); -+ -+ // Restart auto-negotiation process in order to advertise my caps -+ smc_write_phy_register( ioaddr, phyaddr, PHY_CNTL_REG, -+ PHY_CNTL_ANEG_EN | PHY_CNTL_ANEG_RST ); -+ -+ // Wait for the auto-negotiation to complete. This may take from -+ // 2 to 3 seconds. -+ // Wait for the reset to complete, or time out -+ timeout = 20; // Wait up to 10 seconds -+ while (timeout--) { -+ status = smc_read_phy_register(ioaddr, phyaddr, PHY_RMT_REG); -+ if (status & PHY_AD_ACK) -+ // auto-negotiate complete -+ break; -+ -+ smc_wait_ms(500); // wait 500 millisecs -+ if (signal_pending(current)) { // Exit anyway if signaled -+ printk(KERN_DEBUG -+ "%s: PHY auto-negotiate interrupted by signal\n", -+ dev->name); -+ timeout = 0; -+ break; -+ } -+ } -+ status = smc_read_phy_register(ioaddr, phyaddr, PHY_STAT_REG); -+ -+ if (timeout < 1) { -+ PRINTK("%s: PHY auto-negotiate timed out\n", dev->name); -+ } -+ -+ // Fail if we detected an auto-negotiate remote fault -+ if (status & PHY_STAT_REM_FLT) { -+ PRINTK("%s: PHY remote fault detected\n", dev->name); -+ } -+ -+ // Wait for link. Once the link is up, phy18 should be up to date -+ timeout = 200; -+ do -+ { -+ udelay(100); -+ status = smc_read_phy_register(ioaddr, phyaddr, PHY_STAT_REG); -+ } while ( ((status & PHY_STAT_LINK)==0) && --timeout); -+ -+ if (status & PHY_STAT_LINK) -+ { -+ PRINTK("%s: Ethernet Link Detected\n", dev->name); -+ } -+ -+ // The smc_phy_interrupt() routine will be called to update lastPhy18 -+ -+ // Set our sysctl parameters to match auto-negotiation results -+ if ( lp->lastPhy18 & PHY_INT_SPDDET ) { -+ PRINTK("%s: PHY 100BaseT\n", dev->name); -+ lp->rpc_cur_mode |= RPC_SPEED; -+ } else { -+ PRINTK("%s: PHY 10BaseT\n", dev->name); -+ lp->rpc_cur_mode &= ~RPC_SPEED; -+ } -+ -+ if ( lp->lastPhy18 & PHY_INT_DPLXDET ) { -+ PRINTK("%s: PHY Full Duplex\n", dev->name); -+ lp->rpc_cur_mode |= RPC_DPLX; -+ lp->tcr_cur_mode |= TCR_SWFDUP; -+ } else { -+ PRINTK("%s: PHY Half Duplex\n", dev->name); -+ lp->rpc_cur_mode &= ~RPC_DPLX; -+ lp->tcr_cur_mode &= ~TCR_SWFDUP; -+ } -+ -+ // Re-Configure the Receive/Phy Control register and TCR -+ SMC_SET_RPC( lp->rpc_cur_mode ); -+ SMC_SET_TCR( lp->tcr_cur_mode ); -+ -+smc_phy_configure_exit: -+ // Exit auto-negotiation -+ lp->autoneg_active = 0; -+} -+ -+/************************************************************************* -+ . smc_phy_interrupt -+ . -+ . Purpose: Handle interrupts relating to PHY register 18. This is -+ . called from the "hard" interrupt handler. -+ . -+ ************************************************************************/ -+static void -+smc_phy_interrupt(struct net_device* dev) -+{ -+ unsigned long ioaddr = dev->base_addr; -+ struct smc_local *lp = (struct smc_local *)dev->priv; -+ int phyaddr = lp->phyaddr; -+ int phy18; -+ -+ PRINTK2("%s: %s\n", dev->name, __FUNCTION__); -+ -+ for(;;) { -+ // Read PHY Register 18, Status Output -+ phy18 = smc_read_phy_register(ioaddr, phyaddr, PHY_INT_REG); -+ -+ // Exit if not more changes -+ if (phy18 == lp->lastPhy18) -+ break; -+ -+#if SMC_DEBUG > 1 -+ PRINTK2("%s: phy18=0x%04x\n", dev->name, phy18); -+ PRINTK2("%s: lastPhy18=0x%04x\n", dev->name, lp->lastPhy18); -+ -+ // Handle events -+ if ((phy18 & PHY_INT_LNKFAIL) != -+ (lp->lastPhy18 & PHY_INT_LNKFAIL)) -+ PRINTK2("%s: PHY Link Fail=%x\n", dev->name, -+ phy18 & PHY_INT_LNKFAIL); -+ -+ if ((phy18 & PHY_INT_LOSSSYNC) != -+ (lp->lastPhy18 & PHY_INT_LOSSSYNC)) -+ PRINTK2("%s: PHY LOSS SYNC=%x\n", dev->name, -+ phy18 & PHY_INT_LOSSSYNC); -+ -+ if ((phy18 & PHY_INT_CWRD) != (lp->lastPhy18 & PHY_INT_CWRD)) -+ PRINTK2("%s: PHY INVALID 4B5B code=%x\n", dev->name, -+ phy18 & PHY_INT_CWRD); -+ -+ if ((phy18 & PHY_INT_SSD) != (lp->lastPhy18 & PHY_INT_SSD)) -+ PRINTK2("%s: PHY No Start Of Stream=%x\n", dev->name, -+ phy18 & PHY_INT_SSD); -+ -+ if ((phy18 & PHY_INT_ESD) != (lp->lastPhy18 & PHY_INT_ESD)) -+ -+ PRINTK2("%s: PHY No End Of Stream=%x\n", dev->name, -+ phy18 & PHY_INT_ESD); -+ -+ if ((phy18 & PHY_INT_RPOL) != (lp->lastPhy18 & PHY_INT_RPOL)) -+ PRINTK2("%s: PHY Reverse Polarity Detected=%x\n", -+ dev->name, phy18 & PHY_INT_RPOL); -+ -+ if ((phy18 & PHY_INT_JAB) != (lp->lastPhy18 & PHY_INT_JAB)) -+ PRINTK2("%s: PHY Jabber Detected=%x\n", dev->name, -+ phy18 & PHY_INT_JAB); -+ -+ if ((phy18 & PHY_INT_SPDDET) != -+ (lp->lastPhy18 & PHY_INT_SPDDET)) -+ PRINTK2("%s: PHY Speed Detect=%x\n", dev->name, -+ phy18 & PHY_INT_SPDDET); -+ -+ if ((phy18 & PHY_INT_DPLXDET) != -+ (lp->lastPhy18 & PHY_INT_DPLXDET)) -+ PRINTK2("%s: PHY Duplex Detect=%x\n", dev->name, -+ phy18 & PHY_INT_DPLXDET); -+#endif -+ // Update the last phy 18 variable -+ lp->lastPhy18 = phy18; -+ } -+} -+ -+//--- END PHY CONTROL AND CONFIGURATION------------------------------------- -+ -+ -+/* -+ * This is the main routine of the driver, to handle the device when -+ * it needs some attention. -+ */ -+static void -+smc_interrupt(int irq, void *dev_id, struct pt_regs *regs) -+{ -+ struct net_device *dev = dev_id; -+ unsigned long ioaddr = dev->base_addr; -+ struct smc_local *lp = (struct smc_local *)dev->priv; -+ int status, mask, timeout, card_stats; -+ int saved_bank, saved_pointer; -+ -+ PRINTK3("%s: %s\n", dev->name, __FUNCTION__); -+ -+ saved_bank = SMC_CURRENT_BANK(); -+ SMC_SELECT_BANK(2); -+ saved_pointer = SMC_GET_PTR(); -+ mask = SMC_GET_INT_MASK(); -+ SMC_SET_INT_MASK( 0 ); -+ -+ /* set a timeout value, so I don't stay here forever */ -+ timeout = 8; -+ -+ do { -+ status = SMC_GET_INT(); -+ -+ PRINTK2("%s: IRQ 0x%02x MASK 0x%02x MEM 0x%04x FIFO 0x%04x\n", -+ dev->name, status, mask, -+ ({ int meminfo; SMC_SELECT_BANK(0); -+ meminfo = SMC_GET_MIR(); -+ SMC_SELECT_BANK(2); meminfo; }), -+ SMC_GET_FIFO()); -+ -+ status &= mask; -+ if (!status) -+ break; -+ -+ if (status & IM_RCV_INT) { -+ PRINTK3("%s: RX irq\n", dev->name); -+ smc_rcv(dev); -+ } else if (status & IM_TX_INT) { -+ PRINTK3("%s: TX int\n", dev->name); -+ smc_tx(dev); -+ SMC_ACK_INT( IM_TX_INT ); -+#if THROTTLE_TX_PKTS -+ netif_wake_queue(dev); -+#endif -+ } else if (status & IM_ALLOC_INT) { -+ PRINTK3("%s: Allocation irq\n", dev->name); -+ smc_hardware_send_packet(dev); -+ mask |= (IM_TX_INT | IM_TX_EMPTY_INT); -+ mask &= ~IM_ALLOC_INT; -+#if ! THROTTLE_TX_PKTS -+ netif_wake_queue(dev); -+#endif -+ } else if (status & IM_TX_EMPTY_INT) { -+ PRINTK3("%s: TX empty\n", dev->name); -+ mask &= ~IM_TX_EMPTY_INT; -+ -+ /* update stats */ -+ SMC_SELECT_BANK( 0 ); -+ card_stats = SMC_GET_COUNTER(); -+ SMC_SELECT_BANK( 2 ); -+ -+ /* single collisions */ -+ lp->stats.collisions += card_stats & 0xF; -+ card_stats >>= 4; -+ -+ /* multiple collisions */ -+ lp->stats.collisions += card_stats & 0xF; -+ } else if (status & IM_RX_OVRN_INT) { -+ PRINTK1( "%s: RX overrun\n", dev->name); -+ SMC_ACK_INT( IM_RX_OVRN_INT ); -+ lp->stats.rx_errors++; -+ lp->stats.rx_fifo_errors++; -+ } else if (status & IM_EPH_INT) { -+ PRINTK("%s: UNSUPPORTED: EPH INTERRUPT\n", dev->name); -+ } else if (status & IM_MDINT) { -+ SMC_ACK_INT( IM_MDINT ); -+ smc_phy_interrupt(dev); -+ } else if (status & IM_ERCV_INT ) { -+ SMC_ACK_INT( IM_ERCV_INT ); -+ PRINTK("%s: UNSUPPORTED: ERCV INTERRUPT \n", dev->name); -+ } -+ } while (--timeout); -+ -+ /* restore register states */ -+ SMC_SET_INT_MASK( mask ); -+ SMC_SET_PTR( saved_pointer ); -+ SMC_SELECT_BANK( saved_bank ); -+ -+ PRINTK3("%s: Interrupt done\n", dev->name); -+} -+ -+/* Our watchdog timed out. Called by the networking layer */ -+static void -+smc_timeout(struct net_device *dev) -+{ -+ struct smc_local *lp = (struct smc_local *)dev->priv; -+ -+ PRINTK2("%s: %s\n", dev->name, __FUNCTION__); -+ -+ smc_reset(dev); -+ smc_enable(dev); -+ -+#if 0 -+ /* Reconfiguring the PHY doesn't seem like a bad idea here, but -+ * it introduced a problem. Now that this is a timeout routine, -+ * we are getting called from within an interrupt context. -+ * smc_phy_configure() calls smc_wait_ms() which calls -+ * schedule_timeout() which calls schedule(). When schedule() -+ * is called from an interrupt context, it prints out -+ * "Scheduling in interrupt" and then calls BUG(). This is -+ * obviously not desirable. This was worked around by removing -+ * the call to smc_phy_configure() here because it didn't seem -+ * absolutely necessary. Ultimately, if smc_wait_ms() is -+ * supposed to be usable from an interrupt context (which it -+ * looks like it thinks it should handle), it should be fixed. -+ */ -+ /* Reconfigure the PHY */ -+ smc_phy_configure(dev); -+#endif -+ -+ /* clear anything saved */ -+ if (lp->saved_skb != NULL) { -+ dev_kfree_skb (lp->saved_skb); -+ lp->saved_skb = NULL; -+ lp->stats.tx_errors++; -+ lp->stats.tx_aborted_errors++; -+ } -+ dev->trans_start = jiffies; -+ netif_wake_queue(dev); -+} -+ -+/* -+ * Finds the CRC32 of a set of bytes. -+ * (from Peter Cammaert's code) -+ */ -+static int -+crc32(char *s, int length) -+{ -+ /* indices */ -+ int perByte; -+ int perBit; -+ /* crc polynomial for Ethernet */ -+ const unsigned long poly = 0xedb88320; -+ /* crc value - preinitialized to all 1's */ -+ unsigned long crc_value = 0xffffffff; -+ -+ for ( perByte = 0; perByte < length; perByte ++ ) { -+ unsigned char c; -+ -+ c = *(s++); -+ for ( perBit = 0; perBit < 8; perBit++ ) { -+ crc_value = (crc_value>>1)^ -+ (((crc_value^c)&0x01)?poly:0); -+ c >>= 1; -+ } -+ } -+ return crc_value; -+} -+ -+/* -+ . This sets the internal hardware table to filter out unwanted multicast -+ . packets before they take up memory. -+ . -+ . The SMC chip uses a hash table where the high 6 bits of the CRC of -+ . address are the offset into the table. If that bit is 1, then the -+ . multicast packet is accepted. Otherwise, it's dropped silently. -+ . -+ . To use the 6 bits as an offset into the table, the high 3 bits are the -+ . number of the 8 bit register, while the low 3 bits are the bit within -+ . that register. -+ . -+ . This routine is based very heavily on the one provided by Peter Cammaert. -+*/ -+static void -+smc_setmulticast(unsigned long ioaddr, int count, struct dev_mc_list *addrs) -+{ -+ int i; -+ unsigned char multicast_table[ 8 ]; -+ struct dev_mc_list *cur_addr; -+ -+ /* table for flipping the order of 3 bits */ -+ static unsigned char invert3[] = { 0, 4, 2, 6, 1, 5, 3, 7 }; -+ -+ /* start with a table of all zeros: reject all */ -+ memset( multicast_table, 0, sizeof( multicast_table ) ); -+ -+ cur_addr = addrs; -+ for ( i = 0; i < count ; i ++, cur_addr = cur_addr->next ) { -+ int position; -+ -+ /* do we have a pointer here? */ -+ if ( !cur_addr ) -+ break; -+ /* make sure this is a multicast address - shouldn't this -+ be a given if we have it here ? */ -+ if ( !( *cur_addr->dmi_addr & 1 ) ) -+ continue; -+ -+ /* only use the low order bits */ -+ position = crc32( cur_addr->dmi_addr, 6 ) & 0x3f; -+ -+ /* do some messy swapping to put the bit in the right spot */ -+ multicast_table[invert3[position&7]] |= -+ (1<<invert3[(position>>3)&7]); -+ -+ } -+ /* now, the table can be loaded into the chipset */ -+ SMC_SELECT_BANK( 3 ); -+ SMC_SET_MCAST( multicast_table ); -+} -+ -+/* -+ . This routine will, depending on the values passed to it, -+ . either make it accept multicast packets, go into -+ . promiscuous mode ( for TCPDUMP and cousins ) or accept -+ . a select set of multicast packets -+*/ -+static void smc_set_multicast_list(struct net_device *dev) -+{ -+ struct smc_local *lp = (struct smc_local *)dev->priv; -+ unsigned long ioaddr = dev->base_addr; -+ -+ PRINTK2("%s: %s\n", dev->name, __FUNCTION__); -+ -+ SMC_SELECT_BANK(0); -+ if ( dev->flags & IFF_PROMISC ) { -+ PRINTK2("%s: RCR_PRMS\n", dev->name); -+ lp->rcr_cur_mode |= RCR_PRMS; -+ SMC_SET_RCR( lp->rcr_cur_mode ); -+ } -+ -+/* BUG? I never disable promiscuous mode if multicasting was turned on. -+ Now, I turn off promiscuous mode, but I don't do anything to multicasting -+ when promiscuous mode is turned on. -+*/ -+ -+ /* Here, I am setting this to accept all multicast packets. -+ I don't need to zero the multicast table, because the flag is -+ checked before the table is -+ */ -+ else if (dev->flags & IFF_ALLMULTI) { -+ lp->rcr_cur_mode |= RCR_ALMUL; -+ SMC_SET_RCR( lp->rcr_cur_mode ); -+ PRINTK2("%s: RCR_ALMUL\n", dev->name); -+ } -+ -+ /* We just get all multicast packets even if we only want them -+ . from one source. This will be changed at some future -+ . point. */ -+ else if (dev->mc_count ) { -+ /* support hardware multicasting */ -+ -+ /* be sure I get rid of flags I might have set */ -+ lp->rcr_cur_mode &= ~(RCR_PRMS | RCR_ALMUL); -+ SMC_SET_RCR( lp->rcr_cur_mode ); -+ /* NOTE: this has to set the bank, so make sure it is the -+ last thing called. The bank is set to zero at the top */ -+ smc_setmulticast( ioaddr, dev->mc_count, dev->mc_list ); -+ } else { -+ PRINTK2("%s: ~(RCR_PRMS|RCR_ALMUL)\n", dev->name); -+ lp->rcr_cur_mode &= ~(RCR_PRMS | RCR_ALMUL); -+ SMC_SET_RCR( lp->rcr_cur_mode ); -+ -+ /* -+ since I'm disabling all multicast entirely, I need to -+ clear the multicast list -+ */ -+ SMC_SELECT_BANK( 3 ); -+ SMC_CLEAR_MCAST(); -+ } -+} -+ -+ -+/* -+ * Open and Initialize the board -+ * -+ * Set up everything, reset the card, etc .. -+ */ -+static int -+smc_open(struct net_device *dev) -+{ -+ struct smc_local *lp = (struct smc_local *)dev->priv; -+ unsigned long ioaddr = dev->base_addr; -+ -+ PRINTK2("%s: %s\n", dev->name, __FUNCTION__); -+ -+ /* clear out all the junk that was put here before... */ -+ memset(dev->priv, 0, sizeof(struct smc_local)); -+ -+ // Setup the default Register Modes -+ lp->tcr_cur_mode = TCR_DEFAULT; -+ lp->rcr_cur_mode = RCR_DEFAULT; -+ lp->rpc_cur_mode = RPC_DEFAULT; -+ -+ /* Set default parameters */ -+#ifdef CONFIG_ARCH_RAMSES -+ lp->ctl_autoneg = 0; -+ lp->ctl_rfduplx = 0; -+ lp->ctl_rspeed = 10; -+#else -+ lp->ctl_autoneg = 1; -+ lp->ctl_rfduplx = 1; -+ lp->ctl_rspeed = 100; -+#endif -+ -+ SMC_SELECT_BANK(3); -+ lp->version = SMC_GET_REV() & 0xff; -+ -+ /* reset the hardware */ -+ smc_reset(dev); -+ smc_enable(dev); -+ -+ SMC_SELECT_BANK( 1 ); -+ SMC_SET_MAC_ADDR(dev->dev_addr); -+ -+ /* Configure the PHY */ -+ if (lp->version >= 0x70) -+ smc_phy_configure(dev); -+ -+ netif_start_queue(dev); -+ return 0; -+} -+ -+/*---------------------------------------------------- -+ . smc_close -+ . -+ . this makes the board clean up everything that it can -+ . and not talk to the outside world. Caused by -+ . an 'ifconfig ethX down' -+ . -+ -----------------------------------------------------*/ -+static int -+smc_close(struct net_device *dev) -+{ -+ PRINTK2("%s: %s\n", dev->name, __FUNCTION__); -+ -+ netif_stop_queue(dev); -+ -+ /* clear everything */ -+ smc_shutdown(dev); -+ -+ return 0; -+} -+ -+/*------------------------------------------------------------ -+ . Get the current statistics. -+ . This may be called with the card open or closed. -+ .-------------------------------------------------------------*/ -+static struct net_device_stats * -+smc_query_statistics(struct net_device *dev) -+{ -+ struct smc_local *lp = (struct smc_local *)dev->priv; -+ -+ PRINTK2("%s: %s\n", dev->name, __FUNCTION__); -+ -+ return &lp->stats; -+} -+ -+/*---------------------------------------------------------------------- -+ . smc_findirq -+ . -+ . This routine has a simple purpose -- make the SMC chip generate an -+ . interrupt, so an auto-detect routine can detect it, and find the IRQ, -+ ------------------------------------------------------------------------ -+*/ -+int __init -+smc_findirq( unsigned long ioaddr ) -+{ -+ int timeout = 20; -+ unsigned long cookie; -+ -+ PRINTK2("%s: %s\n", CARDNAME, __FUNCTION__); -+ -+ cookie = probe_irq_on(); -+ -+ /* -+ * What I try to do here is trigger an ALLOC_INT. This is done -+ * by allocating a small chunk of memory, which will give an interrupt -+ * when done. -+ */ -+ -+ /* enable ALLOCation interrupts ONLY */ -+ SMC_SELECT_BANK(2); -+ SMC_SET_INT_MASK( IM_ALLOC_INT ); -+ -+ /* -+ . Allocate 512 bytes of memory. Note that the chip was just -+ . reset so all the memory is available -+ */ -+ SMC_SET_MMU_CMD( MC_ALLOC | 1 ); -+ -+ /* -+ . Wait until positive that the interrupt has been generated -+ */ -+ do { -+ int int_status; -+ udelay(10); -+ int_status = SMC_GET_INT(); -+ if (int_status & IM_ALLOC_INT) -+ break; /* got the interrupt */ -+ } while (--timeout); -+ -+ /* there is really nothing that I can do here if timeout fails, -+ as autoirq_report will return a 0 anyway, which is what I -+ want in this case. Plus, the clean up is needed in both -+ cases. */ -+ -+ /* and disable all interrupts again */ -+ SMC_SET_INT_MASK( 0 ); -+ -+ /* and return what I found */ -+ return probe_irq_off(cookie); -+} -+ -+/*---------------------------------------------------------------------- -+ . Function: smc_probe( unsigned long ioaddr ) -+ . -+ . Purpose: -+ . Tests to see if a given ioaddr points to an SMC91x chip. -+ . Returns a 0 on success -+ . -+ . Algorithm: -+ . (1) see if the high byte of BANK_SELECT is 0x33 -+ . (2) compare the ioaddr with the base register's address -+ . (3) see if I recognize the chip ID in the appropriate register -+ . -+ .--------------------------------------------------------------------- -+ */ -+/*--------------------------------------------------------------- -+ . Here I do typical initialization tasks. -+ . -+ . o Initialize the structure if needed -+ . o print out my vanity message if not done so already -+ . o print out what type of hardware is detected -+ . o print out the ethernet address -+ . o find the IRQ -+ . o set up my private data -+ . o configure the dev structure with my subroutines -+ . o actually GRAB the irq. -+ . o GRAB the region -+ .----------------------------------------------------------------- -+*/ -+static int __init -+smc_probe(struct net_device *dev, unsigned long ioaddr) -+{ -+ struct smc_local *lp = (struct smc_local *)dev->priv; -+ static int version_printed = 0; -+ int i, retval; -+ unsigned int val, revision_register; -+ const char *version_string; -+ -+ PRINTK2("%s: %s\n", CARDNAME, __FUNCTION__); -+ -+ /* Grab the region so that no one else tries to probe our ioports. */ -+ if (!request_region(ioaddr, SMC_IO_EXTENT, dev->name)) -+ return -EBUSY; -+ -+ /* First, see if the high byte is 0x33 */ -+ val = SMC_CURRENT_BANK(); -+ PRINTK2("%s: bank signature probe returned 0x%04x\n", CARDNAME, val); -+ if ( (val & 0xFF00) != 0x3300 ) { -+ if ( (val & 0xFF) == 0x33 ) { -+ printk( KERN_WARNING -+ "%s: Detected possible byte-swapped interface" -+ " at IOADDR 0x%lx\n", CARDNAME, ioaddr); -+ } -+ retval = -ENODEV; -+ goto err_out; -+ } -+ -+ /* The above MIGHT indicate a device, but I need to write to further -+ test this. */ -+ SMC_SELECT_BANK(0); -+ val = SMC_CURRENT_BANK(); -+ if ( (val & 0xFF00 ) != 0x3300 ) { -+ retval = -ENODEV; -+ goto err_out; -+ } -+ -+ /* well, we've already written once, so hopefully another time won't -+ hurt. This time, I need to switch the bank register to bank 1, -+ so I can access the base address register */ -+ SMC_SELECT_BANK(1); -+ val = SMC_GET_BASE(); -+ val = ((val & 0x1F00) >> 3) << SMC_IO_SHIFT; -+ if ( (ioaddr & ((PAGE_SIZE-1)<<SMC_IO_SHIFT)) != val ) { -+ printk( "%s: IOADDR %lx doesn't match configuration (%x).\n", -+ CARDNAME, ioaddr, val ); -+ } -+ -+ /* check if the revision register is something that I recognize. -+ These might need to be added to later, as future revisions -+ could be added. */ -+ SMC_SELECT_BANK(3); -+ revision_register = SMC_GET_REV(); -+ PRINTK2("%s: revision = 0x%04x\n", CARDNAME, revision_register); -+ version_string = chip_ids[ (revision_register >> 4) & 0xF]; -+ if (!version_string || (revision_register & 0xff00) != 0x3300) { -+ /* I don't recognize this chip, so... */ -+ printk( "%s: IO 0x%lx: Unrecognized revision register 0x%04x" -+ ", Contact author.\n", CARDNAME, -+ ioaddr, revision_register); -+ -+ retval = -ENODEV; -+ goto err_out; -+ } -+ -+ /* At this point I'll assume that the chip is an SMC91x. */ -+ if (version_printed++ == 0) -+ printk("%s", version); -+ -+ /* set the private data to zero by default */ -+ memset(lp, 0, sizeof(struct smc_local)); -+ -+ /* fill in some of the fields */ -+ dev->base_addr = ioaddr; -+ lp->version = revision_register & 0xff; -+ -+ /* Get the MAC address */ -+ SMC_SELECT_BANK( 1 ); -+ SMC_GET_MAC_ADDR(dev->dev_addr); -+ -+ /* now, reset the chip, and put it into a known state */ -+ smc_reset( dev ); -+ -+ /* -+ . If dev->irq is 0, then the device has to be banged on to see -+ . what the IRQ is. -+ . -+ . This banging doesn't always detect the IRQ, for unknown reasons. -+ . a workaround is to reset the chip and try again. -+ . -+ . Interestingly, the DOS packet driver *SETS* the IRQ on the card to -+ . be what is requested on the command line. I don't do that, mostly -+ . because the card that I have uses a non-standard method of accessing -+ . the IRQs, and because this _should_ work in most configurations. -+ . -+ . Specifying an IRQ is done with the assumption that the user knows -+ . what (s)he is doing. No checking is done!!!! -+ . -+ */ -+ if ( dev->irq < 1 ) { -+ int trials; -+ -+ trials = 3; -+ while ( trials-- ) { -+ dev->irq = smc_findirq( ioaddr ); -+ if ( dev->irq ) -+ break; -+ /* kick the card and try again */ -+ smc_reset( dev ); -+ } -+ } -+ if (dev->irq == 0 ) { -+ printk("%s: Couldn't autodetect your IRQ. Use irq=xx.\n", -+ dev->name); -+ retval = -ENODEV; -+ goto err_out; -+ } -+ dev->irq = irq_cannonicalize(dev->irq); -+ -+ /* now, print out the card info, in a short format.. */ -+ printk( "%s: %s (rev %d) at %#lx IRQ %d%s%s\n", -+ dev->name, version_string, revision_register & 0x0f, -+ ioaddr, dev->irq, nowait ? " [nowait]" : "", -+ THROTTLE_TX_PKTS ? " [throttle_tx]" : "" ); -+ -+ /* Print the Ethernet address */ -+ printk("%s: Ethernet addr: ", dev->name); -+ for (i = 0; i < 5; i++) -+ printk("%2.2x:", dev->dev_addr[i] ); -+ printk("%2.2x\n", dev->dev_addr[5] ); -+ -+ /* Fill in the fields of the device structure with ethernet values. */ -+ ether_setup(dev); -+ -+ /* Grab the IRQ */ -+ retval = request_irq(dev->irq, &smc_interrupt, 0, dev->name, dev); -+ if (retval) { -+ goto err_out; -+ } -+ -+ dev->open = smc_open; -+ dev->stop = smc_close; -+ dev->hard_start_xmit = smc_hard_start_xmit; -+ dev->tx_timeout = smc_timeout; -+ dev->watchdog_timeo = HZ/10; -+ dev->get_stats = smc_query_statistics; -+ dev->set_multicast_list = smc_set_multicast_list; -+ -+ return 0; -+ -+err_out: -+ release_region(ioaddr, SMC_IO_EXTENT); -+ return retval; -+} -+ -+/*------------------------------------------------------------------------- -+ | -+ | smc_init( void ) -+ | Input parameters: -+ | dev->base_addr == 0, try to find all possible locations -+ | dev->base_addr > 0x1ff, this is the address to check -+ | dev->base_addr == <anything else>, return failure code -+ | -+ | Output: -+ | 0 --> there is a device -+ | anything else, error -+ | -+ --------------------------------------------------------------------------- -+*/ -+static struct net_device *global_dev = NULL; /* needs to be fixed */ -+ -+#ifdef CONFIG_PM -+ -+static int smc_pm_callback(struct pm_dev *dev, pm_request_t rqst, void *data) -+{ -+ unsigned long ioaddr = global_dev->base_addr; -+ struct smc_local *lp = (struct smc_local *)global_dev->priv; -+ -+ switch (rqst) { -+ case PM_SUSPEND: -+ smc_shutdown(global_dev); -+ break; -+ case PM_RESUME: -+ smc_reset(global_dev); -+ smc_enable(global_dev); -+ SMC_SELECT_BANK( 1 ); -+ SMC_SET_MAC_ADDR(global_dev->dev_addr); -+ if (lp->version >= 0x70) -+ smc_phy_configure(global_dev); -+ break; -+ } -+ return 0; -+} -+ -+#endif -+ -+static int __init -+smc_init(void) -+{ -+ int ret; -+ -+ PRINTK2("%s: %s\n", CARDNAME, __FUNCTION__); -+ -+#ifdef MODULE -+ if (io == -1) -+ printk( KERN_WARNING -+ "%s: You shouldn't use auto-probing with insmod!\n", -+ CARDNAME ); -+#endif -+ -+ if (global_dev) { -+ printk("%s: already initialized.\n", CARDNAME); -+ return -EBUSY; -+ } -+ -+ global_dev = init_etherdev(0, sizeof(struct smc_local)); -+ if (!global_dev) { -+ printk("%s: could not allocate device.\n", CARDNAME); -+ return -ENOMEM; -+ } -+ SET_MODULE_OWNER(global_dev); -+ -+ /* copy the parameters from insmod into the device structure */ -+ if (io != -1) -+ global_dev->base_addr = io; -+ if (irq != -1) -+ global_dev->irq = irq; -+ -+#ifdef CONFIG_ISA -+ /* try a specific location */ -+ if (global_dev->base_addr > 0x1ff) -+ ret = smc_probe(global_dev, global_dev->base_addr); -+ else if (global_dev->base_addr != 0) -+ ret = -ENXIO; -+ else { -+ int i; -+ -+ /* check every ethernet address */ -+ for (i = 0; smc_portlist[i]; i++) { -+ ret = smc_probe(global_dev, smc_portlist[i]); -+ if (ret == 0) -+ break; -+ } -+ } -+#elif defined(CONFIG_ARCH_LUBBOCK) -+ { -+ int ioaddr = LUBBOCK_ETH_VIRT + (0x300 << 2); -+ volatile int *attaddr = (int *)(LUBBOCK_ETH_VIRT + 0x100000); -+ unsigned long flags; -+ -+ /* first reset, then enable the device. Sequence is critical */ -+ local_irq_save(flags); -+ attaddr[ECOR] |= ECOR_RESET; -+ udelay(100); -+ attaddr[ECOR] &= ~ECOR_RESET; -+ attaddr[ECOR] |= ECOR_ENABLE; -+ -+ /* force 16-bit mode */ -+ attaddr[ECSR] &= ~ECSR_IOIS8; -+ mdelay(1); -+ local_irq_restore(flags); -+ -+ global_dev->irq = LUBBOCK_ETH_IRQ; -+ ret = smc_probe(global_dev, ioaddr); -+ } -+#elif defined(CONFIG_ARCH_PXA_IDP) -+ { -+ int ioaddr = IDP_ETH_BASE + 0x300; -+ global_dev->irq = SMC_IRQ; -+ ret = smc_probe(global_dev, ioaddr); -+ } -+#elif defined(CONFIG_ARCH_RAMSES) -+ { -+ int ioaddr = RAMSES_ETH_BASE + 0x300; -+ global_dev->irq = SMC_IRQ; -+ ret = smc_probe(global_dev, ioaddr); -+ } -+#else -+ if (global_dev->base_addr == -1) { -+ printk(KERN_WARNING"%s: SMC91X_BASE_ADDR not set!\n", CARDNAME); -+ ret = -ENXIO; -+ } else { -+ void *ioaddr = ioremap(global_dev->base_addr, SMC_IO_EXTENT); -+ ret = smc_probe(global_dev, (unsigned long)ioaddr); -+ if (ret != 0) -+ iounmap(ioaddr); -+ } -+#endif -+ -+#ifdef SMC_USE_PXA_DMA -+ if (ret == 0) { -+ int dma = pxa_request_dma(global_dev->name, DMA_PRIO_LOW, -+ smc_pxa_dma_irq, NULL); -+ if (dma >= 0) { -+ global_dev->dma = dma; -+ PRINTK("%s: using DMA channel %d\n", global_dev->name, dma); -+ } else { -+ global_dev->dma = -1; -+ } -+ } -+#endif -+ -+#ifdef CONFIG_PM -+ if (ret == 0) { -+ struct smc_local *lp = (struct smc_local *)global_dev->priv; -+ lp->pm = pm_register(PM_SYS_UNKNOWN, 0x73393178, smc_pm_callback); -+ } -+#endif -+ -+ if (ret != 0) { -+ printk("%s: not found.\n", CARDNAME); -+ kfree(global_dev->priv); -+ unregister_netdev(global_dev); -+ kfree(global_dev); -+ } -+ -+ return ret; -+} -+ -+static void __exit -+smc_cleanup(void) -+{ -+ unregister_netdev(global_dev); -+#ifdef CONFIG_PM -+ { -+ struct smc_local *lp = (struct smc_local *)global_dev->priv; -+ pm_unregister(lp->pm); -+ } -+#endif -+ free_irq(global_dev->irq, global_dev); -+ release_region(global_dev->base_addr, SMC_IO_EXTENT); -+ -+#ifndef CONFIG_ISA -+ iounmap((void *)global_dev->base_addr); -+#endif -+ -+ kfree(global_dev); -+ global_dev = NULL; -+} -+ -+module_init(smc_init); -+module_exit(smc_cleanup); -+ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/net/smc91x.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,835 @@ -+/*------------------------------------------------------------------------ -+ . smc91x.h - macros for SMSC's 91C9x/91C1xx single-chip Ethernet device. -+ . -+ . Copyright (C) 1996 by Erik Stahlman -+ . Copyright (C) 2001 Standard Microsystems Corporation -+ . Developed by Simple Network Magic Corporation -+ . Copyright (C) 2003 Monta Vista Software, Inc. -+ . Unified SMC91x driver by Nicolas Pitre -+ . -+ . This program is free software; you can redistribute it and/or modify -+ . it under the terms of the GNU General Public License as published by -+ . the Free Software Foundation; either version 2 of the License, or -+ . (at your option) any later version. -+ . -+ . This program is distributed in the hope that it will be useful, -+ . but WITHOUT ANY WARRANTY; without even the implied warranty of -+ . MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ . GNU General Public License for more details. -+ . -+ . You should have received a copy of the GNU General Public License -+ . along with this program; if not, write to the Free Software -+ . Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+ . -+ . Information contained in this file was obtained from the LAN91C111 -+ . manual from SMC. To get a copy, if you really want one, you can find -+ . information under www.smsc.com. -+ . -+ . Authors -+ . Erik Stahlman <erik@vt.edu> -+ . Daris A Nevil <dnevil@snmc.com> -+ . Nicolas Pitre <nico@cam.org> -+ . -+ ---------------------------------------------------------------------------*/ -+#ifndef _SMC91X_H_ -+#define _SMC91X_H_ -+ -+ -+/* -+ * Define your architecture specific configuration parameters here. -+ */ -+ -+#if defined(CONFIG_SA1100_GRAPHICSCLIENT) || \ -+ defined(CONFIG_SA1100_PFS168) || \ -+ defined(CONFIG_SA1100_FLEXANET) || \ -+ defined(CONFIG_SA1100_GRAPHICSMASTER) || \ -+ defined(CONFIG_ARCH_LUBBOCK) -+ -+/* We can only do 16-bit reads and writes in the static memory space. */ -+#define SMC_CAN_USE_8BIT 0 -+#define SMC_CAN_USE_16BIT 1 -+#define SMC_CAN_USE_32BIT 0 -+#define SMC_NOWAIT 1 -+ -+/* The first two address lines aren't connected... */ -+#define SMC_IO_SHIFT 2 -+ -+#define SMC_inw(a, r) readw((a) + (r)) -+#define SMC_outw(v, a, r) writew(v, (a) + (r)) -+#define SMC_insw(a, r, p, l) insw((a) + (r), p, l) -+#define SMC_outsw(a, r, p, l) outsw((a) + (r), p, l) -+ -+#ifdef CONFIG_ARCH_LUBBOCK -+#define SMC_IOADDR LUBBOCK_ETH_PHYS -+#endif -+ -+#elif defined(CONFIG_ARCH_MAINSTONE) || defined(CONFIG_ARCH_PXA_IDP) || defined(CONFIG_ARCH_RAMSES) -+ -+#ifdef CONFIG_ARCH_MAINSTONE -+#include <asm/arch/mainstone.h> -+#define SMC_IOADDR (MST_ETH_PHYS + 0x300) -+#define SMC_IRQ MAINSTONE_IRQ(3) -+ -+#elif CONFIG_ARCH_PXA_IDP -+#include <asm/arch/idp.h> -+#define SMC_IOADDR (IDP_ETH_PHYS + 0x300) -+#define SMC_IRQ ETHERNET_IRQ -+ -+#elif CONFIG_ARCH_RAMSES -+#include <asm/arch/ramses.h> -+#define SMC_IOADDR (RAMSES_ETH_PHYS + 0x300) -+#define SMC_IRQ ETHERNET_IRQ -+#endif -+ -+#define SMC_CAN_USE_8BIT 1 -+#define SMC_CAN_USE_16BIT 1 -+#define SMC_CAN_USE_32BIT 1 -+#define SMC_IO_SHIFT 0 -+#define SMC_NOWAIT 1 -+#define SMC_USE_PXA_DMA 1 -+ -+#define SMC_inb(a, r) readb((a) + (r)) -+#define SMC_inw(a, r) readw((a) + (r)) -+#define SMC_inl(a, r) readl((a) + (r)) -+#define SMC_outb(v, a, r) writeb(v, (a) + (r)) -+#define SMC_outl(v, a, r) writel(v, (a) + (r)) -+#define SMC_insl(a, r, p, l) insl((a) + (r), p, l) -+#define SMC_outsl(a, r, p, l) outsl((a) + (r), p, l) -+ -+/* We actually can't write halfwords properly if not word aligned */ -+static inline void -+SMC_outw(u16 val, unsigned long ioaddr, int reg) -+{ -+ if (reg & 2) { -+ unsigned int v = val << 16; -+ v |= readl(ioaddr + (reg & ~2)) & 0xffff; -+ writel(v, ioaddr + (reg & ~2)); -+ } else { -+ writew(val, ioaddr + reg); -+ } -+} -+ -+#elif defined(CONFIG_ISA) -+ -+#define SMC_CAN_USE_8BIT 1 -+#define SMC_CAN_USE_16BIT 1 -+#define SMC_CAN_USE_32BIT 0 -+ -+#define SMC_inb(a, r) inb((a) + (r)) -+#define SMC_inw(a, r) inw((a) + (r)) -+#define SMC_outb(v, a, r) outb(v, (a) + (r)) -+#define SMC_outw(v, a, r) outw(v, (a) + (r)) -+#define SMC_insw(a, r, p, l) insw((a) + (r), p, l) -+#define SMC_outsw(a, r, p, l) outsw((a) + (r), p, l) -+ -+#endif -+ -+ -+#ifdef SMC_USE_PXA_DMA -+/* -+ * Let's use the DMA engine on the XScale PXA2xx for RX packets. This is -+ * always happening in irq context so no need to worry about races. TX is -+ * different and probably not worth it for that reason, and not as critical -+ * as RX which can overrun memory and lose packets. -+ */ -+#include <linux/pci.h> -+#include <asm/dma.h> -+ -+#ifdef SMC_insl -+#undef SMC_insl -+#define SMC_insl(a, r, p, l) smc_pxa_dma_insl(a, r, dev->dma, p, l) -+static inline void -+smc_pxa_dma_insl(u_long ioaddr, int reg, int dma, u_char *buf, int len) -+{ -+ dma_addr_t dmabuf; -+ -+ /* fallback if no DMA available */ -+ if (dma == -1) { -+ insl(ioaddr + reg, buf, len); -+ return; -+ } -+ -+ /* 64 bit alignment is required for memory to memory DMA */ -+ if ((long)buf & 4) { -+ *((u32 *)buf)++ = SMC_inl(ioaddr, reg); -+ len--; -+ } -+ -+ len *= 4; -+ dmabuf = pci_map_single(NULL, buf, len, PCI_DMA_FROMDEVICE); -+ DCSR(dma) = DCSR_NODESC; -+ DTADR(dma) = dmabuf; -+ DSADR(dma) = SMC_IOADDR + reg; -+ DCMD(dma) = (DCMD_INCTRGADDR | DCMD_BURST32 | -+ DCMD_WIDTH4 | (DCMD_LENGTH & len)); -+ DCSR(dma) = DCSR_NODESC | DCSR_RUN; -+ while (!(DCSR(dma) & DCSR_STOPSTATE)); -+ DCSR(dma) = 0; -+ pci_unmap_single(NULL, dmabuf,len, PCI_DMA_FROMDEVICE); -+} -+#endif -+ -+#ifdef SMC_insw -+#undef SMC_insw -+#define SMC_insw(a, r, p, l) smc_pxa_dma_insw(a, r, dev->dma, p, l) -+static inline void -+smc_pxa_dma_insw(u_long ioaddr, int reg, int dma, u_char *buf, int len) -+{ -+ dma_addr_t dmabuf; -+ -+ /* fallback if no DMA available */ -+ if (dma == -1) { -+ insw(ioaddr + reg, buf, len); -+ return; -+ } -+ -+ /* 64 bit alignment is required for memory to memory DMA */ -+ while ((long)buf & 6) { -+ *((u16 *)buf)++ = SMC_inw(ioaddr, reg); -+ len--; -+ } -+ -+ len *= 2; -+ dmabuf = pci_map_single(NULL, buf, len, PCI_DMA_FROMDEVICE); -+ DCSR(dma) = DCSR_NODESC; -+ DTADR(dma) = dmabuf; -+ DSADR(dma) = SMC_IOADDR + reg; -+ DCMD(dma) = (DCMD_INCTRGADDR | DCMD_BURST32 | -+ DCMD_WIDTH2 | (DCMD_LENGTH & len)); -+ DCSR(dma) = DCSR_NODESC | DCSR_RUN; -+ while (!(DCSR(dma) & DCSR_STOPSTATE)); -+ DCSR(dma) = 0; -+ pci_unmap_single(NULL, dmabuf,len, PCI_DMA_FROMDEVICE); -+} -+#endif -+ -+static void -+smc_pxa_dma_irq(int dma, void *dummy, struct pt_regs *regs) -+{ -+ DCSR(dma) = 0; -+} -+#endif /* SMC_USE_PXA_DMA */ -+ -+ -+/* Because of bank switching, the LAN91xxx uses only 16 I/O ports */ -+#ifndef SMC_IO_SHIFT -+#define SMC_IO_SHIFT 0 -+#endif -+#define SMC_IO_EXTENT (16 << SMC_IO_SHIFT) -+ -+ -+/* -+ . Bank Select Register: -+ . -+ . yyyy yyyy 0000 00xx -+ . xx = bank number -+ . yyyy yyyy = 0x33, for identification purposes. -+*/ -+#define BANK_SELECT (14 << SMC_IO_SHIFT) -+ -+ -+// Transmit Control Register -+/* BANK 0 */ -+#define TCR_REG SMC_REG(0x0000, 0) -+#define TCR_ENABLE 0x0001 // When 1 we can transmit -+#define TCR_LOOP 0x0002 // Controls output pin LBK -+#define TCR_FORCOL 0x0004 // When 1 will force a collision -+#define TCR_PAD_EN 0x0080 // When 1 will pad tx frames < 64 bytes w/0 -+#define TCR_NOCRC 0x0100 // When 1 will not append CRC to tx frames -+#define TCR_MON_CSN 0x0400 // When 1 tx monitors carrier -+#define TCR_FDUPLX 0x0800 // When 1 enables full duplex operation -+#define TCR_STP_SQET 0x1000 // When 1 stops tx if Signal Quality Error -+#define TCR_EPH_LOOP 0x2000 // When 1 enables EPH block loopback -+#define TCR_SWFDUP 0x8000 // When 1 enables Switched Full Duplex mode -+ -+#define TCR_CLEAR 0 /* do NOTHING */ -+/* the default settings for the TCR register : */ -+#define TCR_DEFAULT (TCR_ENABLE | TCR_PAD_EN) -+ -+ -+// EPH Status Register -+/* BANK 0 */ -+#define EPH_STATUS_REG SMC_REG(0x0002, 0) -+#define ES_TX_SUC 0x0001 // Last TX was successful -+#define ES_SNGL_COL 0x0002 // Single collision detected for last tx -+#define ES_MUL_COL 0x0004 // Multiple collisions detected for last tx -+#define ES_LTX_MULT 0x0008 // Last tx was a multicast -+#define ES_16COL 0x0010 // 16 Collisions Reached -+#define ES_SQET 0x0020 // Signal Quality Error Test -+#define ES_LTXBRD 0x0040 // Last tx was a broadcast -+#define ES_TXDEFR 0x0080 // Transmit Deferred -+#define ES_LATCOL 0x0200 // Late collision detected on last tx -+#define ES_LOSTCARR 0x0400 // Lost Carrier Sense -+#define ES_EXC_DEF 0x0800 // Excessive Deferral -+#define ES_CTR_ROL 0x1000 // Counter Roll Over indication -+#define ES_LINK_OK 0x4000 // Driven by inverted value of nLNK pin -+#define ES_TXUNRN 0x8000 // Tx Underrun -+ -+ -+// Receive Control Register -+/* BANK 0 */ -+#define RCR_REG SMC_REG(0x0004, 0) -+#define RCR_RX_ABORT 0x0001 // Set if a rx frame was aborted -+#define RCR_PRMS 0x0002 // Enable promiscuous mode -+#define RCR_ALMUL 0x0004 // When set accepts all multicast frames -+#define RCR_RXEN 0x0100 // IFF this is set, we can receive packets -+#define RCR_STRIP_CRC 0x0200 // When set strips CRC from rx packets -+#define RCR_ABORT_ENB 0x0200 // When set will abort rx on collision -+#define RCR_FILT_CAR 0x0400 // When set filters leading 12 bit s of carrier -+#define RCR_SOFTRST 0x8000 // resets the chip -+ -+/* the normal settings for the RCR register : */ -+#define RCR_DEFAULT (RCR_STRIP_CRC | RCR_RXEN) -+#define RCR_CLEAR 0x0 // set it to a base state -+ -+ -+// Counter Register -+/* BANK 0 */ -+#define COUNTER_REG SMC_REG(0x0006, 0) -+ -+ -+// Memory Information Register -+/* BANK 0 */ -+#define MIR_REG SMC_REG(0x0008, 0) -+ -+ -+// Receive/Phy Control Register -+/* BANK 0 */ -+#define RPC_REG SMC_REG(0x000A, 0) -+#define RPC_SPEED 0x2000 // When 1 PHY is in 100Mbps mode. -+#define RPC_DPLX 0x1000 // When 1 PHY is in Full-Duplex Mode -+#define RPC_ANEG 0x0800 // When 1 PHY is in Auto-Negotiate Mode -+#define RPC_LSXA_SHFT 5 // Bits to shift LS2A,LS1A,LS0A to lsb -+#define RPC_LSXB_SHFT 2 // Bits to get LS2B,LS1B,LS0B to lsb -+#define RPC_LED_100_10 (0x00) // LED = 100Mbps OR's with 10Mbps link detect -+#define RPC_LED_RES (0x01) // LED = Reserved -+#define RPC_LED_10 (0x02) // LED = 10Mbps link detect -+#define RPC_LED_FD (0x03) // LED = Full Duplex Mode -+#define RPC_LED_TX_RX (0x04) // LED = TX or RX packet occurred -+#define RPC_LED_100 (0x05) // LED = 100Mbps link dectect -+#define RPC_LED_TX (0x06) // LED = TX packet occurred -+#define RPC_LED_RX (0x07) // LED = RX packet occurred -+#define RPC_DEFAULT (RPC_ANEG | (RPC_LED_100 << RPC_LSXA_SHFT) | (RPC_LED_FD << RPC_LSXB_SHFT) | RPC_SPEED | RPC_DPLX) -+ -+ -+/* Bank 0 0x0C is reserved */ -+ -+// Bank Select Register -+/* All Banks */ -+#define BSR_REG 0x000E -+ -+ -+// Configuration Reg -+/* BANK 1 */ -+#define CONFIG_REG SMC_REG(0x0000, 1) -+#define CONFIG_EXT_PHY 0x0200 // 1=external MII, 0=internal Phy -+#define CONFIG_GPCNTRL 0x0400 // Inverse value drives pin nCNTRL -+#define CONFIG_NO_WAIT 0x1000 // When 1 no extra wait states on ISA bus -+#define CONFIG_EPH_POWER_EN 0x8000 // When 0 EPH is placed into low power mode. -+ -+// Default is powered-up, Internal Phy, Wait States, and pin nCNTRL=low -+#define CONFIG_DEFAULT (CONFIG_EPH_POWER_EN) -+ -+ -+// Base Address Register -+/* BANK 1 */ -+#define BASE_REG SMC_REG(0x0002, 1) -+ -+ -+// Individual Address Registers -+/* BANK 1 */ -+#define ADDR0_REG SMC_REG(0x0004, 1) -+#define ADDR1_REG SMC_REG(0x0006, 1) -+#define ADDR2_REG SMC_REG(0x0008, 1) -+ -+ -+// General Purpose Register -+/* BANK 1 */ -+#define GP_REG SMC_REG(0x000A, 1) -+ -+ -+// Control Register -+/* BANK 1 */ -+#define CTL_REG SMC_REG(0x000C, 1) -+#define CTL_RCV_BAD 0x4000 // When 1 bad CRC packets are received -+#define CTL_AUTO_RELEASE 0x0800 // When 1 tx pages are released automatically -+#define CTL_LE_ENABLE 0x0080 // When 1 enables Link Error interrupt -+#define CTL_CR_ENABLE 0x0040 // When 1 enables Counter Rollover interrupt -+#define CTL_TE_ENABLE 0x0020 // When 1 enables Transmit Error interrupt -+#define CTL_EEPROM_SELECT 0x0004 // Controls EEPROM reload & store -+#define CTL_RELOAD 0x0002 // When set reads EEPROM into registers -+#define CTL_STORE 0x0001 // When set stores registers into EEPROM -+ -+ -+// MMU Command Register -+/* BANK 2 */ -+#define MMU_CMD_REG SMC_REG(0x0000, 2) -+#define MC_BUSY 1 // When 1 the last release has not completed -+#define MC_NOP (0<<5) // No Op -+#define MC_ALLOC (1<<5) // OR with number of 256 byte packets -+#define MC_RESET (2<<5) // Reset MMU to initial state -+#define MC_REMOVE (3<<5) // Remove the current rx packet -+#define MC_RELEASE (4<<5) // Remove and release the current rx packet -+#define MC_FREEPKT (5<<5) // Release packet in PNR register -+#define MC_ENQUEUE (6<<5) // Enqueue the packet for transmit -+#define MC_RSTTXFIFO (7<<5) // Reset the TX FIFOs -+ -+ -+// Packet Number Register -+/* BANK 2 */ -+#define PN_REG SMC_REG(0x0002, 2) -+ -+ -+// Allocation Result Register -+/* BANK 2 */ -+#define AR_REG SMC_REG(0x0003, 2) -+#define AR_FAILED 0x80 // Alocation Failed -+ -+ -+// TX FIFO Ports Register -+/* BANK 2 */ -+#define TXFIFO_REG SMC_REG(0x0004, 2) -+#define TXFIFO_TEMPTY 0x80 // TX FIFO Empty -+ -+// RX FIFO Ports Register -+/* BANK 2 */ -+#define RXFIFO_REG SMC_REG(0x0005, 2) -+#define RXFIFO_REMPTY 0x80 // RX FIFO Empty -+ -+#define FIFO_REG SMC_REG(0x0004, 2) -+ -+// Pointer Register -+/* BANK 2 */ -+#define PTR_REG SMC_REG(0x0006, 2) -+#define PTR_RCV 0x8000 // 1=Receive area, 0=Transmit area -+#define PTR_AUTOINC 0x4000 // Auto increment the pointer on each access -+#define PTR_READ 0x2000 // When 1 the operation is a read -+ -+ -+// Data Register -+/* BANK 2 */ -+#define DATA_REG SMC_REG(0x0008, 2) -+ -+ -+// Interrupt Status/Acknowledge Register -+/* BANK 2 */ -+#define INT_REG SMC_REG(0x000C, 2) -+ -+ -+// Interrupt Mask Register -+/* BANK 2 */ -+#define IM_REG SMC_REG(0x000D, 2) -+#define IM_MDINT 0x80 // PHY MI Register 18 Interrupt -+#define IM_ERCV_INT 0x40 // Early Receive Interrupt -+#define IM_EPH_INT 0x20 // Set by Ethernet Protocol Handler section -+#define IM_RX_OVRN_INT 0x10 // Set by Receiver Overruns -+#define IM_ALLOC_INT 0x08 // Set when allocation request is completed -+#define IM_TX_EMPTY_INT 0x04 // Set if the TX FIFO goes empty -+#define IM_TX_INT 0x02 // Transmit Interrupt -+#define IM_RCV_INT 0x01 // Receive Interrupt -+ -+ -+// Multicast Table Registers -+/* BANK 3 */ -+#define MCAST_REG1 SMC_REG(0x0000, 3) -+#define MCAST_REG2 SMC_REG(0x0002, 3) -+#define MCAST_REG3 SMC_REG(0x0004, 3) -+#define MCAST_REG4 SMC_REG(0x0006, 3) -+ -+ -+// Management Interface Register (MII) -+/* BANK 3 */ -+#define MII_REG SMC_REG(0x0008, 3) -+#define MII_MSK_CRS100 0x4000 // Disables CRS100 detection during tx half dup -+#define MII_MDOE 0x0008 // MII Output Enable -+#define MII_MCLK 0x0004 // MII Clock, pin MDCLK -+#define MII_MDI 0x0002 // MII Input, pin MDI -+#define MII_MDO 0x0001 // MII Output, pin MDO -+ -+ -+// Revision Register -+/* BANK 3 */ -+/* ( hi: chip id low: rev # ) */ -+#define REV_REG SMC_REG(0x000A, 3) -+ -+ -+// Early RCV Register -+/* BANK 3 */ -+/* this is NOT on SMC9192 */ -+#define ERCV_REG SMC_REG(0x000C, 3) -+#define ERCV_RCV_DISCRD 0x0080 // When 1 discards a packet being received -+#define ERCV_THRESHOLD 0x001F // ERCV Threshold Mask -+ -+ -+// External Register -+/* BANK 7 */ -+#define EXT_REG SMC_REG(0x0000, 7) -+ -+ -+#define CHIP_9192 3 -+#define CHIP_9194 4 -+#define CHIP_9195 5 -+#define CHIP_9196 6 -+#define CHIP_91100 7 -+#define CHIP_91100FD 8 -+#define CHIP_91111FD 9 -+ -+static const char * chip_ids[ 16 ] = { -+ NULL, NULL, NULL, -+ /* 3 */ "SMC91C90/91C92", -+ /* 4 */ "SMC91C94", -+ /* 5 */ "SMC91C95", -+ /* 6 */ "SMC91C96", -+ /* 7 */ "SMC91C100", -+ /* 8 */ "SMC91C100FD", -+ /* 9 */ "SMC91C11xFD", -+ NULL, NULL, NULL, -+ NULL, NULL, NULL}; -+ -+ -+/* -+ . Transmit status bits -+*/ -+#define TS_SUCCESS 0x0001 -+#define TS_LOSTCAR 0x0400 -+#define TS_LATCOL 0x0200 -+#define TS_16COL 0x0010 -+ -+/* -+ . Receive status bits -+*/ -+#define RS_ALGNERR 0x8000 -+#define RS_BRODCAST 0x4000 -+#define RS_BADCRC 0x2000 -+#define RS_ODDFRAME 0x1000 -+#define RS_TOOLONG 0x0800 -+#define RS_TOOSHORT 0x0400 -+#define RS_MULTICAST 0x0001 -+#define RS_ERRORS (RS_ALGNERR | RS_BADCRC | RS_TOOLONG | RS_TOOSHORT) -+ -+ -+// PHY Types -+enum { -+ PHY_LAN83C183 = 1, // LAN91C111 Internal PHY -+ PHY_LAN83C180 -+}; -+ -+ -+// PHY Register Addresses (LAN91C111 Internal PHY) -+ -+// PHY Control Register -+#define PHY_CNTL_REG 0x00 -+#define PHY_CNTL_RST 0x8000 // 1=PHY Reset -+#define PHY_CNTL_LPBK 0x4000 // 1=PHY Loopback -+#define PHY_CNTL_SPEED 0x2000 // 1=100Mbps, 0=10Mpbs -+#define PHY_CNTL_ANEG_EN 0x1000 // 1=Enable Auto negotiation -+#define PHY_CNTL_PDN 0x0800 // 1=PHY Power Down mode -+#define PHY_CNTL_MII_DIS 0x0400 // 1=MII 4 bit interface disabled -+#define PHY_CNTL_ANEG_RST 0x0200 // 1=Reset Auto negotiate -+#define PHY_CNTL_DPLX 0x0100 // 1=Full Duplex, 0=Half Duplex -+#define PHY_CNTL_COLTST 0x0080 // 1= MII Colision Test -+ -+// PHY Status Register -+#define PHY_STAT_REG 0x01 -+#define PHY_STAT_CAP_T4 0x8000 // 1=100Base-T4 capable -+#define PHY_STAT_CAP_TXF 0x4000 // 1=100Base-X full duplex capable -+#define PHY_STAT_CAP_TXH 0x2000 // 1=100Base-X half duplex capable -+#define PHY_STAT_CAP_TF 0x1000 // 1=10Mbps full duplex capable -+#define PHY_STAT_CAP_TH 0x0800 // 1=10Mbps half duplex capable -+#define PHY_STAT_CAP_SUPR 0x0040 // 1=recv mgmt frames with not preamble -+#define PHY_STAT_ANEG_ACK 0x0020 // 1=ANEG has completed -+#define PHY_STAT_REM_FLT 0x0010 // 1=Remote Fault detected -+#define PHY_STAT_CAP_ANEG 0x0008 // 1=Auto negotiate capable -+#define PHY_STAT_LINK 0x0004 // 1=valid link -+#define PHY_STAT_JAB 0x0002 // 1=10Mbps jabber condition -+#define PHY_STAT_EXREG 0x0001 // 1=extended registers implemented -+ -+// PHY Identifier Registers -+#define PHY_ID1_REG 0x02 // PHY Identifier 1 -+#define PHY_ID2_REG 0x03 // PHY Identifier 2 -+ -+// PHY Auto-Negotiation Advertisement Register -+#define PHY_AD_REG 0x04 -+#define PHY_AD_NP 0x8000 // 1=PHY requests exchange of Next Page -+#define PHY_AD_ACK 0x4000 // 1=got link code word from remote -+#define PHY_AD_RF 0x2000 // 1=advertise remote fault -+#define PHY_AD_T4 0x0200 // 1=PHY is capable of 100Base-T4 -+#define PHY_AD_TX_FDX 0x0100 // 1=PHY is capable of 100Base-TX FDPLX -+#define PHY_AD_TX_HDX 0x0080 // 1=PHY is capable of 100Base-TX HDPLX -+#define PHY_AD_10_FDX 0x0040 // 1=PHY is capable of 10Base-T FDPLX -+#define PHY_AD_10_HDX 0x0020 // 1=PHY is capable of 10Base-T HDPLX -+#define PHY_AD_CSMA 0x0001 // 1=PHY is capable of 802.3 CMSA -+ -+// PHY Auto-negotiation Remote End Capability Register -+#define PHY_RMT_REG 0x05 -+// Uses same bit definitions as PHY_AD_REG -+ -+// PHY Configuration Register 1 -+#define PHY_CFG1_REG 0x10 -+#define PHY_CFG1_LNKDIS 0x8000 // 1=Rx Link Detect Function disabled -+#define PHY_CFG1_XMTDIS 0x4000 // 1=TP Transmitter Disabled -+#define PHY_CFG1_XMTPDN 0x2000 // 1=TP Transmitter Powered Down -+#define PHY_CFG1_BYPSCR 0x0400 // 1=Bypass scrambler/descrambler -+#define PHY_CFG1_UNSCDS 0x0200 // 1=Unscramble Idle Reception Disable -+#define PHY_CFG1_EQLZR 0x0100 // 1=Rx Equalizer Disabled -+#define PHY_CFG1_CABLE 0x0080 // 1=STP(150ohm), 0=UTP(100ohm) -+#define PHY_CFG1_RLVL0 0x0040 // 1=Rx Squelch level reduced by 4.5db -+#define PHY_CFG1_TLVL_SHIFT 2 // Transmit Output Level Adjust -+#define PHY_CFG1_TLVL_MASK 0x003C -+#define PHY_CFG1_TRF_MASK 0x0003 // Transmitter Rise/Fall time -+ -+ -+// PHY Configuration Register 2 -+#define PHY_CFG2_REG 0x11 -+#define PHY_CFG2_APOLDIS 0x0020 // 1=Auto Polarity Correction disabled -+#define PHY_CFG2_JABDIS 0x0010 // 1=Jabber disabled -+#define PHY_CFG2_MREG 0x0008 // 1=Multiple register access (MII mgt) -+#define PHY_CFG2_INTMDIO 0x0004 // 1=Interrupt signaled with MDIO pulseo -+ -+// PHY Status Output (and Interrupt status) Register -+#define PHY_INT_REG 0x12 // Status Output (Interrupt Status) -+#define PHY_INT_INT 0x8000 // 1=bits have changed since last read -+#define PHY_INT_LNKFAIL 0x4000 // 1=Link Not detected -+#define PHY_INT_LOSSSYNC 0x2000 // 1=Descrambler has lost sync -+#define PHY_INT_CWRD 0x1000 // 1=Invalid 4B5B code detected on rx -+#define PHY_INT_SSD 0x0800 // 1=No Start Of Stream detected on rx -+#define PHY_INT_ESD 0x0400 // 1=No End Of Stream detected on rx -+#define PHY_INT_RPOL 0x0200 // 1=Reverse Polarity detected -+#define PHY_INT_JAB 0x0100 // 1=Jabber detected -+#define PHY_INT_SPDDET 0x0080 // 1=100Base-TX mode, 0=10Base-T mode -+#define PHY_INT_DPLXDET 0x0040 // 1=Device in Full Duplex -+ -+// PHY Interrupt/Status Mask Register -+#define PHY_MASK_REG 0x13 // Interrupt Mask -+// Uses the same bit definitions as PHY_INT_REG -+ -+ -+/* -+ * SMC91C96 ethernet config and status registers. -+ * These are in the "attribute" space. -+ */ -+#define ECOR 0x8000 -+#define ECOR_RESET 0x80 -+#define ECOR_LEVEL_IRQ 0x40 -+#define ECOR_WR_ATTRIB 0x04 -+#define ECOR_ENABLE 0x01 -+ -+#define ECSR 0x8002 -+#define ECSR_IOIS8 0x20 -+#define ECSR_PWRDWN 0x04 -+#define ECSR_INT 0x02 -+ -+ -+/* -+ * Macros to abstract register access according to the data bus -+ * capabilities. Please try to use those and not the in/out primitives. -+ * Note: the following macros do *not* select the bank -- this must -+ * be done separately as needed in the main code. The SMC_REG() macro -+ * only uses the bank argument for debugging purposes. -+ */ -+ -+#if SMC_DEBUG > 0 -+#define SMC_REG(reg, bank) \ -+ ({ \ -+ int __b = SMC_CURRENT_BANK(); \ -+ if ((__b & ~0xf0) != (0x3300 | bank)) { \ -+ printk( "%s: bank reg screwed (0x%04x)\n", \ -+ CARDNAME, __b ); \ -+ BUG(); \ -+ } \ -+ reg<<SMC_IO_SHIFT; \ -+ }) -+#else -+#define SMC_REG(reg, bank) (reg<<SMC_IO_SHIFT) -+#endif -+ -+#if SMC_CAN_USE_8BIT -+#define SMC_GET_PN() SMC_inb( ioaddr, PN_REG ) -+#define SMC_SET_PN(x) SMC_outb( x, ioaddr, PN_REG ) -+#define SMC_GET_AR() SMC_inb( ioaddr, AR_REG ) -+#define SMC_GET_TXFIFO() SMC_inb( ioaddr, TXFIFO_REG ) -+#define SMC_GET_RXFIFO() SMC_inb( ioaddr, RXFIFO_REG ) -+#define SMC_GET_INT() SMC_inb( ioaddr, INT_REG ) -+#define SMC_ACK_INT(x) SMC_outb( x, ioaddr, INT_REG ) -+#define SMC_GET_INT_MASK() SMC_inb( ioaddr, IM_REG ) -+#define SMC_SET_INT_MASK(x) SMC_outb( x, ioaddr, IM_REG ) -+#else -+#define SMC_GET_PN() (SMC_inw( ioaddr, PN_REG ) & 0xFF) -+#define SMC_SET_PN(x) SMC_outw( x, ioaddr, PN_REG ) -+#define SMC_GET_AR() (SMC_inw( ioaddr, PN_REG ) >> 8) -+#define SMC_GET_TXFIFO() (SMC_inw( ioaddr, TXFIFO_REG ) & 0xFF) -+#define SMC_GET_RXFIFO() (SMC_inw( ioaddr, TXFIFO_REG ) >> 8) -+#define SMC_GET_INT() (SMC_inw( ioaddr, INT_REG ) & 0xFF) -+#define SMC_ACK_INT(x) \ -+ do { \ -+ unsigned long __flags; \ -+ int __mask; \ -+ local_irq_save(__flags); \ -+ __mask = SMC_inw( ioaddr, INT_REG ) & ~0xff; \ -+ SMC_outw( __mask | (x), ioaddr, INT_REG ); \ -+ local_irq_restore(__flags); \ -+ } while (0) -+#define SMC_GET_INT_MASK() (SMC_inw( ioaddr, INT_REG ) >> 8) -+#define SMC_SET_INT_MASK(x) SMC_outw( (x) << 8, ioaddr, INT_REG ) -+#endif -+ -+#define SMC_CURRENT_BANK() SMC_inw( ioaddr, BANK_SELECT ) -+#define SMC_SELECT_BANK(x) SMC_outw( x, ioaddr, BANK_SELECT ) -+#define SMC_GET_BASE() SMC_inw( ioaddr, BASE_REG ) -+#define SMC_SET_BASE(x) SMC_outw( x, ioaddr, BASE_REG ) -+#define SMC_GET_CONFIG() SMC_inw( ioaddr, CONFIG_REG ) -+#define SMC_SET_CONFIG(x) SMC_outw( x, ioaddr, CONFIG_REG ) -+#define SMC_GET_COUNTER() SMC_inw( ioaddr, COUNTER_REG ) -+#define SMC_GET_CTL() SMC_inw( ioaddr, CTL_REG ) -+#define SMC_SET_CTL(x) SMC_outw( x, ioaddr, CTL_REG ) -+#define SMC_GET_MII() SMC_inw( ioaddr, MII_REG ) -+#define SMC_SET_MII(x) SMC_outw( x, ioaddr, MII_REG ) -+#define SMC_GET_MIR() SMC_inw( ioaddr, MIR_REG ) -+#define SMC_SET_MIR(x) SMC_outw( x, ioaddr, MIR_REG ) -+#define SMC_GET_MMU_CMD() SMC_inw( ioaddr, MMU_CMD_REG ) -+#define SMC_SET_MMU_CMD(x) SMC_outw( x, ioaddr, MMU_CMD_REG ) -+#define SMC_GET_FIFO() SMC_inw( ioaddr, FIFO_REG ) -+#define SMC_GET_PTR() SMC_inw( ioaddr, PTR_REG ) -+#define SMC_SET_PTR(x) SMC_outw( x, ioaddr, PTR_REG ) -+#define SMC_GET_RCR() SMC_inw( ioaddr, RCR_REG ) -+#define SMC_SET_RCR(x) SMC_outw( x, ioaddr, RCR_REG ) -+#define SMC_GET_REV() SMC_inw( ioaddr, REV_REG ) -+#define SMC_GET_RPC() SMC_inw( ioaddr, RPC_REG ) -+#define SMC_SET_RPC(x) SMC_outw( x, ioaddr, RPC_REG ) -+#define SMC_GET_TCR() SMC_inw( ioaddr, TCR_REG ) -+#define SMC_SET_TCR(x) SMC_outw( x, ioaddr, TCR_REG ) -+ -+#ifndef SMC_GET_MAC_ADDR -+#define SMC_GET_MAC_ADDR(addr) \ -+ do { \ -+ unsigned int __v; \ -+ __v = SMC_inw( ioaddr, ADDR0_REG ); \ -+ addr[0] = __v; addr[1] = __v >> 8; \ -+ __v = SMC_inw( ioaddr, ADDR1_REG ); \ -+ addr[2] = __v; addr[3] = __v >> 8; \ -+ __v = SMC_inw( ioaddr, ADDR2_REG ); \ -+ addr[4] = __v; addr[5] = __v >> 8; \ -+ } while (0) -+#endif -+ -+#define SMC_SET_MAC_ADDR(addr) \ -+ do { \ -+ SMC_outw( addr[0]|(addr[1] << 8), ioaddr, ADDR0_REG ); \ -+ SMC_outw( addr[2]|(addr[3] << 8), ioaddr, ADDR1_REG ); \ -+ SMC_outw( addr[4]|(addr[5] << 8), ioaddr, ADDR2_REG ); \ -+ } while (0) -+ -+#define SMC_CLEAR_MCAST() \ -+ do { \ -+ SMC_outw( 0, ioaddr, MCAST_REG1 ); \ -+ SMC_outw( 0, ioaddr, MCAST_REG2 ); \ -+ SMC_outw( 0, ioaddr, MCAST_REG3 ); \ -+ SMC_outw( 0, ioaddr, MCAST_REG4 ); \ -+ } while (0) -+#define SMC_SET_MCAST(x) \ -+ do { \ -+ unsigned char *mt = (x); \ -+ SMC_outw( mt[0] | (mt[1] << 8), ioaddr, MCAST_REG1 ); \ -+ SMC_outw( mt[2] | (mt[3] << 8), ioaddr, MCAST_REG2 ); \ -+ SMC_outw( mt[4] | (mt[5] << 8), ioaddr, MCAST_REG3 ); \ -+ SMC_outw( mt[6] | (mt[7] << 8), ioaddr, MCAST_REG4 ); \ -+ } while (0) -+ -+#if SMC_CAN_USE_32BIT -+/* -+ * Some setups just can't write 8 or 16 bits reliably when not aligned -+ * to a 32 bit boundary. I tell you that exists! -+ * We do the ones that can have their low parts written to 0 here. -+ */ -+#undef SMC_SELECT_BANK -+#define SMC_SELECT_BANK(x) SMC_outl( (x)<<16, ioaddr, 12<<SMC_IO_SHIFT ) -+#undef SMC_SET_RPC -+#define SMC_SET_RPC(x) SMC_outl( (x)<<16, ioaddr, SMC_REG(8, 0) ) -+#undef SMC_SET_PN -+#define SMC_SET_PN(x) SMC_outl( (x)<<16, ioaddr, SMC_REG(0, 2) ) -+#undef SMC_SET_PTR -+#define SMC_SET_PTR(x) SMC_outl( (x)<<16, ioaddr, SMC_REG(4, 2) ) -+#endif -+ -+#if SMC_CAN_USE_32BIT -+#define SMC_PUT_PKT_HDR(status, length) \ -+ SMC_outl( (status) | (length) << 16, ioaddr, DATA_REG ) -+#define SMC_GET_PKT_HDR(status, length) \ -+ do { \ -+ unsigned int __val = SMC_inl( ioaddr, DATA_REG ); \ -+ (status) = __val & 0xffff; \ -+ (length) = __val >> 16; \ -+ } while (0) -+#else -+#define SMC_PUT_PKT_HDR(status, length) \ -+ do { \ -+ SMC_outw( status, ioaddr, DATA_REG ); \ -+ SMC_outw( length, ioaddr, DATA_REG ); \ -+ } while (0) -+#define SMC_GET_PKT_HDR(status, length) \ -+ do { \ -+ (status) = SMC_inw( ioaddr, DATA_REG ); \ -+ (length) = SMC_inw( ioaddr, DATA_REG ); \ -+ } while (0) -+#endif -+ -+#if SMC_CAN_USE_32BIT -+#define SMC_PUSH_DATA(p, l) \ -+ do { \ -+ char *__ptr = (p); \ -+ int __len = (l); \ -+ if (__len >= 2 && (long)__ptr & 2) { \ -+ __len -= 2; \ -+ SMC_outw( *((u16 *)__ptr)++, ioaddr, DATA_REG );\ -+ } \ -+ SMC_outsl( ioaddr, DATA_REG, __ptr, __len >> 2); \ -+ if (__len & 2) { \ -+ __ptr += (__len & ~3); \ -+ SMC_outw( *((u16 *)__ptr), ioaddr, DATA_REG ); \ -+ } \ -+ } while (0) -+#define SMC_PULL_DATA(p, l) \ -+ do { \ -+ char *__ptr = (p); \ -+ int __len = (l); \ -+ if ((long)__ptr & 2) { \ -+ /* \ -+ * We want 32bit alignment here. \ -+ * Since some buses perform a full 32bit \ -+ * fetch even for 16bit data we can't use \ -+ * SMC_inw() here. Back both source (on chip \ -+ * and destination) pointers of 2 bytes. \ -+ */ \ -+ (long)__ptr &= ~2; \ -+ __len += 2; \ -+ SMC_SET_PTR( 2|PTR_READ|PTR_RCV|PTR_AUTOINC ); \ -+ } \ -+ __len += 2; \ -+ SMC_insl( ioaddr, DATA_REG, __ptr, __len >> 2); \ -+ } while (0) -+#elif SMC_CAN_USE_16BIT -+#define SMC_PUSH_DATA(p, l) SMC_outsw( ioaddr, DATA_REG, p, (l) >> 1 ) -+#define SMC_PULL_DATA(p, l) SMC_insw ( ioaddr, DATA_REG, p, (l) >> 1 ) -+#elif SMC_CAN_USE_8BIT -+#define SMC_PUSH_DATA(p, l) SMC_outsb( ioaddr, DATA_REG, p, l ) -+#define SMC_PULL_DATA(p, l) SMC_insb ( ioaddr, DATA_REG, p, l ) -+#endif -+ -+#if ! SMC_CAN_USE_16BIT -+#define SMC_outw(x, ioaddr, reg) \ -+ do { \ -+ unsigned int __val16 = (x); \ -+ SMC_outb( __val16, ioaddr, reg ); \ -+ SMC_outb( __val16 >> 8, ioaddr, reg + 1 ); \ -+ } while (0) -+#define SMC_inw(ioaddr, reg) \ -+ ({ \ -+ unsigned int __val16; \ -+ __val16 = SMC_inb( ioaddr, reg ); \ -+ __val16 |= SMC_inb( ioaddr, reg + 1 ) << 8; \ -+ __val16; \ -+ }) -+#endif -+ -+ -+#endif /* _SMC91X_H_ */ ---- linux-2.4.25/drivers/pcmcia/Config.in~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/drivers/pcmcia/Config.in 2004-03-31 17:15:12.000000000 +0200 -@@ -45,6 +45,7 @@ - if [ "$CONFIG_ARM" = "y" ]; then - dep_tristate ' CLPS6700 support' CONFIG_PCMCIA_CLPS6700 $CONFIG_ARCH_CLPS711X $CONFIG_PCMCIA - dep_tristate ' SA1100 support' CONFIG_PCMCIA_SA1100 $CONFIG_ARCH_SA1100 $CONFIG_PCMCIA -+ dep_tristate ' PXA250/210 support' CONFIG_PCMCIA_PXA $CONFIG_ARCH_PXA $CONFIG_PCMCIA - fi - - endmenu ---- linux-2.4.25/drivers/pcmcia/Makefile~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/drivers/pcmcia/Makefile 2004-03-31 17:15:12.000000000 +0200 -@@ -94,6 +94,11 @@ - - obj-$(CONFIG_PCMCIA_VRC4173) += vrc4173_cardu.o - -+subdir-$(CONFIG_PCMCIA_PXA) += pxa -+ifeq ($(CONFIG_PCMCIA_PXA),y) -+ obj-y += pxa/pxa_cs.o -+endif -+ - include $(TOPDIR)/Rules.make - - pcmcia_core.o: $(pcmcia_core-objs) ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/pcmcia/pxa/Makefile 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,18 @@ -+# -+# Makefile for the Intel PXA250/210 PCMCIA driver -+# -+# Note! Dependencies are done automagically by 'make dep', which also -+# removes any old dependencies. DON'T put your own dependencies here -+# unless it's something special (ie not a .c file). -+ -+O_TARGET := pxa_cs.o -+ -+obj-y := pxa.o -+obj-$(CONFIG_ARCH_LUBBOCK) += lubbock.o -+obj-$(CONFIG_ARCH_PXA_IDP) += pxa_idp.o -+obj-$(CONFIG_ARCH_TRIZEPS2) += trizeps2.o -+obj-$(CONFIG_ARCH_PXA_CERF) += ../sa1100_cerf.o -+ -+obj-m := $(O_TARGET) -+ -+include $(TOPDIR)/Rules.make ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/pcmcia/pxa/lubbock.c 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,329 @@ -+/* -+ * linux/drivers/pcmcia/pxa/lubbock.c -+ * -+ * Author: George Davis -+ * Created: Jan 10, 2002 -+ * Copyright: MontaVista Software Inc. -+ * -+ * 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. -+ * -+ * Originally based upon linux/drivers/pcmcia/sa1100_neponset.c -+ * -+ * Lubbock PCMCIA specific routines. -+ * -+ */ -+ -+#include <linux/kernel.h> -+#include <linux/sched.h> -+ -+#include <pcmcia/ss.h> -+ -+#include <asm/delay.h> -+#include <asm/hardware.h> -+#include <asm/irq.h> -+#include <asm/arch/pcmcia.h> -+#include <asm/hardware/sa1111.h> -+ -+/* -+ * I'd really like to move the INTPOL stuff to arch/arm/mach-sa1100/sa1111.c -+ * ... and maybe even arch/arm/mach-pxa/sa1111.c now too! : ) -+ */ -+#define SA1111_IRQMASK_LO(x) (1 << (x - IRQ_SA1111_START)) -+#define SA1111_IRQMASK_HI(x) (1 << (x - IRQ_SA1111_START - 32)) -+ -+static int lubbock_pcmcia_init(struct pcmcia_init *init){ -+ int return_val=0; -+ -+ /* Set PCMCIA Socket 0 power to standby mode. -+ */ -+ PA_DWR &= ~(GPIO_bit(0) | GPIO_bit(1) | GPIO_bit(2) | GPIO_bit(3)); -+ -+ /* Set GPIO_A<3:0> to be outputs for PCMCIA (socket 0) power controller. -+ * Note that this is done only after first initializing GPIO_A<3:0> -+ * output state above to be certain that we drive signals to the same -+ * state as the pull-downs connected to these lines. The pull-downs are -+ * req'd to make sure PCMCIA power is OFF until we can get around to -+ * setting up the GPIO_A<3:0> state and direction. -+ */ -+ PA_DDR &= ~(GPIO_bit(0) | GPIO_bit(1) | GPIO_bit(2) | GPIO_bit(3)); -+ -+ /* Set CF Socket 1 power to standby mode. */ -+ LUB_MISC_WR &= ~(GPIO_bit(15) | GPIO_bit(14)); -+ -+ INTPOL1 |= SA1111_IRQMASK_HI(S0_READY_NINT) | -+ SA1111_IRQMASK_HI(S1_READY_NINT) | -+ SA1111_IRQMASK_HI(S0_CD_VALID) | -+ SA1111_IRQMASK_HI(S1_CD_VALID) | -+ SA1111_IRQMASK_HI(S0_BVD1_STSCHG) | -+ SA1111_IRQMASK_HI(S1_BVD1_STSCHG); -+ -+#warning what if a request_irq fails? -+ return_val+=request_irq(S0_CD_VALID, init->handler, SA_INTERRUPT, -+ "Lubbock PCMCIA (0) CD", NULL); -+ return_val+=request_irq(S1_CD_VALID, init->handler, SA_INTERRUPT, -+ "Lubbock CF (1) CD", NULL); -+ return_val+=request_irq(S0_BVD1_STSCHG, init->handler, SA_INTERRUPT, -+ "Lubbock PCMCIA (0) BVD1", NULL); -+ return_val+=request_irq(S1_BVD1_STSCHG, init->handler, SA_INTERRUPT, -+ "Lubbock CF (1) BVD1", NULL); -+ -+ return (return_val<0) ? -1 : 2; -+} -+ -+static int lubbock_pcmcia_shutdown(void){ -+ -+ free_irq(S0_CD_VALID, NULL); -+ free_irq(S1_CD_VALID, NULL); -+ free_irq(S0_BVD1_STSCHG, NULL); -+ free_irq(S1_BVD1_STSCHG, NULL); -+ -+ INTPOL1 &= ~(SA1111_IRQMASK_HI(S0_CD_VALID) | -+ SA1111_IRQMASK_HI(S1_CD_VALID) | -+ SA1111_IRQMASK_HI(S0_BVD1_STSCHG) | -+ SA1111_IRQMASK_HI(S1_BVD1_STSCHG)); -+ -+ return 0; -+} -+ -+static int lubbock_pcmcia_socket_state(struct pcmcia_state_array -+ *state_array){ -+ unsigned long status; -+ int return_val=1; -+ -+ if(state_array->size<2) return -1; -+ -+ memset(state_array->state, 0, -+ (state_array->size)*sizeof(struct pcmcia_state)); -+ -+ status=PCSR; -+ -+ state_array->state[0].detect=((status & PCSR_S0_DETECT)==0)?1:0; -+ -+ state_array->state[0].ready=((status & PCSR_S0_READY)==0)?0:1; -+ -+ state_array->state[0].bvd1=((status & PCSR_S0_BVD1)==0)?0:1; -+ -+ state_array->state[0].bvd2=((status & PCSR_S0_BVD2)==0)?0:1; -+ -+ state_array->state[0].wrprot=((status & PCSR_S0_WP)==0)?0:1; -+ -+ state_array->state[0].vs_3v=((status & PCSR_S0_VS1)==0)?1:0; -+ -+ state_array->state[0].vs_Xv=((status & PCSR_S0_VS2)==0)?1:0; -+ -+ state_array->state[1].detect=((status & PCSR_S1_DETECT)==0)?1:0; -+ -+ state_array->state[1].ready=((status & PCSR_S1_READY)==0)?0:1; -+ -+ state_array->state[1].bvd1=((status & PCSR_S1_BVD1)==0)?0:1; -+ -+ state_array->state[1].bvd2=((status & PCSR_S1_BVD2)==0)?0:1; -+ -+ state_array->state[1].wrprot=((status & PCSR_S1_WP)==0)?0:1; -+ -+ state_array->state[1].vs_3v=((status & PCSR_S1_VS1)==0)?1:0; -+ -+ state_array->state[1].vs_Xv=((status & PCSR_S1_VS2)==0)?1:0; -+ -+ return return_val; -+} -+ -+static int lubbock_pcmcia_get_irq_info(struct pcmcia_irq_info *info){ -+ -+ switch(info->sock){ -+ case 0: -+ info->irq=S0_READY_NINT; -+ break; -+ -+ case 1: -+ info->irq=S1_READY_NINT; -+ break; -+ -+ default: -+ return -1; -+ } -+ -+ return 0; -+} -+ -+static int -+lubbock_pcmcia_configure_socket(unsigned int sock, socket_state_t *state) -+{ -+ unsigned long flags, pccr, gpio, misc_wr, status; -+ int ret=1; -+ -+ local_irq_save(flags); -+ -+ pccr=PCCR; -+ gpio=PA_DWR; -+ misc_wr = LUB_MISC_WR; -+ -+ /* Lubbock uses the Maxim MAX1602, with the following connections: -+ * -+ * Socket 0 (PCMCIA): -+ * MAX1602 Lubbock Register -+ * Pin Signal -+ * ----- ------- ---------------------- -+ * A0VPP S0_PWR0 SA-1111 GPIO A<0> -+ * A1VPP S0_PWR1 SA-1111 GPIO A<1> -+ * A0VCC S0_PWR2 SA-1111 GPIO A<2> -+ * A1VCC S0_PWR3 SA-1111 GPIO A<3> -+ * VX VCC -+ * VY +3.3V -+ * 12IN +12V -+ * CODE +3.3V Cirrus Code, CODE = High (VY) -+ * -+ * Socket 1 (CF): -+ * MAX1602 Lubbock Register -+ * Pin Signal -+ * ----- ------- ---------------------- -+ * A0VPP GND VPP is not connected -+ * A1VPP GND VPP is not connected -+ * A0VCC S1_PWR0 MISC_WR<14> -+ * A1VCC S1_PWR0 MISC_WR<15> -+ * VX VCC -+ * VY +3.3V -+ * 12IN GND VPP is not connected -+ * CODE +3.3V Cirrus Code, CODE = High (VY) -+ * -+ */ -+ -+again: -+ switch(sock){ -+ case 0: -+ -+ switch(state->Vcc){ -+ case 0: -+ pccr = (pccr & ~PCCR_S0_FLT); -+ gpio &= ~(GPIO_bit(2) | GPIO_bit(3)); -+ break; -+ -+ case 33: -+ pccr = (pccr & ~PCCR_S0_PSE) | PCCR_S0_FLT | PCCR_S0_PWAITEN; -+ gpio = (gpio & ~(GPIO_bit(2) | GPIO_bit(3))) | GPIO_bit(3); -+ break; -+ -+ case 50: -+ pccr = (pccr | PCCR_S0_PSE | PCCR_S0_FLT | PCCR_S0_PWAITEN); -+ gpio = (gpio & ~(GPIO_bit(2) | GPIO_bit(3))) | GPIO_bit(2); -+ break; -+ -+ default: -+ printk(KERN_ERR "%s(): unrecognized Vcc %u\n", __FUNCTION__, state->Vcc); -+ ret = -1; -+ break; -+ } -+ -+ switch(state->Vpp){ -+ case 0: -+ gpio &= ~(GPIO_bit(0) | GPIO_bit(1)); -+ break; -+ -+ case 120: -+ gpio = (gpio & ~(GPIO_bit(0) | GPIO_bit(1))) | GPIO_bit(1); -+ break; -+ -+ default: -+ /* REVISIT: I'm not sure about this? Is this correct? -+ Is it always safe or do we have potential problems -+ with bogus combinations of Vcc and Vpp settings? */ -+ if(state->Vpp == state->Vcc) -+ gpio = (gpio & ~(GPIO_bit(0) | GPIO_bit(1))) | GPIO_bit(0); -+ else { -+ printk(KERN_ERR "%s(): unrecognized Vpp %u\n", __FUNCTION__, state->Vpp); -+ ret = -1; -+ break; -+ } -+ } -+ -+ pccr = (state->flags&SS_RESET) ? (pccr|PCCR_S0_RST) : (pccr&~PCCR_S0_RST); -+ -+ break; -+ -+ case 1: -+ switch(state->Vcc){ -+ case 0: -+ pccr = (pccr & ~PCCR_S1_FLT); -+ misc_wr &= ~((1 << 15) | (1 << 14)); -+ break; -+ -+ case 33: -+ pccr = (pccr & ~PCCR_S1_PSE) | PCCR_S1_FLT | PCCR_S1_PWAITEN; -+ misc_wr = (misc_wr & ~(1 << 15)) | (1 << 14); -+ gpio = (gpio & ~(GPIO_bit(2) | GPIO_bit(3))) | GPIO_bit(2); -+ break; -+ -+ case 50: -+ pccr = (pccr | PCCR_S1_PSE | PCCR_S1_FLT | PCCR_S1_PWAITEN); -+ misc_wr = (misc_wr & ~(1 << 15)) | (1 << 14); -+ break; -+ -+ default: -+ printk(KERN_ERR "%s(): unrecognized Vcc %u\n", __FUNCTION__, state->Vcc); -+ ret = -1; -+ break; -+ } -+ -+ if(state->Vpp!=state->Vcc && state->Vpp!=0){ -+ printk(KERN_ERR "%s(): CF slot cannot support Vpp %u\n", __FUNCTION__, state->Vpp); -+ ret = -1; -+ break; -+ } -+ -+ pccr = (state->flags&SS_RESET) ? (pccr|PCCR_S1_RST) : (pccr&~PCCR_S1_RST); -+ -+ break; -+ -+ default: -+ ret = -1; -+ } -+ -+ if (ret >= 0) { -+ PCCR = pccr; -+ LUB_MISC_WR = misc_wr; -+ PA_DWR = gpio; -+ } -+ -+ if (ret > 0) { -+ ret = 0; -+ /* -+ * HACK ALERT: -+ * We can't sense the voltage properly on Lubbock before actually -+ * applying some power to the socket (catch 22). -+ * Resense the socket Voltage Sense pins after applying socket power. -+ */ -+ if (sock == 0) -+ status = PCSR & (PCSR_S0_VS1 | PCSR_S0_VS2); -+ else -+ status = PCSR & (PCSR_S1_VS1 | PCSR_S1_VS2); -+ -+ if ((status == (PCSR_S0_VS1 | PCSR_S0_VS2)) && (state->Vcc == 33)) { -+ /* Switch to 5V, Configure socket 0 with 5V voltage */ -+ PA_DWR &= ~(GPIO_bit(0) | GPIO_bit(1) | GPIO_bit(2) | GPIO_bit(3)); -+ PA_DDR &= ~(GPIO_bit(0) | GPIO_bit(1) | GPIO_bit(2) | GPIO_bit(3)); -+ state->Vcc = 50; -+ state->Vpp = 50; -+ goto again; -+ } -+ if ((status == (PCSR_S1_VS1 | PCSR_S1_VS2)) && (state->Vcc == 33)) { -+ /* Switch to 5V, Configure socket 1 with 5V voltage */ -+ LUB_MISC_WR &= ~((1 << 15) | (1 << 14)); -+ state->Vcc = 50; -+ state->Vpp = 50; -+ goto again; -+ } -+ } -+ -+ local_irq_restore(flags); -+ return ret; -+} -+ -+struct pcmcia_low_level lubbock_pcmcia_ops = { -+ lubbock_pcmcia_init, -+ lubbock_pcmcia_shutdown, -+ lubbock_pcmcia_socket_state, -+ lubbock_pcmcia_get_irq_info, -+ lubbock_pcmcia_configure_socket -+}; ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/pcmcia/pxa/pxa.c 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,1247 @@ -+/* -+ * linux/drivers/pcmcia/pxa/pxa.c -+ * -+ * Author: George Davis -+ * Created: Jan 10, 2002 -+ * Copyright: MontaVista Software Inc. -+ * -+ * 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. -+ * -+ * Originally based upon linux/drivers/pcmcia/sa1100_generic.c -+ * -+ */ -+ -+/*====================================================================== -+ -+ Device driver for the PCMCIA control functionality of Intel -+ PXA250/210 microprocessors. -+ -+ The contents of this file are subject to the Mozilla Public -+ License Version 1.1 (the "License"); you may not use this file -+ except in compliance with the License. You may obtain a copy of -+ the License at http://www.mozilla.org/MPL/ -+ -+ Software distributed under the License is distributed on an "AS -+ IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or -+ implied. See the License for the specific language governing -+ rights and limitations under the License. -+ -+ The initial developer of the original code is John G. Dorsey -+ <john+@cs.cmu.edu>. Portions created by John G. Dorsey are -+ Copyright (C) 1999 John G. Dorsey. All Rights Reserved. -+ -+ Alternatively, the contents of this file may be used under the -+ terms of the GNU Public License version 2 (the "GPL"), in which -+ case the provisions of the GPL are applicable instead of the -+ above. If you wish to allow the use of your version of this file -+ only under the terms of the GPL and not to allow others to use -+ your version of this file under the MPL, indicate your decision -+ by deleting the provisions above and replace them with the notice -+ and other provisions required by the GPL. If you do not delete -+ the provisions above, a recipient may use your version of this -+ file under either the MPL or the GPL. -+ -+======================================================================*/ -+ -+#include <linux/module.h> -+#include <linux/init.h> -+#include <linux/config.h> -+#include <linux/cpufreq.h> -+#include <linux/delay.h> -+#include <linux/ioport.h> -+#include <linux/kernel.h> -+#include <linux/tqueue.h> -+#include <linux/timer.h> -+#include <linux/mm.h> -+#include <linux/notifier.h> -+#include <linux/proc_fs.h> -+#include <linux/version.h> -+#include <linux/cpufreq.h> -+ -+#include <pcmcia/version.h> -+#include <pcmcia/cs_types.h> -+#include <pcmcia/cs.h> -+#include <pcmcia/ss.h> -+#include <pcmcia/bus_ops.h> -+ -+#include <asm/hardware.h> -+#include <asm/io.h> -+#include <asm/irq.h> -+#include <asm/system.h> -+#include <asm/arch/lubbock.h> -+ -+#include "pxa.h" -+ -+#ifdef PCMCIA_DEBUG -+static int pc_debug; -+#endif -+ -+MODULE_AUTHOR("George Davis <davis_g@mvista.com>"); -+MODULE_DESCRIPTION("Linux PCMCIA Card Services: PXA250/210 Socket Controller"); -+ -+/* This structure maintains housekeeping state for each socket, such -+ * as the last known values of the card detect pins, or the Card Services -+ * callback value associated with the socket: -+ */ -+static struct pxa_pcmcia_socket -+pxa_pcmcia_socket[PXA_PCMCIA_MAX_SOCK]; -+ -+static int pxa_pcmcia_socket_count; -+ -+ -+/* Returned by the low-level PCMCIA interface: */ -+static struct pcmcia_low_level *pcmcia_low_level; -+ -+/* Event poll timer structure */ -+static struct timer_list poll_timer; -+ -+ -+/* Prototypes for routines which are used internally: */ -+ -+static int pxa_pcmcia_driver_init(void); -+static void pxa_pcmcia_driver_shutdown(void); -+static void pxa_pcmcia_task_handler(void *data); -+static void pxa_pcmcia_poll_event(unsigned long data); -+static void pxa_pcmcia_interrupt(int irq, void *dev, -+ struct pt_regs *regs); -+static struct tq_struct pxa_pcmcia_task; -+ -+#ifdef CONFIG_PROC_FS -+static int pxa_pcmcia_proc_status(char *buf, char **start, off_t pos, -+ int count, int *eof, void *data); -+#endif -+ -+ -+/* Prototypes for operations which are exported to the -+ * new-and-impr^H^H^H^H^H^H^H^H^H^H in-kernel PCMCIA core: -+ */ -+ -+static int pxa_pcmcia_init(unsigned int sock); -+static int pxa_pcmcia_suspend(unsigned int sock); -+static int pxa_pcmcia_register_callback(unsigned int sock, -+ void (*handler)(void *, -+ unsigned int), -+ void *info); -+static int pxa_pcmcia_inquire_socket(unsigned int sock, -+ socket_cap_t *cap); -+static int pxa_pcmcia_get_status(unsigned int sock, u_int *value); -+static int pxa_pcmcia_get_socket(unsigned int sock, -+ socket_state_t *state); -+static int pxa_pcmcia_set_socket(unsigned int sock, -+ socket_state_t *state); -+static int pxa_pcmcia_get_io_map(unsigned int sock, -+ struct pccard_io_map *io); -+static int pxa_pcmcia_set_io_map(unsigned int sock, -+ struct pccard_io_map *io); -+static int pxa_pcmcia_get_mem_map(unsigned int sock, -+ struct pccard_mem_map *mem); -+static int pxa_pcmcia_set_mem_map(unsigned int sock, -+ struct pccard_mem_map *mem); -+#ifdef CONFIG_PROC_FS -+static void pxa_pcmcia_proc_setup(unsigned int sock, -+ struct proc_dir_entry *base); -+#endif -+ -+static struct pccard_operations pxa_pcmcia_operations = { -+ pxa_pcmcia_init, -+ pxa_pcmcia_suspend, -+ pxa_pcmcia_register_callback, -+ pxa_pcmcia_inquire_socket, -+ pxa_pcmcia_get_status, -+ pxa_pcmcia_get_socket, -+ pxa_pcmcia_set_socket, -+ pxa_pcmcia_get_io_map, -+ pxa_pcmcia_set_io_map, -+ pxa_pcmcia_get_mem_map, -+ pxa_pcmcia_set_mem_map, -+#ifdef CONFIG_PROC_FS -+ pxa_pcmcia_proc_setup -+#endif -+}; -+ -+#ifdef CONFIG_CPU_FREQ -+/* forward declaration */ -+static struct notifier_block pxa_pcmcia_notifier_block; -+#endif -+ -+ -+/* pxa_pcmcia_driver_init() -+ * ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -+ * -+ * This routine performs a basic sanity check to ensure that this -+ * kernel has been built with the appropriate board-specific low-level -+ * PCMCIA support, performs low-level PCMCIA initialization, registers -+ * this socket driver with Card Services, and then spawns the daemon -+ * thread which is the real workhorse of the socket driver. -+ * -+ * Please see linux/Documentation/arm/SA1100/PCMCIA for more information -+ * on the low-level kernel interface. -+ * -+ * Returns: 0 on success, -1 on error -+ */ -+static int __init pxa_pcmcia_driver_init(void){ -+ servinfo_t info; -+ struct pcmcia_init pcmcia_init; -+ struct pcmcia_state state[PXA_PCMCIA_MAX_SOCK]; -+ struct pcmcia_state_array state_array; -+ unsigned int i, clock; -+ unsigned long mecr; -+ -+ printk(KERN_INFO "Intel PXA250/210 PCMCIA (CS release %s)\n", CS_RELEASE); -+ -+ CardServices(GetCardServicesInfo, &info); -+ -+ if(info.Revision!=CS_RELEASE_CODE){ -+ printk(KERN_ERR "Card Services release codes do not match\n"); -+ return -1; -+ } -+ -+ /* Setup GPIOs for PCMCIA/CF alternate function mode. -+ * -+ * It would be nice if set_GPIO_mode included support -+ * for driving GPIO outputs to default high/low state -+ * before programming GPIOs as outputs. Setting GPIO -+ * outputs to default high/low state via GPSR/GPCR -+ * before defining them as outputs should reduce -+ * the possibility of glitching outputs during GPIO -+ * setup. This of course assumes external terminators -+ * are present to hold GPIOs in a defined state. -+ * -+ * In the meantime, setup default state of GPIO -+ * outputs before we enable them as outputs. -+ */ -+ -+ GPSR(GPIO48_nPOE) = GPIO_bit(GPIO48_nPOE) | -+ GPIO_bit(GPIO49_nPWE) | -+ GPIO_bit(GPIO50_nPIOR) | -+ GPIO_bit(GPIO51_nPIOW) | -+ GPIO_bit(GPIO52_nPCE_1) | -+ GPIO_bit(GPIO53_nPCE_2); -+ -+ set_GPIO_mode(GPIO48_nPOE_MD); -+ set_GPIO_mode(GPIO49_nPWE_MD); -+ set_GPIO_mode(GPIO50_nPIOR_MD); -+ set_GPIO_mode(GPIO51_nPIOW_MD); -+ set_GPIO_mode(GPIO52_nPCE_1_MD); -+ set_GPIO_mode(GPIO53_nPCE_2_MD); -+ set_GPIO_mode(GPIO54_pSKTSEL_MD); /* REVISIT: s/b dependent on num sockets */ -+ set_GPIO_mode(GPIO55_nPREG_MD); -+ set_GPIO_mode(GPIO56_nPWAIT_MD); -+ set_GPIO_mode(GPIO57_nIOIS16_MD); -+ -+ -+ if(machine_is_lubbock()){ -+#if defined(CONFIG_ARCH_LUBBOCK) || defined(CONFIG_ARCH_CSB226) -+ pcmcia_low_level=&lubbock_pcmcia_ops; -+#endif -+ } else if (machine_is_pxa_idp()) { -+ pcmcia_low_level=&pxa_idp_pcmcia_ops; -+ } else if( machine_is_pxa_cerf()){ -+ pcmcia_low_level=&cerf_pcmcia_ops; -+ } else if (machine_is_trizeps2()){ -+#ifdef CONFIG_ARCH_TRIZEPS2 -+ pcmcia_low_level=&trizeps2_pcmcia_ops; -+#endif -+ } -+ -+ if (!pcmcia_low_level) { -+ printk(KERN_ERR "This hardware is not supported by the PXA250/210 Card Service driver\n"); -+ return -ENODEV; -+ } -+ -+ pcmcia_init.handler=pxa_pcmcia_interrupt; -+ -+ if((pxa_pcmcia_socket_count=pcmcia_low_level->init(&pcmcia_init))<0){ -+ printk(KERN_ERR "Unable to initialize kernel PCMCIA service.\n"); -+ return -EIO; -+ } -+ -+ state_array.size=pxa_pcmcia_socket_count; -+ state_array.state=state; -+ -+ /* Configure MECR based on the number of sockets present. */ -+ if (pxa_pcmcia_socket_count == 2) { -+ MECR |= GPIO_bit(0); -+ } else { -+ MECR &= ~GPIO_bit(0); -+ } -+ -+ if(pcmcia_low_level->socket_state(&state_array)<0){ -+ printk(KERN_ERR "Unable to get PCMCIA status from kernel.\n"); -+ return -EIO; -+ } -+ -+ /* Well, it looks good to go. So we can now enable the PCMCIA -+ * controller. -+ */ -+ MECR |= GPIO_bit(1); -+ -+ /* We need to initialize the MCXX registers to default values -+ * here because we're not guaranteed to see a SetIOMap operation -+ * at runtime. -+ */ -+ -+ clock = get_lclk_frequency_10khz(); -+ -+ for(i=0; i<pxa_pcmcia_socket_count; ++i){ -+ pxa_pcmcia_socket[i].k_state=state[i]; -+ -+ /* This is an interim fix. Apparently, SetSocket is no longer -+ * called to initialize each socket (prior to the first detect -+ * event). For now, we'll just manually set up the mask. -+ */ -+ pxa_pcmcia_socket[i].cs_state.csc_mask=SS_DETECT; -+ -+ pxa_pcmcia_socket[i].virt_io=(i==0)?PCMCIA_IO_0_BASE:PCMCIA_IO_1_BASE; -+ pxa_pcmcia_socket[i].phys_attr=_PCMCIAAttr(i); -+ pxa_pcmcia_socket[i].phys_mem=_PCMCIAMem(i); -+ -+ /* REVISIT: cleanup these macros */ -+ //MCIO_SET(i, PXA_PCMCIA_IO_ACCESS, clock); -+ //MCATTR_SET(i, PXA_PCMCIA_5V_MEM_ACCESS, clock); -+ //MCMEM_SET(i, PXA_PCMCIA_5V_MEM_ACCESS, clock); -+ -+ pxa_pcmcia_socket[i].speed_io=PXA_PCMCIA_IO_ACCESS; -+ pxa_pcmcia_socket[i].speed_attr=PXA_PCMCIA_ATTR_MEM_ACCESS; -+ pxa_pcmcia_socket[i].speed_mem=PXA_PCMCIA_5V_MEM_ACCESS; -+ } -+ -+/* REVISIT: cleanup these macros */ -+MCMEM0 = ((pxa_mcxx_setup(PXA_PCMCIA_5V_MEM_ACCESS, clock) -+ & MCXX_SETUP_MASK) << MCXX_SETUP_SHIFT) -+ | ((pxa_mcxx_asst(PXA_PCMCIA_5V_MEM_ACCESS, clock) -+ & MCXX_ASST_MASK) << MCXX_ASST_SHIFT) -+ | ((pxa_mcxx_hold(PXA_PCMCIA_5V_MEM_ACCESS, clock) -+ & MCXX_HOLD_MASK) << MCXX_HOLD_SHIFT); -+MCMEM1 = ((pxa_mcxx_setup(PXA_PCMCIA_5V_MEM_ACCESS, clock) -+ & MCXX_SETUP_MASK) << MCXX_SETUP_SHIFT) -+ | ((pxa_mcxx_asst(PXA_PCMCIA_5V_MEM_ACCESS, clock) -+ & MCXX_ASST_MASK) << MCXX_ASST_SHIFT) -+ | ((pxa_mcxx_hold(PXA_PCMCIA_5V_MEM_ACCESS, clock) -+ & MCXX_HOLD_MASK) << MCXX_HOLD_SHIFT); -+MCATT0 = ((pxa_mcxx_setup(PXA_PCMCIA_ATTR_MEM_ACCESS, clock) -+ & MCXX_SETUP_MASK) << MCXX_SETUP_SHIFT) -+ | ((pxa_mcxx_asst(PXA_PCMCIA_ATTR_MEM_ACCESS, clock) -+ & MCXX_ASST_MASK) << MCXX_ASST_SHIFT) -+ | ((pxa_mcxx_hold(PXA_PCMCIA_ATTR_MEM_ACCESS, clock) -+ & MCXX_HOLD_MASK) << MCXX_HOLD_SHIFT); -+MCATT1 = ((pxa_mcxx_setup(PXA_PCMCIA_ATTR_MEM_ACCESS, clock) -+ & MCXX_SETUP_MASK) << MCXX_SETUP_SHIFT) -+ | ((pxa_mcxx_asst(PXA_PCMCIA_ATTR_MEM_ACCESS, clock) -+ & MCXX_ASST_MASK) << MCXX_ASST_SHIFT) -+ | ((pxa_mcxx_hold(PXA_PCMCIA_ATTR_MEM_ACCESS, clock) -+ & MCXX_HOLD_MASK) << MCXX_HOLD_SHIFT); -+MCIO0 = ((pxa_mcxx_setup(PXA_PCMCIA_IO_ACCESS, clock) -+ & MCXX_SETUP_MASK) << MCXX_SETUP_SHIFT) -+ | ((pxa_mcxx_asst(PXA_PCMCIA_IO_ACCESS, clock) -+ & MCXX_ASST_MASK) << MCXX_ASST_SHIFT) -+ | ((pxa_mcxx_hold(PXA_PCMCIA_IO_ACCESS, clock) -+ & MCXX_HOLD_MASK) << MCXX_HOLD_SHIFT); -+MCIO1 = ((pxa_mcxx_setup(PXA_PCMCIA_IO_ACCESS, clock) -+ & MCXX_SETUP_MASK) << MCXX_SETUP_SHIFT) -+ | ((pxa_mcxx_asst(PXA_PCMCIA_IO_ACCESS, clock) -+ & MCXX_ASST_MASK) << MCXX_ASST_SHIFT) -+ | ((pxa_mcxx_hold(PXA_PCMCIA_IO_ACCESS, clock) -+ & MCXX_HOLD_MASK) << MCXX_HOLD_SHIFT); -+ -+#ifdef CONFIG_CPU_FREQ -+ if(cpufreq_register_notifier(&pxa_pcmcia_notifier_block) < 0){ -+ printk(KERN_ERR "Unable to register CPU frequency change notifier\n"); -+ return -ENXIO; -+ } -+#endif -+ -+ /* Only advertise as many sockets as we can detect: */ -+ if(register_ss_entry(pxa_pcmcia_socket_count, -+ &pxa_pcmcia_operations)<0){ -+ printk(KERN_ERR "Unable to register socket service routine\n"); -+ return -ENXIO; -+ } -+ -+ /* Start the event poll timer. It will reschedule by itself afterwards. */ -+ pxa_pcmcia_poll_event(0); -+ -+ DEBUG(1, "pxa_cs: initialization complete\n"); -+ -+ return 0; -+ -+} /* pxa_pcmcia_driver_init() */ -+ -+module_init(pxa_pcmcia_driver_init); -+ -+ -+/* pxa_pcmcia_driver_shutdown() -+ * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -+ * Invokes the low-level kernel service to free IRQs associated with this -+ * socket controller and reset GPIO edge detection. -+ */ -+static void __exit pxa_pcmcia_driver_shutdown(void){ -+ -+ del_timer_sync(&poll_timer); -+ unregister_ss_entry(&pxa_pcmcia_operations); -+#ifdef CONFIG_CPU_FREQ -+ cpufreq_unregister_notifier(&pxa_pcmcia_notifier_block); -+#endif -+ pcmcia_low_level->shutdown(); -+ flush_scheduled_tasks(); -+ -+ DEBUG(1, "pxa_cs: shutdown complete\n"); -+} -+ -+module_exit(pxa_pcmcia_driver_shutdown); -+ -+ -+/* pxa_pcmcia_init() -+ * ^^^^^^^^^^^^^^^^^^^^ -+ * We perform all of the interesting initialization tasks in -+ * pxa_pcmcia_driver_init(). -+ * -+ * Returns: 0 -+ */ -+static int pxa_pcmcia_init(unsigned int sock){ -+ -+ DEBUG(2, "%s(): initializing socket %u\n", __FUNCTION__, sock); -+ -+ return 0; -+} -+ -+ -+/* pxa_pcmcia_suspend() -+ * ^^^^^^^^^^^^^^^^^^^^^^^ -+ * We don't currently perform any actions on a suspend. -+ * -+ * Returns: 0 -+ */ -+static int pxa_pcmcia_suspend(unsigned int sock) -+{ -+ socket_state_t st; -+ int ret; -+ -+ DEBUG(2, "%s(): suspending socket %u\n", __FUNCTION__, sock); -+ -+ st.Vcc = 0; -+ st.Vpp = 0; -+ st.flags = SS_RESET; -+ -+ ret = pcmcia_low_level->configure_socket(sock, &st); -+ -+ if (ret == 0) -+ pxa_pcmcia_socket[sock].cs_state = dead_socket; -+ -+ return ret; -+} -+ -+ -+/* pxa_pcmcia_events() -+ * ^^^^^^^^^^^^^^^^^^^^^^ -+ * Helper routine to generate a Card Services event mask based on -+ * state information obtained from the kernel low-level PCMCIA layer -+ * in a recent (and previous) sampling. Updates `prev_state'. -+ * -+ * Returns: an event mask for the given socket state. -+ */ -+static inline unsigned pxa_pcmcia_events(struct pcmcia_state *state, -+ struct pcmcia_state *prev_state, -+ unsigned int mask, -+ unsigned int flags){ -+ unsigned int events=0; -+ -+ if(state->detect!=prev_state->detect){ -+ -+ DEBUG(2, "%s(): card detect value %u\n", __FUNCTION__, state->detect); -+ -+ events|=mask&SS_DETECT; -+ } -+ -+ if(state->ready!=prev_state->ready){ -+ -+ DEBUG(2, "%s(): card ready value %u\n", __FUNCTION__, state->ready); -+ -+ events|=mask&((flags&SS_IOCARD)?0:SS_READY); -+ } -+ -+ if(state->bvd1!=prev_state->bvd1){ -+ -+ DEBUG(2, "%s(): card BVD1 value %u\n", __FUNCTION__, state->bvd1); -+ -+ events|=mask&(flags&SS_IOCARD)?SS_STSCHG:SS_BATDEAD; -+ } -+ -+ if(state->bvd2!=prev_state->bvd2){ -+ -+ DEBUG(2, "%s(): card BVD2 value %u\n", __FUNCTION__, state->bvd2); -+ -+ events|=mask&(flags&SS_IOCARD)?0:SS_BATWARN; -+ } -+ -+ DEBUG(2, "events: %s%s%s%s%s%s\n", -+ (events==0)?"<NONE>":"", -+ (events&SS_DETECT)?"DETECT ":"", -+ (events&SS_READY)?"READY ":"", -+ (events&SS_BATDEAD)?"BATDEAD ":"", -+ (events&SS_BATWARN)?"BATWARN ":"", -+ (events&SS_STSCHG)?"STSCHG ":""); -+ -+ *prev_state=*state; -+ -+ return events; -+ -+} /* pxa_pcmcia_events() */ -+ -+ -+/* pxa_pcmcia_task_handler() -+ * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -+ * Processes serviceable socket events using the "eventd" thread context. -+ * -+ * Event processing (specifically, the invocation of the Card Services event -+ * callback) occurs in this thread rather than in the actual interrupt -+ * handler due to the use of scheduling operations in the PCMCIA core. -+ */ -+static void pxa_pcmcia_task_handler(void *data) { -+ struct pcmcia_state state[PXA_PCMCIA_MAX_SOCK]; -+ struct pcmcia_state_array state_array; -+ int i, events, all_events, irq_status; -+ -+ DEBUG(2, "%s(): entering PCMCIA monitoring thread\n", __FUNCTION__); -+ -+ state_array.size=pxa_pcmcia_socket_count; -+ state_array.state=state; -+ -+ do { -+ -+ DEBUG(3, "%s(): interrogating low-level PCMCIA service\n", __FUNCTION__); -+ -+ if((irq_status=pcmcia_low_level->socket_state(&state_array))<0) -+ printk(KERN_ERR "Error in kernel low-level PCMCIA service.\n"); -+ -+ all_events=0; -+ -+ if(irq_status>0){ -+ -+ for(i=0; i<state_array.size; ++i, all_events|=events) -+ if((events= -+ pxa_pcmcia_events(&state[i], -+ &pxa_pcmcia_socket[i].k_state, -+ pxa_pcmcia_socket[i].cs_state.csc_mask, -+ pxa_pcmcia_socket[i].cs_state.flags))) -+ if(pxa_pcmcia_socket[i].handler!=NULL) -+ pxa_pcmcia_socket[i].handler(pxa_pcmcia_socket[i].handler_info, -+ events); -+ } -+ -+ } while(all_events); -+} /* pxa_pcmcia_task_handler() */ -+ -+static struct tq_struct pxa_pcmcia_task = { -+ routine: pxa_pcmcia_task_handler -+}; -+ -+ -+/* pxa_pcmcia_poll_event() -+ * ^^^^^^^^^^^^^^^^^^^^^^^^^^ -+ * Let's poll for events in addition to IRQs since IRQ only is unreliable... -+ */ -+static void pxa_pcmcia_poll_event(unsigned long dummy) -+{ -+ DEBUG(3, "%s(): polling for events\n", __FUNCTION__); -+ poll_timer.function = pxa_pcmcia_poll_event; -+ poll_timer.expires = jiffies + PXA_PCMCIA_POLL_PERIOD; -+ add_timer(&poll_timer); -+ schedule_task(&pxa_pcmcia_task); -+} -+ -+ -+/* pxa_pcmcia_interrupt() -+ * ^^^^^^^^^^^^^^^^^^^^^^^^^ -+ * Service routine for socket driver interrupts (requested by the -+ * low-level PCMCIA init() operation via pxa_pcmcia_thread()). -+ * The actual interrupt-servicing work is performed by -+ * pxa_pcmcia_thread(), largely because the Card Services event- -+ * handling code performs scheduling operations which cannot be -+ * executed from within an interrupt context. -+ */ -+static void pxa_pcmcia_interrupt(int irq, void *dev, struct pt_regs *regs){ -+ DEBUG(3, "%s(): servicing IRQ %d\n", __FUNCTION__, irq); -+ schedule_task(&pxa_pcmcia_task); -+} -+ -+ -+/* pxa_pcmcia_register_callback() -+ * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -+ * Implements the register_callback() operation for the in-kernel -+ * PCMCIA service (formerly SS_RegisterCallback in Card Services). If -+ * the function pointer `handler' is not NULL, remember the callback -+ * location in the state for `sock', and increment the usage counter -+ * for the driver module. (The callback is invoked from the interrupt -+ * service routine, pxa_pcmcia_interrupt(), to notify Card Services -+ * of interesting events.) Otherwise, clear the callback pointer in the -+ * socket state and decrement the module usage count. -+ * -+ * Returns: 0 -+ */ -+static int pxa_pcmcia_register_callback(unsigned int sock, -+ void (*handler)(void *, -+ unsigned int), -+ void *info){ -+ if(handler==NULL){ -+ pxa_pcmcia_socket[sock].handler=NULL; -+ MOD_DEC_USE_COUNT; -+ } else { -+ MOD_INC_USE_COUNT; -+ pxa_pcmcia_socket[sock].handler=handler; -+ pxa_pcmcia_socket[sock].handler_info=info; -+ } -+ -+ return 0; -+} -+ -+ -+/* pxa_pcmcia_inquire_socket() -+ * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -+ * Implements the inquire_socket() operation for the in-kernel PCMCIA -+ * service (formerly SS_InquireSocket in Card Services). Of note is -+ * the setting of the SS_CAP_PAGE_REGS bit in the `features' field of -+ * `cap' to "trick" Card Services into tolerating large "I/O memory" -+ * addresses. Also set is SS_CAP_STATIC_MAP, which disables the memory -+ * resource database check. (Mapped memory is set up within the socket -+ * driver itself.) -+ * -+ * In conjunction with the STATIC_MAP capability is a new field, -+ * `io_offset', recommended by David Hinds. Rather than go through -+ * the SetIOMap interface (which is not quite suited for communicating -+ * window locations up from the socket driver), we just pass up -+ * an offset which is applied to client-requested base I/O addresses -+ * in alloc_io_space(). -+ * -+ * Returns: 0 on success, -1 if no pin has been configured for `sock' -+ */ -+static int pxa_pcmcia_inquire_socket(unsigned int sock, -+ socket_cap_t *cap){ -+ struct pcmcia_irq_info irq_info; -+ -+ DEBUG(3, "%s() for sock %u\n", __FUNCTION__, sock); -+ -+ if(sock>=pxa_pcmcia_socket_count){ -+ printk(KERN_ERR "pxa_cs: socket %u not configured\n", sock); -+ return -1; -+ } -+ -+ /* SS_CAP_PAGE_REGS: used by setup_cis_mem() in cistpl.c to set the -+ * force_low argument to validate_mem() in rsrc_mgr.c -- since in -+ * general, the mapped * addresses of the PCMCIA memory regions -+ * will not be within 0xffff, setting force_low would be -+ * undesirable. -+ * -+ * SS_CAP_STATIC_MAP: don't bother with the (user-configured) memory -+ * resource database; we instead pass up physical address ranges -+ * and allow other parts of Card Services to deal with remapping. -+ * -+ * SS_CAP_PCCARD: we can deal with 16-bit PCMCIA & CF cards, but -+ * not 32-bit CardBus devices. -+ */ -+ cap->features=(SS_CAP_PAGE_REGS | SS_CAP_STATIC_MAP | SS_CAP_PCCARD); -+ -+ irq_info.sock=sock; -+ irq_info.irq=-1; -+ -+ if(pcmcia_low_level->get_irq_info(&irq_info)<0){ -+ printk(KERN_ERR "Error obtaining IRQ info from kernel for socket %u\n", -+ sock); -+ return -1; -+ } -+ -+ cap->irq_mask=0; -+ cap->map_size=PAGE_SIZE; -+ cap->pci_irq=irq_info.irq; -+ cap->io_offset=pxa_pcmcia_socket[sock].virt_io; -+ -+ return 0; -+ -+} /* pxa_pcmcia_inquire_socket() */ -+ -+ -+/* pxa_pcmcia_get_status() -+ * ^^^^^^^^^^^^^^^^^^^^^^^^^^ -+ * Implements the get_status() operation for the in-kernel PCMCIA -+ * service (formerly SS_GetStatus in Card Services). Essentially just -+ * fills in bits in `status' according to internal driver state or -+ * the value of the voltage detect chipselect register. -+ * -+ * As a debugging note, during card startup, the PCMCIA core issues -+ * three set_socket() commands in a row the first with RESET deasserted, -+ * the second with RESET asserted, and the last with RESET deasserted -+ * again. Following the third set_socket(), a get_status() command will -+ * be issued. The kernel is looking for the SS_READY flag (see -+ * setup_socket(), reset_socket(), and unreset_socket() in cs.c). -+ * -+ * Returns: 0 -+ */ -+static int pxa_pcmcia_get_status(unsigned int sock, -+ unsigned int *status){ -+ struct pcmcia_state state[PXA_PCMCIA_MAX_SOCK]; -+ struct pcmcia_state_array state_array; -+ -+ DEBUG(3, "%s() for sock %u\n", __FUNCTION__, sock); -+ -+ state_array.size=pxa_pcmcia_socket_count; -+ state_array.state=state; -+ -+ if((pcmcia_low_level->socket_state(&state_array))<0){ -+ printk(KERN_ERR "Unable to get PCMCIA status from kernel.\n"); -+ return -1; -+ } -+ -+ pxa_pcmcia_socket[sock].k_state=state[sock]; -+ -+ *status=state[sock].detect?SS_DETECT:0; -+ -+ *status|=state[sock].ready?SS_READY:0; -+ -+ /* The power status of individual sockets is not available -+ * explicitly from the hardware, so we just remember the state -+ * and regurgitate it upon request: -+ */ -+ *status|=pxa_pcmcia_socket[sock].cs_state.Vcc?SS_POWERON:0; -+ -+ if(pxa_pcmcia_socket[sock].cs_state.flags&SS_IOCARD) -+ *status|=state[sock].bvd1?SS_STSCHG:0; -+ else { -+ if(state[sock].bvd1==0) -+ *status|=SS_BATDEAD; -+ else if(state[sock].bvd2==0) -+ *status|=SS_BATWARN; -+ } -+ -+ *status|=state[sock].vs_3v?SS_3VCARD:0; -+ -+ *status|=state[sock].vs_Xv?SS_XVCARD:0; -+ -+ DEBUG(3, "\tstatus: %s%s%s%s%s%s%s%s\n", -+ (*status&SS_DETECT)?"DETECT ":"", -+ (*status&SS_READY)?"READY ":"", -+ (*status&SS_BATDEAD)?"BATDEAD ":"", -+ (*status&SS_BATWARN)?"BATWARN ":"", -+ (*status&SS_POWERON)?"POWERON ":"", -+ (*status&SS_STSCHG)?"STSCHG ":"", -+ (*status&SS_3VCARD)?"3VCARD ":"", -+ (*status&SS_XVCARD)?"XVCARD ":""); -+ -+ return 0; -+ -+} /* pxa_pcmcia_get_status() */ -+ -+ -+/* pxa_pcmcia_get_socket() -+ * ^^^^^^^^^^^^^^^^^^^^^^^^^^ -+ * Implements the get_socket() operation for the in-kernel PCMCIA -+ * service (formerly SS_GetSocket in Card Services). Not a very -+ * exciting routine. -+ * -+ * Returns: 0 -+ */ -+static int pxa_pcmcia_get_socket(unsigned int sock, -+ socket_state_t *state){ -+ -+ DEBUG(3, "%s() for sock %u\n", __FUNCTION__, sock); -+ -+ /* This information was given to us in an earlier call to set_socket(), -+ * so we're just regurgitating it here: -+ */ -+ *state=pxa_pcmcia_socket[sock].cs_state; -+ -+ return 0; -+} -+ -+ -+/* pxa_pcmcia_set_socket() -+ * ^^^^^^^^^^^^^^^^^^^^^^^^^^ -+ * Implements the set_socket() operation for the in-kernel PCMCIA -+ * service (formerly SS_SetSocket in Card Services). We more or -+ * less punt all of this work and let the kernel handle the details -+ * of power configuration, reset, &c. We also record the value of -+ * `state' in order to regurgitate it to the PCMCIA core later. -+ * -+ * Returns: 0 -+ */ -+static int pxa_pcmcia_set_socket(unsigned int sock, -+ socket_state_t *state){ -+ -+ DEBUG(3, "%s() for sock %u\n", __FUNCTION__, sock); -+ -+ DEBUG(3, "\tmask: %s%s%s%s%s%s\n\tflags: %s%s%s%s%s%s\n" -+ "\tVcc %d Vpp %d irq %d\n", -+ (state->csc_mask==0)?"<NONE>":"", -+ (state->csc_mask&SS_DETECT)?"DETECT ":"", -+ (state->csc_mask&SS_READY)?"READY ":"", -+ (state->csc_mask&SS_BATDEAD)?"BATDEAD ":"", -+ (state->csc_mask&SS_BATWARN)?"BATWARN ":"", -+ (state->csc_mask&SS_STSCHG)?"STSCHG ":"", -+ (state->flags==0)?"<NONE>":"", -+ (state->flags&SS_PWR_AUTO)?"PWR_AUTO ":"", -+ (state->flags&SS_IOCARD)?"IOCARD ":"", -+ (state->flags&SS_RESET)?"RESET ":"", -+ (state->flags&SS_SPKR_ENA)?"SPKR_ENA ":"", -+ (state->flags&SS_OUTPUT_ENA)?"OUTPUT_ENA ":"", -+ state->Vcc, state->Vpp, state->io_irq); -+ -+ if(pcmcia_low_level->configure_socket(sock, state)<0){ -+ printk(KERN_ERR "Unable to configure socket %u\n", sock); -+ return -1; -+ } -+ -+ pxa_pcmcia_socket[sock].cs_state=*state; -+ -+ return 0; -+ -+} /* pxa_pcmcia_set_socket() */ -+ -+ -+/* pxa_pcmcia_get_io_map() -+ * ^^^^^^^^^^^^^^^^^^^^^^^^^^ -+ * Implements the get_io_map() operation for the in-kernel PCMCIA -+ * service (formerly SS_GetIOMap in Card Services). Just returns an -+ * I/O map descriptor which was assigned earlier by a set_io_map(). -+ * -+ * Returns: 0 on success, -1 if the map index was out of range -+ */ -+static int pxa_pcmcia_get_io_map(unsigned int sock, -+ struct pccard_io_map *map){ -+ -+ DEBUG(4, "%s() for sock %u\n", __FUNCTION__, sock); -+ -+ if(map->map>=MAX_IO_WIN){ -+ printk(KERN_ERR "%s(): map (%d) out of range\n", __FUNCTION__, -+ map->map); -+ return -1; -+ } -+ -+ *map=pxa_pcmcia_socket[sock].io_map[map->map]; -+ -+ return 0; -+} -+ -+ -+/* pxa_pcmcia_set_io_map() -+ * ^^^^^^^^^^^^^^^^^^^^^^^^^^ -+ * Implements the set_io_map() operation for the in-kernel PCMCIA -+ * service (formerly SS_SetIOMap in Card Services). We configure -+ * the map speed as requested, but override the address ranges -+ * supplied by Card Services. -+ * -+ * Returns: 0 on success, -1 on error -+ */ -+static int pxa_pcmcia_set_io_map(unsigned int sock, -+ struct pccard_io_map *map){ -+ unsigned int clock, speed; -+ unsigned long mecr, start; -+ -+ DEBUG(4, "%s() for sock %u\n", __FUNCTION__, sock); -+ -+ DEBUG(4, "\tmap %u speed %u\n\tstart 0x%08lx stop 0x%08lx\n" -+ "\tflags: %s%s%s%s%s%s%s%s\n", -+ map->map, map->speed, map->start, map->stop, -+ (map->flags==0)?"<NONE>":"", -+ (map->flags&MAP_ACTIVE)?"ACTIVE ":"", -+ (map->flags&MAP_16BIT)?"16BIT ":"", -+ (map->flags&MAP_AUTOSZ)?"AUTOSZ ":"", -+ (map->flags&MAP_0WS)?"0WS ":"", -+ (map->flags&MAP_WRPROT)?"WRPROT ":"", -+ (map->flags&MAP_USE_WAIT)?"USE_WAIT ":"", -+ (map->flags&MAP_PREFETCH)?"PREFETCH ":""); -+ -+ if(map->map>=MAX_IO_WIN){ -+ printk(KERN_ERR "%s(): map (%d) out of range\n", __FUNCTION__, -+ map->map); -+ return -1; -+ } -+ -+ if(map->flags&MAP_ACTIVE){ -+ -+ speed=(map->speed>0)?map->speed:PXA_PCMCIA_IO_ACCESS; -+ -+ clock = get_lclk_frequency_10khz(); -+ -+ pxa_pcmcia_socket[sock].speed_io=speed; -+ -+ if (sock == 0) { -+ MCIO0 = ((pxa_mcxx_setup(speed, clock) -+ & MCXX_SETUP_MASK) << MCXX_SETUP_SHIFT) -+ | ((pxa_mcxx_asst(speed, clock) -+ & MCXX_ASST_MASK) << MCXX_ASST_SHIFT) -+ | ((pxa_mcxx_hold(speed, clock) -+ & MCXX_HOLD_MASK) << MCXX_HOLD_SHIFT); -+ } else { -+ MCIO1 = ((pxa_mcxx_setup(speed, clock) -+ & MCXX_SETUP_MASK) << MCXX_SETUP_SHIFT) -+ | ((pxa_mcxx_asst(speed, clock) -+ & MCXX_ASST_MASK) << MCXX_ASST_SHIFT) -+ | ((pxa_mcxx_hold(speed, clock) -+ & MCXX_HOLD_MASK) << MCXX_HOLD_SHIFT); -+ } -+ -+ DEBUG(4, "%s(): FAST%u %lx BSM%u %lx BSA%u %lx BSIO%u %lx\n", -+ __FUNCTION__, sock, MECR_FAST_GET(mecr, sock), sock, -+ MECR_BSM_GET(mecr, sock), sock, MECR_BSA_GET(mecr, sock), -+ sock, MECR_BSIO_GET(mecr, sock)); -+ -+ } -+ -+ start=map->start; -+ -+ if(map->stop==1) -+ map->stop=PAGE_SIZE-1; -+ -+ map->start=pxa_pcmcia_socket[sock].virt_io; -+ map->stop=map->start+(map->stop-start); -+ -+ pxa_pcmcia_socket[sock].io_map[map->map]=*map; -+ -+ return 0; -+ -+} /* pxa_pcmcia_set_io_map() */ -+ -+ -+/* pxa_pcmcia_get_mem_map() -+ * ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -+ * Implements the get_mem_map() operation for the in-kernel PCMCIA -+ * service (formerly SS_GetMemMap in Card Services). Just returns a -+ * memory map descriptor which was assigned earlier by a -+ * set_mem_map() request. -+ * -+ * Returns: 0 on success, -1 if the map index was out of range -+ */ -+static int pxa_pcmcia_get_mem_map(unsigned int sock, -+ struct pccard_mem_map *map){ -+ -+ DEBUG(4, "%s() for sock %u\n", __FUNCTION__, sock); -+ -+ if(map->map>=MAX_WIN){ -+ printk(KERN_ERR "%s(): map (%d) out of range\n", __FUNCTION__, -+ map->map); -+ return -1; -+ } -+ -+ *map=pxa_pcmcia_socket[sock].mem_map[map->map]; -+ -+ return 0; -+} -+ -+ -+/* pxa_pcmcia_set_mem_map() -+ * ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -+ * Implements the set_mem_map() operation for the in-kernel PCMCIA -+ * service (formerly SS_SetMemMap in Card Services). We configure -+ * the map speed as requested, but override the address ranges -+ * supplied by Card Services. -+ * -+ * Returns: 0 on success, -1 on error -+ */ -+static int pxa_pcmcia_set_mem_map(unsigned int sock, -+ struct pccard_mem_map *map){ -+ unsigned int clock, speed; -+ unsigned long mecr, start; -+ -+ DEBUG(4, "%s() for sock %u\n", __FUNCTION__, sock); -+ -+ DEBUG(4, "\tmap %u speed %u\n\tsys_start %#lx\n" -+ "\tsys_stop %#lx\n\tcard_start %#x\n" -+ "\tflags: %s%s%s%s%s%s%s%s\n", -+ map->map, map->speed, map->sys_start, map->sys_stop, -+ map->card_start, (map->flags==0)?"<NONE>":"", -+ (map->flags&MAP_ACTIVE)?"ACTIVE ":"", -+ (map->flags&MAP_16BIT)?"16BIT ":"", -+ (map->flags&MAP_AUTOSZ)?"AUTOSZ ":"", -+ (map->flags&MAP_0WS)?"0WS ":"", -+ (map->flags&MAP_WRPROT)?"WRPROT ":"", -+ (map->flags&MAP_ATTRIB)?"ATTRIB ":"", -+ (map->flags&MAP_USE_WAIT)?"USE_WAIT ":""); -+ -+ if(map->map>=MAX_WIN){ -+ printk(KERN_ERR "%s(): map (%d) out of range\n", __FUNCTION__, -+ map->map); -+ return -1; -+ } -+ -+ if(map->flags&MAP_ACTIVE){ -+ /* When clients issue RequestMap, the access speed is not always -+ * properly configured: -+ */ -+ if(map->speed > 0) -+ speed = map->speed; -+ else -+ switch(pxa_pcmcia_socket[sock].cs_state.Vcc){ -+ case 33: -+ speed = PXA_PCMCIA_3V_MEM_ACCESS; -+ break; -+ default: -+ speed = PXA_PCMCIA_5V_MEM_ACCESS; -+ } -+ -+ clock = get_lclk_frequency_10khz(); -+ -+ if(map->flags&MAP_ATTRIB){ -+ if (sock == 0) { -+ MCATT0 = ((pxa_mcxx_setup(PXA_PCMCIA_ATTR_MEM_ACCESS, clock) -+ & MCXX_SETUP_MASK) << MCXX_SETUP_SHIFT) -+ | ((pxa_mcxx_asst(PXA_PCMCIA_ATTR_MEM_ACCESS, clock) -+ & MCXX_ASST_MASK) << MCXX_ASST_SHIFT) -+ | ((pxa_mcxx_hold(PXA_PCMCIA_ATTR_MEM_ACCESS, clock) -+ & MCXX_HOLD_MASK) << MCXX_HOLD_SHIFT); -+ } else { -+ MCATT1 = ((pxa_mcxx_setup(PXA_PCMCIA_ATTR_MEM_ACCESS, clock) -+ & MCXX_SETUP_MASK) << MCXX_SETUP_SHIFT) -+ | ((pxa_mcxx_asst(PXA_PCMCIA_ATTR_MEM_ACCESS, clock) -+ & MCXX_ASST_MASK) << MCXX_ASST_SHIFT) -+ | ((pxa_mcxx_hold(PXA_PCMCIA_ATTR_MEM_ACCESS, clock) -+ & MCXX_HOLD_MASK) << MCXX_HOLD_SHIFT); -+ } -+ pxa_pcmcia_socket[sock].speed_attr=speed; -+ } else { -+ if (sock == 0) { -+ MCMEM0 = ((pxa_mcxx_setup(speed, clock) -+ & MCXX_SETUP_MASK) << MCXX_SETUP_SHIFT) -+ | ((pxa_mcxx_asst(speed, clock) -+ & MCXX_ASST_MASK) << MCXX_ASST_SHIFT) -+ | ((pxa_mcxx_hold(speed, clock) -+ & MCXX_HOLD_MASK) << MCXX_HOLD_SHIFT); -+ } else { -+ MCMEM1 = ((pxa_mcxx_setup(speed, clock) -+ & MCXX_SETUP_MASK) << MCXX_SETUP_SHIFT) -+ | ((pxa_mcxx_asst(speed, clock) -+ & MCXX_ASST_MASK) << MCXX_ASST_SHIFT) -+ | ((pxa_mcxx_hold(speed, clock) -+ & MCXX_HOLD_MASK) << MCXX_HOLD_SHIFT); -+ } -+ pxa_pcmcia_socket[sock].speed_mem=speed; -+ } -+ DEBUG(4, "%s(): FAST%u %lx BSM%u %lx BSA%u %lx BSIO%u %lx\n", -+ __FUNCTION__, sock, MECR_FAST_GET(mecr, sock), sock, -+ MECR_BSM_GET(mecr, sock), sock, MECR_BSA_GET(mecr, sock), -+ sock, MECR_BSIO_GET(mecr, sock)); -+ } -+ -+ start=map->sys_start; -+ -+ if(map->sys_stop==0) -+ map->sys_stop=PAGE_SIZE-1; -+ -+ map->sys_start=(map->flags & MAP_ATTRIB)?\ -+ pxa_pcmcia_socket[sock].phys_attr:\ -+ pxa_pcmcia_socket[sock].phys_mem; -+ -+ map->sys_stop=map->sys_start+(map->sys_stop-start); -+ -+ pxa_pcmcia_socket[sock].mem_map[map->map]=*map; -+ -+ return 0; -+ -+} /* pxa_pcmcia_set_mem_map() */ -+ -+ -+#if defined(CONFIG_PROC_FS) -+ -+/* pxa_pcmcia_proc_setup() -+ * ^^^^^^^^^^^^^^^^^^^^^^^^^^ -+ * Implements the proc_setup() operation for the in-kernel PCMCIA -+ * service (formerly SS_ProcSetup in Card Services). -+ * -+ * Returns: 0 on success, -1 on error -+ */ -+static void pxa_pcmcia_proc_setup(unsigned int sock, -+ struct proc_dir_entry *base){ -+ struct proc_dir_entry *entry; -+ -+ DEBUG(4, "%s() for sock %u\n", __FUNCTION__, sock); -+ -+ if((entry=create_proc_entry("status", 0, base))==NULL){ -+ printk(KERN_ERR "Unable to install \"status\" procfs entry\n"); -+ return; -+ } -+ -+ entry->read_proc=pxa_pcmcia_proc_status; -+ entry->data=(void *)sock; -+} -+ -+ -+/* pxa_pcmcia_proc_status() -+ * ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -+ * Implements the /proc/bus/pccard/??/status file. -+ * -+ * Returns: the number of characters added to the buffer -+ */ -+static int pxa_pcmcia_proc_status(char *buf, char **start, off_t pos, -+ int count, int *eof, void *data){ -+ char *p=buf; -+ unsigned int sock=(unsigned int)data; -+ unsigned int clock = get_lclk_frequency_10khz(); -+ unsigned long mecr = MECR; -+ -+ p+=sprintf(p, "k_flags : %s%s%s%s%s%s%s\n", -+ pxa_pcmcia_socket[sock].k_state.detect?"detect ":"", -+ pxa_pcmcia_socket[sock].k_state.ready?"ready ":"", -+ pxa_pcmcia_socket[sock].k_state.bvd1?"bvd1 ":"", -+ pxa_pcmcia_socket[sock].k_state.bvd2?"bvd2 ":"", -+ pxa_pcmcia_socket[sock].k_state.wrprot?"wrprot ":"", -+ pxa_pcmcia_socket[sock].k_state.vs_3v?"vs_3v ":"", -+ pxa_pcmcia_socket[sock].k_state.vs_Xv?"vs_Xv ":""); -+ -+ p+=sprintf(p, "status : %s%s%s%s%s%s%s%s%s\n", -+ pxa_pcmcia_socket[sock].k_state.detect?"SS_DETECT ":"", -+ pxa_pcmcia_socket[sock].k_state.ready?"SS_READY ":"", -+ pxa_pcmcia_socket[sock].cs_state.Vcc?"SS_POWERON ":"", -+ pxa_pcmcia_socket[sock].cs_state.flags&SS_IOCARD?\ -+ "SS_IOCARD ":"", -+ (pxa_pcmcia_socket[sock].cs_state.flags&SS_IOCARD && -+ pxa_pcmcia_socket[sock].k_state.bvd1)?"SS_STSCHG ":"", -+ ((pxa_pcmcia_socket[sock].cs_state.flags&SS_IOCARD)==0 && -+ (pxa_pcmcia_socket[sock].k_state.bvd1==0))?"SS_BATDEAD ":"", -+ ((pxa_pcmcia_socket[sock].cs_state.flags&SS_IOCARD)==0 && -+ (pxa_pcmcia_socket[sock].k_state.bvd2==0))?"SS_BATWARN ":"", -+ pxa_pcmcia_socket[sock].k_state.vs_3v?"SS_3VCARD ":"", -+ pxa_pcmcia_socket[sock].k_state.vs_Xv?"SS_XVCARD ":""); -+ -+ p+=sprintf(p, "mask : %s%s%s%s%s\n", -+ pxa_pcmcia_socket[sock].cs_state.csc_mask&SS_DETECT?\ -+ "SS_DETECT ":"", -+ pxa_pcmcia_socket[sock].cs_state.csc_mask&SS_READY?\ -+ "SS_READY ":"", -+ pxa_pcmcia_socket[sock].cs_state.csc_mask&SS_BATDEAD?\ -+ "SS_BATDEAD ":"", -+ pxa_pcmcia_socket[sock].cs_state.csc_mask&SS_BATWARN?\ -+ "SS_BATWARN ":"", -+ pxa_pcmcia_socket[sock].cs_state.csc_mask&SS_STSCHG?\ -+ "SS_STSCHG ":""); -+ -+ p+=sprintf(p, "cs_flags : %s%s%s%s%s\n", -+ pxa_pcmcia_socket[sock].cs_state.flags&SS_PWR_AUTO?\ -+ "SS_PWR_AUTO ":"", -+ pxa_pcmcia_socket[sock].cs_state.flags&SS_IOCARD?\ -+ "SS_IOCARD ":"", -+ pxa_pcmcia_socket[sock].cs_state.flags&SS_RESET?\ -+ "SS_RESET ":"", -+ pxa_pcmcia_socket[sock].cs_state.flags&SS_SPKR_ENA?\ -+ "SS_SPKR_ENA ":"", -+ pxa_pcmcia_socket[sock].cs_state.flags&SS_OUTPUT_ENA?\ -+ "SS_OUTPUT_ENA ":""); -+ -+ p+=sprintf(p, "Vcc : %d\n", pxa_pcmcia_socket[sock].cs_state.Vcc); -+ -+ p+=sprintf(p, "Vpp : %d\n", pxa_pcmcia_socket[sock].cs_state.Vpp); -+ -+ p+=sprintf(p, "irq : %d\n", pxa_pcmcia_socket[sock].cs_state.io_irq); -+ -+ p+=sprintf(p, "I/O : %u (%u)\n", pxa_pcmcia_socket[sock].speed_io, -+ sock ? -+ pxa_pcmcia_cmd_time(clock, -+ ((MCIO1 >> MCXX_ASST_SHIFT) & MCXX_ASST_MASK)) : -+ pxa_pcmcia_cmd_time(clock, -+ ((MCIO0 >> MCXX_ASST_SHIFT) & MCXX_ASST_MASK))); -+ -+ p+=sprintf(p, "attribute: %u (%u)\n", pxa_pcmcia_socket[sock].speed_attr, -+ sock ? -+ pxa_pcmcia_cmd_time(clock, -+ ((MCATT1 >> MCXX_ASST_SHIFT) & MCXX_ASST_MASK)) : -+ pxa_pcmcia_cmd_time(clock, -+ ((MCATT0 >> MCXX_ASST_SHIFT) & MCXX_ASST_MASK))); -+ -+ p+=sprintf(p, "common : %u (%u)\n", pxa_pcmcia_socket[sock].speed_mem, -+ sock ? -+ pxa_pcmcia_cmd_time(clock, -+ ((MCMEM1 >> MCXX_ASST_SHIFT) & MCXX_ASST_MASK)) : -+ pxa_pcmcia_cmd_time(clock, -+ ((MCMEM0 >> MCXX_ASST_SHIFT) & MCXX_ASST_MASK))); -+ -+ return p-buf; -+} -+ -+#endif /* defined(CONFIG_PROC_FS) */ -+ -+ -+#ifdef CONFIG_CPU_FREQ -+ -+/* pxa_pcmcia_update_mecr() -+ * ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -+ * When pxa_pcmcia_notifier() decides that a MECR adjustment (due -+ * to a core clock frequency change) is needed, this routine establishes -+ * new BS_xx values consistent with the clock speed `clock'. -+ */ -+static void pxa_pcmcia_update_mecr(unsigned int clock){ -+ unsigned int sock; -+ -+ for(sock = 0; sock < PXA_PCMCIA_MAX_SOCK; ++sock){ -+ -+ // REVISIT: MCXX macros needed here -+ // MECR_BSIO_SET(mecr, sock, -+// pxa_pcmcia_mecr_bs(pxa_pcmcia_socket[sock].speed_io, -+// clock)); -+ // MECR_BSA_SET(mecr, sock, -+// pxa_pcmcia_mecr_bs(pxa_pcmcia_socket[sock].speed_attr, -+// clock)); -+ // MECR_BSM_SET(mecr, sock, -+// pxa_pcmcia_mecr_bs(pxa_pcmcia_socket[sock].speed_mem, -+// clock)); -+ } -+} -+ -+/* pxa_pcmcia_notifier() -+ * ^^^^^^^^^^^^^^^^^^^^^^^^ -+ * When changing the processor core clock frequency, it is necessary -+ * to adjust the MECR timings accordingly. We've recorded the timings -+ * requested by Card Services, so this is just a matter of finding -+ * out what our current speed is, and then recomputing the new MECR -+ * values. -+ * -+ * Returns: 0 on success, -1 on error -+ */ -+static int pxa_pcmcia_notifier(struct notifier_block *nb, -+ unsigned long val, void *data){ -+ struct cpufreq_info *ci = data; -+ -+ switch(val){ -+ case CPUFREQ_MINMAX: -+ -+ break; -+ -+ case CPUFREQ_PRECHANGE: -+ -+ if(ci->new_freq > ci->old_freq){ -+ DEBUG(2, "%s(): new frequency %u.%uMHz > %u.%uMHz, pre-updating\n", -+ __FUNCTION__, -+ ci->new_freq / 1000, (ci->new_freq / 100) % 10, -+ ci->old_freq / 1000, (ci->old_freq / 100) % 10); -+ pxa_pcmcia_update_mecr(ci->new_freq); -+ } -+ -+ break; -+ -+ case CPUFREQ_POSTCHANGE: -+ -+ if(ci->new_freq < ci->old_freq){ -+ DEBUG(2, "%s(): new frequency %u.%uMHz < %u.%uMHz, post-updating\n", -+ __FUNCTION__, -+ ci->new_freq / 1000, (ci->new_freq / 100) % 10, -+ ci->old_freq / 1000, (ci->old_freq / 100) % 10); -+ pxa_pcmcia_update_mecr(ci->new_freq); -+ } -+ -+ break; -+ -+ default: -+ printk(KERN_ERR "%s(): unknown CPU frequency event %lx\n", __FUNCTION__, -+ val); -+ return -1; -+ -+ } -+ -+ return 0; -+ -+} -+ -+static struct notifier_block pxa_pcmcia_notifier_block = { -+ notifier_call: pxa_pcmcia_notifier -+}; -+ -+#endif -+ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/pcmcia/pxa/pxa.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,233 @@ -+/* -+ * linux/drivers/pcmcia/pxa/pxa.h -+ * -+ * Author: George Davis -+ * Created: Jan 10, 2002 -+ * Copyright: MontaVista Software Inc. -+ * -+ * 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. -+ * -+ * Originally based upon linux/drivers/pcmcia/sa1100_generic.h -+ * -+ */ -+ -+/*====================================================================== -+ -+ Device driver for the PCMCIA control functionality of Intel -+ PXA250/210 microprocessors. -+ -+ The contents of this file are subject to the Mozilla Public -+ License Version 1.1 (the "License"); you may not use this file -+ except in compliance with the License. You may obtain a copy of -+ the License at http://www.mozilla.org/MPL/ -+ -+ Software distributed under the License is distributed on an "AS -+ IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or -+ implied. See the License for the specific language governing -+ rights and limitations under the License. -+ -+ The initial developer of the original code is John G. Dorsey -+ <john+@cs.cmu.edu>. Portions created by John G. Dorsey are -+ Copyright (C) 1999 John G. Dorsey. All Rights Reserved. -+ -+ Alternatively, the contents of this file may be used under the -+ terms of the GNU Public License version 2 (the "GPL"), in which -+ case the provisions of the GPL are applicable instead of the -+ above. If you wish to allow the use of your version of this file -+ only under the terms of the GPL and not to allow others to use -+ your version of this file under the MPL, indicate your decision -+ by deleting the provisions above and replace them with the notice -+ and other provisions required by the GPL. If you do not delete -+ the provisions above, a recipient may use your version of this -+ file under either the MPL or the GPL. -+ -+======================================================================*/ -+ -+#if !defined(_PCMCIA_PXA_H) -+# define _PCMCIA_PXA_H -+ -+#include <pcmcia/cs_types.h> -+#include <pcmcia/ss.h> -+#include <pcmcia/bulkmem.h> -+#include <pcmcia/cistpl.h> -+#include "../cs_internal.h" -+ -+#include <asm/arch/pcmcia.h> -+ -+ -+/* MECR: Expansion Memory Configuration Register -+ * (SA-1100 Developers Manual, p.10-13; SA-1110 Developers Manual, p.10-24) -+ * -+ * MECR layout is: -+ * -+ * FAST1 BSM1<4:0> BSA1<4:0> BSIO1<4:0> FAST0 BSM0<4:0> BSA0<4:0> BSIO0<4:0> -+ * -+ * (This layout is actually true only for the SA-1110; the FASTn bits are -+ * reserved on the SA-1100.) -+ */ -+ -+#define MCXX_SETUP_MASK (0x7f) -+#define MCXX_ASST_MASK (0x1f) -+#define MCXX_HOLD_MASK (0x3f) -+#define MCXX_SETUP_SHIFT (0) -+#define MCXX_ASST_SHIFT (7) -+#define MCXX_HOLD_SHIFT (14) -+ -+ -+#define MECR_SET(mecr, sock, shift, mask, bs) \ -+((mecr)=((mecr)&~(((mask)<<(shift))<<\ -+ ((sock)==0?MECR_SOCKET_0_SHIFT:MECR_SOCKET_1_SHIFT)))|\ -+ (((bs)<<(shift))<<((sock)==0?MECR_SOCKET_0_SHIFT:MECR_SOCKET_1_SHIFT))) -+ -+#define MECR_GET(mecr, sock, shift, mask) \ -+((((mecr)>>(((sock)==0)?MECR_SOCKET_0_SHIFT:MECR_SOCKET_1_SHIFT))>>\ -+ (shift))&(mask)) -+ -+#define MECR_BSIO_SET(mecr, sock, bs) \ -+MECR_SET((mecr), (sock), MECR_BSIO_SHIFT, MECR_BS_MASK, (bs)) -+ -+#define MECR_BSIO_GET(mecr, sock) \ -+MECR_GET((mecr), (sock), MECR_BSIO_SHIFT, MECR_BS_MASK) -+ -+#define MECR_BSA_SET(mecr, sock, bs) \ -+MECR_SET((mecr), (sock), MECR_BSA_SHIFT, MECR_BS_MASK, (bs)) -+ -+#define MECR_BSA_GET(mecr, sock) \ -+MECR_GET((mecr), (sock), MECR_BSA_SHIFT, MECR_BS_MASK) -+ -+#define MECR_BSM_SET(mecr, sock, bs) \ -+MECR_SET((mecr), (sock), MECR_BSM_SHIFT, MECR_BS_MASK, (bs)) -+ -+#define MECR_BSM_GET(mecr, sock) \ -+MECR_GET((mecr), (sock), MECR_BSM_SHIFT, MECR_BS_MASK) -+ -+#define MECR_FAST_SET(mecr, sock, fast) \ -+MECR_SET((mecr), (sock), MECR_FAST_SHIFT, MECR_FAST_MODE_MASK, (fast)) -+ -+#define MECR_FAST_GET(mecr, sock) \ -+MECR_GET((mecr), (sock), MECR_FAST_SHIFT, MECR_FAST_MODE_MASK) -+ -+ -+/* This function implements the BS value calculation for setting the MECR -+ * using integer arithmetic: -+ */ -+static inline unsigned int pxa_pcmcia_mecr_bs(unsigned int pcmcia_cycle_ns, -+ unsigned int cpu_clock_khz){ -+ unsigned int t = ((pcmcia_cycle_ns * cpu_clock_khz) / 6) - 1000000; -+ return (t / 1000000) + (((t % 1000000) == 0) ? 0 : 1); -+} -+ -+static inline u_int pxa_mcxx_hold(u_int pcmcia_cycle_ns, -+ u_int mem_clk_10khz){ -+ u_int code = pcmcia_cycle_ns * mem_clk_10khz; -+ return (code / 300000) + ((code % 300000) ? 1 : 0); -+} -+ -+static inline u_int pxa_mcxx_asst(u_int pcmcia_cycle_ns, -+ u_int mem_clk_10khz){ -+ u_int code = pcmcia_cycle_ns * mem_clk_10khz; -+ return (code / 300000) + ((code % 300000) ? 1 : 0); -+} -+ -+static inline u_int pxa_mcxx_setup(u_int pcmcia_cycle_ns, -+ u_int mem_clk_10khz){ -+ u_int code = pcmcia_cycle_ns * mem_clk_10khz; -+ return (code / 100000) + ((code % 100000) ? 1 : 0) + 1; -+} -+ -+/* This function returns the (approxmiate) command assertion period, in -+ * nanoseconds, for a given CPU clock frequency and MCXX_ASST value: -+ */ -+ -+static inline u_int pxa_pcmcia_cmd_time(u_int mem_clk_10khz, -+ u_int pcmcia_mcxx_asst){ -+ return (300000 * (pcmcia_mcxx_asst + 1) / mem_clk_10khz); -+} -+ -+ -+/* SA-1100 PCMCIA Memory and I/O timing -+ * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -+ * The SA-1110 Developer's Manual, section 10.2.5, says the following: -+ * -+ * "To calculate the recommended BS_xx value for each address space: -+ * divide the command width time (the greater of twIOWR and twIORD, -+ * or the greater of twWE and twOE) by processor cycle time; divide -+ * by 2; divide again by 3 (number of BCLK's per command assertion); -+ * round up to the next whole number; and subtract 1." -+ * -+ * The PC Card Standard, Release 7, section 4.13.4, says that twIORD -+ * has a minimum value of 165ns. Section 4.13.5 says that twIOWR has -+ * a minimum value of 165ns, as well. Section 4.7.2 (describing -+ * common and attribute memory write timing) says that twWE has a -+ * minimum value of 150ns for a 250ns cycle time (for 5V operation; -+ * see section 4.7.4), or 300ns for a 600ns cycle time (for 3.3V -+ * operation, also section 4.7.4). Section 4.7.3 says that taOE -+ * has a maximum value of 150ns for a 300ns cycle time (for 5V -+ * operation), or 300ns for a 600ns cycle time (for 3.3V operation). -+ * -+ * When configuring memory maps, Card Services appears to adopt the policy -+ * that a memory access time of "0" means "use the default." The default -+ * PCMCIA I/O command width time is 165ns. The default PCMCIA 5V attribute -+ * and memory command width time is 150ns; the PCMCIA 3.3V attribute and -+ * memory command width time is 300ns. -+ */ -+ -+/* The PXA 250 and PXA 210 Application Processors Developer's Manual -+ * was used to determine correct PXA_PCMCIA_IO_ACCES time -+ */ -+ -+#define PXA_PCMCIA_IO_ACCESS (165) -+ -+/* Default PC Card Common Memory timings*/ -+ -+#define PXA_PCMCIA_5V_MEM_ACCESS (250) -+#define PXA_PCMCIA_3V_MEM_ACCESS (250) -+ -+/* Atrribute Memory timing - must be constant via PC Card standart*/ -+ -+#define PXA_PCMCIA_ATTR_MEM_ACCESS (300) -+ -+ -+/* The socket driver actually works nicely in interrupt-driven form, -+ * so the (relatively infrequent) polling is "just to be sure." -+ */ -+#define PXA_PCMCIA_POLL_PERIOD (2*HZ) -+ -+ -+/* This structure encapsulates per-socket state which we might need to -+ * use when responding to a Card Services query of some kind. -+ */ -+struct pxa_pcmcia_socket { -+ socket_state_t cs_state; -+ struct pcmcia_state k_state; -+ unsigned int irq; -+ void (*handler)(void *, unsigned int); -+ void *handler_info; -+ pccard_io_map io_map[MAX_IO_WIN]; -+ pccard_mem_map mem_map[MAX_WIN]; -+ ioaddr_t virt_io, phys_attr, phys_mem; -+ unsigned short speed_io, speed_attr, speed_mem; -+}; -+ -+ -+/* I/O pins replacing memory pins -+ * (PCMCIA System Architecture, 2nd ed., by Don Anderson, p.75) -+ * -+ * These signals change meaning when going from memory-only to -+ * memory-or-I/O interface: -+ */ -+#define iostschg bvd1 -+#define iospkr bvd2 -+ -+ -+/* -+ * Declaration for all implementation specific low_level operations. -+ */ -+extern struct pcmcia_low_level lubbock_pcmcia_ops; -+extern struct pcmcia_low_level pxa_idp_pcmcia_ops; -+extern struct pcmcia_low_level cerf_pcmcia_ops; -+extern struct pcmcia_low_level trizeps2_pcmcia_ops; -+ -+#endif /* !defined(_PCMCIA_PXA_H) */ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/pcmcia/pxa/pxa_idp.c 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,297 @@ -+/* -+ * linux/drivers/pcmcia/pxa/pxa_idp.c -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * Copyright (c) 2002 Accelent Systems, Inc. All Rights Reserved -+ * -+ * Platform specific routines for the Accelent PXA250 IDP, based on those -+ * first done for the Lubbock. -+ * -+ * Version 1.0 2002-05-02 Jeff Sutherland <jeffs@accelent.com> -+ * -+ */ -+ -+#include <linux/kernel.h> -+#include <linux/sched.h> -+ -+#include <pcmcia/ss.h> -+ -+#include <asm/delay.h> -+#include <asm/hardware.h> -+#include <asm/irq.h> -+#include <asm/arch/pcmcia.h> -+ -+static int -+pxa_idp_pcmcia_init(struct pcmcia_init *init) -+{ -+ int return_val = 0; -+ -+ /* Set PCMCIA Socket 0 power to standby mode. -+ * PXA IDP has dedicated CPLD pins for all this stuff :-) -+ */ -+ -+ /* both slots disabled, reset NOT active */ -+ IDP_CPLD_PCCARD_EN = PCC0_ENABLE | PCC1_ENABLE; -+ -+ IDP_CPLD_PCCARD_PWR = 0; //all power to both slots off -+ -+ GPDR(IRQ_TO_GPIO_2_80(PCMCIA_S0_CD_VALID)) &= -+ ~GPIO_bit(IRQ_TO_GPIO_2_80(PCMCIA_S0_CD_VALID)); -+ GPDR(IRQ_TO_GPIO_2_80(PCMCIA_S1_CD_VALID)) &= -+ ~GPIO_bit(IRQ_TO_GPIO_2_80(PCMCIA_S1_CD_VALID)); -+ -+ set_GPIO_IRQ_edge(IRQ_TO_GPIO_2_80(PCMCIA_S0_CD_VALID), -+ GPIO_BOTH_EDGES); -+ set_GPIO_IRQ_edge(IRQ_TO_GPIO_2_80(PCMCIA_S1_CD_VALID), -+ GPIO_BOTH_EDGES); -+ -+ /* irq's for slots: */ -+ GPDR(IRQ_TO_GPIO_2_80(PCMCIA_S0_RDYINT)) &= -+ ~GPIO_bit(IRQ_TO_GPIO_2_80(PCMCIA_S0_RDYINT)); -+ GPDR(IRQ_TO_GPIO_2_80(PCMCIA_S1_RDYINT)) &= -+ ~GPIO_bit(IRQ_TO_GPIO_2_80(PCMCIA_S1_RDYINT)); -+ -+ set_GPIO_IRQ_edge(IRQ_TO_GPIO_2_80(PCMCIA_S0_RDYINT), -+ GPIO_FALLING_EDGE); -+ set_GPIO_IRQ_edge(IRQ_TO_GPIO_2_80(PCMCIA_S1_RDYINT), -+ GPIO_FALLING_EDGE); -+ -+ return_val = -+ request_irq(PCMCIA_S0_CD_VALID, init->handler, SA_INTERRUPT, -+ "PXA PCMCIA CD0", NULL); -+ -+ if (return_val < 0) -+ return -1; -+ -+ return_val += -+ request_irq(PCMCIA_S1_CD_VALID, init->handler, SA_INTERRUPT, -+ "PXA PCMCIA CD1", NULL); -+ -+ if (return_val < 0) { -+ free_irq(PCMCIA_S0_CD_VALID, NULL); -+ return -1; -+ } -+ -+ return 2; -+} -+ -+static int -+pxa_idp_pcmcia_shutdown(void) -+{ -+ -+ free_irq(PCMCIA_S0_CD_VALID, NULL); -+ free_irq(PCMCIA_S1_CD_VALID, NULL); -+ -+ IDP_CPLD_PCCARD_EN = 0x03; //disable slots -+ udelay(200); -+ IDP_CPLD_PCCARD_PWR = 0; //shut off all power -+ -+ return 0; -+} -+ -+static int -+pxa_idp_pcmcia_socket_state(struct pcmcia_state_array *state_array) -+{ -+ unsigned long status; -+ int return_val = 1; -+ int i; -+ volatile unsigned long *stat_regs[2] = { &IDP_CPLD_PCCARD0_STATUS, -+ &IDP_CPLD_PCCARD1_STATUS -+ }; -+ -+ if (state_array->size < 2) -+ return -1; -+ -+ memset(state_array->state, 0, -+ (state_array->size) * sizeof (struct pcmcia_state)); -+ -+ for (i = 0; i < 2; i++) { -+ -+ status = *stat_regs[i]; -+ -+ /* this one is a gpio */ -+ state_array->state[i].detect = (PCC_DETECT(i)) ? 0 : 1; -+ -+ state_array->state[i].ready = -+ ((status & _PCC_IRQ) == 0) ? 0 : 1; -+ state_array->state[i].bvd1 = (status & PCC_BVD1) ? 0 : 1; -+ state_array->state[i].bvd2 = (status & PCC_BVD2) ? 0 : 1; -+ state_array->state[i].wrprot = -+ (status & _PCC_WRPROT) ? 1 : 0; -+ state_array->state[i].vs_3v = (status & PCC_VS1) ? 0 : 1; -+ state_array->state[i].vs_Xv = (status & PCC_VS2) ? 0 : 1; -+ } -+ -+ return return_val; -+} -+ -+static int -+pxa_idp_pcmcia_get_irq_info(struct pcmcia_irq_info *info) -+{ -+ switch (info->sock) { -+ case 0: -+ info->irq = PCMCIA_S0_RDYINT; -+ break; -+ -+ case 1: -+ info->irq = PCMCIA_S1_RDYINT; -+ break; -+ -+ default: -+ return -1; -+ } -+ -+ return 0; -+} -+ -+static int -+pxa_idp_pcmcia_configure_socket(unsigned int sock, socket_state_t *state) -+{ -+ /* The PXA Idp uses the Maxim MAX1602, with the following connections: -+ * -+ * Socket 0 (PCMCIA): -+ * MAX1602 PXA_IDP Register -+ * Pin Signal IDP_CPLD_PCCARD_PWR: -+ * ----- ------- ---------------------- -+ * A0VPP PCC0_PWR0 bit0 -+ * A1VPP PCC0_PWR1 bit1 -+ * A0VCC PCC0_PWR2 bit2 -+ * A1VCC PCC0_PWR3 bit3 -+ * VX VCC -+ * VY +3.3V -+ * 12IN +12V -+ * CODE +3.3V Cirrus Code, CODE = High (VY) -+ * -+ * Socket 1 (PCMCIA): -+ * MAX1602 PXA_IDP Register -+ * Pin Signal IDP_CPLD_PCCARD_PWR: -+ * ----- ------- ---------------------- -+ * A0VPP PCC1_PWR0 bit4 -+ * A1VPP PCC1_PWR1 bit5 -+ * A0VCC PCC1_PWR2 bit6 -+ * A1VCC PCC1_PWR3 bit7 -+ * VX VCC -+ * VY +3.3V -+ * 12IN +12V -+ * CODE +3.3V Cirrus Code, CODE = High (VY) -+ * -+ */ -+ -+ switch (sock) { -+ case 0: -+ switch (state->Vcc) { -+ case 0: -+ IDP_CPLD_PCCARD_EN |= PCC0_ENABLE; // disable socket -+ udelay(200); -+ IDP_CPLD_PCCARD_PWR &= ~(PCC0_PWR2 | PCC0_PWR3); -+ break; -+ -+ case 33: -+ IDP_CPLD_PCCARD_PWR &= ~(PCC0_PWR2 | PCC0_PWR3); -+ IDP_CPLD_PCCARD_PWR |= PCC0_PWR3; -+ IDP_CPLD_PCCARD_EN &= ~PCC0_ENABLE; //turn it on -+ break; -+ -+ case 50: -+ IDP_CPLD_PCCARD_PWR &= ~(PCC0_PWR2 | PCC0_PWR3); -+ IDP_CPLD_PCCARD_PWR |= PCC0_PWR2; -+ IDP_CPLD_PCCARD_EN &= ~PCC0_ENABLE; -+ break; -+ -+ default: -+ printk(KERN_ERR "%s(): unrecognized Vcc %u\n", -+ __FUNCTION__, state->Vcc); -+ return -1; -+ } -+ -+ switch (state->Vpp) { -+ case 0: -+ IDP_CPLD_PCCARD_PWR &= ~(PCC0_PWR0 | PCC0_PWR1); -+ break; -+ -+ case 120: -+ IDP_CPLD_PCCARD_PWR &= ~(PCC0_PWR0 | PCC0_PWR1); -+ IDP_CPLD_PCCARD_PWR |= PCC0_PWR1; -+ break; -+ -+ default: -+ if (state->Vpp == state->Vcc) -+ IDP_CPLD_PCCARD_PWR = -+ (IDP_CPLD_PCCARD_PWR & -+ ~(PCC0_PWR0 | PCC0_PWR1)) | PCC0_PWR0; -+ else { -+ printk(KERN_ERR "%s(): unrecognized Vpp %u\n", -+ __FUNCTION__, state->Vpp); -+ return -1; -+ } -+ } -+ -+ IDP_CPLD_PCCARD_EN = -+ (state->flags & SS_RESET) ? (IDP_CPLD_PCCARD_EN | PCC0_RESET) -+ : (IDP_CPLD_PCCARD_EN & ~PCC0_RESET); -+ break; -+ -+ case 1: -+ switch (state->Vcc) { -+ case 0: -+ IDP_CPLD_PCCARD_EN |= PCC1_ENABLE; // disable socket -+ udelay(200); -+ IDP_CPLD_PCCARD_PWR &= ~(PCC1_PWR2 | PCC1_PWR3); -+ break; -+ -+ case 33: -+ IDP_CPLD_PCCARD_PWR &= ~(PCC1_PWR2 | PCC1_PWR3); -+ IDP_CPLD_PCCARD_PWR |= PCC1_PWR3; -+ IDP_CPLD_PCCARD_EN &= ~PCC1_ENABLE; //turn it on -+ break; -+ -+ case 50: -+ IDP_CPLD_PCCARD_PWR &= ~(PCC1_PWR2 | PCC1_PWR3); -+ IDP_CPLD_PCCARD_PWR |= PCC1_PWR2; -+ IDP_CPLD_PCCARD_EN &= ~PCC1_ENABLE; -+ break; -+ -+ default: -+ printk(KERN_ERR "%s(): unrecognized Vcc %u\n", -+ __FUNCTION__, state->Vcc); -+ return -1; -+ } -+ -+ switch (state->Vpp) { -+ case 0: -+ IDP_CPLD_PCCARD_PWR &= ~(PCC1_PWR0 | PCC1_PWR1); -+ break; -+ -+ case 120: -+ IDP_CPLD_PCCARD_PWR &= ~(PCC1_PWR0 | PCC1_PWR1); -+ IDP_CPLD_PCCARD_PWR |= PCC1_PWR1; -+ break; -+ -+ default: -+ if (state->Vpp == state->Vcc) -+ IDP_CPLD_PCCARD_PWR = -+ (IDP_CPLD_PCCARD_PWR & -+ ~(PCC1_PWR0 | PCC1_PWR1)) | PCC1_PWR0; -+ else { -+ printk(KERN_ERR "%s(): unrecognized Vpp %u\n", -+ __FUNCTION__, state->Vpp); -+ return -1; -+ } -+ } -+ IDP_CPLD_PCCARD_EN = (state->flags & SS_RESET) ? (IDP_CPLD_PCCARD_EN | PCC1_RESET) -+ : (IDP_CPLD_PCCARD_EN & ~PCC1_RESET); -+ break; -+ } -+ return 0; -+} -+ -+struct pcmcia_low_level pxa_idp_pcmcia_ops = { -+ pxa_idp_pcmcia_init, -+ pxa_idp_pcmcia_shutdown, -+ pxa_idp_pcmcia_socket_state, -+ pxa_idp_pcmcia_get_irq_info, -+ pxa_idp_pcmcia_configure_socket -+}; ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/pcmcia/pxa/trizeps2.c 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,187 @@ -+/* -+ * linux/drivers/pcmcia/pxa/trizeps2.c -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * Copyright (c) 2002 Accelent Systems, Inc. All Rights Reserved -+ * -+ * Platform specific routines for the Keith-n-Koep Trizeps-II, based on IDP -+ * -+ * Copyright (c) 2003 Teradyne DS, Ltd. -+ * Port to Trizeps-2 MT6N board by Luc De Cock -+ * -+ */ -+ -+#include <linux/kernel.h> -+#include <linux/sched.h> -+ -+#include <pcmcia/ss.h> -+ -+#include <asm/delay.h> -+#include <asm/hardware.h> -+#include <asm/irq.h> -+#include <asm/arch/pcmcia.h> -+ -+static int trizeps2_pcmcia_init(struct pcmcia_init *init) -+{ -+ int return_val = 0; -+ unsigned short *bcr = (unsigned short *) TRIZEPS2_BCR_BASE; -+ unsigned short val; -+ -+ /* reset the PCMCIA controller */ -+ val = trizeps2_bcr_shadow | BCR_PCMCIA_RESET; -+ *bcr = val; -+ udelay(500); -+ /* un-reset it again */ -+ trizeps2_bcr_shadow &= ~BCR_PCMCIA_RESET; -+ /* enable the PCMCIA buffer */ -+ trizeps2_bcr_shadow &= ~(1 << 5); -+ *bcr = trizeps2_bcr_shadow; -+ -+ GPDR(IRQ_TO_GPIO_2_80(PCMCIA_S_CD_VALID)) &= -+ ~GPIO_bit(IRQ_TO_GPIO_2_80(PCMCIA_S_CD_VALID)); -+ set_GPIO_IRQ_edge(IRQ_TO_GPIO_2_80(PCMCIA_S_CD_VALID), -+ PCMCIA_S_CD_VALID_EDGE); -+ GPDR(IRQ_TO_GPIO(PCMCIA_S_RDYINT)) &= -+ ~GPIO_bit(IRQ_TO_GPIO(PCMCIA_S_RDYINT)); -+ set_GPIO_IRQ_edge(IRQ_TO_GPIO(PCMCIA_S_RDYINT), -+ PCMCIA_S_RDYINT_EDGE); -+ -+ return_val = request_irq(PCMCIA_S_CD_VALID, init->handler, SA_INTERRUPT, -+ "PXA PCMCIA CD", NULL); -+ if (return_val < 0) { -+ return -1; -+ } -+ /* only 1 slot */ -+ return 1; -+} -+ -+static int trizeps2_pcmcia_shutdown(void) -+{ -+ free_irq(PCMCIA_S_CD_VALID, NULL); -+ -+ unsigned short *bcr = (unsigned short *) TRIZEPS2_BCR_BASE; -+ trizeps2_bcr_shadow |= (1 << 5); /* pcmcia buffer off */ -+ *bcr = trizeps2_bcr_shadow; -+ trizeps2_bcr_shadow &= 0xFFF0; /* pcmcia control logic grounded */ -+ *bcr = trizeps2_bcr_shadow; -+ -+ return 0; -+} -+ -+static int trizeps2_pcmcia_socket_state(struct pcmcia_state_array *state_array) -+{ -+ unsigned long status; -+ int return_val = 1; -+ volatile unsigned short *stat_regs[1] = { -+ &TRIZEPS2_PCCARD_STATUS -+ }; -+ -+ if (state_array->size < 1) -+ return -1; -+ -+ memset(state_array->state, 0, -+ (state_array->size) * sizeof (struct pcmcia_state)); -+ -+ status = *stat_regs[0]; -+ -+ /* this one is a gpio */ -+ state_array->state[0].detect = (PCC_DETECT) ? 0 : 1; -+ state_array->state[0].ready = (PCC_READY) ? 1 : 0; -+ state_array->state[0].bvd1 = (status & PCC_BVD1) ? 1 : 0; -+ state_array->state[0].bvd2 = (status & PCC_BVD2) ? 1 : 0; -+ state_array->state[0].wrprot = 0; /* r/w all the time */ -+ state_array->state[0].vs_3v = (status & PCC_VS1) ? 0 : 1; -+ state_array->state[0].vs_Xv = (status & PCC_VS2) ? 0 : 1; -+ -+ return return_val; -+} -+ -+static int trizeps2_pcmcia_get_irq_info(struct pcmcia_irq_info *info) -+{ -+ switch (info->sock) { -+ case 0: -+ info->irq = PCMCIA_S_RDYINT; -+ break; -+ -+ default: -+ return -1; -+ } -+ -+ return 0; -+} -+ -+static int trizeps2_pcmcia_configure_socket(unsigned int sock, socket_state_t *state) -+{ -+ unsigned short cntr_logic = trizeps2_bcr_shadow & 0xF; -+ unsigned short *bcr = (unsigned short *) TRIZEPS2_BCR_BASE; -+ -+ /* configure Vcc and Vpp */ -+ switch (sock) { -+ case 0: -+ switch (state->Vcc) { -+ case 0: -+ cntr_logic &= ~(PCC_3V | PCC_5V); -+ break; -+ -+ case 33: -+ cntr_logic &= ~(PCC_3V | PCC_5V); -+ cntr_logic |= PCC_3V; -+ break; -+ -+ case 50: -+ cntr_logic &= ~(PCC_3V | PCC_5V); -+ cntr_logic |= PCC_5V; -+ break; -+ -+ default: -+ printk(KERN_ERR "%s(): unrecognized Vcc %u\n", -+ __FUNCTION__, state->Vcc); -+ return -1; -+ } -+ -+ switch (state->Vpp) { -+ case 0: -+ cntr_logic &= ~(PCC_EN0 | PCC_EN1); -+ break; -+ -+ case 120: -+ cntr_logic &= ~(PCC_EN0 | PCC_EN1); -+ cntr_logic |= PCC_EN1; -+ break; -+ -+ default: -+ if (state->Vpp == state->Vcc) { -+ cntr_logic &= ~(PCC_EN0 | PCC_EN1); -+ cntr_logic |= PCC_EN0; -+ } -+ else { -+ printk(KERN_ERR "%s(): unrecognized Vpp %u\n", -+ __FUNCTION__, state->Vpp); -+ return -1; -+ } -+ } -+ trizeps2_bcr_shadow &= ~(PCC_EN0 | PCC_EN1 | PCC_3V | PCC_5V | -+ BCR_PCMCIA_RESET); -+ trizeps2_bcr_shadow |= cntr_logic; -+ *bcr = trizeps2_bcr_shadow; -+ /* reset PCMCIA controller if requested */ -+ trizeps2_bcr_shadow |= -+ (state->flags & SS_RESET) ? BCR_PCMCIA_RESET : 0; -+ *bcr = trizeps2_bcr_shadow; -+ udelay(500); -+ break; -+ } -+ return 0; -+} -+ -+struct pcmcia_low_level trizeps2_pcmcia_ops = { -+ trizeps2_pcmcia_init, -+ trizeps2_pcmcia_shutdown, -+ trizeps2_pcmcia_socket_state, -+ trizeps2_pcmcia_get_irq_info, -+ trizeps2_pcmcia_configure_socket -+}; -+ ---- linux-2.4.25/drivers/pcmcia/sa1100_cerf.c~2.4.25-vrs2-pxa1.patch 2002-08-03 02:39:44.000000000 +0200 -+++ linux-2.4.25/drivers/pcmcia/sa1100_cerf.c 2004-03-31 17:15:12.000000000 +0200 -@@ -7,15 +7,25 @@ - */ - #include <linux/kernel.h> - #include <linux/sched.h> -+#include <linux/delay.h> - - #include <asm/hardware.h> - #include <asm/irq.h> --#include "sa1100_generic.h" - --#ifdef CONFIG_SA1100_CERF_CPLD --#define CERF_SOCKET 0 -+#include <pcmcia/ss.h> -+#include <asm/arch/pcmcia.h> -+#include "sa1100_cerf.h" -+ -+/* -+ * Set this to zero to remove all the debug statements via -+ * dead code elimination -+ */ -+//#define DEBUGGING 1 -+ -+#if DEBUGGING -+static unsigned int pcmcia_debug = DEBUGGING; - #else --#define CERF_SOCKET 1 -+#define pcmcia_debug 0 /* gcc will remove all the debug code for us */ - #endif - - static struct irqs { -@@ -23,122 +33,178 @@ - unsigned int gpio; - const char *str; - } irqs[] = { -- { IRQ_GPIO_CF_CD, GPIO_CF_CD, "CF_CD" }, -- { IRQ_GPIO_CF_BVD2, GPIO_CF_BVD2, "CF_BVD2" }, -- { IRQ_GPIO_CF_BVD1, GPIO_CF_BVD1, "CF_BVD1" } -+ { PCMCIA_IRQ_CF_CD, PCMCIA_GPIO_CF_CD_EDGE, "CF_CD" }, -+ { PCMCIA_IRQ_CF_BVD2, PCMCIA_GPIO_CF_BVD2_EDGE, "CF_BVD2" }, -+ { PCMCIA_IRQ_CF_BVD1, PCMCIA_GPIO_CF_BVD1_EDGE, "CF_BVD1" } - }; - -+static void cerf_pcmcia_reset( void) -+{ -+ int i; -+ -+ // Make sure SKTSEL is 0 (single slot) -+ set_GPIO_mode(54 | GPIO_OUT); -+ GPCR1 = GPIO_bit(54); -+ set_GPIO_mode(GPIO54_pSKTSEL_MD); -+ -+ PCMCIA_GPCR = PCMCIA_GPIO_CF_RESET_MASK; -+ mdelay(300); -+ -+ PCMCIA_GPSR = PCMCIA_GPIO_CF_RESET_MASK; -+ udelay(20); -+ -+ PCMCIA_GPCR = PCMCIA_GPIO_CF_RESET_MASK; -+ mdelay(50); -+ -+ for( i=0; i<10; i++) -+ { -+ if( cerf_pcmcia_level_ready()) break; -+ mdelay(100); -+ } -+} -+ - static int cerf_pcmcia_init(struct pcmcia_init *init) - { -- int i, res; -+ int i, res; - -- set_GPIO_IRQ_edge( GPIO_CF_IRQ, GPIO_FALLING_EDGE ); -+ if( pcmcia_debug) -+ printk( KERN_INFO "cerf_pcmcia_init: enter\n"); - -- for (i = 0; i < ARRAY_SIZE(irqs); i++) { -- set_GPIO_IRQ_edge(irqs[i].gpio, GPIO_NO_EDGES); -- res = request_irq(irqs[i].irq, init->handler, SA_INTERRUPT, -- irqs[i].str, NULL); -- if (res) -- goto irq_err; -- } -+ cerf_pcmcia_set_gpio_direction(); - -- return 2; -+ set_GPIO_IRQ_edge( PCMCIA_GPIO_CF_IRQ_EDGE, GPIO_FALLING_EDGE ); - -- irq_err: -- printk(KERN_ERR "%s: Request for IRQ%d failed\n", __FUNCTION__, irqs[i].irq); -+ for (i = 0; i < ARRAY_SIZE(irqs); i++) { - -- while (i--) -- free_irq(irqs[i].irq, NULL); -+ set_GPIO_IRQ_edge(irqs[i].gpio, GPIO_BOTH_EDGES); - -- return -1; -+ res = request_irq(irqs[i].irq, init->handler, SA_INTERRUPT, -+ irqs[i].str, NULL); -+ if (res) -+ goto irq_err; -+ } -+ -+ printk( KERN_INFO "PCMCIA for Cerf: OK\n"); -+ -+ return CERF_SOCKET+1; /* last socket used +1 */ -+ -+irq_err: -+ printk(KERN_ERR "%s: Request for IRQ%d failed\n", -+ __FUNCTION__, irqs[i].irq); -+ -+ while (i--) -+ free_irq(irqs[i].irq, NULL); -+ -+ return -1; - } - - static int cerf_pcmcia_shutdown(void) - { -- int i; -+ int i; -+ if( pcmcia_debug) -+ printk( KERN_INFO "cerf_pcmcia_shutdown: enter\n"); - -- for (i = 0; i < ARRAY_SIZE(irqs); i++) -- free_irq(irqs[i].irq, NULL); -+ for (i = 0; i < ARRAY_SIZE(irqs); i++) -+ free_irq(irqs[i].irq, NULL); - -- return 0; -+ return 0; - } - --static int cerf_pcmcia_socket_state(struct pcmcia_state_array -- *state_array){ -- unsigned long levels; -- int i = CERF_SOCKET; -+static int cerf_pcmcia_socket_state(struct pcmcia_state_array *state_array) -+{ -+ int i = CERF_SOCKET; - -- if(state_array->size<2) return -1; -+ if( pcmcia_debug > 3) -+ printk( KERN_INFO "cerf_pcmcia_socket_state: i=%d, size=%d\n", -+ i, state_array->size); - -- levels=GPLR; -+ memset(state_array->state, 0, -+ (state_array->size)*sizeof(struct pcmcia_state)); - -- state_array->state[i].detect=((levels & GPIO_CF_CD)==0)?1:0; -- state_array->state[i].ready=(levels & GPIO_CF_IRQ)?1:0; -- state_array->state[i].bvd1=(levels & GPIO_CF_BVD1)?1:0; -- state_array->state[i].bvd2=(levels & GPIO_CF_BVD2)?1:0; -- state_array->state[i].wrprot=0; -- state_array->state[i].vs_3v=1; -- state_array->state[i].vs_Xv=0; -+ state_array->state[i].detect = cerf_pcmcia_level_detect(); -+ state_array->state[i].ready = cerf_pcmcia_level_ready(); -+ state_array->state[i].bvd1 = cerf_pcmcia_level_bvd1(); -+ state_array->state[i].bvd2 = cerf_pcmcia_level_bvd2(); -+ state_array->state[i].wrprot=0; -+ state_array->state[i].vs_3v=1; -+ state_array->state[i].vs_Xv=0; - -- return 1; -+ if( pcmcia_debug > 3) -+ printk( KERN_INFO "cerf_pcmcia_socket_state: " -+ "detect=%d ready=%d bvd1=%d bvd2=%d\n", -+ state_array->state[i].detect, -+ state_array->state[i].ready, -+ state_array->state[i].bvd1, -+ state_array->state[i].bvd2); -+ -+ return 1; - } - - static int cerf_pcmcia_get_irq_info(struct pcmcia_irq_info *info){ - -- if(info->sock>1) return -1; -+ if( pcmcia_debug) -+ printk( KERN_INFO "cerf_pcmcia_get_irq_info: " -+ "sock=%d\n", info->sock); - -- if (info->sock == CERF_SOCKET) -- info->irq=IRQ_GPIO_CF_IRQ; -+ if(info->sock>1) return -1; - -- return 0; -+ if (info->sock == CERF_SOCKET) -+ info->irq=PCMCIA_IRQ_CF_IRQ; -+ -+ if( pcmcia_debug) -+ printk( KERN_INFO "cerf_pcmcia_get_irq_info: irq=%d\n",info->irq); -+ -+ return 0; - } - --static int cerf_pcmcia_configure_socket(const struct pcmcia_configure -- *configure) -+static int cerf_pcmcia_configure_socket( unsigned int sock, socket_state_t *state) - { -- if(configure->sock>1) -- return -1; -+ if( pcmcia_debug) -+ printk( KERN_INFO "cerf_pcmcia_configure_socket:" -+ "sock=%d vcc=%d flags=%x\n", -+ sock, state->Vcc, state->flags); - -- if (configure->sock != CERF_SOCKET) -- return 0; -+ if(sock>1) -+ return -1; - -- switch(configure->vcc){ -- case 0: -- break; -+ if (sock != CERF_SOCKET) -+ return 0; - -- case 50: -- case 33: --#ifdef CONFIG_SA1100_CERF_CPLD -- GPCR = GPIO_PWR_SHUTDOWN; -+ switch(state->Vcc){ -+ case 0: -+ break; -+ -+ case 50: -+ case 33: -+#if defined(CONFIG_SA1100_CERF_CPLD) -+ PCMCIA_GPDR |= PCMCIA_PWR_SHUTDOWN; -+ PCMCIA_GPCR |= PCMCIA_PWR_SHUTDOWN; - #endif -- break; -+ /* voltage selected automatically */ -+ break; - -- default: -- printk(KERN_ERR "%s(): unrecognized Vcc %u\n", __FUNCTION__, -- configure->vcc); -- return -1; -- } -+ default: -+ printk(KERN_ERR "%s(): unrecognized Vcc %u\n", -+ __FUNCTION__, state->Vcc); -+ return -1; -+ } - -- if(configure->reset) -- { --#ifdef CONFIG_SA1100_CERF_CPLD -- GPSR = GPIO_CF_RESET; --#endif -- } -- else -- { --#ifdef CONFIG_SA1100_CERF_CPLD -- GPCR = GPIO_CF_RESET; --#endif -- } -+ if(state->flags&SS_RESET) -+ { -+ cerf_pcmcia_reset(); -+ } - -- return 0; -+ return 0; - } - -+#ifdef CONFIG_SA1100_CERF - static int cerf_pcmcia_socket_init(int sock) - { - int i; - -+ if( pcmcia_debug) -+ printk( KERN_INFO "cerf_pcmcia_socket_init: sock=%d\n",sock); -+ - if (sock == CERF_SOCKET) - for (i = 0; i < ARRAY_SIZE(irqs); i++) - set_GPIO_IRQ_edge(irqs[i].gpio, GPIO_BOTH_EDGES); -@@ -150,21 +216,26 @@ - { - int i; - -+ if( pcmcia_debug) -+ printk( KERN_INFO "cerf_pcmcia_socket_suspend: sock=%d\n",sock); -+ - if (sock == CERF_SOCKET) - for (i = 0; i < ARRAY_SIZE(irqs); i++) - set_GPIO_IRQ_edge(irqs[i].gpio, GPIO_NO_EDGES); - - return 0; - } -+#endif - - struct pcmcia_low_level cerf_pcmcia_ops = { -- init: cerf_pcmcia_init, -- shutdown: cerf_pcmcia_shutdown, -- socket_state: cerf_pcmcia_socket_state, -- get_irq_info: cerf_pcmcia_get_irq_info, -- configure_socket: cerf_pcmcia_configure_socket, -+init: cerf_pcmcia_init, -+shutdown: cerf_pcmcia_shutdown, -+socket_state: cerf_pcmcia_socket_state, -+get_irq_info: cerf_pcmcia_get_irq_info, -+configure_socket: cerf_pcmcia_configure_socket, - -- socket_init: cerf_pcmcia_socket_init, -- socket_suspend: cerf_pcmcia_socket_suspend, -+#ifdef CONFIG_SA1100_CERF -+socket_init: cerf_pcmcia_socket_init, -+socket_suspend: cerf_pcmcia_socket_suspend, -+#endif - }; -- ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/pcmcia/sa1100_cerf.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,138 @@ -+/* -+ * drivers/pcmcia/cerf.h -+ * -+ * PCMCIA implementation routines for CerfBoard -+ * Based off the Assabet. -+ * -+ */ -+#ifndef _LINUX_PCMCIA_CERF_H -+#define _LINUX_PCMCIA_CERF_H -+ -+#include <linux/config.h> -+#include <asm/hardware.h> -+#include <asm/irq.h> -+#include <asm/arch/pcmcia.h> -+ -+#ifdef CONFIG_PXA_CERF /* PXA */ -+ -+#define PCMCIA_GPCR GPCR0 -+#define PCMCIA_GPSR GPSR0 -+ -+#define PCMCIA_GPIO_CF_CD 14 -+#define PCMCIA_GPIO_CF_IRQ 13 -+#define PCMCIA_GPIO_CF_RESET 12 -+#ifdef CONFIG_PXA_CERF_PDA -+# define PCMCIA_GPIO_CF_BVD1 11 -+# define PCMCIA_GPIO_CF_BVD2 10 -+#elif defined( CONFIG_PXA_CERF_BOARD) -+# define PCMCIA_GPIO_CF_BVD1 32 -+# define PCMCIA_GPIO_CF_BVD2 10 -+#endif -+ -+#define PCMCIA_GPIO_CF_CD_MASK (GPIO_bit(PCMCIA_GPIO_CF_CD)) -+#define PCMCIA_GPIO_CF_IRQ_MASK (GPIO_bit(PCMCIA_GPIO_CF_IRQ)) -+#define PCMCIA_GPIO_CF_RESET_MASK (GPIO_bit(PCMCIA_GPIO_CF_RESET)) -+#define PCMCIA_GPIO_CF_BVD1_MASK (GPIO_bit(PCMCIA_GPIO_CF_BVD1)) -+#define PCMCIA_GPIO_CF_BVD2_MASK (GPIO_bit(PCMCIA_GPIO_CF_BVD2)) -+ -+#define PCMCIA_GPIO_CF_CD_EDGE PCMCIA_GPIO_CF_CD -+#define PCMCIA_GPIO_CF_IRQ_EDGE PCMCIA_GPIO_CF_IRQ -+#define PCMCIA_GPIO_CF_RESET_EDGE PCMCIA_GPIO_CF_RESET -+#define PCMCIA_GPIO_CF_BVD1_EDGE PCMCIA_GPIO_CF_BVD1 -+#define PCMCIA_GPIO_CF_BVD2_EDGE PCMCIA_GPIO_CF_BVD2 -+ -+#define PCMCIA_IRQ_CF_CD IRQ_GPIO(PCMCIA_GPIO_CF_CD) -+#define PCMCIA_IRQ_CF_IRQ IRQ_GPIO(PCMCIA_GPIO_CF_IRQ) -+#define PCMCIA_IRQ_CF_BVD1 IRQ_GPIO(PCMCIA_GPIO_CF_BVD1) -+#define PCMCIA_IRQ_CF_BVD2 IRQ_GPIO(PCMCIA_GPIO_CF_BVD2) -+ -+#define PCMCIA_PWR_SHUTDOWN 0 /* not needed */ -+#define CERF_SOCKET 0 -+ -+inline void cerf_pcmcia_set_gpio_direction(void) -+{ -+ GPDR(PCMCIA_GPIO_CF_CD) &= ~(PCMCIA_GPIO_CF_CD_MASK); -+ GPDR(PCMCIA_GPIO_CF_BVD1) &= ~(PCMCIA_GPIO_CF_BVD1_MASK); -+ GPDR(PCMCIA_GPIO_CF_BVD2) &= ~(PCMCIA_GPIO_CF_BVD2_MASK); -+ GPDR(PCMCIA_GPIO_CF_IRQ) &= ~(PCMCIA_GPIO_CF_IRQ_MASK); -+ GPDR(PCMCIA_GPIO_CF_RESET)|= (PCMCIA_GPIO_CF_RESET_MASK); -+} -+ -+inline int cerf_pcmcia_level_detect( void) -+{ -+ return ((GPLR(PCMCIA_GPIO_CF_CD)&PCMCIA_GPIO_CF_CD_MASK)==0)?1:0; -+} -+inline int cerf_pcmcia_level_ready( void) -+{ -+ return (GPLR(PCMCIA_GPIO_CF_IRQ)&PCMCIA_GPIO_CF_IRQ_MASK)?1:0; -+} -+inline int cerf_pcmcia_level_bvd1( void) -+{ -+ return (GPLR(PCMCIA_GPIO_CF_BVD1)&PCMCIA_GPIO_CF_BVD1_MASK)?1:0; -+} -+inline int cerf_pcmcia_level_bvd2( void) -+{ -+ return (GPLR(PCMCIA_GPIO_CF_BVD2)&PCMCIA_GPIO_CF_BVD2_MASK)?1:0; -+} -+ -+#elif defined(CONFIG_SA1100_CERF) /* SA1100 */ -+ -+#define PCMCIA_GPDR GPDR -+#define PCMCIA_GPCR GPCR -+#define PCMCIA_GPSR GPSR -+#define PCMCIA_GPLR GPLR -+ -+#define PCMCIA_GPIO_CF_CD_MASK GPIO_CF_CD -+#define PCMCIA_GPIO_CF_IRQ_MASK GPIO_CF_IRQ -+#define PCMCIA_GPIO_CF_RESET_MASK GPIO_CF_RESET -+#define PCMCIA_GPIO_CF_BVD1_MASK GPIO_CF_BVD1 -+#define PCMCIA_GPIO_CF_BVD2_MASK GPIO_CF_BVD2 -+ -+#define PCMCIA_GPIO_CF_CD_EDGE PCMCIA_GPIO_CF_CD_MASK -+#define PCMCIA_GPIO_CF_IRQ_EDGE PCMCIA_GPIO_CF_IRQ_MASK -+#define PCMCIA_GPIO_CF_RESET_EDGE PCMCIA_GPIO_CF_RESET_MASK -+#define PCMCIA_GPIO_CF_BVD1_EDGE PCMCIA_GPIO_CF_BVD1_MASK -+#define PCMCIA_GPIO_CF_BVD2_EDGE PCMCIA_GPIO_CF_BVD2_MASK -+ -+#define PCMCIA_IRQ_CF_CD IRQ_GPIO_CF_CD -+#define PCMCIA_IRQ_CF_IRQ IRQ_GPIO_CF_IRQ -+#define PCMCIA_IRQ_CF_BVD1 IRQ_GPIO_CF_BVD1 -+#define PCMCIA_IRQ_CF_BVD2 IRQ_GPIO_CF_BVD2 -+ -+#define PCMCIA_PWR_SHUTDOWN GPIO_PWR_SHUTDOWN -+ -+#ifdef CONFIG_SA1100_CERF_CPLD -+#define CERF_SOCKET 0 -+#else -+#define CERF_SOCKET 1 -+#endif -+ -+inline void cerf_pcmcia_set_gpio_direction(void) -+{ -+ PCMCIA_GPDR &= ~(PCMCIA_GPIO_CF_CD_MASK | -+ PCMCIA_GPIO_CF_BVD1_MASK | -+ PCMCIA_GPIO_CF_BVD2_MASK | -+ PCMCIA_GPIO_CF_IRQ_MASK); -+ PCMCIA_GPDR |= PCMCIA_GPIO_CF_RESET_MASK; -+} -+ -+inline int cerf_pcmcia_level_detect( void) -+{ -+ return ((PCMCIA_GPLR & PCMCIA_GPIO_CF_CD_MASK)==0)?1:0; -+} -+inline int cerf_pcmcia_level_ready( void) -+{ -+ return (PCMCIA_GPLR & PCMCIA_GPIO_CF_IRQ_MASK)?1:0; -+} -+inline int cerf_pcmcia_level_bvd1( void) -+{ -+ return (PCMCIA_GPLR & PCMCIA_GPIO_CF_BVD1_MASK)?1:0; -+} -+inline int cerf_pcmcia_level_bvd2( void) -+{ -+ return (PCMCIA_GPLR & PCMCIA_GPIO_CF_BVD2_MASK)?1:0; -+} -+ -+#endif -+ -+#endif ---- linux-2.4.25/drivers/sound/Config.in~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/drivers/sound/Config.in 2004-03-31 17:15:12.000000000 +0200 -@@ -239,6 +239,7 @@ - dep_tristate ' VIDC 16-bit sound' CONFIG_SOUND_VIDC $CONFIG_SOUND_OSS - fi - dep_tristate ' Netwinder WaveArtist' CONFIG_SOUND_WAVEARTIST $CONFIG_SOUND_OSS $CONFIG_ARCH_NETWINDER -+ dep_tristate ' Intel PXA250/210 AC97 audio' CONFIG_SOUND_PXA_AC97 $CONFIG_ARCH_PXA $CONFIG_SOUND - fi - - dep_tristate ' TV card (bt848) mixer support' CONFIG_SOUND_TVMIXER $CONFIG_SOUND $CONFIG_I2C ---- linux-2.4.25/drivers/sound/Makefile~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/drivers/sound/Makefile 2004-03-31 17:15:12.000000000 +0200 -@@ -11,7 +11,7 @@ - msnd.o opl3.o sb_common.o sequencer_syms.o \ - sound_core.o sound_syms.o uart401.o \ - nm256_audio.o ac97.o ac97_codec.o aci.o \ -- sa1100-audio.o -+ sa1100-audio.o pxa-audio.o pxa-ac97.o - - # Each configuration option enables a list of files. - -@@ -85,6 +85,7 @@ - obj-$(CONFIG_SOUND_SA1111_UDA1341) += sa1111-uda1341.o - obj-$(CONFIG_SOUND_SA1111_AC97) += sa1111-ac97.o ac97_codec.o - obj-$(CONFIG_SOUND_SA1100SSP) += sa1100ssp.o -+obj-$(CONFIG_SOUND_PXA_AC97)+= pxa-ac97.o pxa-audio.o ac97_codec.o - obj-$(CONFIG_SOUND_EMU10K1) += ac97_codec.o - obj-$(CONFIG_SOUND_BCM_CS4297A) += swarm_cs4297a.o - obj-$(CONFIG_SOUND_RME96XX) += rme96xx.o ---- linux-2.4.25/drivers/sound/ac97_codec.c~2.4.25-vrs2-pxa1.patch 2003-11-28 19:26:20.000000000 +0100 -+++ linux-2.4.25/drivers/sound/ac97_codec.c 2004-03-31 17:15:12.000000000 +0200 -@@ -155,6 +155,7 @@ - {0x45838308, "ESS Allegro ES1988", &null_ops}, - {0x49434511, "ICE1232", &null_ops}, /* I hope --jk */ - {0x4e534331, "National Semiconductor LM4549", &null_ops}, -+ {0x50534304, "Philips UCB1400", &default_ops}, - {0x53494c22, "Silicon Laboratory Si3036", &null_ops}, - {0x53494c23, "Silicon Laboratory Si3038", &null_ops}, - {0x545200FF, "TriTech TR?????", &tritech_m_ops}, ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/sound/pxa-ac97.c 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,370 @@ -+/* -+ * linux/drivers/sound/pxa-ac97.c -- AC97 interface for the Cotula chip -+ * -+ * Author: Nicolas Pitre -+ * Created: Aug 15, 2001 -+ * Copyright: MontaVista Software Inc. -+ * -+ * 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. -+ * -+ * AC97 GPIO Changes:- -+ * In order to read/write codec GPIO bits using AC97 link slot 12, -+ * all IO to AC97_GPIO_STATUS must be via the Xscale modem codec -+ * address space. -+ * Liam Girdwood <liam.girdwood@wolfsonmicro.com> -+ */ -+ -+#include <linux/init.h> -+#include <linux/module.h> -+#include <linux/kernel.h> -+#include <linux/slab.h> -+#include <linux/pci.h> -+#include <linux/completion.h> -+#include <linux/delay.h> -+#include <linux/poll.h> -+#include <linux/sound.h> -+#include <linux/soundcard.h> -+#include <linux/ac97_codec.h> -+ -+#include <asm/hardware.h> -+#include <asm/irq.h> -+#include <asm/uaccess.h> -+#include <asm/semaphore.h> -+#include <asm/dma.h> -+ -+#include "pxa-audio.h" -+ -+static struct completion CAR_completion; -+static int waitingForMask; -+static DECLARE_MUTEX(CAR_mutex); -+ -+static u16 pxa_ac97_read(struct ac97_codec *codec, u8 reg) -+{ -+ u16 val = -1; -+ -+ down(&CAR_mutex); -+ if (!(CAR & CAR_CAIP)) { -+ volatile u32 *reg_addr; -+ -+ // if we are reading the GPIO status then this is cached -+ // in hardware so we don't need to read over the link. -+ if (reg == AC97_GPIO_STATUS) { -+ reg_addr = (u32 *)&PMC_REG_BASE + (reg >> 1); -+ val = *reg_addr; -+ return val; -+ } -+ -+ reg_addr = (u32 *)&PAC_REG_BASE + (reg >> 1); -+ -+ waitingForMask=GSR_SDONE; -+ -+ init_completion(&CAR_completion); -+ (void)*reg_addr; //start read access across the ac97 link -+ wait_for_completion(&CAR_completion); -+ -+ if (GSR & GSR_RDCS) { -+ GSR |= GSR_RDCS; //write a 1 to clear -+ printk(KERN_CRIT __FUNCTION__": read codec register timeout.\n"); -+ } -+ -+ init_completion(&CAR_completion); -+ val = *reg_addr; //valid data now but we've just started another cycle... -+ wait_for_completion(&CAR_completion); -+ -+ } else { -+ printk(KERN_CRIT __FUNCTION__": CAR_CAIP already set\n"); -+ } -+ up(&CAR_mutex); -+ //printk("%s(0x%02x) = 0x%04x\n", __FUNCTION__, reg, val); -+ return val; -+} -+ -+static void pxa_ac97_write(struct ac97_codec *codec, u8 reg, u16 val) -+{ -+ down(&CAR_mutex); -+ if (!(CAR & CAR_CAIP)) { -+ volatile u32 *reg_addr; -+ -+ // if we are writing to the codec GPIO using slot 12 -+ // then we have to write to the modem register space -+ if (reg == AC97_GPIO_STATUS) { -+ reg_addr = (u32 *)&PMC_REG_BASE + (reg >> 1); -+ *reg_addr = val; -+ return; -+ } -+ -+ reg_addr = (u32 *)&PAC_REG_BASE + (reg >> 1); -+ -+ waitingForMask=GSR_CDONE; -+ init_completion(&CAR_completion); -+ *reg_addr = val; -+ wait_for_completion(&CAR_completion); -+ } else { -+ printk(KERN_CRIT __FUNCTION__": CAR_CAIP already set\n"); -+ } -+ up(&CAR_mutex); -+ //printk("%s(0x%02x, 0x%04x)\n", __FUNCTION__, reg, val); -+} -+ -+static void pxa_ac97_irq(int irq, void *dev_id, struct pt_regs *regs) -+{ -+ int gsr = GSR; -+ GSR = gsr & (GSR_SDONE|GSR_CDONE); //write a 1 to clear -+ if (gsr & waitingForMask) -+ { -+ complete(&CAR_completion); -+ } -+} -+ -+static struct ac97_codec pxa_ac97_codec = { -+ codec_read: pxa_ac97_read, -+ codec_write: pxa_ac97_write, -+}; -+ -+static DECLARE_MUTEX(pxa_ac97_mutex); -+static int pxa_ac97_refcount; -+ -+int pxa_ac97_get(struct ac97_codec **codec) -+{ -+ int ret; -+ -+ *codec = NULL; -+ down(&pxa_ac97_mutex); -+ -+ if (!pxa_ac97_refcount) { -+ ret = request_irq(IRQ_AC97, pxa_ac97_irq, 0, "AC97", NULL); -+ if (ret) -+ return ret; -+ -+ CKEN |= CKEN2_AC97; -+ set_GPIO_mode(GPIO31_SYNC_AC97_MD); -+ set_GPIO_mode(GPIO30_SDATA_OUT_AC97_MD); -+ set_GPIO_mode(GPIO28_BITCLK_AC97_MD); -+ set_GPIO_mode(GPIO29_SDATA_IN_AC97_MD); -+ -+ GCR = 0; -+ udelay(10); -+ GCR = GCR_COLD_RST|GCR_CDONE_IE|GCR_SDONE_IE; -+ while (!(GSR & GSR_PCR)) { -+ schedule(); -+ } -+ -+ ret = ac97_probe_codec(&pxa_ac97_codec); -+ if (ret != 1) { -+ free_irq(IRQ_AC97, NULL); -+ GCR = GCR_ACLINK_OFF; -+ CKEN &= ~CKEN2_AC97; -+ return ret; -+ } -+ -+ // need little hack for UCB1400 (should be moved elsewhere) -+ pxa_ac97_write(&pxa_ac97_codec,AC97_EXTENDED_STATUS,1); -+ //pxa_ac97_write(&pxa_ac97_codec, 0x6a, 0x1ff7); -+ pxa_ac97_write(&pxa_ac97_codec, 0x6a, 0x0050); -+ pxa_ac97_write(&pxa_ac97_codec, 0x6c, 0x0030); -+ } -+ -+ pxa_ac97_refcount++; -+ up(&pxa_ac97_mutex); -+ *codec = &pxa_ac97_codec; -+ return 0; -+} -+ -+void pxa_ac97_put(void) -+{ -+ down(&pxa_ac97_mutex); -+ pxa_ac97_refcount--; -+ if (!pxa_ac97_refcount) { -+ GCR = GCR_ACLINK_OFF; -+ CKEN &= ~CKEN2_AC97; -+ free_irq(IRQ_AC97, NULL); -+ } -+ up(&pxa_ac97_mutex); -+} -+ -+EXPORT_SYMBOL(pxa_ac97_get); -+EXPORT_SYMBOL(pxa_ac97_put); -+ -+ -+/* -+ * Audio Mixer stuff -+ */ -+ -+static audio_state_t ac97_audio_state; -+static audio_stream_t ac97_audio_in; -+ -+static int mixer_ioctl( struct inode *inode, struct file *file, -+ unsigned int cmd, unsigned long arg) -+{ -+ int ret, val; -+ -+ ret = pxa_ac97_codec.mixer_ioctl(&pxa_ac97_codec, cmd, arg); -+ if (ret) -+ return ret; -+ -+ /* We must snoop for some commands to provide our own extra processing */ -+ switch (cmd) { -+ case SOUND_MIXER_WRITE_RECSRC: -+ /* -+ * According to the PXA250 spec, mic-in should use different -+ * DRCMR and different AC97 FIFO. -+ * Unfortunately current UCB1400 versions (up to ver 2A) don't -+ * produce slot 6 for the audio input frame, therefore the PXA -+ * AC97 mic-in FIFO is always starved. -+ */ -+#if 0 -+ ret = get_user(val, (int *)arg); -+ if (ret) -+ return ret; -+ pxa_audio_clear_buf(&ac97_audio_in); -+ *ac97_audio_in.drcmr = 0; -+ if (val & (1 << SOUND_MIXER_MIC)) { -+ ac97_audio_in.dcmd = DCMD_RXMCDR; -+ ac97_audio_in.drcmr = &DRCMRRXMCDR; -+ ac97_audio_in.dev_addr = __PREG(MCDR); -+ } else { -+ ac97_audio_in.dcmd = DCMD_RXPCDR; -+ ac97_audio_in.drcmr = &DRCMRRXPCDR; -+ ac97_audio_in.dev_addr = __PREG(PCDR); -+ } -+ if (ac97_audio_state.rd_ref) -+ *ac97_audio_in.drcmr = -+ ac97_audio_in.dma_ch | DRCMR_MAPVLD; -+#endif -+ break; -+ } -+ return 0; -+} -+ -+static struct file_operations mixer_fops = { -+ ioctl: mixer_ioctl, -+ llseek: no_llseek, -+ owner: THIS_MODULE -+}; -+ -+/* -+ * AC97 codec ioctls -+ */ -+ -+static int codec_adc_rate = 48000; -+static int codec_dac_rate = 48000; -+ -+static int ac97_ioctl(struct inode *inode, struct file *file, -+ unsigned int cmd, unsigned long arg) -+{ -+ int ret; -+ long val; -+ -+ switch(cmd) { -+ case SNDCTL_DSP_STEREO: -+ ret = get_user(val, (int *) arg); -+ if (ret) -+ return ret; -+ /* FIXME: do we support mono? */ -+ ret = (val == 0) ? -EINVAL : 1; -+ return put_user(ret, (int *) arg); -+ -+ case SNDCTL_DSP_CHANNELS: -+ case SOUND_PCM_READ_CHANNELS: -+ /* FIXME: do we support mono? */ -+ return put_user(2, (long *) arg); -+ -+ case SNDCTL_DSP_SPEED: -+ ret = get_user(val, (long *) arg); -+ if (ret) -+ return ret; -+ if (file->f_mode & FMODE_READ) -+ codec_adc_rate = ac97_set_adc_rate(&pxa_ac97_codec, val); -+ if (file->f_mode & FMODE_WRITE) -+ codec_dac_rate = ac97_set_dac_rate(&pxa_ac97_codec, val); -+ /* fall through */ -+ -+ case SOUND_PCM_READ_RATE: -+ if (file->f_mode & FMODE_READ) -+ val = codec_adc_rate; -+ if (file->f_mode & FMODE_WRITE) -+ val = codec_dac_rate; -+ return put_user(val, (long *) arg); -+ -+ case SNDCTL_DSP_SETFMT: -+ case SNDCTL_DSP_GETFMTS: -+ /* FIXME: can we do other fmts? */ -+ return put_user(AFMT_S16_LE, (long *) arg); -+ -+ default: -+ /* Maybe this is meant for the mixer (As per OSS Docs) */ -+ return mixer_ioctl(inode, file, cmd, arg); -+ } -+ return 0; -+} -+ -+ -+/* -+ * Audio stuff -+ */ -+ -+static audio_stream_t ac97_audio_out = { -+ name: "AC97 audio out", -+ dcmd: DCMD_TXPCDR, -+ drcmr: &DRCMRTXPCDR, -+ dev_addr: __PREG(PCDR), -+}; -+ -+static audio_stream_t ac97_audio_in = { -+ name: "AC97 audio in", -+ dcmd: DCMD_RXPCDR, -+ drcmr: &DRCMRRXPCDR, -+ dev_addr: __PREG(PCDR), -+}; -+ -+static audio_state_t ac97_audio_state = { -+ output_stream: &ac97_audio_out, -+ input_stream: &ac97_audio_in, -+ client_ioctl: ac97_ioctl, -+ sem: __MUTEX_INITIALIZER(ac97_audio_state.sem), -+}; -+ -+static int ac97_audio_open(struct inode *inode, struct file *file) -+{ -+ return pxa_audio_attach(inode, file, &ac97_audio_state); -+} -+ -+/* -+ * Missing fields of this structure will be patched with the call -+ * to pxa_audio_attach(). -+ */ -+ -+static struct file_operations ac97_audio_fops = { -+ open: ac97_audio_open, -+ owner: THIS_MODULE -+}; -+ -+ -+static int __init pxa_ac97_init(void) -+{ -+ int ret; -+ struct ac97_codec *dummy; -+ -+ ret = pxa_ac97_get(&dummy); -+ if (ret) -+ return ret; -+ -+ ac97_audio_state.dev_dsp = register_sound_dsp(&ac97_audio_fops, -1); -+ pxa_ac97_codec.dev_mixer = register_sound_mixer(&mixer_fops, -1); -+ -+ return 0; -+} -+ -+static void __exit pxa_ac97_exit(void) -+{ -+ unregister_sound_dsp(ac97_audio_state.dev_dsp); -+ unregister_sound_mixer(pxa_ac97_codec.dev_mixer); -+ pxa_ac97_put(); -+} -+ -+ -+module_init(pxa_ac97_init); -+module_exit(pxa_ac97_exit); -+ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/sound/pxa-audio.c 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,853 @@ -+/* -+ * linux/drivers/sound/pxa-audio.c -- audio interface for the Cotula chip -+ * -+ * Author: Nicolas Pitre -+ * Created: Aug 15, 2001 -+ * Copyright: MontaVista Software Inc. -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ */ -+ -+#include <linux/init.h> -+#include <linux/module.h> -+#include <linux/kernel.h> -+#include <linux/slab.h> -+#include <linux/pci.h> -+#include <linux/poll.h> -+#include <linux/sound.h> -+#include <linux/soundcard.h> -+ -+#include <asm/hardware.h> -+#include <asm/irq.h> -+#include <asm/uaccess.h> -+#include <asm/semaphore.h> -+#include <asm/dma.h> -+ -+#include "pxa-audio.h" -+ -+ -+#define AUDIO_NBFRAGS_DEFAULT 8 -+#define AUDIO_FRAGSIZE_DEFAULT 8192 -+ -+#define MAX_DMA_SIZE 4096 -+#define DMA_DESC_SIZE sizeof(pxa_dma_desc) -+ -+ -+/* -+ * This function frees all buffers -+ */ -+#define audio_clear_buf pxa_audio_clear_buf -+ -+void pxa_audio_clear_buf(audio_stream_t * s) -+{ -+ DECLARE_WAITQUEUE(wait, current); -+ int frag; -+ -+ if (!s->buffers) -+ return; -+ -+ /* Ensure DMA isn't running */ -+ set_current_state(TASK_UNINTERRUPTIBLE); -+ add_wait_queue(&s->stop_wq, &wait); -+ DCSR(s->dma_ch) = DCSR_STOPIRQEN; -+ schedule(); -+ remove_wait_queue(&s->stop_wq, &wait); -+ -+ /* free DMA buffers */ -+ for (frag = 0; frag < s->nbfrags; frag++) { -+ audio_buf_t *b = &s->buffers[frag]; -+ if (!b->master) -+ continue; -+ consistent_free(b->data, b->master, b->dma_desc->dsadr); -+ } -+ -+ /* free descriptor ring */ -+ if (s->buffers->dma_desc) -+ consistent_free(s->buffers->dma_desc, -+ s->nbfrags * s->descs_per_frag * DMA_DESC_SIZE, -+ s->dma_desc_phys); -+ -+ /* free buffer structure array */ -+ kfree(s->buffers); -+ s->buffers = NULL; -+} -+ -+/* -+ * This function allocates the DMA descriptor array and buffer data space -+ * according to the current number of fragments and fragment size. -+ */ -+static int audio_setup_buf(audio_stream_t * s) -+{ -+ pxa_dma_desc *dma_desc; -+ dma_addr_t dma_desc_phys; -+ int nb_desc, frag, i, buf_size = 0; -+ char *dma_buf = NULL; -+ dma_addr_t dma_buf_phys = 0; -+ -+ if (s->buffers) -+ return -EBUSY; -+ -+ /* Our buffer structure array */ -+ s->buffers = kmalloc(sizeof(audio_buf_t) * s->nbfrags, GFP_KERNEL); -+ if (!s->buffers) -+ goto err; -+ memzero(s->buffers, sizeof(audio_buf_t) * s->nbfrags); -+ -+ /* -+ * Our DMA descriptor array: -+ * for Each fragment we have one checkpoint descriptor plus one -+ * descriptor per MAX_DMA_SIZE byte data blocks. -+ */ -+ nb_desc = (1 + (s->fragsize + MAX_DMA_SIZE - 1)/MAX_DMA_SIZE) * s->nbfrags; -+ dma_desc = consistent_alloc(GFP_KERNEL, -+ nb_desc * DMA_DESC_SIZE, -+ &dma_desc_phys, -+ 0); -+ if (!dma_desc) -+ goto err; -+ s->descs_per_frag = nb_desc / s->nbfrags; -+ s->buffers->dma_desc = dma_desc; -+ s->dma_desc_phys = dma_desc_phys; -+ for (i = 0; i < nb_desc - 1; i++) -+ dma_desc[i].ddadr = dma_desc_phys + (i + 1) * DMA_DESC_SIZE; -+ dma_desc[i].ddadr = dma_desc_phys; -+ -+ /* Our actual DMA buffers */ -+ for (frag = 0; frag < s->nbfrags; frag++) { -+ audio_buf_t *b = &s->buffers[frag]; -+ -+ /* -+ * Let's allocate non-cached memory for DMA buffers. -+ * We try to allocate all memory at once. -+ * If this fails (a common reason is memory fragmentation), -+ * then we'll try allocating smaller buffers. -+ */ -+ if (!buf_size) { -+ buf_size = (s->nbfrags - frag) * s->fragsize; -+ do { -+ dma_buf = consistent_alloc(GFP_KERNEL, -+ buf_size, -+ &dma_buf_phys, -+ 0); -+ if (!dma_buf) -+ buf_size -= s->fragsize; -+ } while (!dma_buf && buf_size); -+ if (!dma_buf) -+ goto err; -+ b->master = buf_size; -+ memzero(dma_buf, buf_size); -+ } -+ -+ /* -+ * Set up our checkpoint descriptor. Since the count -+ * is always zero, we'll abuse the dsadr and dtadr fields -+ * just in case this one is picked up by the hardware -+ * while processing SOUND_DSP_GETPTR. -+ */ -+ dma_desc->dsadr = dma_buf_phys; -+ dma_desc->dtadr = dma_buf_phys; -+ dma_desc->dcmd = DCMD_ENDIRQEN; -+ if (s->output && !s->mapped) -+ dma_desc->ddadr |= DDADR_STOP; -+ b->dma_desc = dma_desc++; -+ -+ /* set up the actual data descriptors */ -+ for (i = 0; (i * MAX_DMA_SIZE) < s->fragsize; i++) { -+ dma_desc[i].dsadr = (s->output) ? -+ (dma_buf_phys + i*MAX_DMA_SIZE) : s->dev_addr; -+ dma_desc[i].dtadr = (s->output) ? -+ s->dev_addr : (dma_buf_phys + i*MAX_DMA_SIZE); -+ dma_desc[i].dcmd = s->dcmd | -+ ((s->fragsize < MAX_DMA_SIZE) ? -+ s->fragsize : MAX_DMA_SIZE); -+ } -+ dma_desc += i; -+ -+ /* handle buffer pointers */ -+ b->data = dma_buf; -+ dma_buf += s->fragsize; -+ dma_buf_phys += s->fragsize; -+ buf_size -= s->fragsize; -+ } -+ -+ s->usr_frag = s->dma_frag = 0; -+ s->bytecount = 0; -+ s->fragcount = 0; -+ sema_init(&s->sem, (s->output) ? s->nbfrags : 0); -+ return 0; -+ -+err: -+ printk("pxa-audio: unable to allocate audio memory\n "); -+ audio_clear_buf(s); -+ return -ENOMEM; -+} -+ -+/* -+ * Our DMA interrupt handler -+ */ -+static void audio_dma_irq(int ch, void *dev_id, struct pt_regs *regs) -+{ -+ audio_stream_t *s = dev_id; -+ u_int dcsr; -+ -+ dcsr = DCSR(ch); -+ DCSR(ch) = dcsr & ~DCSR_STOPIRQEN; -+ -+ if (!s->buffers) { -+ printk("AC97 DMA: wow... received IRQ for channel %d but no buffer exists\n", ch); -+ return; -+ } -+ -+ if (dcsr & DCSR_BUSERR) -+ printk("AC97 DMA: bus error interrupt on channel %d\n", ch); -+ -+ if (dcsr & DCSR_ENDINTR) { -+ u_long cur_dma_desc; -+ u_int cur_dma_frag; -+ -+ /* -+ * Find out which DMA desc is current. Note that DDADR -+ * points to the next desc, not the current one. -+ */ -+ cur_dma_desc = DDADR(ch) - s->dma_desc_phys - DMA_DESC_SIZE; -+ -+ /* -+ * Let the compiler nicely optimize constant divisors into -+ * multiplications for the common cases which is much faster. -+ * Common cases: x = 1 + (1 << y) for y = [0..3] -+ */ -+ switch (s->descs_per_frag) { -+ case 2: cur_dma_frag = cur_dma_desc / (2*DMA_DESC_SIZE); break; -+ case 3: cur_dma_frag = cur_dma_desc / (3*DMA_DESC_SIZE); break; -+ case 5: cur_dma_frag = cur_dma_desc / (5*DMA_DESC_SIZE); break; -+ case 9: cur_dma_frag = cur_dma_desc / (9*DMA_DESC_SIZE); break; -+ default: cur_dma_frag = -+ cur_dma_desc / (s->descs_per_frag * DMA_DESC_SIZE); -+ } -+ -+ /* Account for possible wrap back of cur_dma_desc above */ -+ if (cur_dma_frag >= s->nbfrags) -+ cur_dma_frag = s->nbfrags - 1; -+ -+ while (s->dma_frag != cur_dma_frag) { -+ if (!s->mapped) { -+ /* -+ * This fragment is done - set the checkpoint -+ * descriptor to STOP until it is gets -+ * processed by the read or write function. -+ */ -+ s->buffers[s->dma_frag].dma_desc->ddadr |= DDADR_STOP; -+ up(&s->sem); -+ } -+ if (++s->dma_frag >= s->nbfrags) -+ s->dma_frag = 0; -+ -+ /* Accounting */ -+ s->bytecount += s->fragsize; -+ s->fragcount++; -+ } -+ -+ /* ... and for polling processes */ -+ wake_up(&s->frag_wq); -+ } -+ -+ if ((dcsr & DCSR_STOPIRQEN) && (dcsr & DCSR_STOPSTATE)) -+ wake_up(&s->stop_wq); -+} -+ -+/* -+ * Validate and sets up buffer fragments, etc. -+ */ -+static int audio_set_fragments(audio_stream_t *s, int val) -+{ -+ if (s->mapped || DCSR(s->dma_ch) & DCSR_RUN) -+ return -EBUSY; -+ if (s->buffers) -+ audio_clear_buf(s); -+ s->nbfrags = (val >> 16) & 0x7FFF; -+ val &= 0xffff; -+ if (val < 5) -+ val = 5; -+ if (val > 15) -+ val = 15; -+ s->fragsize = 1 << val; -+ if (s->nbfrags < 2) -+ s->nbfrags = 2; -+ if (s->nbfrags * s->fragsize > 256 * 1024) -+ s->nbfrags = 256 * 1024 / s->fragsize; -+ if (audio_setup_buf(s)) -+ return -ENOMEM; -+ return val|(s->nbfrags << 16); -+} -+ -+ -+/* -+ * The fops functions -+ */ -+ -+static int audio_write(struct file *file, const char *buffer, -+ size_t count, loff_t * ppos) -+{ -+ const char *buffer0 = buffer; -+ audio_state_t *state = (audio_state_t *)file->private_data; -+ audio_stream_t *s = state->output_stream; -+ int chunksize, ret = 0; -+ -+ if (ppos != &file->f_pos) -+ return -ESPIPE; -+ if (s->mapped) -+ return -ENXIO; -+ if (!s->buffers && audio_setup_buf(s)) -+ return -ENOMEM; -+ -+ while (count > 0) { -+ audio_buf_t *b = &s->buffers[s->usr_frag]; -+ -+ /* Grab a fragment */ -+ if (file->f_flags & O_NONBLOCK) { -+ ret = -EAGAIN; -+ if (down_trylock(&s->sem)) -+ break; -+ } else { -+ ret = -ERESTARTSYS; -+ if (down_interruptible(&s->sem)) -+ break; -+ } -+ -+ /* Feed the current buffer */ -+ chunksize = s->fragsize - b->offset; -+ if (chunksize > count) -+ chunksize = count; -+ if (copy_from_user(b->data + b->offset, buffer, chunksize)) { -+ up(&s->sem); -+ return -EFAULT; -+ } -+ b->offset += chunksize; -+ buffer += chunksize; -+ count -= chunksize; -+ if (b->offset < s->fragsize) { -+ up(&s->sem); -+ break; -+ } -+ -+ /* -+ * Activate DMA on current buffer. -+ * We unlock this fragment's checkpoint descriptor and -+ * kick DMA if it is idle. Using checkpoint descriptors -+ * allows for control operations without the need for -+ * stopping the DMA channel if it is already running. -+ */ -+ b->offset = 0; -+ b->dma_desc->ddadr &= ~DDADR_STOP; -+ if (DCSR(s->dma_ch) & DCSR_STOPSTATE) { -+ DDADR(s->dma_ch) = b->dma_desc->ddadr; -+ DCSR(s->dma_ch) = DCSR_RUN; -+ } -+ -+ /* move the index to the next fragment */ -+ if (++s->usr_frag >= s->nbfrags) -+ s->usr_frag = 0; -+ } -+ -+ if ((buffer - buffer0)) -+ ret = buffer - buffer0; -+ return ret; -+} -+ -+ -+static int audio_read(struct file *file, char *buffer, -+ size_t count, loff_t * ppos) -+{ -+ char *buffer0 = buffer; -+ audio_state_t *state = file->private_data; -+ audio_stream_t *s = state->input_stream; -+ int chunksize, ret = 0; -+ -+ if (ppos != &file->f_pos) -+ return -ESPIPE; -+ if (s->mapped) -+ return -ENXIO; -+ if (!s->buffers && audio_setup_buf(s)) -+ return -ENOMEM; -+ -+ while (count > 0) { -+ audio_buf_t *b = &s->buffers[s->usr_frag]; -+ -+ /* prime DMA */ -+ if (DCSR(s->dma_ch) & DCSR_STOPSTATE) { -+ DDADR(s->dma_ch) = -+ s->buffers[s->dma_frag].dma_desc->ddadr; -+ DCSR(s->dma_ch) = DCSR_RUN; -+ } -+ -+ /* Wait for a buffer to become full */ -+ if (file->f_flags & O_NONBLOCK) { -+ ret = -EAGAIN; -+ if (down_trylock(&s->sem)) -+ break; -+ } else { -+ ret = -ERESTARTSYS; -+ if (down_interruptible(&s->sem)) -+ break; -+ } -+ -+ /* Grab data from current buffer */ -+ chunksize = s->fragsize - b->offset; -+ if (chunksize > count) -+ chunksize = count; -+ if (copy_to_user(buffer, b->data + b->offset, chunksize)) { -+ up(&s->sem); -+ return -EFAULT; -+ } -+ b->offset += chunksize; -+ buffer += chunksize; -+ count -= chunksize; -+ if (b->offset < s->fragsize) { -+ up(&s->sem); -+ break; -+ } -+ -+ /* -+ * Make this buffer available for DMA again. -+ * We unlock this fragment's checkpoint descriptor and -+ * kick DMA if it is idle. Using checkpoint descriptors -+ * allows for control operations without the need for -+ * stopping the DMA channel if it is already running. -+ */ -+ b->offset = 0; -+ b->dma_desc->ddadr &= ~DDADR_STOP; -+ -+ /* move the index to the next fragment */ -+ if (++s->usr_frag >= s->nbfrags) -+ s->usr_frag = 0; -+ } -+ -+ if ((buffer - buffer0)) -+ ret = buffer - buffer0; -+ return ret; -+} -+ -+ -+static int audio_sync(struct file *file) -+{ -+ audio_state_t *state = file->private_data; -+ audio_stream_t *s = state->output_stream; -+ audio_buf_t *b; -+ pxa_dma_desc *final_desc; -+ u_long dcmd_save = 0; -+ DECLARE_WAITQUEUE(wait, current); -+ -+ if (!(file->f_mode & FMODE_WRITE) || !s->buffers || s->mapped) -+ return 0; -+ -+ /* -+ * Send current buffer if it contains data. Be sure to send -+ * a full sample count. -+ */ -+ final_desc = NULL; -+ b = &s->buffers[s->usr_frag]; -+ if (b->offset &= ~3) { -+ final_desc = &b->dma_desc[1 + b->offset/MAX_DMA_SIZE]; -+ b->offset &= (MAX_DMA_SIZE-1); -+ dcmd_save = final_desc->dcmd; -+ final_desc->dcmd = b->offset | s->dcmd | DCMD_ENDIRQEN; -+ final_desc->ddadr |= DDADR_STOP; -+ b->offset = 0; -+ b->dma_desc->ddadr &= ~DDADR_STOP; -+ if (DCSR(s->dma_ch) & DCSR_STOPSTATE) { -+ DDADR(s->dma_ch) = b->dma_desc->ddadr; -+ DCSR(s->dma_ch) = DCSR_RUN; -+ } -+ } -+ -+ /* Wait for DMA to complete. */ -+ set_current_state(TASK_INTERRUPTIBLE); -+#if 0 -+ /* -+ * The STOPSTATE IRQ never seem to occur if DCSR_STOPIRQEN is set -+ * along wotj DCSR_RUN. Silicon bug? -+ */ -+ add_wait_queue(&s->stop_wq, &wait); -+ DCSR(s->dma_ch) |= DCSR_STOPIRQEN; -+ schedule(); -+#else -+ add_wait_queue(&s->frag_wq, &wait); -+ while ((DCSR(s->dma_ch) & DCSR_RUN) && !signal_pending(current)) { -+ schedule(); -+ set_current_state(TASK_INTERRUPTIBLE); -+ } -+#endif -+ set_current_state(TASK_RUNNING); -+ remove_wait_queue(&s->frag_wq, &wait); -+ -+ /* Restore the descriptor chain. */ -+ if (final_desc) { -+ final_desc->dcmd = dcmd_save; -+ final_desc->ddadr &= ~DDADR_STOP; -+ b->dma_desc->ddadr |= DDADR_STOP; -+ } -+ return 0; -+} -+ -+ -+static unsigned int audio_poll(struct file *file, -+ struct poll_table_struct *wait) -+{ -+ audio_state_t *state = file->private_data; -+ audio_stream_t *is = state->input_stream; -+ audio_stream_t *os = state->output_stream; -+ unsigned int mask = 0; -+ -+ if (file->f_mode & FMODE_READ) { -+ /* Start audio input if not already active */ -+ if (!is->buffers && audio_setup_buf(is)) -+ return -ENOMEM; -+ if (DCSR(is->dma_ch) & DCSR_STOPSTATE) { -+ DDADR(is->dma_ch) = -+ is->buffers[is->dma_frag].dma_desc->ddadr; -+ DCSR(is->dma_ch) = DCSR_RUN; -+ } -+ poll_wait(file, &is->frag_wq, wait); -+ } -+ -+ if (file->f_mode & FMODE_WRITE) { -+ if (!os->buffers && audio_setup_buf(os)) -+ return -ENOMEM; -+ poll_wait(file, &os->frag_wq, wait); -+ } -+ -+ if (file->f_mode & FMODE_READ) -+ if (( is->mapped && is->bytecount > 0) || -+ (!is->mapped && atomic_read(&is->sem.count) > 0)) -+ mask |= POLLIN | POLLRDNORM; -+ -+ if (file->f_mode & FMODE_WRITE) -+ if (( os->mapped && os->bytecount > 0) || -+ (!os->mapped && atomic_read(&os->sem.count) > 0)) -+ mask |= POLLOUT | POLLWRNORM; -+ -+ return mask; -+} -+ -+ -+static int audio_ioctl( struct inode *inode, struct file *file, -+ uint cmd, ulong arg) -+{ -+ audio_state_t *state = file->private_data; -+ audio_stream_t *os = state->output_stream; -+ audio_stream_t *is = state->input_stream; -+ long val; -+ -+ switch (cmd) { -+ case OSS_GETVERSION: -+ return put_user(SOUND_VERSION, (int *)arg); -+ -+ case SNDCTL_DSP_GETBLKSIZE: -+ if (file->f_mode & FMODE_WRITE) -+ return put_user(os->fragsize, (int *)arg); -+ else -+ return put_user(is->fragsize, (int *)arg); -+ -+ case SNDCTL_DSP_GETCAPS: -+ val = DSP_CAP_REALTIME|DSP_CAP_TRIGGER|DSP_CAP_MMAP; -+ if (is && os) -+ val |= DSP_CAP_DUPLEX; -+ return put_user(val, (int *)arg); -+ -+ case SNDCTL_DSP_SETFRAGMENT: -+ if (get_user(val, (long *) arg)) -+ return -EFAULT; -+ if (file->f_mode & FMODE_READ) { -+ int ret = audio_set_fragments(is, val); -+ if (ret < 0) -+ return ret; -+ ret = put_user(ret, (int *)arg); -+ if (ret) -+ return ret; -+ } -+ if (file->f_mode & FMODE_WRITE) { -+ int ret = audio_set_fragments(os, val); -+ if (ret < 0) -+ return ret; -+ ret = put_user(ret, (int *)arg); -+ if (ret) -+ return ret; -+ } -+ return 0; -+ -+ case SNDCTL_DSP_SYNC: -+ return audio_sync(file); -+ -+ case SNDCTL_DSP_SETDUPLEX: -+ return 0; -+ -+ case SNDCTL_DSP_POST: -+ return 0; -+ -+ case SNDCTL_DSP_GETTRIGGER: -+ val = 0; -+ if (file->f_mode & FMODE_READ && DCSR(is->dma_ch) & DCSR_RUN) -+ val |= PCM_ENABLE_INPUT; -+ if (file->f_mode & FMODE_WRITE && DCSR(os->dma_ch) & DCSR_RUN) -+ val |= PCM_ENABLE_OUTPUT; -+ return put_user(val, (int *)arg); -+ -+ case SNDCTL_DSP_SETTRIGGER: -+ if (get_user(val, (int *)arg)) -+ return -EFAULT; -+ if (file->f_mode & FMODE_READ) { -+ if (val & PCM_ENABLE_INPUT) { -+ if (!is->buffers && audio_setup_buf(is)) -+ return -ENOMEM; -+ if (!(DCSR(is->dma_ch) & DCSR_RUN)) { -+ audio_buf_t *b = &is->buffers[is->dma_frag]; -+ DDADR(is->dma_ch) = b->dma_desc->ddadr; -+ DCSR(is->dma_ch) = DCSR_RUN; -+ } -+ } else { -+ DCSR(is->dma_ch) = 0; -+ } -+ } -+ if (file->f_mode & FMODE_WRITE) { -+ if (val & PCM_ENABLE_OUTPUT) { -+ if (!os->buffers && audio_setup_buf(os)) -+ return -ENOMEM; -+ if (!(DCSR(os->dma_ch) & DCSR_RUN)) { -+ audio_buf_t *b = &os->buffers[os->dma_frag]; -+ DDADR(os->dma_ch) = b->dma_desc->ddadr; -+ DCSR(os->dma_ch) = DCSR_RUN; -+ } -+ } else { -+ DCSR(os->dma_ch) = 0; -+ } -+ } -+ return 0; -+ -+ case SNDCTL_DSP_GETOSPACE: -+ case SNDCTL_DSP_GETISPACE: -+ { -+ audio_buf_info inf = { 0, }; -+ audio_stream_t *s = (cmd == SNDCTL_DSP_GETOSPACE) ? os : is; -+ -+ if ((s == is && !(file->f_mode & FMODE_READ)) || -+ (s == os && !(file->f_mode & FMODE_WRITE))) -+ return -EINVAL; -+ if (!s->buffers && audio_setup_buf(s)) -+ return -ENOMEM; -+ inf.bytes = atomic_read(&s->sem.count) * s->fragsize; -+ inf.bytes -= s->buffers[s->usr_frag].offset; -+ inf.fragments = inf.bytes / s->fragsize; -+ inf.fragsize = s->fragsize; -+ inf.fragstotal = s->nbfrags; -+ return copy_to_user((void *)arg, &inf, sizeof(inf)); -+ } -+ -+ case SNDCTL_DSP_GETOPTR: -+ case SNDCTL_DSP_GETIPTR: -+ { -+ count_info inf = { 0, }; -+ audio_stream_t *s = (cmd == SNDCTL_DSP_GETOPTR) ? os : is; -+ dma_addr_t ptr; -+ int bytecount, offset, flags; -+ -+ if ((s == is && !(file->f_mode & FMODE_READ)) || -+ (s == os && !(file->f_mode & FMODE_WRITE))) -+ return -EINVAL; -+ if (DCSR(s->dma_ch) & DCSR_RUN) { -+ audio_buf_t *b; -+ save_flags_cli(flags); -+ ptr = (s->output) ? DSADR(s->dma_ch) : DTADR(s->dma_ch); -+ b = &s->buffers[s->dma_frag]; -+ offset = ptr - b->dma_desc->dsadr; -+ if (offset >= s->fragsize) -+ offset = s->fragsize - 4; -+ } else { -+ save_flags(flags); -+ offset = 0; -+ } -+ inf.ptr = s->dma_frag * s->fragsize + offset; -+ bytecount = s->bytecount + offset; -+ s->bytecount = -offset; -+ inf.blocks = s->fragcount; -+ s->fragcount = 0; -+ restore_flags(flags); -+ if (bytecount < 0) -+ bytecount = 0; -+ inf.bytes = bytecount; -+ return copy_to_user((void *)arg, &inf, sizeof(inf)); -+ } -+ -+ case SNDCTL_DSP_NONBLOCK: -+ file->f_flags |= O_NONBLOCK; -+ return 0; -+ -+ case SNDCTL_DSP_RESET: -+ if (file->f_mode & FMODE_WRITE) -+ audio_clear_buf(os); -+ if (file->f_mode & FMODE_READ) -+ audio_clear_buf(is); -+ return 0; -+ -+ default: -+ return state->client_ioctl(inode, file, cmd, arg); -+ } -+ -+ return 0; -+} -+ -+ -+static int audio_mmap(struct file *file, struct vm_area_struct *vma) -+{ -+ audio_state_t *state = file->private_data; -+ audio_stream_t *s; -+ unsigned long size, vma_addr; -+ int i, ret; -+ -+ if (vma->vm_pgoff != 0) -+ return -EINVAL; -+ -+ if (vma->vm_flags & VM_WRITE) { -+ if (!state->wr_ref) -+ return -EINVAL;; -+ s = state->output_stream; -+ } else if (vma->vm_flags & VM_READ) { -+ if (!state->rd_ref) -+ return -EINVAL; -+ s = state->input_stream; -+ } else return -EINVAL; -+ -+ if (s->mapped) -+ return -EINVAL; -+ size = vma->vm_end - vma->vm_start; -+ if (size != s->fragsize * s->nbfrags) -+ return -EINVAL; -+ if (!s->buffers && audio_setup_buf(s)) -+ return -ENOMEM; -+ vma_addr = vma->vm_start; -+ for (i = 0; i < s->nbfrags; i++) { -+ audio_buf_t *buf = &s->buffers[i]; -+ if (!buf->master) -+ continue; -+ ret = remap_page_range(vma_addr, buf->dma_desc->dsadr, -+ buf->master, vma->vm_page_prot); -+ if (ret) -+ return ret; -+ vma_addr += buf->master; -+ } -+ for (i = 0; i < s->nbfrags; i++) -+ s->buffers[i].dma_desc->ddadr &= ~DDADR_STOP; -+ s->mapped = 1; -+ return 0; -+} -+ -+ -+static int audio_release(struct inode *inode, struct file *file) -+{ -+ audio_state_t *state = file->private_data; -+ -+ down(&state->sem); -+ -+ if (file->f_mode & FMODE_READ) { -+ audio_clear_buf(state->input_stream); -+ *state->input_stream->drcmr = 0; -+ pxa_free_dma(state->input_stream->dma_ch); -+ state->rd_ref = 0; -+ } -+ -+ if (file->f_mode & FMODE_WRITE) { -+ audio_sync(file); -+ audio_clear_buf(state->output_stream); -+ *state->output_stream->drcmr = 0; -+ pxa_free_dma(state->output_stream->dma_ch); -+ state->wr_ref = 0; -+ } -+ -+ up(&state->sem); -+ return 0; -+} -+ -+ -+int pxa_audio_attach(struct inode *inode, struct file *file, -+ audio_state_t *state) -+{ -+ audio_stream_t *is = state->input_stream; -+ audio_stream_t *os = state->output_stream; -+ int err; -+ -+ down(&state->sem); -+ -+ /* access control */ -+ err = -ENODEV; -+ if ((file->f_mode & FMODE_WRITE) && !os) -+ goto out; -+ if ((file->f_mode & FMODE_READ) && !is) -+ goto out; -+ err = -EBUSY; -+ if ((file->f_mode & FMODE_WRITE) && state->wr_ref) -+ goto out; -+ if ((file->f_mode & FMODE_READ) && state->rd_ref) -+ goto out; -+ -+ /* request DMA channels */ -+ if (file->f_mode & FMODE_WRITE) { -+ err = pxa_request_dma(os->name, DMA_PRIO_LOW, -+ audio_dma_irq, os); -+ if (err < 0) -+ goto out; -+ os->dma_ch = err; -+ } -+ if (file->f_mode & FMODE_READ) { -+ err = pxa_request_dma(is->name, DMA_PRIO_LOW, -+ audio_dma_irq, is); -+ if (err < 0) { -+ if (file->f_mode & FMODE_WRITE) { -+ *os->drcmr = 0; -+ pxa_free_dma(os->dma_ch); -+ } -+ goto out; -+ } -+ is->dma_ch = err; -+ } -+ -+ file->private_data = state; -+ file->f_op->release = audio_release; -+ file->f_op->write = audio_write; -+ file->f_op->read = audio_read; -+ file->f_op->mmap = audio_mmap; -+ file->f_op->poll = audio_poll; -+ file->f_op->ioctl = audio_ioctl; -+ file->f_op->llseek = no_llseek; -+ -+ if ((file->f_mode & FMODE_WRITE)) { -+ state->wr_ref = 1; -+ os->fragsize = AUDIO_FRAGSIZE_DEFAULT; -+ os->nbfrags = AUDIO_NBFRAGS_DEFAULT; -+ os->output = 1; -+ os->mapped = 0; -+ init_waitqueue_head(&os->frag_wq); -+ init_waitqueue_head(&os->stop_wq); -+ *os->drcmr = os->dma_ch | DRCMR_MAPVLD; -+ } -+ if (file->f_mode & FMODE_READ) { -+ state->rd_ref = 1; -+ is->fragsize = AUDIO_FRAGSIZE_DEFAULT; -+ is->nbfrags = AUDIO_NBFRAGS_DEFAULT; -+ is->output = 0; -+ is->mapped = 0; -+ init_waitqueue_head(&is->frag_wq); -+ init_waitqueue_head(&is->stop_wq); -+ *is->drcmr = is->dma_ch | DRCMR_MAPVLD; -+ } -+ -+ err = 0; -+ -+out: -+ up(&state->sem); -+ return err; -+} -+ -+EXPORT_SYMBOL(pxa_audio_attach); -+EXPORT_SYMBOL(pxa_audio_clear_buf); -+ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/sound/pxa-audio.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,55 @@ -+/* -+ * linux/drivers/sound/pxa-audio.h -- audio interface for the Cotula chip -+ * -+ * Author: Nicolas Pitre -+ * Created: Aug 15, 2001 -+ * Copyright: MontaVista Software Inc. -+ * -+ * 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. -+ */ -+ -+typedef struct { -+ int offset; /* current buffer position */ -+ char *data; /* actual buffer */ -+ pxa_dma_desc *dma_desc; /* pointer to the starting desc */ -+ int master; /* owner for buffer allocation, contain size whn true */ -+} audio_buf_t; -+ -+typedef struct { -+ char *name; /* stream identifier */ -+ audio_buf_t *buffers; /* pointer to audio buffer array */ -+ u_int usr_frag; /* user fragment index */ -+ u_int dma_frag; /* DMA fragment index */ -+ u_int fragsize; /* fragment size */ -+ u_int nbfrags; /* number of fragments */ -+ u_int dma_ch; /* DMA channel number */ -+ dma_addr_t dma_desc_phys; /* phys addr of descriptor ring */ -+ u_int descs_per_frag; /* nbr descriptors per fragment */ -+ int bytecount; /* nbr of processed bytes */ -+ int fragcount; /* nbr of fragment transitions */ -+ struct semaphore sem; /* account for fragment usage */ -+ wait_queue_head_t frag_wq; /* for poll(), etc. */ -+ wait_queue_head_t stop_wq; /* for users of DCSR_STOPIRQEN */ -+ u_long dcmd; /* DMA descriptor dcmd field */ -+ volatile u32 *drcmr; /* the DMA request channel to use */ -+ u_long dev_addr; /* device physical address for DMA */ -+ int mapped:1; /* mmap()'ed buffers */ -+ int output:1; /* 0 for input, 1 for output */ -+} audio_stream_t; -+ -+typedef struct { -+ audio_stream_t *output_stream; -+ audio_stream_t *input_stream; -+ int dev_dsp; /* audio device handle */ -+ int rd_ref:1; /* open reference for recording */ -+ int wr_ref:1; /* open reference for playback */ -+ int (*client_ioctl)(struct inode *, struct file *, uint, ulong); -+ struct semaphore sem; /* prevent races in attach/release */ -+} audio_state_t; -+ -+extern int pxa_audio_attach(struct inode *inode, struct file *file, -+ audio_state_t *state); -+extern void pxa_audio_clear_buf(audio_stream_t *s); -+ ---- linux-2.4.25/drivers/sound/sa1100-audio.c~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/drivers/sound/sa1100-audio.c 2004-03-31 17:15:12.000000000 +0200 -@@ -148,7 +148,8 @@ - do { - dmabuf = consistent_alloc(GFP_KERNEL|GFP_DMA, - dmasize, -- &dmaphys); -+ &dmaphys, -+ 0); - if (!dmabuf) - dmasize -= s->fragsize; - } while (!dmabuf && dmasize); ---- linux-2.4.25/drivers/video/Config.in~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/drivers/video/Config.in 2004-03-31 17:15:12.000000000 +0200 -@@ -50,6 +50,15 @@ - if [ "$CONFIG_FB_SA1100" = "y" -a "$CONFIG_SA1100_CERF_CPLD" = "y" ]; then - bool 'Cerfboard Backlight (CerfPDA)' CONFIG_SA1100_CERF_LCD_BACKLIGHT - fi -+ tristate ' PXA LCD support' CONFIG_FB_PXA $CONFIG_ARCH_PXA -+ if [ "$CONFIG_FB_PXA" != "n" ]; then -+ choice 'LCD Bit Depth' \ -+ "8-Bpp CONFIG_FB_PXA_8BPP \ -+ 16-Bpp CONFIG_FB_PXA_16BPP" Bit-Depth -+ fi -+ if [ "$CONFIG_FB_PXA" != "n" -a "$CONFIG_ARCH_LUBBOCK" = "y" ]; then -+ bool ' Lubbock QVGA LCD support instead of DSTN' CONFIG_FB_PXA_QVGA -+ fi - fi - dep_tristate ' CyberPro 2000/2010/5000 support' CONFIG_FB_CYBER2000 $CONFIG_PCI - if [ "$CONFIG_APOLLO" = "y" ]; then -@@ -295,7 +304,7 @@ - if [ "$CONFIG_FB_ACORN" = "y" -o "$CONFIG_FB_MAC" = "y" -o \ - "$CONFIG_FB_SA1100" = "y" -o "$CONFIG_FB_VIRTUAL" = "y" -o \ - "$CONFIG_FB_TX3912" = "y" -o "$CONFIG_FB_CLPS711X" = "y" -o \ -- "$CONFIG_FB_DBMX1" = "y" ]; then -+ "$CONFIG_FB_DBMX1" = "y" -o "$CONFIG_FB_PXA" = "y" ]; then - define_tristate CONFIG_FBCON_CFB2 y - define_tristate CONFIG_FBCON_CFB4 y - else -@@ -329,7 +338,7 @@ - "$CONFIG_FB_SIS" = "y" -o "$CONFIG_FB_NEOMAGIC" = "y" -o \ - "$CONFIG_FB_STI" = "y" -o "$CONFIG_FB_HP300" = "y" -o \ - "$CONFIG_FB_INTEL" = "y" -o \ -- "$CONFIG_FB_DBMX1" = "y" ]; then -+ "$CONFIG_FB_DBMX1" = "y" -o "$CONFIG_FB_PXA" = "y" ]; then - define_tristate CONFIG_FBCON_CFB8 y - else - if [ "$CONFIG_FB_ACORN" = "m" -o "$CONFIG_FB_ATARI" = "m" -o \ -@@ -372,7 +381,7 @@ - "$CONFIG_FB_SIS" = "y" -o "$CONFIG_FB_SA1100" = "y" -o \ - "$CONFIG_FB_PVR2" = "y" -o "$CONFIG_FB_VOODOO1" = "y" -o \ - "$CONFIG_FB_NEOMAGIC" = "y" -o "$CONFIG_FB_INTEL" = "y" -o \ -- "$CONFIG_FB_ANAKIN" = "y" -o \ -+ "$CONFIG_FB_ANAKIN" = "y" -o "$CONFIG_FB_PXA" = "y" -o \ - "$CONFIG_FB_DBMX1" = "y" ]; then - define_tristate CONFIG_FBCON_CFB16 y - else ---- linux-2.4.25/drivers/video/Makefile~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/drivers/video/Makefile 2004-03-31 17:15:12.000000000 +0200 -@@ -14,7 +14,7 @@ - fbcon-vga.o fbcon-iplan2p2.o fbcon-iplan2p4.o \ - fbcon-iplan2p8.o fbcon-vga-planes.o fbcon-cfb16.o \ - fbcon-cfb2.o fbcon-cfb24.o fbcon-cfb32.o fbcon-cfb4.o \ -- fbcon-cfb8.o fbcon-mac.o fbcon-mfb.o \ -+ fbcon-cfb8.o fbcon-mac.o fbcon-mfb.o pxafb.o \ - cyber2000fb.o sa1100fb.o fbcon-hga.o fbgen.o - - # Each configuration option enables a list of files. -@@ -129,6 +129,10 @@ - obj-$(CONFIG_FB_BWTWO) += bwtwofb.o - obj-$(CONFIG_FB_HGA) += hgafb.o - obj-$(CONFIG_FB_SA1100) += sa1100fb.o -+obj-$(CONFIG_FB_PXA) += pxafb.o -+ifeq ($(CONFIG_PXA_CERF_PDA),y) -+ obj-$(CONFIG_FB_PXA) += lcdctrl.o lcdctrl_cerf.o -+endif - obj-$(CONFIG_FB_DBMX1) += dbmx1fb.o - obj-$(CONFIG_FB_VIRTUAL) += vfb.o - obj-$(CONFIG_FB_HIT) += hitfb.o fbgen.o ---- linux-2.4.25/drivers/video/fbmem.c~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/drivers/video/fbmem.c 2004-03-31 17:15:12.000000000 +0200 -@@ -109,6 +109,7 @@ - extern int chips_init(void); - extern int g364fb_init(void); - extern int sa1100fb_init(void); -+extern int pxafb_init(void); - extern int fm2fb_init(void); - extern int fm2fb_setup(char*); - extern int q40fb_init(void); -@@ -305,6 +306,9 @@ - #ifdef CONFIG_FB_SA1100 - { "sa1100", sa1100fb_init, NULL }, - #endif -+#ifdef CONFIG_FB_PXA -+ { "pxa", pxafb_init, NULL }, -+#endif - #ifdef CONFIG_FB_SUN3 - { "sun3", sun3fb_init, sun3fb_setup }, - #endif -@@ -675,13 +679,13 @@ - #elif defined(__i386__) || defined(__x86_64__) - if (boot_cpu_data.x86 > 3) - pgprot_val(vma->vm_page_prot) |= _PAGE_PCD; --#elif defined(__arm__) || defined(__mips__) -+#elif defined(__mips__) - vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); - #elif defined(__sh__) - pgprot_val(vma->vm_page_prot) &= ~_PAGE_CACHABLE; - #elif defined(__hppa__) - pgprot_val(vma->vm_page_prot) |= _PAGE_NO_CACHE; --#elif defined(__ia64__) -+#elif defined(__ia64__) || defined(__arm__) - vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); - #elif defined(__hppa__) - pgprot_val(vma->vm_page_prot) |= _PAGE_NO_CACHE; ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/video/lcdctrl.c 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,223 @@ -+/* -+ * lcdctrl.c -+ * -+ * Generic LCD control for brightness, contrast, etc. -+ * Device specific drivers implement a lcdctrl_device and -+ * provides access to it via lcdctrl_device_get_ops(). -+ * -+ * Copyright (C) 2002 Intrinsyc Software Inc. -+ * -+ * 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. -+ * -+ * History: -+ * Mar 2002: Initial version [FB] -+ * -+ */ -+ -+#include <linux/config.h> -+#include <linux/module.h> -+#include <linux/kernel.h> -+#include <linux/sched.h> -+#include <linux/errno.h> -+#include <linux/string.h> -+#include <linux/ctype.h> -+#include <linux/mm.h> -+#include <linux/init.h> -+#include <linux/delay.h> -+ -+#include <asm/system.h> -+#include <asm/hardware.h> -+#include <asm/io.h> -+#include <asm/irq.h> -+#include <asm/uaccess.h> -+ -+#include <video/lcdctrl.h> -+ -+/* -+ * Set this to zero to remove all the debug statements via -+ * dead code elimination. -+ */ -+#define DEBUGGING 0 -+ -+#if DEBUGGING -+static unsigned int lcd_debug = DEBUGGING; -+#else -+#define lcd_debug 0 -+#endif -+ -+/* -- prototypes -- */ -+ -+static int lcdctrl_ioctl(struct inode * inode, struct file *filp, -+ unsigned int cmd , unsigned long arg); -+static int lcdctrl_open(struct inode *inode, struct file *filp); -+static int lcdctrl_close(struct inode *inode, struct file *filp); -+ -+/* -- variables -- */ -+ -+struct lcdctrl_device *lcd_device; -+ -+static int intensity; -+static int brightness; -+static int contrast; -+ -+static int enabled; -+static int sync_needed; -+static int chrdev_major; -+ -+static struct file_operations lcdctrl_fops = { -+ ioctl: lcdctrl_ioctl, -+ open: lcdctrl_open, -+ release: lcdctrl_close -+}; -+ -+/* -- ioctl -- */ -+ -+static int lcdctrl_ioctl(struct inode * inode, struct file *filp, -+ unsigned int cmd , unsigned long arg) -+{ -+ int ret; -+ ret = -EINVAL; -+ -+ if( lcd_debug) -+ printk(KERN_INFO "lcdctrl_ioctl: cmd=%d, arg=%ld\n", cmd, arg); -+ -+ switch(cmd) -+ { -+ case _LCDCTRL_IOCTL_ON: -+ ret = lcdctrl_enable(); -+ break; -+ case _LCDCTRL_IOCTL_OFF: -+ ret = lcdctrl_disable(); -+ break; -+ case _LCDCTRL_IOCTL_INTENSITY: -+ if ((arg >=0) && (arg <= 100)) -+ ret = lcdctrl_set_intensity(arg); -+ break; -+ case _LCDCTRL_IOCTL_BRIGHTNESS: -+ if ((arg >=0) && (arg <= 100)) -+ ret = lcdctrl_set_brightness(arg); -+ break; -+ case _LCDCTRL_IOCTL_CONTRAST: -+ if ((arg >=0) && (arg <= 100)) -+ ret = lcdctrl_set_contrast(arg, LCD_NO_SYNC); -+ break; -+ case _LCDCTRL_IOCTL_GET_BRIGHTNESS: -+ ret = brightness; -+ break; -+ case _LCDCTRL_IOCTL_GET_CONTRAST: -+ ret = contrast; -+ break; -+ case _LCDCTRL_IOCTL_GET_INTENSITY: -+ ret = intensity; -+ break; -+ -+ default: -+ printk(KERN_ERR "lcdctrl_ioctl: invalid ioctl\n"); -+ break; -+ } -+ -+ return ret; -+} -+ -+static int lcdctrl_open(struct inode *inode, struct file *filp) -+{ -+// MOD_INC_USE_COUNT; -+ return 0; -+} -+ -+static int lcdctrl_close(struct inode *inode, struct file *filp) -+{ -+// MOD_DEC_USE_COUNT; -+ return 0; -+} -+ -+/* -- -- */ -+ -+int lcdctrl_enable( void) -+{ -+ int result; -+ -+ if( enabled) return 0; -+ -+ result = lcd_device->enable(); -+ -+ lcdctrl_set_intensity( intensity); -+ lcdctrl_set_brightness( brightness); -+ lcdctrl_set_contrast( contrast, sync_needed); -+ sync_needed = LCD_NO_SYNC; -+ -+ enabled = 1; -+ return result; -+} -+ -+int lcdctrl_disable( void) -+{ -+ enabled = 0; -+ return lcd_device->disable(); -+} -+ -+int lcdctrl_set_intensity( int i) -+{ -+ intensity = i; -+ return lcd_device->set_intensity( i); -+} -+ -+int lcdctrl_set_brightness( int b) -+{ -+ brightness = b; -+ return lcd_device->set_brightness( b); -+} -+ -+int lcdctrl_set_contrast( int c, int sync) -+{ -+ contrast = c; -+ return lcd_device->set_contrast( c, sync); -+} -+ -+int lcdctrl_get_intensity( void) -+{ -+ return intensity; -+} -+ -+int lcdctrl_get_brightness( void) -+{ -+ return brightness; -+} -+ -+int lcdctrl_get_contrast( void) -+{ -+ return contrast; -+} -+ -+/* -- -- */ -+ -+/* the device specific driver should implement this */ -+struct lcdctrl_device *lcdctrl_device_get_ops(void); -+ -+int lcdctrl_init( void) -+{ -+ int ret; -+ -+ lcd_device = lcdctrl_device_get_ops(); -+ -+ if( !lcd_device) -+ { -+ printk(KERN_ERR "lcdctrl_init: No lcd_device registered.\n"); -+ return -EINVAL; -+ } -+ -+ ret = lcd_device->init( &intensity, &brightness, &contrast); -+ -+ sync_needed = LCD_SYNC_NEEDED; -+ -+ if( ret == 0) -+ { -+ chrdev_major = -+ register_chrdev( 0,_LCD_CONTROL_NAME,&lcdctrl_fops); -+ if( lcd_debug) -+ printk(KERN_INFO "lcdctrl_init: OK\n"); -+ } -+ return ret; -+} ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/video/lcdctrl_cerf.c 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,175 @@ -+/* -+ * lcdctrl_cerf.c -+ * -+ * Cerf LCD control for brightness and contrast. -+ * -+ * Copyright (C) 2002 Intrinsyc Software Inc. -+ * -+ * 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. -+ * -+ * History: -+ * Mar 2002: Initial version [FB] -+ * -+ */ -+#include <linux/config.h> -+#include <linux/module.h> -+#include <linux/kernel.h> -+#include <linux/sched.h> -+#include <linux/errno.h> -+#include <linux/string.h> -+#include <linux/ctype.h> -+#include <linux/mm.h> -+#include <linux/init.h> -+#include <linux/delay.h> -+ -+#include <asm/system.h> -+#include <asm/hardware.h> -+#include <asm/io.h> -+#include <asm/irq.h> -+#include <asm/uaccess.h> -+#include <asm/arch/cerf_ucb1400gpio.h> -+ -+#include <video/lcdctrl.h> -+ -+/* -+ * Set this to zero to remove all the debug statements via -+ * dead code elimination. -+ */ -+#define DEBUGGING 0 -+ -+#if DEBUGGING -+static unsigned int lcd_debug = DEBUGGING; -+#else -+#define lcd_debug 0 -+#endif -+ -+#define LCD_MAX_INTENSITY 0 -+#define LCD_MAX_BRIGHTNESS 15 -+#define LCD_MAX_CONTRAST 100 -+ -+#define LCD_DEFAULT_INTENSITY 0 -+#define LCD_DEFAULT_BRIGHTNESS 14*100/(LCD_MAX_BRIGHTNESS) -+#define LCD_DEFAULT_CONTRAST 90*100/(LCD_MAX_CONTRAST) -+ -+#define UP 1 -+#define DOWN 0 -+ -+/* -- prototypes -- */ -+ -+static int cerf_lcdctrl_init( int *intensity, int *brightness, int *contrast); -+static int cerf_lcdctrl_enable(void); -+static int cerf_lcdctrl_disable(void); -+static int cerf_lcdctrl_set_intensity( int i); -+static int cerf_lcdctrl_set_brightness( int b); -+static int cerf_lcdctrl_set_contrast( int c, int sync); -+ -+static void cerf_lcdctrl_contrast_step( int direction); -+ -+/* -- variables -- */ -+ -+static int dev_contrast; -+ -+/* -- -- */ -+ -+static struct lcdctrl_device cerf_dev = { -+ init: cerf_lcdctrl_init, -+ enable: cerf_lcdctrl_enable, -+ disable: cerf_lcdctrl_disable, -+ set_intensity: cerf_lcdctrl_set_intensity, -+ set_brightness: cerf_lcdctrl_set_brightness, -+ set_contrast: cerf_lcdctrl_set_contrast -+}; -+ -+static int cerf_lcdctrl_enable( void) -+{ -+ cerf_ucb1400gpio_lcd_enable(); -+ -+ return 0; -+} -+ -+static int cerf_lcdctrl_disable( void) -+{ -+ cerf_ucb1400gpio_lcd_disable(); -+ -+ return 0; -+} -+ -+static int cerf_lcdctrl_set_intensity( int i) -+{ -+ int dev_intensity = LCD_MAX_INTENSITY*i/100; -+ if( lcd_debug) -+ printk(KERN_INFO "cerf_lcdctrl_set_intensity: " -+ "dev_intensity = %d\n", dev_intensity); -+ return 0; -+} -+ -+static int cerf_lcdctrl_set_brightness( int b) -+{ -+ int dev_brightness = LCD_MAX_BRIGHTNESS*b/100; -+ outw( dev_brightness, CERF_PDA_CPLD+CERF_PDA_CPLD_BRIGHTNESS); -+ if( lcd_debug) -+ printk(KERN_INFO "cerf_lcdctrl_set_brightness: " -+ "dev_brightness = %d\n", dev_brightness); -+ return 0; -+} -+ -+static int cerf_lcdctrl_set_contrast( int c, int sync) -+{ -+ int new_dev_contrast = LCD_MAX_CONTRAST*c/100; -+ int i; -+ int count; -+ int direction = UP; -+ if( sync == LCD_SYNC_NEEDED) -+ { -+ /* In order to sync we step down to the lowest contrast level */ -+ for( i=0; i<LCD_MAX_CONTRAST; i++) -+ cerf_lcdctrl_contrast_step(DOWN); -+ dev_contrast = 0; -+ } -+ -+ count = new_dev_contrast - dev_contrast; -+ if( count < 0) -+ { -+ /* new contrast is lower then current setting */ -+ direction = DOWN; -+ count = -count; -+ } -+ -+ for( i=0; i<count; i++) -+ cerf_lcdctrl_contrast_step(direction); -+ -+ if( lcd_debug) -+ printk(KERN_INFO "cerf_lcdctrl_set_contrast: " -+ "dev_contrast = %d\n", new_dev_contrast); -+ dev_contrast = new_dev_contrast; -+ -+ return 0; -+} -+ -+/* -- -- */ -+ -+static void cerf_lcdctrl_contrast_step( int direction) -+{ -+ cerf_ucb1400gpio_lcd_contrast_step( direction); -+} -+ -+/* -- -- */ -+ -+static int cerf_lcdctrl_init( int *intensity, int *brightness, int *contrast) -+{ -+ *intensity = LCD_DEFAULT_INTENSITY; -+ *brightness = LCD_DEFAULT_BRIGHTNESS; -+ *contrast = LCD_DEFAULT_CONTRAST; -+ -+ if( lcd_debug) -+ printk(KERN_INFO "cerf_lcdctrl_init: OK\n"); -+ return 0; -+} -+ -+/* this is the hook for lcdctrl to access to the device specifics */ -+struct lcdctrl_device *lcdctrl_device_get_ops(void) -+{ -+ return &cerf_dev; -+} ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/video/pxafb.c 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,1410 @@ -+/* -+ * linux/drivers/video/pxafb.c -+ * -+ * Copyright (C) 1999 Eric A. Thomas -+ * Based on acornfb.c Copyright (C) Russell King. -+ * -+ * This file is subject to the terms and conditions of the GNU General Public -+ * License. See the file COPYING in the main directory of this archive for -+ * more details. -+ * -+ * Intel PXA250/210 LCD Controller Frame Buffer Driver -+ * -+ * Please direct your questions and comments on this driver to the following -+ * email address: -+ * -+ * linux-arm-kernel@lists.arm.linux.org.uk -+ * -+ * -+ * Code Status: -+ * -+ * 2001/08/03: <cbrake@accelent.com> -+ * - Ported from SA1100 to PXA250 -+ */ -+ -+#include <linux/config.h> -+#include <linux/module.h> -+#include <linux/kernel.h> -+#include <linux/sched.h> -+#include <linux/errno.h> -+#include <linux/string.h> -+#include <linux/interrupt.h> -+#include <linux/slab.h> -+#include <linux/fb.h> -+#include <linux/delay.h> -+#include <linux/pm.h> -+#include <linux/init.h> -+#include <linux/notifier.h> -+#include <linux/cpufreq.h> -+ -+#include <asm/hardware.h> -+#include <asm/io.h> -+#include <asm/irq.h> -+#include <asm/mach-types.h> -+#include <asm/uaccess.h> -+ -+#include <video/fbcon.h> -+#include <video/fbcon-mfb.h> -+#include <video/fbcon-cfb4.h> -+#include <video/fbcon-cfb8.h> -+#include <video/fbcon-cfb16.h> -+#include <video/lcdctrl.h> /* brightness, contrast, etc. control */ -+ -+/* -+ * debugging? -+ */ -+#define DEBUG 0 -+/* -+ * Complain if VAR is out of range. -+ */ -+#define DEBUG_VAR 1 -+ -+#undef ASSABET_PAL_VIDEO -+ -+#include "pxafb.h" -+ -+void (*pxafb_blank_helper)(int blank); -+EXPORT_SYMBOL(pxafb_blank_helper); -+ -+/* -+ * IMHO this looks wrong. In 8BPP, length should be 8. -+ */ -+static struct pxafb_rgb rgb_8 = { -+ red: { offset: 0, length: 4, }, -+ green: { offset: 0, length: 4, }, -+ blue: { offset: 0, length: 4, }, -+ transp: { offset: 0, length: 0, }, -+}; -+ -+static struct pxafb_rgb def_rgb_16 = { -+ red: { offset: 11, length: 5, }, -+ green: { offset: 5, length: 6, }, -+ blue: { offset: 0, length: 5, }, -+ transp: { offset: 0, length: 0, }, -+}; -+ -+static struct pxafb_mach_info pxa_fb_info __initdata = { -+ pixclock: LCD_PIXCLOCK, /* clock period in ps */ -+ bpp: LCD_BPP, -+ xres: LCD_XRES, -+ yres: LCD_YRES, -+ hsync_len: LCD_HORIZONTAL_SYNC_PULSE_WIDTH, -+ vsync_len: LCD_VERTICAL_SYNC_PULSE_WIDTH, -+ left_margin: LCD_BEGIN_OF_LINE_WAIT_COUNT, -+ upper_margin: LCD_BEGIN_FRAME_WAIT_COUNT, -+ right_margin: LCD_END_OF_LINE_WAIT_COUNT, -+ lower_margin: LCD_END_OF_FRAME_WAIT_COUNT, -+ sync: LCD_SYNC, -+ lccr0: LCD_LCCR0, -+ lccr3: LCD_LCCR3 -+}; -+ -+static struct pxafb_mach_info * __init -+pxafb_get_machine_info(struct pxafb_info *fbi) -+{ -+ return &pxa_fb_info; -+} -+ -+static int pxafb_activate_var(struct fb_var_screeninfo *var, struct pxafb_info *); -+static void set_ctrlr_state(struct pxafb_info *fbi, u_int state); -+ -+static inline void pxafb_schedule_task(struct pxafb_info *fbi, u_int state) -+{ -+ unsigned long flags; -+ -+ local_irq_save(flags); -+ /* -+ * We need to handle two requests being made at the same time. -+ * There are two important cases: -+ * 1. When we are changing VT (C_REENABLE) while unblanking (C_ENABLE) -+ * We must perform the unblanking, which will do our REENABLE for us. -+ * 2. When we are blanking, but immediately unblank before we have -+ * blanked. We do the "REENABLE" thing here as well, just to be sure. -+ */ -+ if (fbi->task_state == C_ENABLE && state == C_REENABLE) -+ state = (u_int) -1; -+ if (fbi->task_state == C_DISABLE && state == C_ENABLE) -+ state = C_REENABLE; -+ -+ if (state != (u_int)-1) { -+ fbi->task_state = state; -+ schedule_task(&fbi->task); -+ } -+ local_irq_restore(flags); -+} -+ -+/* -+ * Get the VAR structure pointer for the specified console -+ */ -+static inline struct fb_var_screeninfo *get_con_var(struct fb_info *info, int con) -+{ -+ struct pxafb_info *fbi = (struct pxafb_info *)info; -+ return (con == fbi->currcon || con == -1) ? &fbi->fb.var : &fb_display[con].var; -+} -+ -+/* -+ * Get the DISPLAY structure pointer for the specified console -+ */ -+static inline struct display *get_con_display(struct fb_info *info, int con) -+{ -+ struct pxafb_info *fbi = (struct pxafb_info *)info; -+ return (con < 0) ? fbi->fb.disp : &fb_display[con]; -+} -+ -+/* -+ * Get the CMAP pointer for the specified console -+ */ -+static inline struct fb_cmap *get_con_cmap(struct fb_info *info, int con) -+{ -+ struct pxafb_info *fbi = (struct pxafb_info *)info; -+ return (con == fbi->currcon || con == -1) ? &fbi->fb.cmap : &fb_display[con].cmap; -+} -+ -+static inline u_int -+chan_to_field(u_int chan, struct fb_bitfield *bf) -+{ -+ chan &= 0xffff; -+ chan >>= 16 - bf->length; -+ return chan << bf->offset; -+} -+ -+static int -+pxafb_setpalettereg(u_int regno, u_int red, u_int green, u_int blue, -+ u_int trans, struct fb_info *info) -+{ -+ struct pxafb_info *fbi = (struct pxafb_info *)info; -+ u_int val, ret = 1; -+ -+ if (regno < fbi->palette_size) { -+ val = ((red >> 0) & 0xf800); -+ val |= ((green >> 5) & 0x07e0); -+ val |= ((blue >> 11) & 0x001f); -+ -+ fbi->palette_cpu[regno] = val; -+ ret = 0; -+ } -+ return ret; -+} -+ -+static int -+pxafb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, -+ u_int trans, struct fb_info *info) -+{ -+ struct pxafb_info *fbi = (struct pxafb_info *)info; -+ u_int val; -+ int ret = 1; -+ -+ /* -+ * If greyscale is true, then we convert the RGB value -+ * to greyscale no mater what visual we are using. -+ */ -+ if (fbi->fb.var.grayscale) -+ red = green = blue = (19595 * red + 38470 * green + -+ 7471 * blue) >> 16; -+ -+ switch (fbi->fb.disp->visual) { -+ case FB_VISUAL_TRUECOLOR: -+ case FB_VISUAL_DIRECTCOLOR: -+ /* -+ * 12 or 16-bit True Colour. We encode the RGB value -+ * according to the RGB bitfield information. -+ */ -+ if (regno <= 16) { -+ u16 *pal = fbi->fb.pseudo_palette; -+ -+ val = chan_to_field(red, &fbi->fb.var.red); -+ val |= chan_to_field(green, &fbi->fb.var.green); -+ val |= chan_to_field(blue, &fbi->fb.var.blue); -+ -+ pal[regno] = val; -+ ret = 0; -+ } -+ break; -+ -+ case FB_VISUAL_PSEUDOCOLOR: -+ ret = pxafb_setpalettereg(regno, red, green, blue, trans, info); -+ break; -+ } -+ -+ return ret; -+} -+ -+/* -+ * pxafb_decode_var(): -+ * Get the video params out of 'var'. If a value doesn't fit, round it up, -+ * if it's too big, return -EINVAL. -+ * -+ * Suggestion: Round up in the following order: bits_per_pixel, xres, -+ * yres, xres_virtual, yres_virtual, xoffset, yoffset, grayscale, -+ * bitfields, horizontal timing, vertical timing. -+ */ -+static int pxafb_validate_var(struct fb_var_screeninfo *var, -+ struct pxafb_info *fbi) -+{ -+ int ret = -EINVAL; -+ -+ if (var->xres < MIN_XRES) -+ var->xres = MIN_XRES; -+ if (var->yres < MIN_YRES) -+ var->yres = MIN_YRES; -+ if (var->xres > fbi->max_xres) -+ var->xres = fbi->max_xres; -+ if (var->yres > fbi->max_yres) -+ var->yres = fbi->max_yres; -+ var->xres_virtual = -+ var->xres_virtual < var->xres ? var->xres : var->xres_virtual; -+ var->yres_virtual = -+ var->yres_virtual < var->yres ? var->yres : var->yres_virtual; -+ -+ DPRINTK("var->bits_per_pixel=%d\n", var->bits_per_pixel); -+ switch (var->bits_per_pixel) { -+#ifdef FBCON_HAS_CFB4 -+ case 4: ret = 0; break; -+#endif -+#ifdef FBCON_HAS_CFB8 -+ case 8: ret = 0; break; -+#endif -+#ifdef FBCON_HAS_CFB16 -+ case 12: -+ /* make sure we are in passive mode */ -+ if (!(fbi->lccr0 & LCCR0_PAS)) -+ ret = 0; -+ break; -+ -+ case 16: -+ /* -+ * 16 bits works apparemtly fine in passive mode for those, -+ * so don't complain -+ */ -+ if (machine_is_lubbock() || -+ machine_is_pxa_cerf()) { -+ ret = 0; -+ } else -+ /* make sure we are in active mode */ -+ if ((fbi->lccr0 & LCCR0_PAS)) -+ ret = 0; -+ break; -+#endif -+ default: -+ break; -+ } -+ -+ return ret; -+} -+ -+static inline void pxafb_set_truecolor(u_int is_true_color) -+{ -+ DPRINTK("true_color = %d\n", is_true_color); -+} -+ -+static void -+pxafb_hw_set_var(struct fb_var_screeninfo *var, struct pxafb_info *fbi) -+{ -+ -+ fb_set_cmap(&fbi->fb.cmap, 1, pxafb_setcolreg, &fbi->fb); -+ -+ /* Set board control register to handle new color depth */ -+ pxafb_set_truecolor(var->bits_per_pixel >= 16); -+ -+ pxafb_activate_var(var, fbi); -+ -+} -+ -+/* -+ * pxafb_set_var(): -+ * Set the user defined part of the display for the specified console -+ */ -+static int -+pxafb_set_var(struct fb_var_screeninfo *var, int con, struct fb_info *info) -+{ -+ struct pxafb_info *fbi = (struct pxafb_info *)info; -+ struct fb_var_screeninfo *dvar = get_con_var(&fbi->fb, con); -+ struct display *display = get_con_display(&fbi->fb, con); -+ int err, chgvar = 0, rgbidx; -+ -+ DPRINTK("set_var\n"); -+ -+ /* -+ * Decode var contents into a par structure, adjusting any -+ * out of range values. -+ */ -+ err = pxafb_validate_var(var, fbi); -+ if (err) -+ return err; -+ -+ if (var->activate & FB_ACTIVATE_TEST) -+ return 0; -+ -+ if ((var->activate & FB_ACTIVATE_MASK) != FB_ACTIVATE_NOW) -+ return -EINVAL; -+ -+ if (dvar->xres != var->xres) -+ chgvar = 1; -+ if (dvar->yres != var->yres) -+ chgvar = 1; -+ if (dvar->xres_virtual != var->xres_virtual) -+ chgvar = 1; -+ if (dvar->yres_virtual != var->yres_virtual) -+ chgvar = 1; -+ if (dvar->bits_per_pixel != var->bits_per_pixel) -+ chgvar = 1; -+ if (con < 0) -+ chgvar = 0; -+ -+ switch (var->bits_per_pixel) { -+#ifdef FBCON_HAS_CFB4 -+ case 4: -+ if (fbi->cmap_static) -+ display->visual = FB_VISUAL_STATIC_PSEUDOCOLOR; -+ else -+ display->visual = FB_VISUAL_PSEUDOCOLOR; -+ display->line_length = var->xres / 2; -+ display->dispsw = &fbcon_cfb4; -+ rgbidx = RGB_8; -+ break; -+#endif -+#ifdef FBCON_HAS_CFB8 -+ case 8: -+ if (fbi->cmap_static) -+ display->visual = FB_VISUAL_STATIC_PSEUDOCOLOR; -+ else -+ display->visual = FB_VISUAL_PSEUDOCOLOR; -+ display->line_length = var->xres; -+ display->dispsw = &fbcon_cfb8; -+ rgbidx = RGB_8; -+ break; -+#endif -+#ifdef FBCON_HAS_CFB16 -+ case 12: -+ case 16: -+ display->visual = FB_VISUAL_TRUECOLOR; -+ display->line_length = var->xres * 2; -+ display->dispsw = &fbcon_cfb16; -+ display->dispsw_data = fbi->fb.pseudo_palette; -+ rgbidx = RGB_16; -+ break; -+#endif -+ default: -+ rgbidx = 0; -+ display->dispsw = &fbcon_dummy; -+ break; -+ } -+ -+ display->screen_base = fbi->screen_cpu; -+ display->next_line = display->line_length; -+ display->type = fbi->fb.fix.type; -+ display->type_aux = fbi->fb.fix.type_aux; -+ display->ypanstep = fbi->fb.fix.ypanstep; -+ display->ywrapstep = fbi->fb.fix.ywrapstep; -+ display->can_soft_blank = 1; -+ display->inverse = 0; -+ -+ *dvar = *var; -+ dvar->activate &= ~FB_ACTIVATE_ALL; -+ -+ /* -+ * Copy the RGB parameters for this display -+ * from the machine specific parameters. -+ */ -+ dvar->red = fbi->rgb[rgbidx]->red; -+ dvar->green = fbi->rgb[rgbidx]->green; -+ dvar->blue = fbi->rgb[rgbidx]->blue; -+ dvar->transp = fbi->rgb[rgbidx]->transp; -+ -+ DPRINTK("RGBT length = %d:%d:%d:%d\n", -+ dvar->red.length, dvar->green.length, dvar->blue.length, -+ dvar->transp.length); -+ -+ DPRINTK("RGBT offset = %d:%d:%d:%d\n", -+ dvar->red.offset, dvar->green.offset, dvar->blue.offset, -+ dvar->transp.offset); -+ -+ /* -+ * Update the old var. The fbcon drivers still use this. -+ * Once they are using fbi->fb.var, this can be dropped. -+ */ -+ display->var = *dvar; -+ -+ /* -+ * If we are setting all the virtual consoles, also set the -+ * defaults used to create new consoles. -+ */ -+ if (var->activate & FB_ACTIVATE_ALL) -+ fbi->fb.disp->var = *dvar; -+ -+ /* -+ * If the console has changed and the console has defined -+ * a changevar function, call that function. -+ */ -+ if (chgvar && info && fbi->fb.changevar) -+ fbi->fb.changevar(con); -+ -+ /* If the current console is selected, activate the new var. */ -+ if (con != fbi->currcon) -+ return 0; -+ -+ pxafb_hw_set_var(dvar, fbi); -+ -+ return 0; -+} -+ -+static int -+__do_set_cmap(struct fb_cmap *cmap, int kspc, int con, -+ struct fb_info *info) -+{ -+ struct pxafb_info *fbi = (struct pxafb_info *)info; -+ struct fb_cmap *dcmap = get_con_cmap(info, con); -+ int err = 0; -+ -+ if (con == -1) -+ con = fbi->currcon; -+ -+ /* no colormap allocated? (we always have "this" colour map allocated) */ -+ if (con >= 0) -+ err = fb_alloc_cmap(&fb_display[con].cmap, fbi->palette_size, 0); -+ -+ if (!err && con == fbi->currcon) -+ err = fb_set_cmap(cmap, kspc, pxafb_setcolreg, info); -+ -+ if (!err) -+ fb_copy_cmap(cmap, dcmap, kspc ? 0 : 1); -+ -+ return err; -+} -+ -+static int -+pxafb_set_cmap(struct fb_cmap *cmap, int kspc, int con, -+ struct fb_info *info) -+{ -+ struct display *disp = get_con_display(info, con); -+ -+ if (disp->visual == FB_VISUAL_TRUECOLOR) -+ return -EINVAL; -+ -+ return __do_set_cmap(cmap, kspc, con, info); -+} -+ -+static int -+pxafb_get_fix(struct fb_fix_screeninfo *fix, int con, struct fb_info *info) -+{ -+ struct display *display = get_con_display(info, con); -+ -+ *fix = info->fix; -+ -+ fix->line_length = display->line_length; -+ fix->visual = display->visual; -+ return 0; -+} -+ -+static int -+pxafb_get_var(struct fb_var_screeninfo *var, int con, struct fb_info *info) -+{ -+ *var = *get_con_var(info, con); -+ return 0; -+} -+ -+static int -+pxafb_get_cmap(struct fb_cmap *cmap, int kspc, int con, struct fb_info *info) -+{ -+ struct fb_cmap *dcmap = get_con_cmap(info, con); -+ fb_copy_cmap(dcmap, cmap, kspc ? 0 : 2); -+ return 0; -+} -+ -+static struct fb_ops pxafb_ops = { -+ owner: THIS_MODULE, -+ fb_get_fix: pxafb_get_fix, -+ fb_get_var: pxafb_get_var, -+ fb_set_var: pxafb_set_var, -+ fb_get_cmap: pxafb_get_cmap, -+ fb_set_cmap: pxafb_set_cmap, -+}; -+ -+/* -+ * pxafb_switch(): -+ * Change to the specified console. Palette and video mode -+ * are changed to the console's stored parameters. -+ * -+ * Uh oh, this can be called from a tasklet (IRQ) -+ */ -+static int pxafb_switch(int con, struct fb_info *info) -+{ -+ struct pxafb_info *fbi = (struct pxafb_info *)info; -+ struct display *disp; -+ struct fb_cmap *cmap; -+ -+ DPRINTK("con=%d info->modename=%s\n", con, fbi->fb.modename); -+ -+ if (con == fbi->currcon) -+ return 0; -+ -+ if (fbi->currcon >= 0) { -+ disp = fb_display + fbi->currcon; -+ -+ /* -+ * Save the old colormap and video mode. -+ */ -+ disp->var = fbi->fb.var; -+ -+ if (disp->cmap.len) -+ fb_copy_cmap(&fbi->fb.cmap, &disp->cmap, 0); -+ } -+ -+ fbi->currcon = con; -+ disp = fb_display + con; -+ -+ /* -+ * Make sure that our colourmap contains 256 entries. -+ */ -+ fb_alloc_cmap(&fbi->fb.cmap, 256, 0); -+ -+ if (disp->cmap.len) -+ cmap = &disp->cmap; -+ else -+ cmap = fb_default_cmap(1 << disp->var.bits_per_pixel); -+ -+ fb_copy_cmap(cmap, &fbi->fb.cmap, 0); -+ -+ fbi->fb.var = disp->var; -+ fbi->fb.var.activate = FB_ACTIVATE_NOW; -+ -+ pxafb_set_var(&fbi->fb.var, con, info); -+ return 0; -+} -+ -+/* -+ * Formal definition of the VESA spec: -+ * On -+ * This refers to the state of the display when it is in full operation -+ * Stand-By -+ * This defines an optional operating state of minimal power reduction with -+ * the shortest recovery time -+ * Suspend -+ * This refers to a level of power management in which substantial power -+ * reduction is achieved by the display. The display can have a longer -+ * recovery time from this state than from the Stand-by state -+ * Off -+ * This indicates that the display is consuming the lowest level of power -+ * and is non-operational. Recovery from this state may optionally require -+ * the user to manually power on the monitor -+ * -+ * Now, the fbdev driver adds an additional state, (blank), where they -+ * turn off the video (maybe by colormap tricks), but don't mess with the -+ * video itself: think of it semantically between on and Stand-By. -+ * -+ * So here's what we should do in our fbdev blank routine: -+ * -+ * VESA_NO_BLANKING (mode 0) Video on, front/back light on -+ * VESA_VSYNC_SUSPEND (mode 1) Video on, front/back light off -+ * VESA_HSYNC_SUSPEND (mode 2) Video on, front/back light off -+ * VESA_POWERDOWN (mode 3) Video off, front/back light off -+ * -+ * This will match the matrox implementation. -+ */ -+/* -+ * pxafb_blank(): -+ * Blank the display by setting all palette values to zero. Note, the -+ * 12 and 16 bpp modes don't really use the palette, so this will not -+ * blank the display in all modes. -+ */ -+static void pxafb_blank(int blank, struct fb_info *info) -+{ -+ struct pxafb_info *fbi = (struct pxafb_info *)info; -+ int i; -+ -+ DPRINTK("pxafb_blank: blank=%d info->modename=%s\n", blank, -+ fbi->fb.modename); -+ -+ switch (blank) { -+ case VESA_POWERDOWN: -+ case VESA_VSYNC_SUSPEND: -+ case VESA_HSYNC_SUSPEND: -+ if (fbi->fb.disp->visual == FB_VISUAL_PSEUDOCOLOR || -+ fbi->fb.disp->visual == FB_VISUAL_STATIC_PSEUDOCOLOR) -+ for (i = 0; i < fbi->palette_size; i++) -+ pxafb_setpalettereg(i, 0, 0, 0, 0, info); -+ pxafb_schedule_task(fbi, C_DISABLE); -+ if (pxafb_blank_helper) -+ pxafb_blank_helper(blank); -+ break; -+ -+ case VESA_NO_BLANKING: -+ if (pxafb_blank_helper) -+ pxafb_blank_helper(blank); -+ if (fbi->fb.disp->visual == FB_VISUAL_PSEUDOCOLOR || -+ fbi->fb.disp->visual == FB_VISUAL_STATIC_PSEUDOCOLOR) -+ fb_set_cmap(&fbi->fb.cmap, 1, pxafb_setcolreg, info); -+ pxafb_schedule_task(fbi, C_ENABLE); -+ } -+} -+ -+static int pxafb_updatevar(int con, struct fb_info *info) -+{ -+ DPRINTK("entered\n"); -+ return 0; -+} -+ -+/* -+ * Calculate the PCD value from the clock rate (in picoseconds). -+ * We take account of the PPCR clock setting. -+ */ -+static inline int get_pcd(unsigned int pixclock) -+{ -+ unsigned int pcd; -+ -+ if (pixclock) { -+ pcd = get_lclk_frequency_10khz() * pixclock; -+ pcd /= 100000000; -+ pcd += 1; /* make up for integer math truncations */ -+ } else { -+ printk(KERN_WARNING "Please convert me to use the PCD calculations\n"); -+ pcd = 0; -+ } -+ return pcd; -+} -+ -+/* -+ * pxafb_activate_var(): -+ * Configures LCD Controller based on entries in var parameter. Settings are -+ * only written to the controller if changes were made. -+ */ -+static int pxafb_activate_var(struct fb_var_screeninfo *var, struct pxafb_info *fbi) -+{ -+ struct pxafb_lcd_reg new_regs; -+// u_int pcd = get_pcd(var->pixclock); -+ u_long flags; -+ -+ DPRINTK("Configuring PXA LCD\n"); -+ -+ DPRINTK("var: xres=%d hslen=%d lm=%d rm=%d\n", -+ var->xres, var->hsync_len, -+ var->left_margin, var->right_margin); -+ DPRINTK("var: yres=%d vslen=%d um=%d bm=%d\n", -+ var->yres, var->vsync_len, -+ var->upper_margin, var->lower_margin); -+ -+#if DEBUG_VAR -+ if (var->xres < 16 || var->xres > 1024) -+ printk(KERN_ERR "%s: invalid xres %d\n", -+ fbi->fb.fix.id, var->xres); -+ if (var->hsync_len < 1 || var->hsync_len > 64) -+ printk(KERN_ERR "%s: invalid hsync_len %d\n", -+ fbi->fb.fix.id, var->hsync_len); -+ if (var->left_margin < 1 || var->left_margin > 255) -+ printk(KERN_ERR "%s: invalid left_margin %d\n", -+ fbi->fb.fix.id, var->left_margin); -+ if (var->right_margin < 1 || var->right_margin > 255) -+ printk(KERN_ERR "%s: invalid right_margin %d\n", -+ fbi->fb.fix.id, var->right_margin); -+ if (var->yres < 1 || var->yres > 1024) -+ printk(KERN_ERR "%s: invalid yres %d\n", -+ fbi->fb.fix.id, var->yres); -+ if (var->vsync_len < 1 || var->vsync_len > 64) -+ printk(KERN_ERR "%s: invalid vsync_len %d\n", -+ fbi->fb.fix.id, var->vsync_len); -+ if (var->upper_margin < 0 || var->upper_margin > 255) -+ printk(KERN_ERR "%s: invalid upper_margin %d\n", -+ fbi->fb.fix.id, var->upper_margin); -+ if (var->lower_margin < 0 || var->lower_margin > 255) -+ printk(KERN_ERR "%s: invalid lower_margin %d\n", -+ fbi->fb.fix.id, var->lower_margin); -+#endif -+ -+#if defined (CONFIG_PXA_CERF_PDA) -+ new_regs.lccr0 = fbi->lccr0; -+ new_regs.lccr1 = -+ LCCR1_DisWdth(var->xres) + -+ LCCR1_HorSnchWdth(var->hsync_len) + -+ LCCR1_BegLnDel(var->left_margin) + -+ LCCR1_EndLnDel(var->right_margin); -+ -+ new_regs.lccr2 = -+ LCCR2_DisHght(var->yres) + -+ LCCR2_VrtSnchWdth(var->vsync_len) + -+ LCCR2_BegFrmDel(var->upper_margin) + -+ LCCR2_EndFrmDel(var->lower_margin); -+ -+ new_regs.lccr3 = fbi->lccr3 -+ | -+ (var->sync & FB_SYNC_HOR_HIGH_ACT ? LCCR3_HorSnchH : LCCR3_HorSnchL) | -+ (var->sync & FB_SYNC_VERT_HIGH_ACT ? LCCR3_VrtSnchH : LCCR3_VrtSnchL); -+#elif defined (CONFIG_FB_PXA_QVGA) -+ new_regs.lccr0 = fbi->lccr0; -+ new_regs.lccr1 = -+ LCCR1_DisWdth(var->xres) + -+ LCCR1_HorSnchWdth(var->hsync_len) + -+ LCCR1_BegLnDel(var->left_margin) + -+ LCCR1_EndLnDel(var->right_margin); -+ new_regs.lccr2 = -+ LCCR2_DisHght(var->yres) + -+ LCCR2_VrtSnchWdth(var->vsync_len) + -+ LCCR2_BegFrmDel(var->upper_margin) + -+ LCCR2_EndFrmDel(var->lower_margin); -+ new_regs.lccr3 = fbi->lccr3; -+#else -+ // FIXME using hardcoded values for now -+ new_regs.lccr0 = fbi->lccr0; -+// | -+// LCCR0_LEN | LCCR0_LDM | LCCR0_BAM | -+// LCCR0_ERM | LCCR0_LtlEnd | LCCR0_DMADel(0); -+ -+ new_regs.lccr1 = 0x3030A7F; -+// LCCR1_DisWdth(var->xres) + -+// LCCR1_HorSnchWdth(var->hsync_len) + -+// LCCR1_BegLnDel(var->left_margin) + -+// LCCR1_EndLnDel(var->right_margin); -+ -+ new_regs.lccr2 = 0x4EF; -+// LCCR2_DisHght(var->yres) + -+// LCCR2_VrtSnchWdth(var->vsync_len) + -+// LCCR2_BegFrmDel(var->upper_margin) + -+// LCCR2_EndFrmDel(var->lower_margin); -+ -+ new_regs.lccr3 = fbi->lccr3; -+// | -+// (var->sync & FB_SYNC_HOR_HIGH_ACT ? LCCR3_HorSnchH : LCCR3_HorSnchL) | -+// (var->sync & FB_SYNC_VERT_HIGH_ACT ? LCCR3_VrtSnchH : LCCR3_VrtSnchL) | -+// LCCR3_ACBsCntOff; -+#endif -+ -+// if (pcd) -+// new_regs.lccr3 |= LCCR3_PixClkDiv(pcd); -+ -+ DPRINTK("nlccr0 = 0x%08x\n", new_regs.lccr0); -+ DPRINTK("nlccr1 = 0x%08x\n", new_regs.lccr1); -+ DPRINTK("nlccr2 = 0x%08x\n", new_regs.lccr2); -+ DPRINTK("nlccr3 = 0x%08x\n", new_regs.lccr3); -+ -+ /* Update shadow copy atomically */ -+ local_irq_save(flags); -+ -+ /* setup dma descriptors */ -+ fbi->dmadesc_fblow_cpu = (struct pxafb_dma_descriptor *)((unsigned int)fbi->palette_cpu - 3*16); -+ fbi->dmadesc_fbhigh_cpu = (struct pxafb_dma_descriptor *)((unsigned int)fbi->palette_cpu - 2*16); -+ fbi->dmadesc_palette_cpu = (struct pxafb_dma_descriptor *)((unsigned int)fbi->palette_cpu - 1*16); -+ -+ fbi->dmadesc_fblow_dma = fbi->palette_dma - 3*16; -+ fbi->dmadesc_fbhigh_dma = fbi->palette_dma - 2*16; -+ fbi->dmadesc_palette_dma = fbi->palette_dma - 1*16; -+ -+ #define BYTES_PER_PANEL ((fbi->lccr0 & LCCR0_SDS) ? (var->xres * var->yres * var->bits_per_pixel / 8 / 2) : \ -+ (var->xres * var->yres * var->bits_per_pixel / 8)) -+ -+ /* populate descriptors */ -+ fbi->dmadesc_fblow_cpu->fdadr = fbi->dmadesc_fblow_dma; -+ fbi->dmadesc_fblow_cpu->fsadr = fbi->screen_dma + BYTES_PER_PANEL; -+ fbi->dmadesc_fblow_cpu->fidr = 0; -+ fbi->dmadesc_fblow_cpu->ldcmd = BYTES_PER_PANEL; -+ -+ fbi->fdadr1 = fbi->dmadesc_fblow_dma; /* only used in dual-panel mode */ -+ -+ fbi->dmadesc_fbhigh_cpu->fsadr = fbi->screen_dma; -+ fbi->dmadesc_fbhigh_cpu->fidr = 0; -+ fbi->dmadesc_fbhigh_cpu->ldcmd = BYTES_PER_PANEL; -+ -+ fbi->dmadesc_palette_cpu->fsadr = fbi->palette_dma; -+ fbi->dmadesc_palette_cpu->fidr = 0; -+ fbi->dmadesc_palette_cpu->ldcmd = (fbi->palette_size * 2) | LDCMD_PAL; -+ -+ if( var->bits_per_pixel < 12) -+ { -+ /* assume any mode with <12 bpp is palette driven */ -+ fbi->dmadesc_palette_cpu->fdadr = fbi->dmadesc_fbhigh_dma; -+ fbi->dmadesc_fbhigh_cpu->fdadr = fbi->dmadesc_palette_dma; -+ fbi->fdadr0 = fbi->dmadesc_palette_dma; /* flips back and forth between pal and fbhigh */ -+ } -+ else -+ { -+ /* palette shouldn't be loaded in true-color mode */ -+ fbi->dmadesc_fbhigh_cpu->fdadr = fbi->dmadesc_fbhigh_dma; -+ fbi->fdadr0 = fbi->dmadesc_fbhigh_dma; /* no pal just fbhigh */ -+ } -+ -+ DPRINTK("fbi->dmadesc_fblow_cpu = 0x%x\n", fbi->dmadesc_fblow_cpu); -+ DPRINTK("fbi->dmadesc_fbhigh_cpu = 0x%x\n", fbi->dmadesc_fbhigh_cpu); -+ DPRINTK("fbi->dmadesc_palette_cpu = 0x%x\n", fbi->dmadesc_palette_cpu); -+ DPRINTK("fbi->dmadesc_fblow_dma = 0x%x\n", fbi->dmadesc_fblow_dma); -+ DPRINTK("fbi->dmadesc_fbhigh_dma = 0x%x\n", fbi->dmadesc_fbhigh_dma); -+ DPRINTK("fbi->dmadesc_palette_dma = 0x%x\n", fbi->dmadesc_palette_dma); -+ -+ DPRINTK("fbi->dmadesc_fblow_cpu->fdadr = 0x%x\n", fbi->dmadesc_fblow_cpu->fdadr); -+ DPRINTK("fbi->dmadesc_fbhigh_cpu->fdadr = 0x%x\n", fbi->dmadesc_fbhigh_cpu->fdadr); -+ DPRINTK("fbi->dmadesc_palette_cpu->fdadr = 0x%x\n", fbi->dmadesc_palette_cpu->fdadr); -+ -+ DPRINTK("fbi->dmadesc_fblow_cpu->fsadr = 0x%x\n", fbi->dmadesc_fblow_cpu->fsadr); -+ DPRINTK("fbi->dmadesc_fbhigh_cpu->fsadr = 0x%x\n", fbi->dmadesc_fbhigh_cpu->fsadr); -+ DPRINTK("fbi->dmadesc_palette_cpu->fsadr = 0x%x\n", fbi->dmadesc_palette_cpu->fsadr); -+ -+ DPRINTK("fbi->dmadesc_fblow_cpu->ldcmd = 0x%x\n", fbi->dmadesc_fblow_cpu->ldcmd); -+ DPRINTK("fbi->dmadesc_fbhigh_cpu->ldcmd = 0x%x\n", fbi->dmadesc_fbhigh_cpu->ldcmd); -+ DPRINTK("fbi->dmadesc_palette_cpu->ldcmd = 0x%x\n", fbi->dmadesc_palette_cpu->ldcmd); -+ -+ fbi->reg_lccr0 = new_regs.lccr0; -+ fbi->reg_lccr1 = new_regs.lccr1; -+ fbi->reg_lccr2 = new_regs.lccr2; -+ fbi->reg_lccr3 = new_regs.lccr3; -+ local_irq_restore(flags); -+ -+ /* -+ * Only update the registers if the controller is enabled -+ * and something has changed. -+ */ -+ if ((LCCR0 != fbi->reg_lccr0) || (LCCR1 != fbi->reg_lccr1) || -+ (LCCR2 != fbi->reg_lccr2) || (LCCR3 != fbi->reg_lccr3) || -+ (FDADR0 != fbi->fdadr0) || (FDADR1 != fbi->fdadr1)) -+ pxafb_schedule_task(fbi, C_REENABLE); -+ -+ return 0; -+} -+ -+/* -+ * NOTE! The following functions are purely helpers for set_ctrlr_state. -+ * Do not call them directly; set_ctrlr_state does the correct serialisation -+ * to ensure that things happen in the right way 100% of time time. -+ * -- rmk -+ */ -+ -+/* -+ * FIXME: move LCD power stuff into pxafb_power_up_lcd() -+ * Also, I'm expecting that the backlight stuff should -+ * be handled differently. -+ */ -+static void pxafb_backlight_on(struct pxafb_info *fbi) -+{ -+ DPRINTK("backlight on\n"); -+ -+#ifdef CONFIG_ARCH_PXA_IDP -+ if(machine_is_pxa_idp()) { -+ FB_BACKLIGHT_ON(); -+ } -+#endif -+} -+ -+/* -+ * FIXME: move LCD power stuf into pxafb_power_down_lcd() -+ * Also, I'm expecting that the backlight stuff should -+ * be handled differently. -+ */ -+static void pxafb_backlight_off(struct pxafb_info *fbi) -+{ -+ DPRINTK("backlight off\n"); -+ -+#ifdef CONFIG_ARCH_PXA_IDP -+ if(machine_is_pxa_idp()) { -+ FB_BACKLIGHT_OFF(); -+ } -+#endif -+ -+} -+ -+static void pxafb_power_up_lcd(struct pxafb_info *fbi) -+{ -+ DPRINTK("LCD power on\n"); -+ CKEN |= CKEN16_LCD; -+ -+ if(machine_is_pxa_cerf()) { -+ lcdctrl_enable(); -+ } -+ -+#if CONFIG_ARCH_PXA_IDP -+ /* set GPIOs, etc */ -+ if(machine_is_pxa_idp()) { -+ // FIXME need to add proper delays -+ FB_PWR_ON(); -+ FB_VLCD_ON(); // FIXME this should be after scanning starts -+ } -+#endif -+} -+ -+static void pxafb_power_down_lcd(struct pxafb_info *fbi) -+{ -+ DPRINTK("LCD power off\n"); -+ CKEN &= ~CKEN16_LCD; -+ -+ if(machine_is_pxa_cerf()) { -+ lcdctrl_disable(); -+ } -+ -+ /* set GPIOs, etc */ -+#if CONFIG_ARCH_PXA_IDP -+ if(machine_is_pxa_idp()) { -+ // FIXME need to add proper delays -+ FB_PWR_OFF(); -+ FB_VLCD_OFF(); // FIXME this should be before scanning stops -+ } -+#endif -+ -+} -+ -+static void pxafb_setup_gpio(struct pxafb_info *fbi) -+{ -+ unsigned int lccr0; -+ -+ /* -+ * setup is based on type of panel supported -+ */ -+ -+ lccr0 = fbi->lccr0; -+ -+ /* 4 bit interface */ -+ if ((lccr0 & LCCR0_CMS) && (lccr0 & LCCR0_SDS) && !(lccr0 & LCCR0_DPD)) -+ { -+ // bits 58-61 -+ GPDR1 |= (0xf << 26); -+ GAFR1_U = (GAFR1_U & ~(0xff << 20)) | (0xaa << 20); -+ -+ // bits 74-77 -+ GPDR2 |= (0xf << 10); -+ GAFR2_L = (GAFR2_L & ~(0xff << 20)) | (0xaa << 20); -+ } -+ -+ /* 8 bit interface */ -+ else if (((lccr0 & LCCR0_CMS) && ((lccr0 & LCCR0_SDS) || (lccr0 & LCCR0_DPD))) || -+ (!(lccr0 & LCCR0_CMS) && !(lccr0 & LCCR0_PAS) && !(lccr0 & LCCR0_SDS))) -+ { -+ // bits 58-65 -+ GPDR1 |= (0x3f << 26); -+ GPDR2 |= (0x3); -+ -+ GAFR1_U = (GAFR1_U & ~(0xfff << 20)) | (0xaaa << 20); -+ GAFR2_L = (GAFR2_L & ~0xf) | (0xa); -+ -+ // bits 74-77 -+ GPDR2 |= (0xf << 10); -+ GAFR2_L = (GAFR2_L & ~(0xff << 20)) | (0xaa << 20); -+ } -+ -+ /* 16 bit interface */ -+ else if (!(lccr0 & LCCR0_CMS) && ((lccr0 & LCCR0_SDS) || (lccr0 & LCCR0_PAS))) -+ { -+ // bits 58-77 -+ GPDR1 |= (0x3f << 26); -+ GPDR2 |= 0x00003fff; -+ -+ GAFR1_U = (GAFR1_U & ~(0xfff << 20)) | (0xaaa << 20); -+ GAFR2_L = (GAFR2_L & 0xf0000000) | 0x0aaaaaaa; -+ } -+ else -+ { -+ printk( KERN_ERR "pxafb_setup_gpio: unable to determine bits per pixel\n"); -+ } -+} -+ -+static void pxafb_enable_controller(struct pxafb_info *fbi) -+{ -+ DPRINTK("Enabling LCD controller\n"); -+ -+ /* Sequence from 11.7.10 */ -+ LCCR3 = fbi->reg_lccr3; -+ LCCR2 = fbi->reg_lccr2; -+ LCCR1 = fbi->reg_lccr1; -+ LCCR0 = fbi->reg_lccr0 & ~LCCR0_ENB; -+ -+ /* FIXME we used to have LCD power control here */ -+ -+ FDADR0 = fbi->fdadr0; -+ FDADR1 = fbi->fdadr1; -+ LCCR0 |= LCCR0_ENB; -+ -+ DPRINTK("FDADR0 = 0x%08x\n", (unsigned int)FDADR0); -+ DPRINTK("FDADR1 = 0x%08x\n", (unsigned int)FDADR1); -+ DPRINTK("LCCR0 = 0x%08x\n", (unsigned int)LCCR0); -+ DPRINTK("LCCR1 = 0x%08x\n", (unsigned int)LCCR1); -+ DPRINTK("LCCR2 = 0x%08x\n", (unsigned int)LCCR2); -+ DPRINTK("LCCR3 = 0x%08x\n", (unsigned int)LCCR3); -+} -+ -+static void pxafb_disable_controller(struct pxafb_info *fbi) -+{ -+ DECLARE_WAITQUEUE(wait, current); -+ -+ DPRINTK("Disabling LCD controller\n"); -+ -+ /* FIXME add power down GPIO stuff here */ -+ -+ add_wait_queue(&fbi->ctrlr_wait, &wait); -+ set_current_state(TASK_UNINTERRUPTIBLE); -+ -+ LCSR = 0xffffffff; /* Clear LCD Status Register */ -+ LCCR0 &= ~LCCR0_LDM; /* Enable LCD Disable Done Interrupt */ -+ LCCR0 &= ~LCCR0_ENB; /* Disable LCD Controller */ -+ -+ schedule_timeout(20 * HZ / 1000); -+ current->state = TASK_RUNNING; -+ remove_wait_queue(&fbi->ctrlr_wait, &wait); -+} -+ -+/* -+ * pxafb_handle_irq: Handle 'LCD DONE' interrupts. -+ */ -+static void pxafb_handle_irq(int irq, void *dev_id, struct pt_regs *regs) -+{ -+ struct pxafb_info *fbi = dev_id; -+ unsigned int lcsr = LCSR; -+ -+ if (lcsr & LCSR_LDD) { -+ LCCR0 |= LCCR0_LDM; -+ wake_up(&fbi->ctrlr_wait); -+ } -+ -+ LCSR = lcsr; -+} -+ -+/* -+ * This function must be called from task context only, since it will -+ * sleep when disabling the LCD controller, or if we get two contending -+ * processes trying to alter state. -+ */ -+static void set_ctrlr_state(struct pxafb_info *fbi, u_int state) -+{ -+ u_int old_state; -+ -+ down(&fbi->ctrlr_sem); -+ -+ old_state = fbi->state; -+ -+ switch (state) { -+ case C_DISABLE_CLKCHANGE: -+ /* -+ * Disable controller for clock change. If the -+ * controller is already disabled, then do nothing. -+ */ -+ if (old_state != C_DISABLE) { -+ fbi->state = state; -+ pxafb_disable_controller(fbi); -+ } -+ break; -+ -+ case C_DISABLE: -+ /* -+ * Disable controller -+ */ -+ if (old_state != C_DISABLE) { -+ fbi->state = state; -+ -+ pxafb_backlight_off(fbi); -+ if (old_state != C_DISABLE_CLKCHANGE) -+ pxafb_disable_controller(fbi); -+ pxafb_power_down_lcd(fbi); -+ } -+ break; -+ -+ case C_ENABLE_CLKCHANGE: -+ /* -+ * Enable the controller after clock change. Only -+ * do this if we were disabled for the clock change. -+ */ -+ if (old_state == C_DISABLE_CLKCHANGE) { -+ fbi->state = C_ENABLE; -+ pxafb_enable_controller(fbi); -+ } -+ break; -+ -+ case C_REENABLE: -+ /* -+ * Re-enable the controller only if it was already -+ * enabled. This is so we reprogram the control -+ * registers. -+ */ -+ if (old_state == C_ENABLE) { -+ pxafb_disable_controller(fbi); -+ pxafb_setup_gpio(fbi); -+ pxafb_enable_controller(fbi); -+ } -+ break; -+ -+ case C_ENABLE: -+ /* -+ * Power up the LCD screen, enable controller, and -+ * turn on the backlight. -+ */ -+ if (old_state != C_ENABLE) { -+ fbi->state = C_ENABLE; -+ pxafb_setup_gpio(fbi); -+ pxafb_power_up_lcd(fbi); -+ pxafb_enable_controller(fbi); -+ pxafb_backlight_on(fbi); -+ } -+ break; -+ } -+ up(&fbi->ctrlr_sem); -+} -+ -+/* -+ * Our LCD controller task (which is called when we blank or unblank) -+ * via keventd. -+ */ -+static void pxafb_task(void *dummy) -+{ -+ struct pxafb_info *fbi = dummy; -+ u_int state = xchg(&fbi->task_state, -1); -+ -+ set_ctrlr_state(fbi, state); -+} -+ -+#ifdef CONFIG_CPU_FREQ -+/* -+ * CPU clock speed change handler. We need to adjust the LCD timing -+ * parameters when the CPU clock is adjusted by the power management -+ * subsystem. -+ */ -+static int -+pxafb_clkchg_notifier(struct notifier_block *nb, unsigned long val, -+ void *data) -+{ -+ struct pxafb_info *fbi = TO_INF(nb, clockchg); -+ u_int pcd; -+ -+ switch (val) { -+ case CPUFREQ_MINMAX: -+ /* todo: fill in min/max values */ -+ break; -+ -+ case CPUFREQ_PRECHANGE: -+ set_ctrlr_state(fbi, C_DISABLE_CLKCHANGE); -+ break; -+ -+ case CPUFREQ_POSTCHANGE: -+ pcd = get_pcd(fbi->fb.var.pixclock); -+ fbi->reg_lccr3 = (fbi->reg_lccr3 & ~0xff) | LCCR3_PixClkDiv(pcd); -+ set_ctrlr_state(fbi, C_ENABLE_CLKCHANGE); -+ break; -+ } -+ return 0; -+} -+#endif -+ -+#ifdef CONFIG_PM -+/* -+ * Power management hook. Note that we won't be called from IRQ context, -+ * unlike the blank functions above, so we may sleep. -+ */ -+static int -+pxafb_pm_callback(struct pm_dev *pm_dev, pm_request_t req, void *data) -+{ -+ struct pxafb_info *fbi = pm_dev->data; -+ -+ DPRINTK("pm_callback: %d\n", req); -+ -+ if (req == PM_SUSPEND || req == PM_RESUME) { -+ int state = (int)data; -+ -+ if (state == 0) { -+ /* Enter D0. */ -+ set_ctrlr_state(fbi, C_ENABLE); -+ } else { -+ /* Enter D1-D3. Disable the LCD controller. */ -+ set_ctrlr_state(fbi, C_DISABLE); -+ } -+ } -+ DPRINTK("done\n"); -+ return 0; -+} -+#endif -+ -+/* -+ * pxafb_map_video_memory(): -+ * Allocates the DRAM memory for the frame buffer. This buffer is -+ * remapped into a non-cached, non-buffered, memory region to -+ * allow palette and pixel writes to occur without flushing the -+ * cache. Once this area is remapped, all virtual memory -+ * access to the video memory should occur at the new region. -+ */ -+static int __init pxafb_map_video_memory(struct pxafb_info *fbi) -+{ -+ u_long palette_mem_size; -+ -+ /* -+ * We reserve one page for the palette, plus the size -+ * of the framebuffer. -+ * -+ * layout of stuff in memory -+ * -+ * fblow descriptor -+ * fbhigh descriptor -+ * palette descriptor -+ * palette -+ * page boundary-> -+ * frame buffer -+ */ -+ fbi->map_size = PAGE_ALIGN(fbi->fb.fix.smem_len + PAGE_SIZE); -+ fbi->map_cpu = consistent_alloc(GFP_KERNEL, fbi->map_size, -+ &fbi->map_dma, PTE_BUFFERABLE); -+ -+ if (fbi->map_cpu) { -+ fbi->screen_cpu = fbi->map_cpu + PAGE_SIZE; -+ fbi->screen_dma = fbi->map_dma + PAGE_SIZE; -+ fbi->fb.fix.smem_start = fbi->screen_dma; -+ -+ fbi->palette_size = fbi->fb.var.bits_per_pixel == 8 ? 256 : 16; -+ -+ palette_mem_size = fbi->palette_size * sizeof(u16); -+ -+ DPRINTK("palette_mem_size = 0x%08lx\n", (u_long) palette_mem_size); -+ -+ fbi->palette_cpu = (u16 *)(fbi->map_cpu + PAGE_SIZE - palette_mem_size); -+ fbi->palette_dma = fbi->map_dma + PAGE_SIZE - palette_mem_size; -+ -+ } -+ -+ return fbi->map_cpu ? 0 : -ENOMEM; -+} -+ -+/* Fake monspecs to fill in fbinfo structure */ -+static struct fb_monspecs monspecs __initdata = { -+ 30000, 70000, 50, 65, 0 /* Generic */ -+}; -+ -+ -+static struct pxafb_info * __init pxafb_init_fbinfo(void) -+{ -+ struct pxafb_mach_info *inf; -+ struct pxafb_info *fbi; -+ -+ fbi = kmalloc(sizeof(struct pxafb_info) + sizeof(struct display) + -+ sizeof(u16) * 16, GFP_KERNEL); -+ if (!fbi) -+ return NULL; -+ -+ memset(fbi, 0, sizeof(struct pxafb_info) + sizeof(struct display)); -+ -+ fbi->currcon = -1; -+ -+ strcpy(fbi->fb.fix.id, PXA_NAME); -+ -+ fbi->fb.fix.type = FB_TYPE_PACKED_PIXELS; -+ fbi->fb.fix.type_aux = 0; -+ fbi->fb.fix.xpanstep = 0; -+ fbi->fb.fix.ypanstep = 0; -+ fbi->fb.fix.ywrapstep = 0; -+ fbi->fb.fix.accel = FB_ACCEL_NONE; -+ -+ fbi->fb.var.nonstd = 0; -+ fbi->fb.var.activate = FB_ACTIVATE_NOW; -+ fbi->fb.var.height = -1; -+ fbi->fb.var.width = -1; -+ fbi->fb.var.accel_flags = 0; -+ fbi->fb.var.vmode = FB_VMODE_NONINTERLACED; -+ -+ strcpy(fbi->fb.modename, PXA_NAME); -+ strcpy(fbi->fb.fontname, "Acorn8x8"); -+ -+ fbi->fb.fbops = &pxafb_ops; -+ fbi->fb.changevar = NULL; -+ fbi->fb.switch_con = pxafb_switch; -+ fbi->fb.updatevar = pxafb_updatevar; -+ fbi->fb.blank = pxafb_blank; -+ fbi->fb.flags = FBINFO_FLAG_DEFAULT; -+ fbi->fb.node = -1; -+ fbi->fb.monspecs = monspecs; -+ fbi->fb.disp = (struct display *)(fbi + 1); -+ fbi->fb.pseudo_palette = (void *)(fbi->fb.disp + 1); -+ -+ fbi->rgb[RGB_8] = &rgb_8; -+ fbi->rgb[RGB_16] = &def_rgb_16; -+ -+ inf = pxafb_get_machine_info(fbi); -+ -+ fbi->max_xres = inf->xres; -+ fbi->fb.var.xres = inf->xres; -+ fbi->fb.var.xres_virtual = inf->xres; -+ fbi->max_yres = inf->yres; -+ fbi->fb.var.yres = inf->yres; -+ fbi->fb.var.yres_virtual = inf->yres; -+ fbi->max_bpp = inf->bpp; -+ fbi->fb.var.bits_per_pixel = inf->bpp; -+ fbi->fb.var.pixclock = inf->pixclock; -+ fbi->fb.var.hsync_len = inf->hsync_len; -+ fbi->fb.var.left_margin = inf->left_margin; -+ fbi->fb.var.right_margin = inf->right_margin; -+ fbi->fb.var.vsync_len = inf->vsync_len; -+ fbi->fb.var.upper_margin = inf->upper_margin; -+ fbi->fb.var.lower_margin = inf->lower_margin; -+ fbi->fb.var.sync = inf->sync; -+ fbi->fb.var.grayscale = inf->cmap_greyscale; -+ fbi->cmap_inverse = inf->cmap_inverse; -+ fbi->cmap_static = inf->cmap_static; -+ fbi->lccr0 = inf->lccr0; -+ fbi->lccr3 = inf->lccr3; -+ fbi->state = C_DISABLE; -+ fbi->task_state = (u_char)-1; -+ fbi->fb.fix.smem_len = fbi->max_xres * fbi->max_yres * -+ fbi->max_bpp / 8; -+ -+ init_waitqueue_head(&fbi->ctrlr_wait); -+ INIT_TQUEUE(&fbi->task, pxafb_task, fbi); -+ init_MUTEX(&fbi->ctrlr_sem); -+ -+ return fbi; -+} -+ -+int __init pxafb_init(void) -+{ -+ struct pxafb_info *fbi; -+ int ret; -+ -+ fbi = pxafb_init_fbinfo(); -+ ret = -ENOMEM; -+ if (!fbi) -+ goto failed; -+ -+ if(machine_is_pxa_cerf()) { -+ // brightness&contrast is handled via lcdctrl. -+ lcdctrl_init(); -+ } -+ -+ /* Initialize video memory */ -+ ret = pxafb_map_video_memory(fbi); -+ if (ret) -+ goto failed; -+ -+ ret = request_irq(IRQ_LCD, pxafb_handle_irq, SA_INTERRUPT, -+ "LCD", fbi); -+ if (ret) { -+ printk(KERN_ERR "pxafb: failed in request_irq: %d\n", ret); -+ goto failed; -+ } -+ -+ pxafb_set_var(&fbi->fb.var, -1, &fbi->fb); -+ -+ ret = register_framebuffer(&fbi->fb); -+ if (ret < 0) -+ goto failed; -+ -+#ifdef CONFIG_PM -+ /* -+ * Note that the console registers this as well, but we want to -+ * power down the display prior to sleeping. -+ */ -+ fbi->pm = pm_register(PM_SYS_DEV, PM_SYS_VGA, pxafb_pm_callback); -+ if (fbi->pm) -+ fbi->pm->data = fbi; -+#endif -+#ifdef CONFIG_CPU_FREQ -+ fbi->clockchg.notifier_call = pxafb_clkchg_notifier; -+ cpufreq_register_notifier(&fbi->clockchg); -+#endif -+ -+ /* -+ * Ok, now enable the LCD controller -+ */ -+ set_ctrlr_state(fbi, C_ENABLE); -+ -+ /* This driver cannot be unloaded at the moment */ -+ MOD_INC_USE_COUNT; -+ -+ return 0; -+ -+failed: -+ if (fbi) -+ kfree(fbi); -+ return ret; -+} -+ -+ -+#ifdef MODULE -+module_init(pxafb_init); -+#endif -+ -+MODULE_DESCRIPTION("loadable framebuffer driver for PXA"); -+MODULE_LICENSE("GPL"); ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/drivers/video/pxafb.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,238 @@ -+/* -+ * linux/drivers/video/pxafb.h -+ * -- Intel PXA250/210 LCD Controller Frame Buffer Device -+ * -+ * Copyright (C) 1999 Eric A. Thomas -+ * Based on acornfb.c Copyright (C) Russell King. -+ * -+ * 2001-08-03: Cliff Brake <cbrake@acclent.com> -+ * - ported SA1100 code to PXA -+ * -+ * This file is subject to the terms and conditions of the GNU General Public -+ * License. See the file COPYING in the main directory of this archive -+ * for more details. -+ */ -+ -+/* -+ * These are the bitfields for each -+ * display depth that we support. -+ */ -+struct pxafb_rgb { -+ struct fb_bitfield red; -+ struct fb_bitfield green; -+ struct fb_bitfield blue; -+ struct fb_bitfield transp; -+}; -+ -+/* -+ * This structure describes the machine which we are running on. -+ */ -+struct pxafb_mach_info { -+ u_long pixclock; -+ -+ u_short xres; -+ u_short yres; -+ -+ u_char bpp; -+ u_char hsync_len; -+ u_char left_margin; -+ u_char right_margin; -+ -+ u_char vsync_len; -+ u_char upper_margin; -+ u_char lower_margin; -+ u_char sync; -+ -+ u_int cmap_greyscale:1, -+ cmap_inverse:1, -+ cmap_static:1, -+ unused:29; -+ -+ u_int lccr0; -+ u_int lccr3; -+}; -+ -+/* Shadows for LCD controller registers */ -+struct pxafb_lcd_reg { -+ unsigned int lccr0; -+ unsigned int lccr1; -+ unsigned int lccr2; -+ unsigned int lccr3; -+}; -+ -+/* PXA LCD DMA descriptor */ -+struct pxafb_dma_descriptor { -+ unsigned int fdadr; -+ unsigned int fsadr; -+ unsigned int fidr; -+ unsigned int ldcmd; -+}; -+ -+#define RGB_8 (0) -+#define RGB_16 (1) -+#define NR_RGB 2 -+ -+struct pxafb_info { -+ struct fb_info fb; -+ signed int currcon; -+ -+ struct pxafb_rgb *rgb[NR_RGB]; -+ -+ u_int max_bpp; -+ u_int max_xres; -+ u_int max_yres; -+ -+ /* -+ * These are the addresses we mapped -+ * the framebuffer memory region to. -+ */ -+ -+ /* raw memory addresses */ -+ dma_addr_t map_dma; /* physical */ -+ u_char * map_cpu; /* virtual */ -+ u_int map_size; -+ -+ /* addresses of pieces placed in raw buffer */ -+ u_char * screen_cpu; /* virtual address of frame buffer */ -+ dma_addr_t screen_dma; /* physical address of frame buffer */ -+ u16 * palette_cpu; /* virtual address of palette memory */ -+ dma_addr_t palette_dma; /* physical address of palette memory */ -+ u_int palette_size; -+ -+ /* DMA descriptors */ -+ struct pxafb_dma_descriptor * dmadesc_fblow_cpu; -+ dma_addr_t dmadesc_fblow_dma; -+ struct pxafb_dma_descriptor * dmadesc_fbhigh_cpu; -+ dma_addr_t dmadesc_fbhigh_dma; -+ struct pxafb_dma_descriptor * dmadesc_palette_cpu; -+ dma_addr_t dmadesc_palette_dma; -+ -+ dma_addr_t fdadr0; -+ dma_addr_t fdadr1; -+ -+ u_int lccr0; -+ u_int lccr3; -+ u_int cmap_inverse:1, -+ cmap_static:1, -+ unused:30; -+ -+ u_int reg_lccr0; -+ u_int reg_lccr1; -+ u_int reg_lccr2; -+ u_int reg_lccr3; -+ -+ volatile u_char state; -+ volatile u_char task_state; -+ struct semaphore ctrlr_sem; -+ wait_queue_head_t ctrlr_wait; -+ struct tq_struct task; -+ -+#ifdef CONFIG_PM -+ struct pm_dev *pm; -+#endif -+#ifdef CONFIG_CPU_FREQ -+ struct notifier_block clockchg; -+#endif -+}; -+ -+#define __type_entry(ptr,type,member) ((type *)((char *)(ptr)-offsetof(type,member))) -+ -+#define TO_INF(ptr,member) __type_entry(ptr,struct pxafb_info,member) -+ -+/* -+ * These are the actions for set_ctrlr_state -+ */ -+#define C_DISABLE (0) -+#define C_ENABLE (1) -+#define C_DISABLE_CLKCHANGE (2) -+#define C_ENABLE_CLKCHANGE (3) -+#define C_REENABLE (4) -+ -+#define PXA_NAME "PXA" -+ -+/* -+ * Debug macros -+ */ -+#if DEBUG -+# define DPRINTK(fmt, args...) printk("%s: " fmt, __FUNCTION__ , ## args) -+#else -+# define DPRINTK(fmt, args...) -+#endif -+ -+/* -+ * Minimum X and Y resolutions -+ */ -+#define MIN_XRES 64 -+#define MIN_YRES 64 -+ -+/* -+ * Are we configured for 8 or 16 bits per pixel? -+ */ -+#ifdef CONFIG_FB_PXA_8BPP -+# define PXAFB_BPP 8 -+# define PXAFB_BPP_BITS 0x03 -+#elif CONFIG_FB_PXA_16BPP -+# define PXAFB_BPP 16 -+# define PXAFB_BPP_BITS 0x04 -+#endif -+ -+#if defined(CONFIG_ARCH_LUBBOCK) -+#define LCD_PIXCLOCK 150000 -+#define LCD_BPP PXAFB_BPP -+#ifdef CONFIG_FB_PXA_QVGA -+#define LCD_XRES 320 -+#define LCD_YRES 240 -+#define LCD_HORIZONTAL_SYNC_PULSE_WIDTH 51 -+#define LCD_VERTICAL_SYNC_PULSE_WIDTH 1 -+#define LCD_BEGIN_OF_LINE_WAIT_COUNT 1 -+#define LCD_BEGIN_FRAME_WAIT_COUNT 8 -+#define LCD_END_OF_LINE_WAIT_COUNT 1 -+#define LCD_END_OF_FRAME_WAIT_COUNT 1 -+#define LCD_SYNC (FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT) -+#define LCD_LCCR0 0x003008F8 -+#define LCD_LCCR3 (0x0040FF0C | (PXAFB_BPP_BITS << 24)) -+#else -+#define LCD_XRES 640 -+#define LCD_YRES 480 -+#define LCD_HORIZONTAL_SYNC_PULSE_WIDTH 1 -+#define LCD_VERTICAL_SYNC_PULSE_WIDTH 1 -+#define LCD_BEGIN_OF_LINE_WAIT_COUNT 3 -+#define LCD_BEGIN_FRAME_WAIT_COUNT 0 -+#define LCD_END_OF_LINE_WAIT_COUNT 3 -+#define LCD_END_OF_FRAME_WAIT_COUNT 0 -+#define LCD_SYNC (FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT) -+#define LCD_LCCR0 0x0030087C -+#define LCD_LCCR3 (0x0040FF0C | (PXAFB_BPP_BITS << 24)) -+#endif -+ -+#elif defined (CONFIG_ARCH_PXA_IDP) -+#define LCD_PIXCLOCK 150000 -+#define LCD_BPP PXAFB_BPP -+#define LCD_XRES 640 -+#define LCD_YRES 480 -+#define LCD_HORIZONTAL_SYNC_PULSE_WIDTH 1 -+#define LCD_VERTICAL_SYNC_PULSE_WIDTH 1 -+#define LCD_BEGIN_OF_LINE_WAIT_COUNT 3 -+#define LCD_BEGIN_FRAME_WAIT_COUNT 0 -+#define LCD_END_OF_LINE_WAIT_COUNT 3 -+#define LCD_END_OF_FRAME_WAIT_COUNT 0 -+#define LCD_SYNC (FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT) -+#define LCD_LCCR0 0x0030087C -+#define LCD_LCCR3 (0x0040FF0C | (PXAFB_BPP_BITS << 24)) -+ -+#elif defined CONFIG_PXA_CERF_PDA -+#define LCD_PIXCLOCK 171521 -+#define LCD_BPP PXAFB_BPP -+#define LCD_XRES 240 -+#define LCD_YRES 320 -+#define LCD_HORIZONTAL_SYNC_PULSE_WIDTH 7 -+#define LCD_VERTICAL_SYNC_PULSE_WIDTH 2 -+#define LCD_BEGIN_OF_LINE_WAIT_COUNT 17 -+#define LCD_BEGIN_FRAME_WAIT_COUNT 0 -+#define LCD_END_OF_LINE_WAIT_COUNT 17 -+#define LCD_END_OF_FRAME_WAIT_COUNT 0 -+#define LCD_SYNC (FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT) -+#define LCD_LCCR0 (LCCR0_LDM | LCCR0_SFM | LCCR0_IUM | LCCR0_EFM | LCCR0_QDM | LCCR0_BM | LCCR0_OUM) -+#define LCD_LCCR3 (LCCR3_PCP | LCCR3_PixClkDiv(0x12) | LCCR3_Bpp(PXAFB_BPP_BITS) | LCCR3_Acb(0x18)) -+ -+#endif ---- linux-2.4.25/drivers/video/sa1100fb.c~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/drivers/video/sa1100fb.c 2004-03-31 17:15:12.000000000 +0200 -@@ -2175,7 +2175,7 @@ - */ - fbi->map_size = PAGE_ALIGN(fbi->fb.fix.smem_len + PAGE_SIZE); - fbi->map_cpu = consistent_alloc(GFP_KERNEL, fbi->map_size, -- &fbi->map_dma); -+ &fbi->map_dma, PTE_BUFFERABLE); - - if (fbi->map_cpu) { - fbi->screen_cpu = fbi->map_cpu + PAGE_SIZE; ---- linux-2.4.25/fs/Config.in~2.4.25-vrs2-pxa1.patch 2004-02-18 14:36:31.000000000 +0100 -+++ linux-2.4.25/fs/Config.in 2004-03-31 17:15:12.000000000 +0200 -@@ -51,6 +51,9 @@ - int 'JFFS2 debugging verbosity (0 = quiet, 2 = noisy)' CONFIG_JFFS2_FS_DEBUG 0 - fi - tristate 'Compressed ROM file system support' CONFIG_CRAMFS -+dep_mbool ' Use linear addressing for cramfs' CONFIG_CRAMFS_LINEAR $CONFIG_CRAMFS -+dep_bool ' Support XIP on linear cramfs' CONFIG_CRAMFS_LINEAR_XIP $CONFIG_CRAMFS_LINEAR -+dep_bool ' Root file system on linear cramfs' CONFIG_ROOT_CRAMFS_LINEAR $CONFIG_CRAMFS_LINEAR - bool 'Virtual memory file system support (former shm fs)' CONFIG_TMPFS - define_bool CONFIG_RAMFS y - ---- linux-2.4.25/fs/cramfs/inode.c~2.4.25-vrs2-pxa1.patch 2002-08-03 02:39:45.000000000 +0200 -+++ linux-2.4.25/fs/cramfs/inode.c 2004-03-31 17:15:12.000000000 +0200 -@@ -4,11 +4,29 @@ - * Copyright (C) 1999 Linus Torvalds. - * - * This file is released under the GPL. -- */ -- --/* -+ * - * These are the VFS interfaces to the compressed rom filesystem. - * The actual compression is based on zlib, see the other files. -+ * -+ * Linear Addressing code -+ * Copyright (C) 2000 Shane Nay. -+ * -+ * Allows you to have a linearly addressed cramfs filesystem. -+ * Saves the need for buffer, and the munging of the buffer. -+ * Savings a bit over 32k with default PAGE_SIZE, BUFFER_SIZE -+ * etc. Usefull on embedded platform with ROM :-). -+ * -+ * Downsides- Currently linear addressed cramfs partitions -+ * don't co-exist with block cramfs partitions. -+ * -+ * 28-Dec-2000: XIP mode for linear cramfs -+ * Copyright (C) 2000 Robert Leslie <rob@mars.org> -+ * -+ * Dynamic allocation of linear cramfs space by Nicolas Pitre -+ * Copyright (C) 2003 Monta Vista Software, Inc. -+ * -+ * Linear cramfs now requires that you pass the physaddr= parameter to -+ * the mount process. Allows for multiple linear cramfs partitions. - */ - - #include <linux/module.h> -@@ -16,10 +34,12 @@ - #include <linux/pagemap.h> - #include <linux/init.h> - #include <linux/string.h> -+#include <linux/kernel.h> - #include <linux/locks.h> - #include <linux/blkdev.h> - #include <linux/cramfs_fs.h> - #include <asm/semaphore.h> -+#include <asm/io.h> - - #include <asm/uaccess.h> - -@@ -28,6 +48,8 @@ - #define CRAMFS_SB_BLOCKS u.cramfs_sb.blocks - #define CRAMFS_SB_FILES u.cramfs_sb.files - #define CRAMFS_SB_FLAGS u.cramfs_sb.flags -+#define CRAMFS_SB_LINEAR_PHYS_ADDR u.cramfs_sb.linear_phys_addr -+#define CRAMFS_SB_LINEAR_VIRT_ADDR u.cramfs_sb.linear_virt_addr - - static struct super_operations cramfs_ops; - static struct inode_operations cramfs_dir_inode_operations; -@@ -42,6 +64,74 @@ - #define CRAMINO(x) ((x)->offset?(x)->offset<<2:1) - #define OFFSET(x) ((x)->i_ino) - -+ -+#ifdef CONFIG_CRAMFS_LINEAR_XIP -+ -+static int cramfs_mmap(struct file *file, struct vm_area_struct *vma) -+{ -+ unsigned long address, length; -+ struct inode *inode = file->f_dentry->d_inode; -+ struct super_block *sb = inode->i_sb; -+ -+ /* this is only used in the case of read-only maps for XIP */ -+ -+ if (vma->vm_flags & VM_WRITE) -+ return generic_file_mmap(file, vma); -+ -+ if ((vma->vm_flags & VM_SHARED) && (vma->vm_flags & VM_MAYWRITE)) -+ return -EINVAL; -+ -+ address = PAGE_ALIGN(sb->CRAMFS_SB_LINEAR_PHYS_ADDR + OFFSET(inode)); -+ address += vma->vm_pgoff << PAGE_SHIFT; -+ -+ length = vma->vm_end - vma->vm_start; -+ -+ if (length > inode->i_size) -+ length = inode->i_size; -+ -+ length = PAGE_ALIGN(length); -+ -+ -+#if 0 -+ /* Doing the following makes it slower and more broken. bdl */ -+ /* -+ * Accessing memory above the top the kernel knows about or -+ * through a file pointer that was marked O_SYNC will be -+ * done non-cached. -+ */ -+ vma->vm_page_prot = -+ __pgprot((pgprot_val(vma->vm_page_prot) & ~_CACHE_MASK) -+ | _CACHE_UNCACHED); -+#endif -+ -+ /* -+ * Don't dump addresses that are not real memory to a core file. -+ */ -+ vma->vm_flags |= VM_IO; -+ flush_tlb_page(vma, address); -+ if (remap_page_range(vma->vm_start, address, length, -+ vma->vm_page_prot)) -+ return -EAGAIN; -+ -+#ifdef DEBUG_CRAMFS_XIP -+ printk("cramfs_mmap: mapped %s at 0x%08lx, length %lu to vma 0x%08lx" -+ ", page_prot 0x%08lx\n", -+ file->f_dentry->d_name.name, address, length, -+ vma->vm_start, pgprot_val(vma->vm_page_prot)); -+#endif -+ -+ return 0; -+} -+ -+static struct file_operations cramfs_linear_xip_fops = { -+ read: generic_file_read, -+ mmap: cramfs_mmap, -+}; -+ -+#define CRAMFS_INODE_IS_XIP(x) ((x)->i_mode & S_ISVTX) -+ -+#endif -+ - static struct inode *get_cramfs_inode(struct super_block *sb, struct cramfs_inode * cramfs_inode) - { - struct inode * inode = new_inode(sb); -@@ -60,7 +150,11 @@ - without -noleaf option. */ - insert_inode_hash(inode); - if (S_ISREG(inode->i_mode)) { -+#ifdef CONFIG_CRAMFS_LINEAR_XIP -+ inode->i_fop = CRAMFS_INODE_IS_XIP(inode) ? &cramfs_linear_xip_fops : &generic_ro_fops; -+#else - inode->i_fop = &generic_ro_fops; -+#endif - inode->i_data.a_ops = &cramfs_aops; - } else if (S_ISDIR(inode->i_mode)) { - inode->i_op = &cramfs_dir_inode_operations; -@@ -76,6 +170,18 @@ - return inode; - } - -+#ifdef CONFIG_CRAMFS_LINEAR -+/* -+ * Return a pointer to the block in the linearly addressed cramfs image. -+ */ -+static void *cramfs_read(struct super_block *sb, unsigned int offset, unsigned int len) -+{ -+ if (!len) -+ return NULL; -+ return (void*)(sb->CRAMFS_SB_LINEAR_VIRT_ADDR + offset); -+} -+ -+#else /* Not linear addressing - aka regular block mode. */ - /* - * We have our own block cache: don't fill up the buffer cache - * with the rom-image, because the way the filesystem is set -@@ -186,23 +292,65 @@ - } - return read_buffers[buffer] + offset; - } -- -+#endif /* !CONFIG_CRAMFS_LINEAR */ - - static struct super_block * cramfs_read_super(struct super_block *sb, void *data, int silent) - { -+#ifndef CONFIG_CRAMFS_LINEAR - int i; -+#else -+ char *p; -+#endif - struct cramfs_super super; - unsigned long root_offset; - struct super_block * retval = NULL; - -- set_blocksize(sb->s_dev, PAGE_CACHE_SIZE); - sb->s_blocksize = PAGE_CACHE_SIZE; - sb->s_blocksize_bits = PAGE_CACHE_SHIFT; - -+#ifndef CONFIG_CRAMFS_LINEAR -+ -+ set_blocksize(sb->s_dev, PAGE_CACHE_SIZE); -+ - /* Invalidate the read buffers on mount: think disk change.. */ - for (i = 0; i < READ_BUFFERS; i++) - buffer_blocknr[i] = -1; - -+#else -+ -+ /* -+ * The physical location of the cramfs image is specified as -+ * a mount parameter. This parameter is mandatory for obvious -+ * reasons. Some validation is made on the phys address but this -+ * is not exhaustive and we count on the fact that someone using -+ * this feature is supposed to know what he/she's doing. -+ */ -+ if (!data || !(p = strstr((char *)data, "physaddr="))) { -+ printk(KERN_ERR "cramfs: unknown physical address for linear cramfs image\n"); -+ goto out; -+ } -+ sb->CRAMFS_SB_LINEAR_PHYS_ADDR = simple_strtoul(p + 9, NULL, 0); -+ if (sb->CRAMFS_SB_LINEAR_PHYS_ADDR & (PAGE_SIZE-1)) { -+ printk(KERN_ERR "cramfs: physical address 0x%lx for linear cramfs isn't aligned to a page boundary\n", -+ sb->CRAMFS_SB_LINEAR_PHYS_ADDR); -+ goto out; -+ } -+ if (sb->CRAMFS_SB_LINEAR_PHYS_ADDR == 0) { -+ printk(KERN_ERR "cramfs: physical address for linear cramfs image can't be 0\n"); -+ goto out; -+ } -+ printk(KERN_INFO "cramfs: checking physical address 0x%lx for linear cramfs image\n", -+ sb->CRAMFS_SB_LINEAR_PHYS_ADDR); -+ -+ /* Map only one page for now. Will remap it when fs size is known. */ -+ sb->CRAMFS_SB_LINEAR_VIRT_ADDR = -+ ioremap(sb->CRAMFS_SB_LINEAR_PHYS_ADDR, PAGE_SIZE); -+ if (!sb->CRAMFS_SB_LINEAR_VIRT_ADDR) { -+ printk(KERN_ERR "cramfs: ioremap of the linear cramfs image failed\n"); -+ goto out; -+ } -+#endif -+ - down(&read_mutex); - /* Read the first block and get the superblock from it */ - memcpy(&super, cramfs_read(sb, 0, sizeof(super)), sizeof(super)); -@@ -254,8 +402,26 @@ - /* Set it all up.. */ - sb->s_op = &cramfs_ops; - sb->s_root = d_alloc_root(get_cramfs_inode(sb, &super.root)); -+ -+#ifdef CONFIG_CRAMFS_LINEAR -+ /* Remap the whole filesystem now */ -+ iounmap(sb->CRAMFS_SB_LINEAR_VIRT_ADDR); -+ printk(KERN_INFO "cramfs: linear cramfs image appears to be %lu KB in size\n", -+ sb->CRAMFS_SB_SIZE/1024); -+ sb->CRAMFS_SB_LINEAR_VIRT_ADDR = -+ ioremap(sb->CRAMFS_SB_LINEAR_PHYS_ADDR, sb->CRAMFS_SB_SIZE); -+ if (!sb->CRAMFS_SB_LINEAR_VIRT_ADDR) { -+ printk(KERN_ERR "cramfs: ioremap of the linear cramfs image failed\n"); -+ goto out; -+ } -+#endif -+ - retval = sb; - out: -+#ifdef CONFIG_CRAMFS_LINEAR -+ if (!retval && sb->CRAMFS_SB_LINEAR_VIRT_ADDR) -+ iounmap(sb->CRAMFS_SB_LINEAR_VIRT_ADDR); -+#endif - return retval; - } - -@@ -388,6 +554,18 @@ - - maxblock = (inode->i_size + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; - bytes_filled = 0; -+#ifdef CONFIG_CRAMFS_LINEAR_XIP -+ if (page->index < maxblock && CRAMFS_INODE_IS_XIP(inode)) { -+ struct super_block *sb = inode->i_sb; -+ u32 blkptr_offset = PAGE_ALIGN(OFFSET(inode)) + -+ page->index * PAGE_CACHE_SIZE; -+ memcpy( page_address(page), -+ (void*)(sb->CRAMFS_SB_LINEAR_VIRT_ADDR + blkptr_offset), -+ PAGE_CACHE_SIZE ); -+ bytes_filled = PAGE_CACHE_SIZE; -+ pgdata = kmap(page); -+ } else -+#endif - if (page->index < maxblock) { - struct super_block *sb = inode->i_sb; - u32 blkptr_offset = OFFSET(inode) + page->index*4; -@@ -444,7 +622,11 @@ - statfs: cramfs_statfs, - }; - -+#ifndef CONFIG_CRAMFS_LINEAR - static DECLARE_FSTYPE_DEV(cramfs_fs_type, "cramfs", cramfs_read_super); -+#else -+static DECLARE_FSTYPE(cramfs_fs_type, "cramfs", cramfs_read_super, 0); -+#endif - - static int __init init_cramfs_fs(void) - { ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/fs/cramfs/mkcramfs.c 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,821 @@ -+/* -+ * mkcramfs - make a cramfs file system, optionally with XIP files. -+ * -+ * Copyright (C) 1999-2001 Transmeta Corporation -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+ */ -+ -+#include <sys/types.h> -+#include <stdio.h> -+#include <sys/stat.h> -+#include <unistd.h> -+#include <sys/mman.h> -+#include <sys/fcntl.h> -+#include <dirent.h> -+#include <stdlib.h> -+#include <errno.h> -+#include <string.h> -+#include <assert.h> -+#include <getopt.h> -+#include <linux/cramfs_fs.h> -+#include <zlib.h> -+ -+#define PAD_SIZE 512 /* only 0 and 512 supported by kernel */ -+ -+static const char *progname = "mkcramfs"; -+ -+/* N.B. If you change the disk format of cramfs, please update fs/cramfs/README. */ -+ -+/* Input status of 0 to print help and exit without an error. */ -+static void usage(int status) -+{ -+ FILE *stream = status ? stderr : stdout; -+ -+ fprintf(stream, "usage: %s [-h] [-e edition] [-i file] [-n name] dirname outfile\n" -+ " -h print this help\n" -+ " -E make all warnings errors (non-zero exit status)\n" -+ " -e edition set edition number (part of fsid)\n" -+ " -i file insert a file image into the filesystem (requires >= 2.4.0)\n" -+ " -n name set name of cramfs filesystem\n" -+ " -p pad by %d bytes for boot code\n" -+ " -s sort directory entries (old option, ignored)\n" -+ " -x make marked files eXecute In Place\n" -+ " -z make explicit holes (requires >= 2.3.39)\n" -+ " dirname root of the filesystem to be compressed\n" -+ " outfile output file\n", progname, PAD_SIZE); -+ -+ exit(status); -+} -+ -+#define PAGE_SIZE (4096) -+#define PAGE_ALIGN(x) (((x) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1)) -+#define ROM_OFFSET 0 -+#define ROM_ALIGN(x) (PAGE_ALIGN((x) + ROM_OFFSET) - ROM_OFFSET) -+#define PAGE_CACHE_SIZE (4096) -+/* The kernel assumes PAGE_CACHE_SIZE as block size. */ -+static unsigned int blksize = PAGE_CACHE_SIZE; -+static long total_blocks = 0, total_nodes = 1; /* pre-count the root node */ -+static int image_length = 0; -+ -+/* -+ * If opt_holes is set, then mkcramfs can create explicit holes in the -+ * data, which saves 26 bytes per hole (which is a lot smaller a -+ * saving than most most filesystems). -+ * -+ * Note that kernels up to at least 2.3.39 don't support cramfs holes, -+ * which is why this is turned off by default. -+ */ -+static int opt_edition = 0; -+static int opt_errors = 0; -+static int opt_holes = 0; -+static int opt_xip = 0; -+static int opt_pad = 0; -+static char *opt_image = NULL; -+static char *opt_name = NULL; -+ -+static int warn_dev, warn_gid, warn_namelen, warn_skip, warn_size, warn_uid; -+ -+#ifndef MIN -+# define MIN(_a,_b) ((_a) < (_b) ? (_a) : (_b)) -+#endif -+ -+/* In-core version of inode / directory entry. */ -+struct entry { -+ /* stats */ -+ char *name; -+ unsigned int mode, size, uid, gid; -+ -+ /* FS data */ -+ void *uncompressed; -+ /* points to other identical file */ -+ struct entry *same; -+ unsigned int offset; /* pointer to compressed data in archive */ -+ unsigned int dir_offset; /* Where in the archive is the directory entry? */ -+ -+ /* organization */ -+ struct entry *child; /* null for non-directories and empty directories */ -+ struct entry *next; -+}; -+ -+/* -+ * The longest file name component to allow for in the input directory tree. -+ * Ext2fs (and many others) allow up to 255 bytes. A couple of filesystems -+ * allow longer (e.g. smbfs 1024), but there isn't much use in supporting -+ * >255-byte names in the input directory tree given that such names get -+ * truncated to 255 bytes when written to cramfs. -+ */ -+#define MAX_INPUT_NAMELEN 255 -+ -+static int find_identical_file(struct entry *orig,struct entry *newfile) -+{ -+ if(orig==newfile) return 1; -+ if(!orig) return 0; -+ if(orig->size==newfile->size && orig->uncompressed && !memcmp(orig->uncompressed,newfile->uncompressed,orig->size)) { -+ newfile->same=orig; -+ return 1; -+ } -+ return find_identical_file(orig->child,newfile) || -+ find_identical_file(orig->next,newfile); -+} -+ -+static void eliminate_doubles(struct entry *root,struct entry *orig) { -+ if(orig) { -+ if(orig->size && orig->uncompressed) -+ find_identical_file(root,orig); -+ eliminate_doubles(root,orig->child); -+ eliminate_doubles(root,orig->next); -+ } -+} -+ -+/* -+ * We define our own sorting function instead of using alphasort which -+ * uses strcoll and changes ordering based on locale information. -+ */ -+static int cramsort (const void *a, const void *b) -+{ -+ return strcmp ((*(const struct dirent **) a)->d_name, -+ (*(const struct dirent **) b)->d_name); -+} -+ -+static unsigned int parse_directory(struct entry *root_entry, const char *name, struct entry **prev, loff_t *fslen_ub) -+{ -+ struct dirent **dirlist; -+ int totalsize = 0, dircount, dirindex; -+ char *path, *endpath; -+ size_t len = strlen(name); -+ -+ /* Set up the path. */ -+ /* TODO: Reuse the parent's buffer to save memcpy'ing and duplication. */ -+ path = malloc(len + 1 + MAX_INPUT_NAMELEN + 1); -+ if (!path) { -+ perror(NULL); -+ exit(8); -+ } -+ memcpy(path, name, len); -+ endpath = path + len; -+ *endpath = '/'; -+ endpath++; -+ -+ /* read in the directory and sort */ -+ dircount = scandir(name, &dirlist, 0, cramsort); -+ -+ if (dircount < 0) { -+ perror(name); -+ exit(8); -+ } -+ -+ /* process directory */ -+ for (dirindex = 0; dirindex < dircount; dirindex++) { -+ struct dirent *dirent; -+ struct entry *entry; -+ struct stat st; -+ int size; -+ size_t namelen; -+ -+ dirent = dirlist[dirindex]; -+ -+ /* Ignore "." and ".." - we won't be adding them to the archive */ -+ if (dirent->d_name[0] == '.') { -+ if (dirent->d_name[1] == '\0') -+ continue; -+ if (dirent->d_name[1] == '.') { -+ if (dirent->d_name[2] == '\0') -+ continue; -+ } -+ } -+ namelen = strlen(dirent->d_name); -+ if (namelen > MAX_INPUT_NAMELEN) { -+ fprintf(stderr, -+ "Very long (%u bytes) filename `%s' found.\n" -+ " Please increase MAX_INPUT_NAMELEN in mkcramfs.c and recompile. Exiting.\n", -+ namelen, dirent->d_name); -+ exit(8); -+ } -+ memcpy(endpath, dirent->d_name, namelen + 1); -+ -+ if (lstat(path, &st) < 0) { -+ perror(endpath); -+ warn_skip = 1; -+ continue; -+ } -+ entry = calloc(1, sizeof(struct entry)); -+ if (!entry) { -+ perror(NULL); -+ exit(8); -+ } -+ entry->name = strdup(dirent->d_name); -+ if (!entry->name) { -+ perror(NULL); -+ exit(8); -+ } -+ if (namelen > 255) { -+ /* Can't happen when reading from ext2fs. */ -+ -+ /* TODO: we ought to avoid chopping in half -+ multi-byte UTF8 characters. */ -+ entry->name[namelen = 255] = '\0'; -+ warn_namelen = 1; -+ } -+ entry->mode = st.st_mode; -+ entry->size = st.st_size; -+ entry->uid = st.st_uid; -+ if (entry->uid >= 1 << CRAMFS_UID_WIDTH) -+ warn_uid = 1; -+ entry->gid = st.st_gid; -+ if (entry->gid >= 1 << CRAMFS_GID_WIDTH) -+ /* TODO: We ought to replace with a default -+ gid instead of truncating; otherwise there -+ are security problems. Maybe mode should -+ be &= ~070. Same goes for uid once Linux -+ supports >16-bit uids. */ -+ warn_gid = 1; -+ size = sizeof(struct cramfs_inode) + ((namelen + 3) & ~3); -+ *fslen_ub += size; -+ if (S_ISDIR(st.st_mode)) { -+ entry->size = parse_directory(root_entry, path, &entry->child, fslen_ub); -+ } else if (S_ISREG(st.st_mode)) { -+ /* TODO: We ought to open files in do_compress, one -+ at a time, instead of amassing all these memory -+ maps during parse_directory (which don't get used -+ until do_compress anyway). As it is, we tend to -+ get EMFILE errors (especially if mkcramfs is run -+ by non-root). -+ -+ While we're at it, do analagously for symlinks -+ (which would just save a little memory). */ -+ int fd = open(path, O_RDONLY); -+ if (fd < 0) { -+ perror(path); -+ warn_skip = 1; -+ continue; -+ } -+ if (entry->size) { -+ if ((entry->size >= 1 << CRAMFS_SIZE_WIDTH)) { -+ warn_size = 1; -+ entry->size = (1 << CRAMFS_SIZE_WIDTH) - 1; -+ } -+ -+ entry->uncompressed = mmap(NULL, entry->size, PROT_READ, MAP_PRIVATE, fd, 0); -+ if (-1 == (int) (long) entry->uncompressed) { -+ perror("mmap"); -+ exit(8); -+ } -+ } -+ close(fd); -+ } else if (S_ISLNK(st.st_mode)) { -+ entry->uncompressed = malloc(entry->size); -+ if (!entry->uncompressed) { -+ perror(NULL); -+ exit(8); -+ } -+ if (readlink(path, entry->uncompressed, entry->size) < 0) { -+ perror(path); -+ warn_skip = 1; -+ continue; -+ } -+ } else if (S_ISFIFO(st.st_mode) || S_ISSOCK(st.st_mode)) { -+ /* maybe we should skip sockets */ -+ entry->size = 0; -+ } else { -+ entry->size = st.st_rdev; -+ if (entry->size & -(1<<CRAMFS_SIZE_WIDTH)) -+ warn_dev = 1; -+ } -+ -+ if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) { -+ int blocks = ((entry->size - 1) / blksize + 1); -+ -+ /* block pointers & data expansion allowance + data */ -+ if(entry->size) -+ *fslen_ub += (4+26)*blocks + entry->size + 3; -+ } -+ -+ if (opt_xip && entry->mode & S_ISVTX) { -+ /* worse case, depending on where the offsets falls, -+ * a single XIP entry could expand the sizeof the -+ * file system by 8k, since we're aligning the start -+ * and end on page boundary. -+ */ -+ *fslen_ub += 2*PAGE_CACHE_SIZE; -+ } -+ -+ /* Link it into the list */ -+ *prev = entry; -+ prev = &entry->next; -+ totalsize += size; -+ } -+ free(path); -+ free(dirlist); /* allocated by scandir() with malloc() */ -+ return totalsize; -+} -+ -+/* Returns sizeof(struct cramfs_super), which includes the root inode. */ -+static unsigned int write_superblock(struct entry *root, char *base, int size) -+{ -+ struct cramfs_super *super = (struct cramfs_super *) base; -+ unsigned int offset = sizeof(struct cramfs_super) + image_length; -+ -+ if (opt_pad) { -+ offset += opt_pad; -+ } -+ -+ super->magic = CRAMFS_MAGIC; -+ super->flags = CRAMFS_FLAG_FSID_VERSION_2 | CRAMFS_FLAG_SORTED_DIRS; -+ if (opt_holes) -+ super->flags |= CRAMFS_FLAG_HOLES; -+ if (image_length > 0) -+ super->flags |= CRAMFS_FLAG_SHIFTED_ROOT_OFFSET; -+ super->size = size; -+ memcpy(super->signature, CRAMFS_SIGNATURE, sizeof(super->signature)); -+ -+ super->fsid.crc = crc32(0L, Z_NULL, 0); -+ super->fsid.edition = opt_edition; -+ super->fsid.blocks = total_blocks; -+ super->fsid.files = total_nodes; -+ -+ memset(super->name, 0x00, sizeof(super->name)); -+ if (opt_name) -+ strncpy(super->name, opt_name, sizeof(super->name)); -+ else -+ strncpy(super->name, "Compressed", sizeof(super->name)); -+ -+ super->root.mode = root->mode; -+ super->root.uid = root->uid; -+ super->root.gid = root->gid; -+ super->root.size = root->size; -+ super->root.offset = offset >> 2; -+ -+ return offset; -+} -+ -+static void set_data_offset(struct entry *entry, char *base, unsigned long offset) -+{ -+ struct cramfs_inode *inode = (struct cramfs_inode *) (base + entry->dir_offset); -+#ifdef DEBUG -+ assert ((offset & 3) == 0); -+#endif /* DEBUG */ -+ if (offset >= (1 << (2 + CRAMFS_OFFSET_WIDTH))) { -+ fprintf(stderr, "filesystem too big. Exiting.\n"); -+ exit(8); -+ } -+ inode->offset = (offset >> 2); -+} -+ -+ -+/* -+ * We do a width-first printout of the directory -+ * entries, using a stack to remember the directories -+ * we've seen. -+ */ -+#define MAXENTRIES (100) -+static unsigned int write_directory_structure(struct entry *entry, char *base, unsigned int offset) -+{ -+ int stack_entries = 0; -+ struct entry *entry_stack[MAXENTRIES]; -+ -+ for (;;) { -+ int dir_start = stack_entries; -+ while (entry) { -+ struct cramfs_inode *inode = (struct cramfs_inode *) (base + offset); -+ size_t len = strlen(entry->name); -+ -+ entry->dir_offset = offset; -+ -+ inode->mode = entry->mode; -+ inode->uid = entry->uid; -+ inode->gid = entry->gid; -+ inode->size = entry->size; -+ inode->offset = 0; -+ /* Non-empty directories, regfiles and symlinks will -+ write over inode->offset later. */ -+ -+ offset += sizeof(struct cramfs_inode); -+ total_nodes++; /* another node */ -+ memcpy(base + offset, entry->name, len); -+ /* Pad up the name to a 4-byte boundary */ -+ while (len & 3) { -+ *(base + offset + len) = '\0'; -+ len++; -+ } -+ inode->namelen = len >> 2; -+ offset += len; -+ -+ /* TODO: this may get it wrong for chars >= 0x80. -+ Most filesystems use UTF8 encoding for filenames, -+ whereas the console is a single-byte character -+ set like iso-latin-1. */ -+ printf(" %s\n", entry->name); -+ if (entry->child) { -+ if (stack_entries >= MAXENTRIES) { -+ fprintf(stderr, "Exceeded MAXENTRIES. Raise this value in mkcramfs.c and recompile. Exiting.\n"); -+ exit(8); -+ } -+ entry_stack[stack_entries] = entry; -+ stack_entries++; -+ } -+ entry = entry->next; -+ } -+ -+ /* -+ * Reverse the order the stack entries pushed during -+ * this directory, for a small optimization of disk -+ * access in the created fs. This change makes things -+ * `ls -UR' order. -+ */ -+ { -+ struct entry **lo = entry_stack + dir_start; -+ struct entry **hi = entry_stack + stack_entries; -+ struct entry *tmp; -+ -+ while (lo < --hi) { -+ tmp = *lo; -+ *lo++ = *hi; -+ *hi = tmp; -+ } -+ } -+ -+ /* Pop a subdirectory entry from the stack, and recurse. */ -+ if (!stack_entries) -+ break; -+ stack_entries--; -+ entry = entry_stack[stack_entries]; -+ -+ set_data_offset(entry, base, offset); -+ printf("'%s':\n", entry->name); -+ entry = entry->child; -+ } -+ return offset; -+} -+ -+static int is_zero(char const *begin, unsigned len) -+{ -+ if (opt_holes) -+ /* Returns non-zero iff the first LEN bytes from BEGIN are -+ all NULs. */ -+ return (len-- == 0 || -+ (begin[0] == '\0' && -+ (len-- == 0 || -+ (begin[1] == '\0' && -+ (len-- == 0 || -+ (begin[2] == '\0' && -+ (len-- == 0 || -+ (begin[3] == '\0' && -+ memcmp(begin, begin + 4, len) == 0)))))))); -+ else -+ /* Never create holes. */ -+ return 0; -+} -+ -+static unsigned int do_xip(char *base, unsigned int offset, -+ char const *name, char *uncompressed, -+ unsigned int size) -+{ -+ unsigned int start, end; -+ -+ /* align to page boundary */ -+ -+ start = ROM_ALIGN(offset); -+ memset(base + offset, 0, start - offset); -+ -+ memcpy(base + start, uncompressed, size); -+ -+ /* pad to page boundary */ -+ -+ end = ROM_ALIGN(start + size); -+ memset(base + start + size, 0, end - (start + size)); -+ -+ printf("XIP (%u+%u bytes)\toffset %u\t%s\n", -+ size, (end - offset) - size, offset, name); -+ -+ return end; -+} -+ -+/* -+ * One 4-byte pointer per block and then the actual blocked -+ * output. The first block does not need an offset pointer, -+ * as it will start immediately after the pointer block; -+ * so the i'th pointer points to the end of the i'th block -+ * (i.e. the start of the (i+1)'th block or past EOF). -+ * -+ * Note that size > 0, as a zero-sized file wouldn't ever -+ * have gotten here in the first place. -+ */ -+static unsigned int do_compress(char *base, unsigned int offset, char const *name, char *uncompressed, unsigned int size) -+{ -+ unsigned long original_size = size; -+ unsigned long original_offset = offset; -+ unsigned long new_size; -+ unsigned long blocks = (size - 1) / blksize + 1; -+ unsigned long curr = offset + 4 * blocks; -+ int change; -+ -+ total_blocks += blocks; -+ -+ do { -+ unsigned long len = 2 * blksize; -+ unsigned int input = size; -+ if (input > blksize) -+ input = blksize; -+ size -= input; -+ if (!is_zero (uncompressed, input)) { -+ compress(base + curr, &len, uncompressed, input); -+ curr += len; -+ } -+ uncompressed += input; -+ -+ if (len > blksize*2) { -+ /* (I don't think this can happen with zlib.) */ -+ printf("AIEEE: block \"compressed\" to > 2*blocklength (%ld)\n", len); -+ exit(8); -+ } -+ -+ *(u32 *) (base + offset) = curr; -+ offset += 4; -+ } while (size); -+ -+ curr = (curr + 3) & ~3; -+ new_size = curr - original_offset; -+ /* TODO: Arguably, original_size in these 2 lines should be -+ st_blocks * 512. But if you say that then perhaps -+ administrative data should also be included in both. */ -+ change = new_size - original_size; -+ printf("%6.2f%% (%+d bytes)\toffset %lu\t%s\n", -+ (change * 100) / (double) original_size, change, original_offset, name); -+ -+ return curr; -+} -+ -+ -+/* -+ * Traverse the entry tree, writing data for every item that has -+ * non-null entry->compressed (i.e. every symlink and non-empty -+ * regfile). -+ */ -+static unsigned int write_data(struct entry *entry, char *base, unsigned int offset) -+{ -+ do { -+ if (entry->uncompressed) { -+ if(entry->same) { -+ set_data_offset(entry, base, entry->same->offset); -+ entry->offset=entry->same->offset; -+ } else { -+ set_data_offset(entry, base, offset); -+ entry->offset=offset; -+ if (opt_xip && entry->mode & S_ISVTX) -+ offset = do_xip(base, offset, entry->name, entry->uncompressed, entry->size); -+ else -+ offset = do_compress(base, offset, entry->name, entry->uncompressed, entry->size); -+ } -+ } -+ else if (entry->child) -+ offset = write_data(entry->child, base, offset); -+ entry=entry->next; -+ } while (entry); -+ return offset; -+} -+ -+static unsigned int write_file(char *file, char *base, unsigned int offset) -+{ -+ int fd; -+ char *buf; -+ -+ fd = open(file, O_RDONLY); -+ if (fd < 0) { -+ perror(file); -+ exit(8); -+ } -+ buf = mmap(NULL, image_length, PROT_READ, MAP_PRIVATE, fd, 0); -+ memcpy(base + offset, buf, image_length); -+ munmap(buf, image_length); -+ close (fd); -+ /* Pad up the image_length to a 4-byte boundary */ -+ while (image_length & 3) { -+ *(base + offset + image_length) = '\0'; -+ image_length++; -+ } -+ return (offset + image_length); -+} -+ -+/* -+ * Maximum size fs you can create is roughly 256MB. (The last file's -+ * data must begin within 256MB boundary but can extend beyond that.) -+ * -+ * Note that if you want it to fit in a ROM then you're limited to what the -+ * hardware and kernel can support (64MB?). -+ */ -+#define MAXFSLEN ((((1 << CRAMFS_OFFSET_WIDTH) - 1) << 2) /* offset */ \ -+ + (1 << CRAMFS_SIZE_WIDTH) - 1 /* filesize */ \ -+ + (1 << CRAMFS_SIZE_WIDTH) * 4 / PAGE_CACHE_SIZE /* block pointers */ ) -+ -+ -+/* -+ * Usage: -+ * -+ * mkcramfs directory-name outfile -+ * -+ * where "directory-name" is simply the root of the directory -+ * tree that we want to generate a compressed filesystem out -+ * of. -+ */ -+int main(int argc, char **argv) -+{ -+ struct stat st; /* used twice... */ -+ struct entry *root_entry; -+ char *rom_image; -+ ssize_t offset, written; -+ int fd; -+ /* initial guess (upper-bound) of required filesystem size */ -+ loff_t fslen_ub = sizeof(struct cramfs_super); -+ char const *dirname, *outfile; -+ u32 crc = crc32(0L, Z_NULL, 0); -+ int c; /* for getopt */ -+ -+ total_blocks = 0; -+ -+ if (argc) -+ progname = argv[0]; -+ -+ /* command line options */ -+ while ((c = getopt(argc, argv, "hEe:i:n:psxz")) != EOF) { -+ switch (c) { -+ case 'h': -+ usage(0); -+ case 'E': -+ opt_errors = 1; -+ break; -+ case 'e': -+ opt_edition = atoi(optarg); -+ break; -+ case 'i': -+ opt_image = optarg; -+ if (lstat(opt_image, &st) < 0) { -+ perror(opt_image); -+ exit(16); -+ } -+ image_length = st.st_size; /* may be padded later */ -+ fslen_ub += (image_length + 3); /* 3 is for padding */ -+ break; -+ case 'n': -+ opt_name = optarg; -+ break; -+ case 'p': -+ opt_pad = PAD_SIZE; -+ fslen_ub += PAD_SIZE; -+ break; -+ case 's': -+ /* old option, ignored */ -+ break; -+ case 'x': -+ opt_xip = 1; -+ break; -+ case 'z': -+ opt_holes = 1; -+ break; -+ } -+ } -+ -+ if ((argc - optind) != 2) -+ usage(16); -+ dirname = argv[optind]; -+ outfile = argv[optind + 1]; -+ -+ if (stat(dirname, &st) < 0) { -+ perror(dirname); -+ exit(16); -+ } -+ fd = open(outfile, O_WRONLY | O_CREAT | O_TRUNC, 0666); -+ -+ root_entry = calloc(1, sizeof(struct entry)); -+ if (!root_entry) { -+ perror(NULL); -+ exit(8); -+ } -+ root_entry->mode = st.st_mode; -+ root_entry->uid = st.st_uid; -+ root_entry->gid = st.st_gid; -+ -+ root_entry->size = parse_directory(root_entry, dirname, &root_entry->child, &fslen_ub); -+ -+ /* always allocate a multiple of blksize bytes because that's -+ what we're going to write later on */ -+ fslen_ub = ((fslen_ub - 1) | (blksize - 1)) + 1; -+ -+ if (fslen_ub > MAXFSLEN) { -+ fprintf(stderr, -+ "warning: guestimate of required size (upper bound) is %LdMB, but maximum image size is %uMB. We might die prematurely.\n", -+ fslen_ub >> 20, -+ MAXFSLEN >> 20); -+ fslen_ub = MAXFSLEN; -+ } -+ -+ /* find duplicate files. TODO: uses the most inefficient algorithm -+ possible. */ -+ eliminate_doubles(root_entry,root_entry); -+ -+ /* TODO: Why do we use a private/anonymous mapping here -+ followed by a write below, instead of just a shared mapping -+ and a couple of ftruncate calls? Is it just to save us -+ having to deal with removing the file afterwards? If we -+ really need this huge anonymous mapping, we ought to mmap -+ in smaller chunks, so that the user doesn't need nn MB of -+ RAM free. If the reason is to be able to write to -+ un-mmappable block devices, then we could try shared mmap -+ and revert to anonymous mmap if the shared mmap fails. */ -+ rom_image = mmap(NULL, fslen_ub?fslen_ub:1, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); -+ -+ if (-1 == (int) (long) rom_image) { -+ perror("ROM image map"); -+ exit(8); -+ } -+ -+ /* Skip the first opt_pad bytes for boot loader code */ -+ offset = opt_pad; -+ memset(rom_image, 0x00, opt_pad); -+ -+ /* Skip the superblock and come back to write it later. */ -+ offset += sizeof(struct cramfs_super); -+ -+ /* Insert a file image. */ -+ if (opt_image) { -+ printf("Including: %s\n", opt_image); -+ offset = write_file(opt_image, rom_image, offset); -+ } -+ -+ offset = write_directory_structure(root_entry->child, rom_image, offset); -+ printf("Directory data: %d bytes\n", offset); -+ -+ offset = write_data(root_entry, rom_image, offset); -+ -+ /* We always write a multiple of blksize bytes, so that -+ losetup works. */ -+ offset = ((offset - 1) | (blksize - 1)) + 1; -+ printf("Everything: %d kilobytes\n", offset >> 10); -+ -+ /* Write the superblock now that we can fill in all of the fields. */ -+ write_superblock(root_entry, rom_image+opt_pad, offset); -+ printf("Super block: %d bytes\n", sizeof(struct cramfs_super)); -+ -+ /* Put the checksum in. */ -+ crc = crc32(crc, (rom_image+opt_pad), (offset-opt_pad)); -+ ((struct cramfs_super *) (rom_image+opt_pad))->fsid.crc = crc; -+ printf("CRC: %x\n", crc); -+ -+ /* Check to make sure we allocated enough space. */ -+ if (fslen_ub < offset) { -+ fprintf(stderr, "not enough space allocated for ROM image (%Ld allocated, %d used)\n", -+ fslen_ub, offset); -+ exit(8); -+ } -+ -+ written = write(fd, rom_image, offset); -+ if (written < 0) { -+ perror("ROM image"); -+ exit(8); -+ } -+ if (offset != written) { -+ fprintf(stderr, "ROM image write failed (%d %d)\n", written, offset); -+ exit(8); -+ } -+ -+ /* (These warnings used to come at the start, but they scroll off the -+ screen too quickly.) */ -+ if (warn_namelen) /* (can't happen when reading from ext2fs) */ -+ fprintf(stderr, /* bytes, not chars: think UTF8. */ -+ "warning: filenames truncated to 255 bytes.\n"); -+ if (warn_skip) -+ fprintf(stderr, "warning: files were skipped due to errors.\n"); -+ if (warn_size) -+ fprintf(stderr, -+ "warning: file sizes truncated to %luMB (minus 1 byte).\n", -+ 1L << (CRAMFS_SIZE_WIDTH - 20)); -+ if (warn_uid) /* (not possible with current Linux versions) */ -+ fprintf(stderr, -+ "warning: uids truncated to %u bits. (This may be a security concern.)\n", -+ CRAMFS_UID_WIDTH); -+ if (warn_gid) -+ fprintf(stderr, -+ "warning: gids truncated to %u bits. (This may be a security concern.)\n", -+ CRAMFS_GID_WIDTH); -+ if (warn_dev) -+ fprintf(stderr, -+ "WARNING: device numbers truncated to %u bits. This almost certainly means\n" -+ "that some device files will be wrong.\n", -+ CRAMFS_OFFSET_WIDTH); -+ if (opt_errors && -+ (warn_namelen||warn_skip||warn_size||warn_uid||warn_gid||warn_dev)) -+ exit(8); -+ return 0; -+} ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/arch-pxa/bitfield.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,113 @@ -+/* -+ * FILE bitfield.h -+ * -+ * Version 1.1 -+ * Author Copyright (c) Marc A. Viredaz, 1998 -+ * DEC Western Research Laboratory, Palo Alto, CA -+ * Date April 1998 (April 1997) -+ * System Advanced RISC Machine (ARM) -+ * Language C or ARM Assembly -+ * Purpose Definition of macros to operate on bit fields. -+ */ -+ -+ -+ -+#ifndef __BITFIELD_H -+#define __BITFIELD_H -+ -+#ifndef __ASSEMBLY__ -+#define UData(Data) ((unsigned long) (Data)) -+#else -+#define UData(Data) (Data) -+#endif -+ -+ -+/* -+ * MACRO: Fld -+ * -+ * Purpose -+ * The macro "Fld" encodes a bit field, given its size and its shift value -+ * with respect to bit 0. -+ * -+ * Note -+ * A more intuitive way to encode bit fields would have been to use their -+ * mask. However, extracting size and shift value information from a bit -+ * field's mask is cumbersome and might break the assembler (255-character -+ * line-size limit). -+ * -+ * Input -+ * Size Size of the bit field, in number of bits. -+ * Shft Shift value of the bit field with respect to bit 0. -+ * -+ * Output -+ * Fld Encoded bit field. -+ */ -+ -+#define Fld(Size, Shft) (((Size) << 16) + (Shft)) -+ -+ -+/* -+ * MACROS: FSize, FShft, FMsk, FAlnMsk, F1stBit -+ * -+ * Purpose -+ * The macros "FSize", "FShft", "FMsk", "FAlnMsk", and "F1stBit" return -+ * the size, shift value, mask, aligned mask, and first bit of a -+ * bit field. -+ * -+ * Input -+ * Field Encoded bit field (using the macro "Fld"). -+ * -+ * Output -+ * FSize Size of the bit field, in number of bits. -+ * FShft Shift value of the bit field with respect to bit 0. -+ * FMsk Mask for the bit field. -+ * FAlnMsk Mask for the bit field, aligned on bit 0. -+ * F1stBit First bit of the bit field. -+ */ -+ -+#define FSize(Field) ((Field) >> 16) -+#define FShft(Field) ((Field) & 0x0000FFFF) -+#define FMsk(Field) (((UData (1) << FSize (Field)) - 1) << FShft (Field)) -+#define FAlnMsk(Field) ((UData (1) << FSize (Field)) - 1) -+#define F1stBit(Field) (UData (1) << FShft (Field)) -+ -+ -+/* -+ * MACRO: FInsrt -+ * -+ * Purpose -+ * The macro "FInsrt" inserts a value into a bit field by shifting the -+ * former appropriately. -+ * -+ * Input -+ * Value Bit-field value. -+ * Field Encoded bit field (using the macro "Fld"). -+ * -+ * Output -+ * FInsrt Bit-field value positioned appropriately. -+ */ -+ -+#define FInsrt(Value, Field) \ -+ (UData (Value) << FShft (Field)) -+ -+ -+/* -+ * MACRO: FExtr -+ * -+ * Purpose -+ * The macro "FExtr" extracts the value of a bit field by masking and -+ * shifting it appropriately. -+ * -+ * Input -+ * Data Data containing the bit-field to be extracted. -+ * Field Encoded bit field (using the macro "Fld"). -+ * -+ * Output -+ * FExtr Bit-field value. -+ */ -+ -+#define FExtr(Data, Field) \ -+ ((UData (Data) >> FShft (Field)) & FAlnMsk (Field)) -+ -+ -+#endif /* __BITFIELD_H */ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/arch-pxa/cerf.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,177 @@ -+/* -+ * linux/include/asm-arm/arch-pxa/cerf.h -+ * -+ * 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. -+ */ -+ -+/* -+ * Add CerfBoard Specifics here... -+ */ -+ -+/* -+ * Memory sizes -+ */ -+ -+#define CERF_RAM_BASE 0xa0000000 -+ -+#ifdef CONFIG_PXA_CERF_RAM_128MB -+#define CERF_RAM_SIZE 128*1024*1024 -+ -+#elif defined (CONFIG_PXA_CERF_RAM_64MB) -+#define CERF_RAM_SIZE 64*1024*1024 -+ -+#elif defined (CONFIG_PXA_CERF_RAM_32MB) -+#define CERF_RAM_SIZE 32*1024*1024 -+ -+#elif defined (CONFIG_PXA_CERF_RAM_16MB) -+#define CERF_RAM_SIZE 16*1024*1024 -+#endif -+ -+/* -+ * CS memory timing via Static Memory Control Register (MSC0-2) -+ */ -+ -+#define MSC_CS(cs,val) ((val)<<((cs&1)<<4)) -+ -+#define MSC_RBUFF_SHIFT 15 -+#define MSC_RBUFF_SLOW (0) -+#define MSC_RBUFF_FAST (1) -+#define MSC_RBUFF(x) ((x)<<MSC_RBUFF_SHIFT) -+ -+#define MSC_RRR_SHIFT 12 -+#define MSC_RRR(x) ((x)<<MSC_RRR_SHIFT) -+ -+#define MSC_RDN_SHIFT 8 -+#define MSC_RDN(x) ((x)<<MSC_RDN_SHIFT) -+ -+#define MSC_RDF_SHIFT 4 -+#define MSC_RDF(x) ((x)<<MSC_RDF_SHIFT) -+ -+#define MSC_RBW_SHIFT 3 -+#define MSC_RBW(x) ((x)<<MSC_RBW_SHIFT) -+ -+#define MSC_RT_SHIFT 0 -+#define MSC_RT(x) ((x)<<MSC_RT_SHIFT) -+ -+/* -+ * IO Pins for devices -+ */ -+ -+#define CERF_FLASH_BASE 0xe8000000 -+#define CERF_FLASH_SIZE 0x02000000 -+#define CERF_FLASH_PHYS PXA_CS0_PHYS -+ -+#define CERF_ETH_BASE 0xf0000000 -+#define CERF_ETH_SIZE 0x00100000 -+#define CERF_ETH_PHYS PXA_CS1_PHYS -+ -+#define CERF_BT_BASE 0xf2000000 -+#define CERF_BT_SIZE 0x00100000 -+#define CERF_BT_PHYS PXA_CS2_PHYS -+ -+#define CERF_SERIAL_BASE 0xf3000000 -+#define CERF_SERIAL_SIZE 0x00100000 -+#define CERF_SERIAL_PHYS PXA_CS3_PHYS -+ -+#define CERF_CPLD_BASE 0xf1000000 -+#define CERF_CPLD_SIZE 0x00100000 -+#define CERF_CPLD_PHYS PXA_CS4_PHYS -+ -+#define CERF_PDA_CPLD_WRCLRINT (0x0) -+#define CERF_PDA_CPLD_BRIGHTNESS (0x2) -+#define CERF_PDA_CPLD_KEYPAD_A (0x6) -+#define CERF_PDA_CPLD_BATTFAULT (0x8) -+#define CERF_PDA_CPLD_KEYPAD_B (0xa) -+#define CERF_PDA_CPLD_SOUND_ENA (0xc) -+ -+#define CERF_PDA_SOUND_ENABLE 0x1 -+#define CERF_PDA_DEFAULT_BRIGHTNESS 0x9 -+ -+/* -+ * Access functions (registers are 4-bit wide) -+ */ -+ -+#define CERF_PDA_CPLD CERF_CPLD_BASE -+ -+#define CERF_PDA_CPLD_Get(x, y) (*((char*)(CERF_PDA_CPLD + (x))) & (y)) -+#define CERF_PDA_CPLD_Set(x, y, z) (*((char*)(CERF_PDA_CPLD + (x))) = (*((char*)(CERF_PDA_CPLD + (x))) & ~(z)) | (y)) -+#define CERF_PDA_CPLD_UnSet(x, y, z) (*((char*)(CERF_PDA_CPLD + (x))) = (*((char*)(CERF_PDA_CPLD + (x))) & ~(z)) & ~(y)) -+ -+/* -+ * IO and IRQ settings for cs8900 ethernet chip -+ */ -+#define CERF_ETH_IO CERF_ETH_BASE -+#define CERF_ETH_IRQ GPIO_2_80_TO_IRQ(21) -+ -+/* -+ * We only have one LED on the XScale CerfPDA so only the -+ * time or idle should ever be selected. -+ */ -+#define CERF_HEARTBEAT_LED 0x1 -+#define CERF_SYS_BUSY_LED 0x2 -+ -+#define CERF_HEARTBEAT_LED_GPIO 16 // GPIO 4 -+#define CERF_SYS_BUSY_LED_GPIO 16 // GPIO 4 -+ -+#define CERF_HEARTBEAT_LED_ON (GPSR0 = CERF_HEARTBEAT_LED_GPIO) -+#define CERF_HEARTBEAT_LED_OFF (GPCR0 = CERF_HEARTBEAT_LED_GPIO) -+#define CERF_SYS_BUSY_LED_ON (GPSR0 = CERF_SYS_BUSY_LED_GPIO) -+#define CERF_SYS_BUSY_LED_OFF (GPCR0 = CERF_SYS_BUSY_LED_GPIO) -+ -+/* -+ * UCB 1400 gpio -+ */ -+ -+#define CERF_GPIO_UCB1400_IRQ 32 -+ -+#define UCB_IO_0 (1 << 0) -+#define UCB_IO_1 (1 << 1) -+#define UCB_IO_2 (1 << 2) -+#define UCB_IO_3 (1 << 3) -+#define UCB_IO_4 (1 << 4) -+#define UCB_IO_5 (1 << 5) -+#define UCB_IO_6 (1 << 6) -+#define UCB_IO_7 (1 << 7) -+#define UCB_IO_8 (1 << 8) -+#define UCB_IO_9 (1 << 9) -+ -+#define UCB1400_GPIO_CONT_CS UCB_IO_0 -+#define UCB1400_GPIO_CONT_DOWN UCB_IO_1 -+#define UCB1400_GPIO_CONT_INC UCB_IO_2 -+#define UCB1400_GPIO_CONT_ENA UCB_IO_3 -+#define UCB1400_GPIO_LCD_RESET UCB_IO_4 -+#define UCB1400_GPIO_IRDA_ENABLE UCB_IO_5 -+#define UCB1400_GPIO_BT_ENABLE UCB_IO_6 -+#define UCB1400_GPIO_TEST_P1 UCB_IO_7 -+#define UCB1400_GPIO_TEST_P2 UCB_IO_8 -+#define UCB1400_GPIO_TEST_P3 UCB_IO_9 -+ -+/* -+ * IRQ for devices -+ */ -+#define UCB1400_IRQ(x) (NR_IRQS + 1 + (x)) -+ -+#define IRQ_UCB1400_IO0 UCB1400_IRQ(0) -+#define IRQ_UCB1400_IO1 UCB1400_IRQ(1) -+#define IRQ_UCB1400_IO2 UCB1400_IRQ(2) -+#define IRQ_UCB1400_IO3 UCB1400_IRQ(3) -+#define IRQ_UCB1400_IO4 UCB1400_IRQ(4) -+#define IRQ_UCB1400_IO5 UCB1400_IRQ(5) -+#define IRQ_UCB1400_IO6 UCB1400_IRQ(6) -+#define IRQ_UCB1400_IO7 UCB1400_IRQ(7) -+#define IRQ_UCB1400_IO8 UCB1400_IRQ(8) -+#define IRQ_UCB1400_IO9 UCB1400_IRQ(9) -+ -+#define IRQ_UCB1400_CONT_CS IRQ_UCB1400_IO0 -+#define IRQ_UCB1400_CONT_DOWN IRQ_UCB1400_IO1 -+#define IRQ_UCB1400_CONT_INC IRQ_UCB1400_IO2 -+#define IRQ_UCB1400_CONT_ENA IRQ_UCB1400_IO3 -+#define IRQ_UCB1400_LCD_RESET IRQ_UCB1400_IO4 -+#define IRQ_UCB1400_IRDA_ENABLE IRQ_UCB1400_IO5 -+#define IRQ_UCB1400_BT_ENABLE IRQ_UCB1400_IO6 -+#define IRQ_UCB1400_TEST_P1 IRQ_UCB1400_IO7 -+#define IRQ_UCB1400_TEST_P2 IRQ_UCB1400_IO8 -+#define IRQ_UCB1400_TEST_P3 IRQ_UCB1400_IO9 -+ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/arch-pxa/cerf_ucb1400gpio.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,30 @@ -+/* -+ * cerf_ucb1400gpio.h -+ * -+ * UCB1400 GPIO control stuff for the cerf. -+ * -+ * Copyright (C) 2002 Intrinsyc Software Inc. -+ * -+ * 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. -+ * -+ * History: -+ * Mar 2002: Initial version [FB] -+ * -+ */ -+/* -- lcd -- */ -+extern void cerf_ucb1400gpio_lcd_enable( void); -+extern void cerf_ucb1400gpio_lcd_disable( void); -+extern void cerf_ucb1400gpio_lcd_contrast_step( int direction); -+ -+/* -- irda -- */ -+extern void cerf_ucb1400gpio_irda_enable( void); -+extern void cerf_ucb1400gpio_irda_disable( void); -+ -+/* -- bt -- */ -+extern void cerf_ucb1400gpio_bt_enable( void); -+extern void cerf_ucb1400gpio_bt_disable( void); -+ -+/* -- init -- */ -+extern int cerf_ucb1400gpio_init(void); ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/arch-pxa/csb226.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,99 @@ -+/* -+ * linux/include/asm-arm/arch-pxa/csb226.h -+ * -+ * Author: Robert Schwebel (stolen from lubbock.h) -+ * Created: Oct 30, 2002 -+ * Copyright: Pengutronix -+ * -+ * 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. -+ */ -+ -+#define CSB226_FPGA_PHYS PXA_CS2_PHYS -+ -+#define CSB226_FPGA_VIRT (0xf0000000) /* phys 0x08000000 */ -+#define CSB226_ETH_BASE (0xf1000000) /* phys 0x0c000000 */ -+ -+#define CSB226_P2V(x) ((x) - CSB226_FPGA_PHYS + CSB226_FPGA_VIRT) -+#define CSB226_V2P(x) ((x) - CSB226_FPGA_VIRT + CSB226_FPGA_PHYS) -+ -+#ifndef __ASSEMBLY__ -+# define __CSB226_REG(x) (*((volatile unsigned long *)CSB226_P2V(x))) -+#else -+# define __CSB226_REG(x) CSB226_P2V(x) -+#endif -+ -+ -+/* register physical addresses */ -+#define _CSB226_MISC_WR (CSB226_FPGA_PHYS + 0x080) -+#define _CSB226_MISC_RD (CSB226_FPGA_PHYS + 0x090) -+#define _CSB226_IRQ_MASK_EN (CSB226_FPGA_PHYS + 0x0C0) -+#define _CSB226_IRQ_SET_CLR (CSB226_FPGA_PHYS + 0x0D0) -+#define _CSB226_GP (CSB226_FPGA_PHYS + 0x100) -+ -+ -+ -+/* register virtual addresses */ -+ -+#define CSB226_MISC_WR __CSB226_REG(_CSB226_MISC_WR) -+#define CSB226_MISC_RD __CSB226_REG(_CSB226_MISC_RD) -+#define CSB226_IRQ_MASK_EN __CSB226_REG(_CSB226_IRQ_MASK_EN) -+#define CSB226_IRQ_SET_CLR __CSB226_REG(_CSB226_IRQ_SET_CLR) -+#define CSB226_GP __CSB226_REG(_CSB226_GP) -+ -+ -+/* GPIOs */ -+ -+#define GPIO_CSB226_IRQ 0 -+#define IRQ_GPIO_CSB226_IRQ IRQ_GPIO0 -+ -+ -+/* -+ * LED macros -+ */ -+ -+// #define LEDS_BASE LUB_DISC_BLNK_LED -+ -+// 8 discrete leds available for general use: -+ -+/* -+#define D28 0x1 -+#define D27 0x2 -+#define D26 0x4 -+#define D25 0x8 -+#define D24 0x10 -+#define D23 0x20 -+#define D22 0x40 -+#define D21 0x80 -+*/ -+ -+/* Note: bits [15-8] are used to enable/blank the 8 7 segment hex displays so -+* be sure to not monkey with them here. -+*/ -+ -+/* -+#define HEARTBEAT_LED D28 -+#define SYS_BUSY_LED D27 -+#define HEXLEDS_BASE LUB_HEXLED -+ -+#define HEARTBEAT_LED_ON (LEDS_BASE &= ~HEARTBEAT_LED) -+#define HEARTBEAT_LED_OFF (LEDS_BASE |= HEARTBEAT_LED) -+#define SYS_BUSY_LED_OFF (LEDS_BASE |= SYS_BUSY_LED) -+#define SYS_BUSY_LED_ON (LEDS_BASE &= ~SYS_BUSY_LED) -+ -+// use x = D26-D21 for these, please... -+#define DISCRETE_LED_ON(x) (LEDS_BASE &= ~(x)) -+#define DISCRETE_LED_OFF(x) (LEDS_BASE |= (x)) -+*/ -+ -+#ifndef __ASSEMBLY__ -+ -+//extern int hexled_val = 0; -+ -+#endif -+ -+/* -+#define BUMP_COUNTER (HEXLEDS_BASE = hexled_val++) -+#define DEC_COUNTER (HEXLEDS_BASE = hexled_val--) -+*/ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/arch-pxa/dma.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,49 @@ -+/* -+ * linux/include/asm-arm/arch-pxa/dma.h -+ * -+ * Author: Nicolas Pitre -+ * Created: Jun 15, 2001 -+ * Copyright: MontaVista Software, Inc. -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ */ -+#ifndef __ASM_ARCH_DMA_H -+#define __ASM_ARCH_DMA_H -+ -+#define MAX_DMA_ADDRESS 0xffffffff -+ -+/* No DMA as the rest of the world see it */ -+#define MAX_DMA_CHANNELS 0 -+ -+/* -+ * Descriptor structure for PXA's DMA engine -+ * Note: this structure must always be aligned to a 16-byte boundary. -+ */ -+ -+typedef struct { -+ volatile u32 ddadr; /* Points to the next descriptor + flags */ -+ volatile u32 dsadr; /* DSADR value for the current transfer */ -+ volatile u32 dtadr; /* DTADR value for the current transfer */ -+ volatile u32 dcmd; /* DCMD value for the current transfer */ -+} pxa_dma_desc; -+ -+/* -+ * DMA registration -+ */ -+ -+typedef enum { -+ DMA_PRIO_HIGH = 0, -+ DMA_PRIO_MEDIUM = 4, -+ DMA_PRIO_LOW = 8 -+} pxa_dma_prio; -+ -+int pxa_request_dma (char *name, -+ pxa_dma_prio prio, -+ void (*irq_handler)(int, void *, struct pt_regs *), -+ void *data); -+ -+void pxa_free_dma (int dma_ch); -+ -+#endif /* _ASM_ARCH_DMA_H */ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/arch-pxa/hardware.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,142 @@ -+/* -+ * linux/include/asm-arm/arch-pxa/hardware.h -+ * -+ * Author: Nicolas Pitre -+ * Created: Jun 15, 2001 -+ * Copyright: MontaVista Software Inc. -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ */ -+ -+#ifndef __ASM_ARCH_HARDWARE_H -+#define __ASM_ARCH_HARDWARE_H -+ -+#include <linux/config.h> -+#include <asm/mach-types.h> -+ -+ -+/* -+ * These are statically mapped PCMCIA IO space for designs using it as a -+ * generic IO bus, typically with ISA parts, hardwired IDE interfaces, etc. -+ * The actual PCMCIA code is mapping required IO region at run time. -+ */ -+#define PCMCIA_IO_0_BASE 0xf6000000 -+#define PCMCIA_IO_1_BASE 0xf7000000 -+ -+ -+/* -+ * XIP kernel text mapping. -+ * Note: the exact virtual address is also specified in arch/arm/Makefile. -+ */ -+#ifdef CONFIG_XIP_KERNEL -+#define KERNEL_XIP_BASE_PHYS (CONFIG_XIP_PHYS_ADDR & 0xffe00000) -+#define KERNEL_XIP_BASE_VIRT 0xe8000000 -+#endif -+ -+ -+/* -+ * We requires absolute addresses. -+ */ -+#define PCIO_BASE 0 -+ -+/* -+ * Workarounds for at least 2 errata so far require this. -+ * The mapping is set in mach-pxa/generic.c. -+ */ -+#define UNCACHED_PHYS_0 0xff000000 -+#define UNCACHED_ADDR UNCACHED_PHYS_0 -+ -+/* -+ * Intel PXA internal I/O mappings: -+ * -+ * 0x40000000 - 0x41ffffff <--> 0xf8000000 - 0xf9ffffff -+ * 0x44000000 - 0x45ffffff <--> 0xfa000000 - 0xfbffffff -+ * 0x48000000 - 0x49ffffff <--> 0xfc000000 - 0xfdffffff -+ */ -+ -+#define io_p2v(x) ( ((x) | 0xbe000000) ^ (~((x) >> 1) & 0x06000000) ) -+#define io_v2p( x ) ( ((x) & 0x41ffffff) ^ ( ((x) & 0x06000000) << 1) ) -+ -+#ifndef __ASSEMBLY__ -+ -+#if 0 -+# define __REG(x) (*((volatile u32 *)io_p2v(x))) -+#else -+/* -+ * This __REG() version gives the same results as the one above, except -+ * that we are fooling gcc somehow so it generates far better and smaller -+ * assembly code for access to contigous registers. It's a shame that gcc -+ * doesn't guess this by itself. -+ */ -+#include <asm/types.h> -+typedef struct { volatile u32 offset[4096]; } __regbase; -+# define __REGP(x) ((__regbase *)((x)&~4095))->offset[((x)&4095)>>2] -+# define __REG(x) __REGP(io_p2v(x)) -+#endif -+ -+/* Let's kick gcc's ass again... */ -+# define __REG2(x,y) \ -+ ( __builtin_constant_p(y) ? (__REG((x) + (y))) \ -+ : (*(volatile u32 *)((u32)&__REG(x) + (y))) ) -+ -+# define __PREG(x) (io_v2p((u32)&(x))) -+ -+#else -+ -+# define __REG(x) io_p2v(x) -+# define __PREG(x) io_v2p(x) -+ -+#endif -+ -+#include "pxa-regs.h" -+ -+#ifndef __ASSEMBLY__ -+ -+/* -+ * GPIO edge detection for IRQs: -+ * IRQs are generated on Falling-Edge, Rising-Edge, or both. -+ * This must be called *before* the corresponding IRQ is registered. -+ * Use this instead of directly setting GRER/GFER. -+ */ -+#define GPIO_FALLING_EDGE 1 -+#define GPIO_RISING_EDGE 2 -+#define GPIO_BOTH_EDGES 3 -+extern void set_GPIO_IRQ_edge( int gpio_nr, int edge_mask ); -+ -+/* -+ * Handy routine to set GPIO alternate functions -+ */ -+extern void set_GPIO_mode( int gpio_mode ); -+ -+/* -+ * return current lclk frequency in units of 10kHz -+ */ -+extern unsigned int get_lclk_frequency_10khz(void); -+ -+/* -+ * return current clk frequency in units of 1kHz -+ */ -+extern unsigned int get_clk_frequency_khz( int info); -+ -+#endif -+ -+ -+/* -+ * Implementation specifics -+ */ -+ -+//#ifdef CONFIG_ARCH_LUBBOCK -+#include "lubbock.h" -+//#endif -+ -+//#ifdef CONFIG_ARCH_PXA_IDP -+#include "idp.h" -+//#endif -+ -+//#ifdef CONFIG_ARCH_PXA_CERF -+#include "cerf.h" -+//#endif -+ -+#endif /* _ASM_ARCH_HARDWARE_H */ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/arch-pxa/ide.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,59 @@ -+/* -+ * linux/include/asm-arm/arch-pxa/ide.h -+ * -+ * Author: George Davis -+ * Created: Jan 10, 2002 -+ * Copyright: MontaVista Software Inc. -+ * -+ * 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. -+ * -+ * -+ * Originally based upon linux/include/asm-arm/arch-sa1100/ide.h -+ * -+ */ -+ -+#include <linux/config.h> -+#include <asm/irq.h> -+#include <asm/hardware.h> -+#include <asm/mach-types.h> -+ -+ -+/* -+ * Set up a hw structure for a specified data port, control port and IRQ. -+ * This should follow whatever the default interface uses. -+ */ -+static __inline__ void -+ide_init_hwif_ports(hw_regs_t *hw, int data_port, int ctrl_port, int *irq) -+{ -+ ide_ioreg_t reg; -+ -+ memset(hw, 0, sizeof(*hw)); -+ -+ reg = (ide_ioreg_t)data_port; -+ -+ hw->io_ports[IDE_DATA_OFFSET] = reg + 0; -+ hw->io_ports[IDE_ERROR_OFFSET] = reg + 1; -+ hw->io_ports[IDE_NSECTOR_OFFSET] = reg + 2; -+ hw->io_ports[IDE_SECTOR_OFFSET] = reg + 3; -+ hw->io_ports[IDE_LCYL_OFFSET] = reg + 4; -+ hw->io_ports[IDE_HCYL_OFFSET] = reg + 5; -+ hw->io_ports[IDE_SELECT_OFFSET] = reg + 6; -+ hw->io_ports[IDE_STATUS_OFFSET] = reg + 7; -+ -+ hw->io_ports[IDE_CONTROL_OFFSET] = (ide_ioreg_t) ctrl_port; -+ -+ if (irq) -+ *irq = 0; -+} -+ -+ -+/* -+ * Register the standard ports for this architecture with the IDE driver. -+ */ -+static __inline__ void -+ide_init_default_hwifs(void) -+{ -+ /* Nothing to declare... */ -+} ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/arch-pxa/idp.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,468 @@ -+/* -+ * linux/include/asm-arm/arch-pxa/idp.h -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * Copyright (c) 2001 Cliff Brake, Accelent Systems Inc. -+ * -+ * 2001-09-13: Cliff Brake <cbrake@accelent.com> -+ * Initial code -+ * -+ */ -+ -+ -+/* -+ * Note: this file must be safe to include in assembly files -+ */ -+ -+/* comment out following if you have a rev01 board */ -+#define PXA_IDP_REV02 1 -+//#undef PXA_IDP_REV02 -+ -+#ifdef PXA_IDP_REV02 -+ -+//Use this as well for 0017-x004 and greater pcb's: -+#define PXA_IDP_REV04 1 -+ -+#define IDP_FLASH_PHYS (PXA_CS0_PHYS) -+#define IDP_ALT_FLASH_PHYS (PXA_CS1_PHYS) -+#define IDP_MEDIAQ_PHYS (PXA_CS3_PHYS) -+#define IDP_IDE_PHYS (PXA_CS5_PHYS + 0x03000000) -+#define IDP_ETH_PHYS (PXA_CS5_PHYS + 0x03400000) -+#define IDP_COREVOLT_PHYS (PXA_CS5_PHYS + 0x03800000) -+#define IDP_CPLD_PHYS (PXA_CS5_PHYS + 0x03C00000) -+ -+ -+/* -+ * virtual memory map -+ */ -+ -+#define IDP_IDE_BASE (0xf0000000) -+#define IDP_IDE_SIZE (1*1024*1024) -+ -+#define IDP_ETH_BASE (IDP_IDE_BASE + IDP_IDE_SIZE) -+#define IDP_ETH_SIZE (1*1024*1024) -+#define ETH_BASE IDP_ETH_BASE //smc9194 driver compatibility issue -+ -+#define IDP_COREVOLT_BASE (IDP_ETH_BASE + IDP_ETH_SIZE) -+#define IDP_COREVOLT_SIZE (1*1024*1024) -+ -+#define IDP_CPLD_BASE (IDP_COREVOLT_BASE + IDP_COREVOLT_SIZE) -+#define IDP_CPLD_SIZE (1*1024*1024) -+ -+#if (IDP_CPLD_BASE + IDP_CPLD_SIZE) > 0xfc000000 -+#error Your custom IO space is getting a bit large !! -+#endif -+ -+#define CPLD_P2V(x) ((x) - IDP_CPLD_PHYS + IDP_CPLD_BASE) -+#define CPLD_V2P(x) ((x) - IDP_CPLD_BASE + IDP_CPLD_PHYS) -+ -+#ifndef __ASSEMBLY__ -+# define __CPLD_REG(x) (*((volatile unsigned long *)CPLD_P2V(x))) -+#else -+# define __CPLD_REG(x) CPLD_P2V(x) -+#endif -+ -+/* board level registers in the CPLD: (offsets from CPLD_BASE) */ -+ -+#define _IDP_CPLD_REV (IDP_CPLD_PHYS + 0x00) -+#define _IDP_CPLD_PERIPH_PWR (IDP_CPLD_PHYS + 0x04) -+#define _IDP_CPLD_LED_CONTROL (IDP_CPLD_PHYS + 0x08) -+#define _IDP_CPLD_KB_COL_HIGH (IDP_CPLD_PHYS + 0x0C) -+#define _IDP_CPLD_KB_COL_LOW (IDP_CPLD_PHYS + 0x10) -+#define _IDP_CPLD_PCCARD_EN (IDP_CPLD_PHYS + 0x14) -+#define _IDP_CPLD_GPIOH_DIR (IDP_CPLD_PHYS + 0x18) -+#define _IDP_CPLD_GPIOH_VALUE (IDP_CPLD_PHYS + 0x1C) -+#define _IDP_CPLD_GPIOL_DIR (IDP_CPLD_PHYS + 0x20) -+#define _IDP_CPLD_GPIOL_VALUE (IDP_CPLD_PHYS + 0x24) -+#define _IDP_CPLD_PCCARD_PWR (IDP_CPLD_PHYS + 0x28) -+#define _IDP_CPLD_MISC_CTRL (IDP_CPLD_PHYS + 0x2C) -+#define _IDP_CPLD_LCD (IDP_CPLD_PHYS + 0x30) -+#define _IDP_CPLD_FLASH_WE (IDP_CPLD_PHYS + 0x34) -+ -+#define _IDP_CPLD_KB_ROW (IDP_CPLD_PHYS + 0x50) -+#define _IDP_CPLD_PCCARD0_STATUS (IDP_CPLD_PHYS + 0x54) -+#define _IDP_CPLD_PCCARD1_STATUS (IDP_CPLD_PHYS + 0x58) -+#define _IDP_CPLD_MISC_STATUS (IDP_CPLD_PHYS + 0x5C) -+ -+/* FPGA register virtual addresses */ -+ -+#define IDP_CPLD_REV __CPLD_REG(_IDP_CPLD_REV) -+#define IDP_CPLD_PERIPH_PWR __CPLD_REG(_IDP_CPLD_PERIPH_PWR) -+#define IDP_CPLD_LED_CONTROL __CPLD_REG(_IDP_CPLD_LED_CONTROL) -+#define IDP_CPLD_KB_COL_HIGH __CPLD_REG(_IDP_CPLD_KB_COL_HIGH) -+#define IDP_CPLD_KB_COL_LOW __CPLD_REG(_IDP_CPLD_KB_COL_LOW) -+#define IDP_CPLD_PCCARD_EN __CPLD_REG(_IDP_CPLD_PCCARD_EN) -+#define IDP_CPLD_GPIOH_DIR __CPLD_REG(_IDP_CPLD_GPIOH_DIR) -+#define IDP_CPLD_GPIOH_VALUE __CPLD_REG(_IDP_CPLD_GPIOH_VALUE) -+#define IDP_CPLD_GPIOL_DIR __CPLD_REG(_IDP_CPLD_GPIOL_DIR) -+#define IDP_CPLD_GPIOL_VALUE __CPLD_REG(_IDP_CPLD_GPIOL_VALUE) -+#define IDP_CPLD_PCCARD_PWR __CPLD_REG(_IDP_CPLD_PCCARD_PWR) -+#define IDP_CPLD_MISC_CTRL __CPLD_REG(_IDP_CPLD_MISC_CTRL) -+#define IDP_CPLD_LCD __CPLD_REG(_IDP_CPLD_LCD) -+#define IDP_CPLD_FLASH_WE __CPLD_REG(_IDP_CPLD_FLASH_WE) -+ -+#define IDP_CPLD_KB_ROW __CPLD_REG(_IDP_CPLD_KB_ROW) -+#define IDP_CPLD_PCCARD0_STATUS __CPLD_REG(_IDP_CPLD_PCCARD0_STATUS) -+#define IDP_CPLD_PCCARD1_STATUS __CPLD_REG(_IDP_CPLD_PCCARD1_STATUS) -+#define IDP_CPLD_MISC_STATUS __CPLD_REG(_IDP_CPLD_MISC_STATUS) -+ -+ -+/* -+ * Bit masks for various registers -+ */ -+// IDP_CPLD_PCCARD_PWR -+#define PCC0_PWR0 (1 << 0) -+#define PCC0_PWR1 (1 << 1) -+#define PCC0_PWR2 (1 << 2) -+#define PCC0_PWR3 (1 << 3) -+#define PCC1_PWR0 (1 << 4) -+#define PCC1_PWR1 (1 << 5) -+#define PCC1_PWR2 (1 << 6) -+#define PCC1_PWR3 (1 << 7) -+ -+// IDP_CPLD_PCCARD_EN -+#define PCC0_RESET (1 << 6) -+#define PCC1_RESET (1 << 7) -+#define PCC0_ENABLE (1 << 0) -+#define PCC1_ENABLE (1 << 1) -+ -+// IDP_CPLD_PCCARDx_STATUS -+#define _PCC_WRPROT (1 << 7) // 7-4 read as low true -+#define _PCC_RESET (1 << 6) -+#define _PCC_IRQ (1 << 5) -+#define _PCC_INPACK (1 << 4) -+#define PCC_BVD2 (1 << 3) -+#define PCC_BVD1 (1 << 2) -+#define PCC_VS2 (1 << 1) -+#define PCC_VS1 (1 << 0) -+ -+#define PCC_DETECT(x) (GPLR(7 + (x)) & GPIO_bit(7 + (x))) -+ -+/* -+ * Macros for LCD Driver -+ */ -+ -+#ifdef CONFIG_FB_PXA -+ -+#define FB_BACKLIGHT_ON() (IDP_CPLD_LCD |= (1<<1)) -+#define FB_BACKLIGHT_OFF() (IDP_CPLD_LCD &= ~(1<<1)) -+ -+#define FB_PWR_ON() (IDP_CPLD_LCD |= (1<< 0)) -+#define FB_PWR_OFF() (IDP_CPLD_LCD &= ~(1<<0)) -+ -+#define FB_VLCD_ON() (IDP_CPLD_LCD |= (1<<2)) -+#define FB_VLCD_OFF() (IDP_CPLD_LCD &= ~(1<<2)) -+ -+#endif -+ -+/* A listing of interrupts used by external hardware devices */ -+ -+#ifdef PXA_IDP_REV04 -+#define TOUCH_PANEL_IRQ IRQ_GPIO(5) -+#define IDE_IRQ IRQ_GPIO(21) -+#else -+#define TOUCH_PANEL_IRQ IRQ_GPIO(21) -+#define IDE_IRQ IRQ_GPIO(5) -+#endif -+ -+#define TOUCH_PANEL_IRQ_EDGE GPIO_FALLING_EDGE -+ -+#define IDE_IRQ_EDGE GPIO_RISING_EDGE -+ -+#define ETHERNET_IRQ IRQ_GPIO(4) -+#define ETHERNET_IRQ_EDGE GPIO_RISING_EDGE -+ -+#define IDE_IRQ_EDGE GPIO_RISING_EDGE -+ -+#define PCMCIA_S0_CD_VALID IRQ_GPIO(7) -+#define PCMCIA_S0_CD_VALID_EDGE GPIO_BOTH_EDGES -+ -+#define PCMCIA_S1_CD_VALID IRQ_GPIO(8) -+#define PCMCIA_S1_CD_VALID_EDGE GPIO_BOTH_EDGES -+ -+#define PCMCIA_S0_RDYINT IRQ_GPIO(19) -+#define PCMCIA_S1_RDYINT IRQ_GPIO(22) -+ -+/* -+ * Macros for LED Driver -+ */ -+ -+/* leds 0 = ON */ -+#define IDP_HB_LED (1<<5) -+#define IDP_BUSY_LED (1<<6) -+ -+#define IDP_LEDS_MASK (IDP_HB_LED | IDP_BUSY_LED) -+ -+#define IDP_WRITE_LEDS(value) (IDP_CPLD_LED_CONTROL = (IDP_CPLD_LED_CONTROL & (~(IDP_LEDS_MASK)) | value)) -+ -+/* -+ * macros for MTD driver -+ */ -+ -+#define FLASH_WRITE_PROTECT_DISABLE() ((IDP_CPLD_FLASH_WE) &= ~(0x1)) -+#define FLASH_WRITE_PROTECT_ENABLE() ((IDP_CPLD_FLASH_WE) |= (0x1)) -+ -+/* -+ * macros for matrix keyboard driver -+ */ -+ -+#define KEYBD_MATRIX_NUMBER_INPUTS 7 -+#define KEYBD_MATRIX_NUMBER_OUTPUTS 14 -+ -+#define KEYBD_MATRIX_INVERT_OUTPUT_LOGIC FALSE -+#define KEYBD_MATRIX_INVERT_INPUT_LOGIC FALSE -+ -+#define KEYBD_MATRIX_SETTLING_TIME_US 100 -+#define KEYBD_MATRIX_KEYSTATE_DEBOUNCE_CONSTANT 2 -+ -+#define KEYBD_MATRIX_SET_OUTPUTS(outputs) \ -+{\ -+ IDP_CPLD_KB_COL_LOW = outputs;\ -+ IDP_CPLD_KB_COL_HIGH = outputs >> 7;\ -+} -+ -+#define KEYBD_MATRIX_GET_INPUTS(inputs) \ -+{\ -+ inputs = (IDP_CPLD_KB_ROW & 0x7f);\ -+} -+ -+//------------------------------------------------------------------------------ -+ -+#else // must be rev 01 -+ -+/* ----------------------------------------------------------------------------- -+ * following is for rev01 boards only -+ */ -+ -+#define IDP_FLASH_PHYS (PXA_CS0_PHYS) -+#define IDP_ALT_FLASH_PHYS (PXA_CS1_PHYS) -+#define IDP_MEDIAQ_PHYS (PXA_CS3_PHYS) -+#define IDP_CTRL_PORT_PHYS (PXA_CS5_PHYS + 0x02C00000) -+#define IDP_IDE_PHYS (PXA_CS5_PHYS + 0x03000000) -+#define IDP_ETH_PHYS (PXA_CS5_PHYS + 0x03400000) -+#define IDP_COREVOLT_PHYS (PXA_CS5_PHYS + 0x03800000) -+#define IDP_CPLD_PHYS (PXA_CS5_PHYS + 0x03C00000) -+ -+ -+/* -+ * virtual memory map -+ */ -+ -+#define IDP_CTRL_PORT_BASE (0xf0000000) -+#define IDP_CTRL_PORT_SIZE (1*1024*1024) -+ -+#define IDP_IDE_BASE (IDP_CTRL_PORT_BASE + IDP_CTRL_PORT_SIZE) -+#define IDP_IDE_SIZE (1*1024*1024) -+ -+#define IDP_ETH_BASE (IDP_IDE_BASE + IDP_IDE_SIZE) -+#define IDP_ETH_SIZE (1*1024*1024) -+ -+#define IDP_COREVOLT_BASE (IDP_ETH_BASE + IDP_ETH_SIZE) -+#define IDP_COREVOLT_SIZE (1*1024*1024) -+ -+#define IDP_CPLD_BASE (IDP_COREVOLT_BASE + IDP_COREVOLT_SIZE) -+#define IDP_CPLD_SIZE (1*1024*1024) -+ -+#if (IDP_CPLD_BASE + IDP_CPLD_SIZE) > 0xfc000000 -+#error Your custom IO space is getting a bit large !! -+#endif -+ -+#define CPLD_P2V(x) ((x) - IDP_CPLD_PHYS + IDP_CPLD_BASE) -+#define CPLD_V2P(x) ((x) - IDP_CPLD_BASE + IDP_CPLD_PHYS) -+ -+#ifndef __ASSEMBLY__ -+# define __CPLD_REG(x) (*((volatile unsigned long *)CPLD_P2V(x))) -+#else -+# define __CPLD_REG(x) CPLD_P2V(x) -+#endif -+ -+/* board level registers in the CPLD: (offsets from CPLD_BASE) */ -+ -+#define _IDP_CPLD_LED_CONTROL (IDP_CPLD_PHYS + 0x00) -+#define _IDP_CPLD_PERIPH_PWR (IDP_CPLD_PHYS + 0x04) -+#define _IDP_CPLD_CIR (IDP_CPLD_PHYS + 0x08) -+#define _IDP_CPLD_KB_COL_HIGH (IDP_CPLD_PHYS + 0x0C) -+#define _IDP_CPLD_KB_COL_LOW (IDP_CPLD_PHYS + 0x10) -+#define _IDP_CPLD_PCCARD_EN (IDP_CPLD_PHYS + 0x14) -+#define _IDP_CPLD_GPIOH_DIR (IDP_CPLD_PHYS + 0x18) -+#define _IDP_CPLD_GPIOH_VALUE (IDP_CPLD_PHYS + 0x1C) -+#define _IDP_CPLD_GPIOL_DIR (IDP_CPLD_PHYS + 0x20) -+#define _IDP_CPLD_GPIOL_VALUE (IDP_CPLD_PHYS + 0x24) -+#define _IDP_CPLD_MISC (IDP_CPLD_PHYS + 0x28) -+#define _IDP_CPLD_PCCARD0_STATUS (IDP_CPLD_PHYS + 0x2C) -+#define _IDP_CPLD_PCCARD1_STATUS (IDP_CPLD_PHYS + 0x30) -+ -+/* FPGA register virtual addresses */ -+#define IDP_CPLD_LED_CONTROL __CPLD_REG(_IDP_CPLD_LED_CONTROL) /* write only */ -+#define IDP_CPLD_PERIPH_PWR __CPLD_REG(_IDP_CPLD_PERIPH_PWR) /* write only */ -+#define IDP_CPLD_CIR __CPLD_REG(_IDP_CPLD_CIR) /* write only */ -+#define IDP_CPLD_KB_COL_HIGH __CPLD_REG(_IDP_CPLD_KB_COL_HIGH) /* write only */ -+#define IDP_CPLD_KB_COL_LOW __CPLD_REG(_IDP_CPLD_KB_COL_LOW) /* write only */ -+#define IDP_CPLD_PCCARD_EN __CPLD_REG(_IDP_CPLD_PCCARD_EN) /* write only */ -+#define IDP_CPLD_GPIOH_DIR __CPLD_REG(_IDP_CPLD_GPIOH_DIR) /* write only */ -+#define IDP_CPLD_GPIOH_VALUE __CPLD_REG(_IDP_CPLD_GPIOH_VALUE) /* write only */ -+#define IDP_CPLD_GPIOL_DIR __CPLD_REG(_IDP_CPLD_GPIOL_DIR) /* write only */ -+#define IDP_CPLD_GPIOL_VALUE __CPLD_REG(_IDP_CPLD_GPIOL_VALUE) /* write only */ -+#define IDP_CPLD_MISC __CPLD_REG(_IDP_CPLD_MISC) /* read only */ -+#define IDP_CPLD_PCCARD0_STATUS __CPLD_REG(_IDP_CPLD_PCCARD0_STATUS) /* read only */ -+#define IDP_CPLD_PCCARD1_STATUS __CPLD_REG(_IDP_CPLD_PCCARD1_STATUS) /* read only */ -+ -+ -+#ifndef __ASSEMBLY__ -+ -+/* shadow registers for write only registers */ -+extern unsigned int idp_cpld_led_control_shadow; -+extern unsigned int idp_cpld_periph_pwr_shadow; -+extern unsigned int idp_cpld_cir_shadow; -+extern unsigned int idp_cpld_kb_col_high_shadow; -+extern unsigned int idp_cpld_kb_col_low_shadow; -+extern unsigned int idp_cpld_pccard_en_shadow; -+extern unsigned int idp_cpld_gpioh_dir_shadow; -+extern unsigned int idp_cpld_gpioh_value_shadow; -+extern unsigned int idp_cpld_gpiol_dir_shadow; -+extern unsigned int idp_cpld_gpiol_value_shadow; -+ -+extern unsigned int idp_control_port_shadow; -+ -+/* -+ * macros to write to write only register -+ * -+ * none of these macros are protected from -+ * multiple drivers using them in interrupt context. -+ */ -+ -+#define WRITE_IDP_CPLD_LED_CONTROL(value, mask) \ -+{\ -+ idp_cpld_led_control_shadow = ((value & mask) | (idp_cpld_led_control_shadow & ~mask));\ -+ IDP_CPLD_LED_CONTROL = idp_cpld_led_control_shadow;\ -+} -+#define WRITE_IDP_CPLD_PERIPH_PWR(value, mask) \ -+{\ -+ idp_cpld_periph_pwr_shadow = ((value & mask) | (idp_cpld_periph_pwr_shadow & ~mask));\ -+ IDP_CPLD_PERIPH_PWR = idp_cpld_periph_pwr_shadow;\ -+} -+#define WRITE_IDP_CPLD_CIR(value, mask) \ -+{\ -+ idp_cpld_cir_shadow = ((value & mask) | (idp_cpld_cir_shadow & ~mask));\ -+ IDP_CPLD_CIR = idp_cpld_cir_shadow;\ -+} -+#define WRITE_IDP_CPLD_KB_COL_HIGH(value, mask) \ -+{\ -+ idp_cpld_kb_col_high_shadow = ((value & mask) | (idp_cpld_kb_col_high_shadow & ~mask));\ -+ IDP_CPLD_KB_COL_HIGH = idp_cpld_kb_col_high_shadow;\ -+} -+#define WRITE_IDP_CPLD_KB_COL_LOW(value, mask) \ -+{\ -+ idp_cpld_kb_col_low_shadow = ((value & mask) | (idp_cpld_kb_col_low_shadow & ~mask));\ -+ IDP_CPLD_KB_COL_LOW = idp_cpld_kb_col_low_shadow;\ -+} -+#define WRITE_IDP_CPLD_PCCARD_EN(value, mask) \ -+{\ -+ idp_cpld_ = ((value & mask) | (idp_cpld_led_control_shadow & ~mask));\ -+ IDP_CPLD_LED_CONTROL = idp_cpld_led_control_shadow;\ -+} -+#define WRITE_IDP_CPLD_GPIOH_DIR(value, mask) \ -+{\ -+ idp_cpld_gpioh_dir_shadow = ((value & mask) | (idp_cpld_gpioh_dir_shadow & ~mask));\ -+ IDP_CPLD_GPIOH_DIR = idp_cpld_gpioh_dir_shadow;\ -+} -+#define WRITE_IDP_CPLD_GPIOH_VALUE(value, mask) \ -+{\ -+ idp_cpld_gpioh_value_shadow = ((value & mask) | (idp_cpld_gpioh_value_shadow & ~mask));\ -+ IDP_CPLD_GPIOH_VALUE = idp_cpld_gpioh_value_shadow;\ -+} -+#define WRITE_IDP_CPLD_GPIOL_DIR(value, mask) \ -+{\ -+ idp_cpld_gpiol_dir_shadow = ((value & mask) | (idp_cpld_gpiol_dir_shadow & ~mask));\ -+ IDP_CPLD_GPIOL_DIR = idp_cpld_gpiol_dir_shadow;\ -+} -+#define WRITE_IDP_CPLD_GPIOL_VALUE(value, mask) \ -+{\ -+ idp_cpld_gpiol_value_shadow = ((value & mask) | (idp_cpld_gpiol_value_shadow & ~mask));\ -+ IDP_CPLD_GPIOL_VALUE = idp_cpld_gpiol_value_shadow;\ -+} -+ -+#define WRITE_IDP_CONTROL_PORT(value, mask) \ -+{\ -+ idp_control_port_shadow = ((value & mask) | (idp_control_port_shadow & ~mask));\ -+ (*((volatile unsigned long *)IDP_CTRL_PORT_BASE)) = idp_control_port_shadow;\ -+} -+ -+#endif -+ -+/* A listing of interrupts used by external hardware devices */ -+ -+#define TOUCH_PANEL_IRQ IRQ_GPIO(21) -+#define TOUCH_PANEL_IRQ_EGDE GPIO_FALLING_EDGE -+ -+#define ETHERNET_IRQ IRQ_GPIO(4) -+#define ETHERNET_IRQ_EDGE GPIO_RISING_EDGE -+ -+/* -+ * Bit masks for various registers -+ */ -+ -+ -+/* control port */ -+#define IDP_CONTROL_PORT_PCSLOT0_0 (1 << 0) -+#define IDP_CONTROL_PORT_PCSLOT0_1 (1 << 1) -+#define IDP_CONTROL_PORT_PCSLOT0_2 (1 << 2) -+#define IDP_CONTROL_PORT_PCSLOT0_3 (1 << 3) -+#define IDP_CONTROL_PORT_PCSLOT1_1 (1 << 4) -+#define IDP_CONTROL_PORT_PCSLOT1_2 (1 << 5) -+#define IDP_CONTROL_PORT_PCSLOT1_3 (1 << 6) -+#define IDP_CONTROL_PORT_PCSLOT1_4 (1 << 7) -+#define IDP_CONTROL_PORT_SERIAL1_EN (1 << 9) -+#define IDP_CONTROL_PORT_SERIAL2_EN (1 << 10) -+#define IDP_CONTROL_PORT_SERIAL3_EN (1 << 11) -+#define IDP_CONTROL_PORT_IRDA_FIR (1 << 12) -+#define IDP_CONTROL_PORT_IRDA_M0 (1 << 13) -+#define IDP_CONTROL_PORT_IRDA_M1 (1 << 14) -+#define IDP_CONTROL_PORT_I2S_PWR (1 << 15) -+#define IDP_CONTROL_PORT_FLASH_WP (1 << 19) -+#define IDP_CONTROL_PORT_MILL_EN (1 << 20) -+#define IDP_CONTROL_PORT_LCD_PWR (1 << 21) -+#define IDP_CONTROL_PORT_LCD_BKLEN (1 << 22) -+#define IDP_CONTROL_PORT_LCD_ENAVLCD (1 << 23) -+ -+/* -+ * Macros for LCD Driver -+ */ -+ -+#ifdef CONFIG_FB_PXA -+ -+#define FB_BACKLIGHT_ON() WRITE_IDP_CONTROL_PORT(IDP_CONTROL_PORT_LCD_BKLEN, IDP_CONTROL_PORT_LCD_BKLEN) -+#define FB_BACKLIGHT_OFF() WRITE_IDP_CONTROL_PORT(0, IDP_CONTROL_PORT_LCD_BKLEN) -+ -+#define FB_PWR_ON() WRITE_IDP_CONTROL_PORT(IDP_CONTROL_PORT_LCD_PWR, IDP_CONTROL_PORT_LCD_PWR) -+#define FB_PWR_OFF() WRITE_IDP_CONTROL_PORT(0, IDP_CONTROL_PORT_LCD_PWR) -+ -+#define FB_VLCD_ON() WRITE_IDP_CONTROL_PORT(IDP_CONTROL_PORT_LCD_ENAVLCD, IDP_CONTROL_PORT_LCD_ENAVLCD) -+#define FB_VLCD_OFF() WRITE_IDP_CONTROL_PORT(0, IDP_CONTROL_PORT_LCD_ENAVLCD) -+ -+#endif -+ -+ -+/* -+ * Macros for LED Driver -+ */ -+ -+/* leds 0 = ON */ -+#define IDP_HB_LED 0x1 -+#define IDP_BUSY_LED 0x2 -+ -+#define IDP_LEDS_MASK (IDP_HB_LED | IDP_BUSY_LED) -+ -+#define IDP_WRITE_LEDS(value) WRITE_IDP_CPLD_LED_CONTROL(value, IDP_LEDS_MASK) -+ -+/* -+ * macros for MTD driver -+ */ -+ -+#define FLASH_WRITE_PROTECT_DISABLE() WRITE_IDP_CONTROL_PORT(0, IDP_CONTROL_PORT_FLASH_WP) -+#define FLASH_WRITE_PROTECT_ENABLE() WRITE_IDP_CONTROL_PORT(IDP_CONTROL_PORT_FLASH_WP, IDP_CONTROL_PORT_FLASH_WP) -+ -+#endif ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/arch-pxa/innokom.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,47 @@ -+/* -+ * linux/include/asm-arm/arch-pxa/innokom.h -+ * -+ * (c) 2003 Robert Schwebel <r.schwebel@pengutronix.de>, Pengutronix -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+ */ -+ -+/* -+ * GPIOs -+ */ -+#define GPIO_INNOKOM_RESET 3 -+#define GPIO_INNOKOM_SW_UPDATE 11 -+#define GPIO_INNOKOM_ETH 59 -+ -+/* -+ * ethernet chip (SMSC91C111) -+ */ -+#define INNOKOM_ETH_PHYS PXA_CS5_PHYS -+#define INNOKOM_ETH_BASE (0xf0000000) /* phys 0x14000000 */ -+#define INNOKOM_ETH_SIZE (1*1024*1024) -+#define INNOKOM_ETH_IRQ IRQ_GPIO(GPIO_INNOKOM_ETH) -+#define INNOKOM_ETH_IRQ_EDGE GPIO_RISING_EDGE -+ -+/* -+ * virtual to physical conversion macros -+ */ -+#define INNOKOM_P2V(x) ((x) - INNOKOM_FPGA_PHYS + INNOKOM_FPGA_VIRT) -+#define INNOKOM_V2P(x) ((x) - INNOKOM_FPGA_VIRT + INNOKOM_FPGA_PHYS) -+ -+#ifndef __ASSEMBLY__ -+# define __INNOKOM_REG(x) (*((volatile unsigned long *)INNOKOM_P2V(x))) -+#else -+# define __INNOKOM_REG(x) INNOKOM_P2V(x) -+#endif ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/arch-pxa/io.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,34 @@ -+/* -+ * linux/include/asm-arm/arch-pxa/io.h -+ * -+ * Author: Nicolas Pitre -+ * Created: Jun 15, 2001 -+ * Copyright: MontaVista Software Inc. -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ */ -+#ifndef __ASM_ARM_ARCH_IO_H -+#define __ASM_ARM_ARCH_IO_H -+ -+#define IO_SPACE_LIMIT 0xffffffff -+ -+/* -+ * We don't actually have real ISA nor PCI buses, but there is so many -+ * drivers out there that might just work if we fake them... -+ */ -+#define __io(a) (a) -+#define __mem_pci(a) ((unsigned long)(a)) -+#define __mem_isa(a) ((unsigned long)(a)) -+ -+/* -+ * Generic virtual read/write -+ */ -+#define __arch_getw(a) (*(volatile unsigned short *)(a)) -+#define __arch_putw(v,a) (*(volatile unsigned short *)(a) = (v)) -+ -+#define iomem_valid_addr(iomem,sz) (1) -+#define iomem_to_phys(iomem) (iomem) -+ -+#endif ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/arch-pxa/irq.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,19 @@ -+/* -+ * linux/include/asm-arm/arch-pxa/irq.h -+ * -+ * Author: Nicolas Pitre -+ * Created: Jun 15, 2001 -+ * Copyright: MontaVista Software Inc. -+ * -+ * 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. -+ */ -+ -+#define fixup_irq(x) (x) -+ -+/* -+ * This prototype is required for cascading of multiplexed interrupts. -+ * Since it doesn't exist elsewhere, we'll put it here for now. -+ */ -+extern void do_IRQ(int irq, struct pt_regs *regs); ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/arch-pxa/irqs.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,137 @@ -+/* -+ * linux/include/asm-arm/arch-pxa/irqs.h -+ * -+ * Author: Nicolas Pitre -+ * Created: Jun 15, 2001 -+ * Copyright: MontaVista Software Inc. -+ * -+ * 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. -+ */ -+ -+#define PXA_IRQ_SKIP 7 /* The first 7 IRQs are not yet used */ -+#define PXA_IRQ(x) ((x) - PXA_IRQ_SKIP) -+ -+#define IRQ_HWUART PXA_IRQ(7) /* HWUART Transmit/Receive/Error */ -+#define IRQ_GPIO0 PXA_IRQ(8) /* GPIO0 Edge Detect */ -+#define IRQ_GPIO1 PXA_IRQ(9) /* GPIO1 Edge Detect */ -+#define IRQ_GPIO_2_80 PXA_IRQ(10) /* GPIO[2-80] Edge Detect */ -+#define IRQ_USB PXA_IRQ(11) /* USB Service */ -+#define IRQ_PMU PXA_IRQ(12) /* Performance Monitoring Unit */ -+#define IRQ_I2S PXA_IRQ(13) /* I2S Interrupt */ -+#define IRQ_AC97 PXA_IRQ(14) /* AC97 Interrupt */ -+#define IRQ_ASSP PXA_IRQ(15) /* Audio SSP Service Request */ -+#define IRQ_NSSP PXA_IRQ(16) /* Network SSP Service Request */ -+#define IRQ_LCD PXA_IRQ(17) /* LCD Controller Service Request */ -+#define IRQ_I2C PXA_IRQ(18) /* I2C Service Request */ -+#define IRQ_ICP PXA_IRQ(19) /* ICP Transmit/Receive/Error */ -+#define IRQ_STUART PXA_IRQ(20) /* STUART Transmit/Receive/Error */ -+#define IRQ_BTUART PXA_IRQ(21) /* BTUART Transmit/Receive/Error */ -+#define IRQ_FFUART PXA_IRQ(22) /* FFUART Transmit/Receive/Error*/ -+#define IRQ_MMC PXA_IRQ(23) /* MMC Status/Error Detection */ -+#define IRQ_SSP PXA_IRQ(24) /* SSP Service Request */ -+#define IRQ_DMA PXA_IRQ(25) /* DMA Channel Service Request */ -+#define IRQ_OST0 PXA_IRQ(26) /* OS Timer match 0 */ -+#define IRQ_OST1 PXA_IRQ(27) /* OS Timer match 1 */ -+#define IRQ_OST2 PXA_IRQ(28) /* OS Timer match 2 */ -+#define IRQ_OST3 PXA_IRQ(29) /* OS Timer match 3 */ -+#define IRQ_RTC1Hz PXA_IRQ(30) /* RTC HZ Clock Tick */ -+#define IRQ_RTCAlrm PXA_IRQ(31) /* RTC Alarm */ -+ -+#define GPIO_2_80_TO_IRQ(x) \ -+ PXA_IRQ((x) - 2 + 32) -+#define IRQ_GPIO(x) (((x) < 2) ? (IRQ_GPIO0 + (x)) : GPIO_2_80_TO_IRQ(x)) -+ -+#define IRQ_TO_GPIO_2_80(i) \ -+ ((i) - PXA_IRQ(32) + 2) -+#define IRQ_TO_GPIO(i) ((i) - (((i) > IRQ_GPIO1) ? IRQ_GPIO(2) - 2 : IRQ_GPIO(0))) -+ -+#define NR_IRQS (IRQ_GPIO(80) + 1) -+ -+#if defined(CONFIG_SA1111) -+ -+#define IRQ_SA1111_START (IRQ_GPIO(80) + 1) -+#define SA1111_IRQ(x) (IRQ_SA1111_START + (x)) -+ -+#define IRQ_GPAIN0 SA1111_IRQ(0) -+#define IRQ_GPAIN1 SA1111_IRQ(1) -+#define IRQ_GPAIN2 SA1111_IRQ(2) -+#define IRQ_GPAIN3 SA1111_IRQ(3) -+#define IRQ_GPBIN0 SA1111_IRQ(4) -+#define IRQ_GPBIN1 SA1111_IRQ(5) -+#define IRQ_GPBIN2 SA1111_IRQ(6) -+#define IRQ_GPBIN3 SA1111_IRQ(7) -+#define IRQ_GPBIN4 SA1111_IRQ(8) -+#define IRQ_GPBIN5 SA1111_IRQ(9) -+#define IRQ_GPCIN0 SA1111_IRQ(10) -+#define IRQ_GPCIN1 SA1111_IRQ(11) -+#define IRQ_GPCIN2 SA1111_IRQ(12) -+#define IRQ_GPCIN3 SA1111_IRQ(13) -+#define IRQ_GPCIN4 SA1111_IRQ(14) -+#define IRQ_GPCIN5 SA1111_IRQ(15) -+#define IRQ_GPCIN6 SA1111_IRQ(16) -+#define IRQ_GPCIN7 SA1111_IRQ(17) -+#define IRQ_MSTXINT SA1111_IRQ(18) -+#define IRQ_MSRXINT SA1111_IRQ(19) -+#define IRQ_MSSTOPERRINT SA1111_IRQ(20) -+#define IRQ_TPTXINT SA1111_IRQ(21) -+#define IRQ_TPRXINT SA1111_IRQ(22) -+#define IRQ_TPSTOPERRINT SA1111_IRQ(23) -+#define SSPXMTINT SA1111_IRQ(24) -+#define SSPRCVINT SA1111_IRQ(25) -+#define SSPROR SA1111_IRQ(26) -+#define AUDXMTDMADONEA SA1111_IRQ(32) -+#define AUDRCVDMADONEA SA1111_IRQ(33) -+#define AUDXMTDMADONEB SA1111_IRQ(34) -+#define AUDRCVDMADONEB SA1111_IRQ(35) -+#define AUDTFSR SA1111_IRQ(36) -+#define AUDRFSR SA1111_IRQ(37) -+#define AUDTUR SA1111_IRQ(38) -+#define AUDROR SA1111_IRQ(39) -+#define AUDDTS SA1111_IRQ(40) -+#define AUDRDD SA1111_IRQ(41) -+#define AUDSTO SA1111_IRQ(42) -+#define USBPWR SA1111_IRQ(43) -+#define NIRQHCIM SA1111_IRQ(44) -+#define HCIBUFFACC SA1111_IRQ(45) -+#define HCIRMTWKP SA1111_IRQ(46) -+#define NHCIMFCIR SA1111_IRQ(47) -+#define PORT_RESUME SA1111_IRQ(48) -+#define S0_READY_NINT SA1111_IRQ(49) -+#define S1_READY_NINT SA1111_IRQ(50) -+#define S0_CD_VALID SA1111_IRQ(51) -+#define S1_CD_VALID SA1111_IRQ(52) -+#define S0_BVD1_STSCHG SA1111_IRQ(53) -+#define S1_BVD1_STSCHG SA1111_IRQ(54) -+ -+#define SA1111_IRQ_MAX SA1111_IRQ(54) -+ -+#undef NR_IRQS -+#define NR_IRQS (SA1111_IRQ_MAX + 1) -+ -+#endif // defined(CONFIG_SA1111) -+ -+#if defined(CONFIG_ARCH_LUBBOCK) || defined(CONFIG_ARCH_PXA_IDP) -+#if CONFIG_SA1111 -+#define LUBBOCK_IRQ(x) (SA1111_IRQ_MAX + 1 + (x)) -+#else -+#define LUBBOCK_IRQ(x) (IRQ_GPIO(80) + 1 + (x)) -+#endif -+ -+#define LUBBOCK_SD_IRQ LUBBOCK_IRQ(0) -+#define LUBBOCK_SA1111_IRQ LUBBOCK_IRQ(1) -+#define LUBBOCK_USB_IRQ LUBBOCK_IRQ(2) -+#define LUBBOCK_ETH_IRQ LUBBOCK_IRQ(3) -+#define LUBBOCK_UCB1400_IRQ LUBBOCK_IRQ(4) -+#define LUBBOCK_BB_IRQ LUBBOCK_IRQ(5) -+#define LUBBOCK_USB_DISC_IRQ LUBBOCK_IRQ(6) /* usb disconnect */ -+#define LUBBOCK_LAST_IRQ LUBBOCK_IRQ(6) -+ -+#undef NR_IRQS -+#define NR_IRQS (LUBBOCK_LAST_IRQ + 1) -+ -+#endif // CONFIG_ARCH_LUBBOCK -+ -+ -+ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/arch-pxa/keyboard.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,29 @@ -+/* -+ * linux/include/asm-arm/arch-pxa/keyboard.h -+ * -+ * This file contains the architecture specific keyboard definitions -+ */ -+ -+#ifndef _PXA_KEYBOARD_H -+#define _PXA_KEYBOARD_H -+ -+#include <linux/config.h> -+#include <asm/mach-types.h> -+#include <asm/hardware.h> -+ -+extern struct kbd_ops_struct *kbd_ops; -+ -+#define kbd_disable_irq() do { } while(0); -+#define kbd_enable_irq() do { } while(0); -+ -+extern int sa1111_kbd_init_hw(void); -+ -+static inline void kbd_init_hw(void) -+{ -+ if (machine_is_lubbock()) -+ sa1111_kbd_init_hw(); -+} -+ -+ -+#endif /* _PXA_KEYBOARD_H */ -+ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/arch-pxa/lubbock.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,113 @@ -+/* -+ * linux/include/asm-arm/arch-pxa/lubbock.h -+ * -+ * Author: Nicolas Pitre -+ * Created: Jun 15, 2001 -+ * Copyright: MontaVista Software Inc. -+ * -+ * 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. -+ */ -+ -+#define LUBBOCK_FPGA_PHYS PXA_CS2_PHYS -+#define LUBBOCK_FPGA_VIRT (0xf0000000) /* phys 0x08000000 */ -+#define LUBBOCK_ETH_PHYS PXA_CS3_PHYS -+#define LUBBOCK_ETH_VIRT (0xf1000000) -+#define LUBBOCK_SA1111_BASE (0xf4000000) /* phys 0x10000000 */ -+ -+#define LUB_P2V(x) ((x) - LUBBOCK_FPGA_PHYS + LUBBOCK_FPGA_VIRT) -+#define LUB_V2P(x) ((x) - LUBBOCK_FPGA_VIRT + LUBBOCK_FPGA_PHYS) -+ -+#ifndef __ASSEMBLY__ -+# define __LUB_REG(x) (*((volatile unsigned long *)LUB_P2V(x))) -+#else -+# define __LUB_REG(x) LUB_P2V(x) -+#endif -+ -+/* board level registers in the CPLD: (offsets from CPLD_BASE) */ -+ -+#define WHOAMI 0 // card ID's (see programmers manual) -+#define HEX_LED 0x10 // R/W access to 8 7 segment displays -+#define DISC_BLNK_LED 0x40 // R/W [15-8] enables for hex leds, [7-0] discrete LEDs -+#define CONF_SWITCHES 0x50 // RO [1] flash wrt prot, [0] 0= boot from rom, 1= flash -+#define USER_SWITCHES 0x60 // RO [15-8] dip switches, [7-0] 2 hex encoding switches -+#define MISC_WR 0x80 // R/W various system controls -see manual -+#define MISC_RD 0x90 // RO various system status bits -see manual -+//#define LUB_IRQ_MASK_EN 0xC0 // R/W 0= mask, 1= enable of TS, codec, ethernet, USB, SA1111, and card det. irq's -+//#define LUB_IRQ_SET_CLR 0xD0 // R/W 1= set, 0 = clear IRQ's from TS, codec, etc... -+//#define LUB_GP 0x100 // R/W [15-0] 16 bits of general purpose I/o for hacking -+ -+ -+/* FPGA register physical addresses */ -+#define _LUB_WHOAMI (LUBBOCK_FPGA_PHYS + 0x000) -+#define _LUB_HEXLED (LUBBOCK_FPGA_PHYS + 0x010) -+#define _LUB_DISC_BLNK_LED (LUBBOCK_FPGA_PHYS + 0x040) -+#define _LUB_CONF_SWITCHES (LUBBOCK_FPGA_PHYS + 0x050) -+#define _LUB_USER_SWITCHES (LUBBOCK_FPGA_PHYS + 0x060) -+#define _LUB_MISC_WR (LUBBOCK_FPGA_PHYS + 0x080) -+#define _LUB_MISC_RD (LUBBOCK_FPGA_PHYS + 0x090) -+#define _LUB_IRQ_MASK_EN (LUBBOCK_FPGA_PHYS + 0x0C0) -+#define _LUB_IRQ_SET_CLR (LUBBOCK_FPGA_PHYS + 0x0D0) -+#define _LUB_GP (LUBBOCK_FPGA_PHYS + 0x100) -+ -+/* FPGA register virtual addresses */ -+#define LUB_WHOAMI __LUB_REG(_LUB_WHOAMI) -+#define LUB_HEXLED __LUB_REG(_LUB_HEXLED) -+#define LUB_DISC_BLNK_LED __LUB_REG(_LUB_DISC_BLNK_LED) -+#define LUB_CONF_SWITCHES __LUB_REG(_LUB_CONF_SWITCHES) -+#define LUB_USER_SWITCHES __LUB_REG(_LUB_USER_SWITCHES) -+#define LUB_MISC_WR __LUB_REG(_LUB_MISC_WR) -+#define LUB_MISC_RD __LUB_REG(_LUB_MISC_RD) -+#define LUB_IRQ_MASK_EN __LUB_REG(_LUB_IRQ_MASK_EN) -+#define LUB_IRQ_SET_CLR __LUB_REG(_LUB_IRQ_SET_CLR) -+#define LUB_GP __LUB_REG(_LUB_GP) -+ -+/* GPIOs */ -+ -+#define GPIO_LUBBOCK_IRQ 0 -+#define IRQ_GPIO_LUBBOCK_IRQ IRQ_GPIO0 -+ -+ -+/* -+ * LED macros -+ */ -+ -+#define LEDS_BASE LUB_DISC_BLNK_LED -+ -+// 8 discrete leds available for general use: -+ -+#define D28 0x1 -+#define D27 0x2 -+#define D26 0x4 -+#define D25 0x8 -+#define D24 0x10 -+#define D23 0x20 -+#define D22 0x40 -+#define D21 0x80 -+ -+/* Note: bits [15-8] are used to enable/blank the 8 7 segment hex displays so -+* be sure to not monkey with them here. -+*/ -+ -+#define HEARTBEAT_LED D28 -+#define SYS_BUSY_LED D27 -+#define HEXLEDS_BASE LUB_HEXLED -+ -+#define HEARTBEAT_LED_ON (LEDS_BASE &= ~HEARTBEAT_LED) -+#define HEARTBEAT_LED_OFF (LEDS_BASE |= HEARTBEAT_LED) -+#define SYS_BUSY_LED_OFF (LEDS_BASE |= SYS_BUSY_LED) -+#define SYS_BUSY_LED_ON (LEDS_BASE &= ~SYS_BUSY_LED) -+ -+// use x = D26-D21 for these, please... -+#define DISCRETE_LED_ON(x) (LEDS_BASE &= ~(x)) -+#define DISCRETE_LED_OFF(x) (LEDS_BASE |= (x)) -+ -+#ifndef __ASSEMBLY__ -+ -+//extern int hexled_val = 0; -+ -+#endif -+ -+#define BUMP_COUNTER (HEXLEDS_BASE = hexled_val++) -+#define DEC_COUNTER (HEXLEDS_BASE = hexled_val--) ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/arch-pxa/memory.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,106 @@ -+/* -+ * linux/include/asm-arm/arch-pxa/memory.h -+ * -+ * Author: Nicolas Pitre -+ * Copyright: (C) 2001 MontaVista Software Inc. -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ */ -+ -+#ifndef __ASM_ARCH_MEMORY_H -+#define __ASM_ARCH_MEMORY_H -+ -+ -+/* -+ * Task size: 3GB -+ */ -+#define TASK_SIZE (0xc0000000UL) -+#define TASK_SIZE_26 (0x04000000UL) -+ -+/* -+ * This decides where the kernel will search for a free chunk of vm -+ * space during mmap's. -+ */ -+#define TASK_UNMAPPED_BASE (TASK_SIZE / 3) -+ -+/* -+ * Page offset: 3GB -+ */ -+#define PAGE_OFFSET (0xc0000000UL) -+ -+/* -+ * Physical DRAM offset. -+ */ -+#define PHYS_OFFSET (0xa0000000UL) -+ -+/* -+ * physical vs virtual ram conversion -+ */ -+#define __virt_to_phys__is_a_macro -+#define __phys_to_virt__is_a_macro -+#define __virt_to_phys(x) ((x) - PAGE_OFFSET + PHYS_OFFSET) -+#define __phys_to_virt(x) ((x) - PHYS_OFFSET + PAGE_OFFSET) -+ -+/* -+ * Virtual view <-> DMA view memory address translations -+ * virt_to_bus: Used to translate the virtual address to an -+ * address suitable to be passed to set_dma_addr -+ * bus_to_virt: Used to convert an address for DMA operations -+ * to an address that the kernel can use. -+ */ -+#define __virt_to_bus__is_a_macro -+#define __bus_to_virt__is_a_macro -+#define __virt_to_bus(x) __virt_to_phys(x) -+#define __bus_to_virt(x) __phys_to_virt(x) -+ -+#ifdef CONFIG_DISCONTIGMEM -+/* -+ * The nodes are matched with the physical SDRAM banks as follows: -+ * -+ * node 0: 0xa0000000-0xa3ffffff --> 0xc0000000-0xc3ffffff -+ * node 1: 0xa4000000-0xa7ffffff --> 0xc4000000-0xc7ffffff -+ * node 2: 0xa8000000-0xabffffff --> 0xc8000000-0xcbffffff -+ * node 3: 0xac000000-0xafffffff --> 0xcc000000-0xcfffffff -+ */ -+ -+#define NR_NODES 4 -+ -+/* -+ * Given a kernel address, find the home node of the underlying memory. -+ */ -+#define KVADDR_TO_NID(addr) (((unsigned long)(addr) - PAGE_OFFSET) >> 26) -+ -+/* -+ * Given a page frame number, convert it to a node id. -+ */ -+#define PFN_TO_NID(pfn) (((pfn) - PHYS_PFN_OFFSET) >> (26 - PAGE_SHIFT)) -+ -+/* -+ * Given a kaddr, ADDR_TO_MAPBASE finds the owning node of the memory -+ * and returns the mem_map of that node. -+ */ -+#define ADDR_TO_MAPBASE(kaddr) NODE_MEM_MAP(KVADDR_TO_NID(kaddr)) -+ -+/* -+ * Given a page frame number, find the owning node of the memory -+ * and returns the mem_map of that node. -+ */ -+#define PFN_TO_MAPBASE(pfn) NODE_MEM_MAP(PFN_TO_NID(pfn)) -+ -+/* -+ * Given a kaddr, LOCAL_MEM_MAP finds the owning node of the memory -+ * and returns the index corresponding to the appropriate page in the -+ * node's mem_map. -+ */ -+#define LOCAL_MAP_NR(addr) \ -+ (((unsigned long)(addr) & 0x03ffffff) >> PAGE_SHIFT) -+ -+#else -+ -+#define PFN_TO_NID(addr) (0) -+ -+#endif -+ -+#endif ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/arch-pxa/param.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,3 @@ -+/* -+ * linux/include/asm-arm/arch-pxa/param.h -+ */ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/arch-pxa/pcmcia.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,65 @@ -+/* -+ * linux/include/asm-arm/arch-pxa/pcmcia.h -+ * -+ * Author: George Davis -+ * Created: Jan 10, 2002 -+ * Copyright: MontaVista Software Inc. -+ * -+ * 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. -+ * -+ * -+ * Originally based upon linux/include/asm-arm/arch-sa1100/pcmcia.h -+ * -+ */ -+ -+#ifndef _ASM_ARCH_PCMCIA -+#define _ASM_ARCH_PCMCIA -+ -+ -+/* Ideally, we'd support up to MAX_SOCK sockets, but PXA250 only -+ * provides support for a maximum of two. -+ */ -+#define PXA_PCMCIA_MAX_SOCK (2) -+ -+ -+#ifndef __ASSEMBLY__ -+ -+struct pcmcia_init { -+ void (*handler)(int irq, void *dev, struct pt_regs *regs); -+}; -+ -+struct pcmcia_state { -+ unsigned detect: 1, -+ ready: 1, -+ bvd1: 1, -+ bvd2: 1, -+ wrprot: 1, -+ vs_3v: 1, -+ vs_Xv: 1; -+}; -+ -+struct pcmcia_state_array { -+ unsigned int size; -+ struct pcmcia_state *state; -+}; -+ -+struct pcmcia_irq_info { -+ unsigned int sock; -+ unsigned int irq; -+}; -+ -+struct pcmcia_low_level { -+ int (*init)(struct pcmcia_init *); -+ int (*shutdown)(void); -+ int (*socket_state)(struct pcmcia_state_array *); -+ int (*get_irq_info)(struct pcmcia_irq_info *); -+ int (*configure_socket)(unsigned int, socket_state_t *); -+}; -+ -+extern struct pcmcia_low_level *pcmcia_low_level; -+ -+#endif /* __ASSEMBLY__ */ -+ -+#endif ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/arch-pxa/pxa-regs.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,1327 @@ -+/* -+ * linux/include/asm-arm/arch-pxa/pxa-regs.h -+ * -+ * Author: Nicolas Pitre -+ * Created: Jun 15, 2001 -+ * Copyright: MontaVista Software Inc. -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ */ -+#ifndef _PXA_REGS_H_ -+#define _PXA_REGS_H_ -+ -+#include "bitfield.h" -+ -+ -+// FIXME hack so that SA-1111.h will work [cb] -+ -+#ifndef __ASSEMBLY__ -+typedef unsigned short Word16 ; -+typedef unsigned int Word32 ; -+typedef Word32 Word ; -+typedef Word Quad [4] ; -+typedef void *Address ; -+typedef void (*ExcpHndlr) (void) ; -+#endif -+ -+/* -+ * PXA Chip selects -+ */ -+ -+#define PXA_CS0_PHYS 0x00000000 -+#define PXA_CS1_PHYS 0x04000000 -+#define PXA_CS2_PHYS 0x08000000 -+#define PXA_CS3_PHYS 0x0C000000 -+#define PXA_CS4_PHYS 0x10000000 -+#define PXA_CS5_PHYS 0x14000000 -+ -+ -+/* -+ * Personal Computer Memory Card International Association (PCMCIA) sockets -+ */ -+ -+#define PCMCIAPrtSp 0x04000000 /* PCMCIA Partition Space [byte] */ -+#define PCMCIASp (4*PCMCIAPrtSp) /* PCMCIA Space [byte] */ -+#define PCMCIAIOSp PCMCIAPrtSp /* PCMCIA I/O Space [byte] */ -+#define PCMCIAAttrSp PCMCIAPrtSp /* PCMCIA Attribute Space [byte] */ -+#define PCMCIAMemSp PCMCIAPrtSp /* PCMCIA Memory Space [byte] */ -+ -+#define PCMCIA0Sp PCMCIASp /* PCMCIA 0 Space [byte] */ -+#define PCMCIA0IOSp PCMCIAIOSp /* PCMCIA 0 I/O Space [byte] */ -+#define PCMCIA0AttrSp PCMCIAAttrSp /* PCMCIA 0 Attribute Space [byte] */ -+#define PCMCIA0MemSp PCMCIAMemSp /* PCMCIA 0 Memory Space [byte] */ -+ -+#define PCMCIA1Sp PCMCIASp /* PCMCIA 1 Space [byte] */ -+#define PCMCIA1IOSp PCMCIAIOSp /* PCMCIA 1 I/O Space [byte] */ -+#define PCMCIA1AttrSp PCMCIAAttrSp /* PCMCIA 1 Attribute Space [byte] */ -+#define PCMCIA1MemSp PCMCIAMemSp /* PCMCIA 1 Memory Space [byte] */ -+ -+#define _PCMCIA(Nb) /* PCMCIA [0..1] */ \ -+ (0x20000000 + (Nb)*PCMCIASp) -+#define _PCMCIAIO(Nb) _PCMCIA (Nb) /* PCMCIA I/O [0..1] */ -+#define _PCMCIAAttr(Nb) /* PCMCIA Attribute [0..1] */ \ -+ (_PCMCIA (Nb) + 2*PCMCIAPrtSp) -+#define _PCMCIAMem(Nb) /* PCMCIA Memory [0..1] */ \ -+ (_PCMCIA (Nb) + 3*PCMCIAPrtSp) -+ -+#define _PCMCIA0 _PCMCIA (0) /* PCMCIA 0 */ -+#define _PCMCIA0IO _PCMCIAIO (0) /* PCMCIA 0 I/O */ -+#define _PCMCIA0Attr _PCMCIAAttr (0) /* PCMCIA 0 Attribute */ -+#define _PCMCIA0Mem _PCMCIAMem (0) /* PCMCIA 0 Memory */ -+ -+#define _PCMCIA1 _PCMCIA (1) /* PCMCIA 1 */ -+#define _PCMCIA1IO _PCMCIAIO (1) /* PCMCIA 1 I/O */ -+#define _PCMCIA1Attr _PCMCIAAttr (1) /* PCMCIA 1 Attribute */ -+#define _PCMCIA1Mem _PCMCIAMem (1) /* PCMCIA 1 Memory */ -+ -+ -+ -+/* -+ * DMA Controller -+ */ -+ -+#define DCSR0 __REG(0x40000000) /* DMA Control / Status Register for Channel 0 */ -+#define DCSR1 __REG(0x40000004) /* DMA Control / Status Register for Channel 1 */ -+#define DCSR2 __REG(0x40000008) /* DMA Control / Status Register for Channel 2 */ -+#define DCSR3 __REG(0x4000000c) /* DMA Control / Status Register for Channel 3 */ -+#define DCSR4 __REG(0x40000010) /* DMA Control / Status Register for Channel 4 */ -+#define DCSR5 __REG(0x40000014) /* DMA Control / Status Register for Channel 5 */ -+#define DCSR6 __REG(0x40000018) /* DMA Control / Status Register for Channel 6 */ -+#define DCSR7 __REG(0x4000001c) /* DMA Control / Status Register for Channel 7 */ -+#define DCSR8 __REG(0x40000020) /* DMA Control / Status Register for Channel 8 */ -+#define DCSR9 __REG(0x40000024) /* DMA Control / Status Register for Channel 9 */ -+#define DCSR10 __REG(0x40000028) /* DMA Control / Status Register for Channel 10 */ -+#define DCSR11 __REG(0x4000002c) /* DMA Control / Status Register for Channel 11 */ -+#define DCSR12 __REG(0x40000030) /* DMA Control / Status Register for Channel 12 */ -+#define DCSR13 __REG(0x40000034) /* DMA Control / Status Register for Channel 13 */ -+#define DCSR14 __REG(0x40000038) /* DMA Control / Status Register for Channel 14 */ -+#define DCSR15 __REG(0x4000003c) /* DMA Control / Status Register for Channel 15 */ -+ -+#define DCSR(x) __REG2(0x40000000, (x) << 2) -+ -+#define DCSR_RUN (1 << 31) /* Run Bit (read / write) */ -+#define DCSR_NODESC (1 << 30) /* No-Descriptor Fetch (read / write) */ -+#define DCSR_STOPIRQEN (1 << 29) /* Stop Interrupt Enable (read / write) */ -+#define DCSR_REQPEND (1 << 8) /* Request Pending (read-only) */ -+#define DCSR_STOPSTATE (1 << 3) /* Stop State (read-only) */ -+#define DCSR_ENDINTR (1 << 2) /* End Interrupt (read / write) */ -+#define DCSR_STARTINTR (1 << 1) /* Start Interrupt (read / write) */ -+#define DCSR_BUSERR (1 << 0) /* Bus Error Interrupt (read / write) */ -+ -+#define DINT __REG(0x400000f0) /* DMA Interrupt Register */ -+ -+#define DRCMR0 __REG(0x40000100) /* Request to Channel Map Register for DREQ 0 */ -+#define DRCMR1 __REG(0x40000104) /* Request to Channel Map Register for DREQ 1 */ -+#define DRCMR2 __REG(0x40000108) /* Request to Channel Map Register for I2S receive Request */ -+#define DRCMR3 __REG(0x4000010c) /* Request to Channel Map Register for I2S transmit Request */ -+#define DRCMR4 __REG(0x40000110) /* Request to Channel Map Register for BTUART receive Request */ -+#define DRCMR5 __REG(0x40000114) /* Request to Channel Map Register for BTUART transmit Request. */ -+#define DRCMR6 __REG(0x40000118) /* Request to Channel Map Register for FFUART receive Request */ -+#define DRCMR7 __REG(0x4000011c) /* Request to Channel Map Register for FFUART transmit Request */ -+#define DRCMR8 __REG(0x40000120) /* Request to Channel Map Register for AC97 microphone Request */ -+#define DRCMR9 __REG(0x40000124) /* Request to Channel Map Register for AC97 modem receive Request */ -+#define DRCMR10 __REG(0x40000128) /* Request to Channel Map Register for AC97 modem transmit Request */ -+#define DRCMR11 __REG(0x4000012c) /* Request to Channel Map Register for AC97 audio receive Request */ -+#define DRCMR12 __REG(0x40000130) /* Request to Channel Map Register for AC97 audio transmit Request */ -+#define DRCMR13 __REG(0x40000134) /* Request to Channel Map Register for SSP receive Request */ -+#define DRCMR14 __REG(0x40000138) /* Request to Channel Map Register for SSP transmit Request */ -+#define DRCMR15 __REG(0x4000013c) /* Reserved */ -+#define DRCMR16 __REG(0x40000140) /* Reserved */ -+#define DRCMR17 __REG(0x40000144) /* Request to Channel Map Register for ICP receive Request */ -+#define DRCMR18 __REG(0x40000148) /* Request to Channel Map Register for ICP transmit Request */ -+#define DRCMR19 __REG(0x4000014c) /* Request to Channel Map Register for STUART receive Request */ -+#define DRCMR20 __REG(0x40000150) /* Request to Channel Map Register for STUART transmit Request */ -+#define DRCMR21 __REG(0x40000154) /* Request to Channel Map Register for MMC receive Request */ -+#define DRCMR22 __REG(0x40000158) /* Request to Channel Map Register for MMC transmit Request */ -+#define DRCMR23 __REG(0x4000015c) /* Reserved */ -+#define DRCMR24 __REG(0x40000160) /* Reserved */ -+#define DRCMR25 __REG(0x40000164) /* Request to Channel Map Register for USB endpoint 1 Request */ -+#define DRCMR26 __REG(0x40000168) /* Request to Channel Map Register for USB endpoint 2 Request */ -+#define DRCMR27 __REG(0x4000016C) /* Request to Channel Map Register for USB endpoint 3 Request */ -+#define DRCMR28 __REG(0x40000170) /* Request to Channel Map Register for USB endpoint 4 Request */ -+#define DRCMR29 __REG(0x40000174) /* Reserved */ -+#define DRCMR30 __REG(0x40000178) /* Request to Channel Map Register for USB endpoint 6 Request */ -+#define DRCMR31 __REG(0x4000017C) /* Request to Channel Map Register for USB endpoint 7 Request */ -+#define DRCMR32 __REG(0x40000180) /* Request to Channel Map Register for USB endpoint 8 Request */ -+#define DRCMR33 __REG(0x40000184) /* Request to Channel Map Register for USB endpoint 9 Request */ -+#define DRCMR34 __REG(0x40000188) /* Reserved */ -+#define DRCMR35 __REG(0x4000018C) /* Request to Channel Map Register for USB endpoint 11 Request */ -+#define DRCMR36 __REG(0x40000190) /* Request to Channel Map Register for USB endpoint 12 Request */ -+#define DRCMR37 __REG(0x40000194) /* Request to Channel Map Register for USB endpoint 13 Request */ -+#define DRCMR38 __REG(0x40000198) /* Request to Channel Map Register for USB endpoint 14 Request */ -+#define DRCMR39 __REG(0x4000019C) /* Reserved */ -+ -+#define DRCMRRXSADR DRCMR2 -+#define DRCMRTXSADR DRCMR3 -+#define DRCMRRXBTRBR DRCMR4 -+#define DRCMRTXBTTHR DRCMR5 -+#define DRCMRRXFFRBR DRCMR6 -+#define DRCMRTXFFTHR DRCMR7 -+#define DRCMRRXMCDR DRCMR8 -+#define DRCMRRXMODR DRCMR9 -+#define DRCMRTXMODR DRCMR10 -+#define DRCMRRXPCDR DRCMR11 -+#define DRCMRTXPCDR DRCMR12 -+#define DRCMRRXSSDR DRCMR13 -+#define DRCMRTXSSDR DRCMR14 -+#define DRCMRRXICDR DRCMR17 -+#define DRCMRTXICDR DRCMR18 -+#define DRCMRRXSTRBR DRCMR19 -+#define DRCMRTXSTTHR DRCMR20 -+#define DRCMRRXMMC DRCMR21 -+#define DRCMRTXMMC DRCMR22 -+ -+#define DRCMR_MAPVLD (1 << 7) /* Map Valid (read / write) */ -+#define DRCMR_CHLNUM 0x0f /* mask for Channel Number (read / write) */ -+ -+#define DDADR0 __REG(0x40000200) /* DMA Descriptor Address Register Channel 0 */ -+#define DSADR0 __REG(0x40000204) /* DMA Source Address Register Channel 0 */ -+#define DTADR0 __REG(0x40000208) /* DMA Target Address Register Channel 0 */ -+#define DCMD0 __REG(0x4000020c) /* DMA Command Address Register Channel 0 */ -+#define DDADR1 __REG(0x40000210) /* DMA Descriptor Address Register Channel 1 */ -+#define DSADR1 __REG(0x40000214) /* DMA Source Address Register Channel 1 */ -+#define DTADR1 __REG(0x40000218) /* DMA Target Address Register Channel 1 */ -+#define DCMD1 __REG(0x4000021c) /* DMA Command Address Register Channel 1 */ -+#define DDADR2 __REG(0x40000220) /* DMA Descriptor Address Register Channel 2 */ -+#define DSADR2 __REG(0x40000224) /* DMA Source Address Register Channel 2 */ -+#define DTADR2 __REG(0x40000228) /* DMA Target Address Register Channel 2 */ -+#define DCMD2 __REG(0x4000022c) /* DMA Command Address Register Channel 2 */ -+#define DDADR3 __REG(0x40000230) /* DMA Descriptor Address Register Channel 3 */ -+#define DSADR3 __REG(0x40000234) /* DMA Source Address Register Channel 3 */ -+#define DTADR3 __REG(0x40000238) /* DMA Target Address Register Channel 3 */ -+#define DCMD3 __REG(0x4000023c) /* DMA Command Address Register Channel 3 */ -+#define DDADR4 __REG(0x40000240) /* DMA Descriptor Address Register Channel 4 */ -+#define DSADR4 __REG(0x40000244) /* DMA Source Address Register Channel 4 */ -+#define DTADR4 __REG(0x40000248) /* DMA Target Address Register Channel 4 */ -+#define DCMD4 __REG(0x4000024c) /* DMA Command Address Register Channel 4 */ -+#define DDADR5 __REG(0x40000250) /* DMA Descriptor Address Register Channel 5 */ -+#define DSADR5 __REG(0x40000254) /* DMA Source Address Register Channel 5 */ -+#define DTADR5 __REG(0x40000258) /* DMA Target Address Register Channel 5 */ -+#define DCMD5 __REG(0x4000025c) /* DMA Command Address Register Channel 5 */ -+#define DDADR6 __REG(0x40000260) /* DMA Descriptor Address Register Channel 6 */ -+#define DSADR6 __REG(0x40000264) /* DMA Source Address Register Channel 6 */ -+#define DTADR6 __REG(0x40000268) /* DMA Target Address Register Channel 6 */ -+#define DCMD6 __REG(0x4000026c) /* DMA Command Address Register Channel 6 */ -+#define DDADR7 __REG(0x40000270) /* DMA Descriptor Address Register Channel 7 */ -+#define DSADR7 __REG(0x40000274) /* DMA Source Address Register Channel 7 */ -+#define DTADR7 __REG(0x40000278) /* DMA Target Address Register Channel 7 */ -+#define DCMD7 __REG(0x4000027c) /* DMA Command Address Register Channel 7 */ -+#define DDADR8 __REG(0x40000280) /* DMA Descriptor Address Register Channel 8 */ -+#define DSADR8 __REG(0x40000284) /* DMA Source Address Register Channel 8 */ -+#define DTADR8 __REG(0x40000288) /* DMA Target Address Register Channel 8 */ -+#define DCMD8 __REG(0x4000028c) /* DMA Command Address Register Channel 8 */ -+#define DDADR9 __REG(0x40000290) /* DMA Descriptor Address Register Channel 9 */ -+#define DSADR9 __REG(0x40000294) /* DMA Source Address Register Channel 9 */ -+#define DTADR9 __REG(0x40000298) /* DMA Target Address Register Channel 9 */ -+#define DCMD9 __REG(0x4000029c) /* DMA Command Address Register Channel 9 */ -+#define DDADR10 __REG(0x400002a0) /* DMA Descriptor Address Register Channel 10 */ -+#define DSADR10 __REG(0x400002a4) /* DMA Source Address Register Channel 10 */ -+#define DTADR10 __REG(0x400002a8) /* DMA Target Address Register Channel 10 */ -+#define DCMD10 __REG(0x400002ac) /* DMA Command Address Register Channel 10 */ -+#define DDADR11 __REG(0x400002b0) /* DMA Descriptor Address Register Channel 11 */ -+#define DSADR11 __REG(0x400002b4) /* DMA Source Address Register Channel 11 */ -+#define DTADR11 __REG(0x400002b8) /* DMA Target Address Register Channel 11 */ -+#define DCMD11 __REG(0x400002bc) /* DMA Command Address Register Channel 11 */ -+#define DDADR12 __REG(0x400002c0) /* DMA Descriptor Address Register Channel 12 */ -+#define DSADR12 __REG(0x400002c4) /* DMA Source Address Register Channel 12 */ -+#define DTADR12 __REG(0x400002c8) /* DMA Target Address Register Channel 12 */ -+#define DCMD12 __REG(0x400002cc) /* DMA Command Address Register Channel 12 */ -+#define DDADR13 __REG(0x400002d0) /* DMA Descriptor Address Register Channel 13 */ -+#define DSADR13 __REG(0x400002d4) /* DMA Source Address Register Channel 13 */ -+#define DTADR13 __REG(0x400002d8) /* DMA Target Address Register Channel 13 */ -+#define DCMD13 __REG(0x400002dc) /* DMA Command Address Register Channel 13 */ -+#define DDADR14 __REG(0x400002e0) /* DMA Descriptor Address Register Channel 14 */ -+#define DSADR14 __REG(0x400002e4) /* DMA Source Address Register Channel 14 */ -+#define DTADR14 __REG(0x400002e8) /* DMA Target Address Register Channel 14 */ -+#define DCMD14 __REG(0x400002ec) /* DMA Command Address Register Channel 14 */ -+#define DDADR15 __REG(0x400002f0) /* DMA Descriptor Address Register Channel 15 */ -+#define DSADR15 __REG(0x400002f4) /* DMA Source Address Register Channel 15 */ -+#define DTADR15 __REG(0x400002f8) /* DMA Target Address Register Channel 15 */ -+#define DCMD15 __REG(0x400002fc) /* DMA Command Address Register Channel 15 */ -+ -+#define DDADR(x) __REG2(0x40000200, (x) << 4) -+#define DSADR(x) __REG2(0x40000204, (x) << 4) -+#define DTADR(x) __REG2(0x40000208, (x) << 4) -+#define DCMD(x) __REG2(0x4000020c, (x) << 4) -+ -+#define DDADR_DESCADDR 0xfffffff0 /* Address of next descriptor (mask) */ -+#define DDADR_STOP (1 << 0) /* Stop (read / write) */ -+ -+#define DCMD_INCSRCADDR (1 << 31) /* Source Address Increment Setting. */ -+#define DCMD_INCTRGADDR (1 << 30) /* Target Address Increment Setting. */ -+#define DCMD_FLOWSRC (1 << 29) /* Flow Control by the source. */ -+#define DCMD_FLOWTRG (1 << 28) /* Flow Control by the target. */ -+#define DCMD_STARTIRQEN (1 << 22) /* Start Interrupt Enable */ -+#define DCMD_ENDIRQEN (1 << 21) /* End Interrupt Enable */ -+#define DCMD_ENDIAN (1 << 18) /* Device Endian-ness. */ -+#define DCMD_BURST8 (1 << 16) /* 8 byte burst */ -+#define DCMD_BURST16 (2 << 16) /* 16 byte burst */ -+#define DCMD_BURST32 (3 << 16) /* 32 byte burst */ -+#define DCMD_WIDTH1 (1 << 14) /* 1 byte width */ -+#define DCMD_WIDTH2 (2 << 14) /* 2 byte width (HalfWord) */ -+#define DCMD_WIDTH4 (3 << 14) /* 4 byte width (Word) */ -+#define DCMD_LENGTH 0x01fff /* length mask (max = 8K - 1) */ -+ -+/* default combinations */ -+#define DCMD_RXPCDR (DCMD_INCTRGADDR|DCMD_FLOWSRC|DCMD_BURST32|DCMD_WIDTH4) -+#define DCMD_RXMCDR (DCMD_INCTRGADDR|DCMD_FLOWSRC|DCMD_BURST32|DCMD_WIDTH4) -+#define DCMD_TXPCDR (DCMD_INCSRCADDR|DCMD_FLOWTRG|DCMD_BURST32|DCMD_WIDTH4) -+ -+ -+/* -+ * UARTs -+ */ -+ -+/* Full Function UART (FFUART) */ -+#define FFUART FFRBR -+#define FFRBR __REG(0x40100000) /* Receive Buffer Register (read only) */ -+#define FFTHR __REG(0x40100000) /* Transmit Holding Register (write only) */ -+#define FFIER __REG(0x40100004) /* Interrupt Enable Register (read/write) */ -+#define FFIIR __REG(0x40100008) /* Interrupt ID Register (read only) */ -+#define FFFCR __REG(0x40100008) /* FIFO Control Register (write only) */ -+#define FFLCR __REG(0x4010000C) /* Line Control Register (read/write) */ -+#define FFMCR __REG(0x40100010) /* Modem Control Register (read/write) */ -+#define FFLSR __REG(0x40100014) /* Line Status Register (read only) */ -+#define FFMSR __REG(0x40100018) /* Modem Status Register (read only) */ -+#define FFSPR __REG(0x4010001C) /* Scratch Pad Register (read/write) */ -+#define FFISR __REG(0x40100020) /* Infrared Selection Register (read/write) */ -+#define FFDLL __REG(0x40100000) /* Divisor Latch Low Register (DLAB = 1) (read/write) */ -+#define FFDLH __REG(0x40100004) /* Divisor Latch High Register (DLAB = 1) (read/write) */ -+ -+/* Bluetooth UART (BTUART) */ -+#define BTUART BTRBR -+#define BTRBR __REG(0x40200000) /* Receive Buffer Register (read only) */ -+#define BTTHR __REG(0x40200000) /* Transmit Holding Register (write only) */ -+#define BTIER __REG(0x40200004) /* Interrupt Enable Register (read/write) */ -+#define BTIIR __REG(0x40200008) /* Interrupt ID Register (read only) */ -+#define BTFCR __REG(0x40200008) /* FIFO Control Register (write only) */ -+#define BTLCR __REG(0x4020000C) /* Line Control Register (read/write) */ -+#define BTMCR __REG(0x40200010) /* Modem Control Register (read/write) */ -+#define BTLSR __REG(0x40200014) /* Line Status Register (read only) */ -+#define BTMSR __REG(0x40200018) /* Modem Status Register (read only) */ -+#define BTSPR __REG(0x4020001C) /* Scratch Pad Register (read/write) */ -+#define BTISR __REG(0x40200020) /* Infrared Selection Register (read/write) */ -+#define BTDLL __REG(0x40200000) /* Divisor Latch Low Register (DLAB = 1) (read/write) */ -+#define BTDLH __REG(0x40200004) /* Divisor Latch High Register (DLAB = 1) (read/write) */ -+ -+/* Standard UART (STUART) */ -+#define STUART STRBR -+#define STRBR __REG(0x40700000) /* Receive Buffer Register (read only) */ -+#define STTHR __REG(0x40700000) /* Transmit Holding Register (write only) */ -+#define STIER __REG(0x40700004) /* Interrupt Enable Register (read/write) */ -+#define STIIR __REG(0x40700008) /* Interrupt ID Register (read only) */ -+#define STFCR __REG(0x40700008) /* FIFO Control Register (write only) */ -+#define STLCR __REG(0x4070000C) /* Line Control Register (read/write) */ -+#define STMCR __REG(0x40700010) /* Modem Control Register (read/write) */ -+#define STLSR __REG(0x40700014) /* Line Status Register (read only) */ -+#define STMSR __REG(0x40700018) /* Reserved */ -+#define STSPR __REG(0x4070001C) /* Scratch Pad Register (read/write) */ -+#define STISR __REG(0x40700020) /* Infrared Selection Register (read/write) */ -+#define STDLL __REG(0x40700000) /* Divisor Latch Low Register (DLAB = 1) (read/write) */ -+#define STDLH __REG(0x40700004) /* Divisor Latch High Register (DLAB = 1) (read/write) */ -+ -+#define IER_DMAE (1 << 7) /* DMA Requests Enable */ -+#define IER_UUE (1 << 6) /* UART Unit Enable */ -+#define IER_NRZE (1 << 5) /* NRZ coding Enable */ -+#define IER_RTIOE (1 << 4) /* Receiver Time Out Interrupt Enable */ -+#define IER_MIE (1 << 3) /* Modem Interrupt Enable */ -+#define IER_RLSE (1 << 2) /* Receiver Line Status Interrupt Enable */ -+#define IER_TIE (1 << 1) /* Transmit Data request Interrupt Enable */ -+#define IER_RAVIE (1 << 0) /* Receiver Data Available Interrupt Enable */ -+ -+#define IIR_FIFOES1 (1 << 7) /* FIFO Mode Enable Status */ -+#define IIR_FIFOES0 (1 << 6) /* FIFO Mode Enable Status */ -+#define IIR_TOD (1 << 3) /* Time Out Detected */ -+#define IIR_IID2 (1 << 2) /* Interrupt Source Encoded */ -+#define IIR_IID1 (1 << 1) /* Interrupt Source Encoded */ -+#define IIR_IP (1 << 0) /* Interrupt Pending (active low) */ -+ -+#define FCR_ITL2 (1 << 7) /* Interrupt Trigger Level */ -+#define FCR_ITL1 (1 << 6) /* Interrupt Trigger Level */ -+#define FCR_RESETTF (1 << 2) /* Reset Transmitter FIFO */ -+#define FCR_RESETRF (1 << 1) /* Reset Receiver FIFO */ -+#define FCR_TRFIFOE (1 << 0) /* Transmit and Receive FIFO Enable */ -+#define FCR_ITL_1 (0) -+#define FCR_ITL_8 (FCR_ITL1) -+#define FCR_ITL_16 (FCR_ITL2) -+#define FCR_ITL_32 (FCR_ITL2|FCR_ITL1) -+ -+#define LCR_DLAB (1 << 7) /* Divisor Latch Access Bit */ -+#define LCR_SB (1 << 6) /* Set Break */ -+#define LCR_STKYP (1 << 5) /* Sticky Parity */ -+#define LCR_EPS (1 << 4) /* Even Parity Select */ -+#define LCR_PEN (1 << 3) /* Parity Enable */ -+#define LCR_STB (1 << 2) /* Stop Bit */ -+#define LCR_WLS1 (1 << 1) /* Word Length Select */ -+#define LCR_WLS0 (1 << 0) /* Word Length Select */ -+ -+#define LSR_FIFOE (1 << 7) /* FIFO Error Status */ -+#define LSR_TEMT (1 << 6) /* Transmitter Empty */ -+#define LSR_TDRQ (1 << 5) /* Transmit Data Request */ -+#define LSR_BI (1 << 4) /* Break Interrupt */ -+#define LSR_FE (1 << 3) /* Framing Error */ -+#define LSR_PE (1 << 2) /* Parity Error */ -+#define LSR_OE (1 << 1) /* Overrun Error */ -+#define LSR_DR (1 << 0) /* Data Ready */ -+ -+#define MCR_LOOP (1 << 4) */ -+#define MCR_OUT2 (1 << 3) /* force MSR_DCD in loopback mode */ -+#define MCR_OUT1 (1 << 2) /* force MSR_RI in loopback mode */ -+#define MCR_RTS (1 << 1) /* Request to Send */ -+#define MCR_DTR (1 << 0) /* Data Terminal Ready */ -+ -+#define MSR_DCD (1 << 7) /* Data Carrier Detect */ -+#define MSR_RI (1 << 6) /* Ring Indicator */ -+#define MSR_DSR (1 << 5) /* Data Set Ready */ -+#define MSR_CTS (1 << 4) /* Clear To Send */ -+#define MSR_DDCD (1 << 3) /* Delta Data Carrier Detect */ -+#define MSR_TERI (1 << 2) /* Trailing Edge Ring Indicator */ -+#define MSR_DDSR (1 << 1) /* Delta Data Set Ready */ -+#define MSR_DCTS (1 << 0) /* Delta Clear To Send */ -+ -+/* -+ * IrSR (Infrared Selection Register) -+ */ -+#define STISR_RXPL (1 << 4) /* Receive Data Polarity */ -+#define STISR_TXPL (1 << 3) /* Transmit Data Polarity */ -+#define STISR_XMODE (1 << 2) /* Transmit Pulse Width Select */ -+#define STISR_RCVEIR (1 << 1) /* Receiver SIR Enable */ -+#define STISR_XMITIR (1 << 0) /* Transmitter SIR Enable */ -+ -+ -+/* -+ * I2C registers -+ */ -+ -+#define IBMR __REG(0x40301680) /* I2C Bus Monitor Register - IBMR */ -+#define IDBR __REG(0x40301688) /* I2C Data Buffer Register - IDBR */ -+#define ICR __REG(0x40301690) /* I2C Control Register - ICR */ -+#define ISR __REG(0x40301698) /* I2C Status Register - ISR */ -+#define ISAR __REG(0x403016A0) /* I2C Slave Address Register - ISAR */ -+ -+#define ICR_START (1 << 0) /* start bit */ -+#define ICR_STOP (1 << 1) /* stop bit */ -+#define ICR_ACKNAK (1 << 2) /* send ACK(0) or NAK(1) */ -+#define ICR_TB (1 << 3) /* transfer byte bit */ -+#define ICR_MA (1 << 4) /* master abort */ -+#define ICR_SCLE (1 << 5) /* master clock enable */ -+#define ICR_IUE (1 << 6) /* unit enable */ -+#define ICR_GCD (1 << 7) /* general call disable */ -+#define ICR_ITEIE (1 << 8) /* enable tx interrupts */ -+#define ICR_IRFIE (1 << 9) /* enable rx interrupts */ -+#define ICR_BEIE (1 << 10) /* enable bus error ints */ -+#define ICR_SSDIE (1 << 11) /* slave STOP detected int enable */ -+#define ICR_ALDIE (1 << 12) /* enable arbitration interrupt */ -+#define ICR_SADIE (1 << 13) /* slave address detected int enable */ -+#define ICR_UR (1 << 14) /* unit reset */ -+ -+#define ISR_RWM (1 << 0) /* read/write mode */ -+#define ISR_ACKNAK (1 << 1) /* ack/nak status */ -+#define ISR_UB (1 << 2) /* unit busy */ -+#define ISR_IBB (1 << 3) /* bus busy */ -+#define ISR_SSD (1 << 4) /* slave stop detected */ -+#define ISR_ALD (1 << 5) /* arbitration loss detected */ -+#define ISR_ITE (1 << 6) /* tx buffer empty */ -+#define ISR_IRF (1 << 7) /* rx buffer full */ -+#define ISR_GCAD (1 << 8) /* general call address detected */ -+#define ISR_SAD (1 << 9) /* slave address detected */ -+#define ISR_BED (1 << 10) /* bus error no ACK/NAK */ -+ -+ -+/* -+ * Serial Audio Controller -+ */ -+ -+/* FIXME: This clash with SA1111 defines */ -+#ifndef CONFIG_SA1111 -+#define SACR0 __REG(0x40400000) /* Global Control Register */ -+#define SACR1 __REG(0x40400004) /* Serial Audio I 2 S/MSB-Justified Control Register */ -+#define SASR0 __REG(0x4040000C) /* Serial Audio I 2 S/MSB-Justified Interface and FIFO Status Register */ -+#define SAIMR __REG(0x40400014) /* Serial Audio Interrupt Mask Register */ -+#define SAICR __REG(0x40400018) /* Serial Audio Interrupt Clear Register */ -+#define SADIV __REG(0x40400060) /* Audio Clock Divider Register. */ -+#define SADR __REG(0x40400080) /* Serial Audio Data Register (TX and RX FIFO access Register). */ -+#endif -+ -+ -+/* -+ * AC97 Controller registers -+ */ -+ -+#define POCR __REG(0x40500000) /* PCM Out Control Register */ -+#define POCR_FEIE (1 << 3) /* FIFO Error Interrupt Enable */ -+ -+#define PICR __REG(0x40500004) /* PCM In Control Register */ -+#define PICR_FEIE (1 << 3) /* FIFO Error Interrupt Enable */ -+ -+#define MCCR __REG(0x40500008) /* Mic In Control Register */ -+#define MCCR_FEIE (1 << 3) /* FIFO Error Interrupt Enable */ -+ -+#define GCR __REG(0x4050000C) /* Global Control Register */ -+#define GCR_CDONE_IE (1 << 19) /* Command Done Interrupt Enable */ -+#define GCR_SDONE_IE (1 << 18) /* Status Done Interrupt Enable */ -+#define GCR_SECRDY_IEN (1 << 9) /* Secondary Ready Interrupt Enable */ -+#define GCR_PRIRDY_IEN (1 << 8) /* Primary Ready Interrupt Enable */ -+#define GCR_SECRES_IEN (1 << 5) /* Secondary Resume Interrupt Enable */ -+#define GCR_PRIRES_IEN (1 << 4) /* Primary Resume Interrupt Enable */ -+#define GCR_ACLINK_OFF (1 << 3) /* AC-link Shut Off */ -+#define GCR_WARM_RST (1 << 2) /* AC97 Warm Reset */ -+#define GCR_COLD_RST (1 << 1) /* AC'97 Cold Reset (0 = active) */ -+#define GCR_GIE (1 << 0) /* Codec GPI Interrupt Enable */ -+ -+#define POSR __REG(0x40500010) /* PCM Out Status Register */ -+#define POSR_FIFOE (1 << 4) /* FIFO error */ -+ -+#define PISR __REG(0x40500014) /* PCM In Status Register */ -+#define PISR_FIFOE (1 << 4) /* FIFO error */ -+ -+#define MCSR __REG(0x40500018) /* Mic In Status Register */ -+#define MCSR_FIFOE (1 << 4) /* FIFO error */ -+ -+#define GSR __REG(0x4050001C) /* Global Status Register */ -+#define GSR_CDONE (1 << 19) /* Command Done */ -+#define GSR_SDONE (1 << 18) /* Status Done */ -+#define GSR_RDCS (1 << 15) /* Read Completion Status */ -+#define GSR_BIT3SLT12 (1 << 14) /* Bit 3 of slot 12 */ -+#define GSR_BIT2SLT12 (1 << 13) /* Bit 2 of slot 12 */ -+#define GSR_BIT1SLT12 (1 << 12) /* Bit 1 of slot 12 */ -+#define GSR_SECRES (1 << 11) /* Secondary Resume Interrupt */ -+#define GSR_PRIRES (1 << 10) /* Primary Resume Interrupt */ -+#define GSR_SCR (1 << 9) /* Secondary Codec Ready */ -+#define GSR_PCR (1 << 8) /* Primary Codec Ready */ -+#define GSR_MINT (1 << 7) /* Mic In Interrupt */ -+#define GSR_POINT (1 << 6) /* PCM Out Interrupt */ -+#define GSR_PIINT (1 << 5) /* PCM In Interrupt */ -+#define GSR_MOINT (1 << 2) /* Modem Out Interrupt */ -+#define GSR_MIINT (1 << 1) /* Modem In Interrupt */ -+#define GSR_GSCI (1 << 0) /* Codec GPI Status Change Interrupt */ -+ -+#define CAR __REG(0x40500020) /* CODEC Access Register */ -+#define CAR_CAIP (1 << 0) /* Codec Access In Progress */ -+ -+#define PCDR __REG(0x40500040) /* PCM FIFO Data Register */ -+#define MCDR __REG(0x40500060) /* Mic-in FIFO Data Register */ -+ -+#define MOCR __REG(0x40500100) /* Modem Out Control Register */ -+#define MOCR_FEIE (1 << 3) /* FIFO Error */ -+ -+#define MICR __REG(0x40500108) /* Modem In Control Register */ -+#define MICR_FEIE (1 << 3) /* FIFO Error */ -+ -+#define MOSR __REG(0x40500110) /* Modem Out Status Register */ -+#define MOSR_FIFOE (1 << 4) /* FIFO error */ -+ -+#define MISR __REG(0x40500118) /* Modem In Status Register */ -+#define MISR_FIFOE (1 << 4) /* FIFO error */ -+ -+#define MODR __REG(0x40500140) /* Modem FIFO Data Register */ -+ -+#define PAC_REG_BASE __REG(0x40500200) /* Primary Audio Codec */ -+#define SAC_REG_BASE __REG(0x40500300) /* Secondary Audio Codec */ -+#define PMC_REG_BASE __REG(0x40500400) /* Primary Modem Codec */ -+#define SMC_REG_BASE __REG(0x40500500) /* Secondary Modem Codec */ -+ -+ -+/* -+ * USB Device Controller -+ */ -+#define UDC_RES1 __REG(0x40600004) /* UDC Undocumented - Reserved1 */ -+#define UDC_RES2 __REG(0x40600008) /* UDC Undocumented - Reserved2 */ -+#define UDC_RES3 __REG(0x4060000C) /* UDC Undocumented - Reserved3 */ -+ -+#define UDCCR __REG(0x40600000) /* UDC Control Register */ -+#define UDCCR_UDE (1 << 0) /* UDC enable */ -+#define UDCCR_UDA (1 << 1) /* UDC active */ -+#define UDCCR_RSM (1 << 2) /* Device resume */ -+#define UDCCR_RESIR (1 << 3) /* Resume interrupt request */ -+#define UDCCR_SUSIR (1 << 4) /* Suspend interrupt request */ -+#define UDCCR_SRM (1 << 5) /* Suspend/resume interrupt mask */ -+#define UDCCR_RSTIR (1 << 6) /* Reset interrupt request */ -+#define UDCCR_REM (1 << 7) /* Reset interrupt mask */ -+ -+#define UDCCS0 __REG(0x40600010) /* UDC Endpoint 0 Control/Status Register */ -+#define UDCCS0_OPR (1 << 0) /* OUT packet ready */ -+#define UDCCS0_IPR (1 << 1) /* IN packet ready */ -+#define UDCCS0_FTF (1 << 2) /* Flush Tx FIFO */ -+#define UDCCS0_DRWF (1 << 3) /* Device remote wakeup feature */ -+#define UDCCS0_SST (1 << 4) /* Sent stall */ -+#define UDCCS0_FST (1 << 5) /* Force stall */ -+#define UDCCS0_RNE (1 << 6) /* Receive FIFO no empty */ -+#define UDCCS0_SA (1 << 7) /* Setup active */ -+ -+/* Bulk IN - Endpoint 1,6,11 */ -+#define UDCCS1 __REG(0x40600014) /* UDC Endpoint 1 (IN) Control/Status Register */ -+#define UDCCS6 __REG(0x40600028) /* UDC Endpoint 6 (IN) Control/Status Register */ -+#define UDCCS11 __REG(0x4060003C) /* UDC Endpoint 11 (IN) Control/Status Register */ -+ -+#define UDCCS_BI_TFS (1 << 0) /* Transmit FIFO service */ -+#define UDCCS_BI_TPC (1 << 1) /* Transmit packet complete */ -+#define UDCCS_BI_FTF (1 << 2) /* Flush Tx FIFO */ -+#define UDCCS_BI_TUR (1 << 3) /* Transmit FIFO underrun */ -+#define UDCCS_BI_SST (1 << 4) /* Sent stall */ -+#define UDCCS_BI_FST (1 << 5) /* Force stall */ -+#define UDCCS_BI_TSP (1 << 7) /* Transmit short packet */ -+ -+/* Bulk OUT - Endpoint 2,7,12 */ -+#define UDCCS2 __REG(0x40600018) /* UDC Endpoint 2 (OUT) Control/Status Register */ -+#define UDCCS7 __REG(0x4060002C) /* UDC Endpoint 7 (OUT) Control/Status Register */ -+#define UDCCS12 __REG(0x40600040) /* UDC Endpoint 12 (OUT) Control/Status Register */ -+ -+#define UDCCS_BO_RFS (1 << 0) /* Receive FIFO service */ -+#define UDCCS_BO_RPC (1 << 1) /* Receive packet complete */ -+#define UDCCS_BO_DME (1 << 3) /* DMA enable */ -+#define UDCCS_BO_SST (1 << 4) /* Sent stall */ -+#define UDCCS_BO_FST (1 << 5) /* Force stall */ -+#define UDCCS_BO_RNE (1 << 6) /* Receive FIFO not empty */ -+#define UDCCS_BO_RSP (1 << 7) /* Receive short packet */ -+ -+/* Isochronous IN - Endpoint 3,8,13 */ -+#define UDCCS3 __REG(0x4060001C) /* UDC Endpoint 3 (IN) Control/Status Register */ -+#define UDCCS8 __REG(0x40600030) /* UDC Endpoint 8 (IN) Control/Status Register */ -+#define UDCCS13 __REG(0x40600044) /* UDC Endpoint 13 (IN) Control/Status Register */ -+ -+#define UDCCS_II_TFS (1 << 0) /* Transmit FIFO service */ -+#define UDCCS_II_TPC (1 << 1) /* Transmit packet complete */ -+#define UDCCS_II_FTF (1 << 2) /* Flush Tx FIFO */ -+#define UDCCS_II_TUR (1 << 3) /* Transmit FIFO underrun */ -+#define UDCCS_II_TSP (1 << 7) /* Transmit short packet */ -+ -+/* Isochronous OUT - Endpoint 4,9,14 */ -+#define UDCCS4 __REG(0x40600020) /* UDC Endpoint 4 (OUT) Control/Status Register */ -+#define UDCCS9 __REG(0x40600034) /* UDC Endpoint 9 (OUT) Control/Status Register */ -+#define UDCCS14 __REG(0x40600048) /* UDC Endpoint 14 (OUT) Control/Status Register */ -+ -+#define UDCCS_IO_RFS (1 << 0) /* Receive FIFO service */ -+#define UDCCS_IO_RPC (1 << 1) /* Receive packet complete */ -+#define UDCCS_IO_ROF (1 << 3) /* Receive overflow */ -+#define UDCCS_IO_DME (1 << 3) /* DMA enable */ -+#define UDCCS_IO_RNE (1 << 6) /* Receive FIFO not empty */ -+#define UDCCS_IO_RSP (1 << 7) /* Receive short packet */ -+ -+/* Interrupt IN - Endpoint 5,10,15 */ -+#define UDCCS5 __REG(0x40600024) /* UDC Endpoint 5 (Interrupt) Control/Status Register */ -+#define UDCCS10 __REG(0x40600038) /* UDC Endpoint 10 (Interrupt) Control/Status Register */ -+#define UDCCS15 __REG(0x4060004C) /* UDC Endpoint 15 (Interrupt) Control/Status Register */ -+ -+#define UDCCS_INT_TFS (1 << 0) /* Transmit FIFO service */ -+#define UDCCS_INT_TPC (1 << 1) /* Transmit packet complete */ -+#define UDCCS_INT_FTF (1 << 2) /* Flush Tx FIFO */ -+#define UDCCS_INT_TUR (1 << 3) /* Transmit FIFO underrun */ -+#define UDCCS_INT_SST (1 << 4) /* Sent stall */ -+#define UDCCS_INT_FST (1 << 5) /* Force stall */ -+#define UDCCS_INT_TSP (1 << 7) /* Transmit short packet */ -+ -+#define UFNRH __REG(0x40600060) /* UDC Frame Number Register High */ -+#define UFNRL __REG(0x40600064) /* UDC Frame Number Register Low */ -+#define UBCR2 __REG(0x40600068) /* UDC Byte Count Reg 2 */ -+#define UBCR4 __REG(0x4060006c) /* UDC Byte Count Reg 4 */ -+#define UBCR7 __REG(0x40600070) /* UDC Byte Count Reg 7 */ -+#define UBCR9 __REG(0x40600074) /* UDC Byte Count Reg 9 */ -+#define UBCR12 __REG(0x40600078) /* UDC Byte Count Reg 12 */ -+#define UBCR14 __REG(0x4060007c) /* UDC Byte Count Reg 14 */ -+#define UDDR0 __REG(0x40600080) /* UDC Endpoint 0 Data Register */ -+#define UDDR1 __REG(0x40600100) /* UDC Endpoint 1 Data Register */ -+#define UDDR2 __REG(0x40600180) /* UDC Endpoint 2 Data Register */ -+#define UDDR3 __REG(0x40600200) /* UDC Endpoint 3 Data Register */ -+#define UDDR4 __REG(0x40600400) /* UDC Endpoint 4 Data Register */ -+#define UDDR5 __REG(0x406000A0) /* UDC Endpoint 5 Data Register */ -+#define UDDR6 __REG(0x40600600) /* UDC Endpoint 6 Data Register */ -+#define UDDR7 __REG(0x40600680) /* UDC Endpoint 7 Data Register */ -+#define UDDR8 __REG(0x40600700) /* UDC Endpoint 8 Data Register */ -+#define UDDR9 __REG(0x40600900) /* UDC Endpoint 9 Data Register */ -+#define UDDR10 __REG(0x406000C0) /* UDC Endpoint 10 Data Register */ -+#define UDDR11 __REG(0x40600B00) /* UDC Endpoint 11 Data Register */ -+#define UDDR12 __REG(0x40600B80) /* UDC Endpoint 12 Data Register */ -+#define UDDR13 __REG(0x40600C00) /* UDC Endpoint 13 Data Register */ -+#define UDDR14 __REG(0x40600E00) /* UDC Endpoint 14 Data Register */ -+#define UDDR15 __REG(0x406000E0) /* UDC Endpoint 15 Data Register */ -+ -+#define UICR0 __REG(0x40600050) /* UDC Interrupt Control Register 0 */ -+ -+#define UICR0_IM0 (1 << 0) /* Interrupt mask ep 0 */ -+#define UICR0_IM1 (1 << 1) /* Interrupt mask ep 1 */ -+#define UICR0_IM2 (1 << 2) /* Interrupt mask ep 2 */ -+#define UICR0_IM3 (1 << 3) /* Interrupt mask ep 3 */ -+#define UICR0_IM4 (1 << 4) /* Interrupt mask ep 4 */ -+#define UICR0_IM5 (1 << 5) /* Interrupt mask ep 5 */ -+#define UICR0_IM6 (1 << 6) /* Interrupt mask ep 6 */ -+#define UICR0_IM7 (1 << 7) /* Interrupt mask ep 7 */ -+ -+#define UICR1 __REG(0x40600054) /* UDC Interrupt Control Register 1 */ -+ -+#define UICR1_IM8 (1 << 0) /* Interrupt mask ep 8 */ -+#define UICR1_IM9 (1 << 1) /* Interrupt mask ep 9 */ -+#define UICR1_IM10 (1 << 2) /* Interrupt mask ep 10 */ -+#define UICR1_IM11 (1 << 3) /* Interrupt mask ep 11 */ -+#define UICR1_IM12 (1 << 4) /* Interrupt mask ep 12 */ -+#define UICR1_IM13 (1 << 5) /* Interrupt mask ep 13 */ -+#define UICR1_IM14 (1 << 6) /* Interrupt mask ep 14 */ -+#define UICR1_IM15 (1 << 7) /* Interrupt mask ep 15 */ -+ -+#define USIR0 __REG(0x40600058) /* UDC Status Interrupt Register 0 */ -+ -+#define USIR0_IR0 (1 << 0) /* Interrup request ep 0 */ -+#define USIR0_IR1 (1 << 1) /* Interrup request ep 1 */ -+#define USIR0_IR2 (1 << 2) /* Interrup request ep 2 */ -+#define USIR0_IR3 (1 << 3) /* Interrup request ep 3 */ -+#define USIR0_IR4 (1 << 4) /* Interrup request ep 4 */ -+#define USIR0_IR5 (1 << 5) /* Interrup request ep 5 */ -+#define USIR0_IR6 (1 << 6) /* Interrup request ep 6 */ -+#define USIR0_IR7 (1 << 7) /* Interrup request ep 7 */ -+ -+#define USIR1 __REG(0x4060005C) /* UDC Status Interrupt Register 1 */ -+ -+#define USIR1_IR8 (1 << 0) /* Interrup request ep 8 */ -+#define USIR1_IR9 (1 << 1) /* Interrup request ep 9 */ -+#define USIR1_IR10 (1 << 2) /* Interrup request ep 10 */ -+#define USIR1_IR11 (1 << 3) /* Interrup request ep 11 */ -+#define USIR1_IR12 (1 << 4) /* Interrup request ep 12 */ -+#define USIR1_IR13 (1 << 5) /* Interrup request ep 13 */ -+#define USIR1_IR14 (1 << 6) /* Interrup request ep 14 */ -+#define USIR1_IR15 (1 << 7) /* Interrup request ep 15 */ -+ -+ -+/* -+ * Fast Infrared Communication Port -+ */ -+ -+#define ICCR0 __REG(0x40800000) /* ICP Control Register 0 */ -+#define ICCR1 __REG(0x40800004) /* ICP Control Register 1 */ -+#define ICCR2 __REG(0x40800008) /* ICP Control Register 2 */ -+#define ICDR __REG(0x4080000c) /* ICP Data Register */ -+#define ICSR0 __REG(0x40800014) /* ICP Status Register 0 */ -+#define ICSR1 __REG(0x40800018) /* ICP Status Register 1 */ -+ -+#define ICCR0_AME (1 << 7) /* Adress match enable */ -+#define ICCR0_TIE (1 << 6) /* Transmit FIFO interrupt enable */ -+#define ICCR0_RIE (1 << 5) /* Recieve FIFO interrupt enable */ -+#define ICCR0_RXE (1 << 4) /* Receive enable */ -+#define ICCR0_TXE (1 << 3) /* Transmit enable */ -+#define ICCR0_TUS (1 << 2) /* Transmit FIFO underrun select */ -+#define ICCR0_LBM (1 << 1) /* Loopback mode */ -+#define ICCR0_ITR (1 << 0) /* IrDA transmission */ -+ -+#define ICSR0_FRE (1 << 5) /* Framing error */ -+#define ICSR0_RFS (1 << 4) /* Receive FIFO service request */ -+#define ICSR0_TFS (1 << 3) /* Transnit FIFO service request */ -+#define ICSR0_RAB (1 << 2) /* Receiver abort */ -+#define ICSR0_TUR (1 << 1) /* Trunsmit FIFO underun */ -+#define ICSR0_EIF (1 << 0) /* End/Error in FIFO */ -+ -+#define ICSR1_ROR (1 << 6) /* Receiver FIFO underrun */ -+#define ICSR1_CRE (1 << 5) /* CRC error */ -+#define ICSR1_EOF (1 << 4) /* End of frame */ -+#define ICSR1_TNF (1 << 3) /* Transmit FIFO not full */ -+#define ICSR1_RNE (1 << 2) /* Receive FIFO not empty */ -+#define ICSR1_TBY (1 << 1) /* Tramsmiter busy flag */ -+#define ICSR1_RSY (1 << 0) /* Recevier synchronized flag */ -+ -+ -+/* -+ * Real Time Clock -+ */ -+ -+#define RCNR __REG(0x40900000) /* RTC Count Register */ -+#define RTAR __REG(0x40900004) /* RTC Alarm Register */ -+#define RTSR __REG(0x40900008) /* RTC Status Register */ -+#define RTTR __REG(0x4090000C) /* RTC Timer Trim Register */ -+ -+#define RTSR_HZE (1 << 3) /* HZ interrupt enable */ -+#define RTSR_ALE (1 << 2) /* RTC alarm interrupt enable */ -+#define RTSR_HZ (1 << 1) /* HZ rising-edge detected */ -+#define RTSR_AL (1 << 0) /* RTC alarm detected */ -+ -+ -+/* -+ * OS Timer & Match Registers -+ */ -+ -+#define OSMR0 __REG(0x40A00000) /* */ -+#define OSMR1 __REG(0x40A00004) /* */ -+#define OSMR2 __REG(0x40A00008) /* */ -+#define OSMR3 __REG(0x40A0000C) /* */ -+#define OSCR __REG(0x40A00010) /* OS Timer Counter Register */ -+#define OSSR __REG(0x40A00014) /* OS Timer Status Register */ -+#define OWER __REG(0x40A00018) /* OS Timer Watchdog Enable Register */ -+#define OIER __REG(0x40A0001C) /* OS Timer Interrupt Enable Register */ -+ -+#define OSSR_M3 (1 << 3) /* Match status channel 3 */ -+#define OSSR_M2 (1 << 2) /* Match status channel 2 */ -+#define OSSR_M1 (1 << 1) /* Match status channel 1 */ -+#define OSSR_M0 (1 << 0) /* Match status channel 0 */ -+ -+#define OWER_WME (1 << 0) /* Watchdog Match Enable */ -+ -+#define OIER_E3 (1 << 3) /* Interrupt enable channel 3 */ -+#define OIER_E2 (1 << 2) /* Interrupt enable channel 2 */ -+#define OIER_E1 (1 << 1) /* Interrupt enable channel 1 */ -+#define OIER_E0 (1 << 0) /* Interrupt enable channel 0 */ -+ -+ -+/* -+ * Pulse Width Modulator -+ */ -+ -+#define PWM_CTRL0 __REG(0x40B00000) /* PWM 0 Control Register */ -+#define PWM_PWDUTY0 __REG(0x40B00004) /* PWM 0 Duty Cycle Register */ -+#define PWM_PERVAL0 __REG(0x40B00008) /* PWM 0 Period Control Register */ -+ -+#define PWM_CTRL1 __REG(0x40C00000) /* PWM 1Control Register */ -+#define PWM_PWDUTY1 __REG(0x40C00004) /* PWM 1 Duty Cycle Register */ -+#define PWM_PERVAL1 __REG(0x40C00008) /* PWM 1 Period Control Register */ -+ -+ -+/* -+ * Interrupt Controller -+ */ -+ -+#define ICIP __REG(0x40D00000) /* Interrupt Controller IRQ Pending Register */ -+#define ICMR __REG(0x40D00004) /* Interrupt Controller Mask Register */ -+#define ICLR __REG(0x40D00008) /* Interrupt Controller Level Register */ -+#define ICFP __REG(0x40D0000C) /* Interrupt Controller FIQ Pending Register */ -+#define ICPR __REG(0x40D00010) /* Interrupt Controller Pending Register */ -+#define ICCR __REG(0x40D00014) /* Interrupt Controller Control Register */ -+ -+ -+/* -+ * General Purpose I/O -+ */ -+ -+#define GPLR0 __REG(0x40E00000) /* GPIO Pin-Level Register GPIO<31:0> */ -+#define GPLR1 __REG(0x40E00004) /* GPIO Pin-Level Register GPIO<63:32> */ -+#define GPLR2 __REG(0x40E00008) /* GPIO Pin-Level Register GPIO<80:64> */ -+ -+#define GPDR0 __REG(0x40E0000C) /* GPIO Pin Direction Register GPIO<31:0> */ -+#define GPDR1 __REG(0x40E00010) /* GPIO Pin Direction Register GPIO<63:32> */ -+#define GPDR2 __REG(0x40E00014) /* GPIO Pin Direction Register GPIO<80:64> */ -+ -+#define GPSR0 __REG(0x40E00018) /* GPIO Pin Output Set Register GPIO<31:0> */ -+#define GPSR1 __REG(0x40E0001C) /* GPIO Pin Output Set Register GPIO<63:32> */ -+#define GPSR2 __REG(0x40E00020) /* GPIO Pin Output Set Register GPIO<80:64> */ -+ -+#define GPCR0 __REG(0x40E00024) /* GPIO Pin Output Clear Register GPIO<31:0> */ -+#define GPCR1 __REG(0x40E00028) /* GPIO Pin Output Clear Register GPIO <63:32> */ -+#define GPCR2 __REG(0x40E0002C) /* GPIO Pin Output Clear Register GPIO <80:64> */ -+ -+#define GRER0 __REG(0x40E00030) /* GPIO Rising-Edge Detect Register GPIO<31:0> */ -+#define GRER1 __REG(0x40E00034) /* GPIO Rising-Edge Detect Register GPIO<63:32> */ -+#define GRER2 __REG(0x40E00038) /* GPIO Rising-Edge Detect Register GPIO<80:64> */ -+ -+#define GFER0 __REG(0x40E0003C) /* GPIO Falling-Edge Detect Register GPIO<31:0> */ -+#define GFER1 __REG(0x40E00040) /* GPIO Falling-Edge Detect Register GPIO<63:32> */ -+#define GFER2 __REG(0x40E00044) /* GPIO Falling-Edge Detect Register GPIO<80:64> */ -+ -+#define GEDR0 __REG(0x40E00048) /* GPIO Edge Detect Status Register GPIO<31:0> */ -+#define GEDR1 __REG(0x40E0004C) /* GPIO Edge Detect Status Register GPIO<63:32> */ -+#define GEDR2 __REG(0x40E00050) /* GPIO Edge Detect Status Register GPIO<80:64> */ -+ -+#define GAFR0_L __REG(0x40E00054) /* GPIO Alternate Function Select Register GPIO<15:0> */ -+#define GAFR0_U __REG(0x40E00058) /* GPIO Alternate Function Select Register GPIO<31:16> */ -+#define GAFR1_L __REG(0x40E0005C) /* GPIO Alternate Function Select Register GPIO<47:32> */ -+#define GAFR1_U __REG(0x40E00060) /* GPIO Alternate Function Select Register GPIO<63:48> */ -+#define GAFR2_L __REG(0x40E00064) /* GPIO Alternate Function Select Register GPIO<79:64> */ -+#define GAFR2_U __REG(0x40E00068) /* GPIO Alternate Function Select Register GPIO 80 */ -+ -+/* More handy macros. The argument is a literal GPIO number. */ -+ -+#define GPIO_bit(x) (1 << ((x) & 0x1f)) -+#define GPLR(x) __REG2(0x40E00000, ((x) & 0x60) >> 3) -+#define GPDR(x) __REG2(0x40E0000C, ((x) & 0x60) >> 3) -+#define GPSR(x) __REG2(0x40E00018, ((x) & 0x60) >> 3) -+#define GPCR(x) __REG2(0x40E00024, ((x) & 0x60) >> 3) -+#define GRER(x) __REG2(0x40E00030, ((x) & 0x60) >> 3) -+#define GFER(x) __REG2(0x40E0003C, ((x) & 0x60) >> 3) -+#define GEDR(x) __REG2(0x40E00048, ((x) & 0x60) >> 3) -+#define GAFR(x) __REG2(0x40E00054, ((x) & 0x70) >> 2) -+ -+/* GPIO alternate function assignments */ -+ -+#define GPIO1_RST 1 /* reset */ -+#define GPIO6_MMCCLK 6 /* MMC Clock */ -+#define GPIO8_48MHz 7 /* 48 MHz clock output */ -+#define GPIO8_MMCCS0 8 /* MMC Chip Select 0 */ -+#define GPIO9_MMCCS1 9 /* MMC Chip Select 1 */ -+#define GPIO10_RTCCLK 10 /* real time clock (1 Hz) */ -+#define GPIO11_3_6MHz 11 /* 3.6 MHz oscillator out */ -+#define GPIO12_32KHz 12 /* 32 kHz out */ -+#define GPIO13_MBGNT 13 /* memory controller grant */ -+#define GPIO14_MBREQ 14 /* alternate bus master request */ -+#define GPIO15_nCS_1 15 /* chip select 1 */ -+#define GPIO16_PWM0 16 /* PWM0 output */ -+#define GPIO17_PWM1 17 /* PWM1 output */ -+#define GPIO18_RDY 18 /* Ext. Bus Ready */ -+#define GPIO19_DREQ1 19 /* External DMA Request */ -+#define GPIO20_DREQ0 20 /* External DMA Request */ -+#define GPIO23_SCLK 23 /* SSP clock */ -+#define GPIO24_SFRM 24 /* SSP Frame */ -+#define GPIO25_STXD 25 /* SSP transmit */ -+#define GPIO26_SRXD 26 /* SSP receive */ -+#define GPIO27_SEXTCLK 27 /* SSP ext_clk */ -+#define GPIO28_BITCLK 28 /* AC97/I2S bit_clk */ -+#define GPIO29_SDATA_IN 29 /* AC97 Sdata_in0 / I2S Sdata_in */ -+#define GPIO30_SDATA_OUT 30 /* AC97/I2S Sdata_out */ -+#define GPIO31_SYNC 31 /* AC97/I2S sync */ -+#define GPIO32_SDATA_IN1 32 /* AC97 Sdata_in1 */ -+#define GPIO33_nCS_5 33 /* chip select 5 */ -+#define GPIO34_FFRXD 34 /* FFUART receive */ -+#define GPIO34_MMCCS0 34 /* MMC Chip Select 0 */ -+#define GPIO35_FFCTS 35 /* FFUART Clear to send */ -+#define GPIO36_FFDCD 36 /* FFUART Data carrier detect */ -+#define GPIO37_FFDSR 37 /* FFUART data set ready */ -+#define GPIO38_FFRI 38 /* FFUART Ring Indicator */ -+#define GPIO39_MMCCS1 39 /* MMC Chip Select 1 */ -+#define GPIO39_FFTXD 39 /* FFUART transmit data */ -+#define GPIO40_FFDTR 40 /* FFUART data terminal Ready */ -+#define GPIO41_FFRTS 41 /* FFUART request to send */ -+#define GPIO42_BTRXD 42 /* BTUART receive data */ -+#define GPIO43_BTTXD 43 /* BTUART transmit data */ -+#define GPIO44_BTCTS 44 /* BTUART clear to send */ -+#define GPIO45_BTRTS 45 /* BTUART request to send */ -+#define GPIO46_ICPRXD 46 /* ICP receive data */ -+#define GPIO46_STRXD 46 /* STD_UART receive data */ -+#define GPIO47_ICPTXD 47 /* ICP transmit data */ -+#define GPIO47_STTXD 47 /* STD_UART transmit data */ -+#define GPIO48_nPOE 48 /* Output Enable for Card Space */ -+#define GPIO49_nPWE 49 /* Write Enable for Card Space */ -+#define GPIO50_nPIOR 50 /* I/O Read for Card Space */ -+#define GPIO51_nPIOW 51 /* I/O Write for Card Space */ -+#define GPIO52_nPCE_1 52 /* Card Enable for Card Space */ -+#define GPIO53_nPCE_2 53 /* Card Enable for Card Space */ -+#define GPIO53_MMCCLK 53 /* MMC Clock */ -+#define GPIO54_MMCCLK 54 /* MMC Clock */ -+#define GPIO54_pSKTSEL 54 /* Socket Select for Card Space */ -+#define GPIO55_nPREG 55 /* Card Address bit 26 */ -+#define GPIO56_nPWAIT 56 /* Wait signal for Card Space */ -+#define GPIO57_nIOIS16 57 /* Bus Width select for I/O Card Space */ -+#define GPIO58_LDD_0 58 /* LCD data pin 0 */ -+#define GPIO59_LDD_1 59 /* LCD data pin 1 */ -+#define GPIO60_LDD_2 60 /* LCD data pin 2 */ -+#define GPIO61_LDD_3 61 /* LCD data pin 3 */ -+#define GPIO62_LDD_4 62 /* LCD data pin 4 */ -+#define GPIO63_LDD_5 63 /* LCD data pin 5 */ -+#define GPIO64_LDD_6 64 /* LCD data pin 6 */ -+#define GPIO65_LDD_7 65 /* LCD data pin 7 */ -+#define GPIO66_LDD_8 66 /* LCD data pin 8 */ -+#define GPIO66_MBREQ 66 /* alternate bus master req */ -+#define GPIO67_LDD_9 67 /* LCD data pin 9 */ -+#define GPIO67_MMCCS0 67 /* MMC Chip Select 0 */ -+#define GPIO68_LDD_10 68 /* LCD data pin 10 */ -+#define GPIO68_MMCCS1 68 /* MMC Chip Select 1 */ -+#define GPIO69_LDD_11 69 /* LCD data pin 11 */ -+#define GPIO69_MMCCLK 69 /* MMC_CLK */ -+#define GPIO70_LDD_12 70 /* LCD data pin 12 */ -+#define GPIO70_RTCCLK 70 /* Real Time clock (1 Hz) */ -+#define GPIO71_LDD_13 71 /* LCD data pin 13 */ -+#define GPIO71_3_6MHz 71 /* 3.6 MHz Oscillator clock */ -+#define GPIO72_LDD_14 72 /* LCD data pin 14 */ -+#define GPIO72_32kHz 72 /* 32 kHz clock */ -+#define GPIO73_LDD_15 73 /* LCD data pin 15 */ -+#define GPIO73_MBGNT 73 /* Memory controller grant */ -+#define GPIO74_LCD_FCLK 74 /* LCD Frame clock */ -+#define GPIO75_LCD_LCLK 75 /* LCD line clock */ -+#define GPIO76_LCD_PCLK 76 /* LCD Pixel clock */ -+#define GPIO77_LCD_ACBIAS 77 /* LCD AC Bias */ -+#define GPIO78_nCS_2 78 /* chip select 2 */ -+#define GPIO79_nCS_3 79 /* chip select 3 */ -+#define GPIO80_nCS_4 80 /* chip select 4 */ -+ -+/* GPIO alternate function mode & direction */ -+ -+#define GPIO_IN 0x000 -+#define GPIO_OUT 0x080 -+#define GPIO_ALT_FN_1_IN 0x100 -+#define GPIO_ALT_FN_1_OUT 0x180 -+#define GPIO_ALT_FN_2_IN 0x200 -+#define GPIO_ALT_FN_2_OUT 0x280 -+#define GPIO_ALT_FN_3_IN 0x300 -+#define GPIO_ALT_FN_3_OUT 0x380 -+#define GPIO_MD_MASK_NR 0x07f -+#define GPIO_MD_MASK_DIR 0x080 -+#define GPIO_MD_MASK_FN 0x300 -+ -+#define GPIO1_RTS_MD ( 1 | GPIO_ALT_FN_1_IN) -+#define GPIO6_MMCCLK_MD ( 6 | GPIO_ALT_FN_1_OUT) -+#define GPIO8_48MHz_MD ( 8 | GPIO_ALT_FN_1_OUT) -+#define GPIO8_MMCCS0_MD ( 8 | GPIO_ALT_FN_1_OUT) -+#define GPIO9_MMCCS1_MD ( 9 | GPIO_ALT_FN_1_OUT) -+#define GPIO10_RTCCLK_MD (10 | GPIO_ALT_FN_1_OUT) -+#define GPIO11_3_6MHz_MD (11 | GPIO_ALT_FN_1_OUT) -+#define GPIO12_32KHz_MD (12 | GPIO_ALT_FN_1_OUT) -+#define GPIO13_MBGNT_MD (13 | GPIO_ALT_FN_2_OUT) -+#define GPIO14_MBREQ_MD (14 | GPIO_ALT_FN_1_IN) -+#define GPIO15_nCS_1_MD (15 | GPIO_ALT_FN_2_OUT) -+#define GPIO16_PWM0_MD (16 | GPIO_ALT_FN_2_OUT) -+#define GPIO17_PWM1_MD (17 | GPIO_ALT_FN_2_OUT) -+#define GPIO18_RDY_MD (18 | GPIO_ALT_FN_1_IN) -+#define GPIO19_DREQ1_MD (19 | GPIO_ALT_FN_1_IN) -+#define GPIO20_DREQ0_MD (20 | GPIO_ALT_FN_1_IN) -+#define GPIO23_SCLK_md (23 | GPIO_ALT_FN_2_OUT) -+#define GPIO24_SFRM_MD (24 | GPIO_ALT_FN_2_OUT) -+#define GPIO25_STXD_MD (25 | GPIO_ALT_FN_2_OUT) -+#define GPIO26_SRXD_MD (26 | GPIO_ALT_FN_1_IN) -+#define GPIO27_SEXTCLK_MD (27 | GPIO_ALT_FN_1_IN) -+#define GPIO28_BITCLK_AC97_MD (28 | GPIO_ALT_FN_1_IN) -+#define GPIO28_BITCLK_I2S_MD (28 | GPIO_ALT_FN_2_IN) -+#define GPIO29_SDATA_IN_AC97_MD (29 | GPIO_ALT_FN_1_IN) -+#define GPIO29_SDATA_IN_I2S_MD (29 | GPIO_ALT_FN_2_IN) -+#define GPIO30_SDATA_OUT_AC97_MD (30 | GPIO_ALT_FN_2_OUT) -+#define GPIO30_SDATA_OUT_I2S_MD (30 | GPIO_ALT_FN_1_OUT) -+#define GPIO31_SYNC_AC97_MD (31 | GPIO_ALT_FN_2_OUT) -+#define GPIO31_SYNC_I2S_MD (31 | GPIO_ALT_FN_1_OUT) -+#define GPIO32_SDATA_IN1_AC97_MD (32 | GPIO_ALT_FN_1_IN) -+#define GPIO33_nCS_5_MD (33 | GPIO_ALT_FN_2_OUT) -+#define GPIO34_FFRXD_MD (34 | GPIO_ALT_FN_1_IN) -+#define GPIO34_MMCCS0_MD (34 | GPIO_ALT_FN_2_OUT) -+#define GPIO35_FFCTS_MD (35 | GPIO_ALT_FN_1_IN) -+#define GPIO36_FFDCD_MD (36 | GPIO_ALT_FN_1_IN) -+#define GPIO37_FFDSR_MD (37 | GPIO_ALT_FN_1_IN) -+#define GPIO38_FFRI_MD (38 | GPIO_ALT_FN_1_IN) -+#define GPIO39_MMCCS1_MD (39 | GPIO_ALT_FN_1_OUT) -+#define GPIO39_FFTXD_MD (39 | GPIO_ALT_FN_2_OUT) -+#define GPIO40_FFDTR_MD (40 | GPIO_ALT_FN_2_OUT) -+#define GPIO41_FFRTS_MD (41 | GPIO_ALT_FN_2_OUT) -+#define GPIO42_BTRXD_MD (42 | GPIO_ALT_FN_1_IN) -+#define GPIO43_BTTXD_MD (43 | GPIO_ALT_FN_2_OUT) -+#define GPIO44_BTCTS_MD (44 | GPIO_ALT_FN_1_IN) -+#define GPIO45_BTRTS_MD (45 | GPIO_ALT_FN_2_OUT) -+#define GPIO46_ICPRXD_MD (46 | GPIO_ALT_FN_1_IN) -+#define GPIO46_STRXD_MD (46 | GPIO_ALT_FN_2_IN) -+#define GPIO47_ICPTXD_MD (47 | GPIO_ALT_FN_2_OUT) -+#define GPIO47_STTXD_MD (47 | GPIO_ALT_FN_1_OUT) -+#define GPIO48_nPOE_MD (48 | GPIO_ALT_FN_2_OUT) -+#define GPIO49_nPWE_MD (49 | GPIO_ALT_FN_2_OUT) -+#define GPIO50_nPIOR_MD (50 | GPIO_ALT_FN_2_OUT) -+#define GPIO51_nPIOW_MD (51 | GPIO_ALT_FN_2_OUT) -+#define GPIO52_nPCE_1_MD (52 | GPIO_ALT_FN_2_OUT) -+#define GPIO53_nPCE_2_MD (53 | GPIO_ALT_FN_2_OUT) -+#define GPIO53_MMCCLK_MD (53 | GPIO_ALT_FN_1_OUT) -+#define GPIO54_MMCCLK_MD (54 | GPIO_ALT_FN_1_OUT) -+#define GPIO54_pSKTSEL_MD (54 | GPIO_ALT_FN_2_OUT) -+#define GPIO55_nPREG_MD (55 | GPIO_ALT_FN_2_OUT) -+#define GPIO56_nPWAIT_MD (56 | GPIO_ALT_FN_1_IN) -+#define GPIO57_nIOIS16_MD (57 | GPIO_ALT_FN_1_IN) -+#define GPIO58_LDD_0_MD (58 | GPIO_ALT_FN_2_OUT) -+#define GPIO59_LDD_1_MD (59 | GPIO_ALT_FN_2_OUT) -+#define GPIO60_LDD_2_MD (60 | GPIO_ALT_FN_2_OUT) -+#define GPIO61_LDD_3_MD (61 | GPIO_ALT_FN_2_OUT) -+#define GPIO62_LDD_4_MD (62 | GPIO_ALT_FN_2_OUT) -+#define GPIO63_LDD_5_MD (63 | GPIO_ALT_FN_2_OUT) -+#define GPIO64_LDD_6_MD (64 | GPIO_ALT_FN_2_OUT) -+#define GPIO65_LDD_7_MD (65 | GPIO_ALT_FN_2_OUT) -+#define GPIO66_LDD_8_MD (66 | GPIO_ALT_FN_2_OUT) -+#define GPIO66_MBREQ_MD (66 | GPIO_ALT_FN_1_IN) -+#define GPIO67_LDD_9_MD (67 | GPIO_ALT_FN_2_OUT) -+#define GPIO67_MMCCS0_MD (67 | GPIO_ALT_FN_1_OUT) -+#define GPIO68_LDD_10_MD (68 | GPIO_ALT_FN_2_OUT) -+#define GPIO68_MMCCS1_MD (68 | GPIO_ALT_FN_1_OUT) -+#define GPIO69_LDD_11_MD (69 | GPIO_ALT_FN_2_OUT) -+#define GPIO69_MMCCLK_MD (69 | GPIO_ALT_FN_1_OUT) -+#define GPIO70_LDD_12_MD (70 | GPIO_ALT_FN_2_OUT) -+#define GPIO70_RTCCLK_MD (70 | GPIO_ALT_FN_1_OUT) -+#define GPIO71_LDD_13_MD (71 | GPIO_ALT_FN_2_OUT) -+#define GPIO71_3_6MHz_MD (71 | GPIO_ALT_FN_1_OUT) -+#define GPIO72_LDD_14_MD (72 | GPIO_ALT_FN_2_OUT) -+#define GPIO72_32kHz_MD (72 | GPIO_ALT_FN_1_OUT) -+#define GPIO73_LDD_15_MD (73 | GPIO_ALT_FN_2_OUT) -+#define GPIO73_MBGNT_MD (73 | GPIO_ALT_FN_1_OUT) -+#define GPIO74_LCD_FCLK_MD (74 | GPIO_ALT_FN_2_OUT) -+#define GPIO75_LCD_LCLK_MD (75 | GPIO_ALT_FN_2_OUT) -+#define GPIO76_LCD_PCLK_MD (76 | GPIO_ALT_FN_2_OUT) -+#define GPIO77_LCD_ACBIAS_MD (77 | GPIO_ALT_FN_2_OUT) -+#define GPIO78_nCS_2_MD (78 | GPIO_ALT_FN_2_OUT) -+#define GPIO79_nCS_3_MD (79 | GPIO_ALT_FN_2_OUT) -+#define GPIO80_nCS_4_MD (80 | GPIO_ALT_FN_2_OUT) -+ -+ -+/* -+ * Power Manager -+ */ -+ -+#define PMCR __REG(0x40F00000) /* Power Manager Control Register */ -+#define PSSR __REG(0x40F00004) /* Power Manager Sleep Status Register */ -+#define PSPR __REG(0x40F00008) /* Power Manager Scratch Pad Register */ -+#define PWER __REG(0x40F0000C) /* Power Manager Wake-up Enable Register */ -+#define PRER __REG(0x40F00010) /* Power Manager GPIO Rising-Edge Detect Enable Register */ -+#define PFER __REG(0x40F00014) /* Power Manager GPIO Falling-Edge Detect Enable Register */ -+#define PEDR __REG(0x40F00018) /* Power Manager GPIO Edge Detect Status Register */ -+#define PCFR __REG(0x40F0001C) /* Power Manager General Configuration Register */ -+#define PGSR0 __REG(0x40F00020) /* Power Manager GPIO Sleep State Register for GP[31-0] */ -+#define PGSR1 __REG(0x40F00024) /* Power Manager GPIO Sleep State Register for GP[63-32] */ -+#define PGSR2 __REG(0x40F00028) /* Power Manager GPIO Sleep State Register for GP[84-64] */ -+#define RCSR __REG(0x40F00030) /* Reset Controller Status Register */ -+ -+#define PSSR_RDH (1 << 5) /* Read Disable Hold */ -+#define PSSR_PH (1 << 4) /* Peripheral Control Hold */ -+#define PSSR_VFS (1 << 2) /* VDD Fault Status */ -+#define PSSR_BFS (1 << 1) /* Battery Fault Status */ -+#define PSSR_SSS (1 << 0) /* Software Sleep Status */ -+ -+#define PCFR_DS (1 << 3) /* Deep Sleep Mode */ -+#define PCFR_FS (1 << 2) /* Float Static Chip Selects */ -+#define PCFR_FP (1 << 1) /* Float PCMCIA controls */ -+#define PCFR_OPDE (1 << 0) /* 3.6864 MHz oscillator power-down enable */ -+ -+#define RCSR_GPR (1 << 3) /* GPIO Reset */ -+#define RCSR_SMR (1 << 2) /* Sleep Mode */ -+#define RCSR_WDR (1 << 1) /* Watchdog Reset */ -+#define RCSR_HWR (1 << 0) /* Hardware Reset */ -+ -+ -+/* -+ * SSP Serial Port Registers -+ */ -+ -+#define SSCR0 __REG(0x41000000) /* SSP Control Register 0 */ -+#define SSCR1 __REG(0x41000004) /* SSP Control Register 1 */ -+#define SSSR __REG(0x41000008) /* SSP Status Register */ -+#define SSITR __REG(0x4100000C) /* SSP Interrupt Test Register */ -+#define SSDR __REG(0x41000010) /* (Write / Read) SSP Data Write Register/SSP Data Read Register */ -+ -+ -+/* -+ * MultiMediaCard (MMC) controller -+ */ -+ -+#define MMC_STRPCL __REG(0x41100000) /* Control to start and stop MMC clock */ -+#define MMC_STAT __REG(0x41100004) /* MMC Status Register (read only) */ -+#define MMC_CLKRT __REG(0x41100008) /* MMC clock rate */ -+#define MMC_SPI __REG(0x4110000c) /* SPI mode control bits */ -+#define MMC_CMDAT __REG(0x41100010) /* Command/response/data sequence control */ -+#define MMC_RESTO __REG(0x41100014) /* Expected response time out */ -+#define MMC_RDTO __REG(0x41100018) /* Expected data read time out */ -+#define MMC_BLKLEN __REG(0x4110001c) /* Block length of data transaction */ -+#define MMC_NOB __REG(0x41100020) /* Number of blocks, for block mode */ -+#define MMC_PRTBUF __REG(0x41100024) /* Partial MMC_TXFIFO FIFO written */ -+#define MMC_I_MASK __REG(0x41100028) /* Interrupt Mask */ -+#define MMC_I_REG __REG(0x4110002c) /* Interrupt Register (read only) */ -+#define MMC_CMD __REG(0x41100030) /* Index of current command */ -+#define MMC_ARGH __REG(0x41100034) /* MSW part of the current command argument */ -+#define MMC_ARGL __REG(0x41100038) /* LSW part of the current command argument */ -+#define MMC_RES __REG(0x4110003c) /* Response FIFO (read only) */ -+#define MMC_RXFIFO __REG(0x41100040) /* Receive FIFO (read only) */ -+#define MMC_TXFIFO __REG(0x41100044) /* Transmit FIFO (write only) */ -+ -+ -+/* -+ * Core Clock -+ */ -+ -+#define CCCR __REG(0x41300000) /* Core Clock Configuration Register */ -+#define CKEN __REG(0x41300004) /* Clock Enable Register */ -+#define OSCC __REG(0x41300008) /* Oscillator Configuration Register */ -+ -+#define CCCR_N_MASK 0x0380 /* Run Mode Frequency to Turbo Mode Frequency Multiplier */ -+#define CCCR_M_MASK 0x0060 /* Memory Frequency to Run Mode Frequency Multiplier */ -+#define CCCR_L_MASK 0x001f /* Crystal Frequency to Memory Frequency Multiplier */ -+ -+#define CKEN16_LCD (1 << 16) /* LCD Unit Clock Enable */ -+#define CKEN14_I2C (1 << 14) /* I2C Unit Clock Enable */ -+#define CKEN13_FICP (1 << 13) /* FICP Unit Clock Enable */ -+#define CKEN12_MMC (1 << 12) /* MMC Unit Clock Enable */ -+#define CKEN11_USB (1 << 11) /* USB Unit Clock Enable */ -+#define CKEN8_I2S (1 << 8) /* I2S Unit Clock Enable */ -+#define CKEN7_BTUART (1 << 7) /* BTUART Unit Clock Enable */ -+#define CKEN6_FFUART (1 << 6) /* FFUART Unit Clock Enable */ -+#define CKEN5_STUART (1 << 5) /* STUART Unit Clock Enable */ -+#define CKEN3_SSP (1 << 3) /* SSP Unit Clock Enable */ -+#define CKEN2_AC97 (1 << 2) /* AC97 Unit Clock Enable */ -+#define CKEN1_PWM1 (1 << 1) /* PWM1 Clock Enable */ -+#define CKEN0_PWM0 (1 << 0) /* PWM0 Clock Enable */ -+ -+#define OSCC_OON (1 << 1) /* 32.768kHz OON (write-once only bit) */ -+#define OSCC_OOK (1 << 0) /* 32.768kHz OOK (read-only bit) */ -+ -+ -+/* -+ * LCD -+ */ -+ -+#define LCCR0 __REG(0x44000000) /* LCD Controller Control Register 0 */ -+#define LCCR1 __REG(0x44000004) /* LCD Controller Control Register 1 */ -+#define LCCR2 __REG(0x44000008) /* LCD Controller Control Register 2 */ -+#define LCCR3 __REG(0x4400000C) /* LCD Controller Control Register 3 */ -+#define DFBR0 __REG(0x44000020) /* DMA Channel 0 Frame Branch Register */ -+#define DFBR1 __REG(0x44000024) /* DMA Channel 1 Frame Branch Register */ -+#define LCSR __REG(0x44000038) /* LCD Controller Status Register */ -+#define LIIDR __REG(0x4400003C) /* LCD Controller Interrupt ID Register */ -+#define TMEDRGBR __REG(0x44000040) /* TMED RGB Seed Register */ -+#define TMEDCR __REG(0x44000044) /* TMED Control Register */ -+ -+#define FDADR0 __REG(0x44000200) /* DMA Channel 0 Frame Descriptor Address Register */ -+#define FSADR0 __REG(0x44000204) /* DMA Channel 0 Frame Source Address Register */ -+#define FIDR0 __REG(0x44000208) /* DMA Channel 0 Frame ID Register */ -+#define LDCMD0 __REG(0x4400020C) /* DMA Channel 0 Command Register */ -+#define FDADR1 __REG(0x44000210) /* DMA Channel 1 Frame Descriptor Address Register */ -+#define FSADR1 __REG(0x44000214) /* DMA Channel 1 Frame Source Address Register */ -+#define FIDR1 __REG(0x44000218) /* DMA Channel 1 Frame ID Register */ -+#define LDCMD1 __REG(0x4400021C) /* DMA Channel 1 Command Register */ -+ -+#define LCCR0_ENB (1 << 0) /* LCD Controller enable */ -+#define LCCR0_CMS (1 << 1) /* Color = 0, Monochrome = 1 */ -+#define LCCR0_SDS (1 << 2) /* Single Panel = 0, Dual Panel = 1 */ -+#define LCCR0_LDM (1 << 3) /* LCD Disable Done Mask */ -+#define LCCR0_SFM (1 << 4) /* Start of frame mask */ -+#define LCCR0_IUM (1 << 5) /* Input FIFO underrun mask */ -+#define LCCR0_EFM (1 << 6) /* End of Frame mask */ -+#define LCCR0_PAS (1 << 7) /* Passive = 0, Active = 1 */ -+#define LCCR0_BLE (1 << 8) /* Little Endian = 0, Big Endian = 1 */ -+#define LCCR0_DPD (1 << 9) /* Double Pixel mode, 4 pixel value = 0, 8 pixle values = 1 */ -+#define LCCR0_DIS (1 << 10) /* LCD Disable */ -+#define LCCR0_QDM (1 << 11) /* LCD Quick Disable mask */ -+#define LCCR0_PDD (0xff << 12) /* Palette DMA request delay */ -+#define LCCR0_PDD_S 12 -+#define LCCR0_BM (1 << 20) /* Branch mask */ -+#define LCCR0_OUM (1 << 21) /* Output FIFO underrun mask */ -+ -+#define LCCR1_PPL Fld (10, 0) /* Pixels Per Line - 1 */ -+#define LCCR1_DisWdth(Pixel) /* Display Width [1..800 pix.] */ \ -+ (((Pixel) - 1) << FShft (LCCR1_PPL)) -+ -+#define LCCR1_HSW Fld (6, 10) /* Horizontal Synchronization */ -+#define LCCR1_HorSnchWdth(Tpix) /* Horizontal Synchronization */ \ -+ /* pulse Width [1..64 Tpix] */ \ -+ (((Tpix) - 1) << FShft (LCCR1_HSW)) -+ -+#define LCCR1_ELW Fld (8, 16) /* End-of-Line pixel clock Wait */ -+ /* count - 1 [Tpix] */ -+#define LCCR1_EndLnDel(Tpix) /* End-of-Line Delay */ \ -+ /* [1..256 Tpix] */ \ -+ (((Tpix) - 1) << FShft (LCCR1_ELW)) -+ -+#define LCCR1_BLW Fld (8, 24) /* Beginning-of-Line pixel clock */ -+ /* Wait count - 1 [Tpix] */ -+#define LCCR1_BegLnDel(Tpix) /* Beginning-of-Line Delay */ \ -+ /* [1..256 Tpix] */ \ -+ (((Tpix) - 1) << FShft (LCCR1_BLW)) -+ -+ -+#define LCCR2_LPP Fld (10, 0) /* Line Per Panel - 1 */ -+#define LCCR2_DisHght(Line) /* Display Height [1..1024 lines] */ \ -+ (((Line) - 1) << FShft (LCCR2_LPP)) -+ -+#define LCCR2_VSW Fld (6, 10) /* Vertical Synchronization pulse */ -+ /* Width - 1 [Tln] (L_FCLK) */ -+#define LCCR2_VrtSnchWdth(Tln) /* Vertical Synchronization pulse */ \ -+ /* Width [1..64 Tln] */ \ -+ (((Tln) - 1) << FShft (LCCR2_VSW)) -+ -+#define LCCR2_EFW Fld (8, 16) /* End-of-Frame line clock Wait */ -+ /* count [Tln] */ -+#define LCCR2_EndFrmDel(Tln) /* End-of-Frame Delay */ \ -+ /* [0..255 Tln] */ \ -+ ((Tln) << FShft (LCCR2_EFW)) -+ -+#define LCCR2_BFW Fld (8, 24) /* Beginning-of-Frame line clock */ -+ /* Wait count [Tln] */ -+#define LCCR2_BegFrmDel(Tln) /* Beginning-of-Frame Delay */ \ -+ /* [0..255 Tln] */ \ -+ ((Tln) << FShft (LCCR2_BFW)) -+ -+#if 0 -+#define LCCR3_PCD (0xff) /* Pixel clock divisor */ -+#define LCCR3_ACB (0xff << 8) /* AC Bias pin frequency */ -+#define LCCR3_ACB_S 8 -+#endif -+ -+#define LCCR3_API (0xf << 16) /* AC Bias pin trasitions per interrupt */ -+#define LCCR3_API_S 16 -+#define LCCR3_VSP (1 << 20) /* vertical sync polarity */ -+#define LCCR3_HSP (1 << 21) /* horizontal sync polarity */ -+#define LCCR3_PCP (1 << 22) /* pixel clock polarity */ -+#define LCCR3_OEP (1 << 23) /* output enable polarity */ -+#if 0 -+#define LCCR3_BPP (7 << 24) /* bits per pixel */ -+#define LCCR3_BPP_S 24 -+#endif -+#define LCCR3_DPC (1 << 27) /* double pixel clock mode */ -+ -+ -+#define LCCR3_PCD Fld (8, 0) /* Pixel Clock Divisor */ -+#define LCCR3_PixClkDiv(Div) /* Pixel Clock Divisor */ \ -+ (((Div) << FShft (LCCR3_PCD))) -+ -+ -+#define LCCR3_BPP Fld (3, 24) /* Bit Per Pixel */ -+#define LCCR3_Bpp(Bpp) /* Bit Per Pixel */ \ -+ (((Bpp) << FShft (LCCR3_BPP))) -+ -+#define LCCR3_ACB Fld (8, 8) /* AC Bias */ -+#define LCCR3_Acb(Acb) /* BAC Bias */ \ -+ (((Acb) << FShft (LCCR3_ACB))) -+ -+#define LCCR3_HorSnchH (LCCR3_HSP*0) /* Horizontal Synchronization */ -+ /* pulse active High */ -+#define LCCR3_HorSnchL (LCCR3_HSP*1) /* Horizontal Synchronization */ -+ -+#define LCCR3_VrtSnchH (LCCR3_VSP*0) /* Vertical Synchronization pulse */ -+ /* active High */ -+#define LCCR3_VrtSnchL (LCCR3_VSP*1) /* Vertical Synchronization pulse */ -+ /* active Low */ -+ -+#define LCSR_LDD (1 << 0) /* LCD Disable Done */ -+#define LCSR_SOF (1 << 1) /* Start of frame */ -+#define LCSR_BER (1 << 2) /* Bus error */ -+#define LCSR_ABC (1 << 3) /* AC Bias count */ -+#define LCSR_IUL (1 << 4) /* input FIFO underrun Lower panel */ -+#define LCSR_IUU (1 << 5) /* input FIFO underrun Upper panel */ -+#define LCSR_OU (1 << 6) /* output FIFO underrun */ -+#define LCSR_QD (1 << 7) /* quick disable */ -+#define LCSR_EOF (1 << 8) /* end of frame */ -+#define LCSR_BS (1 << 9) /* branch status */ -+#define LCSR_SINT (1 << 10) /* subsequent interrupt */ -+ -+#define LDCMD_PAL (1 << 26) /* instructs DMA to load palette buffer */ -+ -+#define LCSR_LDD (1 << 0) /* LCD Disable Done */ -+#define LCSR_SOF (1 << 1) /* Start of frame */ -+#define LCSR_BER (1 << 2) /* Bus error */ -+#define LCSR_ABC (1 << 3) /* AC Bias count */ -+#define LCSR_IUL (1 << 4) /* input FIFO underrun Lower panel */ -+#define LCSR_IUU (1 << 5) /* input FIFO underrun Upper panel */ -+#define LCSR_OU (1 << 6) /* output FIFO underrun */ -+#define LCSR_QD (1 << 7) /* quick disable */ -+#define LCSR_EOF (1 << 8) /* end of frame */ -+#define LCSR_BS (1 << 9) /* branch status */ -+#define LCSR_SINT (1 << 10) /* subsequent interrupt */ -+ -+#define LDCMD_PAL (1 << 26) /* instructs DMA to load palette buffer */ -+ -+/* -+ * Memory controller -+ */ -+ -+#define MDCNFG __REG(0x48000000) /* SDRAM Configuration Register 0 */ -+#define MDREFR __REG(0x48000004) /* SDRAM Refresh Control Register */ -+#define MSC0 __REG(0x48000008) /* Static Memory Control Register 0 */ -+#define MSC1 __REG(0x4800000C) /* Static Memory Control Register 1 */ -+#define MSC2 __REG(0x48000010) /* Static Memory Control Register 2 */ -+#define MECR __REG(0x48000014) /* Expansion Memory (PCMCIA/Compact Flash) Bus Configuration */ -+#define SXLCR __REG(0x48000018) /* LCR value to be written to SDRAM-Timing Synchronous Flash */ -+#define SXCNFG __REG(0x4800001C) /* Synchronous Static Memory Control Register */ -+#define SXMRS __REG(0x48000024) /* MRS value to be written to Synchronous Flash or SMROM */ -+#define MCMEM0 __REG(0x48000028) /* Card interface Common Memory Space Socket 0 Timing */ -+#define MCMEM1 __REG(0x4800002C) /* Card interface Common Memory Space Socket 1 Timing */ -+#define MCATT0 __REG(0x48000030) /* Card interface Attribute Space Socket 0 Timing Configuration */ -+#define MCATT1 __REG(0x48000034) /* Card interface Attribute Space Socket 1 Timing Configuration */ -+#define MCIO0 __REG(0x48000038) /* Card interface I/O Space Socket 0 Timing Configuration */ -+#define MCIO1 __REG(0x4800003C) /* Card interface I/O Space Socket 1 Timing Configuration */ -+#define MDMRS __REG(0x48000040) /* MRS value to be written to SDRAM */ -+#define BOOT_DEF __REG(0x48000044) /* Read-Only Boot-Time Register. Contains BOOT_SEL and PKG_SEL */ -+ -+#define MDREFR_K2FREE (1 << 25) /* SDRAM Free-Running Control */ -+#define MDREFR_K1FREE (1 << 24) /* SDRAM Free-Running Control */ -+#define MDREFR_K0FREE (1 << 23) /* SDRAM Free-Running Control */ -+#define MDREFR_SLFRSH (1 << 22) /* SDRAM Self-Refresh Control/Status */ -+#define MDREFR_APD (1 << 20) /* SDRAM/SSRAM Auto-Power-Down Enable */ -+#define MDREFR_K2DB2 (1 << 19) /* SDCLK2 Divide by 2 Control/Status */ -+#define MDREFR_K2RUN (1 << 18) /* SDCLK2 Run Control/Status */ -+#define MDREFR_K1DB2 (1 << 17) /* SDCLK1 Divide by 2 Control/Status */ -+#define MDREFR_K1RUN (1 << 16) /* SDCLK1 Run Control/Status */ -+#define MDREFR_E1PIN (1 << 15) /* SDCKE1 Level Control/Status */ -+#define MDREFR_K0DB2 (1 << 14) /* SDCLK0 Divide by 2 Control/Status */ -+#define MDREFR_K0RUN (1 << 13) /* SDCLK0 Run Control/Status */ -+#define MDREFR_E0PIN (1 << 12) /* SDCKE0 Level Control/Status */ -+ -+#endif ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/arch-pxa/serial.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,51 @@ -+/* -+ * linux/include/asm-arm/arch-pxa/serial.h -+ * -+ * Author: Nicolas Pitre -+ * Copyright: (C) 2001 MontaVista Software Inc. -+ * -+ * 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. -+ */ -+ -+ -+#define BAUD_BASE 921600 -+ -+/* Standard COM flags */ -+#define STD_COM_FLAGS (ASYNC_SKIP_TEST) -+ -+#define STD_SERIAL_PORT_DEFNS \ -+ { \ -+ type: PORT_PXA, \ -+ xmit_fifo_size: 32, \ -+ baud_base: BAUD_BASE, \ -+ iomem_base: (void *)&FFUART,\ -+ iomem_reg_shift: 2, \ -+ io_type: SERIAL_IO_MEM32,\ -+ irq: IRQ_FFUART, \ -+ flags: STD_COM_FLAGS, \ -+ }, { \ -+ type: PORT_PXA, \ -+ xmit_fifo_size: 32, \ -+ baud_base: BAUD_BASE, \ -+ iomem_base: (void *)&BTUART,\ -+ iomem_reg_shift: 2, \ -+ io_type: SERIAL_IO_MEM32,\ -+ irq: IRQ_BTUART, \ -+ flags: STD_COM_FLAGS, \ -+ }, { \ -+ type: PORT_PXA, \ -+ xmit_fifo_size: 32, \ -+ baud_base: BAUD_BASE, \ -+ iomem_base: (void *)&STUART,\ -+ iomem_reg_shift: 2, \ -+ io_type: SERIAL_IO_MEM32,\ -+ irq: IRQ_STUART, \ -+ flags: STD_COM_FLAGS, \ -+ } -+ -+#define RS_TABLE_SIZE 8 -+ -+#define EXTRA_SERIAL_PORT_DEFNS -+ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/arch-pxa/system.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,32 @@ -+/* -+ * linux/include/asm-arm/arch-pxa/system.h -+ * -+ * Author: Nicolas Pitre -+ * Created: Jun 15, 2001 -+ * Copyright: MontaVista Software Inc. -+ * -+ * 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 "hardware.h" -+ -+static inline void arch_idle(void) -+{ -+ cpu_do_idle(); -+} -+ -+static inline void arch_reset(char mode) -+{ -+ if (mode == 's') { -+ /* Jump into ROM at address 0 */ -+ cpu_reset(0); -+ } else { -+ /* Initialize the watchdog and let it fire */ -+ OWER = OWER_WME; -+ OSSR = OSSR_M3; -+ OSMR3 = OSCR + 368640; /* ... in 100 ms */ -+ } -+} -+ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/arch-pxa/time.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,86 @@ -+/* -+ * linux/include/asm-arm/arch-pxa/time.h -+ * -+ * Author: Nicolas Pitre -+ * Created: Jun 15, 2001 -+ * Copyright: MontaVista Software Inc. -+ * -+ * 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. -+ */ -+ -+ -+static inline unsigned long pxa_get_rtc_time(void) -+{ -+ return RCNR; -+} -+ -+static int pxa_set_rtc(void) -+{ -+ unsigned long current_time = xtime.tv_sec; -+ -+ if (RTSR & RTSR_ALE) { -+ /* make sure not to forward the clock over an alarm */ -+ unsigned long alarm = RTAR; -+ if (current_time >= alarm && alarm >= RCNR) -+ return -ERESTARTSYS; -+ } -+ RCNR = current_time; -+ return 0; -+} -+ -+/* IRQs are disabled before entering here from do_gettimeofday() */ -+static unsigned long pxa_gettimeoffset (void) -+{ -+ unsigned long ticks_to_match, elapsed, usec; -+ -+ /* Get ticks before next timer match */ -+ ticks_to_match = OSMR0 - OSCR; -+ -+ /* We need elapsed ticks since last match */ -+ elapsed = LATCH - ticks_to_match; -+ -+ /* Now convert them to usec */ -+ usec = (unsigned long)(elapsed*tick)/LATCH; -+ -+ return usec; -+} -+ -+static void pxa_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs) -+{ -+ long flags; -+ int next_match; -+ -+ do_profile(regs); -+ -+ /* Loop until we get ahead of the free running timer. -+ * This ensures an exact clock tick count and time acuracy. -+ * IRQs are disabled inside the loop to ensure coherence between -+ * lost_ticks (updated in do_timer()) and the match reg value, so we -+ * can use do_gettimeofday() from interrupt handlers. -+ */ -+ do { -+ do_leds(); -+ do_set_rtc(); -+ save_flags_cli( flags ); -+ do_timer(regs); -+ OSSR = OSSR_M0; /* Clear match on timer 0 */ -+ next_match = (OSMR0 += LATCH); -+ restore_flags( flags ); -+ } while( (signed long)(next_match - OSCR) <= 0 ); -+} -+ -+extern inline void setup_timer (void) -+{ -+ gettimeoffset = pxa_gettimeoffset; -+ set_rtc = pxa_set_rtc; -+ xtime.tv_sec = pxa_get_rtc_time(); -+ timer_irq.handler = pxa_timer_interrupt; -+ OSMR0 = 0; /* set initial match at 0 */ -+ OSSR = 0xf; /* clear status on all timers */ -+ setup_arm_irq(IRQ_OST0, &timer_irq); -+ OIER |= OIER_E0; /* enable match on timer 0 to cause interrupts */ -+ OSCR = 0; /* initialize free-running timer, force first match */ -+} -+ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/arch-pxa/timex.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,17 @@ -+/* -+ * linux/include/asm-arm/arch-pxa/timex.h -+ * -+ * Author: Nicolas Pitre -+ * Created: Jun 15, 2001 -+ * Copyright: MontaVista Software Inc. -+ * -+ * 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. -+ */ -+ -+/* -+ * PXA250/210 timer -+ */ -+#define CLOCK_TICK_RATE 3686400 -+#define CLOCK_TICK_FACTOR 80 ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/arch-pxa/trizeps2.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,206 @@ -+/* -+ * linux/include/asm-arm/arch-pxa/trizeps2.h -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ * -+ * Copyright (c) 2002 Luc De Cock, Teradyne DS, Ltd. -+ * -+ * 2002-10-10: Initial code started from idp.h -+ */ -+ -+ -+/* -+ * Note: this file must be safe to include in assembly files -+ */ -+ -+/* comment out following if you have a board with 32MB RAM */ -+//#define PXA_TRIZEPS2_64MB 1 -+#undef PXA_TRIZEPS2_64MB -+ -+#define TRIZEPS2_FLASH_PHYS (PXA_CS0_PHYS) -+#define TRIZEPS2_ALT_FLASH_PHYS (PXA_CS1_PHYS) -+#define TRIZEPS2_MEDIAQ_PHYS (PXA_CS3_PHYS) -+#define TRIZEPS2_IDE_PHYS (PXA_CS5_PHYS + 0x03000000) -+#define TRIZEPS2_ETH_PHYS (0x0C800000) -+#define TRIZEPS2_COREVOLT_PHYS (PXA_CS5_PHYS + 0x03800000) -+#define TRIZEPS2_BCR_PHYS (0x0E000000) -+#define TRIZEPS2_CPLD_PHYS (0x0C000000) -+ -+/* -+ * virtual memory map -+ */ -+ -+#define TRIZEPS2_IDE_BASE (0xf0000000) -+#define TRIZEPS2_IDE_SIZE (1*1024*1024) -+ -+#define TRIZEPS2_ETH_BASE (0xf1000000) -+#define TRIZEPS2_ETH_SIZE (1*1024*1024) -+#define ETH_BASE TRIZEPS2_ETH_BASE //smc9194 driver compatibility issue -+ -+#define TRIZEPS2_COREVOLT_BASE (TRIZEPS2_ETH_BASE + TRIZEPS2_ETH_SIZE) -+#define TRIZEPS2_COREVOLT_SIZE (1*1024*1024) -+ -+#define TRIZEPS2_BCR_BASE (0xf0000000) -+#define TRIZEPS2_BCR_SIZE (1*1024*1024) -+ -+#define BCR_P2V(x) ((x) - TRIZEPS2_BCR_PHYS + TRIZEPS2_BCR_BASE) -+#define BCR_V2P(x) ((x) - TRIZEPS2_BCR_BASE + TRIZEPS2_BCR_PHYS) -+ -+#ifndef __ASSEMBLY__ -+# define __BCR_REG(x) (*((volatile unsigned short *)BCR_P2V(x))) -+#else -+# define __BCR_REG(x) BCR_P2V(x) -+#endif -+ -+/* board level registers */ -+#define TRIZEPS2_CPLD_BASE (0xf0100000) -+#define CPLD_P2V(x) ((x) - TRIZEPS2_CPLD_PHYS + TRIZEPS2_CPLD_BASE) -+#define CPLD_V2P(x) ((x) - TRIZEPS2_CPLD_BASE + TRIZEPS2_CPLD_PHYS) -+ -+#ifndef __ASSEMBLY__ -+# define __CPLD_REG(x) (*((volatile unsigned short *)CPLD_P2V(x))) -+#else -+# define __CPLD_REG(x) CPLD_P2V(x) -+#endif -+ -+#define _TRIZEPS2_PCCARD_STATUS (0x0c000000) -+#define TRIZEPS2_PCCARD_STATUS __CPLD_REG(_TRIZEPS2_PCCARD_STATUS) -+ -+/* -+ * CS memory timing via Static Memory Control Register (MSC0-2) -+ */ -+ -+#define MSC_CS(cs,val) ((val)<<((cs&1)<<4)) -+ -+#define MSC_RBUFF_SHIFT 15 -+#define MSC_RBUFF(x) ((x)<<MSC_RBUFF_SHIFT) -+#define MSC_RBUFF_SLOW MSC_RBUFF(0) -+#define MSC_RBUFF_FAST MSC_RBUFF(1) -+ -+#define MSC_RRR_SHIFT 12 -+#define MSC_RRR(x) ((x)<<MSC_RRR_SHIFT) -+ -+#define MSC_RDN_SHIFT 8 -+#define MSC_RDN(x) ((x)<<MSC_RDN_SHIFT) -+ -+#define MSC_RDF_SHIFT 4 -+#define MSC_RDF(x) ((x)<<MSC_RDF_SHIFT) -+ -+#define MSC_RBW_SHIFT 3 -+#define MSC_RBW(x) ((x)<<MSC_RBW_SHIFT) -+#define MSC_RBW_16 MSC_RBW(1) -+#define MSC_RBW_32 MSC_RBW(0) -+ -+#define MSC_RT_SHIFT 0 -+#define MSC_RT(x) ((x)<<MSC_RT_SHIFT) -+ -+ -+/* -+ * Bit masks for various registers -+ */ -+// TRIZEPS2_BCR_PCCARD_PWR -+#define PCC_3V (1 << 0) -+#define PCC_5V (1 << 1) -+#define PCC_EN1 (1 << 2) -+#define PCC_EN0 (1 << 3) -+ -+// TRIZEPS2_BCR_PCCARD_EN -+#define PCC_RESET (1 << 6) -+#define PCC_ENABLE (1 << 0) -+ -+// TRIZEPS2_BSR_PCCARDx_STATUS -+#define _PCC_WRPROT (1 << 7) // 7-4 read as low true -+#define _PCC_RESET (1 << 6) -+#define _PCC_IRQ (1 << 5) -+#define _PCC_INPACK (1 << 4) -+#define PCC_BVD1 (1 << 0) -+#define PCC_BVD2 (1 << 1) -+#define PCC_VS1 (1 << 2) -+#define PCC_VS2 (1 << 3) -+ -+// TRIZEPS2_BCR_CONTROL bits -+#define BCR_LCD_ON (1 << 4) -+#define BCR_LCD_OFF (0) -+#define BCR_LCD_MASK (1 << 4) -+#define BCR_PCMCIA_RESET (1 << 7) -+#define BCR_PCMCIA_NORMAL (0) -+ -+#define PCC_DETECT (GPLR(24) & GPIO_bit(24)) -+#define PCC_READY (GPLR(1) & GPIO_bit(1)) -+ -+// Board Control Register -+#define _TRIZEPS2_BCR_CONTROL (TRIZEPS2_BCR_PHYS) -+#define TRIZEPS2_BCR_CONTROL __BCR_REG(_TRIZEPS2_BCR_CONTROL) -+ -+// Board TTL-IO register -+#define TRIZEPS2_TTLIO_PHYS (0x0d800000) -+#define TRIZEPS2_TTLIO_BASE (0xf2000000) -+// various ioctl cmds -+#define TTLIO_RESET 0 -+#define TTLIO_GET 1 -+#define TTLIO_SET 2 -+#define TTLIO_UNSET 3 -+ -+/* -+ * Macros for LCD Driver -+ */ -+ -+#ifdef CONFIG_FB_PXA -+ -+#define FB_BACKLIGHT_ON() -+#define FB_BACKLIGHT_OFF() -+ -+#define FB_PWR_ON() -+#define FB_PWR_OFF() -+ -+#define FB_VLCD_ON() WRITE_TRIZEPS2_BCR(BCR_LCD_ON,BCR_LCD_MASK); -+#define FB_VLCD_OFF() WRITE_TRIZEPS2_BCR(BCR_LCD_OFF,BCR_LCD_MASK); -+ -+#endif -+ -+/* A listing of interrupts used by external hardware devices */ -+ -+#define GPIO_TOUCH_PANEL_IRQ 2 -+#define TOUCH_PANEL_IRQ IRQ_GPIO(GPIO_TOUCH_PANEL_IRQ) -+#define GPIO_ETHERNET_IRQ 19 -+#define ETHERNET_IRQ IRQ_GPIO(GPIO_ETHERNET_IRQ) -+#define GPIO_TTLIO_IRQ 23 -+#define TTLIO_IRQ IRQ_GPIO(GPIO_TTLIO_IRQ) -+ -+#define TOUCH_PANEL_IRQ_EDGE GPIO_FALLING_EDGE -+#define IDE_IRQ_EDGE GPIO_RISING_EDGE -+#define ETHERNET_IRQ_EDGE GPIO_RISING_EDGE -+ -+#define PCMCIA_S_CD_VALID IRQ_GPIO(24) -+#define PCMCIA_S_CD_VALID_EDGE GPIO_BOTH_EDGES -+ -+#define PCMCIA_S_RDYINT IRQ_GPIO(1) -+#define PCMCIA_S_RDYINT_EDGE GPIO_FALLING_EDGE -+ -+/* -+ * macros for MTD driver -+ */ -+ -+#define FLASH_WRITE_PROTECT_DISABLE() // ((TRIZEPS2_CPLD_FLASH_WE) &= ~(0x1)) -+#define FLASH_WRITE_PROTECT_ENABLE() // ((TRIZEPS2_CPLD_FLASH_WE) |= (0x1)) -+ -+/* shadow registers for write only registers */ -+#ifndef __ASSEMBLY__ -+extern unsigned short trizeps2_bcr_shadow; -+#endif -+ -+/* -+ * macros to write to write only register -+ * -+ * none of these macros are protected from -+ * multiple drivers using them in interrupt context. -+ */ -+ -+#define WRITE_TRIZEPS2_BCR(value, mask) \ -+{\ -+ trizeps2_bcr_shadow = ((value & mask) | (trizeps2_bcr_shadow & ~mask));\ -+ TRIZEPS2_BCR_CONTROL = trizeps2_bcr_shadow;\ -+} -+ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/arch-pxa/uncompress.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,42 @@ -+/* -+ * linux/include/asm-arm/arch-pxa/uncompress.h -+ * -+ * Author: Nicolas Pitre -+ * Copyright: (C) 2001 MontaVista Software Inc. -+ * -+ * 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. -+ */ -+ -+#define FFUART ((volatile unsigned long *)0x40100000) -+#define BTUART ((volatile unsigned long *)0x40200000) -+#define STUART ((volatile unsigned long *)0x40700000) -+ -+#define UART FFUART -+ -+ -+static __inline__ void putc(char c) -+{ -+ while (!(UART[5] & 0x20)); -+ UART[0] = c; -+} -+ -+/* -+ * This does not append a newline -+ */ -+static void puts(const char *s) -+{ -+ while (*s) { -+ putc(*s); -+ if (*s == '\n') -+ putc('\r'); -+ s++; -+ } -+} -+ -+/* -+ * nothing to do -+ */ -+#define arch_decomp_setup() -+#define arch_decomp_wdog() ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/arch-pxa/vmalloc.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,23 @@ -+/* -+ * linux/include/asm-arm/arch-pxa/vmalloc.h -+ * -+ * Author: Nicolas Pitre -+ * Copyright: (C) 2001 MontaVista Software Inc. -+ * -+ * 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. -+ */ -+ -+/* -+ * Just any arbitrary offset to the start of the vmalloc VM area: the -+ * current 8MB value just means that there will be a 8MB "hole" after the -+ * physical memory until the kernel virtual memory starts. That means that -+ * any out-of-bounds memory accesses will hopefully be caught. -+ * The vmalloc() routines leaves a hole of 4kB between each vmalloced -+ * area for the same reason. ;) -+ */ -+#define VMALLOC_OFFSET (8*1024*1024) -+#define VMALLOC_START (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1)) -+#define VMALLOC_VMADDR(x) ((unsigned long)(x)) -+#define VMALLOC_END (0xe8000000) ---- linux-2.4.25/include/asm-arm/assembler.h~2.4.25-vrs2-pxa1.patch 2000-08-13 18:54:15.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/assembler.h 2004-03-31 17:15:12.000000000 +0200 -@@ -13,3 +13,26 @@ - - #include <asm/proc/ptrace.h> - #include <asm/proc/assembler.h> -+ -+/* -+ * Endian independent macros for shifting bytes within registers. -+ */ -+#ifndef __ARMEB__ -+#define pull lsr -+#define push lsl -+#define byte(x) (x*8) -+#else -+#define pull lsl -+#define push lsr -+#define byte(x) ((3-x)*8) -+#endif -+ -+/* -+ * Data preload for architectures that support it -+ */ -+#if __LINUX_ARM_ARCH__ >= 5 -+#define PLD(code...) code -+#else -+#define PLD(code...) -+#endif -+ ---- linux-2.4.25/include/asm-arm/bitops.h~2.4.25-vrs2-pxa1.patch 2003-08-25 13:44:43.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/bitops.h 2004-03-31 17:15:12.000000000 +0200 -@@ -91,6 +91,8 @@ - return (((unsigned char *) addr)[nr >> 3] >> (nr & 7)) & 1; - } - -+#if __LINUX_ARM_ARCH__ < 5 -+ - /* - * ffz = Find First Zero in word. Undefined if no zero exists, - * so code should check against ~0UL first.. -@@ -117,6 +119,23 @@ - - #define ffs(x) generic_ffs(x) - -+#else -+ -+/* -+ * On ARMv5 and above those functions can be implemented around -+ * the clz instruction for much better code efficiency. -+ */ -+ -+extern __inline__ int generic_fls(int x); -+#define fls(x) \ -+ ( __builtin_constant_p(x) ? generic_fls(x) : \ -+ ({ int __r; asm("clz%?\t%0, %1" : "=r"(__r) : "r"(x)); 32-__r; }) ) -+#define ffs(x) ({ unsigned long __t = (x); fls(__t & -__t); }) -+#define __ffs(x) (ffs(x) - 1) -+#define ffz(x) __ffs( ~(x) ) -+ -+#endif -+ - /* - * hweightN: returns the hamming weight (i.e. the number - * of bits set) of a N-bit word ---- linux-2.4.25/include/asm-arm/io.h~2.4.25-vrs2-pxa1.patch 2003-08-25 13:44:43.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/io.h 2004-03-31 17:15:12.000000000 +0200 -@@ -168,7 +168,7 @@ - * devices. This is the "generic" version. The PCI specific version - * is in pci.h - */ --extern void *consistent_alloc(int gfp, size_t size, dma_addr_t *handle); -+extern void *consistent_alloc(int gfp, size_t size, dma_addr_t *handle, unsigned long flags); - extern void consistent_free(void *vaddr, size_t size, dma_addr_t handle); - extern void consistent_sync(void *vaddr, size_t size, int rw); - ---- linux-2.4.25/include/asm-arm/memory.h~2.4.25-vrs2-pxa1.patch 2003-08-25 13:44:43.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/memory.h 2004-03-31 17:15:12.000000000 +0200 -@@ -123,6 +123,9 @@ - ((unsigned)((page) - NODE_MEM_MAP(node)) < NODE_DATA(node)->node_size)); \ - }) - -+/* We want large page mapping possible */ -+#define VMALLOC_ALIGN 0x10000 -+ - #endif - - /* ---- linux-2.4.25/include/asm-arm/proc-armv/pgtable.h~2.4.25-vrs2-pxa1.patch 2001-08-12 20:14:00.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/proc-armv/pgtable.h 2004-03-31 17:15:12.000000000 +0200 -@@ -15,9 +15,6 @@ - #ifndef __ASM_PROC_PGTABLE_H - #define __ASM_PROC_PGTABLE_H - --#include <asm/proc/domain.h> --#include <asm/arch/vmalloc.h> -- - /* - * entries per page directory level: they are two-level, so - * we don't really have any PMD directory. -@@ -26,27 +23,92 @@ - #define PTRS_PER_PMD 1 - #define PTRS_PER_PGD 4096 - --/**************** --* PMD functions * --****************/ -- --/* PMD types (actually level 1 descriptor) */ --#define PMD_TYPE_MASK 0x0003 --#define PMD_TYPE_FAULT 0x0000 --#define PMD_TYPE_TABLE 0x0001 --#define PMD_TYPE_SECT 0x0002 --#define PMD_UPDATABLE 0x0010 --#define PMD_SECT_CACHEABLE 0x0008 --#define PMD_SECT_BUFFERABLE 0x0004 --#define PMD_SECT_AP_WRITE 0x0400 --#define PMD_SECT_AP_READ 0x0800 -+/* -+ * Hardware page table definitions. -+ * -+ * + Level 1 descriptor (PMD) -+ * - common -+ */ -+#define PMD_TYPE_MASK (3 << 0) -+#define PMD_TYPE_FAULT (0 << 0) -+#define PMD_TYPE_TABLE (1 << 0) -+#define PMD_TYPE_SECT (2 << 0) -+#define PMD_UPDATABLE (1 << 4) - #define PMD_DOMAIN(x) ((x) << 5) -+#define PMD_PROTECTION (1 << 9) /* v5 */ -+/* -+ * - section -+ */ -+#define PMD_SECT_BUFFERABLE (1 << 2) -+#define PMD_SECT_CACHEABLE (1 << 3) -+#define PMD_SECT_AP_WRITE (1 << 10) -+#define PMD_SECT_AP_READ (1 << 11) -+#define PMD_SECT_TEX(x) ((x) << 12) /* v5 */ -+/* -+ * - coarse table -+ */ -+ -+/* -+ * + Level 2 descriptor (PTE) -+ * - common -+ */ -+#define PTE_TYPE_MASK (3 << 0) -+#define PTE_TYPE_FAULT (0 << 0) -+#define PTE_TYPE_LARGE (1 << 0) -+#define PTE_TYPE_SMALL (2 << 0) -+#define PTE_TYPE_EXT (3 << 0) /* v5 */ -+#define PTE_BUFFERABLE (1 << 2) -+#define PTE_CACHEABLE (1 << 3) -+ -+/* -+ * - extended small page/tiny page -+ */ -+#define PTE_EXT_AP_UNO_SRO (0 << 4) -+#define PTE_EXT_AP_UNO_SRW (1 << 4) -+#define PTE_EXT_AP_URO_SRW (2 << 4) -+#define PTE_EXT_AP_URW_SRW (3 << 4) -+#define PTE_EXT_TEX(x) ((x) << 6) /* v5 */ -+ -+/* -+ * - small page -+ */ -+#define PTE_SMALL_AP_UNO_SRO (0x00 << 4) -+#define PTE_SMALL_AP_UNO_SRW (0x55 << 4) -+#define PTE_SMALL_AP_URO_SRW (0xaa << 4) -+#define PTE_SMALL_AP_URW_SRW (0xff << 4) -+#define PTE_AP_READ PTE_SMALL_AP_URO_SRW -+#define PTE_AP_WRITE PTE_SMALL_AP_UNO_SRW -+ -+/* -+ * "Linux" PTE definitions. -+ * -+ * We keep two sets of PTEs - the hardware and the linux version. -+ * This allows greater flexibility in the way we map the Linux bits -+ * onto the hardware tables, and allows us to have YOUNG and DIRTY -+ * bits. -+ * -+ * The PTE table pointer refers to the hardware entries; the "Linux" -+ * entries are stored 1024 bytes below. -+ */ -+#define L_PTE_PRESENT (1 << 0) -+#define L_PTE_YOUNG (1 << 1) -+#define L_PTE_BUFFERABLE (1 << 2) /* matches PTE */ -+#define L_PTE_CACHEABLE (1 << 3) /* matches PTE */ -+#define L_PTE_USER (1 << 4) -+#define L_PTE_WRITE (1 << 5) -+#define L_PTE_EXEC (1 << 6) -+#define L_PTE_DIRTY (1 << 7) -+ -+#ifndef __ASSEMBLY__ -+ -+#include <asm/proc/domain.h> -+#include <asm/arch/vmalloc.h> - - #define _PAGE_USER_TABLE (PMD_TYPE_TABLE | PMD_DOMAIN(DOMAIN_USER)) - #define _PAGE_KERNEL_TABLE (PMD_TYPE_TABLE | PMD_DOMAIN(DOMAIN_KERNEL)) - - #define pmd_bad(pmd) (pmd_val(pmd) & 2) --#define set_pmd(pmdp,pmd) cpu_set_pmd(pmdp,pmd) -+#define set_pmd(pmdp,pmd) cpu_set_pmd(pmdp, pmd) - - static inline pmd_t __mk_pmd(pte_t *ptep, unsigned long prot) - { -@@ -75,49 +137,8 @@ - return __phys_to_virt(ptr); - } - --/**************** --* PTE functions * --****************/ -- --/* PTE types (actually level 2 descriptor) */ --#define PTE_TYPE_MASK 0x0003 --#define PTE_TYPE_FAULT 0x0000 --#define PTE_TYPE_LARGE 0x0001 --#define PTE_TYPE_SMALL 0x0002 --#define PTE_AP_READ 0x0aa0 --#define PTE_AP_WRITE 0x0550 --#define PTE_CACHEABLE 0x0008 --#define PTE_BUFFERABLE 0x0004 -- - #define set_pte(ptep, pte) cpu_set_pte(ptep,pte) - --/* We now keep two sets of ptes - the physical and the linux version. -- * This gives us many advantages, and allows us greater flexibility. -- * -- * The Linux pte's contain: -- * bit meaning -- * 0 page present -- * 1 young -- * 2 bufferable - matches physical pte -- * 3 cacheable - matches physical pte -- * 4 user -- * 5 write -- * 6 execute -- * 7 dirty -- * 8-11 unused -- * 12-31 virtual page address -- * -- * These are stored at the pte pointer; the physical PTE is at -1024bytes -- */ --#define L_PTE_PRESENT (1 << 0) --#define L_PTE_YOUNG (1 << 1) --#define L_PTE_BUFFERABLE (1 << 2) --#define L_PTE_CACHEABLE (1 << 3) --#define L_PTE_USER (1 << 4) --#define L_PTE_WRITE (1 << 5) --#define L_PTE_EXEC (1 << 6) --#define L_PTE_DIRTY (1 << 7) -- - /* - * The following macros handle the cache and bufferable bits... - */ -@@ -162,5 +183,8 @@ - * Mark the prot value as uncacheable and unbufferable. - */ - #define pgprot_noncached(prot) __pgprot(pgprot_val(prot) & ~(L_PTE_CACHEABLE | L_PTE_BUFFERABLE)) -+#define pgprot_writecombine(prot) __pgprot(pgprot_val(prot) & ~L_PTE_CACHEABLE) -+ -+#endif /* __ASSEMBLY__ */ - - #endif /* __ASM_PROC_PGTABLE_H */ ---- linux-2.4.25/include/asm-arm/proc-armv/processor.h~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/proc-armv/processor.h 2004-03-31 17:15:12.000000000 +0200 -@@ -23,6 +23,9 @@ - #define KERNEL_STACK_SIZE PAGE_SIZE - - struct context_save_struct { -+#ifdef CONFIG_CPU_XSCALE -+ long long acc0; -+#endif - unsigned long cpsr; - unsigned long r4; - unsigned long r5; -@@ -35,7 +38,11 @@ - unsigned long pc; - }; - -+#ifdef CONFIG_CPU_XSCALE -+#define INIT_CSS (struct context_save_struct){ 0, SVC_MODE, 0, 0, 0, 0, 0, 0, 0, 0, 0 } -+#else - #define INIT_CSS (struct context_save_struct){ SVC_MODE, 0, 0, 0, 0, 0, 0, 0, 0, 0 } -+#endif - - #define EXTRA_THREAD_STRUCT \ - unsigned int domain; ---- linux-2.4.25/include/asm-arm/proc-fns.h~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/proc-fns.h 2004-03-31 17:15:12.000000000 +0200 -@@ -124,6 +124,14 @@ - # define CPU_NAME sa1100 - # endif - # endif -+# ifdef CONFIG_CPU_XSCALE -+# ifdef CPU_NAME -+# undef MULTI_CPU -+# define MULTI_CPU -+# else -+# define CPU_NAME xscale -+# endif -+# endif - #endif - - #ifndef MULTI_CPU ---- linux-2.4.25/include/asm-arm/procinfo.h~2.4.25-vrs2-pxa1.patch 2003-08-25 13:44:43.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/procinfo.h 2004-03-31 17:15:12.000000000 +0200 -@@ -55,7 +55,8 @@ - #define HWCAP_FAST_MULT 16 - #define HWCAP_FPA 32 - #define HWCAP_VFP 64 --#define HWCAP_EDSP 128 -+#define HWCAP_EDSP 128 /* El Segundo */ - #define HWCAP_JAVA 256 -+#define HWCAP_XSCALE 512 /* XScale DSP co-processor */ - - #endif ---- linux-2.4.25/include/asm-arm/uaccess.h~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/include/asm-arm/uaccess.h 2004-03-31 17:15:12.000000000 +0200 -@@ -86,7 +86,7 @@ - __get_user_x(__r1, __p, __e, 1, "lr"); \ - break; \ - case 2: \ -- __get_user_x(__r1, __p, __e, 2, "r2", "lr"); \ -+ __get_user_x(__r1, __p, __e, 2, "ip", "lr"); \ - break; \ - case 4: \ - __get_user_x(__r1, __p, __e, 4, "lr"); \ ---- linux-2.4.25/include/linux/cramfs_fs_sb.h~2.4.25-vrs2-pxa1.patch 2001-07-20 01:14:53.000000000 +0200 -+++ linux-2.4.25/include/linux/cramfs_fs_sb.h 2004-03-31 17:15:12.000000000 +0200 -@@ -10,6 +10,10 @@ - unsigned long blocks; - unsigned long files; - unsigned long flags; -+#ifdef CONFIG_CRAMFS_LINEAR -+ unsigned long linear_phys_addr; -+ char * linear_virt_addr; -+#endif - }; - - #endif ---- linux-2.4.25/include/linux/i2c-id.h~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/include/linux/i2c-id.h 2004-03-31 17:15:12.000000000 +0200 -@@ -100,6 +100,10 @@ - #define I2C_DRIVERID_SAA7191 57 /* video decoder */ - #define I2C_DRIVERID_INDYCAM 58 /* SGI IndyCam */ - -+#define I2C_DRIVERID_DS1307 46 /* real time clock: DS1307 */ -+#define I2C_DRIVERID_24LC64 47 /* EEprom 24LC64 */ -+#define I2C_DRIVERID_FM24CLB4 48 /* EEprom FM24CLB4 */ -+ - #define I2C_DRIVERID_EXP0 0xF0 /* experimental use id's */ - #define I2C_DRIVERID_EXP1 0xF1 - #define I2C_DRIVERID_EXP2 0xF2 -@@ -172,6 +176,8 @@ - - #define I2C_ALGO_OCP 0x120000 /* IBM or otherwise On-chip I2C algorithm */ - -+#define I2C_ALGO_PXA 0x400000 /* Intel PXA I2C algorithm */ -+ - #define I2C_ALGO_EXP 0x800000 /* experimental */ - - #define I2C_ALGO_MASK 0xff0000 /* Mask for algorithms */ ---- linux-2.4.25/include/linux/serial.h~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/include/linux/serial.h 2004-03-31 17:15:12.000000000 +0200 -@@ -75,11 +75,13 @@ - #define PORT_16654 11 - #define PORT_16850 12 - #define PORT_RSA 13 /* RSA-DV II/S card */ --#define PORT_MAX 13 -+#define PORT_PXA 14 -+#define PORT_MAX 14 - - #define SERIAL_IO_PORT 0 - #define SERIAL_IO_HUB6 1 - #define SERIAL_IO_MEM 2 -+#define SERIAL_IO_MEM32 3 - - struct serial_uart_config { - char *name; ---- linux-2.4.25/include/linux/serial_reg.h~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/include/linux/serial_reg.h 2004-03-31 17:15:12.000000000 +0200 -@@ -119,6 +119,14 @@ - #define UART_IERX_SLEEP 0x10 /* Enable sleep mode */ - - /* -+ * The Intel PXA250/210 chip defines those bits -+ */ -+#define UART_IER_DMAE 0x80 /* DMA Requests Enable */ -+#define UART_IER_UUE 0x40 /* UART Unit Enable */ -+#define UART_IER_NRZE 0x20 /* NRZ coding Enable */ -+#define UART_IER_RTOIE 0x10 /* Receiver Time Out Interrupt Enable */ -+ -+/* - * These are the definitions for the Modem Control Register - */ - #define UART_MCR_AFE 0x20 /* Enable auto-RTS/CTS (TI16C750) */ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/include/mmc/ioctl.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,25 @@ -+/* -+ * linux/include/linux/mmc/ioctl.h -+ * -+ * Author: Vladimir Shebordaev -+ * Copyright: MontaVista Software Inc. -+ * -+ * $Id$ -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ */ -+#ifndef __MMC_IOCTL_H__ -+#define __MMC_IOCTL_H__ -+ -+#include <asm/ioctl.h> -+ -+/* IOCTL commands provided by MMC subsystem */ -+#define IOCMMCSTRNSMODE _IOW('I',0x0f01,int) -+#define IOCMMCGTRNSMODE _IOR('I',0x0f02,int) -+#define IOCMMCGCARDESC _IOR('I',0x0f03,int) /* FIXME */ -+#define IOCMMCGBLKSZMAX _IOR('I',0x0f04,ssize_t) -+#define IOCMMCGNOBMAX _IOR('I',0x0f05,ssize_t) -+ -+#endif /* __MMC_IOCTL_H__ */ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/include/mmc/mmc.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,143 @@ -+/* -+ * linux/include/linux/mmc/mmc.h -+ * -+ * Author: Vladimir Shebordaev -+ * Copyright: MontaVista Software Inc. -+ * -+ * $Id$ -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ */ -+#ifndef __MMC_H__ -+#define __MMC_H__ -+ -+#include <linux/types.h> -+#include <mmc/types.h> -+ -+/* -+ * MMC card type -+ */ -+enum _mmc_type { -+ MMC_CARD_TYPE_RO = 1, -+ MMC_CARD_TYPE_RW, -+ MMC_CARD_TYPE_IO -+}; -+ -+/* -+ * MMC card state -+ */ -+enum _mmc_state { -+ MMC_CARD_STATE_IDLE = 1, -+ MMC_CARD_STATE_READY, -+ MMC_CARD_STATE_IDENT, -+ MMC_CARD_STATE_STNBY, -+ MMC_CARD_STATE_TRAN, -+ MMC_CARD_STATE_DATA, -+ MMC_CARD_STATE_RCV, -+ MMC_CARD_STATE_DIS, -+ MMC_CARD_STATE_UNPLUGGED=0xff -+}; -+ -+/* -+ * Data transfer mode -+ */ -+enum _mmc_transfer_mode { -+ MMC_TRANSFER_MODE_STREAM = 1, -+ MMC_TRANSFER_MODE_BLOCK_SINGLE, -+ MMC_TRANSFER_MODE_BLOCK_MULTIPLE, -+ MMC_TRANSFER_MODE_UNDEFINED = -1 -+}; -+ -+struct _mmc_card_csd_rec { /* CSD register contents */ -+/* FIXME: BYTE_ORDER */ -+ u8 ecc:2, -+ file_format:2, -+ tmp_write_protect:1, -+ perm_write_protect:1, -+ copy:1, -+ file_format_grp:1; -+ u64 content_prot_app:1, -+ rsvd3:4, -+ write_bl_partial:1, -+ write_bl_len:4, -+ r2w_factor:3, -+ default_ecc:2, -+ wp_grp_enable:1, -+ wp_grp_size:5, -+ erase_grp_mult:5, -+ erase_grp_size:5, -+ c_size_mult:3, -+ vdd_w_curr_max:3, -+ vdd_w_curr_min:3, -+ vdd_r_curr_max:3, -+ vdd_r_curr_min:3, -+ c_size:12, -+ rsvd2:2, -+ dsr_imp:1, -+ read_blk_misalign:1, -+ write_blk_misalign:1, -+ read_bl_partial:1; -+ -+ u16 read_bl_len:4, -+ ccc:12; -+ u8 tran_speed; -+ u8 nsac; -+ u8 taac; -+ u8 rsvd1:2, -+ spec_vers:4, -+ csd_structure:2; -+}; -+ -+struct _mmc_card_cid_rec { /* CID register contents */ -+/* FIXME: BYTE_ORDER */ -+ u8 mdt_year:4, -+ mdt_mon:4; -+ u32 psn; -+ u8 prv_minor:4, -+ prv_major:4; -+ u8 pnm[6]; -+ u16 oid; -+ u8 mid; -+}; -+ -+/* -+ * Public card description -+ */ -+struct _mmc_card_info_rec { -+ mmc_type_t type; -+ mmc_transfer_mode_t transfer_mode; /* current data transfer mode */ -+ __u16 rca; /* card's RCA assigned during initialization */ -+ struct _mmc_card_csd_rec csd; -+ struct _mmc_card_cid_rec cid; -+ __u32 tran_speed; /* kbits */ -+ __u16 read_bl_len; -+ __u16 write_bl_len; -+ size_t capacity; /* card's capacity in bytes */ -+}; -+ -+/* -+ * Micsellaneous defines -+ */ -+#ifndef SEEK_SET -+#define SEEK_SET (0) -+#endif -+ -+#ifndef SEEK_CUR -+#define SEEK_CUR (1) -+#endif -+ -+#ifndef SEEK_END -+#define SEEK_END (2) -+#endif -+ -+#ifndef TRUE -+#define TRUE (1) -+#endif -+ -+#ifndef FALSE -+#define FALSE (0) -+#endif -+ -+#endif /* __MMC_H__ */ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/include/mmc/types.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,29 @@ -+/* -+ * linux/include/linux/mmc/types.h -+ * -+ * Author: Vladimir Shebordaev -+ * Copyright: MontaVista Software Inc. -+ * -+ * $Id$ -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License version 2 as -+ * published by the Free Software Foundation. -+ */ -+#ifndef __MMC_TYPES_H__ -+#define __MMC_TYPES_H__ -+ -+/* MMC card */ -+typedef enum _mmc_type mmc_type_t; -+typedef enum _mmc_state mmc_state_t; -+typedef enum _mmc_transfer_mode mmc_transfer_mode_t; -+ -+typedef struct _mmc_card_csd_rec mmc_card_csd_rec_t; -+typedef struct _mmc_card_cid_rec mmc_card_cid_rec_t; -+ -+typedef struct _mmc_card_info_rec mmc_card_info_rec_t; -+typedef struct _mmc_card_info_rec *mmc_card_info_t; -+ -+typedef enum _mmc_error mmc_error_t; -+ -+#endif /* __MMC_TYPES_H__ */ ---- /dev/null 2003-09-23 19:59:22.000000000 +0200 -+++ linux-2.4.25/include/video/lcdctrl.h 2004-03-31 17:15:12.000000000 +0200 -@@ -0,0 +1,61 @@ -+/* -+ * lcdctrl.h -+ * -+ * Generic LCD control for brightness, contrast, etc. -+ * Device specific drivers implement a lcdctrl_device and -+ * provides access to it via lcdctrl_device_get_ops(). -+ * -+ * Copyright (C) 2002 Intrinsyc Software Inc. -+ * -+ * 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. -+ * -+ * History: -+ * Mar 2002: Initial version [FB] -+ * -+ */ -+#ifndef __LCD_CONTROL_H -+#define __LCD_CONTROL_H -+ -+#define _LCDCTRL_IOCTL_ON 1 -+#define _LCDCTRL_IOCTL_OFF 2 -+#define _LCDCTRL_IOCTL_INTENSITY 3 -+#define _LCDCTRL_IOCTL_BRIGHTNESS 4 -+#define _LCDCTRL_IOCTL_CONTRAST 5 -+#define _LCDCTRL_IOCTL_GET_BRIGHTNESS 6 -+#define _LCDCTRL_IOCTL_GET_CONTRAST 7 -+#define _LCDCTRL_IOCTL_GET_INTENSITY 8 -+ -+#define _LCD_CONTROL_NAME "lcdctrl" -+ -+#define LCD_NO_SYNC 0 -+#define LCD_SYNC_NEEDED 1 -+ -+int lcdctrl_enable( void); -+int lcdctrl_disable( void); -+ -+/* intensity, contrast, and brightness take values -+ * between 0..100. -+ */ -+int lcdctrl_set_intensity( int intensity); -+int lcdctrl_set_contrast( int contrast, int sync); -+int lcdctrl_set_brightness( int brightness); -+ -+int lcdctrl_get_intensity( void); -+int lcdctrl_get_contrast( void); -+int lcdctrl_get_brightness( void); -+ -+struct lcdctrl_device -+{ -+ int (*init)( int*, int*, int*); -+ int (*enable)(void); -+ int (*disable)(void); -+ int (*set_intensity)( int i); -+ int (*set_brightness)( int b); -+ int (*set_contrast)( int c, int sync); -+}; -+ -+int lcdctrl_init( void); -+ -+#endif ---- linux-2.4.25/init/do_mounts.c~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/init/do_mounts.c 2004-03-31 17:15:12.000000000 +0200 -@@ -394,6 +394,16 @@ - } - #endif - -+#ifdef CONFIG_ROOT_CRAMFS_LINEAR -+static int __init mount_linear_cramfs_root(void) -+{ -+ void *data = root_mount_data; -+ if (sys_mount("/dev/root","/root","cramfs",root_mountflags,data) == 0) -+ return 1; -+ return 0; -+} -+#endif -+ - static int __init create_dev(char *name, kdev_t dev, char *devfs_name) - { - void *handle; -@@ -759,6 +769,16 @@ - - static void __init mount_root(void) - { -+#ifdef CONFIG_ROOT_CRAMFS_LINEAR -+ if (ROOT_DEV == MKDEV(0, 0)) { -+ if (mount_linear_cramfs_root()) { -+ sys_chdir("/root"); -+ ROOT_DEV = current->fs->pwdmnt->mnt_sb->s_dev; -+ printk("VFS: Mounted root (linear cramfs filesystem).\n"); -+ return; -+ } -+ } -+#endif - #ifdef CONFIG_ROOT_NFS - if (MAJOR(ROOT_DEV) == NFS_MAJOR - && MINOR(ROOT_DEV) == NFS_MINOR) { ---- linux-2.4.25/mm/memory.c~2.4.25-vrs2-pxa1.patch 2004-03-31 17:15:09.000000000 +0200 -+++ linux-2.4.25/mm/memory.c 2004-03-31 17:15:12.000000000 +0200 -@@ -1018,6 +1018,41 @@ - return 1; /* Minor fault */ - - bad_wp_page: -+ if (pte_present(pte) && pte_read(pte)) { -+ /* -+ * Handle COW of XIP memory. -+ * Note that the source memory actually isn't a ram page so -+ * no struct page is associated to the source pte. -+ */ -+ char *dst; -+ int ret; -+ -+ spin_unlock(&mm->page_table_lock); -+ new_page = alloc_page(GFP_HIGHUSER); -+ if (!new_page) -+ return -1; -+ -+ /* copy XIP data to memory */ -+ dst = kmap_atomic(new_page, KM_USER0); -+ ret = copy_from_user(dst, (void*)address, PAGE_SIZE); -+ kunmap_atomic(dst, KM_USER0); -+ -+ /* make sure pte didn't change while we dropped the lock */ -+ spin_lock(&mm->page_table_lock); -+ if (!ret && pte_same(*page_table, pte)) { -+ ++mm->rss; -+ break_cow(vma, new_page, address, page_table); -+ lru_cache_add(new_page); -+ spin_unlock(&mm->page_table_lock); -+ return 1; /* Minor fault */ -+ } -+ -+ /* pte changed: back off */ -+ spin_unlock(&mm->page_table_lock); -+ page_cache_release(new_page); -+ return ret ? -1 : 1; -+ } -+ - spin_unlock(&mm->page_table_lock); - printk("do_wp_page: bogus page at address %08lx\n", address); - return -1; |