Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
1c23361e
Commit
1c23361e
authored
Jan 19, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://bk.arm.linux.org.uk/linux-2.6-rmk
into home.osdl.org:/home/torvalds/v2.5/linux
parents
d00ea9a1
b7c5d0b8
Changes
19
Hide whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
3107 additions
and
2099 deletions
+3107
-2099
Documentation/arm/SA1100/CERF
Documentation/arm/SA1100/CERF
+7
-15
arch/arm/configs/cerfpda_defconfig
arch/arm/configs/cerfpda_defconfig
+0
-967
arch/arm/configs/cerfpod_defconfig
arch/arm/configs/cerfpod_defconfig
+0
-894
arch/arm/kernel/setup.c
arch/arm/kernel/setup.c
+12
-0
arch/arm/lib/memcpy.S
arch/arm/lib/memcpy.S
+3
-3
arch/arm/mach-pxa/generic.c
arch/arm/mach-pxa/generic.c
+78
-0
arch/arm/mach-pxa/idp.c
arch/arm/mach-pxa/idp.c
+2
-4
arch/arm/mach-pxa/lubbock.c
arch/arm/mach-pxa/lubbock.c
+15
-4
arch/arm/mach-sa1100/Kconfig
arch/arm/mach-sa1100/Kconfig
+2
-11
arch/arm/mach-sa1100/leds-cerf.c
arch/arm/mach-sa1100/leds-cerf.c
+0
-12
arch/arm/mm/proc-arm720.S
arch/arm/mm/proc-arm720.S
+36
-0
drivers/usb/gadget/pxa2xx_udc.c
drivers/usb/gadget/pxa2xx_udc.c
+2515
-0
drivers/usb/gadget/pxa2xx_udc.h
drivers/usb/gadget/pxa2xx_udc.h
+311
-0
drivers/video/Kconfig
drivers/video/Kconfig
+0
-23
drivers/video/console/font_acorn_8x8.c
drivers/video/console/font_acorn_8x8.c
+103
-103
drivers/video/sa1100fb.c
drivers/video/sa1100fb.c
+0
-57
include/asm-arm/arch-pxa/udc.h
include/asm-arm/arch-pxa/udc.h
+18
-0
include/asm-arm/arch-sa1100/keyboard.h
include/asm-arm/arch-sa1100/keyboard.h
+0
-5
include/asm-arm/mach/arch.h
include/asm-arm/mach/arch.h
+5
-1
No files found.
Documentation/arm/SA1100/CERF
View file @
1c23361e
*** The StrongARM version of the CerfBoard/Cube has been discontinued ***
The Intrinsyc CerfBoard is a StrongARM 1110-based computer on a board
The Intrinsyc CerfBoard is a StrongARM 1110-based computer on a board
that measures approximately 2" square. It includes an Ethernet
that measures approximately 2" square. It includes an Ethernet
controller, an RS232-compatible serial port, a USB function port, and
controller, an RS232-compatible serial port, a USB function port, and
...
@@ -5,7 +7,7 @@ one CompactFlash+ slot on the back. Pictures can be found at the
...
@@ -5,7 +7,7 @@ one CompactFlash+ slot on the back. Pictures can be found at the
Intrinsyc website, http://www.intrinsyc.com.
Intrinsyc website, http://www.intrinsyc.com.
This document describes the support in the Linux kernel for the
This document describes the support in the Linux kernel for the
Intrinsyc CerfBoard
as of version 2.4.0-test4-np1
.
Intrinsyc CerfBoard.
Supported in this version:
Supported in this version:
- CompactFlash+ slot (select PCMCIA in General Setup and any options
- CompactFlash+ slot (select PCMCIA in General Setup and any options
...
@@ -14,24 +16,14 @@ Supported in this version:
...
@@ -14,24 +16,14 @@ Supported in this version:
Network Devices)
Network Devices)
- Serial ports with a serial console (hardcoded to 38400 8N1)
- Serial ports with a serial console (hardcoded to 38400 8N1)
Not supported in this version (yet):
- LCD driver/touchscreen interface
- UDC (a driver exists right now, but is unstable and slow and only
works with the Linux USB)
In order to get this kernel onto your Cerf, you need a server that runs
In order to get this kernel onto your Cerf, you need a server that runs
both BOOTP and TFTP. Detailed instructions should have come with your
both BOOTP and TFTP. Detailed instructions should have come with your
evaluation kit on how to use the bootloader. This series of commands
evaluation kit on how to use the bootloader. This series of commands
will suffice:
will suffice:
make
cerf_
config
make
ARCH=arm CROSS_COMPILE=arm-linux- cerfcube_def
config
make
xconfig
make
ARCH=arm CROSS_COMPILE=arm-linux- zImage
make
zImage
make
ARCH=arm CROSS_COMPILE=arm-linux- modules
cp arch/arm/boot/zImage <TFTP directory>
cp arch/arm/boot/zImage <TFTP directory>
The default config uses a 4MB RAM disk located at 0xc0500000 as root.
support@intrinsyc.com
Setting the board to mount root from a NFS partition works, too.
I-Gene Leong, Intrinsyc Software Inc.
ileong@intrinsyc.com
arch/arm/configs/cerfpda_defconfig
deleted
100644 → 0
View file @
d00ea9a1
#
# Automatically generated make config: don't edit
#
CONFIG_ARM=y
# CONFIG_EISA is not set
# CONFIG_SBUS is not set
# CONFIG_MCA is not set
CONFIG_UID16=y
CONFIG_RWSEM_GENERIC_SPINLOCK=y
# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
#
# Code maturity level options
#
CONFIG_EXPERIMENTAL=y
# CONFIG_OBSOLETE is not set
#
# Loadable module support
#
CONFIG_MODULES=y
# CONFIG_MODVERSIONS is not set
# CONFIG_KMOD is not set
#
# System Type
#
# CONFIG_ARCH_ANAKIN is not set
# CONFIG_ARCH_ARCA5K is not set
# CONFIG_ARCH_CLPS7500 is not set
# CONFIG_ARCH_CLPS711X is not set
# CONFIG_ARCH_CO285 is not set
# CONFIG_ARCH_EBSA110 is not set
# CONFIG_ARCH_FOOTBRIDGE is not set
# CONFIG_ARCH_INTEGRATOR is not set
# CONFIG_ARCH_L7200 is not set
# CONFIG_ARCH_RPC is not set
CONFIG_ARCH_SA1100=y
# CONFIG_ARCH_SHARK is not set
#
# Archimedes/A5000 Implementations
#
#
# Archimedes/A5000 Implementations (select only ONE)
#
# CONFIG_ARCH_ARC is not set
# CONFIG_ARCH_A5K is not set
#
# Footbridge Implementations
#
# CONFIG_ARCH_CATS is not set
# CONFIG_ARCH_PERSONAL_SERVER is not set
# CONFIG_ARCH_EBSA285_ADDIN is not set
# CONFIG_ARCH_EBSA285_HOST is not set
# CONFIG_ARCH_NETWINDER is not set
#
# SA11x0 Implementations
#
# CONFIG_SA1100_ASSABET is not set
# CONFIG_ASSABET_NEPONSET is not set
# CONFIG_SA1100_ADSBITSY is not set
# CONFIG_SA1100_BRUTUS is not set
CONFIG_SA1100_CERF=y
# CONFIG_SA1100_CERF_FLASH_8MB is not set
# CONFIG_SA1100_CERF_FLASH_16MB is not set
CONFIG_SA1100_CERF_FLASH_32MB=y
CONFIG_SA1100_CERF_CPLD=y
# CONFIG_SA1100_H3600 is not set
# CONFIG_SA1100_EXTENEX1 is not set
# CONFIG_SA1100_FLEXANET is not set
# CONFIG_SA1100_FREEBIRD is not set
# CONFIG_SA1100_GRAPHICSCLIENT is not set
# CONFIG_SA1100_GRAPHICSMASTER is not set
# CONFIG_SA1100_JORNADA720 is not set
# CONFIG_SA1100_HUW_WEBPANEL is not set
# CONFIG_SA1100_ITSY is not set
# CONFIG_SA1100_LART is not set
# CONFIG_SA1100_NANOENGINE is not set
# CONFIG_SA1100_OMNIMETER is not set
# CONFIG_SA1100_PANGOLIN is not set
# CONFIG_SA1100_PLEB is not set
# CONFIG_SA1100_SHERMAN is not set
# CONFIG_SA1100_SIMPAD is not set
# CONFIG_SA1100_PFS168 is not set
# CONFIG_SA1100_VICTOR is not set
# CONFIG_SA1100_XP860 is not set
# CONFIG_SA1100_YOPY is not set
CONFIG_SA1100_USB=y
CONFIG_SA1100_USB_NETLINK=y
CONFIG_SA1100_USB_CHAR=y
#
# CLPS711X/EP721X Implementations
#
# CONFIG_ARCH_CDB89712 is not set
# CONFIG_ARCH_CLEP7312 is not set
# CONFIG_ARCH_EDB7211 is not set
# CONFIG_ARCH_P720T is not set
# CONFIG_ARCH_EP7211 is not set
# CONFIG_ARCH_EP7212 is not set
# CONFIG_ARCH_ACORN is not set
# CONFIG_FOOTBRIDGE is not set
# CONFIG_FOOTBRIDGE_HOST is not set
# CONFIG_FOOTBRIDGE_ADDIN is not set
CONFIG_CPU_32=y
# CONFIG_CPU_26 is not set
#
# Processor Type
#
# CONFIG_CPU_32v3 is not set
CONFIG_CPU_32v4=y
# CONFIG_CPU_ARM610 is not set
# CONFIG_CPU_ARM710 is not set
# CONFIG_CPU_ARM720T is not set
# CONFIG_CPU_ARM920T is not set
# CONFIG_CPU_ARM1020 is not set
# CONFIG_CPU_SA110 is not set
CONFIG_CPU_SA1100=y
# CONFIG_ARM_THUMB is not set
CONFIG_DISCONTIGMEM=y
#
# General setup
#
# CONFIG_PCI is not set
# CONFIG_ISA is not set
# CONFIG_ISA_DMA is not set
CONFIG_CPU_FREQ=y
CONFIG_HOTPLUG=y
#
# PCMCIA/CardBus support
#
CONFIG_PCMCIA=y
# CONFIG_I82365 is not set
# CONFIG_TCIC is not set
# CONFIG_PCMCIA_CLPS6700 is not set
CONFIG_PCMCIA_SA1100=y
CONFIG_NET=y
CONFIG_SYSVIPC=y
CONFIG_BSD_PROCESS_ACCT=y
CONFIG_SYSCTL=y
#
# At least one math emulation must be selected
#
CONFIG_FPE_NWFPE=y
# CONFIG_FPE_FASTFPE is not set
CONFIG_KCORE_ELF=y
# CONFIG_KCORE_AOUT is not set
# CONFIG_BINFMT_AOUT is not set
CONFIG_BINFMT_ELF=y
# CONFIG_BINFMT_MISC is not set
# CONFIG_PM is not set
# CONFIG_APM is not set
# CONFIG_ARTHUR is not set
CONFIG_CMDLINE="console=ttySA0 cpufreq_max=221200 root=/dev/mtdblock3 rw mem=64M"
# CONFIG_PFS168_CMDLINE is not set
# CONFIG_LEDS is not set
CONFIG_ALIGNMENT_TRAP=y
#
# Parallel port support
#
# CONFIG_PARPORT is not set
#
# Memory Technology Devices (MTD)
#
CONFIG_MTD=y
# CONFIG_MTD_DEBUG is not set
CONFIG_MTD_PARTITIONS=y
# CONFIG_MTD_REDBOOT_PARTS is not set
# CONFIG_MTD_BOOTLDR_PARTS is not set
# CONFIG_MTD_AFS_PARTS is not set
#
# User Modules And Translation Layers
#
CONFIG_MTD_CHAR=y
CONFIG_MTD_BLOCK=y
# CONFIG_FTL is not set
# CONFIG_NFTL is not set
#
# RAM/ROM/Flash chip drivers
#
CONFIG_MTD_CFI=y
# CONFIG_MTD_JEDECPROBE is not set
CONFIG_MTD_GEN_PROBE=y
CONFIG_MTD_CFI_ADV_OPTIONS=y
CONFIG_MTD_CFI_NOSWAP=y
# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
CONFIG_MTD_CFI_GEOMETRY=y
# CONFIG_MTD_CFI_B1 is not set
# CONFIG_MTD_CFI_B2 is not set
CONFIG_MTD_CFI_B4=y
# CONFIG_MTD_CFI_I1 is not set
CONFIG_MTD_CFI_I2=y
# CONFIG_MTD_CFI_I4 is not set
CONFIG_MTD_CFI_INTELEXT=y
# CONFIG_MTD_CFI_AMDSTD is not set
# CONFIG_MTD_RAM is not set
# CONFIG_MTD_ROM is not set
# CONFIG_MTD_ABSENT is not set
# CONFIG_MTD_OBSOLETE_CHIPS is not set
#
# Mapping drivers for chip access
#
# CONFIG_MTD_PHYSMAP is not set
# CONFIG_MTD_SUN_UFLASH is not set
# CONFIG_MTD_NORA is not set
# CONFIG_MTD_PNC2000 is not set
# CONFIG_MTD_RPXLITE is not set
# CONFIG_MTD_TQM8XXL is not set
# CONFIG_MTD_SC520CDP is not set
# CONFIG_MTD_NETSC520 is not set
# CONFIG_MTD_SBC_GXX is not set
# CONFIG_MTD_ELAN_104NC is not set
# CONFIG_MTD_DBOX2 is not set
# CONFIG_MTD_CSTM_MIPS_IXX is not set
# CONFIG_MTD_CFI_FLAGADM is not set
# CONFIG_MTD_SOLUTIONENGINE is not set
# CONFIG_MTD_MIXMEM is not set
# CONFIG_MTD_OCTAGON is not set
# CONFIG_MTD_VMAX is not set
# CONFIG_MTD_OCELOT is not set
# CONFIG_MTD_L440GX is not set
# CONFIG_MTD_ARM_INTEGRATOR is not set
# CONFIG_MTD_CDB89712 is not set
CONFIG_MTD_SA1100=y
# CONFIG_MTD_DC21285 is not set
# CONFIG_MTD_IQ80310 is not set
#
# Self-contained MTD device drivers
#
# CONFIG_MTD_PMC551 is not set
# CONFIG_MTD_SLRAM is not set
# CONFIG_MTD_LART is not set
# CONFIG_MTD_MTDRAM is not set
# CONFIG_MTD_BLKMTD is not set
#
# Disk-On-Chip Device Drivers
#
# CONFIG_MTD_DOC1000 is not set
# CONFIG_MTD_DOC2000 is not set
# CONFIG_MTD_DOC2001 is not set
# CONFIG_MTD_DOCPROBE is not set
#
# NAND Flash Device Drivers
#
# CONFIG_MTD_NAND is not set
#
# Plug and Play configuration
#
# CONFIG_PNP is not set
# CONFIG_ISAPNP is not set
# CONFIG_PNPBIOS is not set
#
# Block devices
#
# CONFIG_BLK_DEV_FD is not set
# CONFIG_BLK_DEV_XD is not set
# CONFIG_PARIDE is not set
# CONFIG_BLK_CPQ_DA is not set
# CONFIG_BLK_CPQ_CISS_DA is not set
# CONFIG_BLK_DEV_DAC960 is not set
CONFIG_BLK_DEV_LOOP=y
# CONFIG_BLK_DEV_NBD is not set
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_SIZE=4096
CONFIG_BLK_DEV_INITRD=y
#
# Multi-device support (RAID and LVM)
#
# CONFIG_MD is not set
# CONFIG_BLK_DEV_MD is not set
# CONFIG_MD_LINEAR is not set
# CONFIG_MD_RAID0 is not set
# CONFIG_MD_RAID1 is not set
# CONFIG_MD_RAID5 is not set
# CONFIG_BLK_DEV_LVM is not set
#
# Networking options
#
CONFIG_PACKET=y
CONFIG_PACKET_MMAP=y
CONFIG_NETLINK=y
CONFIG_RTNETLINK=y
# CONFIG_NETLINK_DEV is not set
# CONFIG_NETFILTER is not set
CONFIG_FILTER=y
CONFIG_UNIX=y
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
# CONFIG_IP_ADVANCED_ROUTER is not set
# CONFIG_IP_PNP is not set
# CONFIG_NET_IPIP is not set
# CONFIG_NET_IPGRE is not set
# CONFIG_IP_MROUTE is not set
# CONFIG_ARPD is not set
# CONFIG_INET_ECN is not set
# CONFIG_SYN_COOKIES is not set
# CONFIG_IPV6 is not set
# CONFIG_KHTTPD is not set
# CONFIG_ATM is not set
#
#
#
# CONFIG_IPX is not set
# CONFIG_ATALK is not set
# CONFIG_DECNET is not set
# CONFIG_BRIDGE is not set
# CONFIG_X25 is not set
# CONFIG_LAPB is not set
# CONFIG_LLC is not set
# CONFIG_NET_DIVERT is not set
# CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set
# CONFIG_NET_FASTROUTE is not set
# CONFIG_NET_HW_FLOWCONTROL is not set
#
# QoS and/or fair queueing
#
# CONFIG_NET_SCHED is not set
#
# Network device support
#
CONFIG_NETDEVICES=y
#
# ARCnet devices
#
# CONFIG_ARCNET is not set
# CONFIG_DUMMY is not set
# CONFIG_BONDING is not set
# CONFIG_EQUALIZER is not set
# CONFIG_TUN is not set
# CONFIG_ETHERTAP is not set
#
# Ethernet (10 or 100Mbit)
#
CONFIG_NET_ETHERNET=y
# CONFIG_SUNLANCE is not set
# CONFIG_SUNBMAC is not set
# CONFIG_SUNQE is not set
# CONFIG_SUNLANCE is not set
# CONFIG_SUNGEM is not set
CONFIG_NET_VENDOR_3COM=y
# CONFIG_EL1 is not set
# CONFIG_EL2 is not set
# CONFIG_ELPLUS is not set
# CONFIG_EL16 is not set
# CONFIG_ELMC is not set
# CONFIG_ELMC_II is not set
CONFIG_CERF_CS8900A=y
# CONFIG_LANCE is not set
# CONFIG_NET_VENDOR_SMC is not set
# CONFIG_NET_VENDOR_RACAL is not set
# CONFIG_NET_ISA is not set
# CONFIG_NET_PCI is not set
# CONFIG_NET_POCKET is not set
#
# Ethernet (1000 Mbit)
#
# CONFIG_ACENIC is not set
# CONFIG_DL2K is not set
# CONFIG_MYRI_SBUS is not set
# CONFIG_NS83820 is not set
# CONFIG_HAMACHI is not set
# CONFIG_YELLOWFIN is not set
# CONFIG_SK98LIN is not set
# CONFIG_FDDI is not set
# CONFIG_HIPPI is not set
# CONFIG_PLIP is not set
# CONFIG_PPP is not set
# CONFIG_SLIP is not set
#
# Wireless LAN (non-hamradio)
#
CONFIG_NET_RADIO=y
CONFIG_STRIP=m
CONFIG_WAVELAN=m
CONFIG_ARLAN=m
CONFIG_AIRONET4500=m
CONFIG_AIRONET4500_NONCS=m
# CONFIG_AIRONET4500_PNP is not set
# CONFIG_AIRONET4500_PCI is not set
# CONFIG_AIRONET4500_ISA is not set
# CONFIG_AIRONET4500_I365 is not set
CONFIG_AIRONET4500_PROC=m
#
# Wireless Pcmcia cards support
#
CONFIG_PCMCIA_HERMES=m
CONFIG_AIRO_CS=m
CONFIG_NET_WIRELESS=y
#
# Token Ring devices
#
# CONFIG_TR is not set
# CONFIG_NET_FC is not set
# CONFIG_RCPCI is not set
# CONFIG_SHAPER is not set
#
# Wan interfaces
#
# CONFIG_WAN is not set
#
# PCMCIA network device support
#
CONFIG_NET_PCMCIA=y
CONFIG_PCMCIA_3C589=m
CONFIG_PCMCIA_3C574=m
CONFIG_PCMCIA_FMVJ18X=m
CONFIG_PCMCIA_PCNET=m
CONFIG_PCMCIA_NMCLAN=m
CONFIG_PCMCIA_SMC91C92=m
CONFIG_PCMCIA_XIRC2PS=m
# CONFIG_ARCNET_COM20020_CS is not set
# CONFIG_PCMCIA_IBMTR is not set
CONFIG_NET_PCMCIA_RADIO=y
CONFIG_PCMCIA_RAYCS=m
CONFIG_PCMCIA_NETWAVE=m
CONFIG_PCMCIA_WAVELAN=m
CONFIG_AIRONET4500_CS=m
#
# Amateur Radio support
#
# CONFIG_HAMRADIO is not set
#
# IrDA (infrared) support
#
# CONFIG_IRDA is not set
#
# ATA/IDE/MFM/RLL support
#
CONFIG_IDE=y
#
# IDE, ATA and ATAPI Block devices
#
CONFIG_BLK_DEV_IDE=y
#
# Please see Documentation/ide.txt for help/info on IDE drives
#
# CONFIG_BLK_DEV_HD_IDE is not set
# CONFIG_BLK_DEV_HD is not set
CONFIG_BLK_DEV_IDEDISK=y
# CONFIG_IDEDISK_MULTI_MODE is not set
CONFIG_BLK_DEV_IDECS=m
# CONFIG_BLK_DEV_IDECD is not set
# CONFIG_BLK_DEV_IDETAPE is not set
# CONFIG_BLK_DEV_IDEFLOPPY is not set
# CONFIG_BLK_DEV_IDESCSI is not set
#
# IDE chipset support/bugfixes
#
# CONFIG_BLK_DEV_CMD640 is not set
# CONFIG_BLK_DEV_CMD640_ENHANCED is not set
# CONFIG_BLK_DEV_ISAPNP is not set
# CONFIG_IDE_CHIPSETS is not set
# CONFIG_IDEDMA_AUTO is not set
# CONFIG_BLK_DEV_ATARAID is not set
# CONFIG_BLK_DEV_ATARAID_PDC is not set
# CONFIG_BLK_DEV_ATARAID_HPT is not set
#
# SCSI support
#
# CONFIG_SCSI is not set
#
# I2O device support
#
# CONFIG_I2O is not set
# CONFIG_I2O_BLOCK is not set
# CONFIG_I2O_LAN is not set
# CONFIG_I2O_SCSI is not set
# CONFIG_I2O_PROC is not set
#
# ISDN subsystem
#
# CONFIG_ISDN is not set
#
# Input core support
#
# CONFIG_INPUT is not set
# CONFIG_INPUT_KEYBDEV is not set
# CONFIG_INPUT_MOUSEDEV is not set
# CONFIG_INPUT_JOYDEV is not set
# CONFIG_INPUT_EVDEV is not set
#
# Character devices
#
CONFIG_VT=y
CONFIG_VT_CONSOLE=y
# CONFIG_SERIAL is not set
# CONFIG_SERIAL_EXTENDED is not set
# CONFIG_SERIAL_NONSTANDARD is not set
#
# Serial drivers
#
# CONFIG_SERIAL_ANAKIN is not set
# CONFIG_SERIAL_ANAKIN_CONSOLE is not set
# CONFIG_SERIAL_AMBA is not set
# CONFIG_SERIAL_AMBA_CONSOLE is not set
# CONFIG_SERIAL_CLPS711X is not set
# CONFIG_SERIAL_CLPS711X_CONSOLE is not set
# CONFIG_SERIAL_21285 is not set
# CONFIG_SERIAL_21285_OLD is not set
# CONFIG_SERIAL_21285_CONSOLE is not set
CONFIG_SERIAL_SA1100=y
CONFIG_SERIAL_SA1100_CONSOLE=y
CONFIG_SA1100_DEFAULT_BAUDRATE=38400
CONFIG_SERIAL_8250=y
# CONFIG_SERIAL_8250_CONSOLE is not set
# CONFIG_SERIAL_8250_EXTENDED is not set
# CONFIG_SERIAL_8250_MANY_PORTS is not set
# CONFIG_SERIAL_8250_SHARE_IRQ is not set
# CONFIG_SERIAL_8250_DETECT_IRQ is not set
# CONFIG_SERIAL_8250_MULTIPORT is not set
# CONFIG_SERIAL_8250_HUB6 is not set
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y
CONFIG_UNIX98_PTYS=y
CONFIG_UNIX98_PTY_COUNT=32
CONFIG_UCB1200=y
CONFIG_TOUCHSCREEN_UCB1200=y
CONFIG_CERF_TS_MANUAL=y
CONFIG_CERF_TS_MAXX="924"
CONFIG_CERF_TS_MAXY="920"
CONFIG_CERF_TS_MINX="57"
CONFIG_CERF_TS_MINY="52"
CONFIG_CERF_TS_RESX="240"
CONFIG_CERF_TS_RESY="320"
# CONFIG_AUDIO_UCB1200 is not set
# CONFIG_ADC_UCB1200 is not set
# CONFIG_TOUCHSCREEN_H3600 is not set
# CONFIG_PROFILER is not set
# CONFIG_PFS168_SPI is not set
# CONFIG_PFS168_DTMF is not set
# CONFIG_PFS168_MISC is not set
CONFIG_SA1100_CERF_KEYPAD=y
#
# I2C support
#
# CONFIG_I2C is not set
#
# L3 serial bus support
#
# CONFIG_L3 is not set
# CONFIG_L3_ALGOBIT is not set
# CONFIG_L3_BIT_SA1100_GPIO is not set
# CONFIG_BIT_SA1100_UCB1200 is not set
#
# Other L3 adapters
#
# CONFIG_L3_SA1111 is not set
#
# L3 driver support
#
# CONFIG_L3_DRV_UDA1341 is not set
# CONFIG_BIT_SA1100_GPIO is not set
#
# Mice
#
# CONFIG_BUSMOUSE is not set
# CONFIG_MOUSE is not set
#
# Joysticks
#
# CONFIG_INPUT_GAMEPORT is not set
#
# Input core support is needed for gameports
#
#
# Input core support is needed for joysticks
#
# CONFIG_QIC02_TAPE is not set
#
# Watchdog Cards
#
# CONFIG_WATCHDOG is not set
# CONFIG_INTEL_RNG is not set
# CONFIG_NVRAM is not set
# CONFIG_RTC is not set
CONFIG_SA1100_RTC=y
# CONFIG_DTLK is not set
# CONFIG_R3964 is not set
# CONFIG_APPLICOM is not set
# CONFIG_SONYPI is not set
#
# Ftape, the floppy tape device driver
#
# CONFIG_FTAPE is not set
# CONFIG_AGP is not set
# CONFIG_DRM is not set
#
# PCMCIA character devices
#
#
# Multimedia devices
#
# CONFIG_VIDEO_DEV is not set
#
# File systems
#
# CONFIG_QUOTA is not set
# CONFIG_AUTOFS_FS is not set
# CONFIG_AUTOFS4_FS is not set
# CONFIG_REISERFS_FS is not set
# CONFIG_REISERFS_CHECK is not set
# CONFIG_REISERFS_PROC_INFO is not set
# CONFIG_ADFS_FS is not set
# CONFIG_ADFS_FS_RW is not set
# CONFIG_AFFS_FS is not set
# CONFIG_HFS_FS is not set
# CONFIG_BFS_FS is not set
# CONFIG_CMS_FS is not set
# CONFIG_EXT3_FS is not set
# CONFIG_JBD is not set
# CONFIG_JBD_DEBUG is not set
CONFIG_FAT_FS=y
CONFIG_MSDOS_FS=y
CONFIG_UMSDOS_FS=y
CONFIG_VFAT_FS=y
# CONFIG_EFS_FS is not set
# CONFIG_JFFS_FS is not set
CONFIG_JFFS2_FS=y
CONFIG_JFFS2_FS_DEBUG=0
# CONFIG_CRAMFS is not set
# CONFIG_TMPFS is not set
CONFIG_RAMFS=y
# CONFIG_ISO9660_FS is not set
# CONFIG_JOLIET is not set
# CONFIG_MINIX_FS is not set
# CONFIG_FREEVXFS_FS is not set
# CONFIG_NTFS_FS is not set
# CONFIG_NTFS_DEBUG is not set
# CONFIG_NTFS_RW is not set
# CONFIG_HPFS_FS is not set
CONFIG_PROC_FS=y
# CONFIG_DEVFS_FS is not set
# CONFIG_DEVFS_MOUNT is not set
# CONFIG_DEVFS_DEBUG is not set
CONFIG_DEVPTS_FS=y
# CONFIG_QNX4FS_FS is not set
# CONFIG_QNX4FS_RW is not set
CONFIG_ROMFS_FS=y
CONFIG_EXT2_FS=y
# CONFIG_SYSV_FS is not set
# CONFIG_UDF_FS is not set
# CONFIG_UDF_RW is not set
# CONFIG_UFS_FS is not set
# CONFIG_UFS_FS_WRITE is not set
#
# Network File Systems
#
# CONFIG_CODA_FS is not set
# CONFIG_INTERMEZZO_FS is not set
CONFIG_NFS_FS=y
CONFIG_NFS_V3=y
# CONFIG_ROOT_NFS is not set
# CONFIG_NFSD is not set
# CONFIG_NFSD_V3 is not set
CONFIG_SUNRPC=y
CONFIG_LOCKD=y
CONFIG_LOCKD_V4=y
# CONFIG_SMB_FS is not set
# CONFIG_NCP_FS is not set
# CONFIG_NCPFS_PACKET_SIGNING is not set
# CONFIG_NCPFS_IOCTL_LOCKING is not set
# CONFIG_NCPFS_STRONG is not set
# CONFIG_NCPFS_NFS_NS is not set
# CONFIG_NCPFS_OS2_NS is not set
# CONFIG_NCPFS_SMALLDOS is not set
# CONFIG_NCPFS_NLS is not set
# CONFIG_NCPFS_EXTRAS is not set
#
# Partition Types
#
# CONFIG_PARTITION_ADVANCED is not set
CONFIG_MSDOS_PARTITION=y
# CONFIG_SMB_NLS is not set
CONFIG_NLS=y
#
# Native Language Support
#
CONFIG_NLS_DEFAULT="iso8859-1"
# CONFIG_NLS_CODEPAGE_437 is not set
# CONFIG_NLS_CODEPAGE_737 is not set
# CONFIG_NLS_CODEPAGE_775 is not set
# CONFIG_NLS_CODEPAGE_850 is not set
# CONFIG_NLS_CODEPAGE_852 is not set
# CONFIG_NLS_CODEPAGE_855 is not set
# CONFIG_NLS_CODEPAGE_857 is not set
# CONFIG_NLS_CODEPAGE_860 is not set
# CONFIG_NLS_CODEPAGE_861 is not set
# CONFIG_NLS_CODEPAGE_862 is not set
# CONFIG_NLS_CODEPAGE_863 is not set
# CONFIG_NLS_CODEPAGE_864 is not set
# CONFIG_NLS_CODEPAGE_865 is not set
# CONFIG_NLS_CODEPAGE_866 is not set
# CONFIG_NLS_CODEPAGE_869 is not set
# CONFIG_NLS_CODEPAGE_936 is not set
# CONFIG_NLS_CODEPAGE_950 is not set
# CONFIG_NLS_CODEPAGE_932 is not set
# CONFIG_NLS_CODEPAGE_949 is not set
# CONFIG_NLS_CODEPAGE_874 is not set
# CONFIG_NLS_ISO8859_8 is not set
# CONFIG_NLS_CODEPAGE_1251 is not set
# CONFIG_NLS_ISO8859_1 is not set
# CONFIG_NLS_ISO8859_2 is not set
# CONFIG_NLS_ISO8859_3 is not set
# CONFIG_NLS_ISO8859_4 is not set
# CONFIG_NLS_ISO8859_5 is not set
# CONFIG_NLS_ISO8859_6 is not set
# CONFIG_NLS_ISO8859_7 is not set
# CONFIG_NLS_ISO8859_9 is not set
# CONFIG_NLS_ISO8859_13 is not set
# CONFIG_NLS_ISO8859_14 is not set
# CONFIG_NLS_ISO8859_15 is not set
# CONFIG_NLS_KOI8_R is not set
# CONFIG_NLS_KOI8_U is not set
# CONFIG_NLS_UTF8 is not set
#
# Console drivers
#
CONFIG_PC_KEYMAP=y
# CONFIG_VGA_CONSOLE is not set
#
# Frame-buffer support
#
CONFIG_FB=y
CONFIG_DUMMY_CONSOLE=y
# CONFIG_FB_ACORN is not set
# CONFIG_FB_ANAKIN is not set
# CONFIG_FB_CLPS711X is not set
# CONFIG_FB_CYBER2000 is not set
CONFIG_FB_SA1100=y
CONFIG_CERF_LCD_38_A=y
# CONFIG_CERF_LCD_57_A is not set
# CONFIG_CERF_LCD_72_A is not set
CONFIG_SA1100_CERF_LCD_BACKLIGHT=y
# CONFIG_FB_VIRTUAL is not set
# CONFIG_FBCON_ADVANCED is not set
CONFIG_FBCON_CFB2=y
CONFIG_FBCON_CFB4=y
CONFIG_FBCON_CFB8=y
CONFIG_FBCON_CFB16=y
# CONFIG_FBCON_FONTWIDTH8_ONLY is not set
# CONFIG_FBCON_FONTS is not set
CONFIG_FONT_8x8=y
CONFIG_FONT_8x16=y
#
# Sound
#
CONFIG_SOUND=y
# CONFIG_SOUND_BT878 is not set
# CONFIG_SOUND_CMPCI is not set
# CONFIG_SOUND_EMU10K1 is not set
# CONFIG_MIDI_EMU10K1 is not set
# CONFIG_SOUND_FUSION is not set
# CONFIG_SOUND_CS4281 is not set
# CONFIG_SOUND_ES1370 is not set
# CONFIG_SOUND_ES1371 is not set
# CONFIG_SOUND_ESSSOLO1 is not set
# CONFIG_SOUND_MAESTRO is not set
# CONFIG_SOUND_MAESTRO3 is not set
# CONFIG_SOUND_ICH is not set
# CONFIG_SOUND_RME96XX is not set
# CONFIG_SOUND_SONICVIBES is not set
# CONFIG_SOUND_TRIDENT is not set
# CONFIG_SOUND_MSNDCLAS is not set
# CONFIG_SOUND_MSNDPIN is not set
# CONFIG_SOUND_VIA82CXXX is not set
# CONFIG_MIDI_VIA82CXXX is not set
# CONFIG_SOUND_ASSABET_UDA1341 is not set
# CONFIG_SOUND_H3600_UDA1341 is not set
# CONFIG_SOUND_PANGOLIN_UDA1341 is not set
# CONFIG_SOUND_SA1111_UDA1341 is not set
CONFIG_SOUND_CERF_UDA1341=y
# CONFIG_SOUND_SA1100SSP is not set
# CONFIG_SOUND_OSS is not set
# CONFIG_SOUND_WAVEARTIST is not set
# CONFIG_SOUND_TVMIXER is not set
#
# USB support
#
# CONFIG_USB is not set
#
# USB Controllers
#
# CONFIG_USB_UHCI is not set
# CONFIG_USB_UHCI_ALT is not set
# CONFIG_USB_OHCI is not set
# CONFIG_USB_OHCI_SA1111 is not set
#
# USB Device Class drivers
#
# CONFIG_USB_AUDIO is not set
# CONFIG_USB_BLUETOOTH is not set
# CONFIG_USB_STORAGE is not set
# CONFIG_USB_STORAGE_DEBUG is not set
# CONFIG_USB_STORAGE_DATAFAB is not set
# CONFIG_USB_STORAGE_FREECOM is not set
# CONFIG_USB_STORAGE_ISD200 is not set
# CONFIG_USB_STORAGE_JUMPSHOT is not set
# CONFIG_USB_STORAGE_DPCM is not set
# CONFIG_USB_STORAGE_HP8200e is not set
# CONFIG_USB_STORAGE_SDDR09 is not set
# CONFIG_USB_ACM is not set
# CONFIG_USB_PRINTER is not set
#
# USB Human Interface Devices (HID)
#
#
# Input core support is needed for USB HID
#
#
# USB Imaging devices
#
# CONFIG_USB_DC2XX is not set
# CONFIG_USB_MDC800 is not set
# CONFIG_USB_SCANNER is not set
# CONFIG_USB_MICROTEK is not set
# CONFIG_USB_HPUSBSCSI is not set
#
# USB Multimedia devices
#
#
# Video4Linux support is needed for USB Multimedia device support
#
# CONFIG_USB_DABUSB is not set
#
# USB Network adaptors
#
# CONFIG_USB_PLUSB is not set
# CONFIG_USB_PEGASUS is not set
# CONFIG_USB_KAWETH is not set
# CONFIG_USB_CATC is not set
# CONFIG_USB_CDCETHER is not set
# CONFIG_USB_USBNET is not set
#
# USB port drivers
#
# CONFIG_USB_USS720 is not set
#
# USB Serial Converter support
#
# CONFIG_USB_SERIAL is not set
# CONFIG_USB_SERIAL_GENERIC is not set
# CONFIG_USB_SERIAL_BELKIN is not set
# CONFIG_USB_SERIAL_WHITEHEAT is not set
# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set
# CONFIG_USB_SERIAL_EMPEG is not set
# CONFIG_USB_SERIAL_FTDI_SIO is not set
# CONFIG_USB_SERIAL_VISOR is not set
# CONFIG_USB_SERIAL_EDGEPORT is not set
# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set
# CONFIG_USB_SERIAL_KEYSPAN is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
# CONFIG_USB_SERIAL_MCT_U232 is not set
# CONFIG_USB_SERIAL_PL2303 is not set
# CONFIG_USB_SERIAL_CYBERJACK is not set
# CONFIG_USB_SERIAL_OMNINET is not set
#
# Miscellaneous USB drivers
#
# CONFIG_USB_RIO500 is not set
# CONFIG_USB_ID75 is not set
#
# Bluetooth support
#
CONFIG_BT=y
CONFIG_BT_L2CAP=y
#
# Bluetooth device drivers
#
# CONFIG_BT_HCIUSB is not set
CONFIG_BT_HCIUART=y
# CONFIG_BT_HCIVHCI is not set
#
# Kernel hacking
#
CONFIG_FRAME_POINTER=y
CONFIG_DEBUG_ERRORS=y
CONFIG_DEBUG_USER=y
# CONFIG_DEBUG_INFO is not set
CONFIG_MAGIC_SYSRQ=y
# CONFIG_NO_PGT_CACHE is not set
# CONFIG_DEBUG_LL is not set
# CONFIG_DEBUG_DC21285_PORT is not set
# CONFIG_DEBUG_CLPS711X_UART2 is not set
arch/arm/configs/cerfpod_defconfig
deleted
100644 → 0
View file @
d00ea9a1
#
# Automatically generated make config: don't edit
#
CONFIG_ARM=y
# CONFIG_EISA is not set
# CONFIG_SBUS is not set
# CONFIG_MCA is not set
CONFIG_UID16=y
CONFIG_RWSEM_GENERIC_SPINLOCK=y
# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
#
# Code maturity level options
#
CONFIG_EXPERIMENTAL=y
# CONFIG_OBSOLETE is not set
#
# Loadable module support
#
CONFIG_MODULES=y
# CONFIG_MODVERSIONS is not set
# CONFIG_KMOD is not set
#
# System Type
#
# CONFIG_ARCH_ANAKIN is not set
# CONFIG_ARCH_ARCA5K is not set
# CONFIG_ARCH_CLPS7500 is not set
# CONFIG_ARCH_CLPS711X is not set
# CONFIG_ARCH_CO285 is not set
# CONFIG_ARCH_EBSA110 is not set
# CONFIG_ARCH_FOOTBRIDGE is not set
# CONFIG_ARCH_INTEGRATOR is not set
# CONFIG_ARCH_L7200 is not set
# CONFIG_ARCH_RPC is not set
CONFIG_ARCH_SA1100=y
# CONFIG_ARCH_SHARK is not set
#
# Archimedes/A5000 Implementations
#
#
# Archimedes/A5000 Implementations (select only ONE)
#
# CONFIG_ARCH_ARC is not set
# CONFIG_ARCH_A5K is not set
#
# Footbridge Implementations
#
# CONFIG_ARCH_CATS is not set
# CONFIG_ARCH_PERSONAL_SERVER is not set
# CONFIG_ARCH_EBSA285_ADDIN is not set
# CONFIG_ARCH_EBSA285_HOST is not set
# CONFIG_ARCH_NETWINDER is not set
#
# SA11x0 Implementations
#
# CONFIG_SA1100_ASSABET is not set
# CONFIG_ASSABET_NEPONSET is not set
# CONFIG_SA1100_ADSBITSY is not set
# CONFIG_SA1100_BRUTUS is not set
CONFIG_SA1100_CERF=y
# CONFIG_SA1100_CERF_FLASH_8MB is not set
CONFIG_SA1100_CERF_FLASH_16MB=y
# CONFIG_SA1100_CERF_FLASH_32MB is not set
# CONFIG_SA1100_CERF_CPLD is not set
# CONFIG_SA1100_H3600 is not set
# CONFIG_SA1100_EXTENEX1 is not set
# CONFIG_SA1100_FLEXANET is not set
# CONFIG_SA1100_FREEBIRD is not set
# CONFIG_SA1100_GRAPHICSCLIENT is not set
# CONFIG_SA1100_GRAPHICSMASTER is not set
# CONFIG_SA1100_JORNADA720 is not set
# CONFIG_SA1100_HUW_WEBPANEL is not set
# CONFIG_SA1100_ITSY is not set
# CONFIG_SA1100_LART is not set
# CONFIG_SA1100_NANOENGINE is not set
# CONFIG_SA1100_OMNIMETER is not set
# CONFIG_SA1100_PANGOLIN is not set
# CONFIG_SA1100_PLEB is not set
# CONFIG_SA1100_SHERMAN is not set
# CONFIG_SA1100_SIMPAD is not set
# CONFIG_SA1100_PFS168 is not set
# CONFIG_SA1100_VICTOR is not set
# CONFIG_SA1100_XP860 is not set
# CONFIG_SA1100_YOPY is not set
CONFIG_SA1100_USB=y
CONFIG_SA1100_USB_NETLINK=y
CONFIG_SA1100_USB_CHAR=y
#
# CLPS711X/EP721X Implementations
#
# CONFIG_ARCH_CDB89712 is not set
# CONFIG_ARCH_CLEP7312 is not set
# CONFIG_ARCH_EDB7211 is not set
# CONFIG_ARCH_P720T is not set
# CONFIG_ARCH_EP7211 is not set
# CONFIG_ARCH_EP7212 is not set
# CONFIG_ARCH_ACORN is not set
# CONFIG_FOOTBRIDGE is not set
# CONFIG_FOOTBRIDGE_HOST is not set
# CONFIG_FOOTBRIDGE_ADDIN is not set
CONFIG_CPU_32=y
# CONFIG_CPU_26 is not set
#
# Processor Type
#
# CONFIG_CPU_32v3 is not set
CONFIG_CPU_32v4=y
# CONFIG_CPU_ARM610 is not set
# CONFIG_CPU_ARM710 is not set
# CONFIG_CPU_ARM720T is not set
# CONFIG_CPU_ARM920T is not set
# CONFIG_CPU_ARM1020 is not set
# CONFIG_CPU_SA110 is not set
CONFIG_CPU_SA1100=y
# CONFIG_ARM_THUMB is not set
CONFIG_DISCONTIGMEM=y
#
# General setup
#
# CONFIG_PCI is not set
# CONFIG_ISA is not set
# CONFIG_ISA_DMA is not set
CONFIG_CPU_FREQ=y
CONFIG_HOTPLUG=y
#
# PCMCIA/CardBus support
#
CONFIG_PCMCIA=y
# CONFIG_I82365 is not set
# CONFIG_TCIC is not set
# CONFIG_PCMCIA_CLPS6700 is not set
CONFIG_PCMCIA_SA1100=y
CONFIG_NET=y
CONFIG_SYSVIPC=y
CONFIG_BSD_PROCESS_ACCT=y
CONFIG_SYSCTL=y
#
# At least one math emulation must be selected
#
CONFIG_FPE_NWFPE=y
# CONFIG_FPE_FASTFPE is not set
CONFIG_KCORE_ELF=y
# CONFIG_KCORE_AOUT is not set
# CONFIG_BINFMT_AOUT is not set
CONFIG_BINFMT_ELF=y
# CONFIG_BINFMT_MISC is not set
# CONFIG_PM is not set
# CONFIG_APM is not set
# CONFIG_ARTHUR is not set
CONFIG_CMDLINE="console=ttySA0 root=/dev/mtdblock3 rw mem=32M"
# CONFIG_PFS168_CMDLINE is not set
CONFIG_LEDS=y
CONFIG_LEDS_TIMER=y
CONFIG_LEDS_CPU=y
CONFIG_ALIGNMENT_TRAP=y
#
# Parallel port support
#
# CONFIG_PARPORT is not set
#
# Memory Technology Devices (MTD)
#
CONFIG_MTD=y
# CONFIG_MTD_DEBUG is not set
CONFIG_MTD_PARTITIONS=y
# CONFIG_MTD_REDBOOT_PARTS is not set
# CONFIG_MTD_BOOTLDR_PARTS is not set
# CONFIG_MTD_AFS_PARTS is not set
#
# User Modules And Translation Layers
#
CONFIG_MTD_CHAR=y
CONFIG_MTD_BLOCK=y
# CONFIG_FTL is not set
# CONFIG_NFTL is not set
#
# RAM/ROM/Flash chip drivers
#
CONFIG_MTD_CFI=y
# CONFIG_MTD_JEDECPROBE is not set
CONFIG_MTD_GEN_PROBE=y
# CONFIG_MTD_CFI_ADV_OPTIONS is not set
CONFIG_MTD_CFI_INTELEXT=y
# CONFIG_MTD_CFI_AMDSTD is not set
# CONFIG_MTD_RAM is not set
# CONFIG_MTD_ROM is not set
# CONFIG_MTD_ABSENT is not set
# CONFIG_MTD_OBSOLETE_CHIPS is not set
#
# Mapping drivers for chip access
#
# CONFIG_MTD_PHYSMAP is not set
# CONFIG_MTD_SUN_UFLASH is not set
# CONFIG_MTD_NORA is not set
# CONFIG_MTD_PNC2000 is not set
# CONFIG_MTD_RPXLITE is not set
# CONFIG_MTD_TQM8XXL is not set
# CONFIG_MTD_SC520CDP is not set
# CONFIG_MTD_NETSC520 is not set
# CONFIG_MTD_SBC_GXX is not set
# CONFIG_MTD_ELAN_104NC is not set
# CONFIG_MTD_DBOX2 is not set
# CONFIG_MTD_CSTM_MIPS_IXX is not set
# CONFIG_MTD_CFI_FLAGADM is not set
# CONFIG_MTD_SOLUTIONENGINE is not set
# CONFIG_MTD_MIXMEM is not set
# CONFIG_MTD_OCTAGON is not set
# CONFIG_MTD_VMAX is not set
# CONFIG_MTD_OCELOT is not set
# CONFIG_MTD_L440GX is not set
# CONFIG_MTD_ARM_INTEGRATOR is not set
# CONFIG_MTD_CDB89712 is not set
CONFIG_MTD_SA1100=y
# CONFIG_MTD_DC21285 is not set
# CONFIG_MTD_IQ80310 is not set
#
# Self-contained MTD device drivers
#
# CONFIG_MTD_PMC551 is not set
# CONFIG_MTD_SLRAM is not set
# CONFIG_MTD_LART is not set
# CONFIG_MTD_MTDRAM is not set
# CONFIG_MTD_BLKMTD is not set
#
# Disk-On-Chip Device Drivers
#
# CONFIG_MTD_DOC1000 is not set
# CONFIG_MTD_DOC2000 is not set
# CONFIG_MTD_DOC2001 is not set
# CONFIG_MTD_DOCPROBE is not set
#
# NAND Flash Device Drivers
#
# CONFIG_MTD_NAND is not set
#
# Plug and Play configuration
#
# CONFIG_PNP is not set
# CONFIG_ISAPNP is not set
# CONFIG_PNPBIOS is not set
#
# Block devices
#
# CONFIG_BLK_DEV_FD is not set
# CONFIG_BLK_DEV_XD is not set
# CONFIG_PARIDE is not set
# CONFIG_BLK_CPQ_DA is not set
# CONFIG_BLK_CPQ_CISS_DA is not set
# CONFIG_BLK_DEV_DAC960 is not set
CONFIG_BLK_DEV_LOOP=y
# CONFIG_BLK_DEV_NBD is not set
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_SIZE=4096
CONFIG_BLK_DEV_INITRD=y
#
# Multi-device support (RAID and LVM)
#
# CONFIG_MD is not set
# CONFIG_BLK_DEV_MD is not set
# CONFIG_MD_LINEAR is not set
# CONFIG_MD_RAID0 is not set
# CONFIG_MD_RAID1 is not set
# CONFIG_MD_RAID5 is not set
# CONFIG_BLK_DEV_LVM is not set
#
# Networking options
#
CONFIG_PACKET=y
CONFIG_PACKET_MMAP=y
CONFIG_NETLINK=y
CONFIG_RTNETLINK=y
# CONFIG_NETLINK_DEV is not set
# CONFIG_NETFILTER is not set
CONFIG_FILTER=y
CONFIG_UNIX=y
CONFIG_INET=y
CONFIG_IP_MULTICAST=y
# CONFIG_IP_ADVANCED_ROUTER is not set
# CONFIG_IP_PNP is not set
# CONFIG_NET_IPIP is not set
# CONFIG_NET_IPGRE is not set
# CONFIG_IP_MROUTE is not set
# CONFIG_ARPD is not set
# CONFIG_INET_ECN is not set
# CONFIG_SYN_COOKIES is not set
# CONFIG_IPV6 is not set
# CONFIG_KHTTPD is not set
# CONFIG_ATM is not set
#
#
#
# CONFIG_IPX is not set
# CONFIG_ATALK is not set
# CONFIG_DECNET is not set
# CONFIG_BRIDGE is not set
# CONFIG_X25 is not set
# CONFIG_LAPB is not set
# CONFIG_LLC is not set
# CONFIG_NET_DIVERT is not set
# CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set
# CONFIG_NET_FASTROUTE is not set
# CONFIG_NET_HW_FLOWCONTROL is not set
#
# QoS and/or fair queueing
#
# CONFIG_NET_SCHED is not set
#
# Network device support
#
CONFIG_NETDEVICES=y
#
# ARCnet devices
#
# CONFIG_ARCNET is not set
# CONFIG_DUMMY is not set
# CONFIG_BONDING is not set
# CONFIG_EQUALIZER is not set
# CONFIG_TUN is not set
# CONFIG_ETHERTAP is not set
#
# Ethernet (10 or 100Mbit)
#
CONFIG_NET_ETHERNET=y
# CONFIG_SUNLANCE is not set
# CONFIG_SUNBMAC is not set
# CONFIG_SUNQE is not set
# CONFIG_SUNLANCE is not set
# CONFIG_SUNGEM is not set
CONFIG_NET_VENDOR_3COM=y
# CONFIG_EL1 is not set
# CONFIG_EL2 is not set
# CONFIG_ELPLUS is not set
# CONFIG_EL16 is not set
# CONFIG_ELMC is not set
# CONFIG_ELMC_II is not set
CONFIG_CERF_CS8900A=y
# CONFIG_LANCE is not set
# CONFIG_NET_VENDOR_SMC is not set
# CONFIG_NET_VENDOR_RACAL is not set
# CONFIG_NET_ISA is not set
# CONFIG_NET_PCI is not set
# CONFIG_NET_POCKET is not set
#
# Ethernet (1000 Mbit)
#
# CONFIG_ACENIC is not set
# CONFIG_DL2K is not set
# CONFIG_MYRI_SBUS is not set
# CONFIG_NS83820 is not set
# CONFIG_HAMACHI is not set
# CONFIG_YELLOWFIN is not set
# CONFIG_SK98LIN is not set
# CONFIG_FDDI is not set
# CONFIG_HIPPI is not set
# CONFIG_PLIP is not set
# CONFIG_PPP is not set
# CONFIG_SLIP is not set
#
# Wireless LAN (non-hamradio)
#
# CONFIG_NET_RADIO is not set
#
# Token Ring devices
#
# CONFIG_TR is not set
# CONFIG_NET_FC is not set
# CONFIG_RCPCI is not set
# CONFIG_SHAPER is not set
#
# Wan interfaces
#
# CONFIG_WAN is not set
#
# PCMCIA network device support
#
CONFIG_NET_PCMCIA=y
# CONFIG_PCMCIA_3C589 is not set
# CONFIG_PCMCIA_3C574 is not set
# CONFIG_PCMCIA_FMVJ18X is not set
CONFIG_PCMCIA_PCNET=y
# CONFIG_PCMCIA_NMCLAN is not set
# CONFIG_PCMCIA_SMC91C92 is not set
# CONFIG_PCMCIA_XIRC2PS is not set
# CONFIG_ARCNET_COM20020_CS is not set
# CONFIG_PCMCIA_IBMTR is not set
# CONFIG_NET_PCMCIA_RADIO is not set
#
# Amateur Radio support
#
# CONFIG_HAMRADIO is not set
#
# IrDA (infrared) support
#
# CONFIG_IRDA is not set
#
# ATA/IDE/MFM/RLL support
#
CONFIG_IDE=y
#
# IDE, ATA and ATAPI Block devices
#
CONFIG_BLK_DEV_IDE=y
#
# Please see Documentation/ide.txt for help/info on IDE drives
#
# CONFIG_BLK_DEV_HD_IDE is not set
# CONFIG_BLK_DEV_HD is not set
CONFIG_BLK_DEV_IDEDISK=y
# CONFIG_IDEDISK_MULTI_MODE is not set
CONFIG_BLK_DEV_IDECS=m
# CONFIG_BLK_DEV_IDECD is not set
# CONFIG_BLK_DEV_IDETAPE is not set
# CONFIG_BLK_DEV_IDEFLOPPY is not set
# CONFIG_BLK_DEV_IDESCSI is not set
#
# IDE chipset support/bugfixes
#
# CONFIG_BLK_DEV_CMD640 is not set
# CONFIG_BLK_DEV_CMD640_ENHANCED is not set
# CONFIG_BLK_DEV_ISAPNP is not set
# CONFIG_IDE_CHIPSETS is not set
# CONFIG_IDEDMA_AUTO is not set
# CONFIG_BLK_DEV_ATARAID is not set
# CONFIG_BLK_DEV_ATARAID_PDC is not set
# CONFIG_BLK_DEV_ATARAID_HPT is not set
#
# SCSI support
#
# CONFIG_SCSI is not set
#
# I2O device support
#
# CONFIG_I2O is not set
# CONFIG_I2O_BLOCK is not set
# CONFIG_I2O_LAN is not set
# CONFIG_I2O_SCSI is not set
# CONFIG_I2O_PROC is not set
#
# ISDN subsystem
#
# CONFIG_ISDN is not set
#
# Input core support
#
# CONFIG_INPUT is not set
# CONFIG_INPUT_KEYBDEV is not set
# CONFIG_INPUT_MOUSEDEV is not set
# CONFIG_INPUT_JOYDEV is not set
# CONFIG_INPUT_EVDEV is not set
#
# Character devices
#
CONFIG_VT=y
# CONFIG_VT_CONSOLE is not set
# CONFIG_SERIAL is not set
# CONFIG_SERIAL_EXTENDED is not set
# CONFIG_SERIAL_NONSTANDARD is not set
#
# Serial drivers
#
# CONFIG_SERIAL_ANAKIN is not set
# CONFIG_SERIAL_ANAKIN_CONSOLE is not set
# CONFIG_SERIAL_AMBA is not set
# CONFIG_SERIAL_AMBA_CONSOLE is not set
# CONFIG_SERIAL_CLPS711X is not set
# CONFIG_SERIAL_CLPS711X_CONSOLE is not set
# CONFIG_SERIAL_21285 is not set
# CONFIG_SERIAL_21285_OLD is not set
# CONFIG_SERIAL_21285_CONSOLE is not set
CONFIG_SERIAL_SA1100=y
CONFIG_SERIAL_SA1100_CONSOLE=y
CONFIG_SA1100_DEFAULT_BAUDRATE=38400
# CONFIG_SERIAL_8250 is not set
# CONFIG_SERIAL_8250_CONSOLE is not set
# CONFIG_SERIAL_8250_EXTENDED is not set
# CONFIG_SERIAL_8250_MANY_PORTS is not set
# CONFIG_SERIAL_8250_SHARE_IRQ is not set
# CONFIG_SERIAL_8250_DETECT_IRQ is not set
# CONFIG_SERIAL_8250_MULTIPORT is not set
# CONFIG_SERIAL_8250_HUB6 is not set
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y
CONFIG_UNIX98_PTYS=y
CONFIG_UNIX98_PTY_COUNT=32
CONFIG_UCB1200=y
CONFIG_TOUCHSCREEN_UCB1200=y
# CONFIG_CERF_TS_MANUAL is not set
CONFIG_AUDIO_UCB1200=y
# CONFIG_ADC_UCB1200 is not set
# CONFIG_TOUCHSCREEN_H3600 is not set
# CONFIG_PROFILER is not set
# CONFIG_PFS168_SPI is not set
# CONFIG_PFS168_DTMF is not set
# CONFIG_PFS168_MISC is not set
#
# I2C support
#
# CONFIG_I2C is not set
#
# L3 serial bus support
#
# CONFIG_L3 is not set
# CONFIG_L3_ALGOBIT is not set
# CONFIG_L3_BIT_SA1100_GPIO is not set
# CONFIG_BIT_SA1100_UCB1200 is not set
#
# Other L3 adapters
#
# CONFIG_L3_SA1111 is not set
#
# L3 driver support
#
# CONFIG_L3_DRV_UDA1341 is not set
# CONFIG_BIT_SA1100_GPIO is not set
#
# Mice
#
# CONFIG_BUSMOUSE is not set
# CONFIG_MOUSE is not set
#
# Joysticks
#
# CONFIG_INPUT_GAMEPORT is not set
#
# Input core support is needed for gameports
#
#
# Input core support is needed for joysticks
#
# CONFIG_QIC02_TAPE is not set
#
# Watchdog Cards
#
# CONFIG_WATCHDOG is not set
# CONFIG_INTEL_RNG is not set
# CONFIG_NVRAM is not set
# CONFIG_RTC is not set
CONFIG_SA1100_RTC=y
# CONFIG_DTLK is not set
# CONFIG_R3964 is not set
# CONFIG_APPLICOM is not set
# CONFIG_SONYPI is not set
#
# Ftape, the floppy tape device driver
#
# CONFIG_FTAPE is not set
# CONFIG_AGP is not set
# CONFIG_DRM is not set
#
# PCMCIA character devices
#
#
# Multimedia devices
#
# CONFIG_VIDEO_DEV is not set
#
# File systems
#
# CONFIG_QUOTA is not set
# CONFIG_AUTOFS_FS is not set
# CONFIG_AUTOFS4_FS is not set
# CONFIG_REISERFS_FS is not set
# CONFIG_REISERFS_CHECK is not set
# CONFIG_REISERFS_PROC_INFO is not set
# CONFIG_ADFS_FS is not set
# CONFIG_ADFS_FS_RW is not set
# CONFIG_AFFS_FS is not set
# CONFIG_HFS_FS is not set
# CONFIG_BFS_FS is not set
# CONFIG_CMS_FS is not set
# CONFIG_EXT3_FS is not set
# CONFIG_JBD is not set
# CONFIG_JBD_DEBUG is not set
CONFIG_FAT_FS=y
CONFIG_MSDOS_FS=y
CONFIG_UMSDOS_FS=y
CONFIG_VFAT_FS=y
# CONFIG_EFS_FS is not set
# CONFIG_JFFS_FS is not set
CONFIG_JFFS2_FS=y
CONFIG_JFFS2_FS_DEBUG=0
# CONFIG_CRAMFS is not set
# CONFIG_TMPFS is not set
CONFIG_RAMFS=y
# CONFIG_ISO9660_FS is not set
# CONFIG_JOLIET is not set
# CONFIG_MINIX_FS is not set
# CONFIG_FREEVXFS_FS is not set
# CONFIG_NTFS_FS is not set
# CONFIG_NTFS_DEBUG is not set
# CONFIG_NTFS_RW is not set
# CONFIG_HPFS_FS is not set
CONFIG_PROC_FS=y
# CONFIG_DEVFS_FS is not set
# CONFIG_DEVFS_MOUNT is not set
# CONFIG_DEVFS_DEBUG is not set
CONFIG_DEVPTS_FS=y
# CONFIG_QNX4FS_FS is not set
# CONFIG_QNX4FS_RW is not set
CONFIG_ROMFS_FS=y
CONFIG_EXT2_FS=y
# CONFIG_SYSV_FS is not set
# CONFIG_UDF_FS is not set
# CONFIG_UDF_RW is not set
# CONFIG_UFS_FS is not set
# CONFIG_UFS_FS_WRITE is not set
#
# Network File Systems
#
# CONFIG_CODA_FS is not set
# CONFIG_INTERMEZZO_FS is not set
CONFIG_NFS_FS=y
CONFIG_NFS_V3=y
# CONFIG_ROOT_NFS is not set
# CONFIG_NFSD is not set
# CONFIG_NFSD_V3 is not set
CONFIG_SUNRPC=y
CONFIG_LOCKD=y
CONFIG_LOCKD_V4=y
# CONFIG_SMB_FS is not set
# CONFIG_NCP_FS is not set
# CONFIG_NCPFS_PACKET_SIGNING is not set
# CONFIG_NCPFS_IOCTL_LOCKING is not set
# CONFIG_NCPFS_STRONG is not set
# CONFIG_NCPFS_NFS_NS is not set
# CONFIG_NCPFS_OS2_NS is not set
# CONFIG_NCPFS_SMALLDOS is not set
# CONFIG_NCPFS_NLS is not set
# CONFIG_NCPFS_EXTRAS is not set
#
# Partition Types
#
# CONFIG_PARTITION_ADVANCED is not set
CONFIG_MSDOS_PARTITION=y
# CONFIG_SMB_NLS is not set
CONFIG_NLS=y
#
# Native Language Support
#
CONFIG_NLS_DEFAULT="iso8859-1"
# CONFIG_NLS_CODEPAGE_437 is not set
# CONFIG_NLS_CODEPAGE_737 is not set
# CONFIG_NLS_CODEPAGE_775 is not set
# CONFIG_NLS_CODEPAGE_850 is not set
# CONFIG_NLS_CODEPAGE_852 is not set
# CONFIG_NLS_CODEPAGE_855 is not set
# CONFIG_NLS_CODEPAGE_857 is not set
# CONFIG_NLS_CODEPAGE_860 is not set
# CONFIG_NLS_CODEPAGE_861 is not set
# CONFIG_NLS_CODEPAGE_862 is not set
# CONFIG_NLS_CODEPAGE_863 is not set
# CONFIG_NLS_CODEPAGE_864 is not set
# CONFIG_NLS_CODEPAGE_865 is not set
# CONFIG_NLS_CODEPAGE_866 is not set
# CONFIG_NLS_CODEPAGE_869 is not set
# CONFIG_NLS_CODEPAGE_936 is not set
# CONFIG_NLS_CODEPAGE_950 is not set
# CONFIG_NLS_CODEPAGE_932 is not set
# CONFIG_NLS_CODEPAGE_949 is not set
# CONFIG_NLS_CODEPAGE_874 is not set
# CONFIG_NLS_ISO8859_8 is not set
# CONFIG_NLS_CODEPAGE_1251 is not set
# CONFIG_NLS_ISO8859_1 is not set
# CONFIG_NLS_ISO8859_2 is not set
# CONFIG_NLS_ISO8859_3 is not set
# CONFIG_NLS_ISO8859_4 is not set
# CONFIG_NLS_ISO8859_5 is not set
# CONFIG_NLS_ISO8859_6 is not set
# CONFIG_NLS_ISO8859_7 is not set
# CONFIG_NLS_ISO8859_9 is not set
# CONFIG_NLS_ISO8859_13 is not set
# CONFIG_NLS_ISO8859_14 is not set
# CONFIG_NLS_ISO8859_15 is not set
# CONFIG_NLS_KOI8_R is not set
# CONFIG_NLS_KOI8_U is not set
# CONFIG_NLS_UTF8 is not set
#
# Console drivers
#
CONFIG_PC_KEYMAP=y
# CONFIG_VGA_CONSOLE is not set
#
# Frame-buffer support
#
CONFIG_FB=y
CONFIG_DUMMY_CONSOLE=y
# CONFIG_FB_ACORN is not set
# CONFIG_FB_ANAKIN is not set
# CONFIG_FB_CLPS711X is not set
# CONFIG_FB_CYBER2000 is not set
CONFIG_FB_SA1100=y
# CONFIG_CERF_LCD_38_A is not set
CONFIG_CERF_LCD_57_A=y
# CONFIG_CERF_LCD_72_A is not set
# CONFIG_FB_VIRTUAL is not set
# CONFIG_FBCON_ADVANCED is not set
CONFIG_FBCON_CFB2=y
CONFIG_FBCON_CFB4=y
CONFIG_FBCON_CFB8=y
CONFIG_FBCON_CFB16=y
# CONFIG_FBCON_FONTWIDTH8_ONLY is not set
# CONFIG_FBCON_FONTS is not set
CONFIG_FONT_8x8=y
CONFIG_FONT_8x16=y
#
# Sound
#
# CONFIG_SOUND is not set
#
# USB support
#
# CONFIG_USB is not set
#
# USB Controllers
#
# CONFIG_USB_UHCI is not set
# CONFIG_USB_UHCI_ALT is not set
# CONFIG_USB_OHCI is not set
# CONFIG_USB_OHCI_SA1111 is not set
#
# USB Device Class drivers
#
# CONFIG_USB_AUDIO is not set
# CONFIG_USB_BLUETOOTH is not set
# CONFIG_USB_STORAGE is not set
# CONFIG_USB_STORAGE_DEBUG is not set
# CONFIG_USB_STORAGE_DATAFAB is not set
# CONFIG_USB_STORAGE_FREECOM is not set
# CONFIG_USB_STORAGE_ISD200 is not set
# CONFIG_USB_STORAGE_JUMPSHOT is not set
# CONFIG_USB_STORAGE_DPCM is not set
# CONFIG_USB_STORAGE_HP8200e is not set
# CONFIG_USB_STORAGE_SDDR09 is not set
# CONFIG_USB_ACM is not set
# CONFIG_USB_PRINTER is not set
#
# USB Human Interface Devices (HID)
#
#
# Input core support is needed for USB HID
#
#
# USB Imaging devices
#
# CONFIG_USB_DC2XX is not set
# CONFIG_USB_MDC800 is not set
# CONFIG_USB_SCANNER is not set
# CONFIG_USB_MICROTEK is not set
# CONFIG_USB_HPUSBSCSI is not set
#
# USB Multimedia devices
#
#
# Video4Linux support is needed for USB Multimedia device support
#
# CONFIG_USB_DABUSB is not set
#
# USB Network adaptors
#
# CONFIG_USB_PLUSB is not set
# CONFIG_USB_PEGASUS is not set
# CONFIG_USB_KAWETH is not set
# CONFIG_USB_CATC is not set
# CONFIG_USB_CDCETHER is not set
# CONFIG_USB_USBNET is not set
#
# USB port drivers
#
# CONFIG_USB_USS720 is not set
#
# USB Serial Converter support
#
# CONFIG_USB_SERIAL is not set
# CONFIG_USB_SERIAL_GENERIC is not set
# CONFIG_USB_SERIAL_BELKIN is not set
# CONFIG_USB_SERIAL_WHITEHEAT is not set
# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set
# CONFIG_USB_SERIAL_EMPEG is not set
# CONFIG_USB_SERIAL_FTDI_SIO is not set
# CONFIG_USB_SERIAL_VISOR is not set
# CONFIG_USB_SERIAL_EDGEPORT is not set
# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set
# CONFIG_USB_SERIAL_KEYSPAN is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
# CONFIG_USB_SERIAL_MCT_U232 is not set
# CONFIG_USB_SERIAL_PL2303 is not set
# CONFIG_USB_SERIAL_CYBERJACK is not set
# CONFIG_USB_SERIAL_OMNINET is not set
#
# Miscellaneous USB drivers
#
# CONFIG_USB_RIO500 is not set
# CONFIG_USB_ID75 is not set
#
# Bluetooth support
#
# CONFIG_BT is not set
#
# Kernel hacking
#
CONFIG_FRAME_POINTER=y
CONFIG_DEBUG_ERRORS=y
CONFIG_DEBUG_USER=y
# CONFIG_DEBUG_INFO is not set
CONFIG_MAGIC_SYSRQ=y
# CONFIG_NO_PGT_CACHE is not set
# CONFIG_DEBUG_LL is not set
# CONFIG_DEBUG_DC21285_PORT is not set
# CONFIG_DEBUG_CLPS711X_UART2 is not set
arch/arm/kernel/setup.c
View file @
1c23361e
...
@@ -654,6 +654,17 @@ static struct init_tags {
...
@@ -654,6 +654,17 @@ static struct init_tags {
{
0
,
ATAG_NONE
}
{
0
,
ATAG_NONE
}
};
};
static
void
(
*
init_machine
)(
void
)
__initdata
;
static
int
__init
customize_machine
(
void
)
{
/* customizes platform devices, or adds new ones */
if
(
init_machine
)
init_machine
();
return
0
;
}
arch_initcall
(
customize_machine
);
void
__init
setup_arch
(
char
**
cmdline_p
)
void
__init
setup_arch
(
char
**
cmdline_p
)
{
{
struct
tag
*
tags
=
(
struct
tag
*
)
&
init_tags
;
struct
tag
*
tags
=
(
struct
tag
*
)
&
init_tags
;
...
@@ -704,6 +715,7 @@ void __init setup_arch(char **cmdline_p)
...
@@ -704,6 +715,7 @@ void __init setup_arch(char **cmdline_p)
* Set up various architecture-specific pointers
* Set up various architecture-specific pointers
*/
*/
init_arch_irq
=
mdesc
->
init_irq
;
init_arch_irq
=
mdesc
->
init_irq
;
init_machine
=
mdesc
->
init_machine
;
#ifdef CONFIG_VT
#ifdef CONFIG_VT
#if defined(CONFIG_VGA_CONSOLE)
#if defined(CONFIG_VGA_CONSOLE)
...
...
arch/arm/lib/memcpy.S
View file @
1c23361e
...
@@ -16,14 +16,14 @@
...
@@ -16,14 +16,14 @@
#define ENTER \
#define ENTER \
mov
ip
,
sp
;\
mov
ip
,
sp
;\
stmfd
sp
!,{
r4
-
r9
,
fp
,
ip
,
lr
,
pc
}
;\
stmfd
sp
!,{
r
0
,
r
4
-
r9
,
fp
,
ip
,
lr
,
pc
}
;\
sub
fp
,
ip
,#
4
sub
fp
,
ip
,#
4
#define EXIT \
#define EXIT \
LOADREGS
(
ea
,
fp
,
{
r4
-
r9
,
fp
,
sp
,
pc
})
LOADREGS
(
ea
,
fp
,
{
r
0
,
r
4
-
r9
,
fp
,
sp
,
pc
})
#define EXITEQ \
#define EXITEQ \
LOADREGS
(
eqea
,
fp
,
{
r4
-
r9
,
fp
,
sp
,
pc
})
LOADREGS
(
eqea
,
fp
,
{
r
0
,
r
4
-
r9
,
fp
,
sp
,
pc
})
/*
/*
*
Prototype
:
void
memcpy
(
void
*
to
,
const
void
*
from
,
unsigned
long
n
)
;
*
Prototype
:
void
memcpy
(
void
*
to
,
const
void
*
from
,
unsigned
long
n
)
;
...
...
arch/arm/mach-pxa/generic.c
View file @
1c23361e
...
@@ -20,13 +20,18 @@
...
@@ -20,13 +20,18 @@
#include <linux/kernel.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/delay.h>
#include <linux/device.h>
#include <linux/ioport.h>
#include <linux/pm.h>
#include <linux/pm.h>
#include <asm/hardware.h>
#include <asm/hardware.h>
#include <asm/irq.h>
#include <asm/system.h>
#include <asm/system.h>
#include <asm/pgtable.h>
#include <asm/pgtable.h>
#include <asm/mach/map.h>
#include <asm/mach/map.h>
#include <asm/arch/udc.h>
#include "generic.h"
#include "generic.h"
/*
/*
...
@@ -138,3 +143,76 @@ void __init pxa_map_io(void)
...
@@ -138,3 +143,76 @@ void __init pxa_map_io(void)
iotable_init
(
standard_io_desc
,
ARRAY_SIZE
(
standard_io_desc
));
iotable_init
(
standard_io_desc
,
ARRAY_SIZE
(
standard_io_desc
));
get_clk_frequency_khz
(
1
);
get_clk_frequency_khz
(
1
);
}
}
static
struct
resource
pxamci_resources
[]
=
{
[
0
]
=
{
.
start
=
0x41100000
,
.
end
=
0x41100fff
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
IRQ_MMC
,
.
end
=
IRQ_MMC
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
u64
pxamci_dmamask
=
0xffffffffUL
;
static
struct
platform_device
pxamci_device
=
{
.
name
=
"pxamci"
,
.
id
=
0
,
.
dev
=
{
.
dma_mask
=
&
pxamci_dmamask
,
},
.
num_resources
=
ARRAY_SIZE
(
pxamci_resources
),
.
resource
=
pxamci_resources
,
};
static
struct
pxa2xx_udc_mach_info
pxa_udc_info
;
void
__init
pxa_set_udc_info
(
struct
pxa2xx_udc_mach_info
*
info
)
{
memcpy
(
&
pxa_udc_info
,
info
,
sizeof
*
info
);
}
EXPORT_SYMBOL
(
pxa_set_udc_info
);
static
struct
resource
pxa2xx_udc_resources
[]
=
{
[
0
]
=
{
.
start
=
0x40600000
,
.
end
=
0x4060ffff
,
.
flags
=
IORESOURCE_MEM
,
},
[
1
]
=
{
.
start
=
IRQ_USB
,
.
end
=
IRQ_USB
,
.
flags
=
IORESOURCE_IRQ
,
},
};
static
u64
udc_dma_mask
=
~
(
u32
)
0
;
static
struct
platform_device
udc_device
=
{
.
name
=
"pxa2xx_udc"
,
.
id
=
0
,
.
resource
=
pxa2xx_udc_resources
,
.
num_resources
=
ARRAY_SIZE
(
pxa2xx_udc_resources
),
.
dev
=
{
.
platform_data
=
&
pxa_udc_info
,
.
dma_mask
=
&
udc_dma_mask
,
}
};
static
struct
platform_device
*
devices
[]
__initdata
=
{
&
pxamci_device
,
&
udc_device
,
};
static
int
__init
pxa_init
(
void
)
{
return
platform_add_devices
(
devices
,
ARRAY_SIZE
(
devices
));
}
subsys_initcall
(
pxa_init
);
arch/arm/mach-pxa/idp.c
View file @
1c23361e
...
@@ -54,14 +54,11 @@ unsigned int idp_control_port_shadow = ((0x7 << 21) | /* LCD power */
...
@@ -54,14 +54,11 @@ unsigned int idp_control_port_shadow = ((0x7 << 21) | /* LCD power */
#endif
#endif
static
int
__init
idp_init
(
void
)
static
void
__init
idp_init
(
void
)
{
{
printk
(
"idp_init()
\n
"
);
printk
(
"idp_init()
\n
"
);
return
0
;
}
}
__initcall
(
idp_init
);
static
void
__init
idp_init_irq
(
void
)
static
void
__init
idp_init_irq
(
void
)
{
{
pxa_init_irq
();
pxa_init_irq
();
...
@@ -119,4 +116,5 @@ MACHINE_START(PXA_IDP, "Accelent Xscale IDP")
...
@@ -119,4 +116,5 @@ MACHINE_START(PXA_IDP, "Accelent Xscale IDP")
BOOT_MEM
(
0xa0000000
,
0x40000000
,
0xfc000000
)
BOOT_MEM
(
0xa0000000
,
0x40000000
,
0xfc000000
)
MAPIO
(
idp_map_io
)
MAPIO
(
idp_map_io
)
INITIRQ
(
idp_init_irq
)
INITIRQ
(
idp_init_irq
)
INIT_MACHINE
(
idp_init
)
MACHINE_END
MACHINE_END
arch/arm/mach-pxa/lubbock.c
View file @
1c23361e
...
@@ -29,6 +29,7 @@
...
@@ -29,6 +29,7 @@
#include <asm/mach/irq.h>
#include <asm/mach/irq.h>
#include <asm/arch/irq.h>
#include <asm/arch/irq.h>
#include <asm/arch/udc.h>
#include <asm/hardware/sa1111.h>
#include <asm/hardware/sa1111.h>
#include "generic.h"
#include "generic.h"
...
@@ -88,6 +89,16 @@ static void __init lubbock_init_irq(void)
...
@@ -88,6 +89,16 @@ static void __init lubbock_init_irq(void)
set_irq_type
(
IRQ_GPIO
(
0
),
IRQT_FALLING
);
set_irq_type
(
IRQ_GPIO
(
0
),
IRQT_FALLING
);
}
}
static
int
lubbock_udc_is_connected
(
void
)
{
return
(
LUB_MISC_RD
&
(
1
<<
9
))
==
0
;
}
static
struct
pxa2xx_udc_mach_info
udc_info
__initdata
=
{
.
udc_is_connected
=
lubbock_udc_is_connected
,
// no D+ pullup; lubbock can't connect/disconnect in software
};
static
struct
resource
sa1111_resources
[]
=
{
static
struct
resource
sa1111_resources
[]
=
{
[
0
]
=
{
[
0
]
=
{
.
start
=
0x10000000
,
.
start
=
0x10000000
,
...
@@ -112,13 +123,12 @@ static struct platform_device *devices[] __initdata = {
...
@@ -112,13 +123,12 @@ static struct platform_device *devices[] __initdata = {
&
sa1111_device
,
&
sa1111_device
,
};
};
static
int
__init
lubbock_init
(
void
)
static
void
__init
lubbock_init
(
void
)
{
{
return
platform_add_devices
(
devices
,
ARRAY_SIZE
(
devices
));
pxa_set_udc_info
(
&
udc_info
);
(
void
)
platform_add_devices
(
devices
,
ARRAY_SIZE
(
devices
));
}
}
subsys_initcall
(
lubbock_init
);
static
struct
map_desc
lubbock_io_desc
[]
__initdata
=
{
static
struct
map_desc
lubbock_io_desc
[]
__initdata
=
{
/* virtual physical length type */
/* virtual physical length type */
{
0xf0000000
,
0x08000000
,
0x00100000
,
MT_DEVICE
},
/* CPLD */
{
0xf0000000
,
0x08000000
,
0x00100000
,
MT_DEVICE
},
/* CPLD */
...
@@ -157,4 +167,5 @@ MACHINE_START(LUBBOCK, "Intel DBPXA250 Development Platform")
...
@@ -157,4 +167,5 @@ MACHINE_START(LUBBOCK, "Intel DBPXA250 Development Platform")
BOOT_MEM
(
0xa0000000
,
0x40000000
,
io_p2v
(
0x40000000
))
BOOT_MEM
(
0xa0000000
,
0x40000000
,
io_p2v
(
0x40000000
))
MAPIO
(
lubbock_map_io
)
MAPIO
(
lubbock_map_io
)
INITIRQ
(
lubbock_init_irq
)
INITIRQ
(
lubbock_init_irq
)
INIT_MACHINE
(
lubbock_init
)
MACHINE_END
MACHINE_END
arch/arm/mach-sa1100/Kconfig
View file @
1c23361e
...
@@ -37,9 +37,9 @@ config SA1100_CERF
...
@@ -37,9 +37,9 @@ config SA1100_CERF
bool "CerfBoard"
bool "CerfBoard"
depends on ARCH_SA1100
depends on ARCH_SA1100
help
help
The Intrinsyc CerfBoard is based on the StrongARM 1110.
The Intrinsyc CerfBoard is based on the StrongARM 1110
(Discontinued)
.
More information is available at:
More information is available at:
<http://www.intrinsyc.com/products/
referenceplatforms/cerfboard.html
>.
<http://www.intrinsyc.com/products/
cerfboard/
>.
Say Y if configuring for an Intrinsyc CerfBoard.
Say Y if configuring for an Intrinsyc CerfBoard.
Say N otherwise.
Say N otherwise.
...
@@ -60,15 +60,6 @@ config SA1100_CERF_FLASH_32MB
...
@@ -60,15 +60,6 @@ config SA1100_CERF_FLASH_32MB
endchoice
endchoice
config SA1100_CERF_CPLD
bool "Cerf w/CPLD support (CerfPDA)"
depends on SA1100_CERF
help
Say Y here to support the Linux CerfPDA development kit from
Intrinsyc. This is a StrongARM-1110-based reference platform for
designing custom PDAs. Product info is at
<http://www.intrinsyc.com/products/referencedesigns/cerfpda.asp>.
config SA1100_H3100
config SA1100_H3100
bool "Compaq iPAQ H3100"
bool "Compaq iPAQ H3100"
depends on ARCH_SA1100
depends on ARCH_SA1100
...
...
arch/arm/mach-sa1100/leds-cerf.c
View file @
1c23361e
...
@@ -19,24 +19,12 @@
...
@@ -19,24 +19,12 @@
static
unsigned
int
led_state
;
static
unsigned
int
led_state
;
static
unsigned
int
hw_led_state
;
static
unsigned
int
hw_led_state
;
#ifdef CONFIG_SA1100_CERF_CPLD
#define LED_D0 GPIO_GPIO(0)
#define LED_D1 GPIO_GPIO(0)
#define LED_D2 GPIO_GPIO(0)
#define LED_D3 GPIO_GPIO(0)
#define LED_MASK (LED_D0|LED_D1|LED_D2|LED_D3)
#else
#define LED_D0 GPIO_GPIO(0)
#define LED_D0 GPIO_GPIO(0)
#define LED_D1 GPIO_GPIO(1)
#define LED_D1 GPIO_GPIO(1)
#define LED_D2 GPIO_GPIO(2)
#define LED_D2 GPIO_GPIO(2)
#define LED_D3 GPIO_GPIO(3)
#define LED_D3 GPIO_GPIO(3)
#define LED_MASK (LED_D0|LED_D1|LED_D2|LED_D3)
#define LED_MASK (LED_D0|LED_D1|LED_D2|LED_D3)
#endif
void
cerf_leds_event
(
led_event_t
evt
)
void
cerf_leds_event
(
led_event_t
evt
)
{
{
unsigned
long
flags
;
unsigned
long
flags
;
...
...
arch/arm/mm/proc-arm720.S
View file @
1c23361e
...
@@ -126,6 +126,21 @@ ENTRY(cpu_arm720_reset)
...
@@ -126,6 +126,21 @@ ENTRY(cpu_arm720_reset)
__INIT
__INIT
.
type
__arm710_setup
,
#
function
__arm710_setup
:
mov
r0
,
#
0
mcr
p15
,
0
,
r0
,
c7
,
c7
,
0
@
invalidate
caches
mcr
p15
,
0
,
r0
,
c8
,
c7
,
0
@
flush
TLB
(
v4
)
mcr
p15
,
0
,
r4
,
c2
,
c0
@
load
page
table
pointer
mov
r0
,
#
0x1f
@
Domains
0
,
1
=
client
mcr
p15
,
0
,
r0
,
c3
,
c0
@
load
domain
access
register
mrc
p15
,
0
,
r0
,
c1
,
c0
@
get
control
register
bic
r0
,
r0
,
#
0x0e00
@
..
V
.
..
RS
BLDP
WCAM
orr
r0
,
r0
,
#
0x0100
@
....
....
.111
....
(
old
)
orr
r0
,
r0
,
#
0x003d
@
....
..01
..11
1101
(
new
)
mov
pc
,
lr
@
__ret
(
head
-
armv
.
S
)
.
size
__arm710_setup
,
.
-
__arm710_setup
.
type
__arm720_setup
,
#
function
.
type
__arm720_setup
,
#
function
__arm720_setup
:
mov
r0
,
#
0
__arm720_setup
:
mov
r0
,
#
0
mcr
p15
,
0
,
r0
,
c7
,
c7
,
0
@
invalidate
caches
mcr
p15
,
0
,
r0
,
c7
,
c7
,
0
@
invalidate
caches
...
@@ -169,6 +184,11 @@ cpu_arch_name: .asciz "armv4t"
...
@@ -169,6 +184,11 @@ cpu_arch_name: .asciz "armv4t"
cpu_elf_name
:
.
asciz
"v4"
cpu_elf_name
:
.
asciz
"v4"
.
size
cpu_elf_name
,
.
-
cpu_elf_name
.
size
cpu_elf_name
,
.
-
cpu_elf_name
.
type
cpu_arm710_name
,
#
object
cpu_arm710_name
:
.
asciz
"ARM710T"
.
size
cpu_arm710_name
,
.
-
cpu_arm710_name
.
type
cpu_arm720_name
,
#
object
.
type
cpu_arm720_name
,
#
object
cpu_arm720_name
:
cpu_arm720_name
:
.
asciz
"ARM720T"
.
asciz
"ARM720T"
...
@@ -182,6 +202,22 @@ cpu_arm720_name:
...
@@ -182,6 +202,22 @@ cpu_arm720_name:
.
section
".proc.info"
,
#
alloc
,
#
execinstr
.
section
".proc.info"
,
#
alloc
,
#
execinstr
.
type
__arm710_proc_info
,
#
object
__arm710_proc_info
:
.
long
0x41807100
@
cpu_val
.
long
0xffffff00
@
cpu_mask
.
long
0x00000c1e
@
section_mmu_flags
b
__arm710_setup
@
cpu_flush
.
long
cpu_arch_name
@
arch_name
.
long
cpu_elf_name
@
elf_name
.
long
HWCAP_SWP
| HWCAP_HALF |
HWCAP_THUMB
@
elf_hwcap
.
long
cpu_arm710_name
@
name
.
long
arm720_processor_functions
.
long
v4_tlb_fns
.
long
v4wt_user_fns
.
long
v4_cache_fns
.
size
__arm710_proc_info
,
.
-
__arm710_proc_info
.
type
__arm720_proc_info
,
#
object
.
type
__arm720_proc_info
,
#
object
__arm720_proc_info
:
__arm720_proc_info
:
.
long
0x41807200
@
cpu_val
.
long
0x41807200
@
cpu_val
...
...
drivers/usb/gadget/pxa2xx_udc.c
0 → 100644
View file @
1c23361e
/*
* linux/drivers/usb/gadget/pxa2xx_udc.c
* Intel PXA2xx on-chip full speed USB device controllers
*
* Copyright (C) 2002 Intrinsyc, Inc. (Frank Becker)
* Copyright (C) 2003 Robert Schwebel, Pengutronix
* Copyright (C) 2003 Benedikt Spranger, Pengutronix
* Copyright (C) 2003 David Brownell
* Copyright (C) 2003 Joshua Wise
*
* 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
*
*/
#undef DEBUG
// #define VERBOSE DBG_VERBOSE
#include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/ioport.h>
#include <linux/types.h>
#include <linux/version.h>
#include <linux/errno.h>
#include <linux/delay.h>
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/init.h>
#include <linux/timer.h>
#include <linux/list.h>
#include <linux/interrupt.h>
#include <linux/proc_fs.h>
#include <linux/mm.h>
#include <linux/device.h>
#include <linux/dma-mapping.h>
#include <asm/byteorder.h>
#include <asm/dma.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/system.h>
#include <asm/unaligned.h>
#include <asm/hardware.h>
#include <linux/usb_ch9.h>
#include <linux/usb_gadget.h>
#include <asm/arch/udc.h>
#include "pxa2xx_udc.h"
/*
* This driver handles the USB Device Controller (UDC) in Intel's PXA 2xx
* series processors. The UDC for the IXP 4xx series is very similar.
*
* Such controller drivers work with a gadget driver. The gadget driver
* returns descriptors, implements configuration and data protocols used
* by the host to interact with this device, and allocates endpoints to
* the different protocol interfaces. The controller driver virtualizes
* usb hardware so that the gadget drivers will be more portable.
*
* This UDC hardware wants to implement a bit too much USB protocol, so
* it constrains the sorts of USB configuration change events that work.
* The errata for these chips are misleading; some "fixed" bugs from
* pxa250 a0/a1 b0/b1/b2 sure act like they're still there.
*/
#define DRIVER_VERSION "7-Nov-2003"
#define DRIVER_DESC "PXA 2xx USB Device Controller driver"
static
const
char
driver_name
[]
=
"pxa2xx_udc"
;
static
const
char
ep0name
[]
=
"ep0"
;
// #define USE_DMA
// #define USE_OUT_DMA
// #define DISABLE_TEST_MODE
#ifdef CONFIG_PROC_FS
#define UDC_PROC_FILE
#endif
#ifdef CONFIG_EMBEDDED
/* few strings, and little code to use them */
#undef DEBUG
#undef UDC_PROC_FILE
#endif
#ifdef USE_DMA
static
int
use_dma
=
1
;
MODULE_PARM
(
use_dma
,
"i"
);
MODULE_PARM_DESC
(
use_dma
,
"true to use dma"
);
static
void
dma_nodesc_handler
(
int
dmach
,
void
*
_ep
,
struct
pt_regs
*
r
);
static
void
kick_dma
(
struct
pxa2xx_ep
*
ep
,
struct
pxa2xx_request
*
req
);
#ifdef USE_OUT_DMA
#define DMASTR " (dma support)"
#else
#define DMASTR " (dma in)"
#endif
#else
/* !USE_DMA */
#define DMASTR " (pio only)"
#undef USE_OUT_DMA
#endif
#ifdef CONFIG_USB_PXA2XX_SMALL
#define SIZE_STR " (small)"
#else
#define SIZE_STR ""
#endif
#ifdef DISABLE_TEST_MODE
/* (mode == 0) == no undocumented chip tweaks
* (mode & 1) == double buffer bulk IN
* (mode & 2) == double buffer bulk OUT
* ... so mode = 3 (or 7, 15, etc) does it for both
*/
static
ushort
fifo_mode
=
0
;
MODULE_PARM
(
fifo_mode
,
"h"
);
MODULE_PARM_DESC
(
fifo_mode
,
"pxa2xx udc fifo mode"
);
#endif
/* ---------------------------------------------------------------------------
* endpoint related parts of the api to the usb controller hardware,
* used by gadget driver; and the inner talker-to-hardware core.
* ---------------------------------------------------------------------------
*/
static
void
pxa2xx_ep_fifo_flush
(
struct
usb_ep
*
ep
);
static
void
nuke
(
struct
pxa2xx_ep
*
,
int
status
);
static
void
pio_irq_enable
(
int
bEndpointAddress
)
{
bEndpointAddress
&=
0xf
;
if
(
bEndpointAddress
<
8
)
UICR0
&=
~
(
1
<<
bEndpointAddress
);
else
{
bEndpointAddress
-=
8
;
UICR1
&=
~
(
1
<<
bEndpointAddress
);
}
}
static
void
pio_irq_disable
(
int
bEndpointAddress
)
{
bEndpointAddress
&=
0xf
;
if
(
bEndpointAddress
<
8
)
UICR0
|=
1
<<
bEndpointAddress
;
else
{
bEndpointAddress
-=
8
;
UICR1
|=
1
<<
bEndpointAddress
;
}
}
/* The UDCCR reg contains mask and interrupt status bits,
* so using '|=' isn't safe as it may ack an interrupt.
*/
#define UDCCR_MASK_BITS (UDCCR_REM | UDCCR_SRM | UDCCR_UDE)
static
inline
void
udc_set_mask_UDCCR
(
int
mask
)
{
UDCCR
=
(
UDCCR
&
UDCCR_MASK_BITS
)
|
(
mask
&
UDCCR_MASK_BITS
);
}
static
inline
void
udc_clear_mask_UDCCR
(
int
mask
)
{
UDCCR
=
(
UDCCR
&
UDCCR_MASK_BITS
)
&
~
(
mask
&
UDCCR_MASK_BITS
);
}
static
inline
void
udc_ack_int_UDCCR
(
int
mask
)
{
/* udccr contains the bits we dont want to change */
__u32
udccr
=
UDCCR
&
UDCCR_MASK_BITS
;
UDCCR
=
udccr
|
(
mask
&
~
UDCCR_MASK_BITS
);
}
/*
* endpoint enable/disable
*
* we need to verify the descriptors used to enable endpoints. since pxa2xx
* endpoint configurations are fixed, and are pretty much always enabled,
* there's not a lot to manage here.
*
* because pxa2xx can't selectively initialize bulk (or interrupt) endpoints,
* (resetting endpoint halt and toggle), SET_INTERFACE is unusable except
* for a single interface (with only the default altsetting) and for gadget
* drivers that don't halt endpoints (not reset by set_interface). that also
* means that if you use ISO, you must violate the USB spec rule that all
* iso endpoints must be in non-default altsettings.
*/
static
int
pxa2xx_ep_enable
(
struct
usb_ep
*
_ep
,
const
struct
usb_endpoint_descriptor
*
desc
)
{
struct
pxa2xx_ep
*
ep
;
struct
pxa2xx_udc
*
dev
;
ep
=
container_of
(
_ep
,
struct
pxa2xx_ep
,
ep
);
if
(
!
_ep
||
!
desc
||
ep
->
desc
||
_ep
->
name
==
ep0name
||
desc
->
bDescriptorType
!=
USB_DT_ENDPOINT
||
ep
->
bEndpointAddress
!=
desc
->
bEndpointAddress
||
ep
->
ep
.
maxpacket
<
desc
->
wMaxPacketSize
)
{
DMSG
(
"%s, bad ep or descriptor
\n
"
,
__FUNCTION__
);
return
-
EINVAL
;
}
/* xfer types must match, except that interrupt ~= bulk */
if
(
ep
->
bmAttributes
!=
desc
->
bmAttributes
&&
ep
->
bmAttributes
!=
USB_ENDPOINT_XFER_BULK
&&
desc
->
bmAttributes
!=
USB_ENDPOINT_XFER_INT
)
{
DMSG
(
"%s, %s type mismatch
\n
"
,
__FUNCTION__
,
_ep
->
name
);
return
-
EINVAL
;
}
/* hardware _could_ do smaller, but driver doesn't */
if
((
desc
->
bmAttributes
==
USB_ENDPOINT_XFER_BULK
&&
desc
->
wMaxPacketSize
!=
BULK_FIFO_SIZE
)
||
!
desc
->
wMaxPacketSize
)
{
DMSG
(
"%s, bad %s maxpacket
\n
"
,
__FUNCTION__
,
_ep
->
name
);
return
-
ERANGE
;
}
dev
=
ep
->
dev
;
if
(
!
dev
->
driver
||
dev
->
gadget
.
speed
==
USB_SPEED_UNKNOWN
)
{
DMSG
(
"%s, bogus device state
\n
"
,
__FUNCTION__
);
return
-
ESHUTDOWN
;
}
ep
->
desc
=
desc
;
ep
->
dma
=
-
1
;
ep
->
stopped
=
0
;
ep
->
pio_irqs
=
ep
->
dma_irqs
=
0
;
/* flush fifo (mostly for OUT buffers) */
pxa2xx_ep_fifo_flush
(
_ep
);
/* ... reset halt state too, if we could ... */
#ifdef USE_DMA
/* for (some) bulk and ISO endpoints, try to get a DMA channel and
* bind it to the endpoint. otherwise use PIO.
*/
switch
(
ep
->
bmAttributes
)
{
case
USB_ENDPOINT_XFER_ISOC
:
if
(
desc
->
wMaxPacketSize
%
32
)
break
;
// fall through
case
USB_ENDPOINT_XFER_BULK
:
if
(
!
use_dma
||
!
ep
->
reg_drcmr
)
break
;
ep
->
dma
=
pxa_request_dma
((
char
*
)
_ep
->
name
,
(
desc
->
wMaxPacketSize
>
64
)
?
DMA_PRIO_MEDIUM
/* some iso */
:
DMA_PRIO_LOW
,
dma_nodesc_handler
,
ep
);
if
(
ep
->
dma
>=
0
)
{
*
ep
->
reg_drcmr
=
DRCMR_MAPVLD
|
ep
->
dma
;
DMSG
(
"%s using dma%d
\n
"
,
_ep
->
name
,
ep
->
dma
);
}
}
#endif
DBG
(
DBG_VERBOSE
,
"enabled %s
\n
"
,
_ep
->
name
);
return
0
;
}
static
int
pxa2xx_ep_disable
(
struct
usb_ep
*
_ep
)
{
struct
pxa2xx_ep
*
ep
;
ep
=
container_of
(
_ep
,
struct
pxa2xx_ep
,
ep
);
if
(
!
_ep
||
!
ep
->
desc
)
{
DMSG
(
"%s, %s not enabled
\n
"
,
__FUNCTION__
,
_ep
?
ep
->
ep
.
name
:
NULL
);
return
-
EINVAL
;
}
nuke
(
ep
,
-
ESHUTDOWN
);
#ifdef USE_DMA
if
(
ep
->
dma
>=
0
)
{
*
ep
->
reg_drcmr
=
0
;
pxa_free_dma
(
ep
->
dma
);
ep
->
dma
=
-
1
;
}
#endif
/* flush fifo (mostly for IN buffers) */
pxa2xx_ep_fifo_flush
(
_ep
);
ep
->
desc
=
0
;
ep
->
stopped
=
1
;
DBG
(
DBG_VERBOSE
,
"%s disabled
\n
"
,
_ep
->
name
);
return
0
;
}
/*-------------------------------------------------------------------------*/
/* for the pxa2xx, these can just wrap kmalloc/kfree. gadget drivers
* must still pass correctly initialized endpoints, since other controller
* drivers may care about how it's currently set up (dma issues etc).
*/
/*
* pxa2xx_ep_alloc_request - allocate a request data structure
*/
static
struct
usb_request
*
pxa2xx_ep_alloc_request
(
struct
usb_ep
*
_ep
,
int
gfp_flags
)
{
struct
pxa2xx_request
*
req
;
req
=
kmalloc
(
sizeof
*
req
,
gfp_flags
);
if
(
!
req
)
return
0
;
memset
(
req
,
0
,
sizeof
*
req
);
INIT_LIST_HEAD
(
&
req
->
queue
);
return
&
req
->
req
;
}
/*
* pxa2xx_ep_free_request - deallocate a request data structure
*/
static
void
pxa2xx_ep_free_request
(
struct
usb_ep
*
_ep
,
struct
usb_request
*
_req
)
{
struct
pxa2xx_request
*
req
;
req
=
container_of
(
_req
,
struct
pxa2xx_request
,
req
);
WARN_ON
(
!
list_empty
(
&
req
->
queue
));
kfree
(
req
);
}
/* PXA cache needs flushing with DMA I/O (it's dma-incoherent), but there's
* no device-affinity and the heap works perfectly well for i/o buffers.
* It wastes much less memory than dma_alloc_coherent() would, and even
* prevents cacheline (32 bytes wide) sharing problems.
*/
static
void
*
pxa2xx_ep_alloc_buffer
(
struct
usb_ep
*
_ep
,
unsigned
bytes
,
dma_addr_t
*
dma
,
int
gfp_flags
)
{
char
*
retval
;
retval
=
kmalloc
(
bytes
,
gfp_flags
&
~
(
__GFP_DMA
|
__GFP_HIGHMEM
));
if
(
retval
)
*
dma
=
virt_to_bus
(
retval
);
return
retval
;
}
static
void
pxa2xx_ep_free_buffer
(
struct
usb_ep
*
_ep
,
void
*
buf
,
dma_addr_t
dma
,
unsigned
bytes
)
{
kfree
(
buf
);
}
/*-------------------------------------------------------------------------*/
/*
* done - retire a request; caller blocked irqs
*/
static
void
done
(
struct
pxa2xx_ep
*
ep
,
struct
pxa2xx_request
*
req
,
int
status
)
{
unsigned
stopped
=
ep
->
stopped
;
list_del_init
(
&
req
->
queue
);
if
(
likely
(
req
->
req
.
status
==
-
EINPROGRESS
))
req
->
req
.
status
=
status
;
else
status
=
req
->
req
.
status
;
if
(
status
&&
status
!=
-
ESHUTDOWN
)
DBG
(
DBG_VERBOSE
,
"complete %s req %p stat %d len %u/%u
\n
"
,
ep
->
ep
.
name
,
&
req
->
req
,
status
,
req
->
req
.
actual
,
req
->
req
.
length
);
/* don't modify queue heads during completion callback */
ep
->
stopped
=
1
;
req
->
req
.
complete
(
&
ep
->
ep
,
&
req
->
req
);
ep
->
stopped
=
stopped
;
}
static
inline
void
ep0_idle
(
struct
pxa2xx_udc
*
dev
)
{
dev
->
ep0state
=
EP0_IDLE
;
LED_EP0_OFF
;
}
static
int
write_packet
(
volatile
u32
*
uddr
,
struct
pxa2xx_request
*
req
,
unsigned
max
)
{
u8
*
buf
;
unsigned
length
,
count
;
buf
=
req
->
req
.
buf
+
req
->
req
.
actual
;
prefetch
(
buf
);
/* how big will this packet be? */
length
=
min
(
req
->
req
.
length
-
req
->
req
.
actual
,
max
);
req
->
req
.
actual
+=
length
;
count
=
length
;
while
(
likely
(
count
--
))
*
uddr
=
*
buf
++
;
return
length
;
}
/*
* write to an IN endpoint fifo, as many packets as possible.
* irqs will use this to write the rest later.
* caller guarantees at least one packet buffer is ready (or a zlp).
*/
static
int
write_fifo
(
struct
pxa2xx_ep
*
ep
,
struct
pxa2xx_request
*
req
)
{
unsigned
max
;
max
=
ep
->
desc
->
wMaxPacketSize
;
do
{
unsigned
count
;
int
is_last
,
is_short
;
count
=
write_packet
(
ep
->
reg_uddr
,
req
,
max
);
/* last packet is usually short (or a zlp) */
if
(
unlikely
(
count
!=
max
))
is_last
=
is_short
=
1
;
else
{
if
(
likely
(
req
->
req
.
length
!=
req
->
req
.
actual
)
||
req
->
req
.
zero
)
is_last
=
0
;
else
is_last
=
1
;
/* interrupt/iso maxpacket may not fill the fifo */
is_short
=
unlikely
(
max
<
ep
->
ep
.
maxpacket
);
/* FIXME ep.maxpacket should be the current size,
* modified (for periodic endpoints) when the
* ep is enabled. do that, re-init as needed,
* and change maxpacket refs accordingly.
*/
}
DBG
(
DBG_VERY_NOISY
,
"wrote %s %d bytes%s%s %d left %p
\n
"
,
ep
->
ep
.
name
,
count
,
is_last
?
"/L"
:
""
,
is_short
?
"/S"
:
""
,
req
->
req
.
length
-
req
->
req
.
actual
,
req
);
/* let loose that packet. maybe try writing another one,
* double buffering might work. TSP, TPC, and TFS
* bit values are the same for all normal IN endpoints.
*/
*
ep
->
reg_udccs
=
UDCCS_BI_TPC
;
if
(
is_short
)
*
ep
->
reg_udccs
=
UDCCS_BI_TSP
;
/* requests complete when all IN data is in the FIFO */
if
(
is_last
)
{
done
(
ep
,
req
,
0
);
if
(
list_empty
(
&
ep
->
queue
)
||
unlikely
(
ep
->
dma
>=
0
))
{
pio_irq_disable
(
ep
->
bEndpointAddress
);
#ifdef USE_DMA
/* unaligned data and zlps couldn't use dma */
if
(
unlikely
(
!
list_empty
(
&
ep
->
queue
)))
{
req
=
list_entry
(
ep
->
queue
.
next
,
struct
pxa2xx_request
,
queue
);
kick_dma
(
ep
,
req
);
return
0
;
}
#endif
}
return
1
;
}
// TODO experiment: how robust can fifo mode tweaking be?
// double buffering is off in the default fifo mode, which
// prevents TFS from being set here.
}
while
(
*
ep
->
reg_udccs
&
UDCCS_BI_TFS
);
return
0
;
}
/* caller asserts req->pending (ep0 irq status nyet cleared); starts
* ep0 data stage. these chips want very simple state transitions.
*/
static
inline
void
ep0start
(
struct
pxa2xx_udc
*
dev
,
u32
flags
,
const
char
*
tag
)
{
UDCCS0
=
flags
|
UDCCS0_SA
|
UDCCS0_OPR
;
USIR0
=
USIR0_IR0
;
dev
->
req_pending
=
0
;
DBG
(
DBG_VERY_NOISY
,
"%s %s, %02x/%02x
\n
"
,
__FUNCTION__
,
tag
,
UDCCS0
,
flags
);
}
static
int
write_ep0_fifo
(
struct
pxa2xx_ep
*
ep
,
struct
pxa2xx_request
*
req
)
{
unsigned
count
;
int
is_short
;
count
=
write_packet
(
&
UDDR0
,
req
,
EP0_FIFO_SIZE
);
ep
->
dev
->
stats
.
write
.
bytes
+=
count
;
/* last packet "must be" short (or a zlp) */
is_short
=
(
count
!=
EP0_FIFO_SIZE
);
DBG
(
DBG_VERY_NOISY
,
"ep0in %d bytes %d left %p
\n
"
,
count
,
req
->
req
.
length
-
req
->
req
.
actual
,
req
);
if
(
unlikely
(
is_short
))
{
if
(
ep
->
dev
->
req_pending
)
ep0start
(
ep
->
dev
,
UDCCS0_IPR
,
"short IN"
);
else
UDCCS0
=
UDCCS0_IPR
;
count
=
req
->
req
.
length
;
done
(
ep
,
req
,
0
);
ep0_idle
(
ep
->
dev
);
#if 1
/* This seems to get rid of lost status irqs in some cases:
* host responds quickly, or next request involves config
* change automagic, or should have been hidden, or ...
*
* FIXME get rid of all udelays possible...
*/
if
(
count
>=
EP0_FIFO_SIZE
)
{
count
=
100
;
do
{
if
((
UDCCS0
&
UDCCS0_OPR
)
!=
0
)
{
/* clear OPR, generate ack */
UDCCS0
=
UDCCS0_OPR
;
break
;
}
count
--
;
udelay
(
1
);
}
while
(
count
);
}
#endif
}
else
if
(
ep
->
dev
->
req_pending
)
ep0start
(
ep
->
dev
,
0
,
"IN"
);
return
is_short
;
}
/*
* read_fifo - unload packet(s) from the fifo we use for usb OUT
* transfers and put them into the request. caller should have made
* sure there's at least one packet ready.
*
* returns true if the request completed because of short packet or the
* request buffer having filled (and maybe overran till end-of-packet).
*/
static
int
read_fifo
(
struct
pxa2xx_ep
*
ep
,
struct
pxa2xx_request
*
req
)
{
for
(;;)
{
u32
udccs
;
u8
*
buf
;
unsigned
bufferspace
,
count
,
is_short
;
/* make sure there's a packet in the FIFO.
* UDCCS_{BO,IO}_RPC are all the same bit value.
* UDCCS_{BO,IO}_RNE are all the same bit value.
*/
udccs
=
*
ep
->
reg_udccs
;
if
(
unlikely
((
udccs
&
UDCCS_BO_RPC
)
==
0
))
break
;
buf
=
req
->
req
.
buf
+
req
->
req
.
actual
;
prefetchw
(
buf
);
bufferspace
=
req
->
req
.
length
-
req
->
req
.
actual
;
/* read all bytes from this packet */
if
(
likely
(
udccs
&
UDCCS_BO_RNE
))
{
count
=
1
+
(
0x0ff
&
*
ep
->
reg_ubcr
);
req
->
req
.
actual
+=
min
(
count
,
bufferspace
);
}
else
/* zlp */
count
=
0
;
is_short
=
(
count
<
ep
->
desc
->
wMaxPacketSize
);
DBG
(
DBG_VERY_NOISY
,
"read %s %02x, %d bytes%s req %p %d/%d
\n
"
,
ep
->
ep
.
name
,
udccs
,
count
,
is_short
?
"/S"
:
""
,
req
,
req
->
req
.
actual
,
req
->
req
.
length
);
while
(
likely
(
count
--
!=
0
))
{
u8
byte
=
(
u8
)
*
ep
->
reg_uddr
;
if
(
unlikely
(
bufferspace
==
0
))
{
/* this happens when the driver's buffer
* is smaller than what the host sent.
* discard the extra data.
*/
if
(
req
->
req
.
status
!=
-
EOVERFLOW
)
DMSG
(
"%s overflow %d
\n
"
,
ep
->
ep
.
name
,
count
);
req
->
req
.
status
=
-
EOVERFLOW
;
}
else
{
*
buf
++
=
byte
;
bufferspace
--
;
}
}
*
ep
->
reg_udccs
=
UDCCS_BO_RPC
;
/* RPC/RSP/RNE could now reflect the other packet buffer */
/* iso is one request per packet */
if
(
ep
->
bmAttributes
==
USB_ENDPOINT_XFER_ISOC
)
{
if
(
udccs
&
UDCCS_IO_ROF
)
req
->
req
.
status
=
-
EHOSTUNREACH
;
/* more like "is_done" */
is_short
=
1
;
}
/* completion */
if
(
is_short
||
req
->
req
.
actual
==
req
->
req
.
length
)
{
done
(
ep
,
req
,
0
);
if
(
list_empty
(
&
ep
->
queue
))
pio_irq_disable
(
ep
->
bEndpointAddress
);
return
1
;
}
/* finished that packet. the next one may be waiting... */
}
return
0
;
}
/*
* special ep0 version of the above. no UBCR0 or double buffering; status
* handshaking is magic. most device protocols don't need control-OUT.
* CDC vendor commands (and RNDIS), mass storage CB/CBI, and some other
* protocols do use them.
*/
static
int
read_ep0_fifo
(
struct
pxa2xx_ep
*
ep
,
struct
pxa2xx_request
*
req
)
{
u8
*
buf
,
byte
;
unsigned
bufferspace
;
buf
=
req
->
req
.
buf
+
req
->
req
.
actual
;
bufferspace
=
req
->
req
.
length
-
req
->
req
.
actual
;
while
(
UDCCS0
&
UDCCS0_RNE
)
{
byte
=
(
u8
)
UDDR0
;
if
(
unlikely
(
bufferspace
==
0
))
{
/* this happens when the driver's buffer
* is smaller than what the host sent.
* discard the extra data.
*/
if
(
req
->
req
.
status
!=
-
EOVERFLOW
)
DMSG
(
"%s overflow
\n
"
,
ep
->
ep
.
name
);
req
->
req
.
status
=
-
EOVERFLOW
;
}
else
{
*
buf
++
=
byte
;
req
->
req
.
actual
++
;
bufferspace
--
;
}
}
UDCCS0
=
UDCCS0_OPR
|
UDCCS0_IPR
;
/* completion */
if
(
req
->
req
.
actual
>=
req
->
req
.
length
)
return
1
;
/* finished that packet. the next one may be waiting... */
return
0
;
}
#ifdef USE_DMA
#define MAX_IN_DMA ((DCMD_LENGTH + 1) - BULK_FIFO_SIZE)
static
void
start_dma_nodesc
(
struct
pxa2xx_ep
*
ep
,
struct
pxa2xx_request
*
req
,
int
is_in
)
{
u32
dcmd
=
req
->
req
.
length
;
u32
buf
=
req
->
req
.
dma
;
u32
fifo
=
io_v2p
((
u32
)
ep
->
reg_uddr
);
/* caller guarantees there's a packet or more remaining
* - IN may end with a short packet (TSP set separately),
* - OUT is always full length
*/
buf
+=
req
->
req
.
actual
;
dcmd
-=
req
->
req
.
actual
;
ep
->
dma_fixup
=
0
;
/* no-descriptor mode can be simple for bulk-in, iso-in, iso-out */
DCSR
(
ep
->
dma
)
=
DCSR_NODESC
;
if
(
is_in
)
{
DSADR
(
ep
->
dma
)
=
buf
;
DTADR
(
ep
->
dma
)
=
fifo
;
if
(
dcmd
>
MAX_IN_DMA
)
dcmd
=
MAX_IN_DMA
;
else
ep
->
dma_fixup
=
(
dcmd
%
ep
->
ep
.
maxpacket
)
!=
0
;
dcmd
|=
DCMD_BURST32
|
DCMD_WIDTH1
|
DCMD_FLOWTRG
|
DCMD_INCSRCADDR
;
}
else
{
#ifdef USE_OUT_DMA
DSADR
(
ep
->
dma
)
=
fifo
;
DTADR
(
ep
->
dma
)
=
buf
;
if
(
ep
->
bmAttributes
!=
USB_ENDPOINT_XFER_ISOC
)
dcmd
=
ep
->
ep
.
maxpacket
;
dcmd
|=
DCMD_BURST32
|
DCMD_WIDTH1
|
DCMD_FLOWSRC
|
DCMD_INCTRGADDR
;
#endif
}
DCMD
(
ep
->
dma
)
=
dcmd
;
DCSR
(
ep
->
dma
)
=
DCSR_RUN
|
DCSR_NODESC
|
(
unlikely
(
is_in
)
?
DCSR_STOPIRQEN
/* use dma_nodesc_handler() */
:
0
);
/* use handle_ep() */
}
static
void
kick_dma
(
struct
pxa2xx_ep
*
ep
,
struct
pxa2xx_request
*
req
)
{
int
is_in
=
ep
->
bEndpointAddress
&
USB_DIR_IN
;
if
(
is_in
)
{
/* unaligned tx buffers and zlps only work with PIO */
if
((
req
->
req
.
dma
&
0x0f
)
!=
0
||
unlikely
((
req
->
req
.
length
-
req
->
req
.
actual
)
==
0
))
{
pio_irq_enable
(
ep
->
bEndpointAddress
);
if
((
*
ep
->
reg_udccs
&
UDCCS_BI_TFS
)
!=
0
)
(
void
)
write_fifo
(
ep
,
req
);
}
else
{
start_dma_nodesc
(
ep
,
req
,
USB_DIR_IN
);
}
}
else
{
if
((
req
->
req
.
length
-
req
->
req
.
actual
)
<
ep
->
ep
.
maxpacket
)
{
DMSG
(
"%s short dma read...
\n
"
,
ep
->
ep
.
name
);
/* we're always set up for pio out */
read_fifo
(
ep
,
req
);
}
else
{
*
ep
->
reg_udccs
=
UDCCS_BO_DME
|
(
*
ep
->
reg_udccs
&
UDCCS_BO_FST
);
start_dma_nodesc
(
ep
,
req
,
USB_DIR_OUT
);
}
}
}
static
void
cancel_dma
(
struct
pxa2xx_ep
*
ep
)
{
struct
pxa2xx_request
*
req
;
u32
tmp
;
if
(
DCSR
(
ep
->
dma
)
==
0
||
list_empty
(
&
ep
->
queue
))
return
;
DCSR
(
ep
->
dma
)
=
0
;
while
((
DCSR
(
ep
->
dma
)
&
DCSR_STOPSTATE
)
==
0
)
cpu_relax
();
req
=
list_entry
(
ep
->
queue
.
next
,
struct
pxa2xx_request
,
queue
);
tmp
=
DCMD
(
ep
->
dma
)
&
DCMD_LENGTH
;
req
->
req
.
actual
=
req
->
req
.
length
-
(
tmp
&
DCMD_LENGTH
);
/* the last tx packet may be incomplete, so flush the fifo.
* FIXME correct req.actual if we can
*/
if
(
ep
->
bEndpointAddress
&
USB_DIR_IN
)
*
ep
->
reg_udccs
=
UDCCS_BI_FTF
;
}
/* dma channel stopped ... normal tx end (IN), or on error (IN/OUT) */
static
void
dma_nodesc_handler
(
int
dmach
,
void
*
_ep
,
struct
pt_regs
*
r
)
{
struct
pxa2xx_ep
*
ep
=
_ep
;
struct
pxa2xx_request
*
req
;
u32
tmp
,
completed
;
local_irq_disable
();
req
=
list_entry
(
ep
->
queue
.
next
,
struct
pxa2xx_request
,
queue
);
ep
->
dma_irqs
++
;
ep
->
dev
->
stats
.
irqs
++
;
HEX_DISPLAY
(
ep
->
dev
->
stats
.
irqs
);
/* ack/clear */
tmp
=
DCSR
(
ep
->
dma
);
DCSR
(
ep
->
dma
)
=
tmp
;
if
((
tmp
&
DCSR_STOPSTATE
)
==
0
||
(
DDADR
(
ep
->
dma
)
&
DDADR_STOP
)
!=
0
)
{
DBG
(
DBG_VERBOSE
,
"%s, dcsr %08x ddadr %08x
\n
"
,
ep
->
ep
.
name
,
DCSR
(
ep
->
dma
),
DDADR
(
ep
->
dma
));
goto
done
;
}
DCSR
(
ep
->
dma
)
=
0
;
/* clear DCSR_STOPSTATE */
/* update transfer status */
completed
=
tmp
&
DCSR_BUSERR
;
if
(
ep
->
bEndpointAddress
&
USB_DIR_IN
)
tmp
=
DSADR
(
ep
->
dma
);
else
tmp
=
DTADR
(
ep
->
dma
);
req
->
req
.
actual
=
tmp
-
req
->
req
.
dma
;
/* FIXME seems we sometimes see partial transfers... */
if
(
unlikely
(
completed
!=
0
))
req
->
req
.
status
=
-
EIO
;
else
if
(
req
->
req
.
actual
)
{
/* these registers have zeroes in low bits; they miscount
* some (end-of-transfer) short packets: tx 14 as tx 12
*/
if
(
ep
->
dma_fixup
)
req
->
req
.
actual
=
min
(
req
->
req
.
actual
+
3
,
req
->
req
.
length
);
tmp
=
(
req
->
req
.
length
-
req
->
req
.
actual
);
completed
=
(
tmp
==
0
);
if
(
completed
&&
(
ep
->
bEndpointAddress
&
USB_DIR_IN
))
{
/* maybe validate final short packet ... */
if
((
req
->
req
.
actual
%
ep
->
ep
.
maxpacket
)
!=
0
)
*
ep
->
reg_udccs
=
UDCCS_BI_TSP
/*|UDCCS_BI_TPC*/
;
/* ... or zlp, using pio fallback */
else
if
(
ep
->
bmAttributes
==
USB_ENDPOINT_XFER_BULK
&&
req
->
req
.
zero
)
{
DMSG
(
"%s zlp terminate ...
\n
"
,
ep
->
ep
.
name
);
completed
=
0
;
}
}
}
if
(
likely
(
completed
))
{
done
(
ep
,
req
,
0
);
/* maybe re-activate after completion */
if
(
ep
->
stopped
||
list_empty
(
&
ep
->
queue
))
goto
done
;
req
=
list_entry
(
ep
->
queue
.
next
,
struct
pxa2xx_request
,
queue
);
}
kick_dma
(
ep
,
req
);
done:
local_irq_enable
();
}
#endif
/*-------------------------------------------------------------------------*/
static
int
pxa2xx_ep_queue
(
struct
usb_ep
*
_ep
,
struct
usb_request
*
_req
,
int
gfp_flags
)
{
struct
pxa2xx_request
*
req
;
struct
pxa2xx_ep
*
ep
;
struct
pxa2xx_udc
*
dev
;
unsigned
long
flags
;
req
=
container_of
(
_req
,
struct
pxa2xx_request
,
req
);
if
(
unlikely
(
!
_req
||
!
_req
->
complete
||
!
_req
->
buf
||
!
list_empty
(
&
req
->
queue
)))
{
DMSG
(
"%s, bad params
\n
"
,
__FUNCTION__
);
return
-
EINVAL
;
}
ep
=
container_of
(
_ep
,
struct
pxa2xx_ep
,
ep
);
if
(
unlikely
(
!
_ep
||
(
!
ep
->
desc
&&
ep
->
ep
.
name
!=
ep0name
)))
{
DMSG
(
"%s, bad ep
\n
"
,
__FUNCTION__
);
return
-
EINVAL
;
}
dev
=
ep
->
dev
;
if
(
unlikely
(
!
dev
->
driver
||
dev
->
gadget
.
speed
==
USB_SPEED_UNKNOWN
))
{
DMSG
(
"%s, bogus device state
\n
"
,
__FUNCTION__
);
return
-
ESHUTDOWN
;
}
/* iso is always one packet per request, that's the only way
* we can report per-packet status. that also helps with dma.
*/
if
(
unlikely
(
ep
->
bmAttributes
==
USB_ENDPOINT_XFER_ISOC
&&
req
->
req
.
length
>
ep
->
desc
->
wMaxPacketSize
))
return
-
EMSGSIZE
;
#ifdef USE_DMA
// FIXME caller may already have done the dma mapping
if
(
ep
->
dma
>=
0
)
{
_req
->
dma
=
dma_map_single
(
&
dev
->
dev
.
dev
,
_req
->
buf
,
_req
->
length
,
((
ep
->
bEndpointAddress
&
USB_DIR_IN
)
!=
0
)
?
DMA_TO_DEVICE
:
DMA_FROM_DEVICE
);
}
#endif
DBG
(
DBG_NOISY
,
"%s queue req %p, len %d buf %p
\n
"
,
_ep
->
name
,
_req
,
_req
->
length
,
_req
->
buf
);
local_irq_save
(
flags
);
_req
->
status
=
-
EINPROGRESS
;
_req
->
actual
=
0
;
/* kickstart this i/o queue? */
if
(
list_empty
(
&
ep
->
queue
)
&&
!
ep
->
stopped
)
{
if
(
ep
->
desc
==
0
/* ep0 */
)
{
unsigned
length
=
_req
->
length
;
switch
(
dev
->
ep0state
)
{
case
EP0_IN_DATA_PHASE
:
dev
->
stats
.
write
.
ops
++
;
if
(
write_ep0_fifo
(
ep
,
req
))
req
=
0
;
break
;
case
EP0_OUT_DATA_PHASE
:
dev
->
stats
.
read
.
ops
++
;
/* messy ... */
if
(
dev
->
req_config
)
{
DBG
(
DBG_VERBOSE
,
"ep0 config ack%s
\n
"
,
dev
->
has_cfr
?
""
:
" raced"
);
if
(
dev
->
has_cfr
)
UDCCFR
=
UDCCFR_AREN
|
UDCCFR_ACM
;
done
(
ep
,
req
,
0
);
dev
->
ep0state
=
EP0_END_XFER
;
return
0
;
}
if
(
dev
->
req_pending
)
ep0start
(
dev
,
UDCCS0_IPR
,
"OUT"
);
if
(
length
==
0
||
((
UDCCS0
&
UDCCS0_RNE
)
!=
0
&&
read_ep0_fifo
(
ep
,
req
)))
{
ep0_idle
(
dev
);
done
(
ep
,
req
,
0
);
req
=
0
;
}
break
;
default:
DMSG
(
"ep0 i/o, odd state %d
\n
"
,
dev
->
ep0state
);
local_irq_restore
(
flags
);
return
-
EL2HLT
;
}
#ifdef USE_DMA
/* either start dma or prime pio pump */
}
else
if
(
ep
->
dma
>=
0
)
{
kick_dma
(
ep
,
req
);
#endif
/* can the FIFO can satisfy the request immediately? */
}
else
if
((
ep
->
bEndpointAddress
&
USB_DIR_IN
)
!=
0
&&
(
*
ep
->
reg_udccs
&
UDCCS_BI_TFS
)
!=
0
&&
write_fifo
(
ep
,
req
))
{
req
=
0
;
}
else
if
((
*
ep
->
reg_udccs
&
UDCCS_BO_RFS
)
!=
0
&&
read_fifo
(
ep
,
req
))
{
req
=
0
;
}
if
(
likely
(
req
&&
ep
->
desc
)
&&
ep
->
dma
<
0
)
pio_irq_enable
(
ep
->
bEndpointAddress
);
}
/* pio or dma irq handler advances the queue. */
if
(
likely
(
req
!=
0
))
list_add_tail
(
&
req
->
queue
,
&
ep
->
queue
);
local_irq_restore
(
flags
);
return
0
;
}
/*
* nuke - dequeue ALL requests
*/
static
void
nuke
(
struct
pxa2xx_ep
*
ep
,
int
status
)
{
struct
pxa2xx_request
*
req
;
/* called with irqs blocked */
#ifdef USE_DMA
if
(
ep
->
dma
>=
0
&&
!
ep
->
stopped
)
cancel_dma
(
ep
);
#endif
while
(
!
list_empty
(
&
ep
->
queue
))
{
req
=
list_entry
(
ep
->
queue
.
next
,
struct
pxa2xx_request
,
queue
);
done
(
ep
,
req
,
status
);
}
if
(
ep
->
desc
)
pio_irq_disable
(
ep
->
bEndpointAddress
);
}
/* dequeue JUST ONE request */
static
int
pxa2xx_ep_dequeue
(
struct
usb_ep
*
_ep
,
struct
usb_request
*
_req
)
{
struct
pxa2xx_ep
*
ep
;
struct
pxa2xx_request
*
req
;
unsigned
long
flags
;
ep
=
container_of
(
_ep
,
struct
pxa2xx_ep
,
ep
);
req
=
container_of
(
_req
,
struct
pxa2xx_request
,
req
);
if
(
!
_ep
||
!
_req
||
ep
->
ep
.
name
==
ep0name
)
return
-
EINVAL
;
local_irq_save
(
flags
);
#ifdef USE_DMA
if
(
ep
->
dma
>=
0
&&
ep
->
queue
.
next
==
&
req
->
queue
&&
!
ep
->
stopped
)
{
cancel_dma
(
ep
);
done
(
ep
,
req
,
-
ECONNRESET
);
/* restart i/o */
if
(
!
list_empty
(
&
ep
->
queue
))
{
req
=
list_entry
(
ep
->
queue
.
next
,
struct
pxa2xx_request
,
queue
);
kick_dma
(
ep
,
req
);
}
}
else
#endif
if
(
!
list_empty
(
&
req
->
queue
))
done
(
ep
,
req
,
-
ECONNRESET
);
else
req
=
0
;
local_irq_restore
(
flags
);
return
req
?
0
:
-
EOPNOTSUPP
;
}
/*-------------------------------------------------------------------------*/
static
int
pxa2xx_ep_set_halt
(
struct
usb_ep
*
_ep
,
int
value
)
{
struct
pxa2xx_ep
*
ep
;
unsigned
long
flags
;
ep
=
container_of
(
_ep
,
struct
pxa2xx_ep
,
ep
);
if
(
unlikely
(
!
_ep
||
(
!
ep
->
desc
&&
ep
->
ep
.
name
!=
ep0name
))
||
ep
->
bmAttributes
==
USB_ENDPOINT_XFER_ISOC
)
{
DMSG
(
"%s, bad ep
\n
"
,
__FUNCTION__
);
return
-
EINVAL
;
}
if
(
value
==
0
)
{
/* this path (reset toggle+halt) is needed to implement
* SET_INTERFACE on normal hardware. but it can't be
* done from software on the PXA UDC, and the hardware
* forgets to do it as part of SET_INTERFACE automagic.
*/
DMSG
(
"only host can clear %s halt
\n
"
,
_ep
->
name
);
return
-
EROFS
;
}
local_irq_save
(
flags
);
if
((
ep
->
bEndpointAddress
&
USB_DIR_IN
)
!=
0
&&
((
*
ep
->
reg_udccs
&
UDCCS_BI_TFS
)
==
0
||
!
list_empty
(
&
ep
->
queue
)))
{
local_irq_restore
(
flags
);
return
-
EAGAIN
;
}
/* FST bit is the same for control, bulk in, bulk out, interrupt in */
*
ep
->
reg_udccs
=
UDCCS_BI_FST
|
UDCCS_BI_FTF
;
/* ep0 needs special care */
if
(
!
ep
->
desc
)
{
start_watchdog
(
ep
->
dev
);
ep
->
dev
->
req_pending
=
0
;
ep
->
dev
->
ep0state
=
EP0_STALL
;
LED_EP0_OFF
;
/* and bulk/intr endpoints like dropping stalls too */
}
else
{
unsigned
i
;
for
(
i
=
0
;
i
<
1000
;
i
+=
20
)
{
if
(
*
ep
->
reg_udccs
&
UDCCS_BI_SST
)
break
;
udelay
(
20
);
}
}
local_irq_restore
(
flags
);
DBG
(
DBG_VERBOSE
,
"%s halt
\n
"
,
_ep
->
name
);
return
0
;
}
static
int
pxa2xx_ep_fifo_status
(
struct
usb_ep
*
_ep
)
{
struct
pxa2xx_ep
*
ep
;
ep
=
container_of
(
_ep
,
struct
pxa2xx_ep
,
ep
);
if
(
!
_ep
)
{
DMSG
(
"%s, bad ep
\n
"
,
__FUNCTION__
);
return
-
ENODEV
;
}
/* pxa can't report unclaimed bytes from IN fifos */
if
((
ep
->
bEndpointAddress
&
USB_DIR_IN
)
!=
0
)
return
-
EOPNOTSUPP
;
if
(
ep
->
dev
->
gadget
.
speed
==
USB_SPEED_UNKNOWN
||
(
*
ep
->
reg_udccs
&
UDCCS_BO_RFS
)
==
0
)
return
0
;
else
return
(
*
ep
->
reg_ubcr
&
0xfff
)
+
1
;
}
static
void
pxa2xx_ep_fifo_flush
(
struct
usb_ep
*
_ep
)
{
struct
pxa2xx_ep
*
ep
;
ep
=
container_of
(
_ep
,
struct
pxa2xx_ep
,
ep
);
if
(
!
_ep
||
ep
->
ep
.
name
==
ep0name
||
!
list_empty
(
&
ep
->
queue
))
{
DMSG
(
"%s, bad ep
\n
"
,
__FUNCTION__
);
return
;
}
/* toggle and halt bits stay unchanged */
/* for OUT, just read and discard the FIFO contents. */
if
((
ep
->
bEndpointAddress
&
USB_DIR_IN
)
==
0
)
{
while
(((
*
ep
->
reg_udccs
)
&
UDCCS_BO_RNE
)
!=
0
)
(
void
)
*
ep
->
reg_uddr
;
return
;
}
/* most IN status is the same, but ISO can't stall */
*
ep
->
reg_udccs
=
UDCCS_BI_TPC
|
UDCCS_BI_FTF
|
UDCCS_BI_TUR
|
(
ep
->
bmAttributes
==
USB_ENDPOINT_XFER_ISOC
)
?
0
:
UDCCS_BI_SST
;
}
static
struct
usb_ep_ops
pxa2xx_ep_ops
=
{
.
enable
=
pxa2xx_ep_enable
,
.
disable
=
pxa2xx_ep_disable
,
.
alloc_request
=
pxa2xx_ep_alloc_request
,
.
free_request
=
pxa2xx_ep_free_request
,
.
alloc_buffer
=
pxa2xx_ep_alloc_buffer
,
.
free_buffer
=
pxa2xx_ep_free_buffer
,
.
queue
=
pxa2xx_ep_queue
,
.
dequeue
=
pxa2xx_ep_dequeue
,
.
set_halt
=
pxa2xx_ep_set_halt
,
.
fifo_status
=
pxa2xx_ep_fifo_status
,
.
fifo_flush
=
pxa2xx_ep_fifo_flush
,
};
/* ---------------------------------------------------------------------------
* device-scoped parts of the api to the usb controller hardware
* ---------------------------------------------------------------------------
*/
static
int
pxa2xx_udc_get_frame
(
struct
usb_gadget
*
_gadget
)
{
return
((
UFNRH
&
0x07
)
<<
8
)
|
(
UFNRL
&
0xff
);
}
static
int
pxa2xx_udc_wakeup
(
struct
usb_gadget
*
_gadget
)
{
/* host may not have enabled remote wakeup */
if
((
UDCCS0
&
UDCCS0_DRWF
)
==
0
)
return
-
EHOSTUNREACH
;
udc_set_mask_UDCCR
(
UDCCR_RSM
);
return
0
;
}
static
const
struct
usb_gadget_ops
pxa2xx_udc_ops
=
{
.
get_frame
=
pxa2xx_udc_get_frame
,
.
wakeup
=
pxa2xx_udc_wakeup
,
// current versions must always be self-powered
};
/*-------------------------------------------------------------------------*/
#ifdef UDC_PROC_FILE
static
const
char
proc_node_name
[]
=
"driver/udc"
;
static
int
udc_proc_read
(
char
*
page
,
char
**
start
,
off_t
off
,
int
count
,
int
*
eof
,
void
*
_dev
)
{
char
*
buf
=
page
;
struct
pxa2xx_udc
*
dev
=
_dev
;
char
*
next
=
buf
;
unsigned
size
=
count
;
unsigned
long
flags
;
int
i
,
t
;
u32
tmp
;
if
(
off
!=
0
)
return
0
;
local_irq_save
(
flags
);
/* basic device status */
t
=
snprintf
(
next
,
size
,
DRIVER_DESC
"
\n
"
"%s version: %s
\n
Gadget driver: %s
\n
Host %s
\n\n
"
,
driver_name
,
DRIVER_VERSION
SIZE_STR
DMASTR
,
dev
->
driver
?
dev
->
driver
->
driver
.
name
:
"(none)"
,
is_usb_connected
()
?
"full speed"
:
"disconnected"
);
size
-=
t
;
next
+=
t
;
/* registers for device and ep0 */
t
=
snprintf
(
next
,
size
,
"uicr %02X.%02X, usir %02X.%02x, ufnr %02X.%02X
\n
"
,
UICR1
,
UICR0
,
USIR1
,
USIR0
,
UFNRH
,
UFNRL
);
size
-=
t
;
next
+=
t
;
tmp
=
UDCCR
;
t
=
snprintf
(
next
,
size
,
"udccr %02X =%s%s%s%s%s%s%s%s
\n
"
,
tmp
,
(
tmp
&
UDCCR_REM
)
?
" rem"
:
""
,
(
tmp
&
UDCCR_RSTIR
)
?
" rstir"
:
""
,
(
tmp
&
UDCCR_SRM
)
?
" srm"
:
""
,
(
tmp
&
UDCCR_SUSIR
)
?
" susir"
:
""
,
(
tmp
&
UDCCR_RESIR
)
?
" resir"
:
""
,
(
tmp
&
UDCCR_RSM
)
?
" rsm"
:
""
,
(
tmp
&
UDCCR_UDA
)
?
" uda"
:
""
,
(
tmp
&
UDCCR_UDE
)
?
" ude"
:
""
);
size
-=
t
;
next
+=
t
;
tmp
=
UDCCS0
;
t
=
snprintf
(
next
,
size
,
"udccs0 %02X =%s%s%s%s%s%s%s%s
\n
"
,
tmp
,
(
tmp
&
UDCCS0_SA
)
?
" sa"
:
""
,
(
tmp
&
UDCCS0_RNE
)
?
" rne"
:
""
,
(
tmp
&
UDCCS0_FST
)
?
" fst"
:
""
,
(
tmp
&
UDCCS0_SST
)
?
" sst"
:
""
,
(
tmp
&
UDCCS0_DRWF
)
?
" dwrf"
:
""
,
(
tmp
&
UDCCS0_FTF
)
?
" ftf"
:
""
,
(
tmp
&
UDCCS0_IPR
)
?
" ipr"
:
""
,
(
tmp
&
UDCCS0_OPR
)
?
" opr"
:
""
);
size
-=
t
;
next
+=
t
;
if
(
dev
->
has_cfr
)
{
tmp
=
UDCCFR
;
t
=
snprintf
(
next
,
size
,
"udccfr %02X =%s%s
\n
"
,
tmp
,
(
tmp
&
UDCCFR_AREN
)
?
" aren"
:
""
,
(
tmp
&
UDCCFR_ACM
)
?
" acm"
:
""
);
size
-=
t
;
next
+=
t
;
}
if
(
!
is_usb_connected
()
||
!
dev
->
driver
)
goto
done
;
t
=
snprintf
(
next
,
size
,
"ep0 IN %lu/%lu, OUT %lu/%lu
\n
irqs %lu
\n\n
"
,
dev
->
stats
.
write
.
bytes
,
dev
->
stats
.
write
.
ops
,
dev
->
stats
.
read
.
bytes
,
dev
->
stats
.
read
.
ops
,
dev
->
stats
.
irqs
);
size
-=
t
;
next
+=
t
;
/* dump endpoint queues */
for
(
i
=
0
;
i
<
PXA_UDC_NUM_ENDPOINTS
;
i
++
)
{
struct
pxa2xx_ep
*
ep
=
&
dev
->
ep
[
i
];
struct
pxa2xx_request
*
req
;
int
t
;
if
(
i
!=
0
)
{
const
struct
usb_endpoint_descriptor
*
d
;
d
=
ep
->
desc
;
if
(
!
d
)
continue
;
tmp
=
*
dev
->
ep
[
i
].
reg_udccs
;
t
=
snprintf
(
next
,
size
,
"%s max %d %s udccs %02x irqs %lu/%lu
\n
"
,
ep
->
ep
.
name
,
le16_to_cpu
(
d
->
wMaxPacketSize
),
(
ep
->
dma
>=
0
)
?
"dma"
:
"pio"
,
tmp
,
ep
->
pio_irqs
,
ep
->
dma_irqs
);
/* TODO translate all five groups of udccs bits! */
}
else
/* ep0 should only have one transfer queued */
t
=
snprintf
(
next
,
size
,
"ep0 max 16 pio irqs %lu
\n
"
,
ep
->
pio_irqs
);
if
(
t
<=
0
||
t
>
size
)
goto
done
;
size
-=
t
;
next
+=
t
;
if
(
list_empty
(
&
ep
->
queue
))
{
t
=
snprintf
(
next
,
size
,
"
\t
(nothing queued)
\n
"
);
if
(
t
<=
0
||
t
>
size
)
goto
done
;
size
-=
t
;
next
+=
t
;
continue
;
}
list_for_each_entry
(
req
,
&
ep
->
queue
,
queue
)
{
#ifdef USE_DMA
if
(
ep
->
dma
>=
0
&&
req
->
queue
.
prev
==
&
ep
->
queue
)
t
=
snprintf
(
next
,
size
,
"
\t
req %p len %d/%d "
"buf %p (dma%d dcmd %08x)
\n
"
,
&
req
->
req
,
req
->
req
.
actual
,
req
->
req
.
length
,
req
->
req
.
buf
,
ep
->
dma
,
DCMD
(
ep
->
dma
)
// low 13 bits == bytes-to-go
);
else
#endif
t
=
snprintf
(
next
,
size
,
"
\t
req %p len %d/%d buf %p
\n
"
,
&
req
->
req
,
req
->
req
.
actual
,
req
->
req
.
length
,
req
->
req
.
buf
);
if
(
t
<=
0
||
t
>
size
)
goto
done
;
size
-=
t
;
next
+=
t
;
}
}
done:
local_irq_restore
(
flags
);
*
eof
=
1
;
return
count
-
size
;
}
#define create_proc_files() \
create_proc_read_entry(proc_node_name, 0, NULL, udc_proc_read, dev)
#define remove_proc_files() \
remove_proc_entry(proc_node_name, NULL)
#else
/* !UDC_PROC_FILE */
#define create_proc_files() do {} while (0)
#define remove_proc_files() do {} while (0)
#endif
/* UDC_PROC_FILE */
/* "function" sysfs attribute */
static
ssize_t
show_function
(
struct
device
*
_dev
,
char
*
buf
)
{
struct
pxa2xx_udc
*
dev
=
dev_get_drvdata
(
_dev
);
if
(
!
dev
->
driver
||
!
dev
->
driver
->
function
||
strlen
(
dev
->
driver
->
function
)
>
PAGE_SIZE
)
return
0
;
return
snprintf
(
buf
,
PAGE_SIZE
,
"%s
\n
"
,
dev
->
driver
->
function
);
}
static
DEVICE_ATTR
(
function
,
S_IRUGO
,
show_function
,
NULL
);
/*-------------------------------------------------------------------------*/
/*
* udc_disable - disable USB device controller
*/
static
void
udc_disable
(
struct
pxa2xx_udc
*
dev
)
{
/* block all irqs */
udc_set_mask_UDCCR
(
UDCCR_SRM
|
UDCCR_REM
);
UICR0
=
UICR1
=
0xff
;
UFNRH
=
UFNRH_SIM
;
/* if hardware supports it, disconnect from usb */
make_usb_disappear
();
udc_clear_mask_UDCCR
(
UDCCR_UDE
);
/* Disable clock for USB device */
CKEN
&=
~
CKEN11_USB
;
ep0_idle
(
dev
);
dev
->
gadget
.
speed
=
USB_SPEED_UNKNOWN
;
LED_CONNECTED_OFF
;
}
/*
* udc_reinit - initialize software state
*/
static
void
udc_reinit
(
struct
pxa2xx_udc
*
dev
)
{
u32
i
;
/* device/ep0 records init */
INIT_LIST_HEAD
(
&
dev
->
gadget
.
ep_list
);
INIT_LIST_HEAD
(
&
dev
->
gadget
.
ep0
->
ep_list
);
dev
->
ep0state
=
EP0_IDLE
;
/* basic endpoint records init */
for
(
i
=
0
;
i
<
PXA_UDC_NUM_ENDPOINTS
;
i
++
)
{
struct
pxa2xx_ep
*
ep
=
&
dev
->
ep
[
i
];
if
(
i
!=
0
)
list_add_tail
(
&
ep
->
ep
.
ep_list
,
&
dev
->
gadget
.
ep_list
);
ep
->
desc
=
0
;
ep
->
stopped
=
0
;
INIT_LIST_HEAD
(
&
ep
->
queue
);
ep
->
pio_irqs
=
ep
->
dma_irqs
=
0
;
}
/* the rest was statically initialized, and is read-only */
}
/* until it's enabled, this UDC should be completely invisible
* to any USB host.
*/
static
void
udc_enable
(
struct
pxa2xx_udc
*
dev
)
{
udc_clear_mask_UDCCR
(
UDCCR_UDE
);
/* Enable clock for USB device */
CKEN
|=
CKEN11_USB
;
/* try to clear these bits before we enable the udc */
udc_ack_int_UDCCR
(
UDCCR_SUSIR
|
/*UDCCR_RSTIR|*/
UDCCR_RESIR
);
ep0_idle
(
dev
);
dev
->
gadget
.
speed
=
USB_SPEED_UNKNOWN
;
dev
->
stats
.
irqs
=
0
;
/*
* sequence taken from chapter 12.5.10, PXA250 AppProcDevManual:
* - enable UDC
* - if RESET is already in progress, ack interrupt
* - unmask reset interrupt
*/
udc_set_mask_UDCCR
(
UDCCR_UDE
);
if
(
!
(
UDCCR
&
UDCCR_UDA
))
udc_ack_int_UDCCR
(
UDCCR_RSTIR
);
if
(
dev
->
has_cfr
/* UDC_RES2 is defined */
)
{
/* pxa255 (a0+) can avoid a set_config race that could
* prevent gadget drivers from configuring correctly
*/
UDCCFR
=
UDCCFR_ACM
;
}
else
{
/* "USB test mode" for pxa250 errata 40-42 (stepping a0, a1)
* which could result in missing packets and interrupts.
* supposedly one bit per endpoint, controlling whether it
* double buffers or not; ACM/AREN bits fit into the holes.
* zero bits (like USIR0_IRx) disable double buffering.
*/
UDC_RES1
=
0x00
;
UDC_RES2
=
0x00
;
}
#ifdef DISABLE_TEST_MODE
/* "test mode" seems to have become the default in later chip
* revs, preventing double buffering (and invalidating docs).
* this EXPERIMENT enables it for bulk endpoints by tweaking
* undefined/reserved register bits (that other drivers clear).
* Belcarra code comments noted this usage.
*/
if
(
fifo_mode
&
1
)
{
/* IN endpoints */
UDC_RES1
|=
USIR0_IR1
|
USIR0_IR6
;
UDC_RES2
|=
USIR1_IR11
;
}
if
(
fifo_mode
&
2
)
{
/* OUT endpoints */
UDC_RES1
|=
USIR0_IR2
|
USIR0_IR7
;
UDC_RES2
|=
USIR1_IR12
;
}
#endif
/* caller must be able to sleep in order to cope
* with startup transients.
*/
schedule_timeout
(
HZ
/
10
);
/* enable suspend/resume and reset irqs */
udc_clear_mask_UDCCR
(
UDCCR_SRM
|
UDCCR_REM
);
/* enable ep0 irqs */
UICR0
&=
~
UICR0_IM0
;
/* if hardware supports it, connect to usb and wait for host */
let_usb_appear
();
}
/* when a driver is successfully registered, it will receive
* control requests including set_configuration(), which enables
* non-control requests. then usb traffic follows until a
* disconnect is reported. then a host may connect again, or
* the driver might get unbound.
*/
int
usb_gadget_register_driver
(
struct
usb_gadget_driver
*
driver
)
{
struct
pxa2xx_udc
*
dev
=
the_controller
;
int
retval
;
if
(
!
driver
||
driver
->
speed
!=
USB_SPEED_FULL
||
!
driver
->
bind
||
!
driver
->
unbind
||
!
driver
->
disconnect
||
!
driver
->
setup
)
return
-
EINVAL
;
if
(
!
dev
)
return
-
ENODEV
;
if
(
dev
->
driver
)
return
-
EBUSY
;
/* first hook up the driver ... */
dev
->
driver
=
driver
;
dev
->
gadget
.
dev
.
driver
=
&
driver
->
driver
;
device_add
(
&
dev
->
gadget
.
dev
);
retval
=
driver
->
bind
(
&
dev
->
gadget
);
if
(
retval
)
{
DMSG
(
"bind to driver %s --> error %d
\n
"
,
driver
->
driver
.
name
,
retval
);
device_del
(
&
dev
->
gadget
.
dev
);
dev
->
driver
=
0
;
dev
->
gadget
.
dev
.
driver
=
0
;
return
retval
;
}
device_create_file
(
dev
->
dev
,
&
dev_attr_function
);
/* ... then enable host detection and ep0; and we're ready
* for set_configuration as well as eventual disconnect.
* NOTE: this shouldn't power up until later.
*/
DMSG
(
"registered gadget driver '%s'
\n
"
,
driver
->
driver
.
name
);
udc_enable
(
dev
);
dump_state
(
dev
);
return
0
;
}
EXPORT_SYMBOL
(
usb_gadget_register_driver
);
static
void
stop_activity
(
struct
pxa2xx_udc
*
dev
,
struct
usb_gadget_driver
*
driver
)
{
int
i
;
/* don't disconnect drivers more than once */
if
(
dev
->
gadget
.
speed
==
USB_SPEED_UNKNOWN
)
driver
=
0
;
dev
->
gadget
.
speed
=
USB_SPEED_UNKNOWN
;
/* prevent new request submissions, kill any outstanding requests */
for
(
i
=
0
;
i
<
PXA_UDC_NUM_ENDPOINTS
;
i
++
)
{
struct
pxa2xx_ep
*
ep
=
&
dev
->
ep
[
i
];
ep
->
stopped
=
1
;
nuke
(
ep
,
-
ESHUTDOWN
);
}
del_timer_sync
(
&
dev
->
timer
);
/* report disconnect; the driver is already quiesced */
LED_CONNECTED_OFF
;
if
(
driver
)
driver
->
disconnect
(
&
dev
->
gadget
);
/* re-init driver-visible data structures */
udc_reinit
(
dev
);
}
int
usb_gadget_unregister_driver
(
struct
usb_gadget_driver
*
driver
)
{
struct
pxa2xx_udc
*
dev
=
the_controller
;
if
(
!
dev
)
return
-
ENODEV
;
if
(
!
driver
||
driver
!=
dev
->
driver
)
return
-
EINVAL
;
local_irq_disable
();
udc_disable
(
dev
);
stop_activity
(
dev
,
driver
);
driver
->
unbind
(
&
dev
->
gadget
);
dev
->
driver
=
0
;
local_irq_enable
();
device_del
(
&
dev
->
gadget
.
dev
);
device_remove_file
(
dev
->
dev
,
&
dev_attr_function
);
DMSG
(
"unregistered gadget driver '%s'
\n
"
,
driver
->
driver
.
name
);
dump_state
(
dev
);
return
0
;
}
EXPORT_SYMBOL
(
usb_gadget_unregister_driver
);
/*-------------------------------------------------------------------------*/
#ifdef CONFIG_ARCH_LUBBOCK
/* Lubbock can report connect or disconnect irqs. Likely more hardware
* could support it as a timer callback.
*
* FIXME for better power management, keep the hardware powered down
* until a host is powering the link. means scheduling work later
* in some task that can udc_enable().
*/
#define enable_disconnect_irq() \
if (machine_is_lubbock()) { enable_irq(LUBBOCK_USB_DISC_IRQ); }
#define disable_disconnect_irq() \
if (machine_is_lubbock()) { disable_irq(LUBBOCK_USB_DISC_IRQ); }
static
irqreturn_t
usb_connection_irq
(
int
irq
,
void
*
_dev
,
struct
pt_regs
*
r
)
{
struct
pxa2xx_udc
*
dev
=
_dev
;
dev
->
stats
.
irqs
++
;
HEX_DISPLAY
(
dev
->
stats
.
irqs
);
if
(
!
is_usb_connected
())
{
LED_CONNECTED_OFF
;
disable_disconnect_irq
();
/* report disconnect just once */
if
(
dev
->
gadget
.
speed
!=
USB_SPEED_UNKNOWN
)
{
DMSG
(
"disconnect %s
\n
"
,
dev
->
driver
?
dev
->
driver
->
driver
.
name
:
0
);
stop_activity
(
dev
,
dev
->
driver
);
// udc_disable (dev);
// no more udc irqs
// maybe "ACTION=disconnect /sbin/hotplug gadget".
}
}
else
if
(
dev
->
gadget
.
speed
==
USB_SPEED_UNKNOWN
)
{
LED_CONNECTED_ON
;
DMSG
(
"?? connect irq ??
\n
"
);
// if there's no driver bound, ignore; else
// udc_enable (dev);
// UDC irqs drive the rest.
// maybe "ACTION=connect /sbin/hotplug gadget".
}
return
IRQ_HANDLED
;
}
#endif
#ifndef enable_disconnect_irq
#warning USB disconnect() is not yet reported.
#define enable_disconnect_irq() do {} while (0)
#define disable_disconnect_irq() do {} while (0)
#endif
/*-------------------------------------------------------------------------*/
static
inline
void
clear_ep_state
(
struct
pxa2xx_udc
*
dev
)
{
unsigned
i
;
/* hardware SET_{CONFIGURATION,INTERFACE} automagic resets endpoint
* fifos, and pending transactions mustn't be continued in any case.
*/
for
(
i
=
1
;
i
<
PXA_UDC_NUM_ENDPOINTS
;
i
++
)
nuke
(
&
dev
->
ep
[
i
],
-
ECONNABORTED
);
}
static
void
udc_watchdog
(
unsigned
long
_dev
)
{
struct
pxa2xx_udc
*
dev
=
(
void
*
)
_dev
;
local_irq_disable
();
if
(
dev
->
ep0state
==
EP0_STALL
&&
(
UDCCS0
&
UDCCS0_FST
)
==
0
&&
(
UDCCS0
&
UDCCS0_SST
)
==
0
)
{
UDCCS0
=
UDCCS0_FST
|
UDCCS0_FTF
;
DBG
(
DBG_VERBOSE
,
"ep0 re-stall
\n
"
);
start_watchdog
(
dev
);
}
local_irq_enable
();
}
static
void
handle_ep0
(
struct
pxa2xx_udc
*
dev
)
{
u32
udccs0
=
UDCCS0
;
struct
pxa2xx_ep
*
ep
=
&
dev
->
ep
[
0
];
struct
pxa2xx_request
*
req
;
union
{
struct
usb_ctrlrequest
r
;
u8
raw
[
8
];
u32
word
[
2
];
}
u
;
if
(
list_empty
(
&
ep
->
queue
))
req
=
0
;
else
req
=
list_entry
(
ep
->
queue
.
next
,
struct
pxa2xx_request
,
queue
);
/* clear stall status */
if
(
udccs0
&
UDCCS0_SST
)
{
nuke
(
ep
,
-
EPIPE
);
UDCCS0
=
UDCCS0_SST
;
del_timer
(
&
dev
->
timer
);
ep0_idle
(
dev
);
}
/* previous request unfinished? non-error iff back-to-back ... */
if
((
udccs0
&
UDCCS0_SA
)
!=
0
&&
dev
->
ep0state
!=
EP0_IDLE
)
{
nuke
(
ep
,
0
);
del_timer
(
&
dev
->
timer
);
ep0_idle
(
dev
);
}
switch
(
dev
->
ep0state
)
{
case
EP0_IDLE
:
/* late-breaking status? */
udccs0
=
UDCCS0
;
/* start control request? */
if
(
likely
((
udccs0
&
(
UDCCS0_OPR
|
UDCCS0_SA
|
UDCCS0_RNE
))
==
(
UDCCS0_OPR
|
UDCCS0_SA
|
UDCCS0_RNE
)))
{
int
i
;
nuke
(
ep
,
-
EPROTO
);
/* read SETUP packet */
for
(
i
=
0
;
i
<
8
;
i
++
)
{
if
(
unlikely
(
!
(
UDCCS0
&
UDCCS0_RNE
)))
{
bad_setup:
DMSG
(
"SETUP %d!
\n
"
,
i
);
goto
stall
;
}
u
.
raw
[
i
]
=
(
u8
)
UDDR0
;
}
if
(
unlikely
((
UDCCS0
&
UDCCS0_RNE
)
!=
0
))
goto
bad_setup
;
got_setup:
le16_to_cpus
(
&
u
.
r
.
wValue
);
le16_to_cpus
(
&
u
.
r
.
wIndex
);
le16_to_cpus
(
&
u
.
r
.
wLength
);
LED_EP0_ON
;
DBG
(
DBG_VERBOSE
,
"SETUP %02x.%02x v%04x i%04x l%04x
\n
"
,
u
.
r
.
bRequestType
,
u
.
r
.
bRequest
,
u
.
r
.
wValue
,
u
.
r
.
wIndex
,
u
.
r
.
wLength
);
/* cope with automagic for some standard requests. */
dev
->
req_std
=
(
u
.
r
.
bRequestType
&
USB_TYPE_MASK
)
==
USB_TYPE_STANDARD
;
dev
->
req_config
=
0
;
dev
->
req_pending
=
1
;
switch
(
u
.
r
.
bRequest
)
{
/* hardware restricts gadget drivers here! */
case
USB_REQ_SET_CONFIGURATION
:
if
(
u
.
r
.
bRequestType
==
USB_RECIP_DEVICE
)
{
/* reflect hardware's automagic
* up to the gadget driver.
*/
config_change:
dev
->
req_config
=
1
;
clear_ep_state
(
dev
);
/* if !has_cfr, there's no synch
* else use AREN (later) not SA|OPR
* USIR0_IR0 acts edge sensitive
*/
dev
->
req_pending
=
0
;
}
break
;
/* ... and here, even more ... */
case
USB_REQ_SET_INTERFACE
:
if
(
u
.
r
.
bRequestType
==
USB_RECIP_INTERFACE
)
{
/* udc hardware is broken by design:
* - altsetting may only be zero;
* - hw resets all interfaces' eps;
* - ep reset doesn't include halt(?).
*/
DMSG
(
"broken set_interface (%d/%d)
\n
"
,
u
.
r
.
wIndex
,
u
.
r
.
wValue
);
goto
config_change
;
}
break
;
/* hardware was supposed to hide this */
case
USB_REQ_SET_ADDRESS
:
if
(
u
.
r
.
bRequestType
==
USB_RECIP_DEVICE
)
{
ep0start
(
dev
,
0
,
"address"
);
return
;
}
break
;
}
if
(
u
.
r
.
bRequestType
&
USB_DIR_IN
)
dev
->
ep0state
=
EP0_IN_DATA_PHASE
;
else
dev
->
ep0state
=
EP0_OUT_DATA_PHASE
;
i
=
dev
->
driver
->
setup
(
&
dev
->
gadget
,
&
u
.
r
);
if
(
i
<
0
)
{
/* hardware automagic preventing STALL... */
if
(
dev
->
req_config
)
{
/* hardware sometimes neglects to tell
* tell us about config change events,
* so later ones may fail...
*/
WARN
(
"config change %02x fail %d?
\n
"
,
u
.
r
.
bRequest
,
i
);
return
;
/* TODO experiment: if has_cfr,
* hardware didn't ACK; maybe we
* could actually STALL!
*/
}
DBG
(
DBG_VERBOSE
,
"protocol STALL, "
"%02x err %d
\n
"
,
UDCCS0
,
i
);
stall:
/* the watchdog timer helps deal with cases
* where udc seems to clear FST wrongly, and
* then NAKs instead of STALLing.
*/
ep0start
(
dev
,
UDCCS0_FST
|
UDCCS0_FTF
,
"stall"
);
start_watchdog
(
dev
);
dev
->
ep0state
=
EP0_STALL
;
LED_EP0_OFF
;
/* deferred i/o == no response yet */
}
else
if
(
dev
->
req_pending
)
{
if
(
likely
(
dev
->
ep0state
==
EP0_IN_DATA_PHASE
||
dev
->
req_std
||
u
.
r
.
wLength
))
ep0start
(
dev
,
0
,
"defer"
);
else
ep0start
(
dev
,
UDCCS0_IPR
,
"defer/IPR"
);
}
/* expect at least one data or status stage irq */
return
;
}
else
if
(
likely
((
udccs0
&
(
UDCCS0_OPR
|
UDCCS0_SA
))
==
(
UDCCS0_OPR
|
UDCCS0_SA
)))
{
unsigned
i
;
/* pxa210/250 erratum 131 for B0/B1 says RNE lies.
* still observed on a pxa255 a0.
*/
nuke
(
ep
,
-
EPROTO
);
/* read SETUP data, but don't trust it too much */
for
(
i
=
0
;
i
<
8
;
i
++
)
u
.
raw
[
i
]
=
(
u8
)
UDDR0
;
if
((
u
.
r
.
bRequestType
&
USB_RECIP_MASK
)
>
USB_RECIP_OTHER
)
goto
stall
;
if
(
u
.
word
[
0
]
==
0
&&
u
.
word
[
1
]
==
0
)
goto
stall
;
goto
got_setup
;
}
else
{
/* some random early IRQ:
* - we acked FST
* - IPR cleared
* - OPR got set, without SA (likely status stage)
*/
UDCCS0
=
udccs0
&
(
UDCCS0_SA
|
UDCCS0_OPR
);
}
break
;
case
EP0_IN_DATA_PHASE
:
/* GET_DESCRIPTOR etc */
if
(
udccs0
&
UDCCS0_OPR
)
{
UDCCS0
=
UDCCS0_OPR
|
UDCCS0_FTF
;
DBG
(
DBG_VERBOSE
,
"ep0in premature status
\n
"
);
if
(
req
)
done
(
ep
,
req
,
0
);
ep0_idle
(
dev
);
}
else
/* irq was IPR clearing */
{
if
(
req
)
{
/* this IN packet might finish the request */
(
void
)
write_ep0_fifo
(
ep
,
req
);
}
/* else IN token before response was written */
}
break
;
case
EP0_OUT_DATA_PHASE
:
/* SET_DESCRIPTOR etc */
if
(
udccs0
&
UDCCS0_OPR
)
{
if
(
req
)
{
/* this OUT packet might finish the request */
if
(
read_ep0_fifo
(
ep
,
req
))
done
(
ep
,
req
,
0
);
/* else more OUT packets expected */
}
/* else OUT token before read was issued */
}
else
/* irq was IPR clearing */
{
DBG
(
DBG_VERBOSE
,
"ep0out premature status
\n
"
);
if
(
req
)
done
(
ep
,
req
,
0
);
ep0_idle
(
dev
);
}
break
;
case
EP0_END_XFER
:
if
(
req
)
done
(
ep
,
req
,
0
);
/* ack control-IN status (maybe in-zlp was skipped)
* also appears after some config change events.
*/
if
(
udccs0
&
UDCCS0_OPR
)
UDCCS0
=
UDCCS0_OPR
;
ep0_idle
(
dev
);
break
;
case
EP0_STALL
:
UDCCS0
=
UDCCS0_FST
;
break
;
}
USIR0
=
USIR0_IR0
;
}
static
void
handle_ep
(
struct
pxa2xx_ep
*
ep
)
{
struct
pxa2xx_request
*
req
;
int
is_in
=
ep
->
bEndpointAddress
&
USB_DIR_IN
;
int
completed
;
u32
udccs
,
tmp
;
do
{
completed
=
0
;
if
(
likely
(
!
list_empty
(
&
ep
->
queue
)))
req
=
list_entry
(
ep
->
queue
.
next
,
struct
pxa2xx_request
,
queue
);
else
req
=
0
;
// TODO check FST handling
udccs
=
*
ep
->
reg_udccs
;
if
(
unlikely
(
is_in
))
{
/* irq from TPC, SST, or (ISO) TUR */
tmp
=
UDCCS_BI_TUR
;
if
(
likely
(
ep
->
bmAttributes
==
USB_ENDPOINT_XFER_BULK
))
tmp
|=
UDCCS_BI_SST
;
tmp
&=
udccs
;
if
(
likely
(
tmp
))
*
ep
->
reg_udccs
=
tmp
;
if
(
req
&&
likely
((
udccs
&
UDCCS_BI_TFS
)
!=
0
))
completed
=
write_fifo
(
ep
,
req
);
}
else
{
/* irq from RPC (or for ISO, ROF) */
if
(
likely
(
ep
->
bmAttributes
==
USB_ENDPOINT_XFER_BULK
))
tmp
=
UDCCS_BO_SST
|
UDCCS_BO_DME
;
else
tmp
=
UDCCS_IO_ROF
|
UDCCS_IO_DME
;
tmp
&=
udccs
;
if
(
likely
(
tmp
))
*
ep
->
reg_udccs
=
tmp
;
/* fifos can hold packets, ready for reading... */
if
(
likely
(
req
))
{
#ifdef USE_OUT_DMA
// TODO didn't yet debug out-dma. this approach assumes
// the worst about short packets and RPC; it might be better.
if
(
likely
(
ep
->
dma
>=
0
))
{
if
(
!
(
udccs
&
UDCCS_BO_RSP
))
{
*
ep
->
reg_udccs
=
UDCCS_BO_RPC
;
ep
->
dma_irqs
++
;
return
;
}
}
#endif
completed
=
read_fifo
(
ep
,
req
);
}
else
pio_irq_disable
(
ep
->
bEndpointAddress
);
}
ep
->
pio_irqs
++
;
}
while
(
completed
);
}
/*
* pxa2xx_udc_irq - interrupt handler
*
* avoid delays in ep0 processing. the control handshaking isn't always
* under software control (pxa250c0 and the pxa255 are better), and delays
* could cause usb protocol errors.
*/
static
irqreturn_t
pxa2xx_udc_irq
(
int
irq
,
void
*
_dev
,
struct
pt_regs
*
r
)
{
struct
pxa2xx_udc
*
dev
=
_dev
;
int
handled
;
dev
->
stats
.
irqs
++
;
HEX_DISPLAY
(
dev
->
stats
.
irqs
);
do
{
u32
udccr
=
UDCCR
;
handled
=
0
;
/* SUSpend Interrupt Request */
if
(
unlikely
(
udccr
&
UDCCR_SUSIR
))
{
udc_ack_int_UDCCR
(
UDCCR_SUSIR
);
handled
=
1
;
DBG
(
DBG_VERBOSE
,
"USB suspend%s
\n
"
,
is_usb_connected
()
?
""
:
"+disconnect"
);
if
(
!
is_usb_connected
())
stop_activity
(
dev
,
dev
->
driver
);
else
if
(
dev
->
gadget
.
speed
!=
USB_SPEED_UNKNOWN
&&
dev
->
driver
&&
dev
->
driver
->
suspend
)
dev
->
driver
->
suspend
(
&
dev
->
gadget
);
ep0_idle
(
dev
);
}
/* RESume Interrupt Request */
if
(
unlikely
(
udccr
&
UDCCR_RESIR
))
{
udc_ack_int_UDCCR
(
UDCCR_RESIR
);
handled
=
1
;
DBG
(
DBG_VERBOSE
,
"USB resume
\n
"
);
if
(
dev
->
gadget
.
speed
!=
USB_SPEED_UNKNOWN
&&
dev
->
driver
&&
dev
->
driver
->
resume
&&
is_usb_connected
())
dev
->
driver
->
resume
(
&
dev
->
gadget
);
}
/* ReSeT Interrupt Request - USB reset */
if
(
unlikely
(
udccr
&
UDCCR_RSTIR
))
{
udc_ack_int_UDCCR
(
UDCCR_RSTIR
);
handled
=
1
;
if
((
UDCCR
&
UDCCR_UDA
)
==
0
)
{
DBG
(
DBG_VERBOSE
,
"USB reset start
\n
"
);
if
(
dev
->
gadget
.
speed
!=
USB_SPEED_UNKNOWN
)
disable_disconnect_irq
();
/* reset driver and endpoints,
* in case that's not yet done
*/
stop_activity
(
dev
,
dev
->
driver
);
}
else
{
dev_info
(
&
dev
->
gadget
.
dev
,
"USB reset
\n
"
);
dev
->
gadget
.
speed
=
USB_SPEED_FULL
;
LED_CONNECTED_ON
;
memset
(
&
dev
->
stats
,
0
,
sizeof
dev
->
stats
);
/* driver and endpoints are still reset */
enable_disconnect_irq
();
}
}
else
{
u32
usir0
=
USIR0
&
~
UICR0
;
u32
usir1
=
USIR1
&
~
UICR1
;
int
i
;
if
(
unlikely
(
!
usir0
&&
!
usir1
))
continue
;
DBG
(
DBG_VERY_NOISY
,
"irq %02x.%02x
\n
"
,
usir1
,
usir0
);
/* control traffic */
if
(
usir0
&
USIR0_IR0
)
{
dev
->
ep
[
0
].
pio_irqs
++
;
handle_ep0
(
dev
);
handled
=
1
;
}
/* endpoint data transfers */
for
(
i
=
0
;
i
<
8
;
i
++
)
{
u32
tmp
=
1
<<
i
;
if
(
i
&&
(
usir0
&
tmp
))
{
handle_ep
(
&
dev
->
ep
[
i
]);
USIR0
|=
tmp
;
handled
=
1
;
}
if
(
usir1
&
tmp
)
{
handle_ep
(
&
dev
->
ep
[
i
+
8
]);
USIR1
|=
tmp
;
handled
=
1
;
}
}
}
/* we could also ask for 1 msec SOF (SIR) interrupts */
}
while
(
handled
);
return
IRQ_HANDLED
;
}
/*-------------------------------------------------------------------------*/
static
void
nop_release
(
struct
device
*
dev
)
{
DMSG
(
"%s %s
\n
"
,
__FUNCTION__
,
dev
->
bus_id
);
}
/* this uses load-time allocation and initialization (instead of
* doing it at run-time) to save code, eliminate fault paths, and
* be more obviously correct.
*/
static
struct
pxa2xx_udc
memory
=
{
.
gadget
=
{
.
ops
=
&
pxa2xx_udc_ops
,
.
ep0
=
&
memory
.
ep
[
0
].
ep
,
.
name
=
driver_name
,
.
dev
=
{
.
bus_id
=
"gadget"
,
.
release
=
nop_release
,
},
},
/* control endpoint */
.
ep
[
0
]
=
{
.
ep
=
{
.
name
=
ep0name
,
.
ops
=
&
pxa2xx_ep_ops
,
.
maxpacket
=
EP0_FIFO_SIZE
,
},
.
dev
=
&
memory
,
.
reg_udccs
=
&
UDCCS0
,
.
reg_uddr
=
&
UDDR0
,
},
/* first group of endpoints */
.
ep
[
1
]
=
{
.
ep
=
{
.
name
=
"ep1in-bulk"
,
.
ops
=
&
pxa2xx_ep_ops
,
.
maxpacket
=
BULK_FIFO_SIZE
,
},
.
dev
=
&
memory
,
.
bEndpointAddress
=
USB_DIR_IN
|
1
,
.
bmAttributes
=
USB_ENDPOINT_XFER_BULK
,
.
reg_udccs
=
&
UDCCS1
,
.
reg_uddr
=
&
UDDR1
,
.
reg_drcmr
=
&
DRCMR25
,
},
.
ep
[
2
]
=
{
.
ep
=
{
.
name
=
"ep2out-bulk"
,
.
ops
=
&
pxa2xx_ep_ops
,
.
maxpacket
=
BULK_FIFO_SIZE
,
},
.
dev
=
&
memory
,
.
bEndpointAddress
=
2
,
.
bmAttributes
=
USB_ENDPOINT_XFER_BULK
,
.
reg_udccs
=
&
UDCCS2
,
.
reg_ubcr
=
&
UBCR2
,
.
reg_uddr
=
&
UDDR2
,
.
reg_drcmr
=
&
DRCMR26
,
},
#ifndef CONFIG_USB_PXA2XX_SMALL
.
ep
[
3
]
=
{
.
ep
=
{
.
name
=
"ep3in-iso"
,
.
ops
=
&
pxa2xx_ep_ops
,
.
maxpacket
=
ISO_FIFO_SIZE
,
},
.
dev
=
&
memory
,
.
bEndpointAddress
=
USB_DIR_IN
|
3
,
.
bmAttributes
=
USB_ENDPOINT_XFER_ISOC
,
.
reg_udccs
=
&
UDCCS3
,
.
reg_uddr
=
&
UDDR3
,
.
reg_drcmr
=
&
DRCMR27
,
},
.
ep
[
4
]
=
{
.
ep
=
{
.
name
=
"ep4out-iso"
,
.
ops
=
&
pxa2xx_ep_ops
,
.
maxpacket
=
ISO_FIFO_SIZE
,
},
.
dev
=
&
memory
,
.
bEndpointAddress
=
4
,
.
bmAttributes
=
USB_ENDPOINT_XFER_ISOC
,
.
reg_udccs
=
&
UDCCS4
,
.
reg_ubcr
=
&
UBCR4
,
.
reg_uddr
=
&
UDDR4
,
.
reg_drcmr
=
&
DRCMR28
,
},
.
ep
[
5
]
=
{
.
ep
=
{
.
name
=
"ep5in-int"
,
.
ops
=
&
pxa2xx_ep_ops
,
.
maxpacket
=
INT_FIFO_SIZE
,
},
.
dev
=
&
memory
,
.
bEndpointAddress
=
USB_DIR_IN
|
5
,
.
bmAttributes
=
USB_ENDPOINT_XFER_INT
,
.
reg_udccs
=
&
UDCCS5
,
.
reg_uddr
=
&
UDDR5
,
},
/* second group of endpoints */
.
ep
[
6
]
=
{
.
ep
=
{
.
name
=
"ep6in-bulk"
,
.
ops
=
&
pxa2xx_ep_ops
,
.
maxpacket
=
BULK_FIFO_SIZE
,
},
.
dev
=
&
memory
,
.
bEndpointAddress
=
USB_DIR_IN
|
6
,
.
bmAttributes
=
USB_ENDPOINT_XFER_BULK
,
.
reg_udccs
=
&
UDCCS6
,
.
reg_uddr
=
&
UDDR6
,
.
reg_drcmr
=
&
DRCMR30
,
},
.
ep
[
7
]
=
{
.
ep
=
{
.
name
=
"ep7out-bulk"
,
.
ops
=
&
pxa2xx_ep_ops
,
.
maxpacket
=
BULK_FIFO_SIZE
,
},
.
dev
=
&
memory
,
.
bEndpointAddress
=
7
,
.
bmAttributes
=
USB_ENDPOINT_XFER_BULK
,
.
reg_udccs
=
&
UDCCS7
,
.
reg_ubcr
=
&
UBCR7
,
.
reg_uddr
=
&
UDDR7
,
.
reg_drcmr
=
&
DRCMR31
,
},
.
ep
[
8
]
=
{
.
ep
=
{
.
name
=
"ep8in-iso"
,
.
ops
=
&
pxa2xx_ep_ops
,
.
maxpacket
=
ISO_FIFO_SIZE
,
},
.
dev
=
&
memory
,
.
bEndpointAddress
=
USB_DIR_IN
|
8
,
.
bmAttributes
=
USB_ENDPOINT_XFER_ISOC
,
.
reg_udccs
=
&
UDCCS8
,
.
reg_uddr
=
&
UDDR8
,
.
reg_drcmr
=
&
DRCMR32
,
},
.
ep
[
9
]
=
{
.
ep
=
{
.
name
=
"ep9out-iso"
,
.
ops
=
&
pxa2xx_ep_ops
,
.
maxpacket
=
ISO_FIFO_SIZE
,
},
.
dev
=
&
memory
,
.
bEndpointAddress
=
9
,
.
bmAttributes
=
USB_ENDPOINT_XFER_ISOC
,
.
reg_udccs
=
&
UDCCS9
,
.
reg_ubcr
=
&
UBCR9
,
.
reg_uddr
=
&
UDDR9
,
.
reg_drcmr
=
&
DRCMR33
,
},
.
ep
[
10
]
=
{
.
ep
=
{
.
name
=
"ep10in-int"
,
.
ops
=
&
pxa2xx_ep_ops
,
.
maxpacket
=
INT_FIFO_SIZE
,
},
.
dev
=
&
memory
,
.
bEndpointAddress
=
USB_DIR_IN
|
10
,
.
bmAttributes
=
USB_ENDPOINT_XFER_INT
,
.
reg_udccs
=
&
UDCCS10
,
.
reg_uddr
=
&
UDDR10
,
},
/* third group of endpoints */
.
ep
[
11
]
=
{
.
ep
=
{
.
name
=
"ep11in-bulk"
,
.
ops
=
&
pxa2xx_ep_ops
,
.
maxpacket
=
BULK_FIFO_SIZE
,
},
.
dev
=
&
memory
,
.
bEndpointAddress
=
USB_DIR_IN
|
11
,
.
bmAttributes
=
USB_ENDPOINT_XFER_BULK
,
.
reg_udccs
=
&
UDCCS11
,
.
reg_uddr
=
&
UDDR11
,
.
reg_drcmr
=
&
DRCMR35
,
},
.
ep
[
12
]
=
{
.
ep
=
{
.
name
=
"ep12out-bulk"
,
.
ops
=
&
pxa2xx_ep_ops
,
.
maxpacket
=
BULK_FIFO_SIZE
,
},
.
dev
=
&
memory
,
.
bEndpointAddress
=
12
,
.
bmAttributes
=
USB_ENDPOINT_XFER_BULK
,
.
reg_udccs
=
&
UDCCS12
,
.
reg_ubcr
=
&
UBCR12
,
.
reg_uddr
=
&
UDDR12
,
.
reg_drcmr
=
&
DRCMR36
,
},
.
ep
[
13
]
=
{
.
ep
=
{
.
name
=
"ep13in-iso"
,
.
ops
=
&
pxa2xx_ep_ops
,
.
maxpacket
=
ISO_FIFO_SIZE
,
},
.
dev
=
&
memory
,
.
bEndpointAddress
=
USB_DIR_IN
|
13
,
.
bmAttributes
=
USB_ENDPOINT_XFER_ISOC
,
.
reg_udccs
=
&
UDCCS13
,
.
reg_uddr
=
&
UDDR13
,
.
reg_drcmr
=
&
DRCMR37
,
},
.
ep
[
14
]
=
{
.
ep
=
{
.
name
=
"ep14out-iso"
,
.
ops
=
&
pxa2xx_ep_ops
,
.
maxpacket
=
ISO_FIFO_SIZE
,
},
.
dev
=
&
memory
,
.
bEndpointAddress
=
14
,
.
bmAttributes
=
USB_ENDPOINT_XFER_ISOC
,
.
reg_udccs
=
&
UDCCS14
,
.
reg_ubcr
=
&
UBCR14
,
.
reg_uddr
=
&
UDDR14
,
.
reg_drcmr
=
&
DRCMR38
,
},
.
ep
[
15
]
=
{
.
ep
=
{
.
name
=
"ep15in-int"
,
.
ops
=
&
pxa2xx_ep_ops
,
.
maxpacket
=
INT_FIFO_SIZE
,
},
.
dev
=
&
memory
,
.
bEndpointAddress
=
USB_DIR_IN
|
15
,
.
bmAttributes
=
USB_ENDPOINT_XFER_INT
,
.
reg_udccs
=
&
UDCCS15
,
.
reg_uddr
=
&
UDDR15
,
},
#endif
/* !CONFIG_USB_PXA2XX_SMALL */
};
#define CP15R0_VENDOR_MASK 0xffffe000
#define CP15R0_XSCALE_VALUE 0x69052000
/* intel/arm/xscale */
#define CP15R0_PROD_MASK 0x000003f0
#define PXA25x 0x00000100
/* and PXA26x */
#define PXA210 0x00000120
#define CP15R0_REV_MASK 0x0000000f
#define CP15R0_PRODREV_MASK (CP15R0_PROD_MASK | CP15R0_REV_MASK)
#define PXA255_A0 0x00000106
/* or PXA260_B1 */
#define PXA250_C0 0x00000105
/* or PXA26x_B0 */
#define PXA250_B2 0x00000104
#define PXA250_B1 0x00000103
/* or PXA260_A0 */
#define PXA250_B0 0x00000102
#define PXA250_A1 0x00000101
#define PXA250_A0 0x00000100
#define PXA210_C0 0x00000125
#define PXA210_B2 0x00000124
#define PXA210_B1 0x00000123
#define PXA210_B0 0x00000122
/*
* probe - binds to the platform device
*/
static
int
__init
pxa2xx_udc_probe
(
struct
device
*
_dev
)
{
struct
pxa2xx_udc
*
dev
=
&
memory
;
int
retval
,
out_dma
=
1
;
u32
chiprev
;
/* insist on Intel/ARM/XScale */
asm
(
"mrc%? p15, 0, %0, c0, c0"
:
"=r"
(
chiprev
));
if
((
chiprev
&
CP15R0_VENDOR_MASK
)
!=
CP15R0_XSCALE_VALUE
)
{
printk
(
KERN_ERR
"%s: not XScale!
\n
"
,
driver_name
);
return
-
ENODEV
;
}
/* trigger chiprev-specific logic */
switch
(
chiprev
&
CP15R0_PRODREV_MASK
)
{
case
PXA255_A0
:
dev
->
has_cfr
=
1
;
break
;
case
PXA250_A0
:
case
PXA250_A1
:
/* A0/A1 "not released"; ep 13, 15 unusable */
/* fall through */
case
PXA250_B2
:
case
PXA210_B2
:
case
PXA250_B1
:
case
PXA210_B1
:
case
PXA250_B0
:
case
PXA210_B0
:
out_dma
=
0
;
/* fall through */
case
PXA250_C0
:
case
PXA210_C0
:
break
;
default:
out_dma
=
0
;
printk
(
KERN_ERR
"%s: unrecognized processor: %08x
\n
"
,
driver_name
,
chiprev
);
/* iop3xx, ixp4xx, ... */
return
-
ENODEV
;
}
pr_debug
(
"%s: IRQ %d%s%s%s
\n
"
,
driver_name
,
IRQ_USB
,
dev
->
has_cfr
?
""
:
" (!cfr)"
,
out_dma
?
""
:
" (broken dma-out)"
,
SIZE_STR
DMASTR
);
#ifdef USE_DMA
#ifndef USE_OUT_DMA
out_dma
=
0
;
#endif
/* pxa 250 erratum 130 prevents using OUT dma (fixed C0) */
if
(
!
out_dma
)
{
DMSG
(
"disabled OUT dma
\n
"
);
dev
->
ep
[
2
].
reg_drcmr
=
dev
->
ep
[
4
].
reg_drcmr
=
0
;
dev
->
ep
[
7
].
reg_drcmr
=
dev
->
ep
[
9
].
reg_drcmr
=
0
;
dev
->
ep
[
12
].
reg_drcmr
=
dev
->
ep
[
14
].
reg_drcmr
=
0
;
}
#endif
/* other non-static parts of init */
dev
->
dev
=
_dev
;
dev
->
mach
=
_dev
->
platform_data
;
init_timer
(
&
dev
->
timer
);
dev
->
timer
.
function
=
udc_watchdog
;
dev
->
timer
.
data
=
(
unsigned
long
)
dev
;
device_initialize
(
&
dev
->
gadget
.
dev
);
dev
->
gadget
.
dev
.
parent
=
_dev
;
dev
->
gadget
.
dev
.
dma_mask
=
_dev
->
dma_mask
;
the_controller
=
dev
;
dev_set_drvdata
(
_dev
,
dev
);
udc_disable
(
dev
);
udc_reinit
(
dev
);
/* irq setup after old hardware state is cleaned up */
retval
=
request_irq
(
IRQ_USB
,
pxa2xx_udc_irq
,
SA_INTERRUPT
,
driver_name
,
dev
);
if
(
retval
!=
0
)
{
printk
(
KERN_ERR
"%s: can't get irq %i, err %d
\n
"
,
driver_name
,
IRQ_USB
,
retval
);
return
-
EBUSY
;
}
dev
->
got_irq
=
1
;
if
(
machine_is_lubbock
())
{
disable_irq
(
LUBBOCK_USB_DISC_IRQ
);
retval
=
request_irq
(
LUBBOCK_USB_DISC_IRQ
,
usb_connection_irq
,
SA_INTERRUPT
/* OOPSING | SA_SAMPLE_RANDOM */
,
driver_name
,
dev
);
if
(
retval
!=
0
)
{
enable_irq
(
LUBBOCK_USB_DISC_IRQ
);
printk
(
KERN_ERR
"%s: can't get irq %i, err %d
\n
"
,
driver_name
,
LUBBOCK_USB_DISC_IRQ
,
retval
);
return
-
EBUSY
;
}
dev
->
got_disc
=
1
;
}
create_proc_files
();
return
0
;
}
static
int
__exit
pxa2xx_udc_remove
(
struct
device
*
_dev
)
{
struct
pxa2xx_udc
*
dev
=
_dev
->
driver_data
;
udc_disable
(
dev
);
remove_proc_files
();
usb_gadget_unregister_driver
(
dev
->
driver
);
if
(
dev
->
got_irq
)
{
free_irq
(
IRQ_USB
,
dev
);
dev
->
got_irq
=
0
;
}
if
(
machine_is_lubbock
()
&&
dev
->
got_disc
)
{
free_irq
(
LUBBOCK_USB_DISC_IRQ
,
dev
);
dev
->
got_disc
=
0
;
}
dev_set_drvdata
(
_dev
,
0
);
the_controller
=
0
;
return
0
;
}
/*-------------------------------------------------------------------------*/
static
struct
device_driver
udc_driver
=
{
.
name
=
(
char
*
)
driver_name
,
.
bus
=
&
platform_bus_type
,
.
probe
=
pxa2xx_udc_probe
,
.
remove
=
__exit_p
(
pxa2xx_udc_remove
),
// FIXME power management support
// .suspend = ... disable UDC
// .resume = ... re-enable UDC
};
static
int
__init
udc_init
(
void
)
{
printk
(
KERN_INFO
"%s: version %s
\n
"
,
driver_name
,
DRIVER_VERSION
);
return
driver_register
(
&
udc_driver
);
}
module_init
(
udc_init
);
static
void
__exit
udc_exit
(
void
)
{
driver_unregister
(
&
udc_driver
);
}
module_exit
(
udc_exit
);
MODULE_DESCRIPTION
(
DRIVER_DESC
);
MODULE_AUTHOR
(
"Frank Becker, Robert Schwebel, David Brownell"
);
MODULE_LICENSE
(
"GPL"
);
drivers/usb/gadget/pxa2xx_udc.h
0 → 100644
View file @
1c23361e
/*
* linux/drivers/usb/gadget/pxa2xx_udc.h
* Intel PXA2xx on-chip full speed USB device controller
*
* Copyright (C) 2003 Robert Schwebel <r.schwebel@pengutronix.de>, Pengutronix
* Copyright (C) 2003 David Brownell
*
*
* 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
*/
#ifndef __LINUX_USB_GADGET_PXA2XX_H
#define __LINUX_USB_GADGET_PXA2XX_H
#include <linux/types.h>
/*-------------------------------------------------------------------------*/
/* pxa2xx has this (move to include/asm-arm/arch-pxa/pxa-regs.h) */
#define UFNRH_SIR (1 << 7)
/* SOF interrupt request */
#define UFNRH_SIM (1 << 6)
/* SOF interrupt mask */
#define UFNRH_IPE14 (1 << 5)
/* ISO packet error, ep14 */
#define UFNRH_IPE9 (1 << 4)
/* ISO packet error, ep9 */
#define UFNRH_IPE4 (1 << 3)
/* ISO packet error, ep4 */
/* pxa255 has this (move to include/asm-arm/arch-pxa/pxa-regs.h) */
#define UDCCFR UDC_RES2
/* UDC Control Function Register */
#define UDCCFR_AREN (1 << 7)
/* ACK response enable (now) */
#define UDCCFR_ACM (1 << 2)
/* ACK control mode (wait for AREN) */
/*-------------------------------------------------------------------------*/
struct
pxa2xx_udc
;
struct
pxa2xx_ep
{
struct
usb_ep
ep
;
struct
pxa2xx_udc
*
dev
;
const
struct
usb_endpoint_descriptor
*
desc
;
struct
list_head
queue
;
unsigned
long
pio_irqs
;
unsigned
long
dma_irqs
;
int
dma
;
u8
bEndpointAddress
;
u8
bmAttributes
;
unsigned
stopped
:
1
;
unsigned
dma_fixup
:
1
;
/* UDCCS = UDC Control/Status for this EP
* UBCR = UDC Byte Count Remaining (contents of OUT fifo)
* UDDR = UDC Endpoint Data Register (the fifo)
* DRCM = DMA Request Channel Map
*/
volatile
u32
*
reg_udccs
;
volatile
u32
*
reg_ubcr
;
volatile
u32
*
reg_uddr
;
volatile
u32
*
reg_drcmr
;
};
struct
pxa2xx_request
{
struct
usb_request
req
;
struct
list_head
queue
;
};
enum
ep0_state
{
EP0_IDLE
,
EP0_IN_DATA_PHASE
,
EP0_OUT_DATA_PHASE
,
EP0_END_XFER
,
EP0_STALL
,
};
#define EP0_FIFO_SIZE ((unsigned)16)
#define BULK_FIFO_SIZE ((unsigned)64)
#define ISO_FIFO_SIZE ((unsigned)256)
#define INT_FIFO_SIZE ((unsigned)8)
struct
udc_stats
{
struct
ep0stats
{
unsigned
long
ops
;
unsigned
long
bytes
;
}
read
,
write
;
unsigned
long
irqs
;
};
#ifdef CONFIG_USB_PXA2XX_SMALL
/* when memory's tight, SMALL config saves code+data. */
#undef USE_DMA
#define PXA_UDC_NUM_ENDPOINTS 3
#endif
#ifndef PXA_UDC_NUM_ENDPOINTS
#define PXA_UDC_NUM_ENDPOINTS 16
#endif
struct
pxa2xx_udc
{
struct
usb_gadget
gadget
;
struct
usb_gadget_driver
*
driver
;
enum
ep0_state
ep0state
;
struct
udc_stats
stats
;
unsigned
got_irq
:
1
,
got_disc
:
1
,
has_cfr
:
1
,
req_pending
:
1
,
req_std
:
1
,
req_config
:
1
;
#define start_watchdog(dev) mod_timer(&dev->timer, jiffies + (HZ/200))
struct
timer_list
timer
;
struct
device
*
dev
;
struct
pxa2xx_udc_mach_info
*
mach
;
u64
dma_mask
;
struct
pxa2xx_ep
ep
[
PXA_UDC_NUM_ENDPOINTS
];
};
/*-------------------------------------------------------------------------*/
#ifdef CONFIG_ARCH_LUBBOCK
#include <asm/arch/lubbock.h>
/* lubbock can also report usb connect/disconnect irqs */
#ifdef DEBUG
#define HEX_DISPLAY(n) if (machine_is_lubbock()) { LUB_HEXLED = (n); }
#define LED_CONNECTED_ON if (machine_is_lubbock()) { \
DISCRETE_LED_ON(D26); }
#define LED_CONNECTED_OFF if(machine_is_lubbock()) { \
DISCRETE_LED_OFF(D26); LUB_HEXLED = 0; }
#define LED_EP0_ON if (machine_is_lubbock()) { DISCRETE_LED_ON(D25); }
#define LED_EP0_OFF if (machine_is_lubbock()) { DISCRETE_LED_OFF(D25); }
#endif
/* DEBUG */
#endif
/*-------------------------------------------------------------------------*/
/* LEDs are only for debug */
#ifndef HEX_DISPLAY
#define HEX_DISPLAY(n) do {} while(0)
#endif
#ifndef LED_CONNECTED_ON
#define LED_CONNECTED_ON do {} while(0)
#define LED_CONNECTED_OFF do {} while(0)
#endif
#ifndef LED_EP0_ON
#define LED_EP0_ON do {} while (0)
#define LED_EP0_OFF do {} while (0)
#endif
/*-------------------------------------------------------------------------*/
static
struct
pxa2xx_udc
*
the_controller
;
/* one GPIO should be used to detect host disconnect */
static
inline
int
is_usb_connected
(
void
)
{
if
(
!
the_controller
->
mach
->
udc_is_connected
)
return
1
;
return
the_controller
->
mach
->
udc_is_connected
();
}
/* one GPIO should force the host to see this device (or not) */
static
inline
void
make_usb_disappear
(
void
)
{
if
(
!
the_controller
->
mach
->
udc_command
)
return
;
the_controller
->
mach
->
udc_command
(
PXA2XX_UDC_CMD_CONNECT
);
}
static
inline
void
let_usb_appear
(
void
)
{
if
(
!
the_controller
->
mach
->
udc_command
)
return
;
the_controller
->
mach
->
udc_command
(
PXA2XX_UDC_CMD_DISCONNECT
);
}
/*-------------------------------------------------------------------------*/
/*
* Debugging support vanishes in non-debug builds. DBG_NORMAL should be
* mostly silent during normal use/testing, with no timing side-effects.
*/
#define DBG_NORMAL 1
/* error paths, device state transitions */
#define DBG_VERBOSE 2
/* add some success path trace info */
#define DBG_NOISY 3
/* ... even more: request level */
#define DBG_VERY_NOISY 4
/* ... even more: packet level */
#ifdef DEBUG
static
const
char
*
state_name
[]
=
{
"EP0_IDLE"
,
"EP0_IN_DATA_PHASE"
,
"EP0_OUT_DATA_PHASE"
,
"EP0_END_XFER"
,
"EP0_STALL"
};
#define DMSG(stuff...) printk(KERN_DEBUG "udc: " stuff)
#ifdef VERBOSE
# define UDC_DEBUG DBG_VERBOSE
#else
# define UDC_DEBUG DBG_NORMAL
#endif
static
void
__attribute__
((
__unused__
))
dump_udccr
(
const
char
*
label
)
{
u32
udccr
=
UDCCR
;
DMSG
(
"%s %02X =%s%s%s%s%s%s%s%s
\n
"
,
label
,
udccr
,
(
udccr
&
UDCCR_REM
)
?
" rem"
:
""
,
(
udccr
&
UDCCR_RSTIR
)
?
" rstir"
:
""
,
(
udccr
&
UDCCR_SRM
)
?
" srm"
:
""
,
(
udccr
&
UDCCR_SUSIR
)
?
" susir"
:
""
,
(
udccr
&
UDCCR_RESIR
)
?
" resir"
:
""
,
(
udccr
&
UDCCR_RSM
)
?
" rsm"
:
""
,
(
udccr
&
UDCCR_UDA
)
?
" uda"
:
""
,
(
udccr
&
UDCCR_UDE
)
?
" ude"
:
""
);
}
static
void
__attribute__
((
__unused__
))
dump_udccs0
(
const
char
*
label
)
{
u32
udccs0
=
UDCCS0
;
DMSG
(
"%s %s %02X =%s%s%s%s%s%s%s%s
\n
"
,
label
,
state_name
[
the_controller
->
ep0state
],
udccs0
,
(
udccs0
&
UDCCS0_SA
)
?
" sa"
:
""
,
(
udccs0
&
UDCCS0_RNE
)
?
" rne"
:
""
,
(
udccs0
&
UDCCS0_FST
)
?
" fst"
:
""
,
(
udccs0
&
UDCCS0_SST
)
?
" sst"
:
""
,
(
udccs0
&
UDCCS0_DRWF
)
?
" dwrf"
:
""
,
(
udccs0
&
UDCCS0_FTF
)
?
" ftf"
:
""
,
(
udccs0
&
UDCCS0_IPR
)
?
" ipr"
:
""
,
(
udccs0
&
UDCCS0_OPR
)
?
" opr"
:
""
);
}
static
void
__attribute__
((
__unused__
))
dump_state
(
struct
pxa2xx_udc
*
dev
)
{
u32
tmp
;
unsigned
i
;
DMSG
(
"%s %s, uicr %02X.%02X, usir %02X.%02x, ufnr %02X.%02X
\n
"
,
is_usb_connected
()
?
"host "
:
"disconnected"
,
state_name
[
dev
->
ep0state
],
UICR1
,
UICR0
,
USIR1
,
USIR0
,
UFNRH
,
UFNRL
);
dump_udccr
(
"udccr"
);
if
(
dev
->
has_cfr
)
{
tmp
=
UDCCFR
;
DMSG
(
"udccfr %02X =%s%s
\n
"
,
tmp
,
(
tmp
&
UDCCFR_AREN
)
?
" aren"
:
""
,
(
tmp
&
UDCCFR_ACM
)
?
" acm"
:
""
);
}
if
(
!
dev
->
driver
)
{
DMSG
(
"no gadget driver bound
\n
"
);
return
;
}
else
DMSG
(
"ep0 driver '%s'
\n
"
,
dev
->
driver
->
driver
.
name
);
if
(
!
is_usb_connected
())
return
;
dump_udccs0
(
"udccs0"
);
DMSG
(
"ep0 IN %lu/%lu, OUT %lu/%lu
\n
"
,
dev
->
stats
.
write
.
bytes
,
dev
->
stats
.
write
.
ops
,
dev
->
stats
.
read
.
bytes
,
dev
->
stats
.
read
.
ops
);
for
(
i
=
1
;
i
<
PXA_UDC_NUM_ENDPOINTS
;
i
++
)
{
if
(
dev
->
ep
[
i
].
desc
==
0
)
continue
;
DMSG
(
"udccs%d = %02x
\n
"
,
i
,
*
dev
->
ep
->
reg_udccs
);
}
}
#else
#define DMSG(stuff...) do{}while(0)
#define dump_udccr(x) do{}while(0)
#define dump_udccs0(x) do{}while(0)
#define dump_state(x) do{}while(0)
#define UDC_DEBUG ((unsigned)0)
#endif
#define DBG(lvl, stuff...) do{if ((lvl) <= UDC_DEBUG) DMSG(stuff);}while(0)
#define WARN(stuff...) printk(KERN_WARNING "udc: " stuff)
#endif
/* __LINUX_USB_GADGET_PXA2XX_H */
drivers/video/Kconfig
View file @
1c23361e
...
@@ -109,29 +109,6 @@ config FB_SA1100
...
@@ -109,29 +109,6 @@ config FB_SA1100
If you plan to use the LCD display with your SA-1100 system, say
If you plan to use the LCD display with your SA-1100 system, say
Y here.
Y here.
choice
prompt "CerfBoard LCD Display Size"
depends on FB_SA1100 && SA1100_CERF
default CERF_LCD_57_A
config CERF_LCD_38_A
bool "3.8_Color"
config CERF_LCD_38_B
bool "3.8_Mono"
config CERF_LCD_57_A
bool "5.7"
config CERF_LCD_72_A
bool "7.2"
endchoice
config SA1100_CERF_LCD_BACKLIGHT
bool "Cerfboard Backlight (CerfPDA)"
depends on FB_SA1100 && SA1100_CERF_CPLD
config FB_CYBER2000
config FB_CYBER2000
tristate "CyberPro 2000/2010/5000 support"
tristate "CyberPro 2000/2010/5000 support"
depends on FB && PCI
depends on FB && PCI
...
...
drivers/video/console/font_acorn_8x8.c
View file @
1c23361e
...
@@ -10,33 +10,33 @@ static unsigned char acorndata_8x8[] = {
...
@@ -10,33 +10,33 @@ static unsigned char acorndata_8x8[] = {
/* 03 */
0x6c
,
0xfe
,
0xfe
,
0xfe
,
0x7c
,
0x38
,
0x10
,
0x00
,
/* ^C */
/* 03 */
0x6c
,
0xfe
,
0xfe
,
0xfe
,
0x7c
,
0x38
,
0x10
,
0x00
,
/* ^C */
/* 04 */
0x10
,
0x38
,
0x7c
,
0xfe
,
0x7c
,
0x38
,
0x10
,
0x00
,
/* ^D */
/* 04 */
0x10
,
0x38
,
0x7c
,
0xfe
,
0x7c
,
0x38
,
0x10
,
0x00
,
/* ^D */
/* 05 */
0x00
,
0x18
,
0x3c
,
0xe7
,
0xe7
,
0x3c
,
0x18
,
0x00
,
/* ^E */
/* 05 */
0x00
,
0x18
,
0x3c
,
0xe7
,
0xe7
,
0x3c
,
0x18
,
0x00
,
/* ^E */
/* 06 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 06 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 07 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 07 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 08 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 08 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 09 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 09 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 0A */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 0A */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 0B */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 0B */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 0C */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 0C */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 0D */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 0D */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 0E */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 0E */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 0F */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 0F */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 10 */
0x00
,
0x60
,
0x78
,
0x7e
,
0x7e
,
0x78
,
0x60
,
0x00
,
/* |> */
/* 10 */
0x00
,
0x60
,
0x78
,
0x7e
,
0x7e
,
0x78
,
0x60
,
0x00
,
/* |> */
/* 11 */
0x00
,
0x06
,
0x1e
,
0x7e
,
0x7e
,
0x1e
,
0x06
,
0x00
,
/* <| */
/* 11 */
0x00
,
0x06
,
0x1e
,
0x7e
,
0x7e
,
0x1e
,
0x06
,
0x00
,
/* <| */
/* 12 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 12 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 13 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 13 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 14 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 14 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 15 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 15 */
0x
3c
,
0x60
,
0x3c
,
0x66
,
0x3c
,
0x06
,
0x3c
,
0x00
,
/* 16 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 16 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 17 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 17 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 18 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 18 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 19 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 19 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 1A */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 1A */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 1B */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 1B */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 1C */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 1C */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 1D */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 1D */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 1E */
0x00
,
0x18
,
0x18
,
0x3c
,
0x3c
,
0x7e
,
0x7e
,
0x00
,
/* /\ */
/* 1E */
0x00
,
0x18
,
0x18
,
0x3c
,
0x3c
,
0x7e
,
0x7e
,
0x00
,
/* /\ */
/* 1F */
0x00
,
0x7e
,
0x7e
,
0x3c
,
0x3c
,
0x18
,
0x18
,
0x00
,
/* \/ */
/* 1F */
0x00
,
0x7e
,
0x7e
,
0x3c
,
0x3c
,
0x18
,
0x18
,
0x00
,
/* \/ */
/* 20 */
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/*
*/
/* 20 */
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/*
*/
/* 21 */
0x18
,
0x3c
,
0x3c
,
0x18
,
0x18
,
0x00
,
0x18
,
0x00
,
/* ! */
/* 21 */
0x18
,
0x3c
,
0x3c
,
0x18
,
0x18
,
0x00
,
0x18
,
0x00
,
/* ! */
/* 22 */
0x6C
,
0x6C
,
0x6C
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* " */
/* 22 */
0x6C
,
0x6C
,
0x6C
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* " */
/* 23 */
0x36
,
0x36
,
0x7F
,
0x36
,
0x7F
,
0x36
,
0x36
,
0x00
,
/* # */
/* 23 */
0x36
,
0x36
,
0x7F
,
0x36
,
0x7F
,
0x36
,
0x36
,
0x00
,
/* # */
...
@@ -131,55 +131,55 @@ static unsigned char acorndata_8x8[] = {
...
@@ -131,55 +131,55 @@ static unsigned char acorndata_8x8[] = {
/* 7C */
0x18
,
0x18
,
0x18
,
0x18
,
0x18
,
0x18
,
0x18
,
0x00
,
/* | */
/* 7C */
0x18
,
0x18
,
0x18
,
0x18
,
0x18
,
0x18
,
0x18
,
0x00
,
/* | */
/* 7D */
0x30
,
0x18
,
0x18
,
0x0E
,
0x18
,
0x18
,
0x30
,
0x00
,
/* } */
/* 7D */
0x30
,
0x18
,
0x18
,
0x0E
,
0x18
,
0x18
,
0x30
,
0x00
,
/* } */
/* 7E */
0x31
,
0x6B
,
0x46
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* ~ */
/* 7E */
0x31
,
0x6B
,
0x46
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* ~ */
/* 7F */
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
/* */
/* 7F */
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
0xFF
,
/* */
/* 80 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x0
0
,
/* 80 */
0x
3c
,
0x66
,
0x60
,
0x60
,
0x66
,
0x3c
,
0x30
,
0x6
0
,
/* 81 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 81 */
0x
66
,
0x00
,
0x66
,
0x66
,
0x66
,
0x66
,
0x3e
,
0x00
,
/* 82 */
0x0
0
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 82 */
0x0
c
,
0x18
,
0x3c
,
0x66
,
0x7e
,
0x60
,
0x3c
,
0x00
,
/* 83 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 83 */
0x
18
,
0x66
,
0x3c
,
0x06
,
0x3e
,
0x66
,
0x3e
,
0x00
,
/* 84 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 84 */
0x
66
,
0x00
,
0x3c
,
0x06
,
0x3e
,
0x66
,
0x3e
,
0x00
,
/* 85 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 85 */
0x
30
,
0x18
,
0x3c
,
0x06
,
0x3e
,
0x66
,
0x3e
,
0x00
,
/* 86 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 86 */
0x
3c
,
0x66
,
0x3c
,
0x06
,
0x3e
,
0x66
,
0x3e
,
0x00
,
/* 87 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x0
0
,
/* 87 */
0x00
,
0x00
,
0x
3c
,
0x66
,
0x60
,
0x66
,
0x3c
,
0x6
0
,
/* 88 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 88 */
0x
3c
,
0x66
,
0x3c
,
0x66
,
0x7e
,
0x60
,
0x3c
,
0x00
,
/* 89 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 89 */
0x
66
,
0x00
,
0x3c
,
0x66
,
0x7e
,
0x60
,
0x3c
,
0x00
,
/* 8A */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 8A */
0x
30
,
0x18
,
0x3c
,
0x66
,
0x7e
,
0x60
,
0x3c
,
0x00
,
/* 8B */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 8B */
0x
66
,
0x00
,
0x00
,
0x38
,
0x18
,
0x18
,
0x3c
,
0x00
,
/* 8C */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 8C */
0x
3c
,
0x66
,
0x00
,
0x38
,
0x18
,
0x18
,
0x3c
,
0x00
,
/* 8D */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 8D */
0x
30
,
0x18
,
0x00
,
0x38
,
0x18
,
0x18
,
0x3c
,
0x00
,
/* 8E */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 8E */
0x
66
,
0x66
,
0x00
,
0x3c
,
0x66
,
0x7e
,
0x66
,
0x00
,
/* 8F */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 8F */
0x
18
,
0x66
,
0x00
,
0x3c
,
0x66
,
0x7e
,
0x66
,
0x00
,
/* 90 */
0x0
0
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 90 */
0x0
c
,
0x18
,
0x7e
,
0x60
,
0x7c
,
0x60
,
0x7e
,
0x00
,
/* 91 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 91 */
0x00
,
0x00
,
0x
3f
,
0x0d
,
0x3f
,
0x6c
,
0x3f
,
0x00
,
/* 92 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 92 */
0x
3f
,
0x66
,
0x66
,
0x7f
,
0x66
,
0x66
,
0x67
,
0x00
,
/* 93 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 93 */
0x
3c
,
0x66
,
0x00
,
0x3c
,
0x66
,
0x66
,
0x3c
,
0x00
,
/* 94 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 94 */
0x
66
,
0x00
,
0x00
,
0x3c
,
0x66
,
0x66
,
0x3c
,
0x00
,
/* 95 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 95 */
0x
30
,
0x18
,
0x00
,
0x3c
,
0x66
,
0x66
,
0x3c
,
0x00
,
/* 96 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 96 */
0x
3c
,
0x66
,
0x00
,
0x66
,
0x66
,
0x66
,
0x3e
,
0x00
,
/* 97 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 97 */
0x
30
,
0x18
,
0x00
,
0x66
,
0x66
,
0x66
,
0x3e
,
0x00
,
/* 98 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 98 */
0x
66
,
0x00
,
0x66
,
0x66
,
0x66
,
0x3e
,
0x06
,
0x3c
,
/* 99 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 99 */
0x
66
,
0x00
,
0x3c
,
0x66
,
0x66
,
0x66
,
0x3c
,
0x00
,
/* 9A */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 9A */
0x
66
,
0x00
,
0x66
,
0x66
,
0x66
,
0x66
,
0x3c
,
0x00
,
/* 9B */
0x0
0
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 9B */
0x0
8
,
0x3e
,
0x6b
,
0x68
,
0x6b
,
0x3e
,
0x08
,
0x00
,
/* 9C */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 9C */
0x
1c
,
0x36
,
0x30
,
0x7c
,
0x30
,
0x30
,
0x7e
,
0x00
,
/* 9D */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 9D */
0x
66
,
0x3c
,
0x18
,
0x18
,
0x7e
,
0x18
,
0x18
,
0x00
,
/* 9E */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 9E */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* 9F */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* 9F */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* A0 */
0x0
0
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* A0 */
0x0
c
,
0x18
,
0x3c
,
0x06
,
0x3e
,
0x66
,
0x3e
,
0x00
,
/* A1 */
0x0
0
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* A1 */
0x0
c
,
0x18
,
0x00
,
0x38
,
0x18
,
0x18
,
0x3c
,
0x00
,
/* A2 */
0x0
0
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* A2 */
0x0
c
,
0x18
,
0x00
,
0x3c
,
0x66
,
0x66
,
0x3c
,
0x00
,
/* A3 */
0x0
0
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* A3 */
0x0
c
,
0x18
,
0x00
,
0x66
,
0x66
,
0x66
,
0x3e
,
0x00
,
/* A4 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* A4 */
0x
36
,
0x6c
,
0x00
,
0x7c
,
0x66
,
0x66
,
0x66
,
0x00
,
/* A5 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* A5 */
0x
36
,
0x6c
,
0x00
,
0x66
,
0x76
,
0x6e
,
0x66
,
0x00
,
/* A6 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* A6 */
0x
1c
,
0x06
,
0x1e
,
0x36
,
0x1e
,
0x00
,
0x3e
,
0x00
,
/* A7 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* A7 */
0x
1c
,
0x36
,
0x36
,
0x36
,
0x1c
,
0x00
,
0x3e
,
0x00
,
/* A8 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* A8 */
0x
18
,
0x00
,
0x18
,
0x18
,
0x30
,
0x66
,
0x3c
,
0x00
,
/* A9 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* A9 */
0x
7e
,
0x06
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* AA */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* AA */
0x
7e
,
0x06
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* AB */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* AB */
0x
40
,
0xc0
,
0x40
,
0x4f
,
0x41
,
0x0f
,
0x08
,
0x0f
,
/* AC */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* AC */
0x
40
,
0xc0
,
0x40
,
0x48
,
0x48
,
0x0a
,
0x0f
,
0x02
,
/* AD */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* AD */
0x
18
,
0x00
,
0x18
,
0x18
,
0x18
,
0x18
,
0x18
,
0x00
,
/* AE */
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* AE */
0x00
,
0x
33
,
0x66
,
0xcc
,
0xcc
,
0x66
,
0x33
,
0x00
,
/* AF */
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* AF */
0x00
,
0x
cc
,
0x66
,
0x33
,
0x33
,
0x66
,
0xcc
,
0x00
,
/* B0 */
0x22
,
0x88
,
0x22
,
0x88
,
0x22
,
0x88
,
0x22
,
0x88
,
/* B0 */
0x22
,
0x88
,
0x22
,
0x88
,
0x22
,
0x88
,
0x22
,
0x88
,
/* B1 */
0x55
,
0xaa
,
0x55
,
0xaa
,
0x55
,
0xaa
,
0x55
,
0xaa
,
/* B1 */
0x55
,
0xaa
,
0x55
,
0xaa
,
0x55
,
0xaa
,
0x55
,
0xaa
,
/* B2 */
0xdd
,
0x77
,
0xdd
,
0x77
,
0xdd
,
0x77
,
0xdd
,
0x77
,
/* B2 */
0xdd
,
0x77
,
0xdd
,
0x77
,
0xdd
,
0x77
,
0xdd
,
0x77
,
...
@@ -228,37 +228,37 @@ static unsigned char acorndata_8x8[] = {
...
@@ -228,37 +228,37 @@ static unsigned char acorndata_8x8[] = {
/* DD */
0xf0
,
0xf0
,
0xf0
,
0xf0
,
0xf0
,
0xf0
,
0xf0
,
0xf0
,
/* DD */
0xf0
,
0xf0
,
0xf0
,
0xf0
,
0xf0
,
0xf0
,
0xf0
,
0xf0
,
/* DE */
0x0f
,
0x0f
,
0x0f
,
0x0f
,
0x0f
,
0x0f
,
0x0f
,
0x0f
,
/* DE */
0x0f
,
0x0f
,
0x0f
,
0x0f
,
0x0f
,
0x0f
,
0x0f
,
0x0f
,
/* DF */
0xff
,
0xff
,
0xff
,
0xff
,
0x00
,
0x00
,
0x00
,
0x00
,
/* DF */
0xff
,
0xff
,
0xff
,
0xff
,
0x00
,
0x00
,
0x00
,
0x00
,
/* E0 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* E0 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* E1 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x0
0
,
/* E1 */
0x
3c
,
0x66
,
0x66
,
0x6c
,
0x66
,
0x66
,
0x6c
,
0xc
0
,
/* E2 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* E2 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* E3 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* E3 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* E4 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* E4 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* E5 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* E5 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* E6 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x0
0
,
/* E6 */
0x00
,
0x00
,
0x
33
,
0x33
,
0x33
,
0x33
,
0x3e
,
0x6
0
,
/* E7 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* E7 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* E8 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* E8 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* E9 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* E9 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* EA */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* EA */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* EB */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* EB */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* EC */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* EC */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* ED */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* ED */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* EE */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* EE */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* EF */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* EF */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* F0 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* F0 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* F1 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* F1 */
0x
18
,
0x18
,
0x7e
,
0x18
,
0x18
,
0x00
,
0x7e
,
0x00
,
/* F2 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* F2 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* F3 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* F3 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* F4 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* F4 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* F5 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* F5 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* F6 */
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* F6 */
0x00
,
0x
18
,
0x00
,
0xff
,
0x00
,
0x18
,
0x00
,
0x00
,
/* F7 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* F7 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* F8 */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* F8 */
0x
3c
,
0x66
,
0x3c
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* F9 */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* F9 */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* FA */
0x00
,
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* FA */
0x00
,
0x00
,
0x00
,
0x
18
,
0x18
,
0x00
,
0x00
,
0x00
,
/* FB */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* FB */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* FC */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* FC */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* FD */
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* FD */
0x
38
,
0x04
,
0x18
,
0x20
,
0x3c
,
0x00
,
0x00
,
0x00
,
/* FE */
0x00
,
0x00
,
0x
00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
/* FE */
0x00
,
0x00
,
0x
3c
,
0x3c
,
0x3c
,
0x3c
,
0x00
,
0x00
,
/* FF */
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
/* FF */
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
,
0x00
};
};
...
...
drivers/video/sa1100fb.c
View file @
1c23361e
...
@@ -326,54 +326,6 @@ static struct sa1100fb_mach_info brutus_info __initdata = {
...
@@ -326,54 +326,6 @@ static struct sa1100fb_mach_info brutus_info __initdata = {
};
};
#endif
#endif
#ifdef CONFIG_SA1100_CERF
static
struct
sa1100fb_mach_info
cerf_info
__initdata
=
{
#if defined(CONFIG_CERF_LCD_72_A)
.
pixclock
=
171521
,
.
bpp
=
8
,
.
xres
=
640
,
.
yres
=
480
,
.
lccr0
=
LCCR0_Color
|
LCCR0_Dual
|
LCCR0_Pas
,
.
lccr3
=
LCCR3_OutEnH
|
LCCR3_PixRsEdg
|
LCCR3_ACBsDiv
(
2
)
|
LCCR3_PixClkDiv
(
38
),
#elif defined(CONFIG_CERF_LCD_57_A)
.
pixclock
=
171521
,
.
bpp
=
8
,
.
xres
=
320
,
.
yres
=
240
,
.
lccr0
=
LCCR0_Color
|
LCCR0_Sngl
|
LCCR0_Pas
,
.
lccr3
=
LCCR3_OutEnH
|
LCCR3_PixRsEdg
|
LCCR3_ACBsDiv
(
2
)
|
LCCR3_PixClkDiv
(
38
),
#elif defined(CONFIG_CERF_LCD_38_A)
.
pixclock
=
171521
,
.
bpp
=
8
,
.
xres
=
240
,
.
yres
=
320
,
.
lccr0
=
LCCR0_Color
|
LCCR0_Sngl
|
LCCR0_Pas
,
.
lccr3
=
LCCR3_OutEnH
|
LCCR3_PixRsEdg
|
LCCR3_ACBsDiv
(
56
)
|
LCCR3_PixClkDiv
(
38
),
#elif defined(CONFIG_CERF_LCD_38_B)
.
pixclock
=
171521
,
.
bpp
=
4
,
.
xres
=
320
,
.
yres
=
240
,
.
lccr0
=
LCCR0_Mono
|
LCCR0_4PixMono
|
LCCR0_Sngl
|
LCCR0_Pas
,
.
lccr3
=
LCCR3_OutEnH
|
LCCR3_PixRsEdg
|
LCCR3_ACBsDiv
(
56
)
|
LCCR3_PixClkDiv
(
38
),
#else
#error "Must have a CerfBoard LCD form factor selected"
#endif
.
hsync_len
=
5
,
.
vsync_len
=
1
,
.
left_margin
=
61
,
.
upper_margin
=
3
,
.
right_margin
=
9
,
.
lower_margin
=
0
,
.
sync
=
FB_SYNC_HOR_HIGH_ACT
|
FB_SYNC_VERT_HIGH_ACT
,
};
#if 0
static struct sa1100fb_rgb cerf_rgb_16 = {
.red = { .offset = 8, .length = 4, },
.green = { .offset = 4, .length = 4, },
.blue = { .offset = 0, .length = 4, },
.transp = { .offset = 0, .length = 0, },
};
#endif
#endif
#ifdef CONFIG_SA1100_FREEBIRD
#ifdef CONFIG_SA1100_FREEBIRD
#warning Please check this carefully
#warning Please check this carefully
static
struct
sa1100fb_mach_info
freebird_info
__initdata
=
{
static
struct
sa1100fb_mach_info
freebird_info
__initdata
=
{
...
@@ -683,11 +635,6 @@ sa1100fb_get_machine_info(struct sa1100fb_info *fbi)
...
@@ -683,11 +635,6 @@ sa1100fb_get_machine_info(struct sa1100fb_info *fbi)
inf
=
&
brutus_info
;
inf
=
&
brutus_info
;
}
}
#endif
#endif
#ifdef CONFIG_SA1100_CERF
if
(
machine_is_cerf
())
{
inf
=
&
cerf_info
;
}
#endif
#ifdef CONFIG_SA1100_FREEBIRD
#ifdef CONFIG_SA1100_FREEBIRD
if
(
machine_is_freebird
())
{
if
(
machine_is_freebird
())
{
inf
=
&
freebird_info
;
inf
=
&
freebird_info
;
...
@@ -1294,10 +1241,6 @@ static void sa1100fb_setup_gpio(struct sa1100fb_info *fbi)
...
@@ -1294,10 +1241,6 @@ static void sa1100fb_setup_gpio(struct sa1100fb_info *fbi)
}
}
/* GPIO15 is used as a bypass for 3.8" displays */
if
(
machine_is_cerf
())
mask
|=
GPIO_GPIO15
;
if
(
mask
)
{
if
(
mask
)
{
GPDR
|=
mask
;
GPDR
|=
mask
;
GAFR
|=
mask
;
GAFR
|=
mask
;
...
...
include/asm-arm/arch-pxa/udc.h
0 → 100644
View file @
1c23361e
/*
* linux/include/asm-arm/arch-pxa/udc.h
*
* This supports machine-specific differences in how the PXA2xx
* USB Device Controller (UDC) is wired.
*
* It is set in linux/arch/arm/mach-pxa/<machine>.c and used in
* the probe routine of linux/drivers/usb/gadget/pxa2xx_udc.c
*/
struct
pxa2xx_udc_mach_info
{
int
(
*
udc_is_connected
)(
void
);
/* do we see host? */
void
(
*
udc_command
)(
int
cmd
);
#define PXA2XX_UDC_CMD_CONNECT 0
/* let host see us */
#define PXA2XX_UDC_CMD_DISCONNECT 1
/* so host won't see us */
};
extern
void
pxa_set_udc_info
(
struct
pxa2xx_udc_mach_info
*
info
);
include/asm-arm/arch-sa1100/keyboard.h
View file @
1c23361e
...
@@ -11,7 +11,6 @@
...
@@ -11,7 +11,6 @@
extern
void
gc_kbd_init_hw
(
void
);
extern
void
gc_kbd_init_hw
(
void
);
extern
void
smartio_kbd_init_hw
(
void
);
extern
void
smartio_kbd_init_hw
(
void
);
extern
void
cerf_kbd_init_hw
(
void
);
static
inline
void
kbd_init_hw
(
void
)
static
inline
void
kbd_init_hw
(
void
)
{
{
...
@@ -19,10 +18,6 @@ static inline void kbd_init_hw(void)
...
@@ -19,10 +18,6 @@ static inline void kbd_init_hw(void)
gc_kbd_init_hw
();
gc_kbd_init_hw
();
if
(
machine_is_adsbitsy
())
if
(
machine_is_adsbitsy
())
smartio_kbd_init_hw
();
smartio_kbd_init_hw
();
#ifdef CONFIG_SA1100_CERF_CPLD
if
(
machine_is_cerf
())
cerf_kbd_init_hw
();
#endif
}
}
#endif
/* _SA1100_KEYBOARD_H */
#endif
/* _SA1100_KEYBOARD_H */
include/asm-arm/mach/arch.h
View file @
1c23361e
...
@@ -12,7 +12,7 @@
...
@@ -12,7 +12,7 @@
* The size of struct machine_desc
* The size of struct machine_desc
* (for assembler code)
* (for assembler code)
*/
*/
#define SIZEOF_MACHINE_DESC
48
#define SIZEOF_MACHINE_DESC
52
#ifndef __ASSEMBLY__
#ifndef __ASSEMBLY__
...
@@ -45,6 +45,7 @@ struct machine_desc {
...
@@ -45,6 +45,7 @@ struct machine_desc {
struct
meminfo
*
);
struct
meminfo
*
);
void
(
*
map_io
)(
void
);
/* IO mapping function */
void
(
*
map_io
)(
void
);
/* IO mapping function */
void
(
*
init_irq
)(
void
);
void
(
*
init_irq
)(
void
);
void
(
*
init_machine
)(
void
);
};
};
/*
/*
...
@@ -86,6 +87,9 @@ const struct machine_desc __mach_desc_##_type \
...
@@ -86,6 +87,9 @@ const struct machine_desc __mach_desc_##_type \
#define INITIRQ(_func) \
#define INITIRQ(_func) \
.init_irq = _func,
.init_irq = _func,
#define INIT_MACHINE(_func) \
.init_machine = _func,
#define MACHINE_END \
#define MACHINE_END \
};
};
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment