Merge branches 'metronomefb', 'pxa-cm2xx', 'pxa-gumstix', 'pxa-misc', 'pxa-mitac...
Russell King [Tue, 7 Oct 2008 18:06:22 +0000 (19:06 +0100)]
Conflicts:

arch/arm/mach-pxa/poodle.c

45 files changed:
MAINTAINERS
arch/arm/configs/cm_x300_defconfig [copied from arch/arm/configs/xm_x270_defconfig with 68% similarity]
arch/arm/configs/xm_x2xx_defconfig [moved from arch/arm/configs/xm_x270_defconfig with 91% similarity]
arch/arm/mach-pxa/Kconfig
arch/arm/mach-pxa/Makefile
arch/arm/mach-pxa/am200epd.c [new file with mode: 0644]
arch/arm/mach-pxa/cm-x255.c [new file with mode: 0644]
arch/arm/mach-pxa/cm-x270-pci.h [deleted file]
arch/arm/mach-pxa/cm-x270.c
arch/arm/mach-pxa/cm-x2xx-pci.c [moved from arch/arm/mach-pxa/cm-x270-pci.c with 77% similarity]
arch/arm/mach-pxa/cm-x2xx-pci.h [new file with mode: 0644]
arch/arm/mach-pxa/cm-x2xx.c [new file with mode: 0644]
arch/arm/mach-pxa/cm-x300.c [new file with mode: 0644]
arch/arm/mach-pxa/colibri.c
arch/arm/mach-pxa/generic.h
arch/arm/mach-pxa/gumstix.c
arch/arm/mach-pxa/idp.c
arch/arm/mach-pxa/include/mach/memory.h
arch/arm/mach-pxa/include/mach/mfp-pxa25x.h
arch/arm/mach-pxa/include/mach/mfp-pxa320.h
arch/arm/mach-pxa/include/mach/mfp.h
arch/arm/mach-pxa/include/mach/mioa701.h [new file with mode: 0644]
arch/arm/mach-pxa/lpd270.c
arch/arm/mach-pxa/lubbock.c
arch/arm/mach-pxa/magician.c
arch/arm/mach-pxa/mfp-pxa2xx.c
arch/arm/mach-pxa/mioa701.c [new file with mode: 0644]
arch/arm/mach-pxa/mioa701_bootresume.S [new file with mode: 0644]
arch/arm/mach-pxa/mp900.c [new file with mode: 0644]
arch/arm/mach-pxa/pcm027.c
arch/arm/mach-pxa/poodle.c
arch/arm/mach-pxa/pxa25x.c
arch/arm/mach-pxa/pxa27x.c
arch/arm/mach-pxa/zylonite_pxa300.c
arch/arm/mach-pxa/zylonite_pxa320.c
drivers/mtd/nand/cmx270_nand.c
drivers/pcmcia/Makefile
drivers/pcmcia/pxa2xx_cm_x255.c [new file with mode: 0644]
drivers/pcmcia/pxa2xx_cm_x270.c
drivers/pcmcia/pxa2xx_cm_x2xx.c [new file with mode: 0644]
drivers/video/Kconfig
drivers/video/Makefile
drivers/video/am200epd.c [deleted file]
drivers/video/metronomefb.c
include/video/metronomefb.h

index 186be3b..d02ee7b 100644 (file)
@@ -491,7 +491,7 @@ M:  kernel@wantstofly.org
 L:     linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
 S:     Maintained
 
-ARM/COMPULAB CM-X270/EM-X270 MACHINE SUPPORT
+ARM/COMPULAB CM-X270/EM-X270 and CM-X300 MACHINE SUPPORT
 P:     Mike Rapoport
 M:     mike@compulab.co.il
 L:     linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
similarity index 68%
copy from arch/arm/configs/xm_x270_defconfig
copy to arch/arm/configs/cm_x300_defconfig
index aa40d91..46f1c9d 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.25
-# Sun May 11 15:12:52 2008
+# Linux kernel version: 2.6.27-rc3
+# Tue Aug 19 11:26:54 2008
 #
 CONFIG_ARM=y
 CONFIG_SYS_SUPPORTS_APM_EMULATION=y
@@ -12,6 +12,7 @@ CONFIG_MMU=y
 # CONFIG_NO_IOPORT is not set
 CONFIG_GENERIC_HARDIRQS=y
 CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_HAVE_LATENCYTOP_SUPPORT=y
 CONFIG_LOCKDEP_SUPPORT=y
 CONFIG_TRACE_IRQFLAGS_SUPPORT=y
 CONFIG_HARDIRQS_SW_RESEND=y
@@ -24,6 +25,7 @@ CONFIG_GENERIC_CALIBRATE_DELAY=y
 CONFIG_ARCH_SUPPORTS_AOUT=y
 CONFIG_ZONE_DMA=y
 CONFIG_ARCH_MTD_XIP=y
+CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
 CONFIG_VECTORS_BASE=0xffff0000
 CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
 
@@ -33,7 +35,7 @@ CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
 CONFIG_EXPERIMENTAL=y
 CONFIG_BROKEN_ON_SMP=y
 CONFIG_INIT_ENV_ARG_LIMIT=32
-CONFIG_LOCALVERSION=""
+CONFIG_LOCALVERSION="-cm-x300"
 # CONFIG_LOCALVERSION_AUTO is not set
 CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
@@ -44,7 +46,7 @@ CONFIG_SYSVIPC_SYSCTL=y
 # CONFIG_AUDIT is not set
 CONFIG_IKCONFIG=y
 CONFIG_IKCONFIG_PROC=y
-CONFIG_LOG_BUF_SHIFT=14
+CONFIG_LOG_BUF_SHIFT=18
 # CONFIG_CGROUPS is not set
 CONFIG_GROUP_SCHED=y
 CONFIG_FAIR_GROUP_SCHED=y
@@ -54,15 +56,18 @@ CONFIG_USER_SCHED=y
 CONFIG_SYSFS_DEPRECATED=y
 CONFIG_SYSFS_DEPRECATED_V2=y
 # CONFIG_RELAY is not set
-# CONFIG_NAMESPACES is not set
+CONFIG_NAMESPACES=y
+# CONFIG_UTS_NS is not set
+# CONFIG_IPC_NS is not set
+# CONFIG_USER_NS is not set
+# CONFIG_PID_NS is not set
 CONFIG_BLK_DEV_INITRD=y
 CONFIG_INITRAMFS_SOURCE=""
-CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 CONFIG_SYSCTL=y
-CONFIG_EMBEDDED=y
+# CONFIG_EMBEDDED is not set
 CONFIG_UID16=y
 CONFIG_SYSCTL_SYSCALL=y
-CONFIG_SYSCTL_SYSCALL_CHECK=y
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_ALL is not set
 # CONFIG_KALLSYMS_EXTRA_PASS is not set
@@ -70,7 +75,7 @@ CONFIG_HOTPLUG=y
 CONFIG_PRINTK=y
 CONFIG_BUG=y
 CONFIG_ELF_CORE=y
-# CONFIG_COMPAT_BRK is not set
+CONFIG_COMPAT_BRK=y
 CONFIG_BASE_FULL=y
 CONFIG_FUTEX=y
 CONFIG_ANON_INODES=y
@@ -79,8 +84,8 @@ CONFIG_SIGNALFD=y
 CONFIG_TIMERFD=y
 CONFIG_EVENTFD=y
 CONFIG_SHMEM=y
-# CONFIG_VM_EVENT_COUNTERS is not set
-# CONFIG_SLUB_DEBUG is not set
+CONFIG_VM_EVENT_COUNTERS=y
+CONFIG_SLUB_DEBUG=y
 # CONFIG_SLAB is not set
 CONFIG_SLUB=y
 # CONFIG_SLOB is not set
@@ -88,14 +93,22 @@ CONFIG_SLUB=y
 # CONFIG_MARKERS is not set
 CONFIG_HAVE_OPROFILE=y
 # CONFIG_KPROBES is not set
+# CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS is not set
+# CONFIG_HAVE_IOREMAP_PROT is not set
 CONFIG_HAVE_KPROBES=y
 CONFIG_HAVE_KRETPROBES=y
+# CONFIG_HAVE_ARCH_TRACEHOOK is not set
 # CONFIG_HAVE_DMA_ATTRS is not set
-# CONFIG_PROC_PAGE_MONITOR is not set
+# CONFIG_USE_GENERIC_SMP_HELPERS is not set
+CONFIG_HAVE_CLK=y
+CONFIG_PROC_PAGE_MONITOR=y
+CONFIG_HAVE_GENERIC_DMA_COHERENT=y
+CONFIG_SLABINFO=y
 CONFIG_RT_MUTEXES=y
 # CONFIG_TINY_SHMEM is not set
 CONFIG_BASE_SMALL=0
 CONFIG_MODULES=y
+# CONFIG_MODULE_FORCE_LOAD is not set
 CONFIG_MODULE_UNLOAD=y
 # CONFIG_MODULE_FORCE_UNLOAD is not set
 # CONFIG_MODVERSIONS is not set
@@ -106,6 +119,7 @@ CONFIG_BLOCK=y
 # CONFIG_BLK_DEV_IO_TRACE is not set
 # CONFIG_LSF is not set
 # CONFIG_BLK_DEV_BSG is not set
+# CONFIG_BLK_DEV_INTEGRITY is not set
 
 #
 # IO Schedulers
@@ -131,7 +145,6 @@ CONFIG_CLASSIC_RCU=y
 # CONFIG_ARCH_AT91 is not set
 # CONFIG_ARCH_CLPS7500 is not set
 # CONFIG_ARCH_CLPS711X is not set
-# CONFIG_ARCH_CO285 is not set
 # CONFIG_ARCH_EBSA110 is not set
 # CONFIG_ARCH_EP93XX is not set
 # CONFIG_ARCH_FOOTBRIDGE is not set
@@ -145,8 +158,11 @@ CONFIG_CLASSIC_RCU=y
 # CONFIG_ARCH_IXP2000 is not set
 # CONFIG_ARCH_IXP4XX is not set
 # CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_KIRKWOOD is not set
 # CONFIG_ARCH_KS8695 is not set
 # CONFIG_ARCH_NS9XXX is not set
+# CONFIG_ARCH_LOKI is not set
+# CONFIG_ARCH_MV78XX0 is not set
 # CONFIG_ARCH_MXC is not set
 # CONFIG_ARCH_ORION5X is not set
 # CONFIG_ARCH_PNX4008 is not set
@@ -159,15 +175,18 @@ CONFIG_ARCH_PXA=y
 # CONFIG_ARCH_DAVINCI is not set
 # CONFIG_ARCH_OMAP is not set
 # CONFIG_ARCH_MSM7X00A is not set
-CONFIG_DMABOUNCE=y
 
 #
 # Intel PXA2xx/PXA3xx Implementations
 #
 
 #
-# Select target boards
+# Supported PXA3xx Processor Variants
 #
+CONFIG_CPU_PXA300=y
+# CONFIG_CPU_PXA310 is not set
+# CONFIG_CPU_PXA320 is not set
+# CONFIG_CPU_PXA930 is not set
 # CONFIG_ARCH_GUMSTIX is not set
 # CONFIG_ARCH_LUBBOCK is not set
 # CONFIG_MACH_LOGICPD_PXA270 is not set
@@ -176,14 +195,19 @@ CONFIG_DMABOUNCE=y
 # CONFIG_PXA_SHARPSL is not set
 # CONFIG_ARCH_PXA_ESERIES is not set
 # CONFIG_MACH_TRIZEPS4 is not set
-CONFIG_MACH_EM_X270=y
+# CONFIG_MACH_EM_X270 is not set
 # CONFIG_MACH_COLIBRI is not set
 # CONFIG_MACH_ZYLONITE is not set
 # CONFIG_MACH_LITTLETON is not set
-CONFIG_MACH_ARMCORE=y
+# CONFIG_MACH_TAVOREVB is not set
+# CONFIG_MACH_SAAR is not set
+# CONFIG_MACH_ARMCORE is not set
+CONFIG_MACH_CM_X300=y
 # CONFIG_MACH_MAGICIAN is not set
 # CONFIG_MACH_PCM027 is not set
-CONFIG_PXA27x=y
+# CONFIG_ARCH_PXA_PALM is not set
+# CONFIG_PXA_EZX is not set
+CONFIG_PXA3xx=y
 # CONFIG_PXA_PWM is not set
 
 #
@@ -198,7 +222,7 @@ CONFIG_PXA27x=y
 # Processor Type
 #
 CONFIG_CPU_32=y
-CONFIG_CPU_XSCALE=y
+CONFIG_CPU_XSC3=y
 CONFIG_CPU_32v5=y
 CONFIG_CPU_ABRT_EV5T=y
 CONFIG_CPU_PABRT_NOIFAR=y
@@ -206,45 +230,24 @@ CONFIG_CPU_CACHE_VIVT=y
 CONFIG_CPU_TLB_V4WBI=y
 CONFIG_CPU_CP15=y
 CONFIG_CPU_CP15_MMU=y
+CONFIG_IO_36=y
 
 #
 # Processor Features
 #
-CONFIG_ARM_THUMB=y
+# CONFIG_ARM_THUMB is not set
 # CONFIG_CPU_DCACHE_DISABLE is not set
-# CONFIG_OUTER_CACHE is not set
+# CONFIG_CPU_BPREDICT_DISABLE is not set
+CONFIG_OUTER_CACHE=y
+CONFIG_CACHE_XSC3L2=y
 CONFIG_IWMMXT=y
-CONFIG_XSCALE_PMU=y
 
 #
 # Bus support
 #
-CONFIG_PCI=y
-CONFIG_PCI_SYSCALL=y
-CONFIG_PCI_HOST_ITE8152=y
+# CONFIG_PCI_SYSCALL is not set
 # CONFIG_ARCH_SUPPORTS_MSI is not set
-CONFIG_PCI_LEGACY=y
-# CONFIG_PCI_DEBUG is not set
-CONFIG_PCCARD=m
-# CONFIG_PCMCIA_DEBUG is not set
-CONFIG_PCMCIA=m
-CONFIG_PCMCIA_LOAD_CIS=y
-CONFIG_PCMCIA_IOCTL=y
-CONFIG_CARDBUS=y
-
-#
-# PC-card bridges
-#
-CONFIG_YENTA=m
-# CONFIG_YENTA_O2 is not set
-# CONFIG_YENTA_RICOH is not set
-CONFIG_YENTA_TI=y
-# CONFIG_YENTA_ENE_TUNE is not set
-# CONFIG_YENTA_TOSHIBA is not set
-# CONFIG_PD6729 is not set
-# CONFIG_I82092 is not set
-CONFIG_PCMCIA_PXA2XX=m
-CONFIG_PCCARD_NONSTATIC=m
+# CONFIG_PCCARD is not set
 
 #
 # Kernel Features
@@ -279,14 +282,28 @@ CONFIG_ALIGNMENT_TRAP=y
 #
 CONFIG_ZBOOT_ROM_TEXT=0x0
 CONFIG_ZBOOT_ROM_BSS=0x0
-CONFIG_CMDLINE="root=1f03 mem=32M"
+CONFIG_CMDLINE="root=/dev/mtdblock5 rootfstype=jffs2 console=ttyS2,38400"
 # CONFIG_XIP_KERNEL is not set
 # CONFIG_KEXEC is not set
 
 #
 # CPU Frequency scaling
 #
-# CONFIG_CPU_FREQ is not set
+CONFIG_CPU_FREQ=y
+CONFIG_CPU_FREQ_TABLE=y
+# CONFIG_CPU_FREQ_DEBUG is not set
+CONFIG_CPU_FREQ_STAT=y
+# CONFIG_CPU_FREQ_STAT_DETAILS is not set
+CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set
+# CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set
+# CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND is not set
+# CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set
+CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
+# CONFIG_CPU_FREQ_GOV_POWERSAVE is not set
+CONFIG_CPU_FREQ_GOV_USERSPACE=y
+# CONFIG_CPU_FREQ_GOV_ONDEMAND is not set
+# CONFIG_CPU_FREQ_GOV_CONSERVATIVE is not set
 
 #
 # Floating point emulation
@@ -314,37 +331,27 @@ CONFIG_PM=y
 CONFIG_PM_SLEEP=y
 CONFIG_SUSPEND=y
 CONFIG_SUSPEND_FREEZER=y
-CONFIG_APM_EMULATION=m
+CONFIG_APM_EMULATION=y
 CONFIG_ARCH_SUSPEND_POSSIBLE=y
-
-#
-# Networking
-#
 CONFIG_NET=y
 
 #
 # Networking options
 #
 CONFIG_PACKET=y
-CONFIG_PACKET_MMAP=y
+# CONFIG_PACKET_MMAP is not set
 CONFIG_UNIX=y
-CONFIG_XFRM=y
-# CONFIG_XFRM_USER is not set
-# CONFIG_XFRM_SUB_POLICY is not set
-# CONFIG_XFRM_MIGRATE is not set
-# CONFIG_XFRM_STATISTICS is not set
 # CONFIG_NET_KEY is not set
 CONFIG_INET=y
-CONFIG_IP_MULTICAST=y
+# CONFIG_IP_MULTICAST is not set
 # CONFIG_IP_ADVANCED_ROUTER is not set
 CONFIG_IP_FIB_HASH=y
 CONFIG_IP_PNP=y
 CONFIG_IP_PNP_DHCP=y
 CONFIG_IP_PNP_BOOTP=y
-# CONFIG_IP_PNP_RARP is not set
+CONFIG_IP_PNP_RARP=y
 # CONFIG_NET_IPIP is not set
 # CONFIG_NET_IPGRE is not set
-# CONFIG_IP_MROUTE is not set
 # CONFIG_ARPD is not set
 # CONFIG_SYN_COOKIES is not set
 # CONFIG_INET_AH is not set
@@ -352,9 +359,9 @@ CONFIG_IP_PNP_BOOTP=y
 # CONFIG_INET_IPCOMP is not set
 # CONFIG_INET_XFRM_TUNNEL is not set
 # CONFIG_INET_TUNNEL is not set
-CONFIG_INET_XFRM_MODE_TRANSPORT=y
-CONFIG_INET_XFRM_MODE_TUNNEL=y
-CONFIG_INET_XFRM_MODE_BEET=y
+# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
+# CONFIG_INET_XFRM_MODE_TUNNEL is not set
+# CONFIG_INET_XFRM_MODE_BEET is not set
 # CONFIG_INET_LRO is not set
 # CONFIG_INET_DIAG is not set
 # CONFIG_TCP_CONG_ADVANCED is not set
@@ -391,10 +398,10 @@ CONFIG_BT=m
 CONFIG_BT_L2CAP=m
 CONFIG_BT_SCO=m
 CONFIG_BT_RFCOMM=m
-# CONFIG_BT_RFCOMM_TTY is not set
+CONFIG_BT_RFCOMM_TTY=y
 CONFIG_BT_BNEP=m
-# CONFIG_BT_BNEP_MC_FILTER is not set
-# CONFIG_BT_BNEP_PROTO_FILTER is not set
+CONFIG_BT_BNEP_MC_FILTER=y
+CONFIG_BT_BNEP_PROTO_FILTER=y
 CONFIG_BT_HIDP=m
 
 #
@@ -407,10 +414,6 @@ CONFIG_BT_HCIUSB_SCO=y
 # CONFIG_BT_HCIBCM203X is not set
 # CONFIG_BT_HCIBPA10X is not set
 # CONFIG_BT_HCIBFUSB is not set
-# CONFIG_BT_HCIDTL1 is not set
-# CONFIG_BT_HCIBT3C is not set
-# CONFIG_BT_HCIBLUECARD is not set
-# CONFIG_BT_HCIBTUART is not set
 # CONFIG_BT_HCIVHCI is not set
 # CONFIG_AF_RXRPC is not set
 
@@ -419,8 +422,13 @@ CONFIG_BT_HCIUSB_SCO=y
 #
 # CONFIG_CFG80211 is not set
 CONFIG_WIRELESS_EXT=y
+CONFIG_WIRELESS_EXT_SYSFS=y
 # CONFIG_MAC80211 is not set
-# CONFIG_IEEE80211 is not set
+CONFIG_IEEE80211=m
+# CONFIG_IEEE80211_DEBUG is not set
+CONFIG_IEEE80211_CRYPT_WEP=m
+CONFIG_IEEE80211_CRYPT_CCMP=m
+CONFIG_IEEE80211_CRYPT_TKIP=m
 # CONFIG_RFKILL is not set
 # CONFIG_NET_9P is not set
 
@@ -434,7 +442,9 @@ CONFIG_WIRELESS_EXT=y
 CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_STANDALONE=y
 CONFIG_PREVENT_FIRMWARE_BUILD=y
-CONFIG_FW_LOADER=m
+CONFIG_FW_LOADER=y
+CONFIG_FIRMWARE_IN_KERNEL=y
+CONFIG_EXTRA_FIRMWARE=""
 # CONFIG_DEBUG_DRIVER is not set
 # CONFIG_DEBUG_DEVRES is not set
 # CONFIG_SYS_HYPERVISOR is not set
@@ -444,7 +454,7 @@ CONFIG_MTD=y
 # CONFIG_MTD_CONCAT is not set
 CONFIG_MTD_PARTITIONS=y
 # CONFIG_MTD_REDBOOT_PARTS is not set
-CONFIG_MTD_CMDLINE_PARTS=y
+# CONFIG_MTD_CMDLINE_PARTS is not set
 # CONFIG_MTD_AFS_PARTS is not set
 # CONFIG_MTD_AR7_PARTS is not set
 
@@ -464,14 +474,8 @@ CONFIG_MTD_BLOCK=y
 #
 # RAM/ROM/Flash chip drivers
 #
-CONFIG_MTD_CFI=y
-CONFIG_MTD_JEDECPROBE=y
-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 is not set
+# CONFIG_MTD_CFI is not set
+# CONFIG_MTD_JEDECPROBE is not set
 CONFIG_MTD_MAP_BANK_WIDTH_1=y
 CONFIG_MTD_MAP_BANK_WIDTH_2=y
 CONFIG_MTD_MAP_BANK_WIDTH_4=y
@@ -482,35 +486,20 @@ 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_OTP is not set
-CONFIG_MTD_CFI_INTELEXT=y
-CONFIG_MTD_CFI_AMDSTD=y
-CONFIG_MTD_CFI_STAA=y
-CONFIG_MTD_CFI_UTIL=y
 # CONFIG_MTD_RAM is not set
 # CONFIG_MTD_ROM is not set
 # CONFIG_MTD_ABSENT is not set
-# CONFIG_MTD_XIP is not set
 
 #
 # Mapping drivers for chip access
 #
 # CONFIG_MTD_COMPLEX_MAPPINGS is not set
-CONFIG_MTD_PHYSMAP=y
-CONFIG_MTD_PHYSMAP_START=0x0
-CONFIG_MTD_PHYSMAP_LEN=0x400000
-CONFIG_MTD_PHYSMAP_BANKWIDTH=2
-CONFIG_MTD_PXA2XX=y
-# CONFIG_MTD_ARM_INTEGRATOR is not set
-# CONFIG_MTD_IMPA7 is not set
 # CONFIG_MTD_SHARP_SL is not set
-# CONFIG_MTD_INTEL_VR_NOR is not set
 # CONFIG_MTD_PLATRAM is not set
 
 #
 # Self-contained MTD device drivers
 #
-# CONFIG_MTD_PMC551 is not set
 # CONFIG_MTD_SLRAM is not set
 # CONFIG_MTD_PHRAM is not set
 # CONFIG_MTD_MTDRAM is not set
@@ -530,10 +519,9 @@ CONFIG_MTD_NAND=y
 CONFIG_MTD_NAND_IDS=y
 # CONFIG_MTD_NAND_DISKONCHIP is not set
 # CONFIG_MTD_NAND_SHARPSL is not set
-# CONFIG_MTD_NAND_CAFE is not set
-CONFIG_MTD_NAND_CM_X270=y
+CONFIG_MTD_NAND_PXA3xx=y
 # CONFIG_MTD_NAND_NANDSIM is not set
-CONFIG_MTD_NAND_PLATFORM=y
+# CONFIG_MTD_NAND_PLATFORM is not set
 # CONFIG_MTD_ALAUDA is not set
 # CONFIG_MTD_ONENAND is not set
 
@@ -543,15 +531,10 @@ CONFIG_MTD_NAND_PLATFORM=y
 # CONFIG_MTD_UBI is not set
 # CONFIG_PARPORT is not set
 CONFIG_BLK_DEV=y
-# 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_UMEM is not set
 # CONFIG_BLK_DEV_COW_COMMON is not set
 CONFIG_BLK_DEV_LOOP=y
 # CONFIG_BLK_DEV_CRYPTOLOOP is not set
 # CONFIG_BLK_DEV_NBD is not set
-# CONFIG_BLK_DEV_SX8 is not set
 # CONFIG_BLK_DEV_UB is not set
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=16
@@ -602,185 +585,45 @@ CONFIG_SCSI_WAIT_SCAN=m
 # CONFIG_SCSI_SRP_ATTRS is not set
 CONFIG_SCSI_LOWLEVEL=y
 # CONFIG_ISCSI_TCP is not set
-# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
-# CONFIG_SCSI_3W_9XXX is not set
-# CONFIG_SCSI_ACARD is not set
-# CONFIG_SCSI_AACRAID is not set
-# CONFIG_SCSI_AIC7XXX is not set
-# CONFIG_SCSI_AIC7XXX_OLD is not set
-# CONFIG_SCSI_AIC79XX is not set
-# CONFIG_SCSI_AIC94XX is not set
-# CONFIG_SCSI_DPT_I2O is not set
-# CONFIG_SCSI_ADVANSYS is not set
-# CONFIG_SCSI_ARCMSR is not set
-# CONFIG_MEGARAID_NEWGEN is not set
-# CONFIG_MEGARAID_LEGACY is not set
-# CONFIG_MEGARAID_SAS is not set
-# CONFIG_SCSI_HPTIOP is not set
-# CONFIG_SCSI_DMX3191D is not set
-# CONFIG_SCSI_FUTURE_DOMAIN is not set
-# CONFIG_SCSI_IPS is not set
-# CONFIG_SCSI_INITIO is not set
-# CONFIG_SCSI_INIA100 is not set
-# CONFIG_SCSI_MVSAS is not set
-# CONFIG_SCSI_STEX is not set
-# CONFIG_SCSI_SYM53C8XX_2 is not set
-# CONFIG_SCSI_IPR is not set
-# CONFIG_SCSI_QLOGIC_1280 is not set
-# CONFIG_SCSI_QLA_FC is not set
-# CONFIG_SCSI_QLA_ISCSI is not set
-# CONFIG_SCSI_LPFC is not set
-# CONFIG_SCSI_DC395x is not set
-# CONFIG_SCSI_DC390T is not set
-# CONFIG_SCSI_NSP32 is not set
 # CONFIG_SCSI_DEBUG is not set
-# CONFIG_SCSI_SRP is not set
-# CONFIG_SCSI_LOWLEVEL_PCMCIA is not set
-CONFIG_ATA=m
-# CONFIG_ATA_NONSTANDARD is not set
-# CONFIG_SATA_PMP is not set
-# CONFIG_SATA_AHCI is not set
-# CONFIG_SATA_SIL24 is not set
-CONFIG_ATA_SFF=y
-# CONFIG_SATA_SVW is not set
-# CONFIG_ATA_PIIX is not set
-# CONFIG_SATA_MV is not set
-# CONFIG_SATA_NV is not set
-# CONFIG_PDC_ADMA is not set
-# CONFIG_SATA_QSTOR is not set
-# CONFIG_SATA_PROMISE is not set
-# CONFIG_SATA_SX4 is not set
-# CONFIG_SATA_SIL is not set
-# CONFIG_SATA_SIS is not set
-# CONFIG_SATA_ULI is not set
-# CONFIG_SATA_VIA is not set
-# CONFIG_SATA_VITESSE is not set
-# CONFIG_SATA_INIC162X is not set
-# CONFIG_PATA_ALI is not set
-# CONFIG_PATA_AMD is not set
-# CONFIG_PATA_ARTOP is not set
-# CONFIG_PATA_ATIIXP is not set
-# CONFIG_PATA_CMD640_PCI is not set
-# CONFIG_PATA_CMD64X is not set
-# CONFIG_PATA_CS5520 is not set
-# CONFIG_PATA_CS5530 is not set
-# CONFIG_PATA_CYPRESS is not set
-# CONFIG_PATA_EFAR is not set
-# CONFIG_ATA_GENERIC is not set
-# CONFIG_PATA_HPT366 is not set
-# CONFIG_PATA_HPT37X is not set
-# CONFIG_PATA_HPT3X2N is not set
-# CONFIG_PATA_HPT3X3 is not set
-# CONFIG_PATA_IT821X is not set
-# CONFIG_PATA_IT8213 is not set
-# CONFIG_PATA_JMICRON is not set
-# CONFIG_PATA_TRIFLEX is not set
-# CONFIG_PATA_MARVELL is not set
-# CONFIG_PATA_MPIIX is not set
-# CONFIG_PATA_OLDPIIX is not set
-# CONFIG_PATA_NETCELL is not set
-# CONFIG_PATA_NINJA32 is not set
-# CONFIG_PATA_NS87410 is not set
-# CONFIG_PATA_NS87415 is not set
-# CONFIG_PATA_OPTI is not set
-# CONFIG_PATA_OPTIDMA is not set
-CONFIG_PATA_PCMCIA=m
-# CONFIG_PATA_PDC_OLD is not set
-# CONFIG_PATA_RADISYS is not set
-# CONFIG_PATA_RZ1000 is not set
-# CONFIG_PATA_SC1200 is not set
-# CONFIG_PATA_SERVERWORKS is not set
-# CONFIG_PATA_PDC2027X is not set
-# CONFIG_PATA_SIL680 is not set
-# CONFIG_PATA_SIS is not set
-# CONFIG_PATA_VIA is not set
-# CONFIG_PATA_WINBOND is not set
-# CONFIG_PATA_PLATFORM is not set
+# CONFIG_SCSI_DH is not set
+# CONFIG_ATA is not set
 # CONFIG_MD is not set
-# CONFIG_FUSION is not set
-
-#
-# IEEE 1394 (FireWire) support
-#
-# CONFIG_FIREWIRE is not set
-# CONFIG_IEEE1394 is not set
-# CONFIG_I2O is not set
 CONFIG_NETDEVICES=y
-# CONFIG_NETDEVICES_MULTIQUEUE is not set
 # CONFIG_DUMMY is not set
 # CONFIG_BONDING is not set
 # CONFIG_MACVLAN is not set
 # CONFIG_EQUALIZER is not set
 # CONFIG_TUN is not set
 # CONFIG_VETH is not set
-# CONFIG_ARCNET is not set
 # CONFIG_PHYLIB is not set
 CONFIG_NET_ETHERNET=y
 CONFIG_MII=y
 # CONFIG_AX88796 is not set
-# CONFIG_HAPPYMEAL is not set
-# CONFIG_SUNGEM is not set
-# CONFIG_CASSINI is not set
-# CONFIG_NET_VENDOR_3COM is not set
 # CONFIG_SMC91X is not set
 CONFIG_DM9000=y
-CONFIG_DM9000_DEBUGLEVEL=1
+CONFIG_DM9000_DEBUGLEVEL=0
+CONFIG_DM9000_FORCE_SIMPLE_PHY_POLL=y
 # CONFIG_SMC911X is not set
-# CONFIG_NET_TULIP is not set
-# CONFIG_HP100 is not set
 # CONFIG_IBM_NEW_EMAC_ZMII is not set
 # CONFIG_IBM_NEW_EMAC_RGMII is not set
 # CONFIG_IBM_NEW_EMAC_TAH is not set
 # CONFIG_IBM_NEW_EMAC_EMAC4 is not set
-CONFIG_NET_PCI=y
-# CONFIG_PCNET32 is not set
-# CONFIG_AMD8111_ETH is not set
-# CONFIG_ADAPTEC_STARFIRE is not set
 # CONFIG_B44 is not set
-# CONFIG_FORCEDETH is not set
-# CONFIG_EEPRO100 is not set
-# CONFIG_E100 is not set
-# CONFIG_FEALNX is not set
-# CONFIG_NATSEMI is not set
-# CONFIG_NE2K_PCI is not set
-# CONFIG_8139CP is not set
-CONFIG_8139TOO=y
-# CONFIG_8139TOO_PIO is not set
-# CONFIG_8139TOO_TUNE_TWISTER is not set
-# CONFIG_8139TOO_8129 is not set
-# CONFIG_8139_OLD_RX_RESET is not set
-# CONFIG_R6040 is not set
-# CONFIG_SIS900 is not set
-# CONFIG_EPIC100 is not set
-# CONFIG_SUNDANCE is not set
-# CONFIG_TLAN is not set
-# CONFIG_VIA_RHINE is not set
-# CONFIG_SC92031 is not set
 # CONFIG_NETDEV_1000 is not set
 # CONFIG_NETDEV_10000 is not set
-# CONFIG_TR is not set
 
 #
 # Wireless LAN
 #
 # CONFIG_WLAN_PRE80211 is not set
 CONFIG_WLAN_80211=y
-# CONFIG_PCMCIA_RAYCS is not set
-# CONFIG_IPW2100 is not set
-# CONFIG_IPW2200 is not set
 CONFIG_LIBERTAS=m
 # CONFIG_LIBERTAS_USB is not set
-# CONFIG_LIBERTAS_CS is not set
 CONFIG_LIBERTAS_SDIO=m
 # CONFIG_LIBERTAS_DEBUG is not set
-# CONFIG_HERMES is not set
-# CONFIG_ATMEL is not set
-# CONFIG_AIRO_CS is not set
-# CONFIG_PCMCIA_WL3501 is not set
-# CONFIG_PRISM54 is not set
 # CONFIG_USB_ZD1201 is not set
 # CONFIG_USB_NET_RNDIS_WLAN is not set
-# CONFIG_IWLWIFI is not set
 # CONFIG_IWLWIFI_LEDS is not set
 # CONFIG_HOSTAP is not set
 
@@ -792,23 +635,9 @@ CONFIG_LIBERTAS_SDIO=m
 # CONFIG_USB_PEGASUS is not set
 # CONFIG_USB_RTL8150 is not set
 # CONFIG_USB_USBNET is not set
-# CONFIG_NET_PCMCIA is not set
 # CONFIG_WAN is not set
-# CONFIG_FDDI is not set
-# CONFIG_HIPPI is not set
-CONFIG_PPP=m
-CONFIG_PPP_MULTILINK=y
-CONFIG_PPP_FILTER=y
-CONFIG_PPP_ASYNC=m
-# CONFIG_PPP_SYNC_TTY is not set
-CONFIG_PPP_DEFLATE=m
-CONFIG_PPP_BSDCOMP=m
-# CONFIG_PPP_MPPE is not set
-# CONFIG_PPPOE is not set
-# CONFIG_PPPOL2TP is not set
+# CONFIG_PPP is not set
 # CONFIG_SLIP is not set
-CONFIG_SLHC=m
-# CONFIG_NET_FC is not set
 # CONFIG_NETCONSOLE is not set
 # CONFIG_NETPOLL is not set
 # CONFIG_NET_POLL_CONTROLLER is not set
@@ -825,19 +654,18 @@ CONFIG_INPUT=y
 # Userland interfaces
 #
 CONFIG_INPUT_MOUSEDEV=y
-CONFIG_INPUT_MOUSEDEV_PSAUX=y
+# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
 CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
 CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
 # CONFIG_INPUT_JOYDEV is not set
 CONFIG_INPUT_EVDEV=y
 # CONFIG_INPUT_EVBUG is not set
-# CONFIG_INPUT_APMPOWER is not set
 
 #
 # Input Device Drivers
 #
 CONFIG_INPUT_KEYBOARD=y
-CONFIG_KEYBOARD_ATKBD=y
+# CONFIG_KEYBOARD_ATKBD is not set
 # CONFIG_KEYBOARD_SUNKBD is not set
 # CONFIG_KEYBOARD_LKKBD is not set
 # CONFIG_KEYBOARD_XTKBD is not set
@@ -853,39 +681,32 @@ CONFIG_INPUT_TOUCHSCREEN=y
 # CONFIG_TOUCHSCREEN_GUNZE is not set
 # CONFIG_TOUCHSCREEN_ELO is not set
 # CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_INEXIO is not set
 # CONFIG_TOUCHSCREEN_MK712 is not set
 # CONFIG_TOUCHSCREEN_PENMOUNT is not set
 # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
 # CONFIG_TOUCHSCREEN_TOUCHWIN is not set
-CONFIG_TOUCHSCREEN_UCB1400=m
-CONFIG_TOUCHSCREEN_WM97XX=m
-# CONFIG_TOUCHSCREEN_WM9705 is not set
-CONFIG_TOUCHSCREEN_WM9712=y
-# CONFIG_TOUCHSCREEN_WM9713 is not set
-# CONFIG_TOUCHSCREEN_WM97XX_MAINSTONE is not set
+# CONFIG_TOUCHSCREEN_UCB1400 is not set
 # CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
+# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set
 # CONFIG_INPUT_MISC is not set
 
 #
 # Hardware I/O ports
 #
-CONFIG_SERIO=y
-# CONFIG_SERIO_SERPORT is not set
-# CONFIG_SERIO_PCIPS2 is not set
-CONFIG_SERIO_LIBPS2=y
-# CONFIG_SERIO_RAW is not set
+# CONFIG_SERIO is not set
 # CONFIG_GAMEPORT is not set
 
 #
 # Character devices
 #
 CONFIG_VT=y
+CONFIG_CONSOLE_TRANSLATIONS=y
 CONFIG_VT_CONSOLE=y
 CONFIG_HW_CONSOLE=y
 # CONFIG_VT_HW_CONSOLE_BINDING is not set
 CONFIG_DEVKMEM=y
 # CONFIG_SERIAL_NONSTANDARD is not set
-# CONFIG_NOZOMI is not set
 
 #
 # Serial drivers
@@ -899,65 +720,50 @@ CONFIG_SERIAL_PXA=y
 CONFIG_SERIAL_PXA_CONSOLE=y
 CONFIG_SERIAL_CORE=y
 CONFIG_SERIAL_CORE_CONSOLE=y
-# CONFIG_SERIAL_JSM is not set
 CONFIG_UNIX98_PTYS=y
-CONFIG_LEGACY_PTYS=y
-CONFIG_LEGACY_PTY_COUNT=16
+# CONFIG_LEGACY_PTYS is not set
 # CONFIG_IPMI_HANDLER is not set
 # CONFIG_HW_RANDOM is not set
 # CONFIG_NVRAM is not set
 # CONFIG_R3964 is not set
-# CONFIG_APPLICOM is not set
-
-#
-# PCMCIA character devices
-#
-# CONFIG_SYNCLINK_CS is not set
-# CONFIG_CARDMAN_4000 is not set
-# CONFIG_CARDMAN_4040 is not set
-# CONFIG_IPWIRELESS is not set
 # CONFIG_RAW_DRIVER is not set
 # CONFIG_TCG_TPM is not set
-CONFIG_DEVPORT=y
 CONFIG_I2C=y
 CONFIG_I2C_BOARDINFO=y
-CONFIG_I2C_CHARDEV=m
+# CONFIG_I2C_CHARDEV is not set
+CONFIG_I2C_HELPER_AUTO=y
 
 #
 # I2C Hardware Bus support
 #
-# CONFIG_I2C_ALI1535 is not set
-# CONFIG_I2C_ALI1563 is not set
-# CONFIG_I2C_ALI15X3 is not set
-# CONFIG_I2C_AMD756 is not set
-# CONFIG_I2C_AMD8111 is not set
+
+#
+# I2C system bus drivers (mostly embedded / system-on-chip)
+#
 # CONFIG_I2C_GPIO is not set
-# CONFIG_I2C_I801 is not set
-# CONFIG_I2C_I810 is not set
+# CONFIG_I2C_OCORES is not set
 CONFIG_I2C_PXA=y
 # CONFIG_I2C_PXA_SLAVE is not set
-# CONFIG_I2C_PIIX4 is not set
-# CONFIG_I2C_NFORCE2 is not set
-# CONFIG_I2C_OCORES is not set
-# CONFIG_I2C_PARPORT_LIGHT is not set
-# CONFIG_I2C_PROSAVAGE is not set
-# CONFIG_I2C_SAVAGE4 is not set
 # CONFIG_I2C_SIMTEC is not set
-# CONFIG_I2C_SIS5595 is not set
-# CONFIG_I2C_SIS630 is not set
-# CONFIG_I2C_SIS96X is not set
+
+#
+# External I2C/SMBus adapter drivers
+#
+# CONFIG_I2C_PARPORT_LIGHT is not set
 # CONFIG_I2C_TAOS_EVM is not set
-# CONFIG_I2C_STUB is not set
 # CONFIG_I2C_TINY_USB is not set
-# CONFIG_I2C_VIA is not set
-# CONFIG_I2C_VIAPRO is not set
-# CONFIG_I2C_VOODOO3 is not set
+
+#
+# Other I2C/SMBus bus drivers
+#
 # CONFIG_I2C_PCA_PLATFORM is not set
+# CONFIG_I2C_STUB is not set
 
 #
 # Miscellaneous I2C Chip support
 #
 # CONFIG_DS1682 is not set
+# CONFIG_AT24 is not set
 # CONFIG_SENSORS_EEPROM is not set
 # CONFIG_SENSORS_PCF8574 is not set
 # CONFIG_PCF8575 is not set
@@ -970,20 +776,23 @@ CONFIG_I2C_PXA=y
 # CONFIG_I2C_DEBUG_BUS is not set
 # CONFIG_I2C_DEBUG_CHIP is not set
 # CONFIG_SPI is not set
-CONFIG_HAVE_GPIO_LIB=y
-
-#
-# GPIO Support
-#
+CONFIG_ARCH_REQUIRE_GPIOLIB=y
+CONFIG_GPIOLIB=y
 # CONFIG_DEBUG_GPIO is not set
+# CONFIG_GPIO_SYSFS is not set
 
 #
 # I2C GPIO expanders:
 #
-# CONFIG_GPIO_PCA953X is not set
+# CONFIG_GPIO_MAX732X is not set
+CONFIG_GPIO_PCA953X=y
 # CONFIG_GPIO_PCF857X is not set
 
 #
+# PCI GPIO expanders:
+#
+
+#
 # SPI GPIO expanders:
 #
 # CONFIG_W1 is not set
@@ -1000,10 +809,14 @@ CONFIG_SSB_POSSIBLE=y
 #
 # Multifunction device drivers
 #
+# CONFIG_MFD_CORE is not set
 # CONFIG_MFD_SM501 is not set
-# CONFIG_MFD_ASIC3 is not set
 # CONFIG_HTC_EGPIO is not set
 # CONFIG_HTC_PASIC3 is not set
+# CONFIG_MFD_TMIO is not set
+# CONFIG_MFD_T7L66XB is not set
+# CONFIG_MFD_TC6387XB is not set
+# CONFIG_MFD_TC6393XB is not set
 
 #
 # Multimedia devices
@@ -1014,6 +827,7 @@ CONFIG_SSB_POSSIBLE=y
 #
 # CONFIG_VIDEO_DEV is not set
 # CONFIG_DVB_CORE is not set
+# CONFIG_VIDEO_MEDIA is not set
 
 #
 # Multimedia drivers
@@ -1023,7 +837,6 @@ CONFIG_SSB_POSSIBLE=y
 #
 # Graphics support
 #
-# CONFIG_DRM is not set
 # CONFIG_VGASTATE is not set
 # CONFIG_VIDEO_OUTPUT_CONTROL is not set
 CONFIG_FB=y
@@ -1038,7 +851,6 @@ CONFIG_FB_CFB_IMAGEBLIT=y
 # CONFIG_FB_SYS_IMAGEBLIT is not set
 # CONFIG_FB_FOREIGN_ENDIAN is not set
 # CONFIG_FB_SYS_FOPS is not set
-CONFIG_FB_DEFERRED_IO=y
 # CONFIG_FB_SVGALIB is not set
 # CONFIG_FB_MACMODES is not set
 # CONFIG_FB_BACKLIGHT is not set
@@ -1048,33 +860,12 @@ CONFIG_FB_DEFERRED_IO=y
 #
 # Frame buffer hardware drivers
 #
-# CONFIG_FB_CIRRUS is not set
-# CONFIG_FB_PM2 is not set
-# CONFIG_FB_CYBER2000 is not set
-# CONFIG_FB_ASILIANT is not set
-# CONFIG_FB_IMSTT is not set
 # CONFIG_FB_S1D13XXX is not set
-# CONFIG_FB_NVIDIA is not set
-# CONFIG_FB_RIVA is not set
-# CONFIG_FB_MATROX is not set
-# CONFIG_FB_RADEON is not set
-# CONFIG_FB_ATY128 is not set
-# CONFIG_FB_ATY is not set
-# CONFIG_FB_S3 is not set
-# CONFIG_FB_SAVAGE is not set
-# CONFIG_FB_SIS is not set
-# CONFIG_FB_NEOMAGIC is not set
-# CONFIG_FB_KYRO is not set
-# CONFIG_FB_3DFX is not set
-# CONFIG_FB_VOODOO1 is not set
-# CONFIG_FB_VT8623 is not set
-# CONFIG_FB_TRIDENT is not set
-# CONFIG_FB_ARK is not set
-# CONFIG_FB_PM3 is not set
 CONFIG_FB_PXA=y
 # CONFIG_FB_PXA_SMARTPANEL is not set
-CONFIG_FB_PXA_PARAMETERS=y
-CONFIG_FB_MBX=m
+# CONFIG_FB_PXA_PARAMETERS is not set
+# CONFIG_FB_MBX is not set
+# CONFIG_FB_W100 is not set
 # CONFIG_FB_AM200EPD is not set
 # CONFIG_FB_VIRTUAL is not set
 # CONFIG_BACKLIGHT_LCD_SUPPORT is not set
@@ -1090,147 +881,48 @@ CONFIG_FB_MBX=m
 # CONFIG_VGA_CONSOLE is not set
 CONFIG_DUMMY_CONSOLE=y
 CONFIG_FRAMEBUFFER_CONSOLE=y
-# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
+CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
 # CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
-# CONFIG_FONTS is not set
-CONFIG_FONT_8x8=y
-CONFIG_FONT_8x16=y
+CONFIG_FONTS=y
+# CONFIG_FONT_8x8 is not set
+# CONFIG_FONT_8x16 is not set
+CONFIG_FONT_6x11=y
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+# CONFIG_FONT_MINI_4x6 is not set
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
 CONFIG_LOGO=y
 CONFIG_LOGO_LINUX_MONO=y
 CONFIG_LOGO_LINUX_VGA16=y
 CONFIG_LOGO_LINUX_CLUT224=y
-
-#
-# Sound
-#
 CONFIG_SOUND=m
-
-#
-# Advanced Linux Sound Architecture
-#
 CONFIG_SND=m
 CONFIG_SND_TIMER=m
 CONFIG_SND_PCM=m
 # CONFIG_SND_SEQUENCER is not set
-CONFIG_SND_OSSEMUL=y
-CONFIG_SND_MIXER_OSS=m
-CONFIG_SND_PCM_OSS=m
-CONFIG_SND_PCM_OSS_PLUGINS=y
+# CONFIG_SND_MIXER_OSS is not set
+# CONFIG_SND_PCM_OSS is not set
 # CONFIG_SND_DYNAMIC_MINORS is not set
 CONFIG_SND_SUPPORT_OLD_API=y
 CONFIG_SND_VERBOSE_PROCFS=y
 # CONFIG_SND_VERBOSE_PRINTK is not set
 # CONFIG_SND_DEBUG is not set
-
-#
-# Generic devices
-#
-CONFIG_SND_AC97_CODEC=m
+CONFIG_SND_DRIVERS=y
 # CONFIG_SND_DUMMY is not set
 # CONFIG_SND_MTPAV is not set
 # CONFIG_SND_SERIAL_U16550 is not set
 # CONFIG_SND_MPU401 is not set
-
-#
-# PCI devices
-#
-# CONFIG_SND_AD1889 is not set
-# CONFIG_SND_ALS300 is not set
-# CONFIG_SND_ALI5451 is not set
-# CONFIG_SND_ATIIXP is not set
-# CONFIG_SND_ATIIXP_MODEM is not set
-# CONFIG_SND_AU8810 is not set
-# CONFIG_SND_AU8820 is not set
-# CONFIG_SND_AU8830 is not set
-# CONFIG_SND_AW2 is not set
-# CONFIG_SND_AZT3328 is not set
-# CONFIG_SND_BT87X is not set
-# CONFIG_SND_CA0106 is not set
-# CONFIG_SND_CMIPCI is not set
-# CONFIG_SND_OXYGEN is not set
-# CONFIG_SND_CS4281 is not set
-# CONFIG_SND_CS46XX is not set
-# CONFIG_SND_DARLA20 is not set
-# CONFIG_SND_GINA20 is not set
-# CONFIG_SND_LAYLA20 is not set
-# CONFIG_SND_DARLA24 is not set
-# CONFIG_SND_GINA24 is not set
-# CONFIG_SND_LAYLA24 is not set
-# CONFIG_SND_MONA is not set
-# CONFIG_SND_MIA is not set
-# CONFIG_SND_ECHO3G is not set
-# CONFIG_SND_INDIGO is not set
-# CONFIG_SND_INDIGOIO is not set
-# CONFIG_SND_INDIGODJ is not set
-# CONFIG_SND_EMU10K1 is not set
-# CONFIG_SND_EMU10K1X is not set
-# CONFIG_SND_ENS1370 is not set
-# CONFIG_SND_ENS1371 is not set
-# CONFIG_SND_ES1938 is not set
-# CONFIG_SND_ES1968 is not set
-# CONFIG_SND_FM801 is not set
-# CONFIG_SND_HDA_INTEL is not set
-# CONFIG_SND_HDSP is not set
-# CONFIG_SND_HDSPM is not set
-# CONFIG_SND_HIFIER is not set
-# CONFIG_SND_ICE1712 is not set
-# CONFIG_SND_ICE1724 is not set
-# CONFIG_SND_INTEL8X0 is not set
-# CONFIG_SND_INTEL8X0M is not set
-# CONFIG_SND_KORG1212 is not set
-# CONFIG_SND_MAESTRO3 is not set
-# CONFIG_SND_MIXART is not set
-# CONFIG_SND_NM256 is not set
-# CONFIG_SND_PCXHR is not set
-# CONFIG_SND_RIPTIDE is not set
-# CONFIG_SND_RME32 is not set
-# CONFIG_SND_RME96 is not set
-# CONFIG_SND_RME9652 is not set
-# CONFIG_SND_SONICVIBES is not set
-# CONFIG_SND_TRIDENT is not set
-# CONFIG_SND_VIA82XX is not set
-# CONFIG_SND_VIA82XX_MODEM is not set
-# CONFIG_SND_VIRTUOSO is not set
-# CONFIG_SND_VX222 is not set
-# CONFIG_SND_YMFPCI is not set
-# CONFIG_SND_AC97_POWER_SAVE is not set
-
-#
-# ALSA ARM devices
-#
-CONFIG_SND_PXA2XX_PCM=m
-CONFIG_SND_PXA2XX_AC97=m
-
-#
-# USB devices
-#
+CONFIG_SND_ARM=y
+# CONFIG_SND_PXA2XX_AC97 is not set
+CONFIG_SND_USB=y
 # CONFIG_SND_USB_AUDIO is not set
 # CONFIG_SND_USB_CAIAQ is not set
-
-#
-# PCMCIA devices
-#
-# CONFIG_SND_VXPOCKET is not set
-# CONFIG_SND_PDAUDIOCF is not set
-
-#
-# System on Chip audio support
-#
-# CONFIG_SND_SOC is not set
-
-#
-# ALSA SoC audio for Freescale SOCs
-#
-
-#
-# SoC Audio for the Texas Instruments OMAP
-#
-
-#
-# Open Sound System
-#
+CONFIG_SND_SOC=m
+CONFIG_SND_PXA2XX_SOC=m
 # CONFIG_SOUND_PRIME is not set
-CONFIG_AC97_BUS=m
 CONFIG_HID_SUPPORT=y
 CONFIG_HID=y
 CONFIG_HID_DEBUG=y
@@ -1246,7 +938,7 @@ CONFIG_USB_HID=y
 CONFIG_USB_SUPPORT=y
 CONFIG_USB_ARCH_HAS_HCD=y
 CONFIG_USB_ARCH_HAS_OHCI=y
-CONFIG_USB_ARCH_HAS_EHCI=y
+# CONFIG_USB_ARCH_HAS_EHCI is not set
 CONFIG_USB=y
 # CONFIG_USB_DEBUG is not set
 # CONFIG_USB_ANNOUNCE_NEW_DEVICES is not set
@@ -1259,27 +951,28 @@ CONFIG_USB_DEVICEFS=y
 # CONFIG_USB_DYNAMIC_MINORS is not set
 # CONFIG_USB_SUSPEND is not set
 # CONFIG_USB_OTG is not set
-# CONFIG_USB_OTG_WHITELIST is not set
-# CONFIG_USB_OTG_BLACKLIST_HUB is not set
+CONFIG_USB_MON=y
 
 #
 # USB Host Controller Drivers
 #
-# CONFIG_USB_EHCI_HCD is not set
+# CONFIG_USB_C67X00_HCD is not set
 # CONFIG_USB_ISP116X_HCD is not set
+# CONFIG_USB_ISP1760_HCD is not set
 CONFIG_USB_OHCI_HCD=y
 # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
 # CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
 CONFIG_USB_OHCI_LITTLE_ENDIAN=y
-# CONFIG_USB_UHCI_HCD is not set
 # CONFIG_USB_SL811_HCD is not set
 # CONFIG_USB_R8A66597_HCD is not set
+# CONFIG_USB_MUSB_HDRC is not set
 
 #
 # USB Device Class drivers
 #
 # CONFIG_USB_ACM is not set
 # CONFIG_USB_PRINTER is not set
+# CONFIG_USB_WDM is not set
 
 #
 # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
@@ -1301,6 +994,7 @@ CONFIG_USB_STORAGE=y
 # CONFIG_USB_STORAGE_ALAUDA is not set
 # CONFIG_USB_STORAGE_ONETOUCH is not set
 # CONFIG_USB_STORAGE_KARMA is not set
+# CONFIG_USB_STORAGE_SIERRA is not set
 # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
 # CONFIG_USB_LIBUSUAL is not set
 
@@ -1309,7 +1003,6 @@ CONFIG_USB_STORAGE=y
 #
 # CONFIG_USB_MDC800 is not set
 # CONFIG_USB_MICROTEK is not set
-CONFIG_USB_MON=y
 
 #
 # USB port drivers
@@ -1322,7 +1015,6 @@ CONFIG_USB_MON=y
 # CONFIG_USB_EMI62 is not set
 # CONFIG_USB_EMI26 is not set
 # CONFIG_USB_ADUTUX is not set
-# CONFIG_USB_AUERSWALD is not set
 # CONFIG_USB_RIO500 is not set
 # CONFIG_USB_LEGOTOWER is not set
 # CONFIG_USB_LCD is not set
@@ -1338,6 +1030,7 @@ CONFIG_USB_MON=y
 # CONFIG_USB_TRANCEVIBRATOR is not set
 # CONFIG_USB_IOWARRIOR is not set
 # CONFIG_USB_TEST is not set
+# CONFIG_USB_ISIGHTFW is not set
 # CONFIG_USB_GADGET is not set
 CONFIG_MMC=m
 # CONFIG_MMC_DEBUG is not set
@@ -1349,21 +1042,22 @@ CONFIG_MMC=m
 CONFIG_MMC_BLOCK=m
 CONFIG_MMC_BLOCK_BOUNCE=y
 # CONFIG_SDIO_UART is not set
+# CONFIG_MMC_TEST is not set
 
 #
 # MMC/SD Host Controller Drivers
 #
 CONFIG_MMC_PXA=m
 # CONFIG_MMC_SDHCI is not set
-# CONFIG_MMC_TIFM_SD is not set
 CONFIG_NEW_LEDS=y
 CONFIG_LEDS_CLASS=y
 
 #
 # LED drivers
 #
-# CONFIG_LEDS_GPIO is not set
-CONFIG_LEDS_CM_X270=y
+# CONFIG_LEDS_PCA9532 is not set
+CONFIG_LEDS_GPIO=y
+# CONFIG_LEDS_PCA955X is not set
 
 #
 # LED Triggers
@@ -1401,6 +1095,7 @@ CONFIG_RTC_INTF_DEV=y
 # CONFIG_RTC_DRV_PCF8583 is not set
 # CONFIG_RTC_DRV_M41T80 is not set
 # CONFIG_RTC_DRV_S35390A is not set
+# CONFIG_RTC_DRV_FM3130 is not set
 
 #
 # SPI RTC drivers
@@ -1416,12 +1111,21 @@ CONFIG_RTC_INTF_DEV=y
 # CONFIG_RTC_DRV_STK17TA8 is not set
 # CONFIG_RTC_DRV_M48T86 is not set
 # CONFIG_RTC_DRV_M48T59 is not set
-CONFIG_RTC_DRV_V3020=y
+# CONFIG_RTC_DRV_V3020 is not set
 
 #
 # on-CPU RTC drivers
 #
 CONFIG_RTC_DRV_SA1100=y
+# CONFIG_DMADEVICES is not set
+
+#
+# Voltage and Current regulators
+#
+# CONFIG_REGULATOR is not set
+# CONFIG_REGULATOR_FIXED_VOLTAGE is not set
+# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set
+# CONFIG_REGULATOR_BQ24022 is not set
 # CONFIG_UIO is not set
 
 #
@@ -1431,15 +1135,13 @@ CONFIG_EXT2_FS=y
 # CONFIG_EXT2_FS_XATTR is not set
 # CONFIG_EXT2_FS_XIP is not set
 CONFIG_EXT3_FS=y
-CONFIG_EXT3_FS_XATTR=y
-# CONFIG_EXT3_FS_POSIX_ACL is not set
-# CONFIG_EXT3_FS_SECURITY is not set
+# CONFIG_EXT3_FS_XATTR is not set
 # CONFIG_EXT4DEV_FS is not set
 CONFIG_JBD=y
-CONFIG_FS_MBCACHE=y
+# CONFIG_JBD_DEBUG is not set
 # CONFIG_REISERFS_FS is not set
 # CONFIG_JFS_FS is not set
-# CONFIG_FS_POSIX_ACL is not set
+CONFIG_FS_POSIX_ACL=y
 # CONFIG_XFS_FS is not set
 # CONFIG_OCFS2_FS is not set
 CONFIG_DNOTIFY=y
@@ -1460,7 +1162,7 @@ CONFIG_INOTIFY_USER=y
 # DOS/FAT/NT Filesystems
 #
 CONFIG_FAT_FS=m
-# CONFIG_MSDOS_FS is not set
+CONFIG_MSDOS_FS=m
 CONFIG_VFAT_FS=m
 CONFIG_FAT_DEFAULT_CODEPAGE=437
 CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
@@ -1501,6 +1203,7 @@ CONFIG_JFFS2_RTIME=y
 # CONFIG_CRAMFS is not set
 # CONFIG_VXFS_FS is not set
 # CONFIG_MINIX_FS is not set
+# CONFIG_OMFS_FS is not set
 # CONFIG_HPFS_FS is not set
 # CONFIG_QNX4FS_FS is not set
 # CONFIG_ROMFS_FS is not set
@@ -1509,21 +1212,23 @@ CONFIG_JFFS2_RTIME=y
 CONFIG_NETWORK_FILESYSTEMS=y
 CONFIG_NFS_FS=y
 CONFIG_NFS_V3=y
-# CONFIG_NFS_V3_ACL is not set
-# CONFIG_NFS_V4 is not set
-# CONFIG_NFSD is not set
+CONFIG_NFS_V3_ACL=y
+CONFIG_NFS_V4=y
 CONFIG_ROOT_NFS=y
+# CONFIG_NFSD is not set
 CONFIG_LOCKD=y
 CONFIG_LOCKD_V4=y
+CONFIG_NFS_ACL_SUPPORT=y
 CONFIG_NFS_COMMON=y
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_BIND34 is not set
-# CONFIG_RPCSEC_GSS_KRB5 is not set
+CONFIG_SUNRPC_GSS=y
+CONFIG_RPCSEC_GSS_KRB5=y
 # CONFIG_RPCSEC_GSS_SPKM3 is not set
-# CONFIG_SMB_FS is not set
+CONFIG_SMB_FS=m
+# CONFIG_SMB_NLS_DEFAULT is not set
 CONFIG_CIFS=m
 # CONFIG_CIFS_STATS is not set
-# CONFIG_CIFS_WEAK_PW_HASH is not set
+CONFIG_CIFS_WEAK_PW_HASH=y
 # CONFIG_CIFS_XATTR is not set
 # CONFIG_CIFS_DEBUG2 is not set
 # CONFIG_CIFS_EXPERIMENTAL is not set
@@ -1591,7 +1296,7 @@ CONFIG_NLS_ISO8859_1=m
 # CONFIG_NLS_ISO8859_15 is not set
 # CONFIG_NLS_KOI8_R is not set
 # CONFIG_NLS_KOI8_U is not set
-CONFIG_NLS_UTF8=m
+# CONFIG_NLS_UTF8 is not set
 # CONFIG_DLM is not set
 
 #
@@ -1600,10 +1305,10 @@ CONFIG_NLS_UTF8=m
 # CONFIG_PRINTK_TIME is not set
 CONFIG_ENABLE_WARN_DEPRECATED=y
 CONFIG_ENABLE_MUST_CHECK=y
-CONFIG_FRAME_WARN=0
+CONFIG_FRAME_WARN=1024
 # CONFIG_MAGIC_SYSRQ is not set
 # CONFIG_UNUSED_SYMBOLS is not set
-# CONFIG_DEBUG_FS is not set
+CONFIG_DEBUG_FS=y
 # CONFIG_HEADERS_CHECK is not set
 CONFIG_DEBUG_KERNEL=y
 # CONFIG_DEBUG_SHIRQ is not set
@@ -1612,6 +1317,8 @@ CONFIG_DEBUG_KERNEL=y
 # CONFIG_SCHEDSTATS is not set
 # CONFIG_TIMER_STATS is not set
 # CONFIG_DEBUG_OBJECTS is not set
+# CONFIG_SLUB_DEBUG_ON is not set
+# CONFIG_SLUB_STATS is not set
 # CONFIG_DEBUG_RT_MUTEXES is not set
 # CONFIG_RT_MUTEX_TESTER is not set
 # CONFIG_DEBUG_SPINLOCK is not set
@@ -1622,10 +1329,11 @@ CONFIG_DEBUG_KERNEL=y
 # CONFIG_DEBUG_SPINLOCK_SLEEP is not set
 # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
 # CONFIG_DEBUG_KOBJECT is not set
-# CONFIG_DEBUG_BUGVERBOSE is not set
+CONFIG_DEBUG_BUGVERBOSE=y
 # CONFIG_DEBUG_INFO is not set
 # CONFIG_DEBUG_VM is not set
 # CONFIG_DEBUG_WRITECOUNT is not set
+CONFIG_DEBUG_MEMORY_INIT=y
 # CONFIG_DEBUG_LIST is not set
 # CONFIG_DEBUG_SG is not set
 CONFIG_FRAME_POINTER=y
@@ -1633,9 +1341,19 @@ CONFIG_FRAME_POINTER=y
 # CONFIG_RCU_TORTURE_TEST is not set
 # CONFIG_BACKTRACE_SELF_TEST is not set
 # CONFIG_FAULT_INJECTION is not set
+# CONFIG_LATENCYTOP is not set
+CONFIG_SYSCTL_SYSCALL_CHECK=y
+CONFIG_HAVE_FTRACE=y
+CONFIG_HAVE_DYNAMIC_FTRACE=y
+# CONFIG_FTRACE is not set
+# CONFIG_IRQSOFF_TRACER is not set
+# CONFIG_SCHED_TRACER is not set
+# CONFIG_CONTEXT_SWITCH_TRACER is not set
 # CONFIG_SAMPLES is not set
+CONFIG_HAVE_ARCH_KGDB=y
+# CONFIG_KGDB is not set
 CONFIG_DEBUG_USER=y
-CONFIG_DEBUG_ERRORS=y
+# CONFIG_DEBUG_ERRORS is not set
 # CONFIG_DEBUG_STACK_USAGE is not set
 CONFIG_DEBUG_LL=y
 # CONFIG_DEBUG_ICEDCC is not set
@@ -1651,7 +1369,9 @@ CONFIG_CRYPTO=y
 #
 # Crypto core or helper
 #
-# CONFIG_CRYPTO_MANAGER is not set
+CONFIG_CRYPTO_ALGAPI=y
+CONFIG_CRYPTO_BLKCIPHER=y
+CONFIG_CRYPTO_MANAGER=y
 # CONFIG_CRYPTO_GF128MUL is not set
 # CONFIG_CRYPTO_NULL is not set
 # CONFIG_CRYPTO_CRYPTD is not set
@@ -1668,10 +1388,10 @@ CONFIG_CRYPTO=y
 #
 # Block modes
 #
-# CONFIG_CRYPTO_CBC is not set
+CONFIG_CRYPTO_CBC=y
 # CONFIG_CRYPTO_CTR is not set
 # CONFIG_CRYPTO_CTS is not set
-# CONFIG_CRYPTO_ECB is not set
+CONFIG_CRYPTO_ECB=m
 # CONFIG_CRYPTO_LRW is not set
 # CONFIG_CRYPTO_PCBC is not set
 # CONFIG_CRYPTO_XTS is not set
@@ -1687,8 +1407,12 @@ CONFIG_CRYPTO=y
 #
 # CONFIG_CRYPTO_CRC32C is not set
 # CONFIG_CRYPTO_MD4 is not set
-# CONFIG_CRYPTO_MD5 is not set
-# CONFIG_CRYPTO_MICHAEL_MIC is not set
+CONFIG_CRYPTO_MD5=y
+CONFIG_CRYPTO_MICHAEL_MIC=m
+# CONFIG_CRYPTO_RMD128 is not set
+# CONFIG_CRYPTO_RMD160 is not set
+# CONFIG_CRYPTO_RMD256 is not set
+# CONFIG_CRYPTO_RMD320 is not set
 # CONFIG_CRYPTO_SHA1 is not set
 # CONFIG_CRYPTO_SHA256 is not set
 # CONFIG_CRYPTO_SHA512 is not set
@@ -1698,14 +1422,14 @@ CONFIG_CRYPTO=y
 #
 # Ciphers
 #
-# CONFIG_CRYPTO_AES is not set
+CONFIG_CRYPTO_AES=m
 # CONFIG_CRYPTO_ANUBIS is not set
-# CONFIG_CRYPTO_ARC4 is not set
+CONFIG_CRYPTO_ARC4=m
 # CONFIG_CRYPTO_BLOWFISH is not set
 # CONFIG_CRYPTO_CAMELLIA is not set
 # CONFIG_CRYPTO_CAST5 is not set
 # CONFIG_CRYPTO_CAST6 is not set
-# CONFIG_CRYPTO_DES is not set
+CONFIG_CRYPTO_DES=y
 # CONFIG_CRYPTO_FCRYPT is not set
 # CONFIG_CRYPTO_KHAZAD is not set
 # CONFIG_CRYPTO_SALSA20 is not set
@@ -1727,8 +1451,9 @@ CONFIG_CRYPTO=y
 CONFIG_BITREVERSE=y
 # CONFIG_GENERIC_FIND_FIRST_BIT is not set
 # CONFIG_GENERIC_FIND_NEXT_BIT is not set
-CONFIG_CRC_CCITT=m
+# CONFIG_CRC_CCITT is not set
 # CONFIG_CRC16 is not set
+CONFIG_CRC_T10DIF=y
 # CONFIG_CRC_ITU_T is not set
 CONFIG_CRC32=y
 # CONFIG_CRC7 is not set
similarity index 91%
rename from arch/arm/configs/xm_x270_defconfig
rename to arch/arm/configs/xm_x2xx_defconfig
index aa40d91..f891364 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.25
-# Sun May 11 15:12:52 2008
+# Linux kernel version: 2.6.27-rc8
+# Sun Oct  5 11:05:36 2008
 #
 CONFIG_ARM=y
 CONFIG_SYS_SUPPORTS_APM_EMULATION=y
@@ -12,6 +12,7 @@ CONFIG_MMU=y
 # CONFIG_NO_IOPORT is not set
 CONFIG_GENERIC_HARDIRQS=y
 CONFIG_STACKTRACE_SUPPORT=y
+CONFIG_HAVE_LATENCYTOP_SUPPORT=y
 CONFIG_LOCKDEP_SUPPORT=y
 CONFIG_TRACE_IRQFLAGS_SUPPORT=y
 CONFIG_HARDIRQS_SW_RESEND=y
@@ -24,6 +25,7 @@ CONFIG_GENERIC_CALIBRATE_DELAY=y
 CONFIG_ARCH_SUPPORTS_AOUT=y
 CONFIG_ZONE_DMA=y
 CONFIG_ARCH_MTD_XIP=y
+CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
 CONFIG_VECTORS_BASE=0xffff0000
 CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
 
@@ -62,7 +64,6 @@ CONFIG_SYSCTL=y
 CONFIG_EMBEDDED=y
 CONFIG_UID16=y
 CONFIG_SYSCTL_SYSCALL=y
-CONFIG_SYSCTL_SYSCALL_CHECK=y
 CONFIG_KALLSYMS=y
 # CONFIG_KALLSYMS_ALL is not set
 # CONFIG_KALLSYMS_EXTRA_PASS is not set
@@ -88,14 +89,21 @@ CONFIG_SLUB=y
 # CONFIG_MARKERS is not set
 CONFIG_HAVE_OPROFILE=y
 # CONFIG_KPROBES is not set
+# CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS is not set
+# CONFIG_HAVE_IOREMAP_PROT is not set
 CONFIG_HAVE_KPROBES=y
 CONFIG_HAVE_KRETPROBES=y
+# CONFIG_HAVE_ARCH_TRACEHOOK is not set
 # CONFIG_HAVE_DMA_ATTRS is not set
+# CONFIG_USE_GENERIC_SMP_HELPERS is not set
+CONFIG_HAVE_CLK=y
 # CONFIG_PROC_PAGE_MONITOR is not set
+CONFIG_HAVE_GENERIC_DMA_COHERENT=y
 CONFIG_RT_MUTEXES=y
 # CONFIG_TINY_SHMEM is not set
 CONFIG_BASE_SMALL=0
 CONFIG_MODULES=y
+# CONFIG_MODULE_FORCE_LOAD is not set
 CONFIG_MODULE_UNLOAD=y
 # CONFIG_MODULE_FORCE_UNLOAD is not set
 # CONFIG_MODVERSIONS is not set
@@ -106,6 +114,7 @@ CONFIG_BLOCK=y
 # CONFIG_BLK_DEV_IO_TRACE is not set
 # CONFIG_LSF is not set
 # CONFIG_BLK_DEV_BSG is not set
+# CONFIG_BLK_DEV_INTEGRITY is not set
 
 #
 # IO Schedulers
@@ -131,7 +140,6 @@ CONFIG_CLASSIC_RCU=y
 # CONFIG_ARCH_AT91 is not set
 # CONFIG_ARCH_CLPS7500 is not set
 # CONFIG_ARCH_CLPS711X is not set
-# CONFIG_ARCH_CO285 is not set
 # CONFIG_ARCH_EBSA110 is not set
 # CONFIG_ARCH_EP93XX is not set
 # CONFIG_ARCH_FOOTBRIDGE is not set
@@ -145,8 +153,11 @@ CONFIG_CLASSIC_RCU=y
 # CONFIG_ARCH_IXP2000 is not set
 # CONFIG_ARCH_IXP4XX is not set
 # CONFIG_ARCH_L7200 is not set
+# CONFIG_ARCH_KIRKWOOD is not set
 # CONFIG_ARCH_KS8695 is not set
 # CONFIG_ARCH_NS9XXX is not set
+# CONFIG_ARCH_LOKI is not set
+# CONFIG_ARCH_MV78XX0 is not set
 # CONFIG_ARCH_MXC is not set
 # CONFIG_ARCH_ORION5X is not set
 # CONFIG_ARCH_PNX4008 is not set
@@ -164,26 +175,32 @@ CONFIG_DMABOUNCE=y
 #
 # Intel PXA2xx/PXA3xx Implementations
 #
-
-#
-# Select target boards
-#
 # CONFIG_ARCH_GUMSTIX is not set
 # CONFIG_ARCH_LUBBOCK is not set
 # CONFIG_MACH_LOGICPD_PXA270 is not set
 # CONFIG_MACH_MAINSTONE is not set
+# CONFIG_MACH_MP900C is not set
 # CONFIG_ARCH_PXA_IDP is not set
 # CONFIG_PXA_SHARPSL is not set
+# CONFIG_ARCH_VIPER is not set
 # CONFIG_ARCH_PXA_ESERIES is not set
-# CONFIG_MACH_TRIZEPS4 is not set
+# CONFIG_TRIZEPS_PXA is not set
 CONFIG_MACH_EM_X270=y
 # CONFIG_MACH_COLIBRI is not set
 # CONFIG_MACH_ZYLONITE is not set
 # CONFIG_MACH_LITTLETON is not set
+# CONFIG_MACH_TAVOREVB is not set
+# CONFIG_MACH_SAAR is not set
 CONFIG_MACH_ARMCORE=y
+# CONFIG_MACH_CM_X300 is not set
 # CONFIG_MACH_MAGICIAN is not set
+# CONFIG_MACH_MIOA701 is not set
 # CONFIG_MACH_PCM027 is not set
+# CONFIG_ARCH_PXA_PALM is not set
+# CONFIG_PXA_EZX is not set
+CONFIG_PXA25x=y
 CONFIG_PXA27x=y
+CONFIG_PXA_SSP=y
 # CONFIG_PXA_PWM is not set
 
 #
@@ -253,11 +270,17 @@ CONFIG_TICK_ONESHOT=y
 CONFIG_NO_HZ=y
 # CONFIG_HIGH_RES_TIMERS is not set
 CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
+CONFIG_VMSPLIT_3G=y
+# CONFIG_VMSPLIT_2G is not set
+# CONFIG_VMSPLIT_1G is not set
+CONFIG_PAGE_OFFSET=0xC0000000
 # CONFIG_PREEMPT is not set
 CONFIG_HZ=100
 CONFIG_AEABI=y
 CONFIG_OABI_COMPAT=y
-# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
+CONFIG_ARCH_FLATMEM_HAS_HOLES=y
+# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
+# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
 CONFIG_SELECT_MEMORY_MODEL=y
 CONFIG_FLATMEM_MANUAL=y
 # CONFIG_DISCONTIGMEM_MANUAL is not set
@@ -284,9 +307,10 @@ CONFIG_CMDLINE="root=1f03 mem=32M"
 # CONFIG_KEXEC is not set
 
 #
-# CPU Frequency scaling
+# CPU Power Management
 #
 # CONFIG_CPU_FREQ is not set
+# CONFIG_CPU_IDLE is not set
 
 #
 # Floating point emulation
@@ -316,10 +340,6 @@ CONFIG_SUSPEND=y
 CONFIG_SUSPEND_FREEZER=y
 CONFIG_APM_EMULATION=m
 CONFIG_ARCH_SUSPEND_POSSIBLE=y
-
-#
-# Networking
-#
 CONFIG_NET=y
 
 #
@@ -402,6 +422,7 @@ CONFIG_BT_HIDP=m
 #
 CONFIG_BT_HCIUSB=m
 CONFIG_BT_HCIUSB_SCO=y
+# CONFIG_BT_HCIBTUSB is not set
 # CONFIG_BT_HCIBTSDIO is not set
 # CONFIG_BT_HCIUART is not set
 # CONFIG_BT_HCIBCM203X is not set
@@ -419,6 +440,7 @@ CONFIG_BT_HCIUSB_SCO=y
 #
 # CONFIG_CFG80211 is not set
 CONFIG_WIRELESS_EXT=y
+CONFIG_WIRELESS_EXT_SYSFS=y
 # CONFIG_MAC80211 is not set
 # CONFIG_IEEE80211 is not set
 # CONFIG_RFKILL is not set
@@ -435,6 +457,8 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
 CONFIG_STANDALONE=y
 CONFIG_PREVENT_FIRMWARE_BUILD=y
 CONFIG_FW_LOADER=m
+CONFIG_FIRMWARE_IN_KERNEL=y
+CONFIG_EXTRA_FIRMWARE=""
 # CONFIG_DEBUG_DRIVER is not set
 # CONFIG_DEBUG_DEVRES is not set
 # CONFIG_SYS_HYPERVISOR is not set
@@ -527,6 +551,7 @@ CONFIG_MTD_NAND=y
 # CONFIG_MTD_NAND_ECC_SMC is not set
 # CONFIG_MTD_NAND_MUSEUM_IDS is not set
 # CONFIG_MTD_NAND_H1900 is not set
+CONFIG_MTD_NAND_GPIO=m
 CONFIG_MTD_NAND_IDS=y
 # CONFIG_MTD_NAND_DISKONCHIP is not set
 # CONFIG_MTD_NAND_SHARPSL is not set
@@ -636,6 +661,7 @@ CONFIG_SCSI_LOWLEVEL=y
 # CONFIG_SCSI_DEBUG is not set
 # CONFIG_SCSI_SRP is not set
 # CONFIG_SCSI_LOWLEVEL_PCMCIA is not set
+# CONFIG_SCSI_DH is not set
 CONFIG_ATA=m
 # CONFIG_ATA_NONSTANDARD is not set
 # CONFIG_SATA_PMP is not set
@@ -696,17 +722,21 @@ CONFIG_PATA_PCMCIA=m
 # CONFIG_PATA_VIA is not set
 # CONFIG_PATA_WINBOND is not set
 # CONFIG_PATA_PLATFORM is not set
+# CONFIG_PATA_SCH is not set
 # CONFIG_MD is not set
 # CONFIG_FUSION is not set
 
 #
 # IEEE 1394 (FireWire) support
 #
+
+#
+# Enable only one of the two stacks, unless you know what you are doing
+#
 # CONFIG_FIREWIRE is not set
 # CONFIG_IEEE1394 is not set
 # CONFIG_I2O is not set
 CONFIG_NETDEVICES=y
-# CONFIG_NETDEVICES_MULTIQUEUE is not set
 # CONFIG_DUMMY is not set
 # CONFIG_BONDING is not set
 # CONFIG_MACVLAN is not set
@@ -725,6 +755,7 @@ CONFIG_MII=y
 # CONFIG_SMC91X is not set
 CONFIG_DM9000=y
 CONFIG_DM9000_DEBUGLEVEL=1
+# CONFIG_DM9000_FORCE_SIMPLE_PHY_POLL is not set
 # CONFIG_SMC911X is not set
 # CONFIG_NET_TULIP is not set
 # CONFIG_HP100 is not set
@@ -780,7 +811,6 @@ CONFIG_LIBERTAS_SDIO=m
 # CONFIG_PRISM54 is not set
 # CONFIG_USB_ZD1201 is not set
 # CONFIG_USB_NET_RNDIS_WLAN is not set
-# CONFIG_IWLWIFI is not set
 # CONFIG_IWLWIFI_LEDS is not set
 # CONFIG_HOSTAP is not set
 
@@ -853,17 +883,18 @@ CONFIG_INPUT_TOUCHSCREEN=y
 # CONFIG_TOUCHSCREEN_GUNZE is not set
 # CONFIG_TOUCHSCREEN_ELO is not set
 # CONFIG_TOUCHSCREEN_MTOUCH is not set
+# CONFIG_TOUCHSCREEN_INEXIO is not set
 # CONFIG_TOUCHSCREEN_MK712 is not set
 # CONFIG_TOUCHSCREEN_PENMOUNT is not set
 # CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
 # CONFIG_TOUCHSCREEN_TOUCHWIN is not set
-CONFIG_TOUCHSCREEN_UCB1400=m
 CONFIG_TOUCHSCREEN_WM97XX=m
 # CONFIG_TOUCHSCREEN_WM9705 is not set
 CONFIG_TOUCHSCREEN_WM9712=y
 # CONFIG_TOUCHSCREEN_WM9713 is not set
 # CONFIG_TOUCHSCREEN_WM97XX_MAINSTONE is not set
 # CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
+# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set
 # CONFIG_INPUT_MISC is not set
 
 #
@@ -880,6 +911,7 @@ CONFIG_SERIO_LIBPS2=y
 # Character devices
 #
 CONFIG_VT=y
+CONFIG_CONSOLE_TRANSLATIONS=y
 CONFIG_VT_CONSOLE=y
 CONFIG_HW_CONSOLE=y
 # CONFIG_VT_HW_CONSOLE_BINDING is not set
@@ -922,45 +954,66 @@ CONFIG_DEVPORT=y
 CONFIG_I2C=y
 CONFIG_I2C_BOARDINFO=y
 CONFIG_I2C_CHARDEV=m
+CONFIG_I2C_HELPER_AUTO=y
 
 #
 # I2C Hardware Bus support
 #
+
+#
+# PC SMBus host controller drivers
+#
 # CONFIG_I2C_ALI1535 is not set
 # CONFIG_I2C_ALI1563 is not set
 # CONFIG_I2C_ALI15X3 is not set
 # CONFIG_I2C_AMD756 is not set
 # CONFIG_I2C_AMD8111 is not set
-# CONFIG_I2C_GPIO is not set
 # CONFIG_I2C_I801 is not set
-# CONFIG_I2C_I810 is not set
-CONFIG_I2C_PXA=y
-# CONFIG_I2C_PXA_SLAVE is not set
+# CONFIG_I2C_ISCH is not set
 # CONFIG_I2C_PIIX4 is not set
 # CONFIG_I2C_NFORCE2 is not set
-# CONFIG_I2C_OCORES is not set
-# CONFIG_I2C_PARPORT_LIGHT is not set
-# CONFIG_I2C_PROSAVAGE is not set
-# CONFIG_I2C_SAVAGE4 is not set
-# CONFIG_I2C_SIMTEC is not set
 # CONFIG_I2C_SIS5595 is not set
 # CONFIG_I2C_SIS630 is not set
 # CONFIG_I2C_SIS96X is not set
-# CONFIG_I2C_TAOS_EVM is not set
-# CONFIG_I2C_STUB is not set
-# CONFIG_I2C_TINY_USB is not set
 # CONFIG_I2C_VIA is not set
 # CONFIG_I2C_VIAPRO is not set
+
+#
+# I2C system bus drivers (mostly embedded / system-on-chip)
+#
+# CONFIG_I2C_GPIO is not set
+# CONFIG_I2C_OCORES is not set
+CONFIG_I2C_PXA=y
+# CONFIG_I2C_PXA_SLAVE is not set
+# CONFIG_I2C_SIMTEC is not set
+
+#
+# External I2C/SMBus adapter drivers
+#
+# CONFIG_I2C_PARPORT_LIGHT is not set
+# CONFIG_I2C_TAOS_EVM is not set
+# CONFIG_I2C_TINY_USB is not set
+
+#
+# Graphics adapter I2C/DDC channel drivers
+#
 # CONFIG_I2C_VOODOO3 is not set
+
+#
+# Other I2C/SMBus bus drivers
+#
 # CONFIG_I2C_PCA_PLATFORM is not set
+# CONFIG_I2C_STUB is not set
 
 #
 # Miscellaneous I2C Chip support
 #
 # CONFIG_DS1682 is not set
+# CONFIG_AT24 is not set
 # CONFIG_SENSORS_EEPROM is not set
 # CONFIG_SENSORS_PCF8574 is not set
 # CONFIG_PCF8575 is not set
+# CONFIG_SENSORS_PCA9539 is not set
 # CONFIG_SENSORS_PCF8591 is not set
 # CONFIG_TPS65010 is not set
 # CONFIG_SENSORS_MAX6875 is not set
@@ -970,25 +1023,31 @@ CONFIG_I2C_PXA=y
 # CONFIG_I2C_DEBUG_BUS is not set
 # CONFIG_I2C_DEBUG_CHIP is not set
 # CONFIG_SPI is not set
-CONFIG_HAVE_GPIO_LIB=y
-
-#
-# GPIO Support
-#
+CONFIG_ARCH_REQUIRE_GPIOLIB=y
+CONFIG_GPIOLIB=y
 # CONFIG_DEBUG_GPIO is not set
+# CONFIG_GPIO_SYSFS is not set
 
 #
 # I2C GPIO expanders:
 #
+# CONFIG_GPIO_MAX732X is not set
 # CONFIG_GPIO_PCA953X is not set
 # CONFIG_GPIO_PCF857X is not set
 
 #
+# PCI GPIO expanders:
+#
+# CONFIG_GPIO_BT8XX is not set
+
+#
 # SPI GPIO expanders:
 #
 # CONFIG_W1 is not set
 # CONFIG_POWER_SUPPLY is not set
 # CONFIG_HWMON is not set
+# CONFIG_THERMAL is not set
+# CONFIG_THERMAL_HWMON is not set
 # CONFIG_WATCHDOG is not set
 
 #
@@ -1000,10 +1059,16 @@ CONFIG_SSB_POSSIBLE=y
 #
 # Multifunction device drivers
 #
+# CONFIG_MFD_CORE is not set
 # CONFIG_MFD_SM501 is not set
 # CONFIG_MFD_ASIC3 is not set
 # CONFIG_HTC_EGPIO is not set
 # CONFIG_HTC_PASIC3 is not set
+# CONFIG_UCB1400_CORE is not set
+# CONFIG_MFD_TMIO is not set
+# CONFIG_MFD_T7L66XB is not set
+# CONFIG_MFD_TC6387XB is not set
+# CONFIG_MFD_TC6393XB is not set
 
 #
 # Multimedia devices
@@ -1014,6 +1079,7 @@ CONFIG_SSB_POSSIBLE=y
 #
 # CONFIG_VIDEO_DEV is not set
 # CONFIG_DVB_CORE is not set
+# CONFIG_VIDEO_MEDIA is not set
 
 #
 # Multimedia drivers
@@ -1038,7 +1104,6 @@ CONFIG_FB_CFB_IMAGEBLIT=y
 # CONFIG_FB_SYS_IMAGEBLIT is not set
 # CONFIG_FB_FOREIGN_ENDIAN is not set
 # CONFIG_FB_SYS_FOPS is not set
-CONFIG_FB_DEFERRED_IO=y
 # CONFIG_FB_SVGALIB is not set
 # CONFIG_FB_MACMODES is not set
 # CONFIG_FB_BACKLIGHT is not set
@@ -1071,12 +1136,14 @@ CONFIG_FB_DEFERRED_IO=y
 # CONFIG_FB_TRIDENT is not set
 # CONFIG_FB_ARK is not set
 # CONFIG_FB_PM3 is not set
+# CONFIG_FB_CARMINE is not set
 CONFIG_FB_PXA=y
 # CONFIG_FB_PXA_SMARTPANEL is not set
 CONFIG_FB_PXA_PARAMETERS=y
 CONFIG_FB_MBX=m
-# CONFIG_FB_AM200EPD is not set
+# CONFIG_FB_W100 is not set
 # CONFIG_FB_VIRTUAL is not set
+# CONFIG_FB_METRONOME is not set
 # CONFIG_BACKLIGHT_LCD_SUPPORT is not set
 
 #
@@ -1099,15 +1166,7 @@ CONFIG_LOGO=y
 CONFIG_LOGO_LINUX_MONO=y
 CONFIG_LOGO_LINUX_VGA16=y
 CONFIG_LOGO_LINUX_CLUT224=y
-
-#
-# Sound
-#
 CONFIG_SOUND=m
-
-#
-# Advanced Linux Sound Architecture
-#
 CONFIG_SND=m
 CONFIG_SND_TIMER=m
 CONFIG_SND_PCM=m
@@ -1121,19 +1180,15 @@ CONFIG_SND_SUPPORT_OLD_API=y
 CONFIG_SND_VERBOSE_PROCFS=y
 # CONFIG_SND_VERBOSE_PRINTK is not set
 # CONFIG_SND_DEBUG is not set
-
-#
-# Generic devices
-#
+CONFIG_SND_VMASTER=y
 CONFIG_SND_AC97_CODEC=m
+CONFIG_SND_DRIVERS=y
 # CONFIG_SND_DUMMY is not set
 # CONFIG_SND_MTPAV is not set
 # CONFIG_SND_SERIAL_U16550 is not set
 # CONFIG_SND_MPU401 is not set
-
-#
-# PCI devices
-#
+# CONFIG_SND_AC97_POWER_SAVE is not set
+CONFIG_SND_PCI=y
 # CONFIG_SND_AD1889 is not set
 # CONFIG_SND_ALS300 is not set
 # CONFIG_SND_ALI5451 is not set
@@ -1193,42 +1248,16 @@ CONFIG_SND_AC97_CODEC=m
 # CONFIG_SND_VIRTUOSO is not set
 # CONFIG_SND_VX222 is not set
 # CONFIG_SND_YMFPCI is not set
-# CONFIG_SND_AC97_POWER_SAVE is not set
-
-#
-# ALSA ARM devices
-#
+CONFIG_SND_ARM=y
 CONFIG_SND_PXA2XX_PCM=m
 CONFIG_SND_PXA2XX_AC97=m
-
-#
-# USB devices
-#
+CONFIG_SND_USB=y
 # CONFIG_SND_USB_AUDIO is not set
 # CONFIG_SND_USB_CAIAQ is not set
-
-#
-# PCMCIA devices
-#
+CONFIG_SND_PCMCIA=y
 # CONFIG_SND_VXPOCKET is not set
 # CONFIG_SND_PDAUDIOCF is not set
-
-#
-# System on Chip audio support
-#
 # CONFIG_SND_SOC is not set
-
-#
-# ALSA SoC audio for Freescale SOCs
-#
-
-#
-# SoC Audio for the Texas Instruments OMAP
-#
-
-#
-# Open Sound System
-#
 # CONFIG_SOUND_PRIME is not set
 CONFIG_AC97_BUS=m
 CONFIG_HID_SUPPORT=y
@@ -1261,12 +1290,15 @@ CONFIG_USB_DEVICEFS=y
 # CONFIG_USB_OTG is not set
 # CONFIG_USB_OTG_WHITELIST is not set
 # CONFIG_USB_OTG_BLACKLIST_HUB is not set
+CONFIG_USB_MON=y
 
 #
 # USB Host Controller Drivers
 #
+# CONFIG_USB_C67X00_HCD is not set
 # CONFIG_USB_EHCI_HCD is not set
 # CONFIG_USB_ISP116X_HCD is not set
+# CONFIG_USB_ISP1760_HCD is not set
 CONFIG_USB_OHCI_HCD=y
 # CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
 # CONFIG_USB_OHCI_BIG_ENDIAN_MMIO is not set
@@ -1274,12 +1306,14 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y
 # CONFIG_USB_UHCI_HCD is not set
 # CONFIG_USB_SL811_HCD is not set
 # CONFIG_USB_R8A66597_HCD is not set
+# CONFIG_USB_MUSB_HDRC is not set
 
 #
 # USB Device Class drivers
 #
 # CONFIG_USB_ACM is not set
 # CONFIG_USB_PRINTER is not set
+# CONFIG_USB_WDM is not set
 
 #
 # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
@@ -1309,7 +1343,6 @@ CONFIG_USB_STORAGE=y
 #
 # CONFIG_USB_MDC800 is not set
 # CONFIG_USB_MICROTEK is not set
-CONFIG_USB_MON=y
 
 #
 # USB port drivers
@@ -1322,7 +1355,6 @@ CONFIG_USB_MON=y
 # CONFIG_USB_EMI62 is not set
 # CONFIG_USB_EMI26 is not set
 # CONFIG_USB_ADUTUX is not set
-# CONFIG_USB_AUERSWALD is not set
 # CONFIG_USB_RIO500 is not set
 # CONFIG_USB_LEGOTOWER is not set
 # CONFIG_USB_LCD is not set
@@ -1338,6 +1370,7 @@ CONFIG_USB_MON=y
 # CONFIG_USB_TRANCEVIBRATOR is not set
 # CONFIG_USB_IOWARRIOR is not set
 # CONFIG_USB_TEST is not set
+# CONFIG_USB_ISIGHTFW is not set
 # CONFIG_USB_GADGET is not set
 CONFIG_MMC=m
 # CONFIG_MMC_DEBUG is not set
@@ -1349,6 +1382,7 @@ CONFIG_MMC=m
 CONFIG_MMC_BLOCK=m
 CONFIG_MMC_BLOCK_BOUNCE=y
 # CONFIG_SDIO_UART is not set
+# CONFIG_MMC_TEST is not set
 
 #
 # MMC/SD Host Controller Drivers
@@ -1356,14 +1390,19 @@ CONFIG_MMC_BLOCK_BOUNCE=y
 CONFIG_MMC_PXA=m
 # CONFIG_MMC_SDHCI is not set
 # CONFIG_MMC_TIFM_SD is not set
+# CONFIG_MMC_SDRICOH_CS is not set
+# CONFIG_MEMSTICK is not set
+# CONFIG_ACCESSIBILITY is not set
 CONFIG_NEW_LEDS=y
 CONFIG_LEDS_CLASS=y
 
 #
 # LED drivers
 #
+# CONFIG_LEDS_PCA9532 is not set
 # CONFIG_LEDS_GPIO is not set
 CONFIG_LEDS_CM_X270=y
+# CONFIG_LEDS_PCA955X is not set
 
 #
 # LED Triggers
@@ -1401,6 +1440,7 @@ CONFIG_RTC_INTF_DEV=y
 # CONFIG_RTC_DRV_PCF8583 is not set
 # CONFIG_RTC_DRV_M41T80 is not set
 # CONFIG_RTC_DRV_S35390A is not set
+# CONFIG_RTC_DRV_FM3130 is not set
 
 #
 # SPI RTC drivers
@@ -1422,6 +1462,15 @@ CONFIG_RTC_DRV_V3020=y
 # on-CPU RTC drivers
 #
 CONFIG_RTC_DRV_SA1100=y
+# CONFIG_DMADEVICES is not set
+
+#
+# Voltage and Current regulators
+#
+# CONFIG_REGULATOR is not set
+# CONFIG_REGULATOR_FIXED_VOLTAGE is not set
+# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set
+# CONFIG_REGULATOR_BQ24022 is not set
 # CONFIG_UIO is not set
 
 #
@@ -1501,6 +1550,7 @@ CONFIG_JFFS2_RTIME=y
 # CONFIG_CRAMFS is not set
 # CONFIG_VXFS_FS is not set
 # CONFIG_MINIX_FS is not set
+# CONFIG_OMFS_FS is not set
 # CONFIG_HPFS_FS is not set
 # CONFIG_QNX4FS_FS is not set
 # CONFIG_ROMFS_FS is not set
@@ -1511,13 +1561,12 @@ CONFIG_NFS_FS=y
 CONFIG_NFS_V3=y
 # CONFIG_NFS_V3_ACL is not set
 # CONFIG_NFS_V4 is not set
-# CONFIG_NFSD is not set
 CONFIG_ROOT_NFS=y
+# CONFIG_NFSD is not set
 CONFIG_LOCKD=y
 CONFIG_LOCKD_V4=y
 CONFIG_NFS_COMMON=y
 CONFIG_SUNRPC=y
-# CONFIG_SUNRPC_BIND34 is not set
 # CONFIG_RPCSEC_GSS_KRB5 is not set
 # CONFIG_RPCSEC_GSS_SPKM3 is not set
 # CONFIG_SMB_FS is not set
@@ -1626,6 +1675,7 @@ CONFIG_DEBUG_KERNEL=y
 # CONFIG_DEBUG_INFO is not set
 # CONFIG_DEBUG_VM is not set
 # CONFIG_DEBUG_WRITECOUNT is not set
+# CONFIG_DEBUG_MEMORY_INIT is not set
 # CONFIG_DEBUG_LIST is not set
 # CONFIG_DEBUG_SG is not set
 CONFIG_FRAME_POINTER=y
@@ -1633,7 +1683,17 @@ CONFIG_FRAME_POINTER=y
 # CONFIG_RCU_TORTURE_TEST is not set
 # CONFIG_BACKTRACE_SELF_TEST is not set
 # CONFIG_FAULT_INJECTION is not set
+# CONFIG_LATENCYTOP is not set
+CONFIG_SYSCTL_SYSCALL_CHECK=y
+CONFIG_HAVE_FTRACE=y
+CONFIG_HAVE_DYNAMIC_FTRACE=y
+# CONFIG_FTRACE is not set
+# CONFIG_IRQSOFF_TRACER is not set
+# CONFIG_SCHED_TRACER is not set
+# CONFIG_CONTEXT_SWITCH_TRACER is not set
 # CONFIG_SAMPLES is not set
+CONFIG_HAVE_ARCH_KGDB=y
+# CONFIG_KGDB is not set
 CONFIG_DEBUG_USER=y
 CONFIG_DEBUG_ERRORS=y
 # CONFIG_DEBUG_STACK_USAGE is not set
@@ -1689,6 +1749,10 @@ CONFIG_CRYPTO=y
 # CONFIG_CRYPTO_MD4 is not set
 # CONFIG_CRYPTO_MD5 is not set
 # CONFIG_CRYPTO_MICHAEL_MIC is not set
+# CONFIG_CRYPTO_RMD128 is not set
+# CONFIG_CRYPTO_RMD160 is not set
+# CONFIG_CRYPTO_RMD256 is not set
+# CONFIG_CRYPTO_RMD320 is not set
 # CONFIG_CRYPTO_SHA1 is not set
 # CONFIG_CRYPTO_SHA256 is not set
 # CONFIG_CRYPTO_SHA512 is not set
@@ -1729,6 +1793,7 @@ CONFIG_BITREVERSE=y
 # CONFIG_GENERIC_FIND_NEXT_BIT is not set
 CONFIG_CRC_CCITT=m
 # CONFIG_CRC16 is not set
+# CONFIG_CRC_T10DIF is not set
 # CONFIG_CRC_ITU_T is not set
 CONFIG_CRC32=y
 # CONFIG_CRC7 is not set
index e8ee7ec..4618f7c 100644 (file)
@@ -49,6 +49,10 @@ config MACH_MAINSTONE
        select PXA27x
        select HAVE_PWM
 
+config MACH_MP900C
+       bool "Nec Mobilepro 900/c"
+       select PXA25x
+
 config ARCH_PXA_IDP
        bool "Accelent Xscale IDP"
        select PXA25x
@@ -189,6 +193,7 @@ config MACH_COLIBRI
 config MACH_ZYLONITE
        bool "PXA3xx Development Platform (aka Zylonite)"
        select PXA3xx
+       select PXA_SSP
        select HAVE_PWM
 
 config MACH_LITTLETON
@@ -207,15 +212,34 @@ config MACH_SAAR
        select PXA930
 
 config MACH_ARMCORE
-       bool "CompuLab CM-X270 modules"
+       bool "CompuLab CM-X255/CM-X270 modules"
        select PXA27x
        select IWMMXT
+       select PXA25x
+       select PXA_SSP
+
+config MACH_CM_X300
+       bool "CompuLab CM-X300 modules"
+       select PXA3xx
+       select CPU_PXA300
 
 config MACH_MAGICIAN
        bool "Enable HTC Magician Support"
        select PXA27x
        select IWMMXT
 
+config MACH_MIOA701
+       bool "Mitac Mio A701 Support"
+       select PXA27x
+       select IWMMXT
+       select LEDS_GPIO
+       select HAVE_PWM
+       select GPIO_SYSFS
+       help
+         Say Y here if you intend to run this kernel on a
+         MIO A701. Currently there is only basic support
+         for this PDA.
+
 config MACH_PCM027
        bool "Phytec phyCORE-PXA270 CPU module (PCM-027)"
        select PXA27x
@@ -256,6 +280,9 @@ config PCM990_DISPLAY_NONE
 
 endchoice
 
+config MACH_AM200EPD
+       depends on MACH_GUMSTIX_F
+       bool "Enable AM200EPD board support"
 
 config PXA_EZX
        bool "Motorola EZX Platform"
index fbedaaf..3b94546 100644 (file)
@@ -22,9 +22,11 @@ obj-$(CONFIG_CPU_PXA930)     += pxa930.o
 
 # Specific board support
 obj-$(CONFIG_ARCH_GUMSTIX)     += gumstix.o
+obj-$(CONFIG_MACH_AM200EPD)    += am200epd.o
 obj-$(CONFIG_ARCH_LUBBOCK)     += lubbock.o
 obj-$(CONFIG_MACH_LOGICPD_PXA270) += lpd270.o
 obj-$(CONFIG_MACH_MAINSTONE)   += mainstone.o
+obj-$(CONFIG_MACH_MP900C)      += mp900.o
 obj-$(CONFIG_ARCH_PXA_IDP)     += idp.o
 obj-$(CONFIG_MACH_TRIZEPS4)    += trizeps4.o
 obj-$(CONFIG_MACH_COLIBRI)     += colibri.o
@@ -36,6 +38,7 @@ obj-$(CONFIG_MACH_PCM990_BASEBOARD)   += pcm990-baseboard.o
 obj-$(CONFIG_MACH_TOSA)                += tosa.o
 obj-$(CONFIG_MACH_EM_X270)     += em-x270.o
 obj-$(CONFIG_MACH_MAGICIAN)    += magician.o
+obj-$(CONFIG_MACH_MIOA701)     += mioa701.o mioa701_bootresume.o
 obj-$(CONFIG_ARCH_PXA_ESERIES) += eseries.o eseries_udc.o
 obj-$(CONFIG_MACH_E740)                += e740_lcd.o
 obj-$(CONFIG_MACH_E750)                += e750_lcd.o
@@ -52,7 +55,8 @@ obj-$(CONFIG_MACH_LITTLETON)  += littleton.o
 obj-$(CONFIG_MACH_TAVOREVB)    += tavorevb.o
 obj-$(CONFIG_MACH_SAAR)                += saar.o
 
-obj-$(CONFIG_MACH_ARMCORE)      += cm-x270.o
+obj-$(CONFIG_MACH_ARMCORE)      += cm-x2xx.o cm-x255.o cm-x270.o
+obj-$(CONFIG_MACH_CM_X300)      += cm-x300.o
 obj-$(CONFIG_PXA_EZX)           += ezx.o
 
 # Support for blinky lights
@@ -65,7 +69,7 @@ led-$(CONFIG_MACH_TRIZEPS4)   += leds-trizeps4.o
 obj-$(CONFIG_LEDS)             += $(led-y)
 
 ifeq ($(CONFIG_PCI),y)
-obj-$(CONFIG_MACH_ARMCORE) += cm-x270-pci.o
+obj-$(CONFIG_MACH_ARMCORE) += cm-x2xx-pci.o
 endif
 
 obj-$(CONFIG_TOSA_BT)          += tosa-bt.o
diff --git a/arch/arm/mach-pxa/am200epd.c b/arch/arm/mach-pxa/am200epd.c
new file mode 100644 (file)
index 0000000..b965085
--- /dev/null
@@ -0,0 +1,374 @@
+/*
+ * am200epd.c -- Platform device for AM200 EPD kit
+ *
+ * Copyright (C) 2008, Jaya Kumar
+ *
+ * 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.
+ *
+ * Layout is based on skeletonfb.c by James Simmons and Geert Uytterhoeven.
+ *
+ * This work was made possible by help and equipment support from E-Ink
+ * Corporation. http://support.eink.com/community
+ *
+ * This driver is written to be used with the Metronome display controller.
+ * on the AM200 EPD prototype kit/development kit with an E-Ink 800x600
+ * Vizplex EPD on a Gumstix board using the Lyre interface board.
+ *
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/string.h>
+#include <linux/delay.h>
+#include <linux/interrupt.h>
+#include <linux/fb.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <linux/irq.h>
+#include <linux/gpio.h>
+
+#include <mach/pxafb.h>
+
+#include <video/metronomefb.h>
+
+static unsigned int panel_type = 6;
+static struct platform_device *am200_device;
+static struct metronome_board am200_board;
+
+static struct pxafb_mode_info am200_fb_mode_9inch7 = {
+       .pixclock       = 40000,
+       .xres           = 1200,
+       .yres           = 842,
+       .bpp            = 16,
+       .hsync_len      = 2,
+       .left_margin    = 2,
+       .right_margin   = 2,
+       .vsync_len      = 1,
+       .upper_margin   = 2,
+       .lower_margin   = 25,
+       .sync           = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+};
+
+static struct pxafb_mode_info am200_fb_mode_8inch = {
+       .pixclock       = 40000,
+       .xres           = 1088,
+       .yres           = 791,
+       .bpp            = 16,
+       .hsync_len      = 28,
+       .left_margin    = 8,
+       .right_margin   = 30,
+       .vsync_len      = 8,
+       .upper_margin   = 10,
+       .lower_margin   = 8,
+       .sync           = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+};
+
+static struct pxafb_mode_info am200_fb_mode_6inch = {
+       .pixclock       = 40189,
+       .xres           = 832,
+       .yres           = 622,
+       .bpp            = 16,
+       .hsync_len      = 28,
+       .left_margin    = 34,
+       .right_margin   = 34,
+       .vsync_len      = 25,
+       .upper_margin   = 0,
+       .lower_margin   = 2,
+       .sync           = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
+};
+
+static struct pxafb_mach_info am200_fb_info = {
+       .modes          = &am200_fb_mode_6inch,
+       .num_modes      = 1,
+       .lcd_conn       = LCD_TYPE_COLOR_TFT | LCD_PCLK_EDGE_FALL |
+                         LCD_AC_BIAS_FREQ(24),
+};
+
+/* register offsets for gpio control */
+#define LED_GPIO_PIN 51
+#define STDBY_GPIO_PIN 48
+#define RST_GPIO_PIN 49
+#define RDY_GPIO_PIN 32
+#define ERR_GPIO_PIN 17
+#define PCBPWR_GPIO_PIN 16
+static int gpios[] = { LED_GPIO_PIN , STDBY_GPIO_PIN , RST_GPIO_PIN,
+                       RDY_GPIO_PIN, ERR_GPIO_PIN, PCBPWR_GPIO_PIN };
+static char *gpio_names[] = { "LED" , "STDBY" , "RST", "RDY", "ERR", "PCBPWR" };
+
+static int am200_init_gpio_regs(struct metronomefb_par *par)
+{
+       int i;
+       int err;
+
+       for (i = 0; i < ARRAY_SIZE(gpios); i++) {
+               err = gpio_request(gpios[i], gpio_names[i]);
+               if (err) {
+                       dev_err(&am200_device->dev, "failed requesting "
+                               "gpio %s, err=%d\n", gpio_names[i], err);
+                       goto err_req_gpio;
+               }
+       }
+
+       gpio_direction_output(LED_GPIO_PIN, 0);
+       gpio_direction_output(STDBY_GPIO_PIN, 0);
+       gpio_direction_output(RST_GPIO_PIN, 0);
+
+       gpio_direction_input(RDY_GPIO_PIN);
+       gpio_direction_input(ERR_GPIO_PIN);
+
+       gpio_direction_output(PCBPWR_GPIO_PIN, 0);
+
+       return 0;
+
+err_req_gpio:
+       while (i > 0)
+               gpio_free(gpios[i--]);
+
+       return err;
+}
+
+static void am200_cleanup(struct metronomefb_par *par)
+{
+       int i;
+
+       free_irq(IRQ_GPIO(RDY_GPIO_PIN), par);
+
+       for (i = 0; i < ARRAY_SIZE(gpios); i++)
+               gpio_free(gpios[i]);
+}
+
+static int am200_share_video_mem(struct fb_info *info)
+{
+       /* rough check if this is our desired fb and not something else */
+       if ((info->var.xres != am200_fb_info.modes->xres)
+               || (info->var.yres != am200_fb_info.modes->yres))
+               return 0;
+
+       /* we've now been notified that we have our new fb */
+       am200_board.metromem = info->screen_base;
+       am200_board.host_fbinfo = info;
+
+       /* try to refcount host drv since we are the consumer after this */
+       if (!try_module_get(info->fbops->owner))
+               return -ENODEV;
+
+       return 0;
+}
+
+static int am200_unshare_video_mem(struct fb_info *info)
+{
+       dev_dbg(&am200_device->dev, "ENTER %s\n", __func__);
+
+       if (info != am200_board.host_fbinfo)
+               return 0;
+
+       module_put(am200_board.host_fbinfo->fbops->owner);
+       return 0;
+}
+
+static int am200_fb_notifier_callback(struct notifier_block *self,
+                                unsigned long event, void *data)
+{
+       struct fb_event *evdata = data;
+       struct fb_info *info = evdata->info;
+
+       dev_dbg(&am200_device->dev, "ENTER %s\n", __func__);
+
+       if (event == FB_EVENT_FB_REGISTERED)
+               return am200_share_video_mem(info);
+       else if (event == FB_EVENT_FB_UNREGISTERED)
+               return am200_unshare_video_mem(info);
+
+       return 0;
+}
+
+static struct notifier_block am200_fb_notif = {
+       .notifier_call = am200_fb_notifier_callback,
+};
+
+/* this gets called as part of our init. these steps must be done now so
+ * that we can use set_pxa_fb_info */
+static void __init am200_presetup_fb(void)
+{
+       int fw;
+       int fh;
+       int padding_size;
+       int totalsize;
+
+       switch (panel_type) {
+       case 6:
+               am200_fb_info.modes = &am200_fb_mode_6inch;
+               break;
+       case 8:
+               am200_fb_info.modes = &am200_fb_mode_8inch;
+               break;
+       case 97:
+               am200_fb_info.modes = &am200_fb_mode_9inch7;
+               break;
+       default:
+               dev_err(&am200_device->dev, "invalid panel_type selection,"
+                                               " setting to 6\n");
+               am200_fb_info.modes = &am200_fb_mode_6inch;
+               break;
+       }
+
+       /* the frame buffer is divided as follows:
+       command | CRC | padding
+       16kb waveform data | CRC | padding
+       image data | CRC
+       */
+
+       fw = am200_fb_info.modes->xres;
+       fh = am200_fb_info.modes->yres;
+
+       /* waveform must be 16k + 2 for checksum */
+       am200_board.wfm_size = roundup(16*1024 + 2, fw);
+
+       padding_size = PAGE_SIZE + (4 * fw);
+
+       /* total is 1 cmd , 1 wfm, padding and image */
+       totalsize = fw + am200_board.wfm_size + padding_size + (fw*fh);
+
+       /* save this off because we're manipulating fw after this and
+        * we'll need it when we're ready to setup the framebuffer */
+       am200_board.fw = fw;
+       am200_board.fh = fh;
+
+       /* the reason we do this adjustment is because we want to acquire
+        * more framebuffer memory without imposing custom awareness on the
+        * underlying pxafb driver */
+       am200_fb_info.modes->yres = DIV_ROUND_UP(totalsize, fw);
+
+       /* we divide since we told the LCD controller we're 16bpp */
+       am200_fb_info.modes->xres /= 2;
+
+       set_pxa_fb_info(&am200_fb_info);
+
+}
+
+/* this gets called by metronomefb as part of its init, in our case, we
+ * have already completed initial framebuffer init in presetup_fb so we
+ * can just setup the fb access pointers */
+static int am200_setup_fb(struct metronomefb_par *par)
+{
+       int fw;
+       int fh;
+
+       fw = am200_board.fw;
+       fh = am200_board.fh;
+
+       /* metromem was set up by the notifier in share_video_mem so now
+        * we can use its value to calculate the other entries */
+       par->metromem_cmd = (struct metromem_cmd *) am200_board.metromem;
+       par->metromem_wfm = am200_board.metromem + fw;
+       par->metromem_img = par->metromem_wfm + am200_board.wfm_size;
+       par->metromem_img_csum = (u16 *) (par->metromem_img + (fw * fh));
+       par->metromem_dma = am200_board.host_fbinfo->fix.smem_start;
+
+       return 0;
+}
+
+static int am200_get_panel_type(void)
+{
+       return panel_type;
+}
+
+static irqreturn_t am200_handle_irq(int irq, void *dev_id)
+{
+       struct metronomefb_par *par = dev_id;
+
+       wake_up_interruptible(&par->waitq);
+       return IRQ_HANDLED;
+}
+
+static int am200_setup_irq(struct fb_info *info)
+{
+       int ret;
+
+       ret = request_irq(IRQ_GPIO(RDY_GPIO_PIN), am200_handle_irq,
+                               IRQF_DISABLED|IRQF_TRIGGER_FALLING,
+                               "AM200", info->par);
+       if (ret)
+               dev_err(&am200_device->dev, "request_irq failed: %d\n", ret);
+
+       return ret;
+}
+
+static void am200_set_rst(struct metronomefb_par *par, int state)
+{
+       gpio_set_value(RST_GPIO_PIN, state);
+}
+
+static void am200_set_stdby(struct metronomefb_par *par, int state)
+{
+       gpio_set_value(STDBY_GPIO_PIN, state);
+}
+
+static int am200_wait_event(struct metronomefb_par *par)
+{
+       return wait_event_timeout(par->waitq, gpio_get_value(RDY_GPIO_PIN), HZ);
+}
+
+static int am200_wait_event_intr(struct metronomefb_par *par)
+{
+       return wait_event_interruptible_timeout(par->waitq,
+                                       gpio_get_value(RDY_GPIO_PIN), HZ);
+}
+
+static struct metronome_board am200_board = {
+       .owner                  = THIS_MODULE,
+       .setup_irq              = am200_setup_irq,
+       .setup_io               = am200_init_gpio_regs,
+       .setup_fb               = am200_setup_fb,
+       .set_rst                = am200_set_rst,
+       .set_stdby              = am200_set_stdby,
+       .met_wait_event         = am200_wait_event,
+       .met_wait_event_intr    = am200_wait_event_intr,
+       .get_panel_type         = am200_get_panel_type,
+       .cleanup                = am200_cleanup,
+};
+
+static int __init am200_init(void)
+{
+       int ret;
+
+       /* before anything else, we request notification for any fb
+        * creation events */
+       fb_register_client(&am200_fb_notif);
+
+       /* request our platform independent driver */
+       request_module("metronomefb");
+
+       am200_device = platform_device_alloc("metronomefb", -1);
+       if (!am200_device)
+               return -ENOMEM;
+
+       /* the am200_board that will be seen by metronomefb is a copy */
+       platform_device_add_data(am200_device, &am200_board,
+                                       sizeof(am200_board));
+
+       /* this _add binds metronomefb to am200. metronomefb refcounts am200 */
+       ret = platform_device_add(am200_device);
+
+       if (ret) {
+               platform_device_put(am200_device);
+               fb_unregister_client(&am200_fb_notif);
+               return ret;
+       }
+
+       am200_presetup_fb();
+
+       return 0;
+}
+
+module_param(panel_type, uint, 0);
+MODULE_PARM_DESC(panel_type, "Select the panel type: 6, 8, 97");
+
+module_init(am200_init);
+
+MODULE_DESCRIPTION("board driver for am200 metronome epd kit");
+MODULE_AUTHOR("Jaya Kumar");
+MODULE_LICENSE("GPL");
diff --git a/arch/arm/mach-pxa/cm-x255.c b/arch/arm/mach-pxa/cm-x255.c
new file mode 100644 (file)
index 0000000..83a4cdf
--- /dev/null
@@ -0,0 +1,258 @@
+/*
+ * linux/arch/arm/mach-pxa/cm-x255.c
+ *
+ * Copyright (C) 2007, 2008 CompuLab, Ltd.
+ * Mike Rapoport <mike@compulab.co.il>
+ *
+ * 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/platform_device.h>
+#include <linux/irq.h>
+#include <linux/gpio.h>
+#include <linux/mtd/partitions.h>
+#include <linux/mtd/physmap.h>
+#include <linux/mtd/nand-gpio.h>
+
+#include <linux/spi/spi.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach-types.h>
+#include <asm/mach/map.h>
+
+#include <mach/pxa2xx-regs.h>
+#include <mach/mfp-pxa25x.h>
+#include <mach/pxa2xx_spi.h>
+#include <mach/bitfield.h>
+
+#include "generic.h"
+
+#define GPIO_NAND_CS   (5)
+#define GPIO_NAND_ALE  (4)
+#define GPIO_NAND_CLE  (3)
+#define GPIO_NAND_RB   (10)
+
+static unsigned long cmx255_pin_config[] = {
+       /* AC'97 */
+       GPIO28_AC97_BITCLK,
+       GPIO29_AC97_SDATA_IN_0,
+       GPIO30_AC97_SDATA_OUT,
+       GPIO31_AC97_SYNC,
+
+       /* BTUART */
+       GPIO42_BTUART_RXD,
+       GPIO43_BTUART_TXD,
+       GPIO44_BTUART_CTS,
+       GPIO45_BTUART_RTS,
+
+       /* STUART */
+       GPIO46_STUART_RXD,
+       GPIO47_STUART_TXD,
+
+       /* LCD */
+       GPIO58_LCD_LDD_0,
+       GPIO59_LCD_LDD_1,
+       GPIO60_LCD_LDD_2,
+       GPIO61_LCD_LDD_3,
+       GPIO62_LCD_LDD_4,
+       GPIO63_LCD_LDD_5,
+       GPIO64_LCD_LDD_6,
+       GPIO65_LCD_LDD_7,
+       GPIO66_LCD_LDD_8,
+       GPIO67_LCD_LDD_9,
+       GPIO68_LCD_LDD_10,
+       GPIO69_LCD_LDD_11,
+       GPIO70_LCD_LDD_12,
+       GPIO71_LCD_LDD_13,
+       GPIO72_LCD_LDD_14,
+       GPIO73_LCD_LDD_15,
+       GPIO74_LCD_FCLK,
+       GPIO75_LCD_LCLK,
+       GPIO76_LCD_PCLK,
+       GPIO77_LCD_BIAS,
+
+       /* SSP1 */
+       GPIO23_SSP1_SCLK,
+       GPIO24_SSP1_SFRM,
+       GPIO25_SSP1_TXD,
+       GPIO26_SSP1_RXD,
+
+       /* SSP2 */
+       GPIO81_SSP2_CLK_OUT,
+       GPIO82_SSP2_FRM_OUT,
+       GPIO83_SSP2_TXD,
+       GPIO84_SSP2_RXD,
+
+       /* PC Card */
+       GPIO48_nPOE,
+       GPIO49_nPWE,
+       GPIO50_nPIOR,
+       GPIO51_nPIOW,
+       GPIO52_nPCE_1,
+       GPIO53_nPCE_2,
+       GPIO54_nPSKTSEL,
+       GPIO55_nPREG,
+       GPIO56_nPWAIT,
+       GPIO57_nIOIS16,
+
+       /* SDRAM and local bus */
+       GPIO15_nCS_1,
+       GPIO78_nCS_2,
+       GPIO79_nCS_3,
+       GPIO80_nCS_4,
+       GPIO33_nCS_5,
+       GPIO18_RDY,
+
+       /* GPIO */
+       GPIO0_GPIO      | WAKEUP_ON_EDGE_BOTH,
+       GPIO9_GPIO,                             /* PC card reset */
+
+       /* NAND controls */
+       GPIO5_GPIO      | MFP_LPM_DRIVE_HIGH,   /* NAND CE# */
+       GPIO4_GPIO      | MFP_LPM_DRIVE_LOW,    /* NAND ALE */
+       GPIO3_GPIO      | MFP_LPM_DRIVE_LOW,    /* NAND CLE */
+       GPIO10_GPIO,                            /* NAND Ready/Busy */
+
+       /* interrupts */
+       GPIO22_GPIO,    /* DM9000 interrupt */
+};
+
+#if defined(CONFIG_SPI_PXA2XX)
+static struct pxa2xx_spi_master pxa_ssp_master_info = {
+       .num_chipselect = 1,
+};
+
+static struct spi_board_info spi_board_info[] __initdata = {
+       [0] = {
+               .modalias       = "rtc-max6902",
+               .max_speed_hz   = 1000000,
+               .bus_num        = 1,
+               .chip_select    = 0,
+       },
+};
+
+static void __init cmx255_init_rtc(void)
+{
+       pxa2xx_set_spi_info(1, &pxa_ssp_master_info);
+       spi_register_board_info(ARRAY_AND_SIZE(spi_board_info));
+}
+#else
+static inline void cmx255_init_rtc(void) {}
+#endif
+
+#if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
+static struct mtd_partition cmx255_nor_partitions[] = {
+       {
+               .name           = "ARMmon",
+               .size           = 0x00030000,
+               .offset         = 0,
+               .mask_flags     = MTD_WRITEABLE  /* force read-only */
+       } , {
+               .name           = "ARMmon setup block",
+               .size           = 0x00010000,
+               .offset         = MTDPART_OFS_APPEND,
+               .mask_flags     = MTD_WRITEABLE  /* force read-only */
+       } , {
+               .name           = "kernel",
+               .size           = 0x00160000,
+               .offset         = MTDPART_OFS_APPEND,
+       } , {
+               .name           = "ramdisk",
+               .size           = MTDPART_SIZ_FULL,
+               .offset         = MTDPART_OFS_APPEND
+       }
+};
+
+static struct physmap_flash_data cmx255_nor_flash_data[] = {
+       {
+               .width          = 2,    /* bankwidth in bytes */
+               .parts          = cmx255_nor_partitions,
+               .nr_parts       = ARRAY_SIZE(cmx255_nor_partitions)
+       }
+};
+
+static struct resource cmx255_nor_resource = {
+       .start  = PXA_CS0_PHYS,
+       .end    = PXA_CS0_PHYS + SZ_8M - 1,
+       .flags  = IORESOURCE_MEM,
+};
+
+static struct platform_device cmx255_nor = {
+       .name   = "physmap-flash",
+       .id     = -1,
+       .dev    = {
+               .platform_data = cmx255_nor_flash_data,
+       },
+       .resource = &cmx255_nor_resource,
+       .num_resources = 1,
+};
+
+static void __init cmx255_init_nor(void)
+{
+       platform_device_register(&cmx255_nor);
+}
+#else
+static inline void cmx255_init_nor(void) {}
+#endif
+
+#if defined(CONFIG_MTD_NAND_GPIO) || defined(CONFIG_MTD_NAND_GPIO_MODULE)
+static struct resource cmx255_nand_resource[] = {
+       [0] = {
+               .start = PXA_CS1_PHYS,
+               .end   = PXA_CS1_PHYS + 11,
+               .flags = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start = PXA_CS5_PHYS,
+               .end   = PXA_CS5_PHYS + 3,
+               .flags = IORESOURCE_MEM,
+       },
+};
+
+static struct mtd_partition cmx255_nand_parts[] = {
+       [0] = {
+               .name   = "cmx255-nand",
+               .size   = MTDPART_SIZ_FULL,
+               .offset = 0,
+       },
+};
+
+static struct gpio_nand_platdata cmx255_nand_platdata = {
+       .gpio_nce = GPIO_NAND_CS,
+       .gpio_cle = GPIO_NAND_CLE,
+       .gpio_ale = GPIO_NAND_ALE,
+       .gpio_rdy = GPIO_NAND_RB,
+       .gpio_nwp = -1,
+       .parts = cmx255_nand_parts,
+       .num_parts = ARRAY_SIZE(cmx255_nand_parts),
+       .chip_delay = 25,
+};
+
+static struct platform_device cmx255_nand = {
+       .name           = "gpio-nand",
+       .num_resources  = ARRAY_SIZE(cmx255_nand_resource),
+       .resource       = cmx255_nand_resource,
+       .id             = -1,
+       .dev            = {
+               .platform_data = &cmx255_nand_platdata,
+       }
+};
+
+static void __init cmx255_init_nand(void)
+{
+       platform_device_register(&cmx255_nand);
+}
+#else
+static inline void cmx255_init_nand(void) {}
+#endif
+
+void __init cmx255_init(void)
+{
+       pxa2xx_mfp_config(ARRAY_AND_SIZE(cmx255_pin_config));
+
+       cmx255_init_rtc();
+       cmx255_init_nor();
+       cmx255_init_nand();
+}
diff --git a/arch/arm/mach-pxa/cm-x270-pci.h b/arch/arm/mach-pxa/cm-x270-pci.h
deleted file mode 100644 (file)
index 48f532f..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-extern void __cmx270_pci_init_irq(int irq_gpio);
-extern void __cmx270_pci_suspend(void);
-extern void __cmx270_pci_resume(void);
-
-#ifdef CONFIG_PCI
-#define cmx270_pci_init_irq(x) __cmx270_pci_init_irq(x)
-#define cmx270_pci_suspend(x) __cmx270_pci_suspend(x)
-#define cmx270_pci_resume(x) __cmx270_pci_resume(x)
-#else
-#define cmx270_pci_init_irq(x) do {} while (0)
-#define cmx270_pci_suspend(x) do {} while (0)
-#define cmx270_pci_resume(x) do {} while (0)
-#endif
index af003a2..102a431 100644 (file)
 #include <linux/irq.h>
 #include <linux/gpio.h>
 
-#include <linux/dm9000.h>
 #include <linux/rtc-v3020.h>
 #include <video/mbxfb.h>
-#include <linux/leds.h>
 
-#include <asm/mach/arch.h>
-#include <asm/mach-types.h>
-#include <asm/mach/map.h>
-
-#include <mach/pxa2xx-regs.h>
 #include <mach/mfp-pxa27x.h>
-#include <mach/pxa-regs.h>
-#include <mach/audio.h>
-#include <mach/pxafb.h>
 #include <mach/ohci.h>
 #include <mach/mmc.h>
-#include <mach/bitfield.h>
-
-#include <asm/hardware/it8152.h>
 
 #include "generic.h"
-#include "cm-x270-pci.h"
-
-/* virtual addresses for statically mapped regions */
-#define CMX270_VIRT_BASE       (0xe8000000)
-#define CMX270_IT8152_VIRT     (CMX270_VIRT_BASE)
 
+/* physical address if local-bus attached devices */
 #define RTC_PHYS_BASE          (PXA_CS1_PHYS + (5 << 22))
-#define DM9000_PHYS_BASE       (PXA_CS1_PHYS + (6 << 22))
 
 /* GPIO IRQ usage */
-#define GPIO10_ETHIRQ          (10)
-#define GPIO22_IT8152_IRQ      (22)
 #define GPIO83_MMC_IRQ         (83)
-#define GPIO95_GFXIRQ          (95)
 
-#define CMX270_ETHIRQ          IRQ_GPIO(GPIO10_ETHIRQ)
-#define CMX270_IT8152_IRQ      IRQ_GPIO(GPIO22_IT8152_IRQ)
 #define CMX270_MMC_IRQ         IRQ_GPIO(GPIO83_MMC_IRQ)
-#define CMX270_GFXIRQ          IRQ_GPIO(GPIO95_GFXIRQ)
 
 /* MMC power enable */
 #define GPIO105_MMC_POWER      (105)
@@ -157,62 +133,6 @@ static unsigned long cmx270_pin_config[] = {
        GPIO83_GPIO,    /* MMC card detect */
 };
 
-#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
-static struct resource cmx270_dm9000_resource[] = {
-       [0] = {
-               .start = DM9000_PHYS_BASE,
-               .end   = DM9000_PHYS_BASE + 4,
-               .flags = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start = DM9000_PHYS_BASE + 8,
-               .end   = DM9000_PHYS_BASE + 8 + 500,
-               .flags = IORESOURCE_MEM,
-       },
-       [2] = {
-               .start = CMX270_ETHIRQ,
-               .end   = CMX270_ETHIRQ,
-               .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
-       }
-};
-
-static struct dm9000_plat_data cmx270_dm9000_platdata = {
-       .flags          = DM9000_PLATF_32BITONLY,
-};
-
-static struct platform_device cmx270_dm9000_device = {
-       .name           = "dm9000",
-       .id             = 0,
-       .num_resources  = ARRAY_SIZE(cmx270_dm9000_resource),
-       .resource       = cmx270_dm9000_resource,
-       .dev            = {
-               .platform_data = &cmx270_dm9000_platdata,
-       }
-};
-
-static void __init cmx270_init_dm9000(void)
-{
-       platform_device_register(&cmx270_dm9000_device);
-}
-#else
-static inline void cmx270_init_dm9000(void) {}
-#endif
-
-/* UCB1400 touchscreen controller */
-#if defined(CONFIG_TOUCHSCREEN_UCB1400) || defined(CONFIG_TOUCHSCREEN_UCB1400_MODULE)
-static struct platform_device cmx270_ts_device = {
-       .name           = "ucb1400_ts",
-       .id             = -1,
-};
-
-static void __init cmx270_init_touchscreen(void)
-{
-       platform_device_register(&cmx270_ts_device);
-}
-#else
-static inline void cmx270_init_touchscreen(void) {}
-#endif
-
 /* V3020 RTC */
 #if defined(CONFIG_RTC_DRV_V3020) || defined(CONFIG_RTC_DRV_V3020_MODULE)
 static struct resource cmx270_v3020_resource[] = {
@@ -242,45 +162,7 @@ static void __init cmx270_init_rtc(void)
        platform_device_register(&cmx270_rtc_device);
 }
 #else
-static inline void cmx270_init_rtc(void) {}
-#endif
-
-/* CM-X270 LEDs */
-#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
-static struct gpio_led cmx270_leds[] = {
-       [0] = {
-               .name = "cm-x270:red",
-               .default_trigger = "nand-disk",
-               .gpio = 93,
-               .active_low = 1,
-       },
-       [1] = {
-               .name = "cm-x270:green",
-               .default_trigger = "heartbeat",
-               .gpio = 94,
-               .active_low = 1,
-       },
-};
-
-static struct gpio_led_platform_data cmx270_gpio_led_pdata = {
-       .num_leds = ARRAY_SIZE(cmx270_leds),
-       .leds = cmx270_leds,
-};
-
-static struct platform_device cmx270_led_device = {
-       .name           = "leds-gpio",
-       .id             = -1,
-       .dev            = {
-               .platform_data = &cmx270_gpio_led_pdata,
-       },
-};
-
-static void __init cmx270_init_leds(void)
-{
-       platform_device_register(&cmx270_led_device);
-}
-#else
-static inline void cmx270_init_leds(void) {}
+static inline void cmx2xx_init_rtc(void) {}
 #endif
 
 /* 2700G graphics */
@@ -373,224 +255,6 @@ static void __init cmx270_init_2700G(void)
 static inline void cmx270_init_2700G(void) {}
 #endif
 
-#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
-/*
-  Display definitions
-  keep these for backwards compatibility, although symbolic names (as
-  e.g. in lpd270.c) looks better
-*/
-#define MTYPE_STN320x240       0
-#define MTYPE_TFT640x480       1
-#define MTYPE_CRT640x480       2
-#define MTYPE_CRT800x600       3
-#define MTYPE_TFT320x240       6
-#define MTYPE_STN640x480       7
-
-static struct pxafb_mode_info generic_stn_320x240_mode = {
-       .pixclock       = 76923,
-       .bpp            = 8,
-       .xres           = 320,
-       .yres           = 240,
-       .hsync_len      = 3,
-       .vsync_len      = 2,
-       .left_margin    = 3,
-       .upper_margin   = 0,
-       .right_margin   = 3,
-       .lower_margin   = 0,
-       .sync           = (FB_SYNC_HOR_HIGH_ACT |
-                          FB_SYNC_VERT_HIGH_ACT),
-       .cmap_greyscale = 0,
-};
-
-static struct pxafb_mach_info generic_stn_320x240 = {
-       .modes          = &generic_stn_320x240_mode,
-       .num_modes      = 1,
-       .lccr0          = 0,
-       .lccr3          = (LCCR3_PixClkDiv(0x03) |
-                          LCCR3_Acb(0xff) |
-                          LCCR3_PCP),
-       .cmap_inverse   = 0,
-       .cmap_static    = 0,
-};
-
-static struct pxafb_mode_info generic_tft_640x480_mode = {
-       .pixclock       = 38461,
-       .bpp            = 8,
-       .xres           = 640,
-       .yres           = 480,
-       .hsync_len      = 60,
-       .vsync_len      = 2,
-       .left_margin    = 70,
-       .upper_margin   = 10,
-       .right_margin   = 70,
-       .lower_margin   = 5,
-       .sync           = 0,
-       .cmap_greyscale = 0,
-};
-
-static struct pxafb_mach_info generic_tft_640x480 = {
-       .modes          = &generic_tft_640x480_mode,
-       .num_modes      = 1,
-       .lccr0          = (LCCR0_PAS),
-       .lccr3          = (LCCR3_PixClkDiv(0x01) |
-                          LCCR3_Acb(0xff) |
-                          LCCR3_PCP),
-       .cmap_inverse   = 0,
-       .cmap_static    = 0,
-};
-
-static struct pxafb_mode_info generic_crt_640x480_mode = {
-       .pixclock       = 38461,
-       .bpp            = 8,
-       .xres           = 640,
-       .yres           = 480,
-       .hsync_len      = 63,
-       .vsync_len      = 2,
-       .left_margin    = 81,
-       .upper_margin   = 33,
-       .right_margin   = 16,
-       .lower_margin   = 10,
-       .sync           = (FB_SYNC_HOR_HIGH_ACT |
-                          FB_SYNC_VERT_HIGH_ACT),
-       .cmap_greyscale = 0,
-};
-
-static struct pxafb_mach_info generic_crt_640x480 = {
-       .modes          = &generic_crt_640x480_mode,
-       .num_modes      = 1,
-       .lccr0          = (LCCR0_PAS),
-       .lccr3          = (LCCR3_PixClkDiv(0x01) |
-                          LCCR3_Acb(0xff)),
-       .cmap_inverse   = 0,
-       .cmap_static    = 0,
-};
-
-static struct pxafb_mode_info generic_crt_800x600_mode = {
-       .pixclock       = 28846,
-       .bpp            = 8,
-       .xres           = 800,
-       .yres           = 600,
-       .hsync_len      = 63,
-       .vsync_len      = 2,
-       .left_margin    = 26,
-       .upper_margin   = 21,
-       .right_margin   = 26,
-       .lower_margin   = 11,
-       .sync           = (FB_SYNC_HOR_HIGH_ACT |
-                          FB_SYNC_VERT_HIGH_ACT),
-       .cmap_greyscale = 0,
-};
-
-static struct pxafb_mach_info generic_crt_800x600 = {
-       .modes          = &generic_crt_800x600_mode,
-       .num_modes      = 1,
-       .lccr0          = (LCCR0_PAS),
-       .lccr3          = (LCCR3_PixClkDiv(0x02) |
-                          LCCR3_Acb(0xff)),
-       .cmap_inverse   = 0,
-       .cmap_static    = 0,
-};
-
-static struct pxafb_mode_info generic_tft_320x240_mode = {
-       .pixclock       = 134615,
-       .bpp            = 16,
-       .xres           = 320,
-       .yres           = 240,
-       .hsync_len      = 63,
-       .vsync_len      = 7,
-       .left_margin    = 75,
-       .upper_margin   = 0,
-       .right_margin   = 15,
-       .lower_margin   = 15,
-       .sync           = 0,
-       .cmap_greyscale = 0,
-};
-
-static struct pxafb_mach_info generic_tft_320x240 = {
-       .modes          = &generic_tft_320x240_mode,
-       .num_modes      = 1,
-       .lccr0          = (LCCR0_PAS),
-       .lccr3          = (LCCR3_PixClkDiv(0x06) |
-                          LCCR3_Acb(0xff) |
-                          LCCR3_PCP),
-       .cmap_inverse   = 0,
-       .cmap_static    = 0,
-};
-
-static struct pxafb_mode_info generic_stn_640x480_mode = {
-       .pixclock       = 57692,
-       .bpp            = 8,
-       .xres           = 640,
-       .yres           = 480,
-       .hsync_len      = 4,
-       .vsync_len      = 2,
-       .left_margin    = 10,
-       .upper_margin   = 5,
-       .right_margin   = 10,
-       .lower_margin   = 5,
-       .sync           = (FB_SYNC_HOR_HIGH_ACT |
-                          FB_SYNC_VERT_HIGH_ACT),
-       .cmap_greyscale = 0,
-};
-
-static struct pxafb_mach_info generic_stn_640x480 = {
-       .modes          = &generic_stn_640x480_mode,
-       .num_modes      = 1,
-       .lccr0          = 0,
-       .lccr3          = (LCCR3_PixClkDiv(0x02) |
-                          LCCR3_Acb(0xff)),
-       .cmap_inverse   = 0,
-       .cmap_static    = 0,
-};
-
-static struct pxafb_mach_info *cmx270_display = &generic_crt_640x480;
-
-static int __init cmx270_set_display(char *str)
-{
-       int disp_type = simple_strtol(str, NULL, 0);
-       switch (disp_type) {
-       case MTYPE_STN320x240:
-               cmx270_display = &generic_stn_320x240;
-               break;
-       case MTYPE_TFT640x480:
-               cmx270_display = &generic_tft_640x480;
-               break;
-       case MTYPE_CRT640x480:
-               cmx270_display = &generic_crt_640x480;
-               break;
-       case MTYPE_CRT800x600:
-               cmx270_display = &generic_crt_800x600;
-               break;
-       case MTYPE_TFT320x240:
-               cmx270_display = &generic_tft_320x240;
-               break;
-       case MTYPE_STN640x480:
-               cmx270_display = &generic_stn_640x480;
-               break;
-       default: /* fallback to CRT 640x480 */
-               cmx270_display = &generic_crt_640x480;
-               break;
-       }
-       return 1;
-}
-
-/*
-   This should be done really early to get proper configuration for
-   frame buffer.
-   Indeed, pxafb parameters can be used istead, but CM-X270 bootloader
-   has limitied line length for kernel command line, and also it will
-   break compatibitlty with proprietary releases already in field.
-*/
-__setup("monitor=", cmx270_set_display);
-
-static void __init cmx270_init_display(void)
-{
-       set_pxa_fb_info(cmx270_display);
-}
-#else
-static inline void cmx270_init_display(void) {}
-#endif
-
 /* PXA27x OHCI controller setup */
 #if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
 static int cmx270_ohci_init(struct device *dev)
@@ -676,131 +340,12 @@ static void __init cmx270_init_mmc(void)
 static inline void cmx270_init_mmc(void) {}
 #endif
 
-#ifdef CONFIG_PM
-static unsigned long sleep_save_msc[10];
-
-static int cmx270_suspend(struct sys_device *dev, pm_message_t state)
-{
-       cmx270_pci_suspend();
-
-       /* save MSC registers */
-       sleep_save_msc[0] = MSC0;
-       sleep_save_msc[1] = MSC1;
-       sleep_save_msc[2] = MSC2;
-
-       /* setup power saving mode registers */
-       PCFR = 0x0;
-       PSLR = 0xff400000;
-       PMCR  = 0x00000005;
-       PWER  = 0x80000000;
-       PFER  = 0x00000000;
-       PRER  = 0x00000000;
-       PGSR0 = 0xC0018800;
-       PGSR1 = 0x004F0002;
-       PGSR2 = 0x6021C000;
-       PGSR3 = 0x00020000;
-
-       return 0;
-}
-
-static int cmx270_resume(struct sys_device *dev)
-{
-       cmx270_pci_resume();
-
-       /* restore MSC registers */
-       MSC0 = sleep_save_msc[0];
-       MSC1 = sleep_save_msc[1];
-       MSC2 = sleep_save_msc[2];
-
-       return 0;
-}
-
-static struct sysdev_class cmx270_pm_sysclass = {
-       .name = "pm",
-       .resume = cmx270_resume,
-       .suspend = cmx270_suspend,
-};
-
-static struct sys_device cmx270_pm_device = {
-       .cls = &cmx270_pm_sysclass,
-};
-
-static int __init cmx270_pm_init(void)
-{
-       int error;
-       error = sysdev_class_register(&cmx270_pm_sysclass);
-       if (error == 0)
-               error = sysdev_register(&cmx270_pm_device);
-       return error;
-}
-#else
-static int __init cmx270_pm_init(void) { return 0; }
-#endif
-
-#if defined(CONFIG_SND_PXA2XX_AC97) || defined(CONFIG_SND_PXA2XX_AC97_MODULE)
-static void __init cmx270_init_ac97(void)
-{
-       pxa_set_ac97_info(NULL);
-}
-#else
-static inline void cmx270_init_ac97(void) {}
-#endif
-
-static void __init cmx270_init(void)
+void __init cmx270_init(void)
 {
-       cmx270_pm_init();
-
        pxa2xx_mfp_config(ARRAY_AND_SIZE(cmx270_pin_config));
 
-       cmx270_init_dm9000();
        cmx270_init_rtc();
-       cmx270_init_display();
        cmx270_init_mmc();
        cmx270_init_ohci();
-       cmx270_init_ac97();
-       cmx270_init_touchscreen();
-       cmx270_init_leds();
        cmx270_init_2700G();
 }
-
-static void __init cmx270_init_irq(void)
-{
-       pxa27x_init_irq();
-
-       cmx270_pci_init_irq(GPIO22_IT8152_IRQ);
-}
-
-#ifdef CONFIG_PCI
-/* Map PCI companion statically */
-static struct map_desc cmx270_io_desc[] __initdata = {
-       [0] = { /* PCI bridge */
-               .virtual        = CMX270_IT8152_VIRT,
-               .pfn            = __phys_to_pfn(PXA_CS4_PHYS),
-               .length         = SZ_64M,
-               .type           = MT_DEVICE
-       },
-};
-
-static void __init cmx270_map_io(void)
-{
-       pxa_map_io();
-       iotable_init(cmx270_io_desc, ARRAY_SIZE(cmx270_io_desc));
-
-       it8152_base_address = CMX270_IT8152_VIRT;
-}
-#else
-static void __init cmx270_map_io(void)
-{
-       pxa_map_io();
-}
-#endif
-
-MACHINE_START(ARMCORE, "Compulab CM-x270")
-       .boot_params    = 0xa0000100,
-       .phys_io        = 0x40000000,
-       .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc,
-       .map_io         = cmx270_map_io,
-       .init_irq       = cmx270_init_irq,
-       .timer          = &pxa_timer,
-       .init_machine   = cmx270_init,
-MACHINE_END
similarity index 77%
rename from arch/arm/mach-pxa/cm-x270-pci.c
rename to arch/arm/mach-pxa/cm-x2xx-pci.c
index 2d5bcea..3156b25 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * linux/arch/arm/mach-pxa/cm-x270-pci.c
+ * linux/arch/arm/mach-pxa/cm-x2xx-pci.c
  *
  * PCI bios-type initialisation for PCI machines
  *
@@ -28,7 +28,7 @@
 #include <asm/hardware/it8152.h>
 
 unsigned long it8152_base_address;
-static int cmx270_it8152_irq_gpio;
+static int cmx2xx_it8152_irq_gpio;
 
 /*
  * Only first 64MB of memory can be accessed via PCI.
@@ -36,13 +36,13 @@ static int cmx270_it8152_irq_gpio;
  * This is really ugly and we need a better way of specifying
  * DMA-capable regions of memory.
  */
-void __init cmx270_pci_adjust_zones(int node, unsigned long *zone_size,
+void __init cmx2xx_pci_adjust_zones(int node, unsigned long *zone_size,
        unsigned long *zhole_size)
 {
        unsigned int sz = SZ_64M >> PAGE_SHIFT;
 
        if (machine_is_armcore()) {
-               pr_info("Adjusting zones for CM-X270\n");
+               pr_info("Adjusting zones for CM-X2XX\n");
 
                /*
                 * Only adjust if > 64M on current system
@@ -57,29 +57,29 @@ void __init cmx270_pci_adjust_zones(int node, unsigned long *zone_size,
        }
 }
 
-static void cmx270_it8152_irq_demux(unsigned int irq, struct irq_desc *desc)
+static void cmx2xx_it8152_irq_demux(unsigned int irq, struct irq_desc *desc)
 {
        /* clear our parent irq */
-       GEDR(cmx270_it8152_irq_gpio) = GPIO_bit(cmx270_it8152_irq_gpio);
+       GEDR(cmx2xx_it8152_irq_gpio) = GPIO_bit(cmx2xx_it8152_irq_gpio);
 
        it8152_irq_demux(irq, desc);
 }
 
-void __cmx270_pci_init_irq(int irq_gpio)
+void __cmx2xx_pci_init_irq(int irq_gpio)
 {
        it8152_init_irq();
 
-       cmx270_it8152_irq_gpio = irq_gpio;
+       cmx2xx_it8152_irq_gpio = irq_gpio;
 
        set_irq_type(gpio_to_irq(irq_gpio), IRQ_TYPE_EDGE_RISING);
 
-       set_irq_chained_handler(gpio_to_irq(irq_gpio), cmx270_it8152_irq_demux);
+       set_irq_chained_handler(gpio_to_irq(irq_gpio), cmx2xx_it8152_irq_demux);
 }
 
 #ifdef CONFIG_PM
 static unsigned long sleep_save_ite[10];
 
-void __cmx270_pci_suspend(void)
+void __cmx2xx_pci_suspend(void)
 {
        /* save ITE state */
        sleep_save_ite[0] = __raw_readl(IT8152_INTC_PDCNIMR);
@@ -91,7 +91,7 @@ void __cmx270_pci_suspend(void)
        __raw_writel((0), IT8152_INTC_LPCNIRR);
 }
 
-void __cmx270_pci_resume(void)
+void __cmx2xx_pci_resume(void)
 {
        /* restore IT8152 state */
        __raw_writel((sleep_save_ite[0]), IT8152_INTC_PDCNIMR);
@@ -99,12 +99,12 @@ void __cmx270_pci_resume(void)
        __raw_writel((sleep_save_ite[2]), IT8152_INTC_LPNIAR);
 }
 #else
-void cmx270_pci_suspend(void) {}
-void cmx270_pci_resume(void) {}
+void cmx2xx_pci_suspend(void) {}
+void cmx2xx_pci_resume(void) {}
 #endif
 
 /* PCI IRQ mapping*/
-static int __init cmx270_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
+static int __init cmx2xx_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
 {
        int irq;
 
@@ -116,14 +116,14 @@ static int __init cmx270_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
 
        /*
          Here comes the ugly part. The routing is baseboard specific,
-         but defining a platform for each possible base of CM-X270 is
-         unrealistic. Here we keep mapping for ATXBase and SB-X270.
+         but defining a platform for each possible base of CM-X2XX is
+         unrealistic. Here we keep mapping for ATXBase and SB-X2XX.
        */
        /* ATXBASE PCI slot */
        if (slot == 7)
                return IT8152_PCI_INTA;
 
-       /* ATXBase/SB-x270 CardBus */
+       /* ATXBase/SB-X2XX CardBus */
        if (slot == 8 || slot == 0)
                return IT8152_PCI_INTB;
 
@@ -131,7 +131,11 @@ static int __init cmx270_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
        if (slot == 9)
                return IT8152_PCI_INTA;
 
-       /* SB-x270 Ethernet */
+       /* CM-x255 Onboard Ethernet */
+       if (slot == 15)
+               return IT8152_PCI_INTC;
+
+       /* SB-x2xx Ethernet */
        if (slot == 16)
                return IT8152_PCI_INTA;
 
@@ -144,9 +148,9 @@ static int __init cmx270_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
        return(0);
 }
 
-static void cmx270_pci_preinit(void)
+static void cmx2xx_pci_preinit(void)
 {
-       pr_info("Initializing CM-X270 PCI subsystem\n");
+       pr_info("Initializing CM-X2XX PCI subsystem\n");
 
        __raw_writel(0x800, IT8152_PCI_CFG_ADDR);
        if (__raw_readl(IT8152_PCI_CFG_DATA) == 0x81521283) {
@@ -200,21 +204,21 @@ static void cmx270_pci_preinit(void)
        }
 }
 
-static struct hw_pci cmx270_pci __initdata = {
+static struct hw_pci cmx2xx_pci __initdata = {
        .swizzle        = pci_std_swizzle,
-       .map_irq        = cmx270_pci_map_irq,
+       .map_irq        = cmx2xx_pci_map_irq,
        .nr_controllers = 1,
        .setup          = it8152_pci_setup,
        .scan           = it8152_pci_scan_bus,
-       .preinit        = cmx270_pci_preinit,
+       .preinit        = cmx2xx_pci_preinit,
 };
 
-static int __init cmx270_init_pci(void)
+static int __init cmx2xx_init_pci(void)
 {
        if (machine_is_armcore())
-               pci_common_init(&cmx270_pci);
+               pci_common_init(&cmx2xx_pci);
 
        return 0;
 }
 
-subsys_initcall(cmx270_init_pci);
+subsys_initcall(cmx2xx_init_pci);
diff --git a/arch/arm/mach-pxa/cm-x2xx-pci.h b/arch/arm/mach-pxa/cm-x2xx-pci.h
new file mode 100644 (file)
index 0000000..e24aad2
--- /dev/null
@@ -0,0 +1,13 @@
+extern void __cmx2xx_pci_init_irq(int irq_gpio);
+extern void __cmx2xx_pci_suspend(void);
+extern void __cmx2xx_pci_resume(void);
+
+#ifdef CONFIG_PCI
+#define cmx2xx_pci_init_irq(x) __cmx2xx_pci_init_irq(x)
+#define cmx2xx_pci_suspend(x) __cmx2xx_pci_suspend(x)
+#define cmx2xx_pci_resume(x) __cmx2xx_pci_resume(x)
+#else
+#define cmx2xx_pci_init_irq(x) do {} while (0)
+#define cmx2xx_pci_suspend(x) do {} while (0)
+#define cmx2xx_pci_resume(x) do {} while (0)
+#endif
diff --git a/arch/arm/mach-pxa/cm-x2xx.c b/arch/arm/mach-pxa/cm-x2xx.c
new file mode 100644 (file)
index 0000000..0b3ce3b
--- /dev/null
@@ -0,0 +1,531 @@
+/*
+ * linux/arch/arm/mach-pxa/cm-x2xx.c
+ *
+ * Copyright (C) 2008 CompuLab, Ltd.
+ * Mike Rapoport <mike@compulab.co.il>
+ *
+ * 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/platform_device.h>
+#include <linux/sysdev.h>
+#include <linux/irq.h>
+#include <linux/gpio.h>
+
+#include <linux/dm9000.h>
+#include <linux/leds.h>
+
+#include <asm/mach/arch.h>
+#include <asm/mach-types.h>
+#include <asm/mach/map.h>
+
+#include <mach/pxa2xx-regs.h>
+#include <mach/mfp-pxa27x.h>
+#include <mach/pxa-regs.h>
+#include <mach/audio.h>
+#include <mach/pxafb.h>
+
+#include <asm/hardware/it8152.h>
+
+#include "generic.h"
+#include "cm-x2xx-pci.h"
+
+extern void cmx255_init(void);
+extern void cmx270_init(void);
+
+/* virtual addresses for statically mapped regions */
+#define CMX2XX_VIRT_BASE       (0xe8000000)
+#define CMX2XX_IT8152_VIRT     (CMX2XX_VIRT_BASE)
+
+/* physical address if local-bus attached devices */
+#define CMX255_DM9000_PHYS_BASE (PXA_CS1_PHYS + (8 << 22))
+#define CMX270_DM9000_PHYS_BASE        (PXA_CS1_PHYS + (6 << 22))
+
+/* leds */
+#define CMX255_GPIO_RED                (27)
+#define CMX255_GPIO_GREEN      (32)
+#define CMX270_GPIO_RED                (93)
+#define CMX270_GPIO_GREEN      (94)
+
+/* GPIO IRQ usage */
+#define GPIO22_ETHIRQ          (22)
+#define GPIO10_ETHIRQ          (10)
+#define CMX255_GPIO_IT8152_IRQ (0)
+#define CMX270_GPIO_IT8152_IRQ (22)
+
+#define CMX255_ETHIRQ          IRQ_GPIO(GPIO22_ETHIRQ)
+#define CMX270_ETHIRQ          IRQ_GPIO(GPIO10_ETHIRQ)
+
+#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
+static struct resource cmx255_dm9000_resource[] = {
+       [0] = {
+               .start = CMX255_DM9000_PHYS_BASE,
+               .end   = CMX255_DM9000_PHYS_BASE + 3,
+               .flags = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start = CMX255_DM9000_PHYS_BASE + 4,
+               .end   = CMX255_DM9000_PHYS_BASE + 4 + 500,
+               .flags = IORESOURCE_MEM,
+       },
+       [2] = {
+               .start = CMX255_ETHIRQ,
+               .end   = CMX255_ETHIRQ,
+               .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
+       }
+};
+
+static struct resource cmx270_dm9000_resource[] = {
+       [0] = {
+               .start = CMX270_DM9000_PHYS_BASE,
+               .end   = CMX270_DM9000_PHYS_BASE + 3,
+               .flags = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start = CMX270_DM9000_PHYS_BASE + 8,
+               .end   = CMX270_DM9000_PHYS_BASE + 8 + 500,
+               .flags = IORESOURCE_MEM,
+       },
+       [2] = {
+               .start = CMX270_ETHIRQ,
+               .end   = CMX270_ETHIRQ,
+               .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
+       }
+};
+
+static struct dm9000_plat_data cmx270_dm9000_platdata = {
+       .flags          = DM9000_PLATF_32BITONLY,
+};
+
+static struct platform_device cmx2xx_dm9000_device = {
+       .name           = "dm9000",
+       .id             = 0,
+       .num_resources  = ARRAY_SIZE(cmx270_dm9000_resource),
+       .dev            = {
+               .platform_data = &cmx270_dm9000_platdata,
+       }
+};
+
+static void __init cmx2xx_init_dm9000(void)
+{
+       if (cpu_is_pxa25x())
+               cmx2xx_dm9000_device.resource = cmx255_dm9000_resource;
+       else
+               cmx2xx_dm9000_device.resource = cmx270_dm9000_resource;
+       platform_device_register(&cmx2xx_dm9000_device);
+}
+#else
+static inline void cmx2xx_init_dm9000(void) {}
+#endif
+
+/* UCB1400 touchscreen controller */
+#if defined(CONFIG_TOUCHSCREEN_UCB1400) || defined(CONFIG_TOUCHSCREEN_UCB1400_MODULE)
+static struct platform_device cmx2xx_ts_device = {
+       .name           = "ucb1400_ts",
+       .id             = -1,
+};
+
+static void __init cmx2xx_init_touchscreen(void)
+{
+       platform_device_register(&cmx2xx_ts_device);
+}
+#else
+static inline void cmx2xx_init_touchscreen(void) {}
+#endif
+
+/* CM-X270 LEDs */
+#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
+static struct gpio_led cmx2xx_leds[] = {
+       [0] = {
+               .name = "cm-x2xx:red",
+               .default_trigger = "nand-disk",
+               .active_low = 1,
+       },
+       [1] = {
+               .name = "cm-x2xx:green",
+               .default_trigger = "heartbeat",
+               .active_low = 1,
+       },
+};
+
+static struct gpio_led_platform_data cmx2xx_gpio_led_pdata = {
+       .num_leds = ARRAY_SIZE(cmx2xx_leds),
+       .leds = cmx2xx_leds,
+};
+
+static struct platform_device cmx2xx_led_device = {
+       .name           = "leds-gpio",
+       .id             = -1,
+       .dev            = {
+               .platform_data = &cmx2xx_gpio_led_pdata,
+       },
+};
+
+static void __init cmx2xx_init_leds(void)
+{
+       if (cpu_is_pxa25x()) {
+               cmx2xx_leds[0].gpio = CMX255_GPIO_RED;
+               cmx2xx_leds[1].gpio = CMX255_GPIO_GREEN;
+       } else {
+               cmx2xx_leds[0].gpio = CMX270_GPIO_RED;
+               cmx2xx_leds[1].gpio = CMX270_GPIO_GREEN;
+       }
+       platform_device_register(&cmx2xx_led_device);
+}
+#else
+static inline void cmx2xx_init_leds(void) {}
+#endif
+
+#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
+/*
+  Display definitions
+  keep these for backwards compatibility, although symbolic names (as
+  e.g. in lpd270.c) looks better
+*/
+#define MTYPE_STN320x240       0
+#define MTYPE_TFT640x480       1
+#define MTYPE_CRT640x480       2
+#define MTYPE_CRT800x600       3
+#define MTYPE_TFT320x240       6
+#define MTYPE_STN640x480       7
+
+static struct pxafb_mode_info generic_stn_320x240_mode = {
+       .pixclock       = 76923,
+       .bpp            = 8,
+       .xres           = 320,
+       .yres           = 240,
+       .hsync_len      = 3,
+       .vsync_len      = 2,
+       .left_margin    = 3,
+       .upper_margin   = 0,
+       .right_margin   = 3,
+       .lower_margin   = 0,
+       .sync           = (FB_SYNC_HOR_HIGH_ACT |
+                          FB_SYNC_VERT_HIGH_ACT),
+       .cmap_greyscale = 0,
+};
+
+static struct pxafb_mach_info generic_stn_320x240 = {
+       .modes          = &generic_stn_320x240_mode,
+       .num_modes      = 1,
+       .lccr0          = 0,
+       .lccr3          = (LCCR3_PixClkDiv(0x03) |
+                          LCCR3_Acb(0xff) |
+                          LCCR3_PCP),
+       .cmap_inverse   = 0,
+       .cmap_static    = 0,
+};
+
+static struct pxafb_mode_info generic_tft_640x480_mode = {
+       .pixclock       = 38461,
+       .bpp            = 8,
+       .xres           = 640,
+       .yres           = 480,
+       .hsync_len      = 60,
+       .vsync_len      = 2,
+       .left_margin    = 70,
+       .upper_margin   = 10,
+       .right_margin   = 70,
+       .lower_margin   = 5,
+       .sync           = 0,
+       .cmap_greyscale = 0,
+};
+
+static struct pxafb_mach_info generic_tft_640x480 = {
+       .modes          = &generic_tft_640x480_mode,
+       .num_modes      = 1,
+       .lccr0          = (LCCR0_PAS),
+       .lccr3          = (LCCR3_PixClkDiv(0x01) |
+                          LCCR3_Acb(0xff) |
+                          LCCR3_PCP),
+       .cmap_inverse   = 0,
+       .cmap_static    = 0,
+};
+
+static struct pxafb_mode_info generic_crt_640x480_mode = {
+       .pixclock       = 38461,
+       .bpp            = 8,
+       .xres           = 640,
+       .yres           = 480,
+       .hsync_len      = 63,
+       .vsync_len      = 2,
+       .left_margin    = 81,
+       .upper_margin   = 33,
+       .right_margin   = 16,
+       .lower_margin   = 10,
+       .sync           = (FB_SYNC_HOR_HIGH_ACT |
+                          FB_SYNC_VERT_HIGH_ACT),
+       .cmap_greyscale = 0,
+};
+
+static struct pxafb_mach_info generic_crt_640x480 = {
+       .modes          = &generic_crt_640x480_mode,
+       .num_modes      = 1,
+       .lccr0          = (LCCR0_PAS),
+       .lccr3          = (LCCR3_PixClkDiv(0x01) |
+                          LCCR3_Acb(0xff)),
+       .cmap_inverse   = 0,
+       .cmap_static    = 0,
+};
+
+static struct pxafb_mode_info generic_crt_800x600_mode = {
+       .pixclock       = 28846,
+       .bpp            = 8,
+       .xres           = 800,
+       .yres           = 600,
+       .hsync_len      = 63,
+       .vsync_len      = 2,
+       .left_margin    = 26,
+       .upper_margin   = 21,
+       .right_margin   = 26,
+       .lower_margin   = 11,
+       .sync           = (FB_SYNC_HOR_HIGH_ACT |
+                          FB_SYNC_VERT_HIGH_ACT),
+       .cmap_greyscale = 0,
+};
+
+static struct pxafb_mach_info generic_crt_800x600 = {
+       .modes          = &generic_crt_800x600_mode,
+       .num_modes      = 1,
+       .lccr0          = (LCCR0_PAS),
+       .lccr3          = (LCCR3_PixClkDiv(0x02) |
+                          LCCR3_Acb(0xff)),
+       .cmap_inverse   = 0,
+       .cmap_static    = 0,
+};
+
+static struct pxafb_mode_info generic_tft_320x240_mode = {
+       .pixclock       = 134615,
+       .bpp            = 16,
+       .xres           = 320,
+       .yres           = 240,
+       .hsync_len      = 63,
+       .vsync_len      = 7,
+       .left_margin    = 75,
+       .upper_margin   = 0,
+       .right_margin   = 15,
+       .lower_margin   = 15,
+       .sync           = 0,
+       .cmap_greyscale = 0,
+};
+
+static struct pxafb_mach_info generic_tft_320x240 = {
+       .modes          = &generic_tft_320x240_mode,
+       .num_modes      = 1,
+       .lccr0          = (LCCR0_PAS),
+       .lccr3          = (LCCR3_PixClkDiv(0x06) |
+                          LCCR3_Acb(0xff) |
+                          LCCR3_PCP),
+       .cmap_inverse   = 0,
+       .cmap_static    = 0,
+};
+
+static struct pxafb_mode_info generic_stn_640x480_mode = {
+       .pixclock       = 57692,
+       .bpp            = 8,
+       .xres           = 640,
+       .yres           = 480,
+       .hsync_len      = 4,
+       .vsync_len      = 2,
+       .left_margin    = 10,
+       .upper_margin   = 5,
+       .right_margin   = 10,
+       .lower_margin   = 5,
+       .sync           = (FB_SYNC_HOR_HIGH_ACT |
+                          FB_SYNC_VERT_HIGH_ACT),
+       .cmap_greyscale = 0,
+};
+
+static struct pxafb_mach_info generic_stn_640x480 = {
+       .modes          = &generic_stn_640x480_mode,
+       .num_modes      = 1,
+       .lccr0          = 0,
+       .lccr3          = (LCCR3_PixClkDiv(0x02) |
+                          LCCR3_Acb(0xff)),
+       .cmap_inverse   = 0,
+       .cmap_static    = 0,
+};
+
+static struct pxafb_mach_info *cmx2xx_display = &generic_crt_640x480;
+
+static int __init cmx2xx_set_display(char *str)
+{
+       int disp_type = simple_strtol(str, NULL, 0);
+       switch (disp_type) {
+       case MTYPE_STN320x240:
+               cmx2xx_display = &generic_stn_320x240;
+               break;
+       case MTYPE_TFT640x480:
+               cmx2xx_display = &generic_tft_640x480;
+               break;
+       case MTYPE_CRT640x480:
+               cmx2xx_display = &generic_crt_640x480;
+               break;
+       case MTYPE_CRT800x600:
+               cmx2xx_display = &generic_crt_800x600;
+               break;
+       case MTYPE_TFT320x240:
+               cmx2xx_display = &generic_tft_320x240;
+               break;
+       case MTYPE_STN640x480:
+               cmx2xx_display = &generic_stn_640x480;
+               break;
+       default: /* fallback to CRT 640x480 */
+               cmx2xx_display = &generic_crt_640x480;
+               break;
+       }
+       return 1;
+}
+
+/*
+   This should be done really early to get proper configuration for
+   frame buffer.
+   Indeed, pxafb parameters can be used istead, but CM-X2XX bootloader
+   has limitied line length for kernel command line, and also it will
+   break compatibitlty with proprietary releases already in field.
+*/
+__setup("monitor=", cmx2xx_set_display);
+
+static void __init cmx2xx_init_display(void)
+{
+       set_pxa_fb_info(cmx2xx_display);
+}
+#else
+static inline void cmx2xx_init_display(void) {}
+#endif
+
+#ifdef CONFIG_PM
+static unsigned long sleep_save_msc[10];
+
+static int cmx2xx_suspend(struct sys_device *dev, pm_message_t state)
+{
+       cmx2xx_pci_suspend();
+
+       /* save MSC registers */
+       sleep_save_msc[0] = MSC0;
+       sleep_save_msc[1] = MSC1;
+       sleep_save_msc[2] = MSC2;
+
+       /* setup power saving mode registers */
+       PCFR = 0x0;
+       PSLR = 0xff400000;
+       PMCR  = 0x00000005;
+       PWER  = 0x80000000;
+       PFER  = 0x00000000;
+       PRER  = 0x00000000;
+       PGSR0 = 0xC0018800;
+       PGSR1 = 0x004F0002;
+       PGSR2 = 0x6021C000;
+       PGSR3 = 0x00020000;
+
+       return 0;
+}
+
+static int cmx2xx_resume(struct sys_device *dev)
+{
+       cmx2xx_pci_resume();
+
+       /* restore MSC registers */
+       MSC0 = sleep_save_msc[0];
+       MSC1 = sleep_save_msc[1];
+       MSC2 = sleep_save_msc[2];
+
+       return 0;
+}
+
+static struct sysdev_class cmx2xx_pm_sysclass = {
+       .name = "pm",
+       .resume = cmx2xx_resume,
+       .suspend = cmx2xx_suspend,
+};
+
+static struct sys_device cmx2xx_pm_device = {
+       .cls = &cmx2xx_pm_sysclass,
+};
+
+static int __init cmx2xx_pm_init(void)
+{
+       int error;
+       error = sysdev_class_register(&cmx2xx_pm_sysclass);
+       if (error == 0)
+               error = sysdev_register(&cmx2xx_pm_device);
+       return error;
+}
+#else
+static int __init cmx2xx_pm_init(void) { return 0; }
+#endif
+
+#if defined(CONFIG_SND_PXA2XX_AC97) || defined(CONFIG_SND_PXA2XX_AC97_MODULE)
+static void __init cmx2xx_init_ac97(void)
+{
+       pxa_set_ac97_info(NULL);
+}
+#else
+static inline void cmx2xx_init_ac97(void) {}
+#endif
+
+static void __init cmx2xx_init(void)
+{
+       cmx2xx_pm_init();
+
+       if (cpu_is_pxa25x())
+               cmx255_init();
+       else
+               cmx270_init();
+
+       cmx2xx_init_dm9000();
+       cmx2xx_init_display();
+       cmx2xx_init_ac97();
+       cmx2xx_init_touchscreen();
+       cmx2xx_init_leds();
+}
+
+static void __init cmx2xx_init_irq(void)
+{
+       pxa27x_init_irq();
+
+       if (cpu_is_pxa25x()) {
+               pxa25x_init_irq();
+               cmx2xx_pci_init_irq(CMX255_GPIO_IT8152_IRQ);
+       } else {
+               pxa27x_init_irq();
+               cmx2xx_pci_init_irq(CMX270_GPIO_IT8152_IRQ);
+       }
+}
+
+#ifdef CONFIG_PCI
+/* Map PCI companion statically */
+static struct map_desc cmx2xx_io_desc[] __initdata = {
+       [0] = { /* PCI bridge */
+               .virtual        = CMX2XX_IT8152_VIRT,
+               .pfn            = __phys_to_pfn(PXA_CS4_PHYS),
+               .length         = SZ_64M,
+               .type           = MT_DEVICE
+       },
+};
+
+static void __init cmx2xx_map_io(void)
+{
+       pxa_map_io();
+       iotable_init(cmx2xx_io_desc, ARRAY_SIZE(cmx2xx_io_desc));
+
+       it8152_base_address = CMX2XX_IT8152_VIRT;
+}
+#else
+static void __init cmx2xx_map_io(void)
+{
+       pxa_map_io();
+}
+#endif
+
+MACHINE_START(ARMCORE, "Compulab CM-X2XX")
+       .boot_params    = 0xa0000100,
+       .phys_io        = 0x40000000,
+       .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc,
+       .map_io         = cmx2xx_map_io,
+       .init_irq       = cmx2xx_init_irq,
+       .timer          = &pxa_timer,
+       .init_machine   = cmx2xx_init,
+MACHINE_END
diff --git a/arch/arm/mach-pxa/cm-x300.c b/arch/arm/mach-pxa/cm-x300.c
new file mode 100644 (file)
index 0000000..7bc5679
--- /dev/null
@@ -0,0 +1,473 @@
+/*
+ * linux/arch/arm/mach-pxa/cm-x300.c
+ *
+ * Support for the CompuLab CM-X300 modules
+ *
+ * Copyright (C) 2008 CompuLab Ltd.
+ *
+ * Mike Rapoport <mike@compulab.co.il>
+ *
+ * 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/kernel.h>
+#include <linux/interrupt.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+
+#include <linux/gpio.h>
+#include <linux/dm9000.h>
+#include <linux/leds.h>
+
+#include <linux/i2c.h>
+#include <linux/i2c/pca953x.h>
+
+#include <asm/mach-types.h>
+#include <asm/mach/arch.h>
+
+#include <mach/mfp-pxa300.h>
+
+#include <mach/hardware.h>
+#include <mach/gpio.h>
+#include <mach/pxafb.h>
+#include <mach/mmc.h>
+#include <mach/ohci.h>
+#include <mach/i2c.h>
+#include <mach/pxa3xx_nand.h>
+
+#include <asm/mach/map.h>
+
+#include "generic.h"
+
+#define CM_X300_ETH_PHYS       0x08000010
+
+#define GPIO82_MMC2_IRQ                (82)
+#define GPIO85_MMC2_WP         (85)
+
+#define        CM_X300_MMC2_IRQ        IRQ_GPIO(GPIO82_MMC2_IRQ)
+
+static mfp_cfg_t cm_x300_mfp_cfg[] __initdata = {
+       /* LCD */
+       GPIO54_LCD_LDD_0,
+       GPIO55_LCD_LDD_1,
+       GPIO56_LCD_LDD_2,
+       GPIO57_LCD_LDD_3,
+       GPIO58_LCD_LDD_4,
+       GPIO59_LCD_LDD_5,
+       GPIO60_LCD_LDD_6,
+       GPIO61_LCD_LDD_7,
+       GPIO62_LCD_LDD_8,
+       GPIO63_LCD_LDD_9,
+       GPIO64_LCD_LDD_10,
+       GPIO65_LCD_LDD_11,
+       GPIO66_LCD_LDD_12,
+       GPIO67_LCD_LDD_13,
+       GPIO68_LCD_LDD_14,
+       GPIO69_LCD_LDD_15,
+       GPIO72_LCD_FCLK,
+       GPIO73_LCD_LCLK,
+       GPIO74_LCD_PCLK,
+       GPIO75_LCD_BIAS,
+
+       /* BTUART */
+       GPIO111_UART2_RTS,
+       GPIO112_UART2_RXD | MFP_LPM_EDGE_FALL,
+       GPIO113_UART2_TXD,
+       GPIO114_UART2_CTS | MFP_LPM_EDGE_BOTH,
+
+       /* STUART */
+       GPIO109_UART3_TXD,
+       GPIO110_UART3_RXD | MFP_LPM_EDGE_FALL,
+
+       /* AC97 */
+       GPIO23_AC97_nACRESET,
+       GPIO24_AC97_SYSCLK,
+       GPIO29_AC97_BITCLK,
+       GPIO25_AC97_SDATA_IN_0,
+       GPIO27_AC97_SDATA_OUT,
+       GPIO28_AC97_SYNC,
+
+       /* Keypad */
+       GPIO115_KP_MKIN_0 | MFP_LPM_EDGE_BOTH,
+       GPIO116_KP_MKIN_1 | MFP_LPM_EDGE_BOTH,
+       GPIO117_KP_MKIN_2 | MFP_LPM_EDGE_BOTH,
+       GPIO118_KP_MKIN_3 | MFP_LPM_EDGE_BOTH,
+       GPIO119_KP_MKIN_4 | MFP_LPM_EDGE_BOTH,
+       GPIO120_KP_MKIN_5 | MFP_LPM_EDGE_BOTH,
+       GPIO2_2_KP_MKIN_6 | MFP_LPM_EDGE_BOTH,
+       GPIO3_2_KP_MKIN_7 | MFP_LPM_EDGE_BOTH,
+       GPIO121_KP_MKOUT_0,
+       GPIO122_KP_MKOUT_1,
+       GPIO123_KP_MKOUT_2,
+       GPIO124_KP_MKOUT_3,
+       GPIO125_KP_MKOUT_4,
+       GPIO4_2_KP_MKOUT_5,
+
+       /* MMC1 */
+       GPIO3_MMC1_DAT0,
+       GPIO4_MMC1_DAT1 | MFP_LPM_EDGE_BOTH,
+       GPIO5_MMC1_DAT2,
+       GPIO6_MMC1_DAT3,
+       GPIO7_MMC1_CLK,
+       GPIO8_MMC1_CMD, /* CMD0 for slot 0 */
+
+       /* MMC2 */
+       GPIO9_MMC2_DAT0,
+       GPIO10_MMC2_DAT1 | MFP_LPM_EDGE_BOTH,
+       GPIO11_MMC2_DAT2,
+       GPIO12_MMC2_DAT3,
+       GPIO13_MMC2_CLK,
+       GPIO14_MMC2_CMD,
+
+       /* FFUART */
+       GPIO30_UART1_RXD | MFP_LPM_EDGE_FALL,
+       GPIO31_UART1_TXD,
+       GPIO32_UART1_CTS,
+       GPIO37_UART1_RTS,
+       GPIO33_UART1_DCD,
+       GPIO34_UART1_DSR | MFP_LPM_EDGE_FALL,
+       GPIO35_UART1_RI,
+       GPIO36_UART1_DTR,
+
+       /* GPIOs */
+       GPIO79_GPIO,                    /* LED */
+       GPIO82_GPIO | MFP_PULL_HIGH,    /* MMC CD */
+       GPIO85_GPIO,                    /* MMC WP */
+       GPIO99_GPIO,                    /* Ethernet IRQ */
+};
+
+#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
+static struct resource dm9000_resources[] = {
+       [0] = {
+               .start  = CM_X300_ETH_PHYS,
+               .end    = CM_X300_ETH_PHYS + 0x3,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = CM_X300_ETH_PHYS + 0x4,
+               .end    = CM_X300_ETH_PHYS + 0x4 + 500,
+               .flags  = IORESOURCE_MEM,
+       },
+       [2] = {
+               .start  = IRQ_GPIO(mfp_to_gpio(MFP_PIN_GPIO99)),
+               .end    = IRQ_GPIO(mfp_to_gpio(MFP_PIN_GPIO99)),
+               .flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
+       }
+};
+
+static struct dm9000_plat_data cm_x300_dm9000_platdata = {
+       .flags          = DM9000_PLATF_16BITONLY,
+};
+
+static struct platform_device dm9000_device = {
+       .name           = "dm9000",
+       .id             = 0,
+       .num_resources  = ARRAY_SIZE(dm9000_resources),
+       .resource       = dm9000_resources,
+       .dev            = {
+               .platform_data = &cm_x300_dm9000_platdata,
+       }
+
+};
+
+static void __init cm_x300_init_dm9000(void)
+{
+       platform_device_register(&dm9000_device);
+}
+#else
+static inline void cm_x300_init_dm9000(void) {}
+#endif
+
+#if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
+static struct pxafb_mode_info cm_x300_lcd_modes[] = {
+       [0] = {
+               .pixclock       = 38000,
+               .bpp            = 16,
+               .xres           = 480,
+               .yres           = 640,
+               .hsync_len      = 8,
+               .vsync_len      = 2,
+               .left_margin    = 8,
+               .upper_margin   = 0,
+               .right_margin   = 24,
+               .lower_margin   = 4,
+               .cmap_greyscale = 0,
+       },
+       [1] = {
+               .pixclock       = 153800,
+               .bpp            = 16,
+               .xres           = 240,
+               .yres           = 320,
+               .hsync_len      = 8,
+               .vsync_len      = 2,
+               .left_margin    = 8,
+               .upper_margin   = 2,
+               .right_margin   = 88,
+               .lower_margin   = 2,
+               .cmap_greyscale = 0,
+       },
+};
+
+static struct pxafb_mach_info cm_x300_lcd = {
+       .modes                  = cm_x300_lcd_modes,
+       .num_modes              = 2,
+       .lcd_conn               = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
+};
+
+static void __init cm_x300_init_lcd(void)
+{
+       set_pxa_fb_info(&cm_x300_lcd);
+}
+#else
+static inline void cm_x300_init_lcd(void) {}
+#endif
+
+#if defined(CONFIG_MTD_NAND_PXA3xx) || defined(CONFIG_MTD_NAND_PXA3xx_MODULE)
+static struct mtd_partition cm_x300_nand_partitions[] = {
+       [0] = {
+               .name        = "OBM",
+               .offset      = 0,
+               .size        = SZ_256K,
+               .mask_flags  = MTD_WRITEABLE, /* force read-only */
+       },
+       [1] = {
+               .name        = "U-Boot",
+               .offset      = MTDPART_OFS_APPEND,
+               .size        = SZ_256K,
+               .mask_flags  = MTD_WRITEABLE, /* force read-only */
+       },
+       [2] = {
+               .name        = "Environment",
+               .offset      = MTDPART_OFS_APPEND,
+               .size        = SZ_256K,
+       },
+       [3] = {
+               .name        = "reserved",
+               .offset      = MTDPART_OFS_APPEND,
+               .size        = SZ_256K + SZ_1M,
+               .mask_flags  = MTD_WRITEABLE, /* force read-only */
+       },
+       [4] = {
+               .name        = "kernel",
+               .offset      = MTDPART_OFS_APPEND,
+               .size        = SZ_4M,
+       },
+       [5] = {
+               .name        = "fs",
+               .offset      = MTDPART_OFS_APPEND,
+               .size        = MTDPART_SIZ_FULL,
+       },
+};
+
+static struct pxa3xx_nand_platform_data cm_x300_nand_info = {
+       .enable_arbiter = 1,
+       .parts          = cm_x300_nand_partitions,
+       .nr_parts       = ARRAY_SIZE(cm_x300_nand_partitions),
+};
+
+static void __init cm_x300_init_nand(void)
+{
+       pxa3xx_set_nand_info(&cm_x300_nand_info);
+}
+#else
+static inline void cm_x300_init_nand(void) {}
+#endif
+
+#if defined(CONFIG_MMC) || defined(CONFIG_MMC_MODULE)
+/* The first MMC slot of CM-X300 is hardwired to Libertas card and has
+   no detection/ro pins */
+static int cm_x300_mci_init(struct device *dev,
+                           irq_handler_t cm_x300_detect_int,
+                           void *data)
+{
+       return 0;
+}
+
+static void cm_x300_mci_exit(struct device *dev, void *data)
+{
+}
+
+static struct pxamci_platform_data cm_x300_mci_platform_data = {
+       .detect_delay   = 20,
+       .ocr_mask       = MMC_VDD_32_33|MMC_VDD_33_34,
+       .init           = cm_x300_mci_init,
+       .exit           = cm_x300_mci_exit,
+};
+
+static int cm_x300_mci2_ro(struct device *dev)
+{
+       return gpio_get_value(GPIO85_MMC2_WP);
+}
+
+static int cm_x300_mci2_init(struct device *dev,
+                            irq_handler_t cm_x300_detect_int,
+                            void *data)
+{
+       int err;
+
+       /*
+        * setup GPIO for CM-X300 MMC controller
+        */
+       err = gpio_request(GPIO82_MMC2_IRQ, "mmc card detect");
+       if (err)
+               goto err_request_cd;
+       gpio_direction_input(GPIO82_MMC2_IRQ);
+
+       err = gpio_request(GPIO85_MMC2_WP, "mmc write protect");
+       if (err)
+               goto err_request_wp;
+       gpio_direction_input(GPIO85_MMC2_WP);
+
+       err = request_irq(CM_X300_MMC2_IRQ, cm_x300_detect_int,
+                         IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
+                         "MMC card detect", data);
+       if (err) {
+               printk(KERN_ERR "%s: MMC/SD/SDIO: "
+                               "can't request card detect IRQ\n", __func__);
+               goto err_request_irq;
+       }
+
+       return 0;
+
+err_request_irq:
+       gpio_free(GPIO85_MMC2_WP);
+err_request_wp:
+       gpio_free(GPIO82_MMC2_IRQ);
+err_request_cd:
+       return err;
+}
+
+static void cm_x300_mci2_exit(struct device *dev, void *data)
+{
+       free_irq(CM_X300_MMC2_IRQ, data);
+       gpio_free(GPIO82_MMC2_IRQ);
+       gpio_free(GPIO85_MMC2_WP);
+}
+
+static struct pxamci_platform_data cm_x300_mci2_platform_data = {
+       .detect_delay   = 20,
+       .ocr_mask       = MMC_VDD_32_33|MMC_VDD_33_34,
+       .init           = cm_x300_mci2_init,
+       .exit           = cm_x300_mci2_exit,
+       .get_ro         = cm_x300_mci2_ro,
+};
+
+static void __init cm_x300_init_mmc(void)
+{
+       pxa_set_mci_info(&cm_x300_mci_platform_data);
+       pxa3xx_set_mci2_info(&cm_x300_mci2_platform_data);
+}
+#else
+static inline void cm_x300_init_mmc(void) {}
+#endif
+
+#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
+static int cm_x300_ohci_init(struct device *dev)
+{
+       /* Set the Power Control Polarity Low */
+       UHCHR = (UHCHR | UHCHR_PCPL) &
+               ~(UHCHR_SSEP1 | UHCHR_SSEP2 | UHCHR_SSE);
+
+       return 0;
+}
+
+static struct pxaohci_platform_data cm_x300_ohci_platform_data = {
+       .port_mode      = PMM_PERPORT_MODE,
+       .init           = cm_x300_ohci_init,
+};
+static void __init cm_x300_init_ohci(void)
+{
+       pxa_set_ohci_info(&cm_x300_ohci_platform_data);
+}
+#else
+static inline void cm_x300_init_ohci(void) {}
+#endif
+
+#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
+static struct gpio_led cm_x300_leds[] = {
+       [0] = {
+               .name = "cm-x300:green",
+               .default_trigger = "heartbeat",
+               .gpio = 79,
+               .active_low = 1,
+       },
+};
+
+static struct gpio_led_platform_data cm_x300_gpio_led_pdata = {
+       .num_leds = ARRAY_SIZE(cm_x300_leds),
+       .leds = cm_x300_leds,
+};
+
+static struct platform_device cm_x300_led_device = {
+       .name           = "leds-gpio",
+       .id             = -1,
+       .dev            = {
+               .platform_data = &cm_x300_gpio_led_pdata,
+       },
+};
+
+static void __init cm_x300_init_leds(void)
+{
+       platform_device_register(&cm_x300_led_device);
+}
+#else
+static inline void cm_x300_init_leds(void) {}
+#endif
+
+#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
+/* PCA9555 */
+static struct pca953x_platform_data cm_x300_gpio_ext_pdata_0 = {
+       .gpio_base = 128,
+};
+
+static struct pca953x_platform_data cm_x300_gpio_ext_pdata_1 = {
+       .gpio_base = 144,
+};
+
+static struct i2c_board_info cm_x300_gpio_ext_info[] = {
+       [0] = {
+               I2C_BOARD_INFO("pca9555", 0x24),
+               .platform_data = &cm_x300_gpio_ext_pdata_0,
+       },
+       [1] = {
+               I2C_BOARD_INFO("pca9555", 0x25),
+               .platform_data = &cm_x300_gpio_ext_pdata_1,
+       },
+};
+
+static void __init cm_x300_init_i2c(void)
+{
+       pxa_set_i2c_info(NULL);
+       i2c_register_board_info(0, cm_x300_gpio_ext_info,
+                               ARRAY_SIZE(cm_x300_gpio_ext_info));
+}
+#else
+static inline void cm_x300_init_i2c(void) {}
+#endif
+
+static void __init cm_x300_init(void)
+{
+       /* board-processor specific GPIO initialization */
+       pxa3xx_mfp_config(ARRAY_AND_SIZE(cm_x300_mfp_cfg));
+
+       cm_x300_init_dm9000();
+       cm_x300_init_lcd();
+       cm_x300_init_ohci();
+       cm_x300_init_mmc();
+       cm_x300_init_nand();
+       cm_x300_init_leds();
+       cm_x300_init_i2c();
+}
+
+MACHINE_START(CM_X300, "CM-X300 module")
+       .phys_io        = 0x40000000,
+       .boot_params    = 0xa0000100,
+       .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc,
+       .map_io         = pxa_map_io,
+       .init_irq       = pxa3xx_init_irq,
+       .timer          = &pxa_timer,
+       .init_machine   = cm_x300_init,
+MACHINE_END
index abce13c..e847362 100644 (file)
 #include <asm/mach/irq.h>
 #include <asm/mach/flash.h>
 #include <mach/pxa-regs.h>
-#include <mach/pxa2xx-gpio.h>
+#include <mach/mfp-pxa27x.h>
 #include <mach/colibri.h>
 
 #include "generic.h"
 #include "devices.h"
 
+static unsigned long colibri_pin_config[] __initdata = {
+       GPIO78_nCS_2,   /* Ethernet CS */
+       GPIO114_GPIO,   /* Ethernet IRQ */
+};
+
 /*
  * Flash
  */
@@ -116,9 +121,7 @@ static struct platform_device *colibri_devices[] __initdata = {
 
 static void __init colibri_init(void)
 {
-       /* DM9000 LAN */
-       pxa_gpio_mode(GPIO78_nCS_2_MD);
-       pxa_gpio_mode(GPIO_DM9000 | GPIO_IN);
+       pxa2xx_mfp_config(ARRAY_AND_SIZE(colibri_pin_config));
 
        platform_add_devices(colibri_devices, ARRAY_SIZE(colibri_devices));
 }
index 041c048..dc876a8 100644 (file)
@@ -65,4 +65,5 @@ static inline void pxa3xx_clear_reset_status(unsigned int mask) {}
 
 extern struct sysdev_class pxa_irq_sysclass;
 extern struct sysdev_class pxa_gpio_sysclass;
+extern struct sysdev_class pxa2xx_mfp_sysclass;
 extern struct sysdev_class pxa3xx_mfp_sysclass;
index c009247..d8962a0 100644 (file)
 #include <linux/init.h>
 #include <linux/platform_device.h>
 #include <linux/interrupt.h>
+#include <linux/delay.h>
 #include <linux/mtd/mtd.h>
 #include <linux/mtd/partitions.h>
+#include <linux/gpio.h>
+#include <linux/err.h>
+#include <linux/clk.h>
 
 #include <asm/setup.h>
 #include <asm/memory.h>
@@ -40,7 +44,7 @@
 
 #include <mach/pxa-regs.h>
 #include <mach/pxa2xx-regs.h>
-#include <mach/pxa2xx-gpio.h>
+#include <mach/mfp-pxa25x.h>
 
 #include "generic.h"
 
@@ -85,21 +89,8 @@ static struct platform_device *devices[] __initdata = {
 };
 
 #ifdef CONFIG_MMC_PXA
-static struct pxamci_platform_data gumstix_mci_platform_data;
-
-static int gumstix_mci_init(struct device *dev, irq_handler_t detect_int,
-                               void *data)
-{
-       pxa_gpio_mode(GPIO6_MMCCLK_MD);
-       pxa_gpio_mode(GPIO53_MMCCLK_MD);
-       pxa_gpio_mode(GPIO8_MMCCS0_MD);
-
-       return 0;
-}
-
 static struct pxamci_platform_data gumstix_mci_platform_data = {
        .ocr_mask       = MMC_VDD_32_33|MMC_VDD_33_34,
-       .init           = gumstix_mci_init,
 };
 
 static void __init gumstix_mmc_init(void)
@@ -109,11 +100,11 @@ static void __init gumstix_mmc_init(void)
 #else
 static void __init gumstix_mmc_init(void)
 {
-       printk(KERN_INFO "Gumstix mmc disabled\n");
+       pr_debug("Gumstix mmc disabled\n");
 }
 #endif
 
-#ifdef CONFIG_USB_GADGET_PXA2XX
+#ifdef CONFIG_USB_GADGET_PXA25X
 static struct pxa2xx_udc_mach_info gumstix_udc_info __initdata = {
        .gpio_vbus              = GPIO_GUMSTIX_USB_GPIOn,
        .gpio_pullup            = GPIO_GUMSTIX_USB_GPIOx,
@@ -126,12 +117,87 @@ static void __init gumstix_udc_init(void)
 #else
 static void gumstix_udc_init(void)
 {
-       printk(KERN_INFO "Gumstix udc is disabled\n");
+       pr_debug("Gumstix udc is disabled\n");
 }
 #endif
 
+#ifdef CONFIG_BT
+/* Normally, the bootloader would have enabled this 32kHz clock but many
+** boards still have u-boot 1.1.4 so we check if it has been turned on and
+** if not, we turn it on with a warning message. */
+static void gumstix_setup_bt_clock(void)
+{
+       int timeout = 500;
+
+       if (!(OSCC & OSCC_OOK))
+               pr_warning("32kHz clock was not on. Bootloader may need to "
+                               "be updated\n");
+       else
+               return;
+
+       OSCC |= OSCC_OON;
+       do {
+               if (OSCC & OSCC_OOK)
+                       break;
+               udelay(1);
+       } while (--timeout);
+       if (!timeout)
+               pr_err("Failed to start 32kHz clock\n");
+}
+
+static void __init gumstix_bluetooth_init(void)
+{
+       int err;
+
+       gumstix_setup_bt_clock();
+
+       err = gpio_request(GPIO_GUMSTIX_BTRESET, "BTRST");
+       if (err) {
+               pr_err("gumstix: failed request gpio for bluetooth reset\n");
+               return;
+       }
+
+       err = gpio_direction_output(GPIO_GUMSTIX_BTRESET, 1);
+       if (err) {
+               pr_err("gumstix: can't reset bluetooth\n");
+               return;
+       }
+       gpio_set_value(GPIO_GUMSTIX_BTRESET, 0);
+       udelay(100);
+       gpio_set_value(GPIO_GUMSTIX_BTRESET, 1);
+}
+#else
+static void gumstix_bluetooth_init(void)
+{
+       pr_debug("Gumstix Bluetooth is disabled\n");
+}
+#endif
+
+static unsigned long gumstix_pin_config[] __initdata = {
+       GPIO12_32KHz,
+       /* BTUART */
+       GPIO42_HWUART_RXD,
+       GPIO43_HWUART_TXD,
+       GPIO44_HWUART_CTS,
+       GPIO45_HWUART_RTS,
+       /* MMC */
+       GPIO6_MMC_CLK,
+       GPIO53_MMC_CLK,
+       GPIO8_MMC_CS0,
+       /* these are used by AM200EPD */
+       GPIO51_GPIO,
+       GPIO49_GPIO,
+       GPIO48_GPIO,
+       GPIO32_GPIO,
+       GPIO17_GPIO,
+       GPIO16_GPIO,
+};
+
 static void __init gumstix_init(void)
 {
+       pxa2xx_mfp_config(ARRAY_AND_SIZE(gumstix_pin_config));
+
+       gumstix_bluetooth_init();
        gumstix_udc_init();
        gumstix_mmc_init();
        (void) platform_add_devices(devices, ARRAY_SIZE(devices));
index 5aa0270..013b15b 100644 (file)
@@ -32,7 +32,7 @@
 #include <asm/mach/map.h>
 
 #include <mach/pxa-regs.h>
-#include <mach/pxa2xx-gpio.h>
+#include <mach/mfp-pxa25x.h>
 #include <mach/idp.h>
 #include <mach/pxafb.h>
 #include <mach/bitfield.h>
  * - Ethernet interrupt
  */
 
+static unsigned long idp_pin_config[] __initdata = {
+       /* LCD */
+       GPIO58_LCD_LDD_0,
+       GPIO59_LCD_LDD_1,
+       GPIO60_LCD_LDD_2,
+       GPIO61_LCD_LDD_3,
+       GPIO62_LCD_LDD_4,
+       GPIO63_LCD_LDD_5,
+       GPIO64_LCD_LDD_6,
+       GPIO65_LCD_LDD_7,
+       GPIO66_LCD_LDD_8,
+       GPIO67_LCD_LDD_9,
+       GPIO68_LCD_LDD_10,
+       GPIO69_LCD_LDD_11,
+       GPIO70_LCD_LDD_12,
+       GPIO71_LCD_LDD_13,
+       GPIO72_LCD_LDD_14,
+       GPIO73_LCD_LDD_15,
+       GPIO74_LCD_FCLK,
+       GPIO75_LCD_LCLK,
+       GPIO76_LCD_PCLK,
+
+       /* BTUART */
+       GPIO42_BTUART_RXD,
+       GPIO43_BTUART_TXD,
+       GPIO44_BTUART_CTS,
+       GPIO45_BTUART_RTS,
+
+       /* STUART */
+       GPIO46_STUART_RXD,
+       GPIO47_STUART_TXD,
+
+       /* MMC */
+       GPIO6_MMC_CLK,
+       GPIO8_MMC_CS0,
+
+       /* Ethernet */
+       GPIO33_nCS_5,   /* Ethernet CS */
+       GPIO4_GPIO,     /* Ethernet IRQ */
+};
+
 static struct resource smc91x_resources[] = {
        [0] = {
                .start  = (IDP_ETH_PHYS + 0x300),
@@ -121,44 +162,28 @@ static struct pxafb_mach_info sharp_lm8v31 = {
        .num_modes      = 1,
        .cmap_inverse   = 0,
        .cmap_static    = 0,
-       .lccr0          = LCCR0_SDS,
-       .lccr3          = LCCR3_PCP | LCCR3_Acb(255),
+       .lcd_conn       = LCD_COLOR_DSTN_16BPP | LCD_PCLK_EDGE_FALL |
+                         LCD_AC_BIAS_FREQ(255),
        .pxafb_backlight_power = &idp_backlight_power,
        .pxafb_lcd_power = &idp_lcd_power
 };
 
-static int idp_mci_init(struct device *dev, irq_handler_t idp_detect_int, void *data)
-{
-       /* setup GPIO for PXA25x MMC controller */
-       pxa_gpio_mode(GPIO6_MMCCLK_MD);
-       pxa_gpio_mode(GPIO8_MMCCS0_MD);
-
-       return 0;
-}
-
 static struct pxamci_platform_data idp_mci_platform_data = {
        .ocr_mask       = MMC_VDD_32_33|MMC_VDD_33_34,
-       .init           = idp_mci_init,
 };
 
 static void __init idp_init(void)
 {
        printk("idp_init()\n");
 
+       pxa2xx_mfp_config(ARRAY_AND_SIZE(idp_pin_config));
+
        platform_device_register(&smc91x_device);
        //platform_device_register(&mst_audio_device);
        set_pxa_fb_info(&sharp_lm8v31);
        pxa_set_mci_info(&idp_mci_platform_data);
 }
 
-static void __init idp_init_irq(void)
-{
-
-       pxa25x_init_irq();
-
-       set_irq_type(TOUCH_PANEL_IRQ, TOUCH_PANEL_IRQ_EDGE);
-}
-
 static struct map_desc idp_io_desc[] __initdata = {
        {
                .virtual        =  IDP_COREVOLT_VIRT,
@@ -177,15 +202,6 @@ static void __init idp_map_io(void)
 {
        pxa_map_io();
        iotable_init(idp_io_desc, ARRAY_SIZE(idp_io_desc));
-
-       // serial ports 2 & 3
-       pxa_gpio_mode(GPIO42_BTRXD_MD);
-       pxa_gpio_mode(GPIO43_BTTXD_MD);
-       pxa_gpio_mode(GPIO44_BTCTS_MD);
-       pxa_gpio_mode(GPIO45_BTRTS_MD);
-       pxa_gpio_mode(GPIO46_STRXD_MD);
-       pxa_gpio_mode(GPIO47_STTXD_MD);
-
 }
 
 
@@ -194,7 +210,7 @@ MACHINE_START(PXA_IDP, "Vibren PXA255 IDP")
        .phys_io        = 0x40000000,
        .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc,
        .map_io         = idp_map_io,
-       .init_irq       = idp_init_irq,
+       .init_irq       = pxa25x_init_irq,
        .timer          = &pxa_timer,
        .init_machine   = idp_init,
 MACHINE_END
index 552eb7f..59aef89 100644 (file)
 #define NODE_MEM_SIZE_BITS     26
 
 #if !defined(__ASSEMBLY__) && defined(CONFIG_MACH_ARMCORE) && defined(CONFIG_PCI)
-void cmx270_pci_adjust_zones(int node, unsigned long *size,
+void cmx2xx_pci_adjust_zones(int node, unsigned long *size,
                             unsigned long *holes);
 
 #define arch_adjust_zones(node, size, holes) \
-       cmx270_pci_adjust_zones(node, size, holes)
+       cmx2xx_pci_adjust_zones(node, size, holes)
 
 #define ISA_DMA_THRESHOLD      (PHYS_OFFSET + SZ_64M - 1)
 #endif
index 6c8e722..617cab2 100644 (file)
@@ -17,7 +17,7 @@
 
 /* Crystal and Clock Signals */
 #define GPIO10_RTCCLK          MFP_CFG_OUT(GPIO10, AF1, DRIVE_LOW)
-#define GPIO70_RTC_CLK         MFP_CFG_OUT(GPIO70, AF1, DRIVE_LOW)
+#define GPIO70_RTCCLK          MFP_CFG_OUT(GPIO70, AF1, DRIVE_LOW)
 #define GPIO7_48MHz            MFP_CFG_OUT(GPIO7,  AF1, DRIVE_LOW)
 #define GPIO11_3_6MHz          MFP_CFG_OUT(GPIO11, AF1, DRIVE_LOW)
 #define GPIO71_3_6MHz          MFP_CFG_OUT(GPIO71, AF1, DRIVE_LOW)
 #define GPIO74_LCD_FCLK                MFP_CFG_OUT(GPIO74, AF2, DRIVE_LOW)
 #define GPIO75_LCD_LCLK                MFP_CFG_OUT(GPIO75, AF2, DRIVE_LOW)
 #define GPIO76_LCD_PCLK                MFP_CFG_OUT(GPIO76, AF2, DRIVE_LOW)
-#define GPIO77_LCD_ACBIAS      MFP_CFG_OUT(GPIO77, AF2, DRIVE_LOW)
+#define GPIO77_LCD_BIAS                MFP_CFG_OUT(GPIO77, AF2, DRIVE_LOW)
 
 #endif /* __ASM_ARCH_MFP_PXA25X_H */
index 7499051..67f8385 100644 (file)
 #define GPIO38_SSP2_RXD                MFP_CFG(GPIO38, AF2)
 #define GPIO38_SSP2_TXD                MFP_CFG(GPIO38, AF5)
 
-#define GPIO69_SSP3_SCLK       MFP_CFG(GPIO69, AF2, DS08X, FLOAT)
-#define GPIO70_SSP3_FRM                MFP_CFG(GPIO70, AF2, DS08X, DRIVE_LOW)
-#define GPIO89_SSP3_SCLK       MFP_CFG(GPIO89, AF1, DS08X, FLOAT)
-#define GPIO90_SSP3_FRM                MFP_CFG(GPIO90, AF1, DS08X, DRIVE_LOW)
+#define GPIO69_SSP3_SCLK       MFP_CFG_X(GPIO69, AF2, DS08X, FLOAT)
+#define GPIO70_SSP3_FRM                MFP_CFG_X(GPIO70, AF2, DS08X, DRIVE_LOW)
+#define GPIO89_SSP3_SCLK       MFP_CFG_X(GPIO89, AF1, DS08X, FLOAT)
+#define GPIO90_SSP3_FRM                MFP_CFG_X(GPIO90, AF1, DS08X, DRIVE_LOW)
 #define GPIO71_SSP3_RXD                MFP_CFG_X(GPIO71, AF5, DS08X, FLOAT)
 #define GPIO71_SSP3_TXD                MFP_CFG_X(GPIO71, AF2, DS08X, DRIVE_LOW)
 #define GPIO72_SSP3_RXD                MFP_CFG_X(GPIO72, AF2, DS08X, FLOAT)
index 8769567..4821850 100644 (file)
@@ -274,12 +274,13 @@ typedef unsigned long mfp_cfg_t;
 #define MFP_DS_MASK            (0x7 << 13)
 #define MFP_DS(x)              (((x) >> 13) & 0x7)
 
-#define MFP_LPM_INPUT          (0x0 << 16)
+#define MFP_LPM_DEFAULT                (0x0 << 16)
 #define MFP_LPM_DRIVE_LOW      (0x1 << 16)
 #define MFP_LPM_DRIVE_HIGH     (0x2 << 16)
 #define MFP_LPM_PULL_LOW       (0x3 << 16)
 #define MFP_LPM_PULL_HIGH      (0x4 << 16)
 #define MFP_LPM_FLOAT          (0x5 << 16)
+#define MFP_LPM_INPUT          (0x6 << 16)
 #define MFP_LPM_STATE_MASK     (0x7 << 16)
 #define MFP_LPM_STATE(x)       (((x) >> 16) & 0x7)
 
@@ -297,7 +298,7 @@ typedef unsigned long mfp_cfg_t;
 #define MFP_PULL_MASK          (0x3 << 21)
 #define MFP_PULL(x)            (((x) >> 21) & 0x3)
 
-#define MFP_CFG_DEFAULT                (MFP_AF0 | MFP_DS03X | MFP_LPM_INPUT |\
+#define MFP_CFG_DEFAULT                (MFP_AF0 | MFP_DS03X | MFP_LPM_DEFAULT |\
                                 MFP_LPM_EDGE_NONE | MFP_PULL_NONE)
 
 #define MFP_CFG(pin, af)               \
diff --git a/arch/arm/mach-pxa/include/mach/mioa701.h b/arch/arm/mach-pxa/include/mach/mioa701.h
new file mode 100644 (file)
index 0000000..8483cb5
--- /dev/null
@@ -0,0 +1,67 @@
+#ifndef _MIOA701_H_
+#define _MIOA701_H_
+
+#define MIO_CFG_IN(pin, af)            \
+       ((MFP_CFG_DEFAULT & ~(MFP_AF_MASK | MFP_DIR_MASK)) |\
+        (MFP_PIN(pin) | MFP_##af | MFP_DIR_IN))
+
+#define MIO_CFG_OUT(pin, af, state)    \
+       ((MFP_CFG_DEFAULT & ~(MFP_AF_MASK | MFP_DIR_MASK | MFP_LPM_STATE_MASK)) |\
+        (MFP_PIN(pin) | MFP_##af | MFP_DIR_OUT | MFP_LPM_##state))
+
+/* Global GPIOs */
+#define GPIO9_CHARGE_nEN                       9
+#define GPIO18_POWEROFF                                18
+#define GPIO87_LCD_POWER                       87
+
+/* USB */
+#define GPIO13_USB_DETECT                      13
+#define GPIO22_USB_ENABLE                      22
+
+/* SDIO bits */
+#define GPIO78_SDIO_RO                         78
+#define GPIO15_SDIO_INSERT                     15
+#define GPIO91_SDIO_EN                         91
+
+/* Bluetooth */
+#define GPIO83_BT_ON                           83
+
+/* GPS */
+#define GPIO23_GPS_UNKNOWN1                    23
+#define GPIO26_GPS_ON                          26
+#define GPIO27_GPS_RESET                       27
+#define GPIO106_GPS_UNKNOWN2                   106
+#define GPIO107_GPS_UNKNOWN3                   107
+
+/* GSM */
+#define GPIO24_GSM_MOD_RESET_CMD               24
+#define GPIO88_GSM_nMOD_ON_CMD                 88
+#define GPIO90_GSM_nMOD_OFF_CMD                        90
+#define GPIO114_GSM_nMOD_DTE_UART_STATE        114
+#define GPIO25_GSM_MOD_ON_STATE                        25
+#define GPIO113_GSM_EVENT                      113
+
+/* SOUND */
+#define GPIO12_HPJACK_INSERT                   12
+
+/* LEDS */
+#define GPIO10_LED_nCharging                   10
+#define GPIO97_LED_nBlue                       97
+#define GPIO98_LED_nOrange                     98
+#define GPIO82_LED_nVibra                      82
+#define GPIO115_LED_nKeyboard                  115
+
+/* Keyboard */
+#define GPIO0_KEY_POWER                                0
+#define GPIO93_KEY_VOLUME_UP                   93
+#define GPIO94_KEY_VOLUME_DOWN                 94
+
+extern struct input_dev *mioa701_evdev;
+extern void mioa701_gpio_lpm_set(unsigned long mfp_pin);
+
+/* Assembler externals mioa701_bootresume.S */
+extern u32 mioa701_bootstrap;
+extern u32 mioa701_jumpaddr;
+extern u32 mioa701_bootstrap_lg;
+
+#endif /* _MIOA701_H */
index b703894..7b158e5 100644 (file)
@@ -40,7 +40,7 @@
 
 #include <mach/pxa-regs.h>
 #include <mach/pxa2xx-regs.h>
-#include <mach/pxa2xx-gpio.h>
+#include <mach/mfp-pxa27x.h>
 #include <mach/lpd270.h>
 #include <mach/audio.h>
 #include <mach/pxafb.h>
 #include "generic.h"
 #include "devices.h"
 
+static unsigned long lpd270_pin_config[] __initdata = {
+       /* Chip Selects */
+       GPIO15_nCS_1,   /* Mainboard Flash */
+       GPIO78_nCS_2,   /* CPLD + Ethernet */
+
+       /* LCD - 16bpp Active TFT */
+       GPIO58_LCD_LDD_0,
+       GPIO59_LCD_LDD_1,
+       GPIO60_LCD_LDD_2,
+       GPIO61_LCD_LDD_3,
+       GPIO62_LCD_LDD_4,
+       GPIO63_LCD_LDD_5,
+       GPIO64_LCD_LDD_6,
+       GPIO65_LCD_LDD_7,
+       GPIO66_LCD_LDD_8,
+       GPIO67_LCD_LDD_9,
+       GPIO68_LCD_LDD_10,
+       GPIO69_LCD_LDD_11,
+       GPIO70_LCD_LDD_12,
+       GPIO71_LCD_LDD_13,
+       GPIO72_LCD_LDD_14,
+       GPIO73_LCD_LDD_15,
+       GPIO74_LCD_FCLK,
+       GPIO75_LCD_LCLK,
+       GPIO76_LCD_PCLK,
+       GPIO77_LCD_BIAS,
+       GPIO16_PWM0_OUT,        /* Backlight */
+
+       /* USB Host */
+       GPIO88_USBH1_PWR,
+       GPIO89_USBH1_PEN,
+
+       /* AC97 */
+       GPIO45_AC97_SYSCLK,
+
+       GPIO1_GPIO | WAKEUP_ON_EDGE_BOTH,
+};
 
 static unsigned int lpd270_irq_enabled;
 
@@ -265,8 +302,8 @@ static struct pxafb_mode_info sharp_lq057q3dc02_mode = {
 static struct pxafb_mach_info sharp_lq057q3dc02 = {
        .modes                  = &sharp_lq057q3dc02_mode,
        .num_modes              = 1,
-       .lccr0                  = 0x07800080,
-       .lccr3                  = 0x00400000,
+       .lcd_conn               = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL |
+                                 LCD_ALTERNATE_MAPPING,
 };
 
 /* 12.1" TFT SVGA (LoLo display number 2) */
@@ -287,8 +324,8 @@ static struct pxafb_mode_info sharp_lq121s1dg31_mode = {
 static struct pxafb_mach_info sharp_lq121s1dg31 = {
        .modes                  = &sharp_lq121s1dg31_mode,
        .num_modes              = 1,
-       .lccr0                  = 0x07800080,
-       .lccr3                  = 0x00400000,
+       .lcd_conn               = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL |
+                                 LCD_ALTERNATE_MAPPING,
 };
 
 /* 3.6" TFT QVGA (LoLo display number 3) */
@@ -309,8 +346,8 @@ static struct pxafb_mode_info sharp_lq036q1da01_mode = {
 static struct pxafb_mach_info sharp_lq036q1da01 = {
        .modes                  = &sharp_lq036q1da01_mode,
        .num_modes              = 1,
-       .lccr0                  = 0x07800080,
-       .lccr3                  = 0x00400000,
+       .lcd_conn               = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL |
+                                 LCD_ALTERNATE_MAPPING,
 };
 
 /* 6.4" TFT VGA (LoLo display number 5) */
@@ -331,8 +368,8 @@ static struct pxafb_mode_info sharp_lq64d343_mode = {
 static struct pxafb_mach_info sharp_lq64d343 = {
        .modes                  = &sharp_lq64d343_mode,
        .num_modes              = 1,
-       .lccr0                  = 0x07800080,
-       .lccr3                  = 0x00400000,
+       .lcd_conn               = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL |
+                                 LCD_ALTERNATE_MAPPING,
 };
 
 /* 10.4" TFT VGA (LoLo display number 7) */
@@ -353,8 +390,8 @@ static struct pxafb_mode_info sharp_lq10d368_mode = {
 static struct pxafb_mach_info sharp_lq10d368 = {
        .modes                  = &sharp_lq10d368_mode,
        .num_modes              = 1,
-       .lccr0                  = 0x07800080,
-       .lccr3                  = 0x00400000,
+       .lcd_conn               = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL |
+                                 LCD_ALTERNATE_MAPPING,
 };
 
 /* 3.5" TFT QVGA (LoLo display number 8) */
@@ -375,8 +412,8 @@ static struct pxafb_mode_info sharp_lq035q7db02_20_mode = {
 static struct pxafb_mach_info sharp_lq035q7db02_20 = {
        .modes                  = &sharp_lq035q7db02_20_mode,
        .num_modes              = 1,
-       .lccr0                  = 0x07800080,
-       .lccr3                  = 0x00400000,
+       .lcd_conn               = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL |
+                                 LCD_ALTERNATE_MAPPING,
 };
 
 static struct pxafb_mach_info *lpd270_lcd_to_use;
@@ -413,10 +450,6 @@ static struct platform_device *platform_devices[] __initdata = {
 
 static int lpd270_ohci_init(struct device *dev)
 {
-       /* setup Port1 GPIO pin. */
-       pxa_gpio_mode(88 | GPIO_ALT_FN_1_IN);   /* USBHPWR1 */
-       pxa_gpio_mode(89 | GPIO_ALT_FN_2_OUT);  /* USBHPEN1 */
-
        /* Set the Power Control Polarity Low and Power Sense
           Polarity Low to active low. */
        UHCHR = (UHCHR | UHCHR_PCPL | UHCHR_PSPL) &
@@ -432,6 +465,8 @@ static struct pxaohci_platform_data lpd270_ohci_platform_data = {
 
 static void __init lpd270_init(void)
 {
+       pxa2xx_mfp_config(ARRAY_AND_SIZE(lpd270_pin_config));
+
        lpd270_flash_data[0].width = (BOOT_DEF & 1) ? 2 : 4;
        lpd270_flash_data[1].width = 4;
 
@@ -442,12 +477,6 @@ static void __init lpd270_init(void)
         */
        ARB_CNTRL = ARB_CORE_PARK | 0x234;
 
-       /*
-        * On LogicPD PXA270, we route AC97_SYSCLK via GPIO45.
-        */
-       pxa_gpio_mode(GPIO45_SYSCLK_AC97_MD);
-       pxa_gpio_mode(GPIO16_PWM0_MD);
-
        platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
 
        pxa_set_ac97_info(NULL);
@@ -473,15 +502,6 @@ static void __init lpd270_map_io(void)
        pxa_map_io();
        iotable_init(lpd270_io_desc, ARRAY_SIZE(lpd270_io_desc));
 
-       /* initialize sleep mode regs (wake-up sources, etc) */
-       PGSR0 = 0x00008800;
-       PGSR1 = 0x00000002;
-       PGSR2 = 0x0001FC00;
-       PGSR3 = 0x00001F81;
-       PWER  = 0xC0000002;
-       PRER  = 0x00000002;
-       PFER  = 0x00000002;
-
        /* for use I SRAM as framebuffer.  */
        PSLR |= 0x00000F04;
        PCFR  = 0x00000066;
index 4ffdff2..ecbfbb9 100644 (file)
 
 static unsigned long lubbock_pin_config[] __initdata = {
        GPIO15_nCS_1,   /* CS1 - Flash */
+       GPIO78_nCS_2,   /* CS2 - Baseboard FGPA */
        GPIO79_nCS_3,   /* CS3 - SMC ethernet */
+       GPIO80_nCS_4,   /* CS4 - SA1111 */
 
        /* SSP data pins */
        GPIO23_SSP1_SCLK,
        GPIO25_SSP1_TXD,
        GPIO26_SSP1_RXD,
 
+       /* LCD - 16bpp DSTN */
+       GPIO58_LCD_LDD_0,
+       GPIO59_LCD_LDD_1,
+       GPIO60_LCD_LDD_2,
+       GPIO61_LCD_LDD_3,
+       GPIO62_LCD_LDD_4,
+       GPIO63_LCD_LDD_5,
+       GPIO64_LCD_LDD_6,
+       GPIO65_LCD_LDD_7,
+       GPIO66_LCD_LDD_8,
+       GPIO67_LCD_LDD_9,
+       GPIO68_LCD_LDD_10,
+       GPIO69_LCD_LDD_11,
+       GPIO70_LCD_LDD_12,
+       GPIO71_LCD_LDD_13,
+       GPIO72_LCD_LDD_14,
+       GPIO73_LCD_LDD_15,
+       GPIO74_LCD_FCLK,
+       GPIO75_LCD_LCLK,
+       GPIO76_LCD_PCLK,
+
        /* BTUART */
        GPIO42_BTUART_RXD,
        GPIO43_BTUART_TXD,
index 143f28a..8ebdac7 100644 (file)
@@ -409,7 +409,7 @@ static struct platform_device backlight = {
  * LEDs
  */
 
-struct gpio_led gpio_leds[] = {
+static struct gpio_led gpio_leds[] = {
        {
                .name = "magician::vibra",
                .default_trigger = "none",
index 925575f..3ee1f39 100644 (file)
 
 #include "generic.h"
 
-#define PGSR(x)                __REG2(0x40F00020, ((x) & 0x60) >> 3)
+#define gpio_to_bank(gpio)     ((gpio) >> 5)
+
+#define PGSR(x)                __REG2(0x40F00020, (x) << 2)
+#define __GAFR(u, x)   __REG2((u) ? 0x40E00058 : 0x40E00054, (x) << 3)
+#define GAFR_L(x)      __GAFR(0, x)
+#define GAFR_U(x)      __GAFR(1, x)
 
 #define PWER_WE35      (1 << 24)
 
@@ -38,49 +43,59 @@ struct gpio_desc {
 };
 
 static struct gpio_desc gpio_desc[MFP_PIN_GPIO127 + 1];
+static int gpio_nr;
 
-static int __mfp_config_lpm(unsigned gpio, unsigned long lpm)
-{
-       unsigned mask = GPIO_bit(gpio);
-
-       /* low power state */
-       switch (lpm) {
-       case MFP_LPM_DRIVE_HIGH:
-               PGSR(gpio) |= mask;
-               break;
-       case MFP_LPM_DRIVE_LOW:
-               PGSR(gpio) &= ~mask;
-               break;
-       case MFP_LPM_INPUT:
-               break;
-       default:
-               pr_warning("%s: invalid low power state for GPIO%d\n",
-                               __func__, gpio);
-               return -EINVAL;
-       }
-       return 0;
-}
+static unsigned long gpdr_lpm[4];
 
 static int __mfp_config_gpio(unsigned gpio, unsigned long c)
 {
        unsigned long gafr, mask = GPIO_bit(gpio);
-       int fn;
+       int bank = gpio_to_bank(gpio);
+       int uorl = !!(gpio & 0x10); /* GAFRx_U or GAFRx_L ? */
+       int shft = (gpio & 0xf) << 1;
+       int fn = MFP_AF(c);
+       int dir = c & MFP_DIR_OUT;
 
-       fn = MFP_AF(c);
        if (fn > 3)
                return -EINVAL;
 
-       /* alternate function and direction */
-       gafr = GAFR(gpio) & ~(0x3 << ((gpio & 0xf) * 2));
-       GAFR(gpio) = gafr |  (fn  << ((gpio & 0xf) * 2));
+       /* alternate function and direction at run-time */
+       gafr = (uorl == 0) ? GAFR_L(bank) : GAFR_U(bank);
+       gafr = (gafr & ~(0x3 << shft)) | (fn << shft);
 
-       if (c & MFP_DIR_OUT)
+       if (uorl == 0)
+               GAFR_L(bank) = gafr;
+       else
+               GAFR_U(bank) = gafr;
+
+       if (dir == MFP_DIR_OUT)
                GPDR(gpio) |= mask;
        else
                GPDR(gpio) &= ~mask;
 
-       if (__mfp_config_lpm(gpio, c & MFP_LPM_STATE_MASK))
-               return -EINVAL;
+       /* alternate function and direction at low power mode */
+       switch (c & MFP_LPM_STATE_MASK) {
+       case MFP_LPM_DRIVE_HIGH:
+               PGSR(bank) |= mask;
+               dir = MFP_DIR_OUT;
+               break;
+       case MFP_LPM_DRIVE_LOW:
+               PGSR(bank) &= ~mask;
+               dir = MFP_DIR_OUT;
+               break;
+       case MFP_LPM_DEFAULT:
+               break;
+       default:
+               /* warning and fall through, treat as MFP_LPM_DEFAULT */
+               pr_warning("%s: GPIO%d: unsupported low power mode\n",
+                               __func__, gpio);
+               break;
+       }
+
+       if (dir == MFP_DIR_OUT)
+               gpdr_lpm[bank] |= mask;
+       else
+               gpdr_lpm[bank] &= ~mask;
 
        /* give early warning if MFP_LPM_CAN_WAKEUP is set on the
         * configurations of those pins not able to wakeup
@@ -91,7 +106,7 @@ static int __mfp_config_gpio(unsigned gpio, unsigned long c)
                return -EINVAL;
        }
 
-       if ((c & MFP_LPM_CAN_WAKEUP) && (c & MFP_DIR_OUT)) {
+       if ((c & MFP_LPM_CAN_WAKEUP) && (dir == MFP_DIR_OUT)) {
                pr_warning("%s: output GPIO%d unable to wakeup\n",
                                __func__, gpio);
                return -EINVAL;
@@ -135,7 +150,7 @@ void pxa2xx_mfp_config(unsigned long *mfp_cfgs, int num)
 
 void pxa2xx_mfp_set_lpm(int mfp, unsigned long lpm)
 {
-       unsigned long flags;
+       unsigned long flags, c;
        int gpio;
 
        gpio = __mfp_validate(mfp);
@@ -143,7 +158,11 @@ void pxa2xx_mfp_set_lpm(int mfp, unsigned long lpm)
                return;
 
        local_irq_save(flags);
-       __mfp_config_lpm(gpio, lpm);
+
+       c = gpio_desc[gpio].config;
+       c = (c & ~MFP_LPM_STATE_MASK) | lpm;
+       __mfp_config_gpio(gpio, c);
+
        local_irq_restore(flags);
 }
 
@@ -187,23 +206,22 @@ int gpio_set_wake(unsigned int gpio, unsigned int on)
 }
 
 #ifdef CONFIG_PXA25x
-static int __init pxa25x_mfp_init(void)
+static void __init pxa25x_mfp_init(void)
 {
        int i;
 
-       if (cpu_is_pxa25x()) {
-               for (i = 0; i <= 84; i++)
-                       gpio_desc[i].valid = 1;
+       for (i = 0; i <= 84; i++)
+               gpio_desc[i].valid = 1;
 
-               for (i = 0; i <= 15; i++) {
-                       gpio_desc[i].can_wakeup = 1;
-                       gpio_desc[i].mask = GPIO_bit(i);
-               }
+       for (i = 0; i <= 15; i++) {
+               gpio_desc[i].can_wakeup = 1;
+               gpio_desc[i].mask = GPIO_bit(i);
        }
 
-       return 0;
+       gpio_nr = 85;
 }
-postcore_initcall(pxa25x_mfp_init);
+#else
+static inline void pxa25x_mfp_init(void) {}
 #endif /* CONFIG_PXA25x */
 
 #ifdef CONFIG_PXA27x
@@ -233,45 +251,103 @@ int keypad_set_wake(unsigned int on)
        return 0;
 }
 
-static int __init pxa27x_mfp_init(void)
+static void __init pxa27x_mfp_init(void)
 {
        int i, gpio;
 
-       if (cpu_is_pxa27x()) {
-               for (i = 0; i <= 120; i++) {
-                       /* skip GPIO2, 5, 6, 7, 8, they are not
-                        * valid pins allow configuration
-                        */
-                       if (i == 2 || i == 5 || i == 6 ||
-                           i == 7 || i == 8)
-                               continue;
+       for (i = 0; i <= 120; i++) {
+               /* skip GPIO2, 5, 6, 7, 8, they are not
+                * valid pins allow configuration
+                */
+               if (i == 2 || i == 5 || i == 6 || i == 7 || i == 8)
+                       continue;
 
-                       gpio_desc[i].valid = 1;
-               }
+               gpio_desc[i].valid = 1;
+       }
 
-               /* Keypad GPIOs */
-               for (i = 0; i < ARRAY_SIZE(pxa27x_pkwr_gpio); i++) {
-                       gpio = pxa27x_pkwr_gpio[i];
-                       gpio_desc[gpio].can_wakeup = 1;
-                       gpio_desc[gpio].keypad_gpio = 1;
-                       gpio_desc[gpio].mask = 1 << i;
-               }
+       /* Keypad GPIOs */
+       for (i = 0; i < ARRAY_SIZE(pxa27x_pkwr_gpio); i++) {
+               gpio = pxa27x_pkwr_gpio[i];
+               gpio_desc[gpio].can_wakeup = 1;
+               gpio_desc[gpio].keypad_gpio = 1;
+               gpio_desc[gpio].mask = 1 << i;
+       }
 
-               /* Overwrite GPIO13 as a PWER wakeup source */
-               for (i = 0; i <= 15; i++) {
-                       /* skip GPIO2, 5, 6, 7, 8 */
-                       if (GPIO_bit(i) & 0x1e4)
-                               continue;
+       /* Overwrite GPIO13 as a PWER wakeup source */
+       for (i = 0; i <= 15; i++) {
+               /* skip GPIO2, 5, 6, 7, 8 */
+               if (GPIO_bit(i) & 0x1e4)
+                       continue;
 
-                       gpio_desc[i].can_wakeup = 1;
-                       gpio_desc[i].mask = GPIO_bit(i);
-               }
+               gpio_desc[i].can_wakeup = 1;
+               gpio_desc[i].mask = GPIO_bit(i);
+       }
+
+       gpio_desc[35].can_wakeup = 1;
+       gpio_desc[35].mask = PWER_WE35;
+
+       gpio_nr = 121;
+}
+#else
+static inline void pxa27x_mfp_init(void) {}
+#endif /* CONFIG_PXA27x */
+
+#ifdef CONFIG_PM
+static unsigned long saved_gafr[2][4];
+static unsigned long saved_gpdr[4];
+
+static int pxa2xx_mfp_suspend(struct sys_device *d, pm_message_t state)
+{
+       int i;
+
+       for (i = 0; i <= gpio_to_bank(gpio_nr); i++) {
 
-               gpio_desc[35].can_wakeup = 1;
-               gpio_desc[35].mask = PWER_WE35;
+               saved_gafr[0][i] = GAFR_L(i);
+               saved_gafr[1][i] = GAFR_U(i);
+               saved_gpdr[i] = GPDR(i * 32);
+
+               GPDR(i * 32) = gpdr_lpm[i];
        }
+       return 0;
+}
 
+static int pxa2xx_mfp_resume(struct sys_device *d)
+{
+       int i;
+
+       for (i = 0; i <= gpio_to_bank(gpio_nr); i++) {
+               GAFR_L(i) = saved_gafr[0][i];
+               GAFR_U(i) = saved_gafr[1][i];
+               GPDR(i * 32) = saved_gpdr[i];
+       }
+       PSSR = PSSR_RDH | PSSR_PH;
        return 0;
 }
-postcore_initcall(pxa27x_mfp_init);
-#endif /* CONFIG_PXA27x */
+#else
+#define pxa2xx_mfp_suspend     NULL
+#define pxa2xx_mfp_resume      NULL
+#endif
+
+struct sysdev_class pxa2xx_mfp_sysclass = {
+       .name           = "mfp",
+       .suspend        = pxa2xx_mfp_suspend,
+       .resume         = pxa2xx_mfp_resume,
+};
+
+static int __init pxa2xx_mfp_init(void)
+{
+       int i;
+
+       if (cpu_is_pxa25x())
+               pxa25x_mfp_init();
+
+       if (cpu_is_pxa27x())
+               pxa27x_mfp_init();
+
+       /* initialize gafr_run[], pgsr_lpm[] from existing values */
+       for (i = 0; i <= gpio_to_bank(gpio_nr); i++)
+               gpdr_lpm[i] = GPDR(i * 32);
+
+       return sysdev_class_register(&pxa2xx_mfp_sysclass);
+}
+postcore_initcall(pxa2xx_mfp_init);
diff --git a/arch/arm/mach-pxa/mioa701.c b/arch/arm/mach-pxa/mioa701.c
new file mode 100644 (file)
index 0000000..0842c53
--- /dev/null
@@ -0,0 +1,905 @@
+/*
+ * Handles the Mitac Mio A701 Board
+ *
+ * Copyright (C) 2008 Robert Jarzmik
+ *
+ * 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/kernel.h>
+#include <linux/init.h>
+#include <linux/platform_device.h>
+#include <linux/sysdev.h>
+#include <linux/input.h>
+#include <linux/delay.h>
+#include <linux/gpio_keys.h>
+#include <linux/pwm_backlight.h>
+#include <linux/rtc.h>
+#include <linux/leds.h>
+#include <linux/gpio.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+#include <linux/pda_power.h>
+#include <linux/power_supply.h>
+#include <linux/wm97xx.h>
+#include <linux/mtd/physmap.h>
+
+#include <asm/mach-types.h>
+#include <asm/mach/arch.h>
+#include <mach/mfp-pxa27x.h>
+#include <mach/pxa27x_keypad.h>
+#include <mach/pxafb.h>
+#include <mach/pxa2xx-regs.h>
+#include <mach/mmc.h>
+#include <mach/udc.h>
+#include <mach/pxa27x-udc.h>
+
+#include <mach/mioa701.h>
+
+#include "generic.h"
+#include "devices.h"
+
+static unsigned long mioa701_pin_config[] = {
+       /* Mio global */
+       MIO_CFG_OUT(GPIO9_CHARGE_nEN, AF0, DRIVE_LOW),
+       MIO_CFG_OUT(GPIO18_POWEROFF, AF0, DRIVE_LOW),
+       MFP_CFG_OUT(GPIO3, AF0, DRIVE_HIGH),
+       MFP_CFG_OUT(GPIO4, AF0, DRIVE_HIGH),
+
+       /* Backlight PWM 0 */
+       GPIO16_PWM0_OUT,
+
+       /* MMC */
+       GPIO32_MMC_CLK,
+       GPIO92_MMC_DAT_0,
+       GPIO109_MMC_DAT_1,
+       GPIO110_MMC_DAT_2,
+       GPIO111_MMC_DAT_3,
+       GPIO112_MMC_CMD,
+       MIO_CFG_IN(GPIO78_SDIO_RO, AF0),
+       MIO_CFG_IN(GPIO15_SDIO_INSERT, AF0),
+       MIO_CFG_OUT(GPIO91_SDIO_EN, AF0, DRIVE_LOW),
+
+       /* USB */
+       MIO_CFG_IN(GPIO13_USB_DETECT, AF0),
+       MIO_CFG_OUT(GPIO22_USB_ENABLE, AF0, DRIVE_LOW),
+
+       /* LCD */
+       GPIO58_LCD_LDD_0,
+       GPIO59_LCD_LDD_1,
+       GPIO60_LCD_LDD_2,
+       GPIO61_LCD_LDD_3,
+       GPIO62_LCD_LDD_4,
+       GPIO63_LCD_LDD_5,
+       GPIO64_LCD_LDD_6,
+       GPIO65_LCD_LDD_7,
+       GPIO66_LCD_LDD_8,
+       GPIO67_LCD_LDD_9,
+       GPIO68_LCD_LDD_10,
+       GPIO69_LCD_LDD_11,
+       GPIO70_LCD_LDD_12,
+       GPIO71_LCD_LDD_13,
+       GPIO72_LCD_LDD_14,
+       GPIO73_LCD_LDD_15,
+       GPIO74_LCD_FCLK,
+       GPIO75_LCD_LCLK,
+       GPIO76_LCD_PCLK,
+
+       /* Bluetooth */
+       GPIO44_BTUART_CTS,
+       GPIO42_BTUART_RXD,
+       GPIO45_BTUART_RTS,
+       GPIO43_BTUART_TXD,
+       MIO_CFG_OUT(GPIO83_BT_ON, AF0, DRIVE_LOW),
+
+       /* GPS */
+       MIO_CFG_OUT(GPIO23_GPS_UNKNOWN1, AF0, DRIVE_LOW),
+       MIO_CFG_OUT(GPIO26_GPS_ON, AF0, DRIVE_LOW),
+       MIO_CFG_OUT(GPIO27_GPS_RESET, AF0, DRIVE_LOW),
+       MIO_CFG_OUT(GPIO106_GPS_UNKNOWN2, AF0, DRIVE_LOW),
+       MIO_CFG_OUT(GPIO107_GPS_UNKNOWN3, AF0, DRIVE_LOW),
+       GPIO46_STUART_RXD,
+       GPIO47_STUART_TXD,
+
+       /* GSM */
+       MIO_CFG_OUT(GPIO24_GSM_MOD_RESET_CMD, AF0, DRIVE_LOW),
+       MIO_CFG_OUT(GPIO88_GSM_nMOD_ON_CMD, AF0, DRIVE_HIGH),
+       MIO_CFG_OUT(GPIO90_GSM_nMOD_OFF_CMD, AF0, DRIVE_HIGH),
+       MIO_CFG_OUT(GPIO114_GSM_nMOD_DTE_UART_STATE, AF0, DRIVE_HIGH),
+       MIO_CFG_IN(GPIO25_GSM_MOD_ON_STATE, AF0),
+       MIO_CFG_IN(GPIO113_GSM_EVENT, AF0) | WAKEUP_ON_EDGE_BOTH,
+       GPIO34_FFUART_RXD,
+       GPIO35_FFUART_CTS,
+       GPIO36_FFUART_DCD,
+       GPIO37_FFUART_DSR,
+       GPIO39_FFUART_TXD,
+       GPIO40_FFUART_DTR,
+       GPIO41_FFUART_RTS,
+
+       /* Sound */
+       GPIO89_AC97_SYSCLK,
+       MIO_CFG_IN(GPIO12_HPJACK_INSERT, AF0),
+
+       /* Leds */
+       MIO_CFG_OUT(GPIO10_LED_nCharging, AF0, DRIVE_HIGH),
+       MIO_CFG_OUT(GPIO97_LED_nBlue, AF0, DRIVE_HIGH),
+       MIO_CFG_OUT(GPIO98_LED_nOrange, AF0, DRIVE_HIGH),
+       MIO_CFG_OUT(GPIO82_LED_nVibra, AF0, DRIVE_HIGH),
+       MIO_CFG_OUT(GPIO115_LED_nKeyboard, AF0, DRIVE_HIGH),
+
+       /* Keyboard */
+       MIO_CFG_IN(GPIO0_KEY_POWER, AF0) | WAKEUP_ON_EDGE_BOTH,
+       MIO_CFG_IN(GPIO93_KEY_VOLUME_UP, AF0),
+       MIO_CFG_IN(GPIO94_KEY_VOLUME_DOWN, AF0),
+       GPIO100_KP_MKIN_0,
+       GPIO101_KP_MKIN_1,
+       GPIO102_KP_MKIN_2,
+       GPIO103_KP_MKOUT_0,
+       GPIO104_KP_MKOUT_1,
+       GPIO105_KP_MKOUT_2,
+
+       /* Unknown */
+       MFP_CFG_IN(GPIO14, AF0),
+       MFP_CFG_IN(GPIO20, AF0),
+       MFP_CFG_IN(GPIO21, AF0),
+       MFP_CFG_IN(GPIO33, AF0),
+       MFP_CFG_OUT(GPIO49, AF0, DRIVE_HIGH),
+       MFP_CFG_OUT(GPIO57, AF0, DRIVE_HIGH),
+       MFP_CFG_OUT(GPIO77, AF0, DRIVE_HIGH),
+       MFP_CFG_IN(GPIO80, AF0),
+       MFP_CFG_OUT(GPIO86, AF0, DRIVE_HIGH),
+       MFP_CFG_IN(GPIO96, AF0),
+       MFP_CFG_OUT(GPIO116, AF0, DRIVE_HIGH),
+};
+
+#define MIO_GPIO_IN(num, _desc) \
+       { .gpio = (num), .dir = 0, .desc = (_desc) }
+#define MIO_GPIO_OUT(num, _init, _desc) \
+       { .gpio = (num), .dir = 1, .init = (_init), .desc = (_desc) }
+struct gpio_ress {
+       unsigned gpio : 8;
+       unsigned dir : 1;
+       unsigned init : 1;
+       char *desc;
+};
+
+static int mio_gpio_request(struct gpio_ress *gpios, int size)
+{
+       int i, rc = 0;
+       int gpio;
+       int dir;
+
+       for (i = 0; (!rc) && (i < size); i++) {
+               gpio = gpios[i].gpio;
+               dir = gpios[i].dir;
+               rc = gpio_request(gpio, gpios[i].desc);
+               if (rc) {
+                       printk(KERN_ERR "Error requesting GPIO %d(%s) : %d\n",
+                              gpio, gpios[i].desc, rc);
+                       continue;
+               }
+               if (dir)
+                       gpio_direction_output(gpio, gpios[i].init);
+               else
+                       gpio_direction_input(gpio);
+       }
+       while ((rc) && (--i >= 0))
+               gpio_free(gpios[i].gpio);
+       return rc;
+}
+
+static void mio_gpio_free(struct gpio_ress *gpios, int size)
+{
+       int i;
+
+       for (i = 0; i < size; i++)
+               gpio_free(gpios[i].gpio);
+}
+
+/* LCD Screen and Backlight */
+static struct platform_pwm_backlight_data mioa701_backlight_data = {
+       .pwm_id         = 0,
+       .max_brightness = 100,
+       .dft_brightness = 50,
+       .pwm_period_ns  = 4000 * 1024,  /* Fl = 250kHz */
+};
+
+/*
+ * LTM0305A776C LCD panel timings
+ *
+ * see:
+ *  - the LTM0305A776C datasheet,
+ *  - and the PXA27x Programmers' manual
+ */
+static struct pxafb_mode_info mioa701_ltm0305a776c = {
+       .pixclock               = 220000,       /* CLK=4.545 MHz */
+       .xres                   = 240,
+       .yres                   = 320,
+       .bpp                    = 16,
+       .hsync_len              = 4,
+       .vsync_len              = 2,
+       .left_margin            = 6,
+       .right_margin           = 4,
+       .upper_margin           = 5,
+       .lower_margin           = 3,
+};
+
+static void mioa701_lcd_power(int on, struct fb_var_screeninfo *si)
+{
+       gpio_set_value(GPIO87_LCD_POWER, on);
+}
+
+static struct pxafb_mach_info mioa701_pxafb_info = {
+       .modes                  = &mioa701_ltm0305a776c,
+       .num_modes              = 1,
+       .lcd_conn               = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
+       .pxafb_lcd_power        = mioa701_lcd_power,
+};
+
+/*
+ * Keyboard configuration
+ */
+static unsigned int mioa701_matrix_keys[] = {
+       KEY(0, 0, KEY_UP),
+       KEY(0, 1, KEY_RIGHT),
+       KEY(0, 2, KEY_MEDIA),
+       KEY(1, 0, KEY_DOWN),
+       KEY(1, 1, KEY_ENTER),
+       KEY(1, 2, KEY_CONNECT), /* GPS key */
+       KEY(2, 0, KEY_LEFT),
+       KEY(2, 1, KEY_PHONE),   /* Phone Green key */
+       KEY(2, 2, KEY_CAMERA)   /* Camera key */
+};
+static struct pxa27x_keypad_platform_data mioa701_keypad_info = {
+       .matrix_key_rows = 3,
+       .matrix_key_cols = 3,
+       .matrix_key_map = mioa701_matrix_keys,
+       .matrix_key_map_size = ARRAY_SIZE(mioa701_matrix_keys),
+};
+
+/*
+ * GPIO Key Configuration
+ */
+#define MIO_KEY(key, _gpio, _desc, _wakeup) \
+       { .code = (key), .gpio = (_gpio), .active_low = 0, \
+       .desc = (_desc), .type = EV_KEY, .wakeup = (_wakeup) }
+static struct gpio_keys_button mioa701_button_table[] = {
+       MIO_KEY(KEY_EXIT, GPIO0_KEY_POWER, "Power button", 1),
+       MIO_KEY(KEY_VOLUMEUP, GPIO93_KEY_VOLUME_UP, "Volume up", 0),
+       MIO_KEY(KEY_VOLUMEDOWN, GPIO94_KEY_VOLUME_DOWN, "Volume down", 0),
+       MIO_KEY(KEY_HP, GPIO12_HPJACK_INSERT, "HP jack detect", 0)
+};
+
+static struct gpio_keys_platform_data mioa701_gpio_keys_data = {
+       .buttons  = mioa701_button_table,
+       .nbuttons = ARRAY_SIZE(mioa701_button_table),
+};
+
+/*
+ * Leds and vibrator
+ */
+#define ONE_LED(_gpio, _name) \
+{ .gpio = (_gpio), .name = (_name), .active_low = true }
+static struct gpio_led gpio_leds[] = {
+       ONE_LED(GPIO10_LED_nCharging, "mioa701:charging"),
+       ONE_LED(GPIO97_LED_nBlue, "mioa701:blue"),
+       ONE_LED(GPIO98_LED_nOrange, "mioa701:orange"),
+       ONE_LED(GPIO82_LED_nVibra, "mioa701:vibra"),
+       ONE_LED(GPIO115_LED_nKeyboard, "mioa701:keyboard")
+};
+
+static struct gpio_led_platform_data gpio_led_info = {
+       .leds = gpio_leds,
+       .num_leds = ARRAY_SIZE(gpio_leds),
+};
+
+/*
+ * GSM Sagem XS200 chip
+ *
+ * GSM handling was purged from kernel. For history, this is the way to go :
+ *   - init : GPIO24_GSM_MOD_RESET_CMD = 0, GPIO114_GSM_nMOD_DTE_UART_STATE = 1
+ *            GPIO88_GSM_nMOD_ON_CMD = 1, GPIO90_GSM_nMOD_OFF_CMD = 1
+ *   - reset : GPIO24_GSM_MOD_RESET_CMD = 1, msleep(100),
+ *             GPIO24_GSM_MOD_RESET_CMD = 0
+ *   - turn on  : GPIO88_GSM_nMOD_ON_CMD = 0, msleep(1000),
+ *                GPIO88_GSM_nMOD_ON_CMD = 1
+ *   - turn off : GPIO90_GSM_nMOD_OFF_CMD = 0, msleep(1000),
+ *                GPIO90_GSM_nMOD_OFF_CMD = 1
+ */
+static int is_gsm_on(void)
+{
+       int is_on;
+
+       is_on = !!gpio_get_value(GPIO25_GSM_MOD_ON_STATE);
+       return is_on;
+}
+
+irqreturn_t gsm_on_irq(int irq, void *p)
+{
+       printk(KERN_DEBUG "Mioa701: GSM status changed to %s\n",
+              is_gsm_on() ? "on" : "off");
+       return IRQ_HANDLED;
+}
+
+struct gpio_ress gsm_gpios[] = {
+       MIO_GPIO_IN(GPIO25_GSM_MOD_ON_STATE, "GSM state"),
+       MIO_GPIO_IN(GPIO113_GSM_EVENT, "GSM event"),
+};
+
+static int __init gsm_init(void)
+{
+       int rc;
+
+       rc = mio_gpio_request(ARRAY_AND_SIZE(gsm_gpios));
+       if (rc)
+               goto err_gpio;
+       rc = request_irq(gpio_to_irq(GPIO25_GSM_MOD_ON_STATE), gsm_on_irq,
+                        IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
+                        "GSM XS200 Power Irq", NULL);
+       if (rc)
+               goto err_irq;
+
+       gpio_set_wake(GPIO113_GSM_EVENT, 1);
+       return 0;
+
+err_irq:
+       printk(KERN_ERR "Mioa701: Can't request GSM_ON irq\n");
+       mio_gpio_free(ARRAY_AND_SIZE(gsm_gpios));
+err_gpio:
+       printk(KERN_ERR "Mioa701: gsm not available\n");
+       return rc;
+}
+
+static void gsm_exit(void)
+{
+       free_irq(gpio_to_irq(GPIO25_GSM_MOD_ON_STATE), NULL);
+       mio_gpio_free(ARRAY_AND_SIZE(gsm_gpios));
+}
+
+/*
+ * Bluetooth BRF6150 chip
+ *
+ * BT handling was purged from kernel. For history, this is the way to go :
+ * - turn on  : GPIO83_BT_ON = 1
+ * - turn off : GPIO83_BT_ON = 0
+ */
+
+/*
+ * GPS Sirf Star III chip
+ *
+ * GPS handling was purged from kernel. For history, this is the way to go :
+ * - init : GPIO23_GPS_UNKNOWN1 = 1, GPIO26_GPS_ON = 0, GPIO27_GPS_RESET = 0
+ *          GPIO106_GPS_UNKNOWN2 = 0, GPIO107_GPS_UNKNOWN3 = 0
+ * - turn on  : GPIO27_GPS_RESET = 1, GPIO26_GPS_ON = 1
+ * - turn off : GPIO26_GPS_ON = 0, GPIO27_GPS_RESET = 0
+ */
+
+/*
+ * USB UDC
+ */
+static void udc_power_command(int cmd)
+{
+       switch (cmd) {
+       case PXA2XX_UDC_CMD_DISCONNECT:
+               gpio_set_value(GPIO22_USB_ENABLE, 0);
+               break;
+       case PXA2XX_UDC_CMD_CONNECT:
+               gpio_set_value(GPIO22_USB_ENABLE, 1);
+               break;
+       default:
+               printk(KERN_INFO "udc_control: unknown command (0x%x)!\n", cmd);
+               break;
+       }
+}
+
+static int is_usb_connected(void)
+{
+       return !!gpio_get_value(GPIO13_USB_DETECT);
+}
+
+static struct pxa2xx_udc_mach_info mioa701_udc_info = {
+       .udc_is_connected = is_usb_connected,
+       .udc_command      = udc_power_command,
+};
+
+struct gpio_ress udc_gpios[] = {
+       MIO_GPIO_OUT(GPIO22_USB_ENABLE, 0, "USB Vbus enable")
+};
+
+static int __init udc_init(void)
+{
+       pxa_set_udc_info(&mioa701_udc_info);
+       return mio_gpio_request(ARRAY_AND_SIZE(udc_gpios));
+}
+
+static void udc_exit(void)
+{
+       mio_gpio_free(ARRAY_AND_SIZE(udc_gpios));
+}
+
+/*
+ * SDIO/MMC Card controller
+ */
+static void mci_setpower(struct device *dev, unsigned int vdd)
+{
+       struct pxamci_platform_data *p_d = dev->platform_data;
+
+       if ((1 << vdd) & p_d->ocr_mask)
+               gpio_set_value(GPIO91_SDIO_EN, 1);      /* enable SDIO power */
+       else
+               gpio_set_value(GPIO91_SDIO_EN, 0);      /* disable SDIO power */
+}
+
+static int mci_get_ro(struct device *dev)
+{
+       return gpio_get_value(GPIO78_SDIO_RO);
+}
+
+struct gpio_ress mci_gpios[] = {
+       MIO_GPIO_IN(GPIO78_SDIO_RO,     "SDIO readonly detect"),
+       MIO_GPIO_IN(GPIO15_SDIO_INSERT, "SDIO insertion detect"),
+       MIO_GPIO_OUT(GPIO91_SDIO_EN, 0, "SDIO power enable")
+};
+
+static void mci_exit(struct device *dev, void *data)
+{
+       mio_gpio_free(ARRAY_AND_SIZE(mci_gpios));
+       free_irq(gpio_to_irq(GPIO15_SDIO_INSERT), data);
+}
+
+static struct pxamci_platform_data mioa701_mci_info;
+
+/**
+ * The card detect interrupt isn't debounced so we delay it by 250ms
+ * to give the card a chance to fully insert/eject.
+ */
+static int mci_init(struct device *dev, irq_handler_t detect_int, void *data)
+{
+       int rc;
+       int irq = gpio_to_irq(GPIO15_SDIO_INSERT);
+
+       rc = mio_gpio_request(ARRAY_AND_SIZE(mci_gpios));
+       if (rc)
+               goto err_gpio;
+       /* enable RE/FE interrupt on card insertion and removal */
+       rc = request_irq(irq, detect_int,
+                        IRQF_DISABLED | IRQF_TRIGGER_RISING |
+                        IRQF_TRIGGER_FALLING,
+                        "MMC card detect", data);
+       if (rc)
+               goto err_irq;
+
+       mioa701_mci_info.detect_delay = msecs_to_jiffies(250);
+       return 0;
+
+err_irq:
+       dev_err(dev, "mioa701_mci_init: MMC/SD:"
+               " can't request MMC card detect IRQ\n");
+       mio_gpio_free(ARRAY_AND_SIZE(mci_gpios));
+err_gpio:
+       return rc;
+}
+
+static struct pxamci_platform_data mioa701_mci_info = {
+       .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
+       .init     = mci_init,
+       .get_ro   = mci_get_ro,
+       .setpower = mci_setpower,
+       .exit     = mci_exit,
+};
+
+/* FlashRAM */
+static struct resource strataflash_resource = {
+       .start = PXA_CS0_PHYS,
+       .end   = PXA_CS0_PHYS + SZ_64M - 1,
+       .flags = IORESOURCE_MEM,
+};
+
+static struct physmap_flash_data strataflash_data = {
+       .width = 2,
+       /* .set_vpp = mioa701_set_vpp, */
+};
+
+static struct platform_device strataflash = {
+       .name          = "physmap-flash",
+       .id            = -1,
+       .resource      = &strataflash_resource,
+       .num_resources = 1,
+       .dev = {
+               .platform_data = &strataflash_data,
+       },
+};
+
+/*
+ * Suspend/Resume bootstrap management
+ *
+ * MIO A701 reboot sequence is highly ROM dependant. From the one dissassembled,
+ * this sequence is as follows :
+ *   - disables interrupts
+ *   - initialize SDRAM (self refresh RAM into active RAM)
+ *   - initialize GPIOs (depends on value at 0xa020b020)
+ *   - initialize coprossessors
+ *   - if edge detect on PWR_SCL(GPIO3), then proceed to cold start
+ *   - or if value at 0xa020b000 not equal to 0x0f0f0f0f, proceed to cold start
+ *   - else do a resume, ie. jump to addr 0xa0100000
+ */
+#define RESUME_ENABLE_ADDR     0xa020b000
+#define RESUME_ENABLE_VAL      0x0f0f0f0f
+#define RESUME_BT_ADDR         0xa020b020
+#define RESUME_UNKNOWN_ADDR    0xa020b024
+#define RESUME_VECTOR_ADDR     0xa0100000
+#define BOOTSTRAP_WORDS                mioa701_bootstrap_lg/4
+
+static u32 *save_buffer;
+
+static void install_bootstrap(void)
+{
+       int i;
+       u32 *rom_bootstrap  = phys_to_virt(RESUME_VECTOR_ADDR);
+       u32 *src = &mioa701_bootstrap;
+
+       for (i = 0; i < BOOTSTRAP_WORDS; i++)
+               rom_bootstrap[i] = src[i];
+}
+
+
+static int mioa701_sys_suspend(struct sys_device *sysdev, pm_message_t state)
+{
+       int i = 0, is_bt_on;
+       u32 *mem_resume_vector  = phys_to_virt(RESUME_VECTOR_ADDR);
+       u32 *mem_resume_enabler = phys_to_virt(RESUME_ENABLE_ADDR);
+       u32 *mem_resume_bt      = phys_to_virt(RESUME_BT_ADDR);
+       u32 *mem_resume_unknown = phys_to_virt(RESUME_UNKNOWN_ADDR);
+
+       /* Devices prepare suspend */
+       is_bt_on = gpio_get_value(GPIO83_BT_ON);
+       pxa2xx_mfp_set_lpm(GPIO83_BT_ON,
+                          is_bt_on ? MFP_LPM_DRIVE_HIGH : MFP_LPM_DRIVE_LOW);
+
+       for (i = 0; i < BOOTSTRAP_WORDS; i++)
+               save_buffer[i] = mem_resume_vector[i];
+       save_buffer[i++] = *mem_resume_enabler;
+       save_buffer[i++] = *mem_resume_bt;
+       save_buffer[i++] = *mem_resume_unknown;
+
+       *mem_resume_enabler = RESUME_ENABLE_VAL;
+       *mem_resume_bt      = is_bt_on;
+
+       install_bootstrap();
+       return 0;
+}
+
+static int mioa701_sys_resume(struct sys_device *sysdev)
+{
+       int i = 0;
+       u32 *mem_resume_vector  = phys_to_virt(RESUME_VECTOR_ADDR);
+       u32 *mem_resume_enabler = phys_to_virt(RESUME_ENABLE_ADDR);
+       u32 *mem_resume_bt      = phys_to_virt(RESUME_BT_ADDR);
+       u32 *mem_resume_unknown = phys_to_virt(RESUME_UNKNOWN_ADDR);
+
+       for (i = 0; i < BOOTSTRAP_WORDS; i++)
+               mem_resume_vector[i] = save_buffer[i];
+       *mem_resume_enabler = save_buffer[i++];
+       *mem_resume_bt      = save_buffer[i++];
+       *mem_resume_unknown = save_buffer[i++];
+
+       return 0;
+}
+
+static struct sysdev_class mioa701_sysclass = {
+       .name = "mioa701",
+};
+
+static struct sys_device sysdev_bootstrap = {
+       .cls            = &mioa701_sysclass,
+};
+
+static struct sysdev_driver driver_bootstrap = {
+       .suspend        = &mioa701_sys_suspend,
+       .resume         = &mioa701_sys_resume,
+};
+
+static int __init bootstrap_init(void)
+{
+       int rc;
+       int save_size = mioa701_bootstrap_lg + (sizeof(u32) * 3);
+
+       rc = sysdev_class_register(&mioa701_sysclass);
+       if (rc) {
+               printk(KERN_ERR "Failed registering mioa701 sys class\n");
+               return -ENODEV;
+       }
+       rc = sysdev_register(&sysdev_bootstrap);
+       if (rc) {
+               printk(KERN_ERR "Failed registering mioa701 sys device\n");
+               return -ENODEV;
+       }
+       rc = sysdev_driver_register(&mioa701_sysclass, &driver_bootstrap);
+       if (rc) {
+               printk(KERN_ERR "Failed registering PMU sys driver\n");
+               return -ENODEV;
+       }
+
+       save_buffer = kmalloc(save_size, GFP_KERNEL);
+       if (!save_buffer)
+               return -ENOMEM;
+       printk(KERN_INFO "MioA701: allocated %d bytes for bootstrap\n",
+              save_size);
+       return 0;
+}
+
+static void bootstrap_exit(void)
+{
+       kfree(save_buffer);
+       sysdev_driver_unregister(&mioa701_sysclass, &driver_bootstrap);
+       sysdev_unregister(&sysdev_bootstrap);
+       sysdev_class_unregister(&mioa701_sysclass);
+
+       printk(KERN_CRIT "Unregistering mioa701 suspend will hang next"
+              "resume !!!\n");
+}
+
+/*
+ * Power Supply
+ */
+static char *supplicants[] = {
+       "mioa701_battery"
+};
+
+static void mioa701_set_charge(int flags)
+{
+       gpio_set_value(GPIO9_CHARGE_nEN, !flags);
+}
+
+static struct pda_power_pdata power_pdata = {
+       .is_ac_online   = is_usb_connected,
+       .set_charge = mioa701_set_charge,
+       .supplied_to = supplicants,
+       .num_supplicants = ARRAY_SIZE(supplicants),
+};
+
+static struct resource power_resources[] = {
+       [0] = {
+               .name   = "ac",
+               .start  = gpio_to_irq(GPIO13_USB_DETECT),
+               .end    = gpio_to_irq(GPIO13_USB_DETECT),
+               .flags  = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE |
+               IORESOURCE_IRQ_LOWEDGE,
+       },
+};
+
+static struct platform_device power_dev = {
+       .name           = "pda-power",
+       .id             = -1,
+       .resource       = power_resources,
+       .num_resources  = ARRAY_SIZE(power_resources),
+       .dev = {
+               .platform_data  = &power_pdata,
+       },
+};
+
+#if defined(CONFIG_PDA_POWER) && defined(CONFIG_TOUCHSCREEN_WM97XX)
+static struct wm97xx *battery_wm;
+
+static enum power_supply_property battery_props[] = {
+       POWER_SUPPLY_PROP_STATUS,
+       POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN,
+       POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN,
+       POWER_SUPPLY_PROP_VOLTAGE_NOW,
+       POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN,   /* Necessary for apm */
+};
+
+static int get_battery_voltage(void)
+{
+       int adc = -1;
+
+       if (battery_wm)
+               adc = wm97xx_read_aux_adc(battery_wm, WM97XX_AUX_ID1);
+       return adc;
+}
+
+static int get_battery_status(struct power_supply *b)
+{
+       int status;
+
+       if (is_usb_connected())
+               status = POWER_SUPPLY_STATUS_CHARGING;
+       else
+               status = POWER_SUPPLY_STATUS_DISCHARGING;
+
+       return status;
+}
+
+static int get_property(struct power_supply *b,
+                       enum power_supply_property psp,
+                       union power_supply_propval *val)
+{
+       int rc = 0;
+
+       switch (psp) {
+       case POWER_SUPPLY_PROP_STATUS:
+               val->intval = get_battery_status(b);
+               break;
+       case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN:
+               val->intval = 0xfd0;
+               break;
+       case POWER_SUPPLY_PROP_VOLTAGE_MIN_DESIGN:
+               val->intval = 0xc00;
+               break;
+       case POWER_SUPPLY_PROP_VOLTAGE_NOW:
+               val->intval = get_battery_voltage();
+               break;
+       case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN:
+               val->intval = 100;
+               break;
+       default:
+               val->intval = -1;
+               rc = -1;
+       }
+
+       return rc;
+};
+
+static struct power_supply battery_ps = {
+       .name = "mioa701_battery",
+       .type = POWER_SUPPLY_TYPE_BATTERY,
+       .get_property = get_property,
+       .properties = battery_props,
+       .num_properties = ARRAY_SIZE(battery_props),
+};
+
+static int battery_probe(struct platform_device *pdev)
+{
+       struct wm97xx *wm = platform_get_drvdata(pdev);
+       int rc;
+
+       battery_wm = wm;
+
+       rc = power_supply_register(NULL, &battery_ps);
+       if (rc)
+               dev_err(&pdev->dev,
+               "Could not register mioa701 battery -> %d\n", rc);
+       return rc;
+}
+
+static int battery_remove(struct platform_device *pdev)
+{
+       battery_wm = NULL;
+       return 0;
+}
+
+static struct platform_driver mioa701_battery_driver = {
+       .driver = {
+               .name = "wm97xx-battery",
+       },
+       .probe = battery_probe,
+       .remove = battery_remove
+};
+
+static int __init mioa701_battery_init(void)
+{
+       int rc;
+
+       rc = platform_driver_register(&mioa701_battery_driver);
+       if (rc)
+               printk(KERN_ERR "Could not register mioa701 battery driver\n");
+       return rc;
+}
+
+#else
+static int __init mioa701_battery_init(void)
+{
+       return 0;
+}
+#endif
+
+/*
+ * Mio global
+ */
+
+/* Devices */
+#define MIO_PARENT_DEV(var, strname, tparent, pdata)   \
+static struct platform_device var = {                  \
+       .name           = strname,                      \
+       .id             = -1,                           \
+       .dev            = {                             \
+               .platform_data = pdata,                 \
+               .parent = tparent,                      \
+       },                                              \
+};
+#define MIO_SIMPLE_DEV(var, strname, pdata)    \
+       MIO_PARENT_DEV(var, strname, NULL, pdata)
+
+MIO_SIMPLE_DEV(mioa701_gpio_keys, "gpio-keys",     &mioa701_gpio_keys_data)
+MIO_PARENT_DEV(mioa701_backlight, "pwm-backlight",  &pxa27x_device_pwm0.dev,
+               &mioa701_backlight_data);
+MIO_SIMPLE_DEV(mioa701_led,      "leds-gpio",      &gpio_led_info)
+MIO_SIMPLE_DEV(pxa2xx_pcm,       "pxa2xx-pcm",     NULL)
+MIO_SIMPLE_DEV(pxa2xx_ac97,      "pxa2xx-ac97",    NULL)
+MIO_PARENT_DEV(mio_wm9713_codec,  "wm9713-codec",   &pxa2xx_ac97.dev, NULL)
+MIO_SIMPLE_DEV(mioa701_sound,    "mioa701-wm9713", NULL)
+MIO_SIMPLE_DEV(mioa701_board,    "mioa701-board",  NULL)
+
+static struct platform_device *devices[] __initdata = {
+       &mioa701_gpio_keys,
+       &mioa701_backlight,
+       &mioa701_led,
+       &pxa2xx_pcm,
+       &pxa2xx_ac97,
+       &mio_wm9713_codec,
+       &mioa701_sound,
+       &power_dev,
+       &strataflash,
+       &mioa701_board
+};
+
+static void mioa701_machine_exit(void);
+
+static void mioa701_poweroff(void)
+{
+       mioa701_machine_exit();
+       gpio_set_value(GPIO18_POWEROFF, 1);
+}
+
+static void mioa701_restart(char c)
+{
+       mioa701_machine_exit();
+       arm_machine_restart(c);
+}
+
+struct gpio_ress global_gpios[] = {
+       MIO_GPIO_OUT(GPIO9_CHARGE_nEN, 1, "Charger enable"),
+       MIO_GPIO_OUT(GPIO18_POWEROFF, 0, "Power Off"),
+       MIO_GPIO_OUT(GPIO87_LCD_POWER, 0, "LCD Power")
+};
+
+static void __init mioa701_machine_init(void)
+{
+       PSLR  = 0xff100000; /* SYSDEL=125ms, PWRDEL=125ms, PSLR_SL_ROD=1 */
+       PCFR = PCFR_DC_EN | PCFR_GPR_EN | PCFR_OPDE;
+       RTTR = 32768 - 1; /* Reset crazy WinCE value */
+       UP2OCR = UP2OCR_HXOE;
+
+       pxa2xx_mfp_config(ARRAY_AND_SIZE(mioa701_pin_config));
+       mio_gpio_request(ARRAY_AND_SIZE(global_gpios));
+       bootstrap_init();
+       set_pxa_fb_info(&mioa701_pxafb_info);
+       pxa_set_mci_info(&mioa701_mci_info);
+       pxa_set_keypad_info(&mioa701_keypad_info);
+       udc_init();
+       pm_power_off = mioa701_poweroff;
+       arm_pm_restart = mioa701_restart;
+       platform_add_devices(devices, ARRAY_SIZE(devices));
+       gsm_init();
+       mioa701_battery_init();
+}
+
+static void mioa701_machine_exit(void)
+{
+       udc_exit();
+       bootstrap_exit();
+       gsm_exit();
+}
+
+MACHINE_START(MIOA701, "MIO A701")
+       .phys_io        = 0x40000000,
+       .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc,
+       .boot_params    = 0xa0000100,
+       .map_io         = &pxa_map_io,
+       .init_irq       = &pxa27x_init_irq,
+       .init_machine   = mioa701_machine_init,
+       .timer          = &pxa_timer,
+MACHINE_END
diff --git a/arch/arm/mach-pxa/mioa701_bootresume.S b/arch/arm/mach-pxa/mioa701_bootresume.S
new file mode 100644 (file)
index 0000000..a647693
--- /dev/null
@@ -0,0 +1,36 @@
+/* Bootloader to resume MIO A701
+ *
+ * 2007-1-12 Robert Jarzmik
+ *
+ * This code is licenced under the GPLv2.
+*/
+
+#include <linux/linkage.h>
+#include <asm/assembler.h>
+
+/*
+ * Note: Yes, part of the following code is located into the .data section.
+ *       This is to allow jumpaddr 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 truly read-only.
+ */
+       .data
+ENTRY(mioa701_bootstrap)
+0:
+       b       1f
+ENTRY(mioa701_jumpaddr)
+       .word   0x40f00008              @ PSPR in no-MMU mode
+1:
+       mov     r0,     #0xa0000000     @ Don't suppose memory access works
+       orr     r0, r0, #0x00200000     @ even if it's supposed to
+       mov     r1, #0
+       str     r1, [r0]                @ Early disable resume for next boot
+       ldr     r0, mioa701_jumpaddr    @ (Murphy's Law)
+       ldr     r0, [r0]
+       mov     pc, r0
+2:
+
+ENTRY(mioa701_bootstrap_lg)
+       .data
+       .word   2b-0b
diff --git a/arch/arm/mach-pxa/mp900.c b/arch/arm/mach-pxa/mp900.c
new file mode 100644 (file)
index 0000000..8a73814
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+ *  linux/arch/arm/mach-pxa/mp900.c
+ *
+ *  Support for the NEC MobilePro900/C platform
+ *
+ *  Based on mach-pxa/gumstix.c
+ *
+ *  2007, 2008 Kristoffer Ericson <kristoffer.ericson@gmail.com>
+ *  2007, 2008 Michael Petchkovsky <mkpetch@internode.on.net>
+ *
+ *  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/device.h>
+#include <linux/platform_device.h>
+#include <linux/types.h>
+#include <linux/usb/isp116x.h>
+
+#include <mach/hardware.h>
+#include <mach/pxa-regs.h>
+#include <asm/mach-types.h>
+#include <asm/mach/arch.h>
+#include "generic.h"
+
+static void isp116x_pfm_delay(struct device *dev, int delay)
+{
+
+       /* 400Mhz PXA2 = 2.5ns / instruction */
+
+       int cyc = delay / 10;
+
+       /* 4 Instructions = 4 x 2.5ns = 10ns */
+       __asm__ volatile ("0:\n"
+               "subs %0, %1, #1\n"
+               "bge 0b\n"
+               :"=r" (cyc)
+               :"0"(cyc)
+       );
+}
+
+static struct isp116x_platform_data isp116x_pfm_data = {
+       .remote_wakeup_enable = 1,
+       .delay = isp116x_pfm_delay,
+};
+
+static struct resource isp116x_pfm_resources[] = {
+       [0] =   {
+               .start  = 0x0d000000,
+               .end    = 0x0d000000 + 1,
+               .flags  = IORESOURCE_MEM,
+               },
+       [1] =   {
+               .start  = 0x0d000000 + 4,
+               .end    = 0x0d000000 + 5,
+               .flags  = IORESOURCE_MEM,
+               },
+       [2] =   {
+               .start  = 61,
+               .end    = 61,
+               .flags  = IORESOURCE_IRQ,
+               },
+};
+
+static struct platform_device mp900c_dummy_device = {
+       .name           = "mp900c_dummy",
+       .id             = -1,
+};
+
+static struct platform_device mp900c_usb = {
+       .name           = "isp116x-hcd",
+       .num_resources  = ARRAY_SIZE(isp116x_pfm_resources),
+       .resource       = isp116x_pfm_resources,
+       .dev.platform_data = &isp116x_pfm_data,
+};
+
+static struct platform_device *devices[] __initdata = {
+       &mp900c_dummy_device,
+       &mp900c_usb,
+};
+
+static void __init mp900c_init(void)
+{
+       printk(KERN_INFO "MobilePro 900/C machine init\n");
+       platform_add_devices(devices, ARRAY_SIZE(devices));
+}
+
+/* Maintainer - Michael Petchkovsky <mkpetch@internode.on.net> */
+MACHINE_START(NEC_MP900, "MobilePro900/C")
+       .phys_io        = 0x40000000,
+       .boot_params    = 0xa0220100,
+       .io_pg_offst    = (io_p2v(0x40000000) >> 18) & 0xfffc,
+       .timer          = &pxa_timer,
+       .map_io         = pxa_map_io,
+       .init_irq       = pxa25x_init_irq,
+       .init_machine   = mp900c_init,
+MACHINE_END
+
index 730b9f6..36135a0 100644 (file)
@@ -31,7 +31,7 @@
 #include <asm/mach/arch.h>
 #include <mach/hardware.h>
 #include <mach/pxa-regs.h>
-#include <mach/pxa2xx-gpio.h>
+#include <mach/mfp-pxa27x.h>
 #include <mach/pxa2xx-regs.h>
 #include <mach/pxa2xx_spi.h>
 #include <mach/pcm027.h>
  * *) CPU internal use only
  */
 
+static unsigned long pcm027_pin_config[] __initdata = {
+       /* Chip Selects */
+       GPIO20_nSDCS_2,
+       GPIO21_nSDCS_3,
+       GPIO15_nCS_1,
+       GPIO78_nCS_2,
+       GPIO80_nCS_4,
+       GPIO33_nCS_5,   /* Ethernet */
+
+       /* I2C */
+       GPIO117_I2C_SCL,
+       GPIO118_I2C_SDA,
+
+       /* GPIO */
+       GPIO52_GPIO,    /* IRQ from network controller */
+#ifdef CONFIG_LEDS_GPIO
+       GPIO90_GPIO,    /* PCM027_LED_CPU */
+       GPIO91_GPIO,    /* PCM027_LED_HEART_BEAT */
+#endif
+       GPIO114_GPIO,   /* IRQ from CAN controller */
+};
+
 /*
  * SMC91x network controller specific stuff
  */
@@ -206,13 +228,9 @@ static void __init pcm027_init(void)
         */
        ARB_CNTRL = ARB_CORE_PARK | 0x234;
 
-       platform_add_devices(devices, ARRAY_SIZE(devices));
+       pxa2xx_mfp_config(pcm027_pin_config, ARRAY_SIZE(pcm027_pin_config));
 
-       /* LEDs (on demand only) */
-#ifdef CONFIG_LEDS_GPIO
-       pxa_gpio_mode(PCM027_LED_CPU | GPIO_OUT);
-       pxa_gpio_mode(PCM027_LED_HEARD_BEAT | GPIO_OUT);
-#endif /* CONFIG_LEDS_GPIO */
+       platform_add_devices(devices, ARRAY_SIZE(devices));
 
        /* at last call the baseboard to initialize itself */
 #ifdef CONFIG_MACH_PCM990_BASEBOARD
index bd3a70f..2e3bd8b 100644 (file)
@@ -109,7 +109,7 @@ static unsigned long poodle_pin_config[] __initdata = {
        GPIO74_LCD_FCLK,
        GPIO75_LCD_LCLK,
        GPIO76_LCD_PCLK,
-       GPIO77_LCD_ACBIAS,
+       GPIO77_LCD_BIAS,
 
        /* PC Card */
        GPIO48_nPOE,
index 305452b..f0eda20 100644 (file)
@@ -203,33 +203,17 @@ static struct clk pxa25x_clks[] = {
  * More ones like CP and general purpose register values are preserved
  * with the stack pointer in sleep.S.
  */
-enum { SLEEP_SAVE_PGSR0, SLEEP_SAVE_PGSR1, SLEEP_SAVE_PGSR2,
-
-       SLEEP_SAVE_GAFR0_L, SLEEP_SAVE_GAFR0_U,
-       SLEEP_SAVE_GAFR1_L, SLEEP_SAVE_GAFR1_U,
-       SLEEP_SAVE_GAFR2_L, SLEEP_SAVE_GAFR2_U,
-
+enum {
        SLEEP_SAVE_PSTR,
-
        SLEEP_SAVE_CKEN,
-
        SLEEP_SAVE_COUNT
 };
 
 
 static void pxa25x_cpu_pm_save(unsigned long *sleep_save)
 {
-       SAVE(PGSR0); SAVE(PGSR1); SAVE(PGSR2);
-
-       SAVE(GAFR0_L); SAVE(GAFR0_U);
-       SAVE(GAFR1_L); SAVE(GAFR1_U);
-       SAVE(GAFR2_L); SAVE(GAFR2_U);
-
        SAVE(CKEN);
        SAVE(PSTR);
-
-       /* Clear GPIO transition detect bits */
-       GEDR0 = GEDR0; GEDR1 = GEDR1; GEDR2 = GEDR2;
 }
 
 static void pxa25x_cpu_pm_restore(unsigned long *sleep_save)
@@ -237,14 +221,6 @@ static void pxa25x_cpu_pm_restore(unsigned long *sleep_save)
        /* ensure not to come back here if it wasn't intended */
        PSPR = 0;
 
-       /* restore registers */
-       RESTORE(GAFR0_L); RESTORE(GAFR0_U);
-       RESTORE(GAFR1_L); RESTORE(GAFR1_U);
-       RESTORE(GAFR2_L); RESTORE(GAFR2_U);
-       RESTORE(PGSR0); RESTORE(PGSR1); RESTORE(PGSR2);
-
-       PSSR = PSSR_RDH | PSSR_PH;
-
        RESTORE(CKEN);
        RESTORE(PSTR);
 }
@@ -330,6 +306,8 @@ static struct sys_device pxa25x_sysdev[] = {
        {
                .cls    = &pxa_irq_sysclass,
        }, {
+               .cls    = &pxa2xx_mfp_sysclass,
+       }, {
                .cls    = &pxa_gpio_sysclass,
        },
 };
index f9f6a9c..0288665 100644 (file)
@@ -183,36 +183,18 @@ static struct clk pxa27x_clks[] = {
  * More ones like CP and general purpose register values are preserved
  * with the stack pointer in sleep.S.
  */
-enum { SLEEP_SAVE_PGSR0, SLEEP_SAVE_PGSR1, SLEEP_SAVE_PGSR2, SLEEP_SAVE_PGSR3,
-
-       SLEEP_SAVE_GAFR0_L, SLEEP_SAVE_GAFR0_U,
-       SLEEP_SAVE_GAFR1_L, SLEEP_SAVE_GAFR1_U,
-       SLEEP_SAVE_GAFR2_L, SLEEP_SAVE_GAFR2_U,
-       SLEEP_SAVE_GAFR3_L, SLEEP_SAVE_GAFR3_U,
-
+enum {
        SLEEP_SAVE_PSTR,
-
        SLEEP_SAVE_CKEN,
-
        SLEEP_SAVE_MDREFR,
-       SLEEP_SAVE_PWER, SLEEP_SAVE_PCFR, SLEEP_SAVE_PRER,
-       SLEEP_SAVE_PFER, SLEEP_SAVE_PKWR,
-
+       SLEEP_SAVE_PCFR,
        SLEEP_SAVE_COUNT
 };
 
 void pxa27x_cpu_pm_save(unsigned long *sleep_save)
 {
-       SAVE(PGSR0); SAVE(PGSR1); SAVE(PGSR2); SAVE(PGSR3);
-
-       SAVE(GAFR0_L); SAVE(GAFR0_U);
-       SAVE(GAFR1_L); SAVE(GAFR1_U);
-       SAVE(GAFR2_L); SAVE(GAFR2_U);
-       SAVE(GAFR3_L); SAVE(GAFR3_U);
-
        SAVE(MDREFR);
-       SAVE(PWER); SAVE(PCFR); SAVE(PRER);
-       SAVE(PFER); SAVE(PKWR);
+       SAVE(PCFR);
 
        SAVE(CKEN);
        SAVE(PSTR);
@@ -223,21 +205,12 @@ void pxa27x_cpu_pm_restore(unsigned long *sleep_save)
        /* ensure not to come back here if it wasn't intended */
        PSPR = 0;
 
-       /* restore registers */
-       RESTORE(GAFR0_L); RESTORE(GAFR0_U);
-       RESTORE(GAFR1_L); RESTORE(GAFR1_U);
-       RESTORE(GAFR2_L); RESTORE(GAFR2_U);
-       RESTORE(GAFR3_L); RESTORE(GAFR3_U);
-       RESTORE(PGSR0); RESTORE(PGSR1); RESTORE(PGSR2); RESTORE(PGSR3);
-
        RESTORE(MDREFR);
-       RESTORE(PWER); RESTORE(PCFR); RESTORE(PRER);
-       RESTORE(PFER); RESTORE(PKWR);
+       RESTORE(PCFR);
 
        PSSR = PSSR_RDH | PSSR_PH;
 
        RESTORE(CKEN);
-
        RESTORE(PSTR);
 }
 
@@ -376,6 +349,8 @@ static struct sys_device pxa27x_sysdev[] = {
        {
                .cls    = &pxa_irq_sysclass,
        }, {
+               .cls    = &pxa2xx_mfp_sysclass,
+       }, {
                .cls    = &pxa_gpio_sysclass,
        },
 };
index 095f5c6..1f4d7c0 100644 (file)
@@ -73,6 +73,12 @@ static mfp_cfg_t common_mfp_cfg[] __initdata = {
        GPIO27_AC97_SDATA_OUT,
        GPIO28_AC97_SYNC,
 
+       /* SSP3 */
+       GPIO91_SSP3_SCLK,
+       GPIO92_SSP3_FRM,
+       GPIO93_SSP3_TXD,
+       GPIO94_SSP3_RXD,
+
        /* WM9713 IRQ */
        GPIO26_GPIO,
 
@@ -209,7 +215,7 @@ static struct pca953x_platform_data gpio_exp[] = {
        },
 };
 
-struct i2c_board_info zylonite_i2c_board_info[] = {
+static struct i2c_board_info zylonite_i2c_board_info[] = {
        {
                .type           = "pca9539",
                .addr           = 0x74,
index 9879d7d..755e87f 100644 (file)
@@ -69,6 +69,12 @@ static mfp_cfg_t mfp_cfg[] __initdata = {
        GPIO39_AC97_BITCLK,
        GPIO40_AC97_nACRESET,
 
+       /* SSP3 */
+       GPIO89_SSP3_SCLK,
+       GPIO90_SSP3_FRM,
+       GPIO91_SSP3_TXD,
+       GPIO92_SSP3_RXD,
+
        /* WM9713 IRQ */
        GPIO15_GPIO,
 
index 9eba3f0..fa129c0 100644 (file)
@@ -156,7 +156,7 @@ static int cmx270_init(void)
        int mtd_parts_nb = 0;
        int ret;
 
-       if (!machine_is_armcore())
+       if (!(machine_is_armcore() && cpu_is_pxa27x()))
                return -ENODEV;
 
        ret = gpio_request(GPIO_NAND_CS, "NAND CS");
index 269a9e9..749dff2 100644 (file)
@@ -71,6 +71,6 @@ sa1100_cs-$(CONFIG_SA1100_SIMPAD)             += sa1100_simpad.o
 pxa2xx_cs-$(CONFIG_ARCH_LUBBOCK)               += pxa2xx_lubbock.o sa1111_generic.o
 pxa2xx_cs-$(CONFIG_MACH_MAINSTONE)             += pxa2xx_mainstone.o
 pxa2xx_cs-$(CONFIG_PXA_SHARPSL)                        += pxa2xx_sharpsl.o
-pxa2xx_cs-$(CONFIG_MACH_ARMCORE)               += pxa2xx_cm_x270.o
+pxa2xx_cs-$(CONFIG_MACH_ARMCORE)               += pxa2xx_cm_x2xx.o pxa2xx_cm_x255.o pxa2xx_cm_x270.o
 pxa2xx_cs-$(CONFIG_MACH_PALMTX)                += pxa2xx_palmtx.o
 
diff --git a/drivers/pcmcia/pxa2xx_cm_x255.c b/drivers/pcmcia/pxa2xx_cm_x255.c
new file mode 100644 (file)
index 0000000..7c8bcb4
--- /dev/null
@@ -0,0 +1,154 @@
+/*
+ * linux/drivers/pcmcia/pxa/pxa_cm_x255.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.
+ *
+ * Compulab Ltd., 2003, 2007, 2008
+ * Mike Rapoport <mike@compulab.co.il>
+ *
+ */
+
+#include <linux/platform_device.h>
+#include <linux/irq.h>
+#include <linux/delay.h>
+#include <linux/gpio.h>
+
+#include <asm/mach-types.h>
+#include <mach/pxa-regs.h>
+
+#include "soc_common.h"
+
+#define GPIO_PCMCIA_SKTSEL     (54)
+#define GPIO_PCMCIA_S0_CD_VALID        (16)
+#define GPIO_PCMCIA_S1_CD_VALID        (17)
+#define GPIO_PCMCIA_S0_RDYINT  (6)
+#define GPIO_PCMCIA_S1_RDYINT  (8)
+#define GPIO_PCMCIA_RESET      (9)
+
+#define PCMCIA_S0_CD_VALID     IRQ_GPIO(GPIO_PCMCIA_S0_CD_VALID)
+#define PCMCIA_S1_CD_VALID     IRQ_GPIO(GPIO_PCMCIA_S1_CD_VALID)
+#define PCMCIA_S0_RDYINT       IRQ_GPIO(GPIO_PCMCIA_S0_RDYINT)
+#define PCMCIA_S1_RDYINT       IRQ_GPIO(GPIO_PCMCIA_S1_RDYINT)
+
+
+static struct pcmcia_irqs irqs[] = {
+       { 0, PCMCIA_S0_CD_VALID, "PCMCIA0 CD" },
+       { 1, PCMCIA_S1_CD_VALID, "PCMCIA1 CD" },
+};
+
+static int cmx255_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
+{
+       int ret = gpio_request(GPIO_PCMCIA_RESET, "PCCard reset");
+       if (ret)
+               return ret;
+       gpio_direction_output(GPIO_PCMCIA_RESET, 0);
+
+       skt->irq = skt->nr == 0 ? PCMCIA_S0_RDYINT : PCMCIA_S1_RDYINT;
+       ret = soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
+       if (!ret)
+               gpio_free(GPIO_PCMCIA_RESET);
+
+       return ret;
+}
+
+static void cmx255_pcmcia_shutdown(struct soc_pcmcia_socket *skt)
+{
+       soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs));
+       gpio_free(GPIO_PCMCIA_RESET);
+}
+
+
+static void cmx255_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
+                                      struct pcmcia_state *state)
+{
+       int cd = skt->nr ? GPIO_PCMCIA_S1_CD_VALID : GPIO_PCMCIA_S0_CD_VALID;
+       int rdy = skt->nr ? GPIO_PCMCIA_S0_RDYINT : GPIO_PCMCIA_S1_RDYINT;
+
+       state->detect = !gpio_get_value(cd);
+       state->ready  = !!gpio_get_value(rdy);
+       state->bvd1   = 1;
+       state->bvd2   = 1;
+       state->vs_3v  = 0;
+       state->vs_Xv  = 0;
+       state->wrprot = 0;  /* not available */
+}
+
+
+static int cmx255_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
+                                         const socket_state_t *state)
+{
+       switch (skt->nr) {
+       case 0:
+               if (state->flags & SS_RESET) {
+                       gpio_set_value(GPIO_PCMCIA_SKTSEL, 0);
+                       udelay(1);
+                       gpio_set_value(GPIO_PCMCIA_RESET, 1);
+                       udelay(10);
+                       gpio_set_value(GPIO_PCMCIA_RESET, 0);
+               }
+               break;
+       case 1:
+               if (state->flags & SS_RESET) {
+                       gpio_set_value(GPIO_PCMCIA_SKTSEL, 1);
+                       udelay(1);
+                       gpio_set_value(GPIO_PCMCIA_RESET, 1);
+                       udelay(10);
+                       gpio_set_value(GPIO_PCMCIA_RESET, 0);
+               }
+               break;
+       }
+
+       return 0;
+}
+
+static void cmx255_pcmcia_socket_init(struct soc_pcmcia_socket *skt)
+{
+}
+
+static void cmx255_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt)
+{
+}
+
+
+static struct pcmcia_low_level cmx255_pcmcia_ops __initdata = {
+       .owner                  = THIS_MODULE,
+       .hw_init                = cmx255_pcmcia_hw_init,
+       .hw_shutdown            = cmx255_pcmcia_shutdown,
+       .socket_state           = cmx255_pcmcia_socket_state,
+       .configure_socket       = cmx255_pcmcia_configure_socket,
+       .socket_init            = cmx255_pcmcia_socket_init,
+       .socket_suspend         = cmx255_pcmcia_socket_suspend,
+       .nr                     = 1,
+};
+
+static struct platform_device *cmx255_pcmcia_device;
+
+int __init cmx255_pcmcia_init(void)
+{
+       int ret;
+
+       cmx255_pcmcia_device = platform_device_alloc("pxa2xx-pcmcia", -1);
+
+       if (!cmx255_pcmcia_device)
+               return -ENOMEM;
+
+       ret = platform_device_add_data(cmx255_pcmcia_device, &cmx255_pcmcia_ops,
+                                      sizeof(cmx255_pcmcia_ops));
+
+       if (ret == 0) {
+               printk(KERN_INFO "Registering cm-x255 PCMCIA interface.\n");
+               ret = platform_device_add(cmx255_pcmcia_device);
+       }
+
+       if (ret)
+               platform_device_put(cmx255_pcmcia_device);
+
+       return ret;
+}
+
+void __exit cmx255_pcmcia_exit(void)
+{
+       platform_device_unregister(cmx255_pcmcia_device);
+}
index bcff5cf..6c3aac3 100644 (file)
@@ -105,13 +105,10 @@ static struct pcmcia_low_level cmx270_pcmcia_ops __initdata = {
 
 static struct platform_device *cmx270_pcmcia_device;
 
-static int __init cmx270_pcmcia_init(void)
+int __init cmx270_pcmcia_init(void)
 {
        int ret;
 
-       if (!machine_is_armcore())
-               return -ENODEV;
-
        cmx270_pcmcia_device = platform_device_alloc("pxa2xx-pcmcia", -1);
 
        if (!cmx270_pcmcia_device)
@@ -131,14 +128,7 @@ static int __init cmx270_pcmcia_init(void)
        return ret;
 }
 
-static void __exit cmx270_pcmcia_exit(void)
+void __exit cmx270_pcmcia_exit(void)
 {
        platform_device_unregister(cmx270_pcmcia_device);
 }
-
-module_init(cmx270_pcmcia_init);
-module_exit(cmx270_pcmcia_exit);
-
-MODULE_LICENSE("GPL");
-MODULE_AUTHOR("Mike Rapoport <mike@compulab.co.il>");
-MODULE_DESCRIPTION("CM-x270 PCMCIA driver");
diff --git a/drivers/pcmcia/pxa2xx_cm_x2xx.c b/drivers/pcmcia/pxa2xx_cm_x2xx.c
new file mode 100644 (file)
index 0000000..4f09506
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * linux/drivers/pcmcia/pxa/pxa_cm_x2xx.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.
+ *
+ * Compulab Ltd., 2003, 2007, 2008
+ * Mike Rapoport <mike@compulab.co.il>
+ *
+ */
+
+#include <linux/module.h>
+
+#include <asm/system.h>
+#include <asm/mach-types.h>
+#include <mach/system.h>
+
+int cmx255_pcmcia_init(void);
+int cmx270_pcmcia_init(void);
+void cmx255_pcmcia_exit(void);
+void cmx270_pcmcia_exit(void);
+
+static int __init cmx2xx_pcmcia_init(void)
+{
+       int ret = -ENODEV;
+
+       if (machine_is_armcore() && cpu_is_pxa25x())
+               ret = cmx255_pcmcia_init();
+       else if (machine_is_armcore() && cpu_is_pxa27x())
+               ret = cmx270_pcmcia_init();
+
+       return ret;
+}
+
+static void __exit cmx2xx_pcmcia_exit(void)
+{
+       if (machine_is_armcore() && cpu_is_pxa25x())
+               cmx255_pcmcia_exit();
+       else if (machine_is_armcore() && cpu_is_pxa27x())
+               cmx270_pcmcia_exit();
+}
+
+module_init(cmx2xx_pcmcia_init);
+module_exit(cmx2xx_pcmcia_exit);
+
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Mike Rapoport <mike@compulab.co.il>");
+MODULE_DESCRIPTION("CM-x2xx PCMCIA driver");
index 70d135e..d85a74c 100644 (file)
@@ -172,11 +172,6 @@ config FB_DEFERRED_IO
        bool
        depends on FB
 
-config FB_METRONOME
-       tristate
-       depends on FB
-       depends on FB_DEFERRED_IO
-
 config FB_HECUBA
        tristate
        depends on FB
@@ -1974,19 +1969,6 @@ config FB_XILINX
          framebuffer. ML300 carries a 640*480 LCD display on the board,
          ML403 uses a standard DB15 VGA connector.
 
-config FB_AM200EPD
-       tristate "AM-200 E-Ink EPD devkit support"
-       depends on FB && ARCH_PXA && MMU
-       select FB_SYS_FILLRECT
-       select FB_SYS_COPYAREA
-       select FB_SYS_IMAGEBLIT
-       select FB_SYS_FOPS
-       select FB_DEFERRED_IO
-       select FB_METRONOME
-       help
-         This enables support for the Metronome display controller used on
-         the E-Ink AM-200 EPD devkit.
-
 config FB_COBALT
        tristate "Cobalt server LCD frame buffer support"
        depends on FB && MIPS_COBALT
@@ -2041,6 +2023,19 @@ config XEN_FBDEV_FRONTEND
          frame buffer driver.  It communicates with a back-end
          in another domain.
 
+config FB_METRONOME
+       tristate "E-Ink Metronome/8track controller support"
+       depends on FB
+       select FB_SYS_FILLRECT
+       select FB_SYS_COPYAREA
+       select FB_SYS_IMAGEBLIT
+       select FB_SYS_FOPS
+       select FB_DEFERRED_IO
+       help
+         This driver implements support for the E-Ink Metronome
+         controller. The pre-release name for this device was 8track
+         and could also have been called by some vendors as PVI-nnnn.
+
 source "drivers/video/omap/Kconfig"
 
 source "drivers/video/backlight/Kconfig"
index a6b5529..ad0330b 100644 (file)
@@ -29,7 +29,6 @@ obj-$(CONFIG_FB_DEFERRED_IO)   += fb_defio.o
 
 # Hardware specific drivers go first
 obj-$(CONFIG_FB_AMIGA)            += amifb.o c2p.o
-obj-$(CONFIG_FB_AM200EPD)         += am200epd.o
 obj-$(CONFIG_FB_ARC)              += arcfb.o
 obj-$(CONFIG_FB_CLPS711X)         += clps711xfb.o
 obj-$(CONFIG_FB_CYBER2000)        += cyber2000fb.o
diff --git a/drivers/video/am200epd.c b/drivers/video/am200epd.c
deleted file mode 100644 (file)
index 0c35b8b..0000000
+++ /dev/null
@@ -1,295 +0,0 @@
-/*
- * linux/drivers/video/am200epd.c -- Platform device for AM200 EPD kit
- *
- * Copyright (C) 2008, Jaya Kumar
- *
- * 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.
- *
- * Layout is based on skeletonfb.c by James Simmons and Geert Uytterhoeven.
- *
- * This work was made possible by help and equipment support from E-Ink
- * Corporation. http://support.eink.com/community
- *
- * This driver is written to be used with the Metronome display controller.
- * on the AM200 EPD prototype kit/development kit with an E-Ink 800x600
- * Vizplex EPD on a Gumstix board using the Lyre interface board.
- *
- */
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/errno.h>
-#include <linux/string.h>
-#include <linux/delay.h>
-#include <linux/interrupt.h>
-#include <linux/fb.h>
-#include <linux/init.h>
-#include <linux/platform_device.h>
-#include <linux/list.h>
-#include <linux/uaccess.h>
-#include <linux/irq.h>
-
-#include <video/metronomefb.h>
-
-#include <mach/pxa-regs.h>
-
-/* register offsets for gpio control */
-#define LED_GPIO_PIN 51
-#define STDBY_GPIO_PIN 48
-#define RST_GPIO_PIN 49
-#define RDY_GPIO_PIN 32
-#define ERR_GPIO_PIN 17
-#define PCBPWR_GPIO_PIN 16
-
-#define AF_SEL_GPIO_N 0x3
-#define GAFR0_U_OFFSET(pin) ((pin - 16) * 2)
-#define GAFR1_L_OFFSET(pin) ((pin - 32) * 2)
-#define GAFR1_U_OFFSET(pin) ((pin - 48) * 2)
-#define GPDR1_OFFSET(pin) (pin - 32)
-#define GPCR1_OFFSET(pin) (pin - 32)
-#define GPSR1_OFFSET(pin) (pin - 32)
-#define GPCR0_OFFSET(pin) (pin)
-#define GPSR0_OFFSET(pin) (pin)
-
-static void am200_set_gpio_output(int pin, int val)
-{
-       u8 index;
-
-       index = pin >> 4;
-
-       switch (index) {
-       case 1:
-               if (val)
-                       GPSR0 |= (1 << GPSR0_OFFSET(pin));
-               else
-                       GPCR0 |= (1 << GPCR0_OFFSET(pin));
-               break;
-       case 2:
-               break;
-       case 3:
-               if (val)
-                       GPSR1 |= (1 << GPSR1_OFFSET(pin));
-               else
-                       GPCR1 |= (1 << GPCR1_OFFSET(pin));
-               break;
-       default:
-               printk(KERN_ERR "unimplemented\n");
-       }
-}
-
-static void __devinit am200_init_gpio_pin(int pin, int dir)
-{
-       u8 index;
-       /* dir 0 is output, 1 is input
-       - do 2 things here:
-       - set gpio alternate function to standard gpio
-       - set gpio direction to input or output  */
-
-       index = pin >> 4;
-       switch (index) {
-       case 1:
-               GAFR0_U &= ~(AF_SEL_GPIO_N << GAFR0_U_OFFSET(pin));
-
-               if (dir)
-                       GPDR0 &= ~(1 << pin);
-               else
-                       GPDR0 |= (1 << pin);
-               break;
-       case 2:
-               GAFR1_L &= ~(AF_SEL_GPIO_N << GAFR1_L_OFFSET(pin));
-
-               if (dir)
-                       GPDR1 &= ~(1 << GPDR1_OFFSET(pin));
-               else
-                       GPDR1 |= (1 << GPDR1_OFFSET(pin));
-               break;
-       case 3:
-               GAFR1_U &= ~(AF_SEL_GPIO_N << GAFR1_U_OFFSET(pin));
-
-               if (dir)
-                       GPDR1 &= ~(1 << GPDR1_OFFSET(pin));
-               else
-                       GPDR1 |= (1 << GPDR1_OFFSET(pin));
-               break;
-       default:
-               printk(KERN_ERR "unimplemented\n");
-       }
-}
-
-static void am200_init_gpio_regs(struct metronomefb_par *par)
-{
-       am200_init_gpio_pin(LED_GPIO_PIN, 0);
-       am200_set_gpio_output(LED_GPIO_PIN, 0);
-
-       am200_init_gpio_pin(STDBY_GPIO_PIN, 0);
-       am200_set_gpio_output(STDBY_GPIO_PIN, 0);
-
-       am200_init_gpio_pin(RST_GPIO_PIN, 0);
-       am200_set_gpio_output(RST_GPIO_PIN, 0);
-
-       am200_init_gpio_pin(RDY_GPIO_PIN, 1);
-
-       am200_init_gpio_pin(ERR_GPIO_PIN, 1);
-
-       am200_init_gpio_pin(PCBPWR_GPIO_PIN, 0);
-       am200_set_gpio_output(PCBPWR_GPIO_PIN, 0);
-}
-
-static void am200_disable_lcd_controller(struct metronomefb_par *par)
-{
-       LCSR = 0xffffffff;      /* Clear LCD Status Register */
-       LCCR0 |= LCCR0_DIS;     /* Disable LCD Controller */
-
-       /* we reset and just wait for things to settle */
-       msleep(200);
-}
-
-static void am200_enable_lcd_controller(struct metronomefb_par *par)
-{
-       LCSR = 0xffffffff;
-       FDADR0 = par->metromem_desc_dma;
-       LCCR0 |= LCCR0_ENB;
-}
-
-static void am200_init_lcdc_regs(struct metronomefb_par *par)
-{
-       /* here we do:
-       - disable the lcd controller
-       - setup lcd control registers
-       - setup dma descriptor
-       - reenable lcd controller
-       */
-
-       /* disable the lcd controller */
-       am200_disable_lcd_controller(par);
-
-       /* setup lcd control registers */
-       LCCR0 = LCCR0_LDM | LCCR0_SFM | LCCR0_IUM | LCCR0_EFM | LCCR0_PAS
-               | LCCR0_QDM | LCCR0_BM | LCCR0_OUM;
-
-       LCCR1 = (par->info->var.xres/2 - 1) /* pixels per line */
-               | (27 << 10) /* hsync pulse width - 1 */
-               | (33 << 16) /* eol pixel count */
-               | (33 << 24); /* bol pixel count */
-
-       LCCR2 = (par->info->var.yres - 1) /* lines per panel */
-               | (24 << 10) /* vsync pulse width - 1 */
-               | (2 << 16) /* eof pixel count */
-               | (0 << 24); /* bof pixel count */
-
-       LCCR3 = 2 /* pixel clock divisor */
-               | (24 << 8) /* AC Bias pin freq */
-               | LCCR3_16BPP /* BPP */
-               | LCCR3_PCP;  /* PCP falling edge */
-
-}
-
-static void am200_post_dma_setup(struct metronomefb_par *par)
-{
-       par->metromem_desc->mFDADR0 = par->metromem_desc_dma;
-       par->metromem_desc->mFSADR0 = par->metromem_dma;
-       par->metromem_desc->mFIDR0 = 0;
-       par->metromem_desc->mLDCMD0 = par->info->var.xres
-                                       * par->info->var.yres;
-       am200_enable_lcd_controller(par);
-}
-
-static void am200_free_irq(struct fb_info *info)
-{
-       free_irq(IRQ_GPIO(RDY_GPIO_PIN), info);
-}
-
-static irqreturn_t am200_handle_irq(int irq, void *dev_id)
-{
-       struct fb_info *info = dev_id;
-       struct metronomefb_par *par = info->par;
-
-       wake_up_interruptible(&par->waitq);
-       return IRQ_HANDLED;
-}
-
-static int am200_setup_irq(struct fb_info *info)
-{
-       int retval;
-
-       retval = request_irq(IRQ_GPIO(RDY_GPIO_PIN), am200_handle_irq,
-                               IRQF_DISABLED, "AM200", info);
-       if (retval) {
-               printk(KERN_ERR "am200epd: request_irq failed: %d\n", retval);
-               return retval;
-       }
-
-       return set_irq_type(IRQ_GPIO(RDY_GPIO_PIN), IRQ_TYPE_EDGE_FALLING);
-}
-
-static void am200_set_rst(struct metronomefb_par *par, int state)
-{
-       am200_set_gpio_output(RST_GPIO_PIN, state);
-}
-
-static void am200_set_stdby(struct metronomefb_par *par, int state)
-{
-       am200_set_gpio_output(STDBY_GPIO_PIN, state);
-}
-
-static int am200_wait_event(struct metronomefb_par *par)
-{
-       return wait_event_timeout(par->waitq, (GPLR1 & 0x01), HZ);
-}
-
-static int am200_wait_event_intr(struct metronomefb_par *par)
-{
-       return wait_event_interruptible_timeout(par->waitq, (GPLR1 & 0x01), HZ);
-}
-
-static struct metronome_board am200_board = {
-       .owner                  = THIS_MODULE,
-       .free_irq               = am200_free_irq,
-       .setup_irq              = am200_setup_irq,
-       .init_gpio_regs         = am200_init_gpio_regs,
-       .init_lcdc_regs         = am200_init_lcdc_regs,
-       .post_dma_setup         = am200_post_dma_setup,
-       .set_rst                = am200_set_rst,
-       .set_stdby              = am200_set_stdby,
-       .met_wait_event         = am200_wait_event,
-       .met_wait_event_intr    = am200_wait_event_intr,
-};
-
-static struct platform_device *am200_device;
-
-static int __init am200_init(void)
-{
-       int ret;
-
-       /* request our platform independent driver */
-       request_module("metronomefb");
-
-       am200_device = platform_device_alloc("metronomefb", -1);
-       if (!am200_device)
-               return -ENOMEM;
-
-       platform_device_add_data(am200_device, &am200_board,
-                                       sizeof(am200_board));
-
-       /* this _add binds metronomefb to am200. metronomefb refcounts am200 */
-       ret = platform_device_add(am200_device);
-
-       if (ret)
-               platform_device_put(am200_device);
-
-       return ret;
-}
-
-static void __exit am200_exit(void)
-{
-       platform_device_unregister(am200_device);
-}
-
-module_init(am200_init);
-module_exit(am200_exit);
-
-MODULE_DESCRIPTION("board driver for am200 metronome epd kit");
-MODULE_AUTHOR("Jaya Kumar");
-MODULE_LICENSE("GPL");
index cc4c038..afeed06 100644 (file)
 
 #include <asm/unaligned.h>
 
-
-#define DEBUG 1
-#ifdef DEBUG
-#define DPRINTK(f, a...) printk(KERN_DEBUG "%s: " f, __func__ , ## a)
-#else
-#define DPRINTK(f, a...)
-#endif
-
-
 /* Display specific information */
 #define DPY_W 832
 #define DPY_H 622
 
+static int user_wfm_size;
+
 /* frame differs from image. frame includes non-visible pixels */
 struct epd_frame {
        int fw; /* frame width */
        int fh; /* frame height */
+       u16 config[4];
+       int wfm_size;
 };
 
 static struct epd_frame epd_frame_table[] = {
        {
-       .fw = 832,
-       .fh = 622
+               .fw = 832,
+               .fh = 622,
+               .config = {
+                       15 /* sdlew */
+                       | 2 << 8 /* sdosz */
+                       | 0 << 11 /* sdor */
+                       | 0 << 12 /* sdces */
+                       | 0 << 15, /* sdcer */
+                       42 /* gdspl */
+                       | 1 << 8 /* gdr1 */
+                       | 1 << 9 /* sdshr */
+                       | 0 << 15, /* gdspp */
+                       18 /* gdspw */
+                       | 0 << 15, /* dispc */
+                       599 /* vdlc */
+                       | 0 << 11 /* dsi */
+                       | 0 << 12, /* dsic */
+               },
+               .wfm_size = 47001,
+       },
+       {
+               .fw = 1088,
+               .fh = 791,
+               .config = {
+                       0x0104,
+                       0x031f,
+                       0x0088,
+                       0x02ff,
+               },
+               .wfm_size = 46770,
+       },
+       {
+               .fw = 1200,
+               .fh = 842,
+               .config = {
+                       0x0101,
+                       0x030e,
+                       0x0012,
+                       0x0280,
+               },
+               .wfm_size = 46770,
        },
 };
 
@@ -134,9 +168,8 @@ static u16 calc_img_cksum(u16 *start, int length)
 }
 
 /* here we decode the incoming waveform file and populate metromem */
-#define EXP_WFORM_SIZE 47001
-static int load_waveform(u8 *mem, size_t size, u8 *metromem, int m, int t,
-                               u8 *frame_count)
+static int __devinit load_waveform(u8 *mem, size_t size, int m, int t,
+                               struct metronomefb_par *par)
 {
        int tta;
        int wmta;
@@ -148,26 +181,31 @@ static int load_waveform(u8 *mem, size_t size, u8 *metromem, int m, int t,
        int wfm_idx, owfm_idx;
        int mem_idx = 0;
        struct waveform_hdr *wfm_hdr;
+       u8 *metromem = par->metromem_wfm;
+       struct device *dev = par->info->dev;
 
-       if (size != EXP_WFORM_SIZE) {
-               printk(KERN_ERR "Error: unexpected size %d != %d\n", size,
-                                       EXP_WFORM_SIZE);
+       if (user_wfm_size)
+               epd_frame_table[par->dt].wfm_size = user_wfm_size;
+
+       if (size != epd_frame_table[par->dt].wfm_size) {
+               dev_err(dev, "Error: unexpected size %d != %d\n", size,
+                                       epd_frame_table[par->dt].wfm_size);
                return -EINVAL;
        }
 
        wfm_hdr = (struct waveform_hdr *) mem;
 
        if (wfm_hdr->fvsn != 1) {
-               printk(KERN_ERR "Error: bad fvsn %x\n", wfm_hdr->fvsn);
+               dev_err(dev, "Error: bad fvsn %x\n", wfm_hdr->fvsn);
                return -EINVAL;
        }
        if (wfm_hdr->luts != 0) {
-               printk(KERN_ERR "Error: bad luts %x\n", wfm_hdr->luts);
+               dev_err(dev, "Error: bad luts %x\n", wfm_hdr->luts);
                return -EINVAL;
        }
        cksum = calc_cksum(32, 47, mem);
        if (cksum != wfm_hdr->wfm_cs) {
-               printk(KERN_ERR "Error: bad cksum %x != %x\n", cksum,
+               dev_err(dev, "Error: bad cksum %x != %x\n", cksum,
                                        wfm_hdr->wfm_cs);
                return -EINVAL;
        }
@@ -175,7 +213,7 @@ static int load_waveform(u8 *mem, size_t size, u8 *metromem, int m, int t,
        wfm_hdr->trc += 1;
        for (i = 0; i < 5; i++) {
                if (*(wfm_hdr->stuff2a + i) != 0) {
-                       printk(KERN_ERR "Error: unexpected value in padding\n");
+                       dev_err(dev, "Error: unexpected value in padding\n");
                        return -EINVAL;
                }
        }
@@ -200,7 +238,7 @@ static int load_waveform(u8 *mem, size_t size, u8 *metromem, int m, int t,
                return -EINVAL;
        cksum = calc_cksum(sizeof(*wfm_hdr), cksum_idx, mem);
        if (cksum != mem[cksum_idx]) {
-               printk(KERN_ERR "Error: bad temperature range table cksum"
+               dev_err(dev, "Error: bad temperature range table cksum"
                                " %x != %x\n", cksum, mem[cksum_idx]);
                return -EINVAL;
        }
@@ -212,7 +250,7 @@ static int load_waveform(u8 *mem, size_t size, u8 *metromem, int m, int t,
                return -EINVAL;
        cksum = calc_cksum(cksum_idx - 3, cksum_idx, mem);
        if (cksum != mem[cksum_idx]) {
-               printk(KERN_ERR "Error: bad mode table address cksum"
+               dev_err(dev, "Error: bad mode table address cksum"
                                " %x != %x\n", cksum, mem[cksum_idx]);
                return -EINVAL;
        }
@@ -224,7 +262,7 @@ static int load_waveform(u8 *mem, size_t size, u8 *metromem, int m, int t,
                return -EINVAL;
        cksum = calc_cksum(cksum_idx - 3, cksum_idx, mem);
        if (cksum != mem[cksum_idx]) {
-               printk(KERN_ERR "Error: bad temperature table address cksum"
+               dev_err(dev, "Error: bad temperature table address cksum"
                        " %x != %x\n", cksum, mem[cksum_idx]);
                return -EINVAL;
        }
@@ -259,11 +297,11 @@ static int load_waveform(u8 *mem, size_t size, u8 *metromem, int m, int t,
                return -EINVAL;
        cksum = calc_cksum(owfm_idx, cksum_idx, mem);
        if (cksum != mem[cksum_idx]) {
-               printk(KERN_ERR "Error: bad waveform data cksum"
+               dev_err(dev, "Error: bad waveform data cksum"
                                " %x != %x\n", cksum, mem[cksum_idx]);
                return -EINVAL;
        }
-       *frame_count = (mem_idx/64);
+       par->frame_count = (mem_idx/64);
 
        return 0;
 }
@@ -274,15 +312,12 @@ static int metronome_display_cmd(struct metronomefb_par *par)
        u16 cs;
        u16 opcode;
        static u8 borderval;
-       u8 *ptr;
 
        /* setup display command
        we can't immediately set the opcode since the controller
        will try parse the command before we've set it all up
        so we just set cs here and set the opcode at the end */
 
-       ptr = par->metromem;
-
        if (par->metromem_cmd->opcode == 0xCC40)
                opcode = cs = 0xCC41;
        else
@@ -335,44 +370,17 @@ static int __devinit metronome_powerup_cmd(struct metronomefb_par *par)
 
 static int __devinit metronome_config_cmd(struct metronomefb_par *par)
 {
-       int i;
-       u16 cs;
-
        /* setup config command
        we can't immediately set the opcode since the controller
-       will try parse the command before we've set it all up
-       so we just set cs here and set the opcode at the end */
-
-       cs = 0xCC10;
-
-       /* set the 12 args ( 8 bytes ) for config. see spec for meanings */
-       i = 0;
-       par->metromem_cmd->args[i] =    15 /* sdlew */
-                                       | 2 << 8 /* sdosz */
-                                       | 0 << 11 /* sdor */
-                                       | 0 << 12 /* sdces */
-                                       | 0 << 15; /* sdcer */
-       cs += par->metromem_cmd->args[i++];
-
-       par->metromem_cmd->args[i] =    42 /* gdspl */
-                                       | 1 << 8 /* gdr1 */
-                                       | 1 << 9 /* sdshr */
-                                       | 0 << 15; /* gdspp */
-       cs += par->metromem_cmd->args[i++];
-
-       par->metromem_cmd->args[i] =    18 /* gdspw */
-                                       | 0 << 15; /* dispc */
-       cs += par->metromem_cmd->args[i++];
-
-       par->metromem_cmd->args[i] =    599 /* vdlc */
-                                       | 0 << 11 /* dsi */
-                                       | 0 << 12; /* dsic */
-       cs += par->metromem_cmd->args[i++];
+       will try parse the command before we've set it all up */
 
+       memcpy(par->metromem_cmd->args, epd_frame_table[par->dt].config,
+               sizeof(epd_frame_table[par->dt].config));
        /* the rest are 0 */
-       memset((u8 *) (par->metromem_cmd->args + i), 0, (32-i)*2);
+       memset((u8 *) (par->metromem_cmd->args + 4), 0, (32-4)*2);
 
-       par->metromem_cmd->csum = cs;
+       par->metromem_cmd->csum = 0xCC10;
+       par->metromem_cmd->csum += calc_img_cksum(par->metromem_cmd->args, 4);
        par->metromem_cmd->opcode = 0xCC10; /* config cmd */
 
        return par->board->met_wait_event(par);
@@ -408,12 +416,9 @@ static int __devinit metronome_init_regs(struct metronomefb_par *par)
 {
        int res;
 
-       par->board->init_gpio_regs(par);
-
-       par->board->init_lcdc_regs(par);
-
-       /* now that lcd is setup, setup dma descriptor */
-       par->board->post_dma_setup(par);
+       res = par->board->setup_io(par);
+       if (res)
+               return res;
 
        res = metronome_powerup_cmd(par);
        if (res)
@@ -430,16 +435,16 @@ static int __devinit metronome_init_regs(struct metronomefb_par *par)
 
 static void metronomefb_dpy_update(struct metronomefb_par *par)
 {
+       int fbsize;
        u16 cksum;
        unsigned char *buf = (unsigned char __force *)par->info->screen_base;
 
+       fbsize = par->info->fix.smem_len;
        /* copy from vm to metromem */
-       memcpy(par->metromem_img, buf, DPY_W*DPY_H);
+       memcpy(par->metromem_img, buf, fbsize);
 
-       cksum = calc_img_cksum((u16 *) par->metromem_img,
-                               (epd_frame_table[0].fw * DPY_H)/2);
-       *((u16 *)(par->metromem_img) +
-                       (epd_frame_table[0].fw * DPY_H)/2) = cksum;
+       cksum = calc_img_cksum((u16 *) par->metromem_img, fbsize/2);
+       *((u16 *)(par->metromem_img) + fbsize/2) = cksum;
        metronome_display_cmd(par);
 }
 
@@ -574,8 +579,10 @@ static int __devinit metronomefb_probe(struct platform_device *dev)
        unsigned char *videomemory;
        struct metronomefb_par *par;
        const struct firmware *fw_entry;
-       int cmd_size, wfm_size, img_size, padding_size, totalsize;
        int i;
+       int panel_type;
+       int fw, fh;
+       int epd_dt_index;
 
        /* pick up board specific routines */
        board = dev->dev.platform_data;
@@ -586,96 +593,108 @@ static int __devinit metronomefb_probe(struct platform_device *dev)
        if (!try_module_get(board->owner))
                return -ENODEV;
 
+       info = framebuffer_alloc(sizeof(struct metronomefb_par), &dev->dev);
+       if (!info)
+               goto err;
+
        /* we have two blocks of memory.
        info->screen_base which is vm, and is the fb used by apps.
        par->metromem which is physically contiguous memory and
        contains the display controller commands, waveform,
        processed image data and padding. this is the data pulled
-       by the device's LCD controller and pushed to Metronome */
+       by the device's LCD controller and pushed to Metronome.
+       the metromem memory is allocated by the board driver and
+       is provided to us */
+
+       panel_type = board->get_panel_type();
+       switch (panel_type) {
+       case 6:
+               epd_dt_index = 0;
+               break;
+       case 8:
+               epd_dt_index = 1;
+               break;
+       case 97:
+               epd_dt_index = 2;
+               break;
+       default:
+               dev_err(&dev->dev, "Unexpected panel type. Defaulting to 6\n");
+               epd_dt_index = 0;
+               break;
+       }
+
+       fw = epd_frame_table[epd_dt_index].fw;
+       fh = epd_frame_table[epd_dt_index].fh;
 
-       videomemorysize = (DPY_W*DPY_H);
+       /* we need to add a spare page because our csum caching scheme walks
+        * to the end of the page */
+       videomemorysize = PAGE_SIZE + (fw * fh);
        videomemory = vmalloc(videomemorysize);
        if (!videomemory)
-               return -ENOMEM;
+               goto err_fb_rel;
 
        memset(videomemory, 0, videomemorysize);
 
-       info = framebuffer_alloc(sizeof(struct metronomefb_par), &dev->dev);
-       if (!info)
-               goto err_vfree;
-
        info->screen_base = (char __force __iomem *)videomemory;
        info->fbops = &metronomefb_ops;
 
+       metronomefb_fix.line_length = fw;
+       metronomefb_var.xres = fw;
+       metronomefb_var.yres = fh;
+       metronomefb_var.xres_virtual = fw;
+       metronomefb_var.yres_virtual = fh;
        info->var = metronomefb_var;
        info->fix = metronomefb_fix;
        info->fix.smem_len = videomemorysize;
        par = info->par;
        par->info = info;
        par->board = board;
+       par->dt = epd_dt_index;
        init_waitqueue_head(&par->waitq);
 
        /* this table caches per page csum values. */
        par->csum_table = vmalloc(videomemorysize/PAGE_SIZE);
        if (!par->csum_table)
+               goto err_vfree;
+
+       /* the physical framebuffer that we use is setup by
+        * the platform device driver. It will provide us
+        * with cmd, wfm and image memory in a contiguous area. */
+       retval = board->setup_fb(par);
+       if (retval) {
+               dev_err(&dev->dev, "Failed to setup fb\n");
                goto err_csum_table;
+       }
 
-       /* the metromem buffer is divided as follows:
-       command | CRC | padding
-       16kb waveform data | CRC | padding
-       image data | CRC
-       and an extra 256 bytes for dma descriptors
-       eg: IW=832 IH=622 WS=128
-       */
-
-       cmd_size = 1 * epd_frame_table[0].fw;
-       wfm_size = ((16*1024 + 2 + epd_frame_table[0].fw - 1)
-                       / epd_frame_table[0].fw) * epd_frame_table[0].fw;
-       img_size = epd_frame_table[0].fh * epd_frame_table[0].fw;
-       padding_size = 4 * epd_frame_table[0].fw;
-       totalsize = cmd_size + wfm_size + img_size + padding_size;
-       par->metromemsize = PAGE_ALIGN(totalsize + 256);
-       DPRINTK("desired memory size = %d\n", par->metromemsize);
-       dev->dev.coherent_dma_mask = 0xffffffffull;
-       par->metromem = dma_alloc_writecombine(&dev->dev, par->metromemsize,
-                                               &par->metromem_dma, GFP_KERNEL);
-       if (!par->metromem) {
-               printk(KERN_ERR
-                       "metronomefb: unable to allocate dma buffer\n");
-               goto err_vfree;
+       /* after this point we should have a framebuffer */
+       if ((!par->metromem_wfm) ||  (!par->metromem_img) ||
+               (!par->metromem_dma)) {
+               dev_err(&dev->dev, "fb access failure\n");
+               retval = -EINVAL;
+               goto err_csum_table;
        }
 
        info->fix.smem_start = par->metromem_dma;
-       par->metromem_cmd = (struct metromem_cmd *) par->metromem;
-       par->metromem_wfm = par->metromem + cmd_size;
-       par->metromem_img = par->metromem + cmd_size + wfm_size;
-       par->metromem_img_csum = (u16 *) (par->metromem_img +
-                                       (epd_frame_table[0].fw * DPY_H));
-       DPRINTK("img offset=0x%x\n", cmd_size + wfm_size);
-       par->metromem_desc = (struct metromem_desc *) (par->metromem + cmd_size
-                                       + wfm_size + img_size + padding_size);
-       par->metromem_desc_dma = par->metromem_dma + cmd_size + wfm_size
-                                + img_size + padding_size;
 
        /* load the waveform in. assume mode 3, temp 31 for now
                a) request the waveform file from userspace
                b) process waveform and decode into metromem */
        retval = request_firmware(&fw_entry, "metronome.wbf", &dev->dev);
        if (retval < 0) {
-               printk(KERN_ERR "metronomefb: couldn't get waveform\n");
-               goto err_dma_free;
+               dev_err(&dev->dev, "Failed to get waveform\n");
+               goto err_csum_table;
        }
 
-       retval = load_waveform((u8 *) fw_entry->data, fw_entry->size,
-                               par->metromem_wfm, 3, 31, &par->frame_count);
+       retval = load_waveform((u8 *) fw_entry->data, fw_entry->size, 3, 31,
+                               par);
        release_firmware(fw_entry);
        if (retval < 0) {
-               printk(KERN_ERR "metronomefb: couldn't process waveform\n");
-               goto err_dma_free;
+               dev_err(&dev->dev, "Failed processing waveform\n");
+               goto err_csum_table;
        }
 
        if (board->setup_irq(info))
-               goto err_dma_free;
+               goto err_csum_table;
 
        retval = metronome_init_regs(par);
        if (retval < 0)
@@ -688,8 +707,8 @@ static int __devinit metronomefb_probe(struct platform_device *dev)
 
        retval = fb_alloc_cmap(&info->cmap, 8, 0);
        if (retval < 0) {
-               printk(KERN_ERR "Failed to allocate colormap\n");
-               goto err_fb_rel;
+               dev_err(&dev->dev, "Failed to allocate colormap\n");
+               goto err_free_irq;
        }
 
        /* set cmap */
@@ -704,7 +723,7 @@ static int __devinit metronomefb_probe(struct platform_device *dev)
 
        platform_set_drvdata(dev, info);
 
-       printk(KERN_INFO
+       dev_dbg(&dev->dev,
                "fb%d: Metronome frame buffer device, using %dK of video"
                " memory\n", info->node, videomemorysize >> 10);
 
@@ -712,17 +731,15 @@ static int __devinit metronomefb_probe(struct platform_device *dev)
 
 err_cmap:
        fb_dealloc_cmap(&info->cmap);
-err_fb_rel:
-       framebuffer_release(info);
 err_free_irq:
-       board->free_irq(info);
-err_dma_free:
-       dma_free_writecombine(&dev->dev, par->metromemsize, par->metromem,
-                               par->metromem_dma);
+       board->cleanup(par);
 err_csum_table:
        vfree(par->csum_table);
 err_vfree:
        vfree(videomemory);
+err_fb_rel:
+       framebuffer_release(info);
+err:
        module_put(board->owner);
        return retval;
 }
@@ -733,15 +750,15 @@ static int __devexit metronomefb_remove(struct platform_device *dev)
 
        if (info) {
                struct metronomefb_par *par = info->par;
+
+               unregister_framebuffer(info);
                fb_deferred_io_cleanup(info);
-               dma_free_writecombine(&dev->dev, par->metromemsize,
-                                       par->metromem, par->metromem_dma);
                fb_dealloc_cmap(&info->cmap);
+               par->board->cleanup(par);
                vfree(par->csum_table);
-               unregister_framebuffer(info);
                vfree((void __force *)info->screen_base);
-               par->board->free_irq(info);
                module_put(par->board->owner);
+               dev_dbg(&dev->dev, "calling release\n");
                framebuffer_release(info);
        }
        return 0;
@@ -766,6 +783,9 @@ static void __exit metronomefb_exit(void)
        platform_driver_unregister(&metronomefb_driver);
 }
 
+module_param(user_wfm_size, uint, 0);
+MODULE_PARM_DESC(user_wfm_size, "Set custom waveform size");
+
 module_init(metronomefb_init);
 module_exit(metronomefb_exit);
 
index dab04b4..9863f4b 100644 (file)
 #ifndef _LINUX_METRONOMEFB_H_
 #define _LINUX_METRONOMEFB_H_
 
-/* address and control descriptors used by metronome controller */
-struct metromem_desc {
-       u32 mFDADR0;
-       u32 mFSADR0;
-       u32 mFIDR0;
-       u32 mLDCMD0;
-};
-
 /* command structure used by metronome controller */
 struct metromem_cmd {
        u16 opcode;
@@ -29,34 +21,37 @@ struct metromem_cmd {
 
 /* struct used by metronome. board specific stuff comes from *board */
 struct metronomefb_par {
-       unsigned char *metromem;
-       struct metromem_desc *metromem_desc;
        struct metromem_cmd *metromem_cmd;
        unsigned char *metromem_wfm;
        unsigned char *metromem_img;
        u16 *metromem_img_csum;
        u16 *csum_table;
-       int metromemsize;
        dma_addr_t metromem_dma;
-       dma_addr_t metromem_desc_dma;
        struct fb_info *info;
        struct metronome_board *board;
        wait_queue_head_t waitq;
        u8 frame_count;
+       int extra_size;
+       int dt;
 };
 
-/* board specific routines */
+/* board specific routines and data */
 struct metronome_board {
-       struct module *owner;
-       void (*free_irq)(struct fb_info *);
-       void (*init_gpio_regs)(struct metronomefb_par *);
-       void (*init_lcdc_regs)(struct metronomefb_par *);
-       void (*post_dma_setup)(struct metronomefb_par *);
+       struct module *owner; /* the platform device */
        void (*set_rst)(struct metronomefb_par *, int);
        void (*set_stdby)(struct metronomefb_par *, int);
+       void (*cleanup)(struct metronomefb_par *);
        int (*met_wait_event)(struct metronomefb_par *);
        int (*met_wait_event_intr)(struct metronomefb_par *);
        int (*setup_irq)(struct fb_info *);
+       int (*setup_fb)(struct metronomefb_par *);
+       int (*setup_io)(struct metronomefb_par *);
+       int (*get_panel_type)(void);
+       unsigned char *metromem;
+       int fw;
+       int fh;
+       int wfm_size;
+       struct fb_info *host_fbinfo; /* the host LCD controller's fbi */
 };
 
 #endif