Index: linux-2.6.19/arch/arm/configs/pxa255-idp_defconfig =================================================================== --- linux-2.6.19.orig/arch/arm/configs/pxa255-idp_defconfig +++ linux-2.6.19/arch/arm/configs/pxa255-idp_defconfig @@ -1,14 +1,13 @@ # # Automatically generated make config: don't edit -# Linux kernel version: 2.6.12-rc1-bk2 -# Sun Mar 27 22:20:17 2005 +# Linux kernel version: 2.6.13 +# Fri Sep 2 11:36:29 2005 # CONFIG_ARM=y CONFIG_MMU=y CONFIG_UID16=y CONFIG_RWSEM_GENERIC_SPINLOCK=y CONFIG_GENERIC_CALIBRATE_DELAY=y -CONFIG_GENERIC_IOMAP=y # # Code maturity level options @@ -16,6 +15,7 @@ CONFIG_GENERIC_IOMAP=y CONFIG_EXPERIMENTAL=y CONFIG_CLEAN_COMPILE=y CONFIG_BROKEN_ON_SMP=y +CONFIG_INIT_ENV_ARG_LIMIT=32 # # General setup @@ -34,6 +34,8 @@ CONFIG_KOBJECT_UEVENT=y CONFIG_KALLSYMS=y # CONFIG_KALLSYMS_ALL is not set # CONFIG_KALLSYMS_EXTRA_PASS is not set +CONFIG_PRINTK=y +CONFIG_BUG=y CONFIG_BASE_FULL=y CONFIG_FUTEX=y CONFIG_EPOLL=y @@ -50,11 +52,12 @@ CONFIG_BASE_SMALL=0 # Loadable module support # CONFIG_MODULES=y -# CONFIG_MODULE_UNLOAD is not set +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y CONFIG_OBSOLETE_MODPARM=y # CONFIG_MODVERSIONS is not set # CONFIG_MODULE_SRCVERSION_ALL is not set -# CONFIG_KMOD is not set +CONFIG_KMOD=y # # System Type @@ -79,6 +82,7 @@ CONFIG_ARCH_PXA=y # CONFIG_ARCH_VERSATILE is not set # CONFIG_ARCH_IMX is not set # CONFIG_ARCH_H720X is not set +# CONFIG_ARCH_AAEC2000 is not set # # Intel PXA2xx Implementations @@ -98,7 +102,6 @@ CONFIG_CPU_32v5=y CONFIG_CPU_ABRT_EV5T=y CONFIG_CPU_CACHE_VIVT=y CONFIG_CPU_TLB_V4WBI=y -CONFIG_CPU_MINICACHE=y # # Processor Features @@ -109,16 +112,35 @@ CONFIG_XSCALE_PMU=y # # Bus support # +CONFIG_ISA_DMA_API=y # # PCCARD (PCMCIA/CardBus) support # -# CONFIG_PCCARD is not set +CONFIG_PCCARD=y +CONFIG_PCMCIA_DEBUG=y +CONFIG_PCMCIA=y +CONFIG_PCMCIA_LOAD_CIS=y +CONFIG_PCMCIA_IOCTL=y + +# +# PC-card bridges +# +# CONFIG_TCIC is not set +CONFIG_PCMCIA_PXA2XX=y # # Kernel Features # # CONFIG_PREEMPT is not set +# CONFIG_NO_IDLE_HZ is not set +# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set +CONFIG_SELECT_MEMORY_MODEL=y +CONFIG_FLATMEM_MANUAL=y +# CONFIG_DISCONTIGMEM_MANUAL is not set +# CONFIG_SPARSEMEM_MANUAL is not set +CONFIG_FLATMEM=y +CONFIG_FLAT_NODE_MEM_MAP=y CONFIG_LEDS=y CONFIG_LEDS_TIMER=y CONFIG_LEDS_CPU=y @@ -129,7 +151,7 @@ CONFIG_ALIGNMENT_TRAP=y # CONFIG_ZBOOT_ROM_TEXT=0x0 CONFIG_ZBOOT_ROM_BSS=0x0 -CONFIG_CMDLINE="root=/dev/nfs ip=dhcp console=ttyS0,115200 mem=64M" +CONFIG_CMDLINE="root=/dev/mtdblock2 rootfstype=jffs2 console=ttyS0,115200 mtdparts=phys_mapped_flash:256k(boot)ro,0x1C0000(kernel),-(root)" # CONFIG_XIP_KERNEL is not set # @@ -157,6 +179,67 @@ CONFIG_BINFMT_ELF=y # CONFIG_PM is not set # +# Networking +# +CONFIG_NET=y + +# +# Networking options +# +# CONFIG_PACKET is not set +CONFIG_UNIX=y +# CONFIG_NET_KEY is not set +CONFIG_INET=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 is not set +# CONFIG_IP_PNP_RARP is not set +# CONFIG_NET_IPIP is not set +# CONFIG_NET_IPGRE is not set +# CONFIG_ARPD is not set +# CONFIG_SYN_COOKIES is not set +# CONFIG_INET_AH is not set +# CONFIG_INET_ESP is not set +# CONFIG_INET_IPCOMP is not set +# CONFIG_INET_TUNNEL is not set +CONFIG_IP_TCPDIAG=y +# CONFIG_IP_TCPDIAG_IPV6 is not set +# CONFIG_TCP_CONG_ADVANCED is not set +CONFIG_TCP_CONG_BIC=y +# CONFIG_IPV6 is not set +# CONFIG_NETFILTER is not set + +# +# SCTP Configuration (EXPERIMENTAL) +# +# CONFIG_IP_SCTP is not set +# CONFIG_ATM is not set +# CONFIG_BRIDGE is not set +# CONFIG_VLAN_8021Q is not set +# CONFIG_DECNET is not set +# CONFIG_LLC2 is not set +# CONFIG_IPX is not set +# CONFIG_ATALK is not set +# CONFIG_X25 is not set +# CONFIG_LAPB is not set +# CONFIG_NET_DIVERT is not set +# CONFIG_ECONET is not set +# CONFIG_WAN_ROUTER is not set +# CONFIG_NET_SCHED is not set +# CONFIG_NET_CLS_ROUTE is not set + +# +# Network testing +# +# CONFIG_NET_PKTGEN is not set +# CONFIG_HAMRADIO is not set +# CONFIG_IRDA is not set +# CONFIG_BT is not set + +# # Device Drivers # @@ -165,7 +248,7 @@ CONFIG_BINFMT_ELF=y # CONFIG_STANDALONE=y CONFIG_PREVENT_FIRMWARE_BUILD=y -# CONFIG_FW_LOADER is not set +CONFIG_FW_LOADER=y # CONFIG_DEBUG_DRIVER is not set # @@ -176,7 +259,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 is not set +CONFIG_MTD_CMDLINE_PARTS=y # CONFIG_MTD_AFS_PARTS is not set # @@ -209,6 +292,7 @@ CONFIG_MTD_MAP_BANK_WIDTH_4=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 is not set # CONFIG_MTD_CFI_STAA is not set @@ -222,10 +306,14 @@ CONFIG_MTD_CFI_UTIL=y # Mapping drivers for chip access # # CONFIG_MTD_COMPLEX_MAPPINGS is not set -# CONFIG_MTD_PHYSMAP is not set +CONFIG_MTD_PHYSMAP=y +CONFIG_MTD_PHYSMAP_START=0x0000000 +CONFIG_MTD_PHYSMAP_LEN=0x4000000 +CONFIG_MTD_PHYSMAP_BANKWIDTH=4 # CONFIG_MTD_ARM_INTEGRATOR is not set # CONFIG_MTD_EDB7312 is not set # CONFIG_MTD_SHARP_SL is not set +# CONFIG_MTD_PLATRAM is not set # # Self-contained MTD device drivers @@ -260,10 +348,10 @@ CONFIG_MTD_CFI_UTIL=y # # Block devices # -# CONFIG_BLK_DEV_FD is not set # CONFIG_BLK_DEV_COW_COMMON is not set # CONFIG_BLK_DEV_LOOP is not set # CONFIG_BLK_DEV_NBD is not set +# CONFIG_BLK_DEV_UB is not set # CONFIG_BLK_DEV_RAM is not set CONFIG_BLK_DEV_RAM_COUNT=16 CONFIG_INITRAMFS_SOURCE="" @@ -290,9 +378,11 @@ CONFIG_BLK_DEV_IDE=y # CONFIG_BLK_DEV_IDE_SATA is not set CONFIG_BLK_DEV_IDEDISK=y # CONFIG_IDEDISK_MULTI_MODE is not set +# CONFIG_BLK_DEV_IDECS is not set # CONFIG_BLK_DEV_IDECD is not set # CONFIG_BLK_DEV_IDETAPE is not set # CONFIG_BLK_DEV_IDEFLOPPY is not set +# CONFIG_BLK_DEV_IDESCSI is not set # CONFIG_IDE_TASK_IOCTL is not set # @@ -307,89 +397,69 @@ CONFIG_BLK_DEV_IDEDISK=y # # SCSI device support # -# CONFIG_SCSI is not set +CONFIG_SCSI=y +CONFIG_SCSI_PROC_FS=y # -# Multi-device support (RAID and LVM) +# SCSI support type (disk, tape, CD-ROM) # -# CONFIG_MD is not set +# CONFIG_BLK_DEV_SD is not set +# CONFIG_CHR_DEV_ST is not set +# CONFIG_CHR_DEV_OSST is not set +# CONFIG_BLK_DEV_SR is not set +# CONFIG_CHR_DEV_SG is not set +# CONFIG_CHR_DEV_SCH is not set # -# Fusion MPT device support +# Some SCSI devices (e.g. CD jukebox) support multiple LUNs # +# CONFIG_SCSI_MULTI_LUN is not set +# CONFIG_SCSI_CONSTANTS is not set +# CONFIG_SCSI_LOGGING is not set # -# IEEE 1394 (FireWire) support +# SCSI Transport Attributes # +# CONFIG_SCSI_SPI_ATTRS is not set +# CONFIG_SCSI_FC_ATTRS is not set +# CONFIG_SCSI_ISCSI_ATTRS is not set # -# I2O device support +# SCSI low-level drivers # +# CONFIG_SCSI_SATA is not set +# CONFIG_SCSI_DEBUG is not set # -# Networking support +# PCMCIA SCSI adapter support # -CONFIG_NET=y +# CONFIG_PCMCIA_AHA152X is not set +# CONFIG_PCMCIA_FDOMAIN is not set +# CONFIG_PCMCIA_NINJA_SCSI is not set +# CONFIG_PCMCIA_QLOGIC is not set +# CONFIG_PCMCIA_SYM53C500 is not set # -# Networking options +# Multi-device support (RAID and LVM) # -# CONFIG_PACKET is not set -# CONFIG_NETLINK_DEV is not set -CONFIG_UNIX=y -# CONFIG_NET_KEY is not set -CONFIG_INET=y -# CONFIG_IP_MULTICAST is not set -# CONFIG_IP_ADVANCED_ROUTER is not set -CONFIG_IP_PNP=y -CONFIG_IP_PNP_DHCP=y -# CONFIG_IP_PNP_BOOTP is not set -# CONFIG_IP_PNP_RARP is not set -# CONFIG_NET_IPIP is not set -# CONFIG_NET_IPGRE is not set -# CONFIG_ARPD is not set -# CONFIG_SYN_COOKIES is not set -# CONFIG_INET_AH is not set -# CONFIG_INET_ESP is not set -# CONFIG_INET_IPCOMP is not set -# CONFIG_INET_TUNNEL is not set -CONFIG_IP_TCPDIAG=y -# CONFIG_IP_TCPDIAG_IPV6 is not set -# CONFIG_IPV6 is not set -# CONFIG_NETFILTER is not set +# CONFIG_MD is not set # -# SCTP Configuration (EXPERIMENTAL) +# Fusion MPT device support # -# CONFIG_IP_SCTP is not set -# CONFIG_ATM is not set -# CONFIG_BRIDGE is not set -# CONFIG_VLAN_8021Q is not set -# CONFIG_DECNET is not set -# CONFIG_LLC2 is not set -# CONFIG_IPX is not set -# CONFIG_ATALK is not set -# CONFIG_X25 is not set -# CONFIG_LAPB is not set -# CONFIG_NET_DIVERT is not set -# CONFIG_ECONET is not set -# CONFIG_WAN_ROUTER is not set +# CONFIG_FUSION is not set # -# QoS and/or fair queueing +# IEEE 1394 (FireWire) support # -# CONFIG_NET_SCHED is not set -# CONFIG_NET_CLS_ROUTE is not set # -# Network testing +# I2O device support +# + +# +# Network device support # -# CONFIG_NET_PKTGEN is not set -# CONFIG_NETPOLL is not set -# CONFIG_NET_POLL_CONTROLLER is not set -# CONFIG_HAMRADIO is not set -# CONFIG_IRDA is not set -# CONFIG_BT is not set CONFIG_NETDEVICES=y # CONFIG_DUMMY is not set # CONFIG_BONDING is not set @@ -402,6 +472,7 @@ CONFIG_NETDEVICES=y CONFIG_NET_ETHERNET=y CONFIG_MII=y CONFIG_SMC91X=y +# CONFIG_DM9000 is not set # # Ethernet (1000 Mbit) @@ -421,6 +492,11 @@ CONFIG_SMC91X=y # CONFIG_NET_RADIO is not set # +# PCMCIA network device support +# +# CONFIG_NET_PCMCIA is not set + +# # Wan interfaces # # CONFIG_WAN is not set @@ -428,6 +504,8 @@ CONFIG_SMC91X=y # CONFIG_SLIP is not set # CONFIG_SHAPER is not set # CONFIG_NETCONSOLE is not set +# CONFIG_NETPOLL is not set +# CONFIG_NET_POLL_CONTROLLER is not set # # ISDN subsystem @@ -443,7 +521,7 @@ 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 @@ -455,11 +533,12 @@ CONFIG_INPUT_EVDEV=y # 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 # CONFIG_KEYBOARD_NEWTON is not set +CONFIG_KEYBOARD_IDPKBD=y # CONFIG_INPUT_MOUSE is not set # CONFIG_INPUT_JOYSTICK is not set # CONFIG_INPUT_TOUCHSCREEN is not set @@ -470,10 +549,8 @@ CONFIG_KEYBOARD_ATKBD=y # CONFIG_SERIO=y # CONFIG_SERIO_SERPORT is not set -CONFIG_SERIO_LIBPS2=y # CONFIG_SERIO_RAW is not set # CONFIG_GAMEPORT is not set -CONFIG_SOUND_GAMEPORT=y # # Character devices @@ -516,18 +593,28 @@ CONFIG_LEGACY_PTY_COUNT=256 # # Ftape, the floppy tape device driver # -# CONFIG_DRM is not set + +# +# PCMCIA character devices +# +# CONFIG_SYNCLINK_CS is not set # CONFIG_RAW_DRIVER is not set # # TPM devices # -# CONFIG_TCG_TPM is not set # # I2C support # # CONFIG_I2C is not set +# CONFIG_I2C_SENSOR is not set + +# +# Hardware Monitoring support +# +CONFIG_HWMON=y +# CONFIG_HWMON_DEBUG_CHIP is not set # # Misc devices @@ -551,10 +638,12 @@ CONFIG_FB_CFB_FILLRECT=y CONFIG_FB_CFB_COPYAREA=y CONFIG_FB_CFB_IMAGEBLIT=y CONFIG_FB_SOFT_CURSOR=y +# CONFIG_FB_MACMODES is not set # CONFIG_FB_MODE_HELPERS is not set # CONFIG_FB_TILEBLITTING is not set CONFIG_FB_PXA=y # CONFIG_FB_PXA_PARAMETERS is not set +# CONFIG_FB_S1D13XXX is not set # CONFIG_FB_VIRTUAL is not set # @@ -563,15 +652,9 @@ CONFIG_FB_PXA=y # CONFIG_VGA_CONSOLE is not set CONFIG_DUMMY_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE=y -CONFIG_FONTS=y +# CONFIG_FONTS is not set CONFIG_FONT_8x8=y CONFIG_FONT_8x16=y -# CONFIG_FONT_6x11 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 # # Logo configuration @@ -592,7 +675,116 @@ CONFIG_LOGO_LINUX_CLUT224=y # CONFIG_USB_ARCH_HAS_HCD=y # CONFIG_USB_ARCH_HAS_OHCI is not set -# CONFIG_USB is not set +CONFIG_USB=y +CONFIG_USB_DEBUG=y + +# +# Miscellaneous USB options +# +# CONFIG_USB_DEVICEFS is not set +CONFIG_USB_BANDWIDTH=y +# CONFIG_USB_DYNAMIC_MINORS is not set +# CONFIG_USB_OTG is not set + +# +# USB Host Controller Drivers +# +# CONFIG_USB_ISP116X_HCD is not set +# CONFIG_USB_SL811_HCD is not set + +# +# USB Device Class drivers +# +# CONFIG_USB_BLUETOOTH_TTY is not set +# CONFIG_USB_ACM is not set +# CONFIG_USB_PRINTER is not set + +# +# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information +# +CONFIG_USB_STORAGE=y +# CONFIG_USB_STORAGE_DEBUG is not set +# CONFIG_USB_STORAGE_DATAFAB is not set +# CONFIG_USB_STORAGE_FREECOM is not set +# CONFIG_USB_STORAGE_ISD200 is not set +# CONFIG_USB_STORAGE_DPCM is not set +# CONFIG_USB_STORAGE_USBAT is not set +# CONFIG_USB_STORAGE_SDDR09 is not set +# CONFIG_USB_STORAGE_SDDR55 is not set +# CONFIG_USB_STORAGE_JUMPSHOT is not set + +# +# USB Input Devices +# +CONFIG_USB_HID=y +CONFIG_USB_HIDINPUT=y +# CONFIG_HID_FF is not set +# CONFIG_USB_HIDDEV is not set +# CONFIG_USB_AIPTEK is not set +# CONFIG_USB_WACOM is not set +# CONFIG_USB_ACECAD is not set +# CONFIG_USB_KBTAB is not set +# CONFIG_USB_POWERMATE is not set +# CONFIG_USB_MTOUCH is not set +# CONFIG_USB_ITMTOUCH is not set +# CONFIG_USB_EGALAX is not set +# CONFIG_USB_XPAD is not set +# CONFIG_USB_ATI_REMOTE is not set +# CONFIG_USB_KEYSPAN_REMOTE is not set + +# +# USB Imaging devices +# +# CONFIG_USB_MDC800 is not set +# CONFIG_USB_MICROTEK is not set + +# +# USB Multimedia devices +# +# CONFIG_USB_DABUSB is not set + +# +# Video4Linux support is needed for USB Multimedia device support +# + +# +# USB Network Adapters +# +# CONFIG_USB_CATC is not set +# CONFIG_USB_KAWETH is not set +# CONFIG_USB_PEGASUS is not set +# CONFIG_USB_RTL8150 is not set +# CONFIG_USB_USBNET is not set +CONFIG_USB_MON=y + +# +# USB port drivers +# + +# +# USB Serial Converter support +# +# CONFIG_USB_SERIAL is not set + +# +# USB Miscellaneous drivers +# +# CONFIG_USB_EMI62 is not set +# CONFIG_USB_EMI26 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 +# CONFIG_USB_LED is not set +# CONFIG_USB_CYTHERM is not set +# CONFIG_USB_PHIDGETKIT is not set +# CONFIG_USB_PHIDGETSERVO is not set +# CONFIG_USB_IDMOUSE is not set +# CONFIG_USB_LD is not set + +# +# USB DSL modem support +# # # USB Gadget Support @@ -602,17 +794,23 @@ CONFIG_USB_ARCH_HAS_HCD=y # # MMC/SD Card support # -# CONFIG_MMC is not set +CONFIG_MMC=y +CONFIG_MMC_DEBUG=y +CONFIG_MMC_BLOCK=y +CONFIG_MMC_PXA=y +# CONFIG_MMC_WBSD is not set # # File systems # CONFIG_EXT2_FS=y # CONFIG_EXT2_FS_XATTR is not set +# CONFIG_EXT2_FS_XIP is not set # CONFIG_EXT3_FS is not set # CONFIG_JBD is not set # CONFIG_REISERFS_FS is not set # CONFIG_JFS_FS is not set +# CONFIG_FS_POSIX_ACL is not set # # XFS support @@ -620,6 +818,7 @@ CONFIG_EXT2_FS=y # CONFIG_XFS_FS is not set # CONFIG_MINIX_FS is not set # CONFIG_ROMFS_FS is not set +CONFIG_INOTIFY=y # CONFIG_QUOTA is not set CONFIG_DNOTIFY=y # CONFIG_AUTOFS_FS is not set @@ -636,8 +835,9 @@ CONFIG_DNOTIFY=y # CONFIG_FAT_FS=y CONFIG_MSDOS_FS=y -# CONFIG_VFAT_FS is not set +CONFIG_VFAT_FS=y CONFIG_FAT_DEFAULT_CODEPAGE=437 +CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1" # CONFIG_NTFS_FS is not set # @@ -645,7 +845,6 @@ CONFIG_FAT_DEFAULT_CODEPAGE=437 # CONFIG_PROC_FS=y CONFIG_SYSFS=y -# CONFIG_DEVFS_FS is not set # CONFIG_DEVPTS_FS_XATTR is not set # CONFIG_TMPFS is not set # CONFIG_HUGETLB_PAGE is not set @@ -664,8 +863,7 @@ CONFIG_RAMFS=y # CONFIG_JFFS_FS is not set CONFIG_JFFS2_FS=y CONFIG_JFFS2_FS_DEBUG=0 -# CONFIG_JFFS2_FS_NAND is not set -# CONFIG_JFFS2_FS_NOR_ECC is not set +CONFIG_JFFS2_FS_WRITEBUFFER=y # CONFIG_JFFS2_COMPRESSION_OPTIONS is not set CONFIG_JFFS2_ZLIB=y CONFIG_JFFS2_RTIME=y @@ -687,6 +885,7 @@ CONFIG_NFS_FS=y # CONFIG_NFSD is not set CONFIG_ROOT_NFS=y CONFIG_LOCKD=y +CONFIG_NFS_COMMON=y CONFIG_SUNRPC=y # CONFIG_RPCSEC_GSS_KRB5 is not set # CONFIG_RPCSEC_GSS_SPKM3 is not set Index: linux-2.6.19/arch/arm/mach-pxa/Kconfig =================================================================== --- linux-2.6.19.orig/arch/arm/mach-pxa/Kconfig +++ linux-2.6.19/arch/arm/mach-pxa/Kconfig @@ -21,7 +21,7 @@ config MACH_MAINSTONE select IWMMXT config ARCH_PXA_IDP - bool "Accelent Xscale IDP" + bool "DevKitIDP PXA255" select PXA25x config PXA_SHARPSL Index: linux-2.6.19/drivers/input/keyboard/idpkbd.c =================================================================== --- /dev/null +++ linux-2.6.19/drivers/input/keyboard/idpkbd.c @@ -0,0 +1,418 @@ +/* + * DevKitIDP PXA255 matrix keyboard driver + * Copyright (C) 2005 BSQUARE + * David Plentovich + * + * Based on (2.4.x) driver/char/asi_keyboard.c - Cliff Brake + */ + +/* + * 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 + +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include + +//#include +#include +#include + +MODULE_AUTHOR("David Plentovich "); +MODULE_DESCRIPTION("DevKitIDP PXA255 matrix keyboard driver"); +MODULE_LICENSE("GPL"); + + +//NOTE: Platform HW specific settings are defined in include/asm-arm/arch-pxa/idp.h + + +// set to true to use timers to poll keyboard +#define POLL_KEYBOARD 1 + + +// local variables + +#define FN_KEY_SCANCODE 4 //scancode returned when Fn key pressed +#define NUMLOCK_KEY_SCANCODE 10 //scancode returned when NumLock key pressed + +// keyboard matrix 14 columns by 7 rows +static unsigned char idpkbd_keycode[(KEYBD_MATRIX_NUMBER_OUTPUTS * KEYBD_MATRIX_NUMBER_INPUTS)] = { \ + KEY_LEFTALT, KEY_GRAVE, 0, KEY_LEFTCTRL, 0, KEY_ESC, KEY_1, KEY_2, KEY_9, KEY_0, KEY_MINUS, KEY_EQUAL, 0, KEY_BACKSPACE, \ + 0, KEY_BACKSLASH, KEY_LEFTSHIFT, 0, 0, KEY_DELETE, 0, KEY_T, KEY_Y, KEY_U, KEY_I, KEY_ENTER, KEY_RIGHTSHIFT, KEY_DOWN, \ + 0, KEY_TAB, 0, 0, 0, KEY_Q, KEY_W, KEY_E, KEY_R, KEY_O, KEY_P, KEY_LEFTBRACE, 0, KEY_RIGHTBRACE, \ + 0, KEY_Z, 0, 0, 0, KEY_CAPSLOCK, 0, 0, KEY_K, KEY_L, KEY_SEMICOLON, KEY_APOSTROPHE, 0, KEY_UP, \ + 0, KEY_A, 0, 0, 0, KEY_S, KEY_D, KEY_F, KEY_G, KEY_H, KEY_J, KEY_SLASH, 0, KEY_LEFT, \ + 0, KEY_X, 0, 0, 0, KEY_C, KEY_V, KEY_B, KEY_N, KEY_M, KEY_COMMA, KEY_DOT, 0, KEY_SPACE, \ + 0, 0, 0, 0, 0, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, 0, 0, KEY_RIGHT \ +}; + +// function key keyboard matrix 14 columns by 7 rows +//TODO: change Fn key for +/= to be shifted version of KEY_PAUSE (instead of KEY_BACK) +static unsigned char idpkbd_fn_keycode[(KEYBD_MATRIX_NUMBER_OUTPUTS * KEYBD_MATRIX_NUMBER_INPUTS)] = { \ + 0, 0, 0, 0, 0, 0, KEY_F1, KEY_F2, KEY_F9, KEY_F10, 0, KEY_BACK, 0, 0, \ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, KEY_PAGEDOWN, \ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, KEY_PAUSE, 0, KEY_SCROLLLOCK, \ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, KEY_PRINT, KEY_SYSRQ, 0, KEY_PAGEUP, \ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, KEY_HOME, \ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ + 0, 0, 0, 0, 0, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8, 0, 0, KEY_END \ +}; + +//NOTE: NUMLOCK and NumKeypad are not supported; keys are already accessable in other ways. + +int idpkbd_used = 0; +int fn_key_active = 0; + +static struct input_dev * idpkbd_dev; + +static int scaninterval = HZ/60; //rate to scan keyboard +static struct timer_list scan_timer; + + +// Note: these are not hardware dependent masks, they are +// just simple n-bit masks based on the number of ins and outs +// All hardware dependent matrix keyboard stuff is in portable.h +#define KEYBD_MATRIX_INPUT_MASK ((1 << KEYBD_MATRIX_NUMBER_INPUTS)-1) +#define KEYBD_MATRIX_OUTPUT_MASK ((1 << KEYBD_MATRIX_NUMBER_OUTPUTS)-1) + +static __u16 keystate_prev[KEYBD_MATRIX_NUMBER_OUTPUTS]; +static __u16 keystate_test[KEYBD_MATRIX_NUMBER_OUTPUTS]; +static __u16 keystate_cur [KEYBD_MATRIX_NUMBER_OUTPUTS]; +static int keystate_prev_active = 0; //FALSE; +static int keystate_stable_ctr = 0; + + + +/* local function definitions */ +static void setoutput(__u16 columns) +{ + #ifdef KEYBD_MATRIX_INVERT_OUTPUT_LOGIC + KEYBD_MATRIX_SET_OUTPUTS(~columns); + #else + KEYBD_MATRIX_SET_OUTPUTS(columns); + #endif +} + +static __u16 scaninput(void) +{ + __u32 inputs; + + KEYBD_MATRIX_GET_INPUTS(inputs); + + #ifdef KEYBD_MATRIX_INVERT_INPUT_LOGIC + return (__u16)(~inputs & KEYBD_MATRIX_INPUT_MASK); + #else + return (__u16)(inputs & KEYBD_MATRIX_INPUT_MASK); + #endif +} + +static int dokeystatetransition(void) +{ + unsigned char code; + int i, j; + __u16 keystate_xor[KEYBD_MATRIX_NUMBER_OUTPUTS]; + int ret_val = 0; //FALSE; + //int bFoundValidScancode = FALSE; + + /* iterate over columns */ + for (i = 0; i < KEYBD_MATRIX_NUMBER_OUTPUTS; i++) + { + if (keystate_cur[i] != 0) + ret_val = 1; //TRUE; + + keystate_xor[i] = keystate_prev[i] ^ keystate_cur[i]; + if (keystate_xor[i] != 0) + { + /* at least one matrix switch was changed, set backlight activity detect flag */ + //vpDriverGlobals->misc.BacklightActivity = 1; + + /* iterate over rows */ + for (j = 0; j < KEYBD_MATRIX_NUMBER_INPUTS; j++) + { + if (keystate_xor[i] & (1 << j)) + { + code = (j * KEYBD_MATRIX_NUMBER_OUTPUTS) + i; + /* figure out if key is pressed or released and process */ + + // support alt keymap for function keys + if (code == FN_KEY_SCANCODE) + { + fn_key_active = (keystate_cur[i] & (1 << j)) ? 1 : 0; + } + else + { + if (fn_key_active) + { +// printk("matrix %i, key %i, up/down %i\n", code, idpkbd_fn_keycode[code], (keystate_cur[i] & (1 << j)) ? 1 : 0); + input_report_key(idpkbd_dev, idpkbd_fn_keycode[code], (keystate_cur[i] & (1 << j)) ? 1 : 0); + } + else + { +// printk("matrix %i, key %i, up/down %i\n", code, idpkbd_keycode[code], (keystate_cur[i] & (1 << j)) ? 1 : 0); + input_report_key(idpkbd_dev, idpkbd_keycode[code], (keystate_cur[i] & (1 << j)) ? 1 : 0); + } + } + + } + } + input_sync(idpkbd_dev); + } + keystate_prev[i] = keystate_cur[i]; + } + + return ret_val; +} + + +// handles keyboard keypress +#if POLL_KEYBOARD +static void idpkbd_scan_keyboard(unsigned long dummy) +{ + __u16 cs; /* column status */ + int i; +// printk(KERN_INFO "%s:\n", __FUNCTION__); + +#define SCAN_START 0 /* start of scan state machine */ +#define SCAN_GETSTATE 1 /* get keyboard state */ +#define SCAN_STAB 2 /* wait for key to stabalize */ + + /* start of keyboard scanning sequence */ + /* Always start with an all-column scan */ + setoutput( KEYBD_MATRIX_OUTPUT_MASK ); + udelay( KEYBD_MATRIX_SETTLING_TIME_US ); + cs = scaninput(); + +// printk("cs = %x\n", cs); +// printk("keystate_stable_ctr = %d\n", keystate_stable_ctr); +// printk("keystate_pre_active = %d\n", keystate_prev_active); +// printk("\n"); + + /* + * if no keys were down in previous state AND we are + * not in stablizing mode AND the all-column scan + * is 0, then keyboard is idle. + */ + + if ((! keystate_prev_active) && (keystate_stable_ctr == 0) && (cs == 0)) + goto scan_done; + + /* Get the current state of the keyboard */ + if (cs == 0) + { + for (i = 0; i < KEYBD_MATRIX_NUMBER_OUTPUTS; i++) + { + keystate_cur[i] = 0; + } + } + else + { + for (i = 0; i < KEYBD_MATRIX_NUMBER_OUTPUTS; i++) + { + setoutput ( 1 << i ); + udelay(KEYBD_MATRIX_SETTLING_TIME_US); + keystate_cur[i] = scaninput(); + } + } + + /* Handle the stablizing case first */ + if (keystate_stable_ctr > 0) + { + + /* Compare the current state against the test state */ + cs = 1; + for (i = 0; i < KEYBD_MATRIX_NUMBER_OUTPUTS; i++) + { + if (keystate_cur[i] != keystate_test[i]) + { + cs = 0; + break; + } + } + + // Are the states the same ? + if (cs) + { + ++ keystate_stable_ctr; + if (keystate_stable_ctr == KEYBD_MATRIX_KEYSTATE_DEBOUNCE_CONSTANT) + { + keystate_prev_active = dokeystatetransition(); + keystate_stable_ctr = 0; + } + goto scan_done; + } + else + { + keystate_stable_ctr = 0; // Clear stable counter and fall through to next stage + } + } + + // Compare the current state against the previous state + cs = 1; + for (i = 0; i < KEYBD_MATRIX_NUMBER_OUTPUTS; i++) + { + if (keystate_cur[i] != keystate_prev[i]) + { + cs = 0; + break; + } + } + + // If the states are different, begin waiting for stablizing + if (! cs) + { + for (i = 0; i < KEYBD_MATRIX_NUMBER_OUTPUTS; i++) + { + keystate_test[i] = keystate_cur[i]; + } + keystate_stable_ctr = 1; + } + +scan_done: + // reload timer for next scan + mod_timer(&scan_timer, jiffies + scaninterval); +} +#else +static void idpkbd_interrupt(int irq, void *dummy, struct pt_regs *fp) +{ +// printk(KERN_INFO "%s:\n", __FUNCTION__); + + input_report_key(idpkbd_dev, BTN_0, inb(IDPKBD_PORT) & 1); + input_sync(idpkbd_dev); +} +#endif + +//TODO: Verify Events operation +// handles keyboard LED and beep events +int idpkbd_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) +{ +// printk(KERN_INFO "%s:\n", __FUNCTION__); + + if (type == EV_SND && code == SND_BELL) { +//x outb(value, IDPKBD_BELL); + return 0; + } + + if (type == EV_LED) { +// TODO: + return 0; + } + + return -1; +} + +static int idpkbd_open(struct input_dev *dev) +{ +// printk(KERN_INFO "%s:\n", __FUNCTION__); + + if (idpkbd_used++) + return 0; + +#if POLL_KEYBOARD + // start timer to scan matrix keyboard + init_timer(&scan_timer); + scan_timer.function = idpkbd_scan_keyboard; + mod_timer(&scan_timer, jiffies + scaninterval); +#else + if (request_irq(IDPKBD_IRQ, idpkbd_interrupt, 0, "idpkbd", NULL)) { + printk(KERN_ERR "idpkbd.c: Can't allocate irq %d\n", idpkbd_irq); + idpkbd_used--; + return -EBUSY; + } +#endif + + return 0; +} + +static void idpkbd_close(struct input_dev *dev) +{ +// printk(KERN_INFO "%s:\n", __FUNCTION__); + + if (!--idpkbd_used) { +#if POLL_KEYBOARD + // stop timer + del_timer(&scan_timer); +#else + free_irq(IDPKBD_IRQ, idpkbd_interrupt); +#endif + } +} + +static int __init idpkbd_init(void) +{ + int i; +// printk(KERN_INFO "%s:\n", __FUNCTION__); + + idpkbd_dev = input_allocate_device(); + + // fill in driver information + idpkbd_dev->name = "DevKitIDP PXA255 matrix keyboard"; + idpkbd_dev->phys = "idpkdb/input0"; +// idpkbd_dev.id.bustype = BUS_MATRIX; + idpkbd_dev->id.vendor = 0x0001; + idpkbd_dev->id.product = 0x0001; + idpkbd_dev->id.version = 0x0100; + + // fill in function pointers + idpkbd_dev->open = idpkbd_open; + idpkbd_dev->close = idpkbd_close; + idpkbd_dev->event = idpkbd_event; + + // setup available keypresses + idpkbd_dev->evbit[0] = BIT(EV_KEY); +// idpkbd_dev.evbit[0] = BIT(EV_KEY) | BIT(EV_REP); + idpkbd_dev->keycode = idpkbd_keycode; + idpkbd_dev->keycodesize = sizeof(unsigned char); +// idpkbd_dev.keycodemax = ARRAY_SIZE(idpkbd_keycode); + idpkbd_dev->keycodemax = ARRAY_SIZE(idpkbd_keycode) + ARRAY_SIZE(idpkbd_fn_keycode); + + for (i = 0; i < (KEYBD_MATRIX_NUMBER_OUTPUTS * KEYBD_MATRIX_NUMBER_INPUTS); i++) + { + if (idpkbd_keycode[i]) + set_bit(idpkbd_keycode[i], idpkbd_dev->keybit); + if (idpkbd_fn_keycode[i]) + set_bit(idpkbd_fn_keycode[i], idpkbd_dev->keybit); + } + + input_register_device(idpkbd_dev); + + printk(KERN_INFO "input: %s\n", idpkbd_dev->name); + return 0; +} + +static void __exit idpkbd_exit(void) +{ +// printk(KERN_INFO "%s:\n", __FUNCTION__); + + input_unregister_device(idpkbd_dev); +} + +module_init(idpkbd_init); +module_exit(idpkbd_exit); + + Index: linux-2.6.19/drivers/input/keyboard/Kconfig =================================================================== --- linux-2.6.19.orig/drivers/input/keyboard/Kconfig +++ linux-2.6.19/drivers/input/keyboard/Kconfig @@ -203,4 +203,14 @@ config KEYBOARD_OMAP To compile this driver as a module, choose M here: the module will be called omap-keypad. +config KEYBOARD_IDPKBD + tristate "IDP matrix scan keyboard" + depends on ARCH_PXA_IDP && INPUT && INPUT_KEYBOARD + help + Say Y here if you are running Linux on a DevKitIDP PXA255 and want + to use the attached matrix scan keyboard. + + To compile this driver as a module, choose M here: the + module will be called idpkbd. + endif Index: linux-2.6.19/drivers/input/keyboard/Makefile =================================================================== --- linux-2.6.19.orig/drivers/input/keyboard/Makefile +++ linux-2.6.19/drivers/input/keyboard/Makefile @@ -4,6 +4,7 @@ # Each configuration option enables a list of files. +obj-$(CONFIG_KEYBOARD_IDPKBD) += idpkbd.o obj-$(CONFIG_KEYBOARD_ATKBD) += atkbd.o obj-$(CONFIG_KEYBOARD_SUNKBD) += sunkbd.o obj-$(CONFIG_KEYBOARD_LKKBD) += lkkbd.o Index: linux-2.6.19/drivers/pcmcia/Makefile =================================================================== --- linux-2.6.19.orig/drivers/pcmcia/Makefile +++ linux-2.6.19/drivers/pcmcia/Makefile @@ -68,5 +68,6 @@ sa1100_cs-$(CONFIG_SA1100_SIMPAD) += sa pxa2xx_cs-$(CONFIG_ARCH_LUBBOCK) += pxa2xx_lubbock.o sa1111_generic.o pxa2xx_cs-$(CONFIG_MACH_MAINSTONE) += pxa2xx_mainstone.o +pxa2xx_cs-$(CONFIG_ARCH_PXA_IDP) += pxa2xx_idp.o pxa2xx_cs-$(CONFIG_PXA_SHARPSL) += pxa2xx_sharpsl.o Index: linux-2.6.19/drivers/pcmcia/pxa2xx_idp.c =================================================================== --- /dev/null +++ linux-2.6.19/drivers/pcmcia/pxa2xx_idp.c @@ -0,0 +1,392 @@ +/* + * linux/drivers/pcmcia/pxa2xx_idp.c + * + * DevKitIDP PXA255 PCMCIA specific routines. + * Copyright (C) 2005 BSQUARE + * David Plentovich + * + * Based on pxa2xx_mainstone.c - Nicolas Pitre + * Based on (2.4.x) driver/pcmcia/pxa/pxa_idp.c - Jeff Sutherland + * + * 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 +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include + +#include "soc_common.h" + +#define IDP_S0_CD_IRQ PCMCIA_S0_CD_VALID +#define IDP_S1_CD_IRQ PCMCIA_S1_CD_VALID +#define IDP_S0_IRQ PCMCIA_S0_RDYINT +#define IDP_S1_IRQ PCMCIA_S1_RDYINT + +static struct pcmcia_irqs irqs[] = { + { 0, IDP_S0_CD_IRQ, "PCMCIA0 CD" }, + { 1, IDP_S1_CD_IRQ, "PCMCIA1 CD" }, +}; + + +static int idp_pcmcia_hw_init_cnt = 0; + + +static int idp_pcmcia_hw_init(struct soc_pcmcia_socket *skt) +{ + printk("%s: socket %i\n", __FUNCTION__, skt->nr); //dcp + + if (!idp_pcmcia_hw_init_cnt++) + { + /* Set PCMCIA Socket 0 power to standby mode. + * PXA IDP has dedicated CPLD pins for all this stuff :-) + */ + IDP_CPLD_PCCARD_EN = PCC0_ENABLE | PCC1_ENABLE; //both slots disabled, reset NOT active + IDP_CPLD_PCCARD_PWR = 0; //all power to both slots off + + /* + * Setup default state of GPIO outputs + * before we enable them as outputs. + */ + GPSR(GPIO48_nPOE) = + GPIO_bit(GPIO48_nPOE) | + GPIO_bit(GPIO49_nPWE) | + GPIO_bit(GPIO50_nPIOR) | + GPIO_bit(GPIO51_nPIOW) | + GPIO_bit(GPIO52_nPCE_1) | + GPIO_bit(GPIO53_nPCE_2); + + pxa_gpio_mode(GPIO48_nPOE_MD); + pxa_gpio_mode(GPIO49_nPWE_MD); + pxa_gpio_mode(GPIO50_nPIOR_MD); + pxa_gpio_mode(GPIO51_nPIOW_MD); + pxa_gpio_mode(GPIO52_nPCE_1_MD); + pxa_gpio_mode(GPIO53_nPCE_2_MD); + pxa_gpio_mode(GPIO54_pSKTSEL_MD); + pxa_gpio_mode(GPIO55_nPREG_MD); + pxa_gpio_mode(GPIO56_nPWAIT_MD); + pxa_gpio_mode(GPIO57_nIOIS16_MD); + +#if 0 //x + GPDR(IRQ_TO_GPIO_2_80(PCMCIA_S0_CD_VALID)) &= ~GPIO_bit(IRQ_TO_GPIO_2_80(PCMCIA_S0_CD_VALID)); + GPDR(IRQ_TO_GPIO_2_80(PCMCIA_S1_CD_VALID)) &= ~GPIO_bit(IRQ_TO_GPIO_2_80(PCMCIA_S1_CD_VALID)); + + set_GPIO_IRQ_edge(IRQ_TO_GPIO_2_80(PCMCIA_S0_CD_VALID), GPIO_BOTH_EDGES); + set_GPIO_IRQ_edge(IRQ_TO_GPIO_2_80(PCMCIA_S1_CD_VALID), GPIO_BOTH_EDGES); + + //irq's for slots: + GPDR(IRQ_TO_GPIO_2_80(PCMCIA_S0_RDYINT)) &= ~GPIO_bit(IRQ_TO_GPIO_2_80(PCMCIA_S0_RDYINT)); + GPDR(IRQ_TO_GPIO_2_80(PCMCIA_S1_RDYINT)) &= ~GPIO_bit(IRQ_TO_GPIO_2_80(PCMCIA_S1_RDYINT)); + + set_GPIO_IRQ_edge(IRQ_TO_GPIO_2_80(PCMCIA_S0_RDYINT), GPIO_FALLING_EDGE); + set_GPIO_IRQ_edge(IRQ_TO_GPIO_2_80(PCMCIA_S1_RDYINT), GPIO_FALLING_EDGE); +#endif //x + } + +#if 0 //x + return_val = request_irq(PCMCIA_S0_CD_VALID, init->handler, SA_INTERRUPT, "PXA PCMCIA CD0", NULL); + + if (return_val < 0) + return -1; + + return_val += request_irq(PCMCIA_S1_CD_VALID, init->handler, SA_INTERRUPT, "PXA PCMCIA CD1", NULL); + + if (return_val < 0) { + free_irq(PCMCIA_S0_CD_VALID, NULL); + return -1; + } + + return 2; + +#endif //x + skt->irq = (skt->nr == 0) ? IDP_S0_IRQ : IDP_S1_IRQ; + return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs)); +} + +static void idp_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt) +{ +//x free_irq(PCMCIA_S0_CD_VALID, NULL); +//x free_irq(PCMCIA_S1_CD_VALID, NULL); + + printk("%s: socket %i\n", __FUNCTION__, skt->nr); //dcp + + soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs)); + + if (!--idp_pcmcia_hw_init_cnt) + { + IDP_CPLD_PCCARD_EN = 0x03; //disable slots + udelay(200); + IDP_CPLD_PCCARD_PWR = 0; //shut off all power + } +} + +//x static unsigned long idp_pcmcia_status[2]; + +static void idp_pcmcia_socket_state(struct soc_pcmcia_socket *skt, + struct pcmcia_state *state) +{ + unsigned long status; + volatile unsigned long *stat_regs[2] = { &IDP_CPLD_PCCARD0_STATUS, &IDP_CPLD_PCCARD1_STATUS }; +// printk("%s: socket %i\n", __FUNCTION__, skt->nr); //dcp + +//x status = (skt->nr == 0) ? IDP_PCMCIA0 : IDP_PCMCIA1; + status = *stat_regs[skt->nr]; +//x flip = (status ^ idp_pcmcia_status[skt->nr]) & IDP_PCMCiIA_nSTSCHG_BVD1; + +#if 0 //x + /* + * Workaround for STSCHG which can't be deasserted: + * We therefore disable/enable corresponding IRQs + * as needed to avoid IRQ locks. + */ + if (flip) { + idp_pcmcia_status[skt->nr] = status; + if (status & IDP_PCMCIA_nSTSCHG_BVD1) + enable_irq( (skt->nr == 0) ? IDP_S0_STSCHG_IRQ + : IDP_S1_STSCHG_IRQ ); + else + disable_irq( (skt->nr == 0) ? IDP_S0_STSCHG_IRQ + : IDP_S1_STSCHG_IRQ ); + } +#endif //x + +//x state->detect = (status & IDP_PCMCIA_nCD) ? 0 : 1; + state->detect = (PCC_DETECT(skt->nr)) ? 0 : 1; // this one is gpio + state->ready = (status & _PCC_IRQ) ? 1 : 0; + state->bvd1 = (status & PCC_BVD1) ? 1 : 0; + state->bvd2 = (status & PCC_BVD2) ? 1 : 0; + state->wrprot = (status & _PCC_WRPROT) ? 1 : 0; + state->vs_3v = (status & PCC_VS1) ? 0 : 1; + state->vs_Xv = (status & PCC_VS2) ? 0 : 1; + +#if 0 + printk("%s: Sock %u flags: %s%s%s%s%s%s%s\n",__FUNCTION__,skt->nr, + (state->detect) ? "DET " : "", + (state->ready) ? "RDY " : "", + (state->bvd1) ? "BVD1 " : "", + (state->bvd2) ? "BVD2 " : "", + (state->wrprot) ? "WRPROT " : "", + (state->vs_3v) ? "VS_3V " : "", + (state->vs_Xv) ? "VS_XV " : ""); +#endif +} + +static int idp_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, + const socket_state_t *state) +{ + /* The PXA Idp uses the Maxim MAX1602, with the following connections: + * + * Socket 0 (PCMCIA): + * MAX1602 PXA_IDP Register + * Pin Signal IDP_CPLD_PCCARD_PWR: + * ----- ------- ---------------------- + * A0VPP PCC0_PWR0 bit0 + * A1VPP PCC0_PWR1 bit1 + * A0VCC PCC0_PWR2 bit2 + * A1VCC PCC0_PWR3 bit3 + * VX VCC + * VY +3.3V + * 12IN +12V + * CODE +3.3V Cirrus Code, CODE = High (VY) + * + * Socket 1 (PCMCIA): + * MAX1602 PXA_IDP Register + * Pin Signal IDP_CPLD_PCCARD_PWR: + * ----- ------- ---------------------- + * A0VPP PCC1_PWR0 bit4 + * A1VPP PCC1_PWR1 bit5 + * A0VCC PCC1_PWR2 bit6 + * A1VCC PCC1_PWR3 bit7 + * VX VCC + * VY +3.3V + * 12IN +12V + * CODE +3.3V Cirrus Code, CODE = High (VY) + * + */ + + printk("%s: socket %i %i %i\n", __FUNCTION__, skt->nr, state->Vcc, state->Vpp); //dcp + + switch (skt->nr) { + case 0: + switch (state->Vcc) { + case 0: + IDP_CPLD_PCCARD_EN |= PCC0_ENABLE; // disable socket + udelay(200); + IDP_CPLD_PCCARD_PWR &= ~(PCC0_PWR2 | PCC0_PWR3); + break; + + case 33: + IDP_CPLD_PCCARD_PWR &= ~(PCC0_PWR2 | PCC0_PWR3); + IDP_CPLD_PCCARD_PWR |= PCC0_PWR3; + IDP_CPLD_PCCARD_EN &= ~PCC0_ENABLE; //turn it on + break; + + case 50: + IDP_CPLD_PCCARD_PWR &= ~(PCC0_PWR2 | PCC0_PWR3); + IDP_CPLD_PCCARD_PWR |= PCC0_PWR2; + IDP_CPLD_PCCARD_EN &= ~PCC0_ENABLE; + break; + + default: + printk(KERN_ERR "%s(): bad Vcc %u\n", __FUNCTION__, state->Vcc); + return -1; + } + + switch (state->Vpp) { + case 0: + IDP_CPLD_PCCARD_PWR &= ~(PCC0_PWR0 | PCC0_PWR1); + break; + + case 120: + IDP_CPLD_PCCARD_PWR &= ~(PCC0_PWR0 | PCC0_PWR1); + IDP_CPLD_PCCARD_PWR |= PCC0_PWR1; + break; + + default: + if(state->Vpp == state->Vcc) { + IDP_CPLD_PCCARD_PWR = (IDP_CPLD_PCCARD_PWR & ~(PCC0_PWR0 | PCC0_PWR1)) | PCC0_PWR0; + } + else { + printk(KERN_ERR "%s(): bad Vpp %u\n", __FUNCTION__, state->Vpp); + return -1; + } + } + + if (state->flags & SS_RESET) { + IDP_CPLD_PCCARD_EN = (IDP_CPLD_PCCARD_EN | PCC0_RESET); + printk("RESET\n"); + } + else + IDP_CPLD_PCCARD_EN = (IDP_CPLD_PCCARD_EN & ~PCC0_RESET); + + break; + + case 1: + switch (state->Vcc) { + case 0: + IDP_CPLD_PCCARD_EN |= PCC1_ENABLE; // disable socket + udelay(200); + IDP_CPLD_PCCARD_PWR &= ~(PCC1_PWR2 | PCC1_PWR3); + break; + + case 33: + IDP_CPLD_PCCARD_PWR &= ~(PCC1_PWR2 | PCC1_PWR3); + IDP_CPLD_PCCARD_PWR |= PCC1_PWR3; + IDP_CPLD_PCCARD_EN &= ~PCC1_ENABLE; //turn it on + break; + + case 50: + IDP_CPLD_PCCARD_PWR &= ~(PCC1_PWR2 | PCC1_PWR3); + IDP_CPLD_PCCARD_PWR |= PCC1_PWR2; + IDP_CPLD_PCCARD_EN &= ~PCC1_ENABLE; + break; + + default: + printk(KERN_ERR "%s(): bad Vcc %u\n", __FUNCTION__, state->Vcc); + return -1; + } + + switch (state->Vpp) { + case 0: + IDP_CPLD_PCCARD_PWR &= ~(PCC1_PWR0 | PCC1_PWR1); + break; + + case 120: + IDP_CPLD_PCCARD_PWR &= ~(PCC1_PWR0 | PCC1_PWR1); + IDP_CPLD_PCCARD_PWR |= PCC1_PWR1; + break; + + default: + if(state->Vpp == state->Vcc) { + IDP_CPLD_PCCARD_PWR = (IDP_CPLD_PCCARD_PWR & ~(PCC1_PWR0 | PCC1_PWR1)) | PCC1_PWR0; + } + else { + printk(KERN_ERR "%s(): bad Vpp %u\n", __FUNCTION__, state->Vpp); + return -1; + } + } + + if (state->flags & SS_RESET) { + IDP_CPLD_PCCARD_EN = (IDP_CPLD_PCCARD_EN | PCC1_RESET); + printk("RESET\n"); + } + else + IDP_CPLD_PCCARD_EN = (IDP_CPLD_PCCARD_EN & ~PCC1_RESET); + + break; + } + return 0; +} + +static void idp_pcmcia_socket_init(struct soc_pcmcia_socket *skt) +{ + printk("%s: socket %i\n", __FUNCTION__, skt->nr); //dcp +} + +static void idp_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt) +{ + printk("%s: socket %i\n", __FUNCTION__, skt->nr); //dcp +} + +static struct pcmcia_low_level idp_pcmcia_ops = { + .owner = THIS_MODULE, + .hw_init = idp_pcmcia_hw_init, + .hw_shutdown = idp_pcmcia_hw_shutdown, + .socket_state = idp_pcmcia_socket_state, + .configure_socket = idp_pcmcia_configure_socket, + .socket_init = idp_pcmcia_socket_init, + .socket_suspend = idp_pcmcia_socket_suspend, + .nr = 2, +}; + +static struct platform_device *idp_pcmcia_device; + +static int __init idp_pcmcia_init(void) +{ + int ret; + printk("%s\n", __FUNCTION__); //dcp + + idp_pcmcia_device = platform_device_alloc("pxa2xx-pcmcia", -1); + if (!idp_pcmcia_device) + return -ENOMEM; + memset(idp_pcmcia_device, 0, sizeof(*idp_pcmcia_device)); + idp_pcmcia_device->name = "pxa2xx-pcmcia"; + idp_pcmcia_device->dev.platform_data = &idp_pcmcia_ops; + + ret = platform_device_register(idp_pcmcia_device); + if (ret) + kfree(idp_pcmcia_device); + + return ret; +} + +static void __exit idp_pcmcia_exit(void) +{ + printk("%s\n", __FUNCTION__); //dcp + /* + * This call is supposed to free our idp_pcmcia_device. + * Unfortunately platform_device don't have a free method, and + * we can't assume it's free of any reference at this point so we + * can't free it either. + */ + platform_device_unregister(idp_pcmcia_device); +} + +module_init(idp_pcmcia_init); +module_exit(idp_pcmcia_exit); + +MODULE_LICENSE("GPL"); Index: linux-2.6.19/include/asm-arm/arch-pxa/idp.h =================================================================== --- linux-2.6.19.orig/include/asm-arm/arch-pxa/idp.h +++ linux-2.6.19/include/asm-arm/arch-pxa/idp.h @@ -179,15 +179,15 @@ #define KEYBD_MATRIX_NUMBER_INPUTS 7 #define KEYBD_MATRIX_NUMBER_OUTPUTS 14 -#define KEYBD_MATRIX_INVERT_OUTPUT_LOGIC FALSE -#define KEYBD_MATRIX_INVERT_INPUT_LOGIC FALSE +#undef KEYBD_MATRIX_INVERT_OUTPUT_LOGIC +#undef KEYBD_MATRIX_INVERT_INPUT_LOGIC -#define KEYBD_MATRIX_SETTLING_TIME_US 100 +#define KEYBD_MATRIX_SETTLING_TIME_US 40 #define KEYBD_MATRIX_KEYSTATE_DEBOUNCE_CONSTANT 2 #define KEYBD_MATRIX_SET_OUTPUTS(outputs) \ {\ - IDP_CPLD_KB_COL_LOW = outputs;\ + IDP_CPLD_KB_COL_LOW = outputs & 0x7f;\ IDP_CPLD_KB_COL_HIGH = outputs >> 7;\ }