Merge branches 'at91', 'ep93xx', 'iop', 'kprobes', 'ks8695', 'misc', 'msm', 's3c2410', 'sa1100' and 'vfp' into devel
* at91: (24 commits) [ARM] 4615/4: sam926[13]ek buttons updated [ARM] 4765/1: [AT91] AT91CAP9A-DK board support [ARM] 4764/1: [AT91] AT91CAP9 core support [ARM] 4738/1: at91sam9261: Remove udc pullup enabling in board initialisation [ARM] 4761/1: [AT91] Board-support for NEW_LEDs [ARM] 4760/1: [AT91] SPI CS0 errata on AT91RM9200 [ARM] 4759/1: [AT91] Buttons on CSB300 [ARM] 4758/1: [AT91] LEDs [ARM] 4757/1: [AT91] UART initialization [ARM] 4756/1: [AT91] Makefile cleanup [ARM] 4755/1: [AT91] NAND update [ARM] 4754/1: [AT91] SSC library support [ARM] 4753/1: [AT91] Use DMA_BIT_MASK [ARM] 4752/1: [AT91] RTT, RTC and WDT peripherals on SAM9 [ARM] 4751/1: [AT91] ISI peripheral on SAM9263 [ARM] 4750/1: [AT91] STN LCD displays on SAM9261 [ARM] 4734/1: at91sam9263ek: include IRQ for Ethernet PHY [ARM] 4646/1: AT91: configurable HZ, default to 128 [ARM] 4688/1: at91: speed-up irq processing [ARM] 4657/1: AT91: Header definition update ... * ep93xx: [ARM] 4671/1: ep93xx: remove obsolete gpio_line_* operations [ARM] 4670/1: ep93xx: implement IRQT_BOTHEDGE gpio irq sense type [ARM] 4669/1: ep93xx: simplify GPIO code and cleanups [ARM] 4668/1: ep93xx: implement new GPIO API * iop: [ARM] 4770/1: GLAN Tank: correct physmap_flash_data width field [ARM] 4732/1: GLAN Tank: register rtc-rs5c372 i2c device [ARM] 4708/1: iop: update defconfigs for 2.6.24 * kprobes: ARM kprobes: let's enable it ARM kprobes: special hook for the kprobes breakpoint handler ARM kprobes: prevent some functions involved with kprobes from being probed ARM kprobes: don't let a single-stepped stmdb corrupt the exception stack ARM kprobes: add the kprobes hook to the page fault handler ARM kprobes: core code ARM kprobes: instruction single-stepping support * ks8695: [ARM] 4603/1: KS8695: debugfs interface to view pin state [ARM] 4601/1: KS8695: PCI support * misc: [ARM] remove duplicate includes [ARM] CONFIG_DEBUG_STACK_USAGE [ARM] 4689/1: small comment wrap fix [ARM] 4687/1: Trivial arch/arm/kernel/entry-common.S comment fix [ARM] 4666/1: ixp4xx: fix sparse warnings in include/asm-arm/arch-ixp4xx/io.h [ARM] remove reference to non-existent MTD_OBSOLETE_CHIPS [SERIAL] 21285: Report baud rate back via termios [ARM] Remove pointless casts from void pointers, [ARM] Misc minor interrupt handler cleanups [ARM] Remove at91_lcdc.h [ARM] ARRAY_SIZE() cleanup [ARM] Update mach-types * msm: [ARM] msm: dma support for MSM7X00A [ARM] msm: board file for MACH_HALIBUT (QCT MSM7200A) [ARM] msm: irq and timer support for ARCH_MSM7X00A [ARM] msm: core platform support for ARCH_MSM7X00A * s3c2410: (33 commits) [ARM] 4795/1: S3C244X: Add armclk and setparent call [ARM] 4794/1: S3C24XX: Comonise S3C2440 and S3C2442 clock code [ARM] 4793/1: S3C24XX: Add IRQ->GPIO pin mapping function [ARM] 4792/1: S3C24XX: Remove warnings from debug-macro.S [ARM] 4791/1: S3C2412: Make fclk a parent of msysclk [ARM] 4790/1: S3C2412: Fix parent selection for msysclk. [ARM] 4789/1: S3C2412: Add missing CLKDIVN register values [ARM] 4788/1: S3C24XX: Fix paramet to s3c2410_dma_ctrl if S3C2410_DMAF_AUTOSTART used. [ARM] 4787/1: S3C24XX: s3c2410_dma_request() should return the allocated channel number [ARM] 4786/1: S3C2412: Add SPI FIFO controll constants [ARM] 4785/1: S3C24XX: Add _SHIFT definitions for S3C2410_BANKCON registers [ARM] 4784/1: S3C24XX: Fix GPIO restore glitches [ARM] 4783/1: S3C24XX: Add s3c2410_gpio_getpull() [ARM] 4782/1: S3C24XX: Define FIQ_START for any FIQ users [ARM] 4781/1: S3C24XX: DMA suspend and resume support [ARM] 4780/1: S3C2412: Allow for seperate DMA channels for TX and RX [ARM] 4779/1: S3C2412: Add s3c2412_gpio_set_sleepcfg() call [ARM] 4778/1: S3C2412: Add armclk and init from DVS state [ARM] 4777/1: S3C24XX: Ensure clk_set_rate() checks the set_rate method for the clk [ARM] 4775/1: s3c2410: fix compilation error if only s3c2442 cpu is selected ... * sa1100: [ARM] sa1100: add clock source support * vfp: [ARM] 4584/2: ARMv7: Add Advanced SIMD (NEON) extension support [ARM] 4583/1: ARMv7: Add VFPv3 support [ARM] 4582/2: Add support for the common VFP subarchitecture
This commit is contained in:
Родитель
e01dbdb40e
eaf858a988
6331acd78f
b696b6b448
5de865b4c5
20118ff978
1d7d4f54b1
bfe645adf1
06dbbd69f9
d142b6e77d
b5872db4a2
Коммит
d0d42df2a4
|
@ -141,6 +141,7 @@ architectures:
|
|||
- ppc64
|
||||
- ia64 (Does not support probes on instruction slot1.)
|
||||
- sparc64 (Return probes not yet implemented.)
|
||||
- arm
|
||||
|
||||
3. Configuring Kprobes
|
||||
|
||||
|
|
|
@ -180,8 +180,8 @@ config ARCH_AT91
|
|||
bool "Atmel AT91"
|
||||
select GENERIC_GPIO
|
||||
help
|
||||
This enables support for systems based on the Atmel AT91RM9200
|
||||
and AT91SAM9xxx processors.
|
||||
This enables support for systems based on the Atmel AT91RM9200,
|
||||
AT91SAM9 and AT91CAP9 processors.
|
||||
|
||||
config ARCH_CLPS7500
|
||||
bool "Cirrus CL-PS7500FE"
|
||||
|
@ -217,6 +217,7 @@ config ARCH_EP93XX
|
|||
bool "EP93xx-based"
|
||||
select ARM_AMBA
|
||||
select ARM_VIC
|
||||
select GENERIC_GPIO
|
||||
help
|
||||
This enables support for the Cirrus EP93xx series of CPUs.
|
||||
|
||||
|
@ -366,6 +367,7 @@ config ARCH_SA1100
|
|||
select ARCH_DISCONTIGMEM_ENABLE
|
||||
select ARCH_MTD_XIP
|
||||
select GENERIC_GPIO
|
||||
select GENERIC_TIME
|
||||
help
|
||||
Support for StrongARM 11x0 based boards.
|
||||
|
||||
|
@ -409,6 +411,17 @@ config ARCH_OMAP
|
|||
help
|
||||
Support for TI's OMAP platform (OMAP1 and OMAP2).
|
||||
|
||||
config ARCH_MSM7X00A
|
||||
bool "Qualcomm MSM7X00A"
|
||||
select GENERIC_TIME
|
||||
select GENERIC_CLOCKEVENTS
|
||||
help
|
||||
Support for Qualcomm MSM7X00A based systems. This runs on the ARM11
|
||||
apps processor of the MSM7X00A and depends on a shared memory
|
||||
interface to the ARM9 modem processor which runs the baseband stack
|
||||
and controls some vital subsystems (clock and power control, etc).
|
||||
<http://www.cdmatech.com/products/msm7200_chipset_solution.jsp>
|
||||
|
||||
endchoice
|
||||
|
||||
source "arch/arm/mach-clps711x/Kconfig"
|
||||
|
@ -477,6 +490,8 @@ source "arch/arm/mach-davinci/Kconfig"
|
|||
|
||||
source "arch/arm/mach-ks8695/Kconfig"
|
||||
|
||||
source "arch/arm/mach-msm/Kconfig"
|
||||
|
||||
# Definitions to make life easier
|
||||
config ARCH_ACORN
|
||||
bool
|
||||
|
@ -657,6 +672,7 @@ config HZ
|
|||
default 128 if ARCH_L7200
|
||||
default 200 if ARCH_EBSA110 || ARCH_S3C2410
|
||||
default OMAP_32K_TIMER_HZ if ARCH_OMAP && OMAP_32K_TIMER
|
||||
default AT91_TIMER_HZ if ARCH_AT91
|
||||
default 100
|
||||
|
||||
config AEABI
|
||||
|
@ -951,7 +967,7 @@ config FPE_FASTFPE
|
|||
|
||||
config VFP
|
||||
bool "VFP-format floating point maths"
|
||||
depends on CPU_V6 || CPU_ARM926T
|
||||
depends on CPU_V6 || CPU_ARM926T || CPU_V7
|
||||
help
|
||||
Say Y to include VFP support code in the kernel. This is needed
|
||||
if your hardware includes a VFP unit.
|
||||
|
@ -961,6 +977,18 @@ config VFP
|
|||
|
||||
Say N if your target does not have VFP hardware.
|
||||
|
||||
config VFPv3
|
||||
bool
|
||||
depends on VFP
|
||||
default y if CPU_V7
|
||||
|
||||
config NEON
|
||||
bool "Advanced SIMD (NEON) Extension support"
|
||||
depends on VFPv3 && CPU_V7
|
||||
help
|
||||
Say Y to include support code for NEON, the ARMv7 Advanced SIMD
|
||||
Extension.
|
||||
|
||||
endmenu
|
||||
|
||||
menu "Userspace binary formats"
|
||||
|
|
|
@ -43,6 +43,12 @@ config DEBUG_ERRORS
|
|||
you are concerned with the code size or don't want to see these
|
||||
messages.
|
||||
|
||||
config DEBUG_STACK_USAGE
|
||||
bool "Enable stack utilization instrumentation"
|
||||
depends on DEBUG_KERNEL
|
||||
help
|
||||
Enables the display of the minimum amount of free stack which each
|
||||
task has ever had available in the sysrq-T output.
|
||||
|
||||
# These options are only for real kernel hackers who want to get their hands dirty.
|
||||
config DEBUG_LL
|
||||
|
|
|
@ -43,6 +43,16 @@ config OPROFILE_MPCORE
|
|||
config OPROFILE_ARM11_CORE
|
||||
bool
|
||||
|
||||
config KPROBES
|
||||
bool "Kprobes"
|
||||
depends on KALLSYMS && MODULES && !UML && !XIP_KERNEL
|
||||
help
|
||||
Kprobes allows you to trap at almost any kernel address and
|
||||
execute a callback function. register_kprobe() establishes
|
||||
a probepoint and specifies the callback. Kprobes is useful
|
||||
for kernel debugging, non-intrusive instrumentation and testing.
|
||||
If in doubt, say "N".
|
||||
|
||||
config MARKERS
|
||||
bool "Activate markers"
|
||||
help
|
||||
|
|
|
@ -139,6 +139,7 @@ endif
|
|||
machine-$(CONFIG_ARCH_KS8695) := ks8695
|
||||
incdir-$(CONFIG_ARCH_MXC) := mxc
|
||||
machine-$(CONFIG_ARCH_MX3) := mx3
|
||||
machine-$(CONFIG_ARCH_MSM7X00A) := msm
|
||||
|
||||
ifeq ($(CONFIG_ARCH_EBSA110),y)
|
||||
# This is what happens if you forget the IOCS16 line.
|
||||
|
|
|
@ -44,10 +44,6 @@ ifeq ($(CONFIG_PXA_SHARPSL),y)
|
|||
OBJS += head-sharpsl.o
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_ARCH_AT91RM9200),y)
|
||||
OBJS += head-at91rm9200.o
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_CPU_BIG_ENDIAN),y)
|
||||
ifeq ($(CONFIG_CPU_CP15),y)
|
||||
OBJS += big-endian.o
|
||||
|
|
|
@ -1,81 +0,0 @@
|
|||
/*
|
||||
* linux/arch/arm/boot/compressed/head-at91rm9200.S
|
||||
*
|
||||
* Copyright (C) 2003 SAN People
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
.section ".start", "ax"
|
||||
|
||||
@ Atmel AT91RM9200-DK : 262
|
||||
mov r3, #(MACH_TYPE_AT91RM9200DK & 0xff)
|
||||
orr r3, r3, #(MACH_TYPE_AT91RM9200DK & 0xff00)
|
||||
cmp r7, r3
|
||||
beq 99f
|
||||
|
||||
@ Cogent CSB337 : 399
|
||||
mov r3, #(MACH_TYPE_CSB337 & 0xff)
|
||||
orr r3, r3, #(MACH_TYPE_CSB337 & 0xff00)
|
||||
cmp r7, r3
|
||||
beq 99f
|
||||
|
||||
@ Cogent CSB637 : 648
|
||||
mov r3, #(MACH_TYPE_CSB637 & 0xff)
|
||||
orr r3, r3, #(MACH_TYPE_CSB637 & 0xff00)
|
||||
cmp r7, r3
|
||||
beq 99f
|
||||
|
||||
@ Atmel AT91RM9200-EK : 705
|
||||
mov r3, #(MACH_TYPE_AT91RM9200EK & 0xff)
|
||||
orr r3, r3, #(MACH_TYPE_AT91RM9200EK & 0xff00)
|
||||
cmp r7, r3
|
||||
beq 99f
|
||||
|
||||
@ Conitec Carmeva : 769
|
||||
mov r3, #(MACH_TYPE_CARMEVA & 0xff)
|
||||
orr r3, r3, #(MACH_TYPE_CARMEVA & 0xff00)
|
||||
cmp r7, r3
|
||||
beq 99f
|
||||
|
||||
@ KwikByte KB920x : 612
|
||||
mov r3, #(MACH_TYPE_KB9200 & 0xff)
|
||||
orr r3, r3, #(MACH_TYPE_KB9200 & 0xff00)
|
||||
cmp r7, r3
|
||||
beq 99f
|
||||
|
||||
@ Embest ATEB9200 : 923
|
||||
mov r3, #(MACH_TYPE_ATEB9200 & 0xff)
|
||||
orr r3, r3, #(MACH_TYPE_ATEB9200 & 0xff00)
|
||||
cmp r7, r3
|
||||
beq 99f
|
||||
|
||||
@ Sperry-Sun KAFA : 662
|
||||
mov r3, #(MACH_TYPE_KAFA & 0xff)
|
||||
orr r3, r3, #(MACH_TYPE_KAFA & 0xff00)
|
||||
cmp r7, r3
|
||||
beq 99f
|
||||
|
||||
@ picotux 200 : 963
|
||||
mov r3, #(MACH_TYPE_PICOTUX2XX & 0xff)
|
||||
orr r3, r3, #(MACH_TYPE_PICOTUX2XX & 0xff00)
|
||||
cmp r7, r3
|
||||
beq 99f
|
||||
|
||||
@ Ajeco 1ARM : 1075
|
||||
mov r3, #(MACH_TYPE_ONEARM & 0xff)
|
||||
orr r3, r3, #(MACH_TYPE_ONEARM & 0xff00)
|
||||
cmp r7, r3
|
||||
beq 99f
|
||||
|
||||
@ Unknown board, use the AT91RM9200DK board
|
||||
@ mov r7, #MACH_TYPE_AT91RM9200
|
||||
mov r7, #(MACH_TYPE_AT91RM9200DK & 0xff)
|
||||
orr r7, r7, #(MACH_TYPE_AT91RM9200DK & 0xff00)
|
||||
|
||||
99:
|
|
@ -20,7 +20,6 @@
|
|||
#include <linux/capability.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/rtc.h>
|
||||
|
||||
#include <asm/rtc.h>
|
||||
#include <asm/semaphore.h>
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -367,7 +367,6 @@ CONFIG_MTD_CFI_UTIL=y
|
|||
# CONFIG_MTD_RAM is not set
|
||||
# CONFIG_MTD_ROM is not set
|
||||
# CONFIG_MTD_ABSENT is not set
|
||||
CONFIG_MTD_OBSOLETE_CHIPS=y
|
||||
CONFIG_MTD_SHARP=y
|
||||
# CONFIG_MTD_XIP is not set
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.22
|
||||
# Thu Jul 19 15:57:52 2007
|
||||
# Linux kernel version: 2.6.24-rc5
|
||||
# Wed Dec 12 16:11:03 2007
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
|
||||
|
@ -26,15 +26,11 @@ CONFIG_VECTORS_BASE=0xffff0000
|
|||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
# General setup
|
||||
#
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_BROKEN_ON_SMP=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
|
||||
#
|
||||
# General setup
|
||||
#
|
||||
CONFIG_LOCALVERSION=""
|
||||
# CONFIG_LOCALVERSION_AUTO is not set
|
||||
CONFIG_SWAP=y
|
||||
|
@ -45,10 +41,15 @@ CONFIG_BSD_PROCESS_ACCT=y
|
|||
# CONFIG_BSD_PROCESS_ACCT_V3 is not set
|
||||
# CONFIG_TASKSTATS is not set
|
||||
# CONFIG_USER_NS is not set
|
||||
# CONFIG_PID_NS is not set
|
||||
# CONFIG_AUDIT is not set
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
# CONFIG_CGROUPS is not set
|
||||
CONFIG_FAIR_GROUP_SCHED=y
|
||||
CONFIG_FAIR_USER_SCHED=y
|
||||
# CONFIG_FAIR_CGROUP_SCHED is not set
|
||||
CONFIG_SYSFS_DEPRECATED=y
|
||||
# CONFIG_RELAY is not set
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
|
@ -69,7 +70,6 @@ CONFIG_FUTEX=y
|
|||
CONFIG_ANON_INODES=y
|
||||
CONFIG_EPOLL=y
|
||||
CONFIG_SIGNALFD=y
|
||||
CONFIG_TIMERFD=y
|
||||
CONFIG_EVENTFD=y
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_VM_EVENT_COUNTERS=y
|
||||
|
@ -130,6 +130,7 @@ CONFIG_ARCH_IOP13XX=y
|
|||
# CONFIG_ARCH_L7200 is not set
|
||||
# CONFIG_ARCH_KS8695 is not set
|
||||
# CONFIG_ARCH_NS9XXX is not set
|
||||
# CONFIG_ARCH_MXC is not set
|
||||
# CONFIG_ARCH_PNX4008 is not set
|
||||
# CONFIG_ARCH_PXA is not set
|
||||
# CONFIG_ARCH_RPC is not set
|
||||
|
@ -151,9 +152,12 @@ CONFIG_MACH_IQ81340SC=y
|
|||
CONFIG_MACH_IQ81340MC=y
|
||||
|
||||
#
|
||||
# IOP13XX IMU Support
|
||||
# Boot options
|
||||
#
|
||||
|
||||
#
|
||||
# Power management
|
||||
#
|
||||
# CONFIG_IOP_IMU is not set
|
||||
CONFIG_PLAT_IOP=y
|
||||
|
||||
#
|
||||
|
@ -185,10 +189,7 @@ CONFIG_PCI=y
|
|||
CONFIG_PCI_SYSCALL=y
|
||||
CONFIG_ARCH_SUPPORTS_MSI=y
|
||||
# CONFIG_PCI_MSI is not set
|
||||
|
||||
#
|
||||
# PCCARD (PCMCIA/CardBus) support
|
||||
#
|
||||
CONFIG_PCI_LEGACY=y
|
||||
# CONFIG_PCCARD is not set
|
||||
|
||||
#
|
||||
|
@ -207,6 +208,7 @@ CONFIG_FLATMEM_MANUAL=y
|
|||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4096
|
||||
# CONFIG_RESOURCES_64BIT is not set
|
||||
CONFIG_ZONE_DMA_FLAG=1
|
||||
|
@ -246,6 +248,7 @@ CONFIG_BINFMT_AOUT=y
|
|||
# Power management options
|
||||
#
|
||||
# CONFIG_PM is not set
|
||||
CONFIG_SUSPEND_UP_POSSIBLE=y
|
||||
|
||||
#
|
||||
# Networking
|
||||
|
@ -285,6 +288,7 @@ CONFIG_IP_PNP_BOOTP=y
|
|||
CONFIG_INET_XFRM_MODE_TRANSPORT=y
|
||||
CONFIG_INET_XFRM_MODE_TUNNEL=y
|
||||
CONFIG_INET_XFRM_MODE_BEET=y
|
||||
# CONFIG_INET_LRO is not set
|
||||
CONFIG_INET_DIAG=y
|
||||
CONFIG_INET_TCP_DIAG=y
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
|
@ -324,10 +328,6 @@ CONFIG_IPV6=y
|
|||
# CONFIG_LAPB is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
|
||||
#
|
||||
# QoS and/or fair queueing
|
||||
#
|
||||
# CONFIG_NET_SCHED is not set
|
||||
|
||||
#
|
||||
|
@ -356,6 +356,7 @@ CONFIG_IPV6=y
|
|||
#
|
||||
# Generic Driver Options
|
||||
#
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
CONFIG_STANDALONE=y
|
||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
# CONFIG_FW_LOADER is not set
|
||||
|
@ -383,6 +384,7 @@ CONFIG_MTD_BLOCK=y
|
|||
# CONFIG_INFTL is not set
|
||||
# CONFIG_RFD_FTL is not set
|
||||
# CONFIG_SSFDC is not set
|
||||
# CONFIG_MTD_OOPS is not set
|
||||
|
||||
#
|
||||
# RAM/ROM/Flash chip drivers
|
||||
|
@ -423,6 +425,7 @@ CONFIG_MTD_PHYSMAP_START=0xfa000000
|
|||
CONFIG_MTD_PHYSMAP_LEN=0x0
|
||||
CONFIG_MTD_PHYSMAP_BANKWIDTH=2
|
||||
# CONFIG_MTD_ARM_INTEGRATOR is not set
|
||||
# CONFIG_MTD_INTEL_VR_NOR is not set
|
||||
# CONFIG_MTD_PLATRAM is not set
|
||||
|
||||
#
|
||||
|
@ -463,6 +466,11 @@ CONFIG_BLK_DEV_RAM_SIZE=8192
|
|||
CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
CONFIG_MISC_DEVICES=y
|
||||
# CONFIG_PHANTOM is not set
|
||||
# CONFIG_EEPROM_93CX6 is not set
|
||||
# CONFIG_SGI_IOC4 is not set
|
||||
# CONFIG_TIFM_CORE is not set
|
||||
|
||||
#
|
||||
# SCSI device support
|
||||
|
@ -499,12 +507,9 @@ CONFIG_SCSI_WAIT_SCAN=m
|
|||
# CONFIG_SCSI_SPI_ATTRS is not set
|
||||
# CONFIG_SCSI_FC_ATTRS is not set
|
||||
CONFIG_SCSI_ISCSI_ATTRS=y
|
||||
CONFIG_SCSI_SAS_ATTRS=y
|
||||
# CONFIG_SCSI_SAS_LIBSAS is not set
|
||||
|
||||
#
|
||||
# SCSI low-level drivers
|
||||
#
|
||||
# CONFIG_SCSI_SRP_ATTRS is not set
|
||||
CONFIG_SCSI_LOWLEVEL=y
|
||||
# CONFIG_ISCSI_TCP is not set
|
||||
# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
|
||||
# CONFIG_SCSI_3W_9XXX is not set
|
||||
|
@ -515,6 +520,7 @@ CONFIG_SCSI_SAS_ATTRS=y
|
|||
# CONFIG_SCSI_AIC79XX is not set
|
||||
# CONFIG_SCSI_AIC94XX is not set
|
||||
# CONFIG_SCSI_DPT_I2O is not set
|
||||
# CONFIG_SCSI_ADVANSYS is not set
|
||||
# CONFIG_SCSI_ARCMSR is not set
|
||||
# CONFIG_MEGARAID_NEWGEN is not set
|
||||
# CONFIG_MEGARAID_LEGACY is not set
|
||||
|
@ -555,14 +561,8 @@ CONFIG_BLK_DEV_DM=y
|
|||
# CONFIG_DM_ZERO is not set
|
||||
# CONFIG_DM_MULTIPATH is not set
|
||||
# CONFIG_DM_DELAY is not set
|
||||
|
||||
#
|
||||
# Fusion MPT device support
|
||||
#
|
||||
# CONFIG_DM_UEVENT is not set
|
||||
# CONFIG_FUSION is not set
|
||||
# CONFIG_FUSION_SPI is not set
|
||||
# CONFIG_FUSION_FC is not set
|
||||
# CONFIG_FUSION_SAS is not set
|
||||
|
||||
#
|
||||
# IEEE 1394 (FireWire) support
|
||||
|
@ -577,6 +577,8 @@ CONFIG_NETDEVICES=y
|
|||
# CONFIG_MACVLAN is not set
|
||||
# CONFIG_EQUALIZER is not set
|
||||
# CONFIG_TUN is not set
|
||||
# CONFIG_VETH is not set
|
||||
# CONFIG_IP1000 is not set
|
||||
# CONFIG_ARCNET is not set
|
||||
# CONFIG_NET_ETHERNET is not set
|
||||
CONFIG_NETDEV_1000=y
|
||||
|
@ -585,6 +587,7 @@ CONFIG_NETDEV_1000=y
|
|||
CONFIG_E1000=y
|
||||
CONFIG_E1000_NAPI=y
|
||||
# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
|
||||
# CONFIG_E1000E is not set
|
||||
# CONFIG_NS83820 is not set
|
||||
# CONFIG_HAMACHI is not set
|
||||
# CONFIG_YELLOWFIN is not set
|
||||
|
@ -592,6 +595,7 @@ CONFIG_E1000_NAPI=y
|
|||
# CONFIG_SIS190 is not set
|
||||
# CONFIG_SKGE is not set
|
||||
# CONFIG_SKY2 is not set
|
||||
# CONFIG_SK98LIN is not set
|
||||
# CONFIG_VIA_VELOCITY is not set
|
||||
# CONFIG_TIGON3 is not set
|
||||
# CONFIG_BNX2 is not set
|
||||
|
@ -600,11 +604,14 @@ CONFIG_E1000_NAPI=y
|
|||
CONFIG_NETDEV_10000=y
|
||||
# CONFIG_CHELSIO_T1 is not set
|
||||
# CONFIG_CHELSIO_T3 is not set
|
||||
# CONFIG_IXGBE is not set
|
||||
# CONFIG_IXGB is not set
|
||||
# CONFIG_S2IO is not set
|
||||
# CONFIG_MYRI10GE is not set
|
||||
# CONFIG_NETXEN_NIC is not set
|
||||
# CONFIG_NIU is not set
|
||||
# CONFIG_MLX4_CORE is not set
|
||||
# CONFIG_TEHUTI is not set
|
||||
# CONFIG_TR is not set
|
||||
|
||||
#
|
||||
|
@ -639,7 +646,6 @@ CONFIG_INPUT_MOUSEDEV=y
|
|||
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
||||
# CONFIG_INPUT_JOYDEV is not set
|
||||
# CONFIG_INPUT_TSDEV is not set
|
||||
# CONFIG_INPUT_EVDEV is not set
|
||||
# CONFIG_INPUT_EVBUG is not set
|
||||
|
||||
|
@ -688,12 +694,10 @@ CONFIG_UNIX98_PTYS=y
|
|||
CONFIG_LEGACY_PTYS=y
|
||||
CONFIG_LEGACY_PTY_COUNT=256
|
||||
# CONFIG_IPMI_HANDLER is not set
|
||||
# CONFIG_WATCHDOG is not set
|
||||
CONFIG_HW_RANDOM=y
|
||||
# CONFIG_NVRAM is not set
|
||||
# CONFIG_R3964 is not set
|
||||
# CONFIG_APPLICOM is not set
|
||||
# CONFIG_DRM is not set
|
||||
# CONFIG_RAW_DRIVER is not set
|
||||
# CONFIG_TCG_TPM is not set
|
||||
CONFIG_DEVPORT=y
|
||||
|
@ -758,9 +762,9 @@ CONFIG_I2C_IOP3XX=y
|
|||
# CONFIG_SPI is not set
|
||||
# CONFIG_SPI_MASTER is not set
|
||||
# CONFIG_W1 is not set
|
||||
# CONFIG_POWER_SUPPLY is not set
|
||||
CONFIG_HWMON=y
|
||||
# CONFIG_HWMON_VID is not set
|
||||
# CONFIG_SENSORS_ABITUGURU is not set
|
||||
# CONFIG_SENSORS_AD7418 is not set
|
||||
# CONFIG_SENSORS_ADM1021 is not set
|
||||
# CONFIG_SENSORS_ADM1025 is not set
|
||||
|
@ -768,12 +772,13 @@ CONFIG_HWMON=y
|
|||
# CONFIG_SENSORS_ADM1029 is not set
|
||||
# CONFIG_SENSORS_ADM1031 is not set
|
||||
# CONFIG_SENSORS_ADM9240 is not set
|
||||
# CONFIG_SENSORS_ASB100 is not set
|
||||
# CONFIG_SENSORS_ADT7470 is not set
|
||||
# CONFIG_SENSORS_ATXP1 is not set
|
||||
# CONFIG_SENSORS_DS1621 is not set
|
||||
# CONFIG_SENSORS_I5K_AMB is not set
|
||||
# CONFIG_SENSORS_F71805F is not set
|
||||
# CONFIG_SENSORS_FSCHER is not set
|
||||
# CONFIG_SENSORS_FSCPOS is not set
|
||||
# CONFIG_SENSORS_F71882FG is not set
|
||||
# CONFIG_SENSORS_F75375S is not set
|
||||
# CONFIG_SENSORS_GL518SM is not set
|
||||
# CONFIG_SENSORS_GL520SM is not set
|
||||
# CONFIG_SENSORS_IT87 is not set
|
||||
|
@ -787,14 +792,17 @@ CONFIG_HWMON=y
|
|||
# CONFIG_SENSORS_LM87 is not set
|
||||
# CONFIG_SENSORS_LM90 is not set
|
||||
# CONFIG_SENSORS_LM92 is not set
|
||||
# CONFIG_SENSORS_LM93 is not set
|
||||
# CONFIG_SENSORS_MAX1619 is not set
|
||||
# CONFIG_SENSORS_MAX6650 is not set
|
||||
# CONFIG_SENSORS_PC87360 is not set
|
||||
# CONFIG_SENSORS_PC87427 is not set
|
||||
# CONFIG_SENSORS_SIS5595 is not set
|
||||
# CONFIG_SENSORS_DME1737 is not set
|
||||
# CONFIG_SENSORS_SMSC47M1 is not set
|
||||
# CONFIG_SENSORS_SMSC47M192 is not set
|
||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
# CONFIG_SENSORS_THMC50 is not set
|
||||
# CONFIG_SENSORS_VIA686A is not set
|
||||
# CONFIG_SENSORS_VT1211 is not set
|
||||
# CONFIG_SENSORS_VT8231 is not set
|
||||
|
@ -806,30 +814,19 @@ CONFIG_HWMON=y
|
|||
# CONFIG_SENSORS_W83627HF is not set
|
||||
# CONFIG_SENSORS_W83627EHF is not set
|
||||
# CONFIG_HWMON_DEBUG_CHIP is not set
|
||||
CONFIG_MISC_DEVICES=y
|
||||
# CONFIG_PHANTOM is not set
|
||||
# CONFIG_EEPROM_93CX6 is not set
|
||||
# CONFIG_SGI_IOC4 is not set
|
||||
# CONFIG_TIFM_CORE is not set
|
||||
# CONFIG_WATCHDOG is not set
|
||||
|
||||
#
|
||||
# Sonics Silicon Backplane
|
||||
#
|
||||
CONFIG_SSB_POSSIBLE=y
|
||||
# CONFIG_SSB is not set
|
||||
|
||||
#
|
||||
# Multifunction device drivers
|
||||
#
|
||||
# CONFIG_MFD_SM501 is not set
|
||||
|
||||
#
|
||||
# LED devices
|
||||
#
|
||||
# CONFIG_NEW_LEDS is not set
|
||||
|
||||
#
|
||||
# LED drivers
|
||||
#
|
||||
|
||||
#
|
||||
# LED Triggers
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
|
@ -840,14 +837,16 @@ CONFIG_DAB=y
|
|||
#
|
||||
# Graphics support
|
||||
#
|
||||
# CONFIG_DRM is not set
|
||||
# CONFIG_VGASTATE is not set
|
||||
# CONFIG_VIDEO_OUTPUT_CONTROL is not set
|
||||
# CONFIG_FB is not set
|
||||
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
||||
|
||||
#
|
||||
# Display device support
|
||||
#
|
||||
# CONFIG_DISPLAY_SUPPORT is not set
|
||||
# CONFIG_VGASTATE is not set
|
||||
# CONFIG_FB is not set
|
||||
|
||||
#
|
||||
# Console display driver support
|
||||
|
@ -862,6 +861,7 @@ CONFIG_DUMMY_CONSOLE=y
|
|||
CONFIG_HID_SUPPORT=y
|
||||
CONFIG_HID=y
|
||||
# CONFIG_HID_DEBUG is not set
|
||||
# CONFIG_HIDRAW is not set
|
||||
CONFIG_USB_SUPPORT=y
|
||||
CONFIG_USB_ARCH_HAS_HCD=y
|
||||
CONFIG_USB_ARCH_HAS_OHCI=y
|
||||
|
@ -877,16 +877,15 @@ CONFIG_USB_ARCH_HAS_EHCI=y
|
|||
#
|
||||
# CONFIG_USB_GADGET is not set
|
||||
# CONFIG_MMC is not set
|
||||
|
||||
#
|
||||
# Real Time Clock
|
||||
#
|
||||
# CONFIG_NEW_LEDS is not set
|
||||
CONFIG_RTC_LIB=y
|
||||
# CONFIG_RTC_CLASS is not set
|
||||
CONFIG_DMADEVICES=y
|
||||
|
||||
#
|
||||
# DMA Engine support
|
||||
# DMA Devices
|
||||
#
|
||||
CONFIG_INTEL_IOP_ADMA=y
|
||||
CONFIG_DMA_ENGINE=y
|
||||
|
||||
#
|
||||
|
@ -894,12 +893,6 @@ CONFIG_DMA_ENGINE=y
|
|||
#
|
||||
# CONFIG_NET_DMA is not set
|
||||
|
||||
#
|
||||
# DMA Devices
|
||||
#
|
||||
# CONFIG_INTEL_IOATDMA is not set
|
||||
CONFIG_INTEL_IOP_ADMA=y
|
||||
|
||||
#
|
||||
# File systems
|
||||
#
|
||||
|
@ -912,7 +905,6 @@ CONFIG_EXT3_FS_XATTR=y
|
|||
# CONFIG_EXT3_FS_SECURITY is not set
|
||||
# CONFIG_EXT4DEV_FS is not set
|
||||
CONFIG_JBD=y
|
||||
# CONFIG_JBD_DEBUG is not set
|
||||
CONFIG_FS_MBCACHE=y
|
||||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
|
@ -952,7 +944,6 @@ CONFIG_SYSFS=y
|
|||
CONFIG_TMPFS=y
|
||||
# CONFIG_TMPFS_POSIX_ACL is not set
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_CONFIGFS_FS is not set
|
||||
|
||||
#
|
||||
|
@ -969,10 +960,12 @@ CONFIG_ECRYPT_FS=y
|
|||
CONFIG_JFFS2_FS=y
|
||||
CONFIG_JFFS2_FS_DEBUG=0
|
||||
CONFIG_JFFS2_FS_WRITEBUFFER=y
|
||||
# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
|
||||
# CONFIG_JFFS2_SUMMARY is not set
|
||||
# CONFIG_JFFS2_FS_XATTR is not set
|
||||
# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
|
||||
CONFIG_JFFS2_ZLIB=y
|
||||
# CONFIG_JFFS2_LZO is not set
|
||||
CONFIG_JFFS2_RTIME=y
|
||||
# CONFIG_JFFS2_RUBIN is not set
|
||||
CONFIG_CRAMFS=y
|
||||
|
@ -981,10 +974,7 @@ CONFIG_CRAMFS=y
|
|||
# CONFIG_QNX4FS_FS is not set
|
||||
# CONFIG_SYSV_FS is not set
|
||||
# CONFIG_UFS_FS is not set
|
||||
|
||||
#
|
||||
# Network File Systems
|
||||
#
|
||||
CONFIG_NETWORK_FILESYSTEMS=y
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
# CONFIG_NFS_V3_ACL is not set
|
||||
|
@ -1037,10 +1027,6 @@ CONFIG_MSDOS_PARTITION=y
|
|||
# CONFIG_KARMA_PARTITION is not set
|
||||
# CONFIG_EFI_PARTITION is not set
|
||||
# CONFIG_SYSV68_PARTITION is not set
|
||||
|
||||
#
|
||||
# Native Language Support
|
||||
#
|
||||
CONFIG_NLS=y
|
||||
CONFIG_NLS_DEFAULT="iso8859-1"
|
||||
# CONFIG_NLS_CODEPAGE_437 is not set
|
||||
|
@ -1081,21 +1067,16 @@ CONFIG_NLS_DEFAULT="iso8859-1"
|
|||
# CONFIG_NLS_KOI8_R is not set
|
||||
# CONFIG_NLS_KOI8_U is not set
|
||||
# CONFIG_NLS_UTF8 is not set
|
||||
|
||||
#
|
||||
# Distributed Lock Manager
|
||||
#
|
||||
# CONFIG_DLM is not set
|
||||
|
||||
#
|
||||
# Profiling support
|
||||
#
|
||||
CONFIG_INSTRUMENTATION=y
|
||||
# CONFIG_PROFILING is not set
|
||||
# CONFIG_MARKERS is not set
|
||||
|
||||
#
|
||||
# Kernel hacking
|
||||
#
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_ENABLE_WARN_DEPRECATED=y
|
||||
CONFIG_ENABLE_MUST_CHECK=y
|
||||
# CONFIG_MAGIC_SYSRQ is not set
|
||||
# CONFIG_UNUSED_SYMBOLS is not set
|
||||
|
@ -1104,6 +1085,7 @@ CONFIG_ENABLE_MUST_CHECK=y
|
|||
# CONFIG_DEBUG_KERNEL is not set
|
||||
CONFIG_DEBUG_BUGVERBOSE=y
|
||||
CONFIG_FRAME_POINTER=y
|
||||
# CONFIG_SAMPLES is not set
|
||||
CONFIG_DEBUG_USER=y
|
||||
|
||||
#
|
||||
|
@ -1112,6 +1094,7 @@ CONFIG_DEBUG_USER=y
|
|||
CONFIG_KEYS=y
|
||||
CONFIG_KEYS_DEBUG_PROC_KEYS=y
|
||||
# CONFIG_SECURITY is not set
|
||||
# CONFIG_SECURITY_FILE_CAPABILITIES is not set
|
||||
CONFIG_XOR_BLOCKS=y
|
||||
CONFIG_ASYNC_CORE=y
|
||||
CONFIG_ASYNC_MEMCPY=y
|
||||
|
@ -1136,6 +1119,7 @@ CONFIG_CRYPTO_ECB=y
|
|||
CONFIG_CRYPTO_CBC=y
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
CONFIG_CRYPTO_LRW=y
|
||||
# CONFIG_CRYPTO_XTS is not set
|
||||
# CONFIG_CRYPTO_CRYPTD is not set
|
||||
CONFIG_CRYPTO_DES=y
|
||||
# CONFIG_CRYPTO_FCRYPT is not set
|
||||
|
@ -1150,11 +1134,13 @@ CONFIG_CRYPTO_TEA=y
|
|||
CONFIG_CRYPTO_ARC4=y
|
||||
CONFIG_CRYPTO_KHAZAD=y
|
||||
CONFIG_CRYPTO_ANUBIS=y
|
||||
# CONFIG_CRYPTO_SEED is not set
|
||||
CONFIG_CRYPTO_DEFLATE=y
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=y
|
||||
CONFIG_CRYPTO_CRC32C=y
|
||||
# CONFIG_CRYPTO_CAMELLIA is not set
|
||||
# CONFIG_CRYPTO_TEST is not set
|
||||
# CONFIG_CRYPTO_AUTHENC is not set
|
||||
CONFIG_CRYPTO_HW=y
|
||||
|
||||
#
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.22
|
||||
# Thu Jul 19 16:00:36 2007
|
||||
# Linux kernel version: 2.6.24-rc5
|
||||
# Wed Dec 12 15:49:08 2007
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
|
||||
|
@ -26,15 +26,11 @@ CONFIG_VECTORS_BASE=0xffff0000
|
|||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
# General setup
|
||||
#
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_BROKEN_ON_SMP=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
|
||||
#
|
||||
# General setup
|
||||
#
|
||||
CONFIG_LOCALVERSION=""
|
||||
CONFIG_LOCALVERSION_AUTO=y
|
||||
CONFIG_SWAP=y
|
||||
|
@ -45,9 +41,14 @@ CONFIG_BSD_PROCESS_ACCT=y
|
|||
# CONFIG_BSD_PROCESS_ACCT_V3 is not set
|
||||
# CONFIG_TASKSTATS is not set
|
||||
# CONFIG_USER_NS is not set
|
||||
# CONFIG_PID_NS is not set
|
||||
# CONFIG_AUDIT is not set
|
||||
# CONFIG_IKCONFIG is not set
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
# CONFIG_CGROUPS is not set
|
||||
CONFIG_FAIR_GROUP_SCHED=y
|
||||
CONFIG_FAIR_USER_SCHED=y
|
||||
# CONFIG_FAIR_CGROUP_SCHED is not set
|
||||
CONFIG_SYSFS_DEPRECATED=y
|
||||
# CONFIG_RELAY is not set
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
|
@ -69,7 +70,6 @@ CONFIG_FUTEX=y
|
|||
CONFIG_ANON_INODES=y
|
||||
CONFIG_EPOLL=y
|
||||
CONFIG_SIGNALFD=y
|
||||
CONFIG_TIMERFD=y
|
||||
CONFIG_EVENTFD=y
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_VM_EVENT_COUNTERS=y
|
||||
|
@ -130,6 +130,7 @@ CONFIG_ARCH_IOP32X=y
|
|||
# CONFIG_ARCH_L7200 is not set
|
||||
# CONFIG_ARCH_KS8695 is not set
|
||||
# CONFIG_ARCH_NS9XXX is not set
|
||||
# CONFIG_ARCH_MXC is not set
|
||||
# CONFIG_ARCH_PNX4008 is not set
|
||||
# CONFIG_ARCH_PXA is not set
|
||||
# CONFIG_ARCH_RPC is not set
|
||||
|
@ -153,6 +154,15 @@ CONFIG_ARCH_IQ80321=y
|
|||
CONFIG_ARCH_IQ31244=y
|
||||
CONFIG_MACH_N2100=y
|
||||
CONFIG_IOP3XX_ATU=y
|
||||
# CONFIG_MACH_EM7210 is not set
|
||||
|
||||
#
|
||||
# Boot options
|
||||
#
|
||||
|
||||
#
|
||||
# Power management
|
||||
#
|
||||
CONFIG_PLAT_IOP=y
|
||||
|
||||
#
|
||||
|
@ -182,11 +192,8 @@ CONFIG_XSCALE_PMU=y
|
|||
CONFIG_PCI=y
|
||||
CONFIG_PCI_SYSCALL=y
|
||||
# CONFIG_ARCH_SUPPORTS_MSI is not set
|
||||
CONFIG_PCI_LEGACY=y
|
||||
# CONFIG_PCI_DEBUG is not set
|
||||
|
||||
#
|
||||
# PCCARD (PCMCIA/CardBus) support
|
||||
#
|
||||
# CONFIG_PCCARD is not set
|
||||
|
||||
#
|
||||
|
@ -205,6 +212,7 @@ CONFIG_FLATMEM_MANUAL=y
|
|||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4096
|
||||
# CONFIG_RESOURCES_64BIT is not set
|
||||
CONFIG_ZONE_DMA_FLAG=1
|
||||
|
@ -244,6 +252,7 @@ CONFIG_BINFMT_AOUT=y
|
|||
# Power management options
|
||||
#
|
||||
# CONFIG_PM is not set
|
||||
CONFIG_SUSPEND_UP_POSSIBLE=y
|
||||
|
||||
#
|
||||
# Networking
|
||||
|
@ -282,6 +291,7 @@ CONFIG_IP_PNP_BOOTP=y
|
|||
CONFIG_INET_XFRM_MODE_TRANSPORT=y
|
||||
CONFIG_INET_XFRM_MODE_TUNNEL=y
|
||||
CONFIG_INET_XFRM_MODE_BEET=y
|
||||
# CONFIG_INET_LRO is not set
|
||||
CONFIG_INET_DIAG=y
|
||||
CONFIG_INET_TCP_DIAG=y
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
|
@ -321,10 +331,6 @@ CONFIG_IPV6=y
|
|||
# CONFIG_LAPB is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
|
||||
#
|
||||
# QoS and/or fair queueing
|
||||
#
|
||||
# CONFIG_NET_SCHED is not set
|
||||
|
||||
#
|
||||
|
@ -353,6 +359,7 @@ CONFIG_IPV6=y
|
|||
#
|
||||
# Generic Driver Options
|
||||
#
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
CONFIG_STANDALONE=y
|
||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
# CONFIG_FW_LOADER is not set
|
||||
|
@ -382,6 +389,7 @@ CONFIG_MTD_BLOCK=y
|
|||
# CONFIG_INFTL is not set
|
||||
# CONFIG_RFD_FTL is not set
|
||||
# CONFIG_SSFDC is not set
|
||||
# CONFIG_MTD_OOPS is not set
|
||||
|
||||
#
|
||||
# RAM/ROM/Flash chip drivers
|
||||
|
@ -417,6 +425,7 @@ CONFIG_MTD_PHYSMAP_START=0x0
|
|||
CONFIG_MTD_PHYSMAP_LEN=0x0
|
||||
CONFIG_MTD_PHYSMAP_BANKWIDTH=1
|
||||
# CONFIG_MTD_ARM_INTEGRATOR is not set
|
||||
# CONFIG_MTD_INTEL_VR_NOR is not set
|
||||
# CONFIG_MTD_PLATRAM is not set
|
||||
|
||||
#
|
||||
|
@ -459,6 +468,11 @@ CONFIG_BLK_DEV_RAM_SIZE=8192
|
|||
CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
CONFIG_MISC_DEVICES=y
|
||||
# CONFIG_PHANTOM is not set
|
||||
# CONFIG_EEPROM_93CX6 is not set
|
||||
# CONFIG_SGI_IOC4 is not set
|
||||
# CONFIG_TIFM_CORE is not set
|
||||
# CONFIG_IDE is not set
|
||||
|
||||
#
|
||||
|
@ -496,12 +510,9 @@ CONFIG_SCSI_WAIT_SCAN=m
|
|||
# CONFIG_SCSI_SPI_ATTRS is not set
|
||||
# CONFIG_SCSI_FC_ATTRS is not set
|
||||
# CONFIG_SCSI_ISCSI_ATTRS is not set
|
||||
# CONFIG_SCSI_SAS_ATTRS is not set
|
||||
# CONFIG_SCSI_SAS_LIBSAS is not set
|
||||
|
||||
#
|
||||
# SCSI low-level drivers
|
||||
#
|
||||
# CONFIG_SCSI_SRP_ATTRS is not set
|
||||
CONFIG_SCSI_LOWLEVEL=y
|
||||
# CONFIG_ISCSI_TCP is not set
|
||||
# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
|
||||
# CONFIG_SCSI_3W_9XXX is not set
|
||||
|
@ -512,6 +523,7 @@ CONFIG_SCSI_WAIT_SCAN=m
|
|||
# CONFIG_SCSI_AIC79XX is not set
|
||||
# CONFIG_SCSI_AIC94XX is not set
|
||||
# CONFIG_SCSI_DPT_I2O is not set
|
||||
# CONFIG_SCSI_ADVANSYS is not set
|
||||
# CONFIG_SCSI_ARCMSR is not set
|
||||
# CONFIG_MEGARAID_NEWGEN is not set
|
||||
# CONFIG_MEGARAID_LEGACY is not set
|
||||
|
@ -576,6 +588,7 @@ CONFIG_SATA_VITESSE=y
|
|||
# CONFIG_PATA_OLDPIIX is not set
|
||||
# CONFIG_PATA_NETCELL is not set
|
||||
# CONFIG_PATA_NS87410 is not set
|
||||
# CONFIG_PATA_NS87415 is not set
|
||||
# CONFIG_PATA_OPTI is not set
|
||||
# CONFIG_PATA_OPTIDMA is not set
|
||||
# CONFIG_PATA_PDC_OLD is not set
|
||||
|
@ -606,14 +619,8 @@ CONFIG_BLK_DEV_DM=y
|
|||
# CONFIG_DM_ZERO is not set
|
||||
# CONFIG_DM_MULTIPATH is not set
|
||||
# CONFIG_DM_DELAY is not set
|
||||
|
||||
#
|
||||
# Fusion MPT device support
|
||||
#
|
||||
# CONFIG_DM_UEVENT is not set
|
||||
# CONFIG_FUSION is not set
|
||||
# CONFIG_FUSION_SPI is not set
|
||||
# CONFIG_FUSION_FC is not set
|
||||
# CONFIG_FUSION_SAS is not set
|
||||
|
||||
#
|
||||
# IEEE 1394 (FireWire) support
|
||||
|
@ -628,6 +635,8 @@ CONFIG_NETDEVICES=y
|
|||
# CONFIG_MACVLAN is not set
|
||||
# CONFIG_EQUALIZER is not set
|
||||
# CONFIG_TUN is not set
|
||||
# CONFIG_VETH is not set
|
||||
# CONFIG_IP1000 is not set
|
||||
# CONFIG_ARCNET is not set
|
||||
# CONFIG_PHYLIB is not set
|
||||
CONFIG_NET_ETHERNET=y
|
||||
|
@ -641,13 +650,16 @@ CONFIG_MII=y
|
|||
# CONFIG_DM9000 is not set
|
||||
# CONFIG_NET_TULIP is not set
|
||||
# CONFIG_HP100 is not set
|
||||
# CONFIG_IBM_NEW_EMAC_ZMII is not set
|
||||
# CONFIG_IBM_NEW_EMAC_RGMII is not set
|
||||
# CONFIG_IBM_NEW_EMAC_TAH is not set
|
||||
# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
|
||||
CONFIG_NET_PCI=y
|
||||
# CONFIG_PCNET32 is not set
|
||||
# CONFIG_AMD8111_ETH is not set
|
||||
# CONFIG_ADAPTEC_STARFIRE is not set
|
||||
# CONFIG_B44 is not set
|
||||
# CONFIG_FORCEDETH is not set
|
||||
# CONFIG_DGRS is not set
|
||||
# CONFIG_EEPRO100 is not set
|
||||
CONFIG_E100=y
|
||||
# CONFIG_FEALNX is not set
|
||||
|
@ -667,6 +679,7 @@ CONFIG_NETDEV_1000=y
|
|||
CONFIG_E1000=y
|
||||
CONFIG_E1000_NAPI=y
|
||||
# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
|
||||
# CONFIG_E1000E is not set
|
||||
# CONFIG_NS83820 is not set
|
||||
# CONFIG_HAMACHI is not set
|
||||
# CONFIG_YELLOWFIN is not set
|
||||
|
@ -675,6 +688,7 @@ CONFIG_R8169=y
|
|||
# CONFIG_SIS190 is not set
|
||||
# CONFIG_SKGE is not set
|
||||
# CONFIG_SKY2 is not set
|
||||
# CONFIG_SK98LIN is not set
|
||||
# CONFIG_VIA_VELOCITY is not set
|
||||
# CONFIG_TIGON3 is not set
|
||||
# CONFIG_BNX2 is not set
|
||||
|
@ -683,11 +697,14 @@ CONFIG_R8169=y
|
|||
CONFIG_NETDEV_10000=y
|
||||
# CONFIG_CHELSIO_T1 is not set
|
||||
# CONFIG_CHELSIO_T3 is not set
|
||||
# CONFIG_IXGBE is not set
|
||||
# CONFIG_IXGB is not set
|
||||
# CONFIG_S2IO is not set
|
||||
# CONFIG_MYRI10GE is not set
|
||||
# CONFIG_NETXEN_NIC is not set
|
||||
# CONFIG_NIU is not set
|
||||
# CONFIG_MLX4_CORE is not set
|
||||
# CONFIG_TEHUTI is not set
|
||||
# CONFIG_TR is not set
|
||||
|
||||
#
|
||||
|
@ -703,7 +720,6 @@ CONFIG_NETDEV_10000=y
|
|||
# CONFIG_USB_KAWETH is not set
|
||||
# CONFIG_USB_PEGASUS is not set
|
||||
# CONFIG_USB_RTL8150 is not set
|
||||
# CONFIG_USB_USBNET_MII is not set
|
||||
# CONFIG_USB_USBNET is not set
|
||||
# CONFIG_WAN is not set
|
||||
# CONFIG_FDDI is not set
|
||||
|
@ -732,7 +748,6 @@ CONFIG_INPUT_MOUSEDEV=y
|
|||
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
||||
# CONFIG_INPUT_JOYDEV is not set
|
||||
# CONFIG_INPUT_TSDEV is not set
|
||||
# CONFIG_INPUT_EVDEV is not set
|
||||
# CONFIG_INPUT_EVBUG is not set
|
||||
|
||||
|
@ -781,12 +796,10 @@ CONFIG_UNIX98_PTYS=y
|
|||
CONFIG_LEGACY_PTYS=y
|
||||
CONFIG_LEGACY_PTY_COUNT=256
|
||||
# CONFIG_IPMI_HANDLER is not set
|
||||
# CONFIG_WATCHDOG is not set
|
||||
CONFIG_HW_RANDOM=y
|
||||
# CONFIG_NVRAM is not set
|
||||
# CONFIG_R3964 is not set
|
||||
# CONFIG_APPLICOM is not set
|
||||
# CONFIG_DRM is not set
|
||||
# CONFIG_RAW_DRIVER is not set
|
||||
# CONFIG_TCG_TPM is not set
|
||||
CONFIG_DEVPORT=y
|
||||
|
@ -852,9 +865,9 @@ CONFIG_I2C_IOP3XX=y
|
|||
# CONFIG_SPI is not set
|
||||
# CONFIG_SPI_MASTER is not set
|
||||
# CONFIG_W1 is not set
|
||||
# CONFIG_POWER_SUPPLY is not set
|
||||
CONFIG_HWMON=y
|
||||
# CONFIG_HWMON_VID is not set
|
||||
# CONFIG_SENSORS_ABITUGURU is not set
|
||||
# CONFIG_SENSORS_AD7418 is not set
|
||||
# CONFIG_SENSORS_ADM1021 is not set
|
||||
# CONFIG_SENSORS_ADM1025 is not set
|
||||
|
@ -862,12 +875,13 @@ CONFIG_HWMON=y
|
|||
# CONFIG_SENSORS_ADM1029 is not set
|
||||
# CONFIG_SENSORS_ADM1031 is not set
|
||||
# CONFIG_SENSORS_ADM9240 is not set
|
||||
# CONFIG_SENSORS_ASB100 is not set
|
||||
# CONFIG_SENSORS_ADT7470 is not set
|
||||
# CONFIG_SENSORS_ATXP1 is not set
|
||||
# CONFIG_SENSORS_DS1621 is not set
|
||||
# CONFIG_SENSORS_I5K_AMB is not set
|
||||
# CONFIG_SENSORS_F71805F is not set
|
||||
# CONFIG_SENSORS_FSCHER is not set
|
||||
# CONFIG_SENSORS_FSCPOS is not set
|
||||
# CONFIG_SENSORS_F71882FG is not set
|
||||
# CONFIG_SENSORS_F75375S is not set
|
||||
# CONFIG_SENSORS_GL518SM is not set
|
||||
# CONFIG_SENSORS_GL520SM is not set
|
||||
# CONFIG_SENSORS_IT87 is not set
|
||||
|
@ -881,14 +895,17 @@ CONFIG_HWMON=y
|
|||
# CONFIG_SENSORS_LM87 is not set
|
||||
# CONFIG_SENSORS_LM90 is not set
|
||||
# CONFIG_SENSORS_LM92 is not set
|
||||
# CONFIG_SENSORS_LM93 is not set
|
||||
# CONFIG_SENSORS_MAX1619 is not set
|
||||
# CONFIG_SENSORS_MAX6650 is not set
|
||||
# CONFIG_SENSORS_PC87360 is not set
|
||||
# CONFIG_SENSORS_PC87427 is not set
|
||||
# CONFIG_SENSORS_SIS5595 is not set
|
||||
# CONFIG_SENSORS_DME1737 is not set
|
||||
# CONFIG_SENSORS_SMSC47M1 is not set
|
||||
# CONFIG_SENSORS_SMSC47M192 is not set
|
||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
# CONFIG_SENSORS_THMC50 is not set
|
||||
# CONFIG_SENSORS_VIA686A is not set
|
||||
# CONFIG_SENSORS_VT1211 is not set
|
||||
# CONFIG_SENSORS_VT8231 is not set
|
||||
|
@ -900,30 +917,19 @@ CONFIG_HWMON=y
|
|||
# CONFIG_SENSORS_W83627HF is not set
|
||||
# CONFIG_SENSORS_W83627EHF is not set
|
||||
# CONFIG_HWMON_DEBUG_CHIP is not set
|
||||
CONFIG_MISC_DEVICES=y
|
||||
# CONFIG_PHANTOM is not set
|
||||
# CONFIG_EEPROM_93CX6 is not set
|
||||
# CONFIG_SGI_IOC4 is not set
|
||||
# CONFIG_TIFM_CORE is not set
|
||||
# CONFIG_WATCHDOG is not set
|
||||
|
||||
#
|
||||
# Sonics Silicon Backplane
|
||||
#
|
||||
CONFIG_SSB_POSSIBLE=y
|
||||
# CONFIG_SSB is not set
|
||||
|
||||
#
|
||||
# Multifunction device drivers
|
||||
#
|
||||
# CONFIG_MFD_SM501 is not set
|
||||
|
||||
#
|
||||
# LED devices
|
||||
#
|
||||
# CONFIG_NEW_LEDS is not set
|
||||
|
||||
#
|
||||
# LED drivers
|
||||
#
|
||||
|
||||
#
|
||||
# LED Triggers
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
|
@ -935,14 +941,16 @@ CONFIG_DAB=y
|
|||
#
|
||||
# Graphics support
|
||||
#
|
||||
# CONFIG_DRM is not set
|
||||
# CONFIG_VGASTATE is not set
|
||||
# CONFIG_VIDEO_OUTPUT_CONTROL is not set
|
||||
# CONFIG_FB is not set
|
||||
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
||||
|
||||
#
|
||||
# Display device support
|
||||
#
|
||||
# CONFIG_DISPLAY_SUPPORT is not set
|
||||
# CONFIG_VGASTATE is not set
|
||||
# CONFIG_FB is not set
|
||||
|
||||
#
|
||||
# Console display driver support
|
||||
|
@ -957,6 +965,7 @@ CONFIG_DUMMY_CONSOLE=y
|
|||
CONFIG_HID_SUPPORT=y
|
||||
CONFIG_HID=y
|
||||
# CONFIG_HID_DEBUG is not set
|
||||
# CONFIG_HIDRAW is not set
|
||||
|
||||
#
|
||||
# USB Input Devices
|
||||
|
@ -1013,6 +1022,7 @@ CONFIG_USB_STORAGE=y
|
|||
# CONFIG_USB_STORAGE_DEBUG is not set
|
||||
# CONFIG_USB_STORAGE_DATAFAB is not set
|
||||
# CONFIG_USB_STORAGE_FREECOM is not set
|
||||
# CONFIG_USB_STORAGE_ISD200 is not set
|
||||
# CONFIG_USB_STORAGE_DPCM is not set
|
||||
# CONFIG_USB_STORAGE_USBAT is not set
|
||||
# CONFIG_USB_STORAGE_SDDR09 is not set
|
||||
|
@ -1070,16 +1080,60 @@ CONFIG_USB_MON=y
|
|||
#
|
||||
# CONFIG_USB_GADGET is not set
|
||||
# CONFIG_MMC is not set
|
||||
|
||||
#
|
||||
# Real Time Clock
|
||||
#
|
||||
# CONFIG_NEW_LEDS is not set
|
||||
CONFIG_RTC_LIB=y
|
||||
# CONFIG_RTC_CLASS is not set
|
||||
CONFIG_RTC_CLASS=y
|
||||
CONFIG_RTC_HCTOSYS=y
|
||||
CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
|
||||
# CONFIG_RTC_DEBUG is not set
|
||||
|
||||
#
|
||||
# DMA Engine support
|
||||
# RTC interfaces
|
||||
#
|
||||
CONFIG_RTC_INTF_SYSFS=y
|
||||
CONFIG_RTC_INTF_PROC=y
|
||||
CONFIG_RTC_INTF_DEV=y
|
||||
# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
|
||||
# CONFIG_RTC_DRV_TEST is not set
|
||||
|
||||
#
|
||||
# I2C RTC drivers
|
||||
#
|
||||
# CONFIG_RTC_DRV_DS1307 is not set
|
||||
# CONFIG_RTC_DRV_DS1374 is not set
|
||||
# CONFIG_RTC_DRV_DS1672 is not set
|
||||
# CONFIG_RTC_DRV_MAX6900 is not set
|
||||
CONFIG_RTC_DRV_RS5C372=y
|
||||
# CONFIG_RTC_DRV_ISL1208 is not set
|
||||
# CONFIG_RTC_DRV_X1205 is not set
|
||||
# CONFIG_RTC_DRV_PCF8563 is not set
|
||||
# CONFIG_RTC_DRV_PCF8583 is not set
|
||||
# CONFIG_RTC_DRV_M41T80 is not set
|
||||
|
||||
#
|
||||
# SPI RTC drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Platform RTC drivers
|
||||
#
|
||||
# CONFIG_RTC_DRV_CMOS is not set
|
||||
# CONFIG_RTC_DRV_DS1553 is not set
|
||||
# CONFIG_RTC_DRV_STK17TA8 is not set
|
||||
# CONFIG_RTC_DRV_DS1742 is not set
|
||||
# CONFIG_RTC_DRV_M48T86 is not set
|
||||
# CONFIG_RTC_DRV_M48T59 is not set
|
||||
# CONFIG_RTC_DRV_V3020 is not set
|
||||
|
||||
#
|
||||
# on-CPU RTC drivers
|
||||
#
|
||||
CONFIG_DMADEVICES=y
|
||||
|
||||
#
|
||||
# DMA Devices
|
||||
#
|
||||
CONFIG_INTEL_IOP_ADMA=y
|
||||
CONFIG_DMA_ENGINE=y
|
||||
|
||||
#
|
||||
|
@ -1087,12 +1141,6 @@ CONFIG_DMA_ENGINE=y
|
|||
#
|
||||
CONFIG_NET_DMA=y
|
||||
|
||||
#
|
||||
# DMA Devices
|
||||
#
|
||||
# CONFIG_INTEL_IOATDMA is not set
|
||||
CONFIG_INTEL_IOP_ADMA=y
|
||||
|
||||
#
|
||||
# File systems
|
||||
#
|
||||
|
@ -1105,7 +1153,6 @@ CONFIG_EXT3_FS_XATTR=y
|
|||
# CONFIG_EXT3_FS_SECURITY is not set
|
||||
# CONFIG_EXT4DEV_FS is not set
|
||||
CONFIG_JBD=y
|
||||
# CONFIG_JBD_DEBUG is not set
|
||||
CONFIG_FS_MBCACHE=y
|
||||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
|
@ -1145,7 +1192,6 @@ CONFIG_SYSFS=y
|
|||
CONFIG_TMPFS=y
|
||||
# CONFIG_TMPFS_POSIX_ACL is not set
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_CONFIGFS_FS is not set
|
||||
|
||||
#
|
||||
|
@ -1162,10 +1208,12 @@ CONFIG_ECRYPT_FS=y
|
|||
CONFIG_JFFS2_FS=y
|
||||
CONFIG_JFFS2_FS_DEBUG=0
|
||||
CONFIG_JFFS2_FS_WRITEBUFFER=y
|
||||
# CONFIG_JFFS2_FS_WBUF_VERIFY is not set
|
||||
# CONFIG_JFFS2_SUMMARY is not set
|
||||
# CONFIG_JFFS2_FS_XATTR is not set
|
||||
# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
|
||||
CONFIG_JFFS2_ZLIB=y
|
||||
# CONFIG_JFFS2_LZO is not set
|
||||
CONFIG_JFFS2_RTIME=y
|
||||
# CONFIG_JFFS2_RUBIN is not set
|
||||
CONFIG_CRAMFS=y
|
||||
|
@ -1174,10 +1222,7 @@ CONFIG_CRAMFS=y
|
|||
# CONFIG_QNX4FS_FS is not set
|
||||
# CONFIG_SYSV_FS is not set
|
||||
# CONFIG_UFS_FS is not set
|
||||
|
||||
#
|
||||
# Network File Systems
|
||||
#
|
||||
CONFIG_NETWORK_FILESYSTEMS=y
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
# CONFIG_NFS_V3_ACL is not set
|
||||
|
@ -1224,26 +1269,17 @@ CONFIG_MSDOS_PARTITION=y
|
|||
# CONFIG_KARMA_PARTITION is not set
|
||||
# CONFIG_EFI_PARTITION is not set
|
||||
# CONFIG_SYSV68_PARTITION is not set
|
||||
|
||||
#
|
||||
# Native Language Support
|
||||
#
|
||||
# CONFIG_NLS is not set
|
||||
|
||||
#
|
||||
# Distributed Lock Manager
|
||||
#
|
||||
# CONFIG_DLM is not set
|
||||
|
||||
#
|
||||
# Profiling support
|
||||
#
|
||||
CONFIG_INSTRUMENTATION=y
|
||||
# CONFIG_PROFILING is not set
|
||||
# CONFIG_MARKERS is not set
|
||||
|
||||
#
|
||||
# Kernel hacking
|
||||
#
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_ENABLE_WARN_DEPRECATED=y
|
||||
CONFIG_ENABLE_MUST_CHECK=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
# CONFIG_UNUSED_SYMBOLS is not set
|
||||
|
@ -1270,10 +1306,13 @@ CONFIG_DEBUG_BUGVERBOSE=y
|
|||
# CONFIG_DEBUG_INFO is not set
|
||||
# CONFIG_DEBUG_VM is not set
|
||||
# CONFIG_DEBUG_LIST is not set
|
||||
# CONFIG_DEBUG_SG is not set
|
||||
CONFIG_FRAME_POINTER=y
|
||||
# CONFIG_FORCED_INLINING is not set
|
||||
# CONFIG_BOOT_PRINTK_DELAY is not set
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
# CONFIG_FAULT_INJECTION is not set
|
||||
# CONFIG_SAMPLES is not set
|
||||
CONFIG_DEBUG_USER=y
|
||||
# CONFIG_DEBUG_ERRORS is not set
|
||||
CONFIG_DEBUG_LL=y
|
||||
|
@ -1285,6 +1324,7 @@ CONFIG_DEBUG_LL=y
|
|||
CONFIG_KEYS=y
|
||||
CONFIG_KEYS_DEBUG_PROC_KEYS=y
|
||||
# CONFIG_SECURITY is not set
|
||||
# CONFIG_SECURITY_FILE_CAPABILITIES is not set
|
||||
CONFIG_XOR_BLOCKS=y
|
||||
CONFIG_ASYNC_CORE=y
|
||||
CONFIG_ASYNC_MEMCPY=y
|
||||
|
@ -1309,6 +1349,7 @@ CONFIG_CRYPTO_ECB=y
|
|||
CONFIG_CRYPTO_CBC=y
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
CONFIG_CRYPTO_LRW=y
|
||||
# CONFIG_CRYPTO_XTS is not set
|
||||
# CONFIG_CRYPTO_CRYPTD is not set
|
||||
CONFIG_CRYPTO_DES=y
|
||||
# CONFIG_CRYPTO_FCRYPT is not set
|
||||
|
@ -1323,11 +1364,13 @@ CONFIG_CRYPTO_TEA=y
|
|||
CONFIG_CRYPTO_ARC4=y
|
||||
CONFIG_CRYPTO_KHAZAD=y
|
||||
CONFIG_CRYPTO_ANUBIS=y
|
||||
# CONFIG_CRYPTO_SEED is not set
|
||||
CONFIG_CRYPTO_DEFLATE=y
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=y
|
||||
CONFIG_CRYPTO_CRC32C=y
|
||||
# CONFIG_CRYPTO_CAMELLIA is not set
|
||||
# CONFIG_CRYPTO_TEST is not set
|
||||
# CONFIG_CRYPTO_AUTHENC is not set
|
||||
CONFIG_CRYPTO_HW=y
|
||||
|
||||
#
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.22
|
||||
# Thu Jul 19 16:05:59 2007
|
||||
# Linux kernel version: 2.6.24-rc5
|
||||
# Wed Dec 12 16:11:27 2007
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
|
||||
|
@ -26,15 +26,11 @@ CONFIG_VECTORS_BASE=0xffff0000
|
|||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
# General setup
|
||||
#
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_BROKEN_ON_SMP=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
|
||||
#
|
||||
# General setup
|
||||
#
|
||||
CONFIG_LOCALVERSION=""
|
||||
CONFIG_LOCALVERSION_AUTO=y
|
||||
CONFIG_SWAP=y
|
||||
|
@ -45,9 +41,14 @@ CONFIG_BSD_PROCESS_ACCT=y
|
|||
# CONFIG_BSD_PROCESS_ACCT_V3 is not set
|
||||
# CONFIG_TASKSTATS is not set
|
||||
# CONFIG_USER_NS is not set
|
||||
# CONFIG_PID_NS is not set
|
||||
# CONFIG_AUDIT is not set
|
||||
# CONFIG_IKCONFIG is not set
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
# CONFIG_CGROUPS is not set
|
||||
CONFIG_FAIR_GROUP_SCHED=y
|
||||
CONFIG_FAIR_USER_SCHED=y
|
||||
# CONFIG_FAIR_CGROUP_SCHED is not set
|
||||
CONFIG_SYSFS_DEPRECATED=y
|
||||
# CONFIG_RELAY is not set
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
|
@ -69,7 +70,6 @@ CONFIG_FUTEX=y
|
|||
CONFIG_ANON_INODES=y
|
||||
CONFIG_EPOLL=y
|
||||
CONFIG_SIGNALFD=y
|
||||
CONFIG_TIMERFD=y
|
||||
CONFIG_EVENTFD=y
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_VM_EVENT_COUNTERS=y
|
||||
|
@ -130,6 +130,7 @@ CONFIG_ARCH_IOP33X=y
|
|||
# CONFIG_ARCH_L7200 is not set
|
||||
# CONFIG_ARCH_KS8695 is not set
|
||||
# CONFIG_ARCH_NS9XXX is not set
|
||||
# CONFIG_ARCH_MXC is not set
|
||||
# CONFIG_ARCH_PNX4008 is not set
|
||||
# CONFIG_ARCH_PXA is not set
|
||||
# CONFIG_ARCH_RPC is not set
|
||||
|
@ -150,6 +151,14 @@ CONFIG_IOP3XX_ATU=y
|
|||
#
|
||||
CONFIG_ARCH_IQ80331=y
|
||||
CONFIG_MACH_IQ80332=y
|
||||
|
||||
#
|
||||
# Boot options
|
||||
#
|
||||
|
||||
#
|
||||
# Power management
|
||||
#
|
||||
CONFIG_PLAT_IOP=y
|
||||
|
||||
#
|
||||
|
@ -179,11 +188,8 @@ CONFIG_XSCALE_PMU=y
|
|||
CONFIG_PCI=y
|
||||
CONFIG_PCI_SYSCALL=y
|
||||
# CONFIG_ARCH_SUPPORTS_MSI is not set
|
||||
CONFIG_PCI_LEGACY=y
|
||||
# CONFIG_PCI_DEBUG is not set
|
||||
|
||||
#
|
||||
# PCCARD (PCMCIA/CardBus) support
|
||||
#
|
||||
# CONFIG_PCCARD is not set
|
||||
|
||||
#
|
||||
|
@ -202,6 +208,7 @@ CONFIG_FLATMEM_MANUAL=y
|
|||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
# CONFIG_SPARSEMEM_VMEMMAP_ENABLE is not set
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4096
|
||||
# CONFIG_RESOURCES_64BIT is not set
|
||||
CONFIG_ZONE_DMA_FLAG=1
|
||||
|
@ -241,6 +248,7 @@ CONFIG_BINFMT_AOUT=y
|
|||
# Power management options
|
||||
#
|
||||
# CONFIG_PM is not set
|
||||
CONFIG_SUSPEND_UP_POSSIBLE=y
|
||||
|
||||
#
|
||||
# Networking
|
||||
|
@ -279,6 +287,7 @@ CONFIG_IP_PNP_BOOTP=y
|
|||
CONFIG_INET_XFRM_MODE_TRANSPORT=y
|
||||
CONFIG_INET_XFRM_MODE_TUNNEL=y
|
||||
CONFIG_INET_XFRM_MODE_BEET=y
|
||||
# CONFIG_INET_LRO is not set
|
||||
CONFIG_INET_DIAG=y
|
||||
CONFIG_INET_TCP_DIAG=y
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
|
@ -318,10 +327,6 @@ CONFIG_IPV6=y
|
|||
# CONFIG_LAPB is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
|
||||
#
|
||||
# QoS and/or fair queueing
|
||||
#
|
||||
# CONFIG_NET_SCHED is not set
|
||||
|
||||
#
|
||||
|
@ -350,6 +355,7 @@ CONFIG_IPV6=y
|
|||
#
|
||||
# Generic Driver Options
|
||||
#
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
CONFIG_STANDALONE=y
|
||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
# CONFIG_FW_LOADER is not set
|
||||
|
@ -379,6 +385,7 @@ CONFIG_MTD_BLOCK=y
|
|||
# CONFIG_INFTL is not set
|
||||
# CONFIG_RFD_FTL is not set
|
||||
# CONFIG_SSFDC is not set
|
||||
# CONFIG_MTD_OOPS is not set
|
||||
|
||||
#
|
||||
# RAM/ROM/Flash chip drivers
|
||||
|
@ -419,6 +426,7 @@ CONFIG_MTD_PHYSMAP_START=0x0
|
|||
CONFIG_MTD_PHYSMAP_LEN=0x0
|
||||
CONFIG_MTD_PHYSMAP_BANKWIDTH=1
|
||||
# CONFIG_MTD_ARM_INTEGRATOR is not set
|
||||
# CONFIG_MTD_INTEL_VR_NOR is not set
|
||||
# CONFIG_MTD_PLATRAM is not set
|
||||
|
||||
#
|
||||
|
@ -459,6 +467,11 @@ CONFIG_BLK_DEV_RAM_SIZE=8192
|
|||
CONFIG_BLK_DEV_RAM_BLOCKSIZE=1024
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
CONFIG_MISC_DEVICES=y
|
||||
# CONFIG_PHANTOM is not set
|
||||
# CONFIG_EEPROM_93CX6 is not set
|
||||
# CONFIG_SGI_IOC4 is not set
|
||||
# CONFIG_TIFM_CORE is not set
|
||||
# CONFIG_IDE is not set
|
||||
|
||||
#
|
||||
|
@ -496,12 +509,9 @@ CONFIG_SCSI_WAIT_SCAN=m
|
|||
# CONFIG_SCSI_SPI_ATTRS is not set
|
||||
# CONFIG_SCSI_FC_ATTRS is not set
|
||||
# CONFIG_SCSI_ISCSI_ATTRS is not set
|
||||
# CONFIG_SCSI_SAS_ATTRS is not set
|
||||
# CONFIG_SCSI_SAS_LIBSAS is not set
|
||||
|
||||
#
|
||||
# SCSI low-level drivers
|
||||
#
|
||||
# CONFIG_SCSI_SRP_ATTRS is not set
|
||||
CONFIG_SCSI_LOWLEVEL=y
|
||||
# CONFIG_ISCSI_TCP is not set
|
||||
# CONFIG_BLK_DEV_3W_XXXX_RAID is not set
|
||||
# CONFIG_SCSI_3W_9XXX is not set
|
||||
|
@ -512,6 +522,7 @@ CONFIG_SCSI_WAIT_SCAN=m
|
|||
# CONFIG_SCSI_AIC79XX is not set
|
||||
# CONFIG_SCSI_AIC94XX is not set
|
||||
# CONFIG_SCSI_DPT_I2O is not set
|
||||
# CONFIG_SCSI_ADVANSYS is not set
|
||||
# CONFIG_SCSI_ARCMSR is not set
|
||||
# CONFIG_MEGARAID_NEWGEN is not set
|
||||
# CONFIG_MEGARAID_LEGACY is not set
|
||||
|
@ -552,14 +563,8 @@ CONFIG_BLK_DEV_DM=y
|
|||
# CONFIG_DM_ZERO is not set
|
||||
# CONFIG_DM_MULTIPATH is not set
|
||||
# CONFIG_DM_DELAY is not set
|
||||
|
||||
#
|
||||
# Fusion MPT device support
|
||||
#
|
||||
# CONFIG_DM_UEVENT is not set
|
||||
# CONFIG_FUSION is not set
|
||||
# CONFIG_FUSION_SPI is not set
|
||||
# CONFIG_FUSION_FC is not set
|
||||
# CONFIG_FUSION_SAS is not set
|
||||
|
||||
#
|
||||
# IEEE 1394 (FireWire) support
|
||||
|
@ -574,6 +579,8 @@ CONFIG_NETDEVICES=y
|
|||
# CONFIG_MACVLAN is not set
|
||||
# CONFIG_EQUALIZER is not set
|
||||
# CONFIG_TUN is not set
|
||||
# CONFIG_VETH is not set
|
||||
# CONFIG_IP1000 is not set
|
||||
# CONFIG_ARCNET is not set
|
||||
# CONFIG_NET_ETHERNET is not set
|
||||
CONFIG_NETDEV_1000=y
|
||||
|
@ -582,6 +589,7 @@ CONFIG_NETDEV_1000=y
|
|||
CONFIG_E1000=y
|
||||
CONFIG_E1000_NAPI=y
|
||||
# CONFIG_E1000_DISABLE_PACKET_SPLIT is not set
|
||||
# CONFIG_E1000E is not set
|
||||
# CONFIG_NS83820 is not set
|
||||
# CONFIG_HAMACHI is not set
|
||||
# CONFIG_YELLOWFIN is not set
|
||||
|
@ -589,6 +597,7 @@ CONFIG_E1000_NAPI=y
|
|||
# CONFIG_SIS190 is not set
|
||||
# CONFIG_SKGE is not set
|
||||
# CONFIG_SKY2 is not set
|
||||
# CONFIG_SK98LIN is not set
|
||||
# CONFIG_VIA_VELOCITY is not set
|
||||
# CONFIG_TIGON3 is not set
|
||||
# CONFIG_BNX2 is not set
|
||||
|
@ -597,11 +606,14 @@ CONFIG_E1000_NAPI=y
|
|||
CONFIG_NETDEV_10000=y
|
||||
# CONFIG_CHELSIO_T1 is not set
|
||||
# CONFIG_CHELSIO_T3 is not set
|
||||
# CONFIG_IXGBE is not set
|
||||
# CONFIG_IXGB is not set
|
||||
# CONFIG_S2IO is not set
|
||||
# CONFIG_MYRI10GE is not set
|
||||
# CONFIG_NETXEN_NIC is not set
|
||||
# CONFIG_NIU is not set
|
||||
# CONFIG_MLX4_CORE is not set
|
||||
# CONFIG_TEHUTI is not set
|
||||
# CONFIG_TR is not set
|
||||
|
||||
#
|
||||
|
@ -636,7 +648,6 @@ CONFIG_INPUT_MOUSEDEV=y
|
|||
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
||||
# CONFIG_INPUT_JOYDEV is not set
|
||||
# CONFIG_INPUT_TSDEV is not set
|
||||
# CONFIG_INPUT_EVDEV is not set
|
||||
# CONFIG_INPUT_EVBUG is not set
|
||||
|
||||
|
@ -685,12 +696,10 @@ CONFIG_UNIX98_PTYS=y
|
|||
CONFIG_LEGACY_PTYS=y
|
||||
CONFIG_LEGACY_PTY_COUNT=256
|
||||
# CONFIG_IPMI_HANDLER is not set
|
||||
# CONFIG_WATCHDOG is not set
|
||||
CONFIG_HW_RANDOM=y
|
||||
# CONFIG_NVRAM is not set
|
||||
# CONFIG_R3964 is not set
|
||||
# CONFIG_APPLICOM is not set
|
||||
# CONFIG_DRM is not set
|
||||
# CONFIG_RAW_DRIVER is not set
|
||||
# CONFIG_TCG_TPM is not set
|
||||
CONFIG_DEVPORT=y
|
||||
|
@ -755,9 +764,9 @@ CONFIG_I2C_IOP3XX=y
|
|||
# CONFIG_SPI is not set
|
||||
# CONFIG_SPI_MASTER is not set
|
||||
# CONFIG_W1 is not set
|
||||
# CONFIG_POWER_SUPPLY is not set
|
||||
CONFIG_HWMON=y
|
||||
# CONFIG_HWMON_VID is not set
|
||||
# CONFIG_SENSORS_ABITUGURU is not set
|
||||
# CONFIG_SENSORS_AD7418 is not set
|
||||
# CONFIG_SENSORS_ADM1021 is not set
|
||||
# CONFIG_SENSORS_ADM1025 is not set
|
||||
|
@ -765,12 +774,13 @@ CONFIG_HWMON=y
|
|||
# CONFIG_SENSORS_ADM1029 is not set
|
||||
# CONFIG_SENSORS_ADM1031 is not set
|
||||
# CONFIG_SENSORS_ADM9240 is not set
|
||||
# CONFIG_SENSORS_ASB100 is not set
|
||||
# CONFIG_SENSORS_ADT7470 is not set
|
||||
# CONFIG_SENSORS_ATXP1 is not set
|
||||
# CONFIG_SENSORS_DS1621 is not set
|
||||
# CONFIG_SENSORS_I5K_AMB is not set
|
||||
# CONFIG_SENSORS_F71805F is not set
|
||||
# CONFIG_SENSORS_FSCHER is not set
|
||||
# CONFIG_SENSORS_FSCPOS is not set
|
||||
# CONFIG_SENSORS_F71882FG is not set
|
||||
# CONFIG_SENSORS_F75375S is not set
|
||||
# CONFIG_SENSORS_GL518SM is not set
|
||||
# CONFIG_SENSORS_GL520SM is not set
|
||||
# CONFIG_SENSORS_IT87 is not set
|
||||
|
@ -784,14 +794,17 @@ CONFIG_HWMON=y
|
|||
# CONFIG_SENSORS_LM87 is not set
|
||||
# CONFIG_SENSORS_LM90 is not set
|
||||
# CONFIG_SENSORS_LM92 is not set
|
||||
# CONFIG_SENSORS_LM93 is not set
|
||||
# CONFIG_SENSORS_MAX1619 is not set
|
||||
# CONFIG_SENSORS_MAX6650 is not set
|
||||
# CONFIG_SENSORS_PC87360 is not set
|
||||
# CONFIG_SENSORS_PC87427 is not set
|
||||
# CONFIG_SENSORS_SIS5595 is not set
|
||||
# CONFIG_SENSORS_DME1737 is not set
|
||||
# CONFIG_SENSORS_SMSC47M1 is not set
|
||||
# CONFIG_SENSORS_SMSC47M192 is not set
|
||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||
# CONFIG_SENSORS_THMC50 is not set
|
||||
# CONFIG_SENSORS_VIA686A is not set
|
||||
# CONFIG_SENSORS_VT1211 is not set
|
||||
# CONFIG_SENSORS_VT8231 is not set
|
||||
|
@ -803,30 +816,19 @@ CONFIG_HWMON=y
|
|||
# CONFIG_SENSORS_W83627HF is not set
|
||||
# CONFIG_SENSORS_W83627EHF is not set
|
||||
# CONFIG_HWMON_DEBUG_CHIP is not set
|
||||
CONFIG_MISC_DEVICES=y
|
||||
# CONFIG_PHANTOM is not set
|
||||
# CONFIG_EEPROM_93CX6 is not set
|
||||
# CONFIG_SGI_IOC4 is not set
|
||||
# CONFIG_TIFM_CORE is not set
|
||||
# CONFIG_WATCHDOG is not set
|
||||
|
||||
#
|
||||
# Sonics Silicon Backplane
|
||||
#
|
||||
CONFIG_SSB_POSSIBLE=y
|
||||
# CONFIG_SSB is not set
|
||||
|
||||
#
|
||||
# Multifunction device drivers
|
||||
#
|
||||
# CONFIG_MFD_SM501 is not set
|
||||
|
||||
#
|
||||
# LED devices
|
||||
#
|
||||
# CONFIG_NEW_LEDS is not set
|
||||
|
||||
#
|
||||
# LED drivers
|
||||
#
|
||||
|
||||
#
|
||||
# LED Triggers
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
|
@ -837,14 +839,16 @@ CONFIG_DAB=y
|
|||
#
|
||||
# Graphics support
|
||||
#
|
||||
# CONFIG_DRM is not set
|
||||
# CONFIG_VGASTATE is not set
|
||||
# CONFIG_VIDEO_OUTPUT_CONTROL is not set
|
||||
# CONFIG_FB is not set
|
||||
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
||||
|
||||
#
|
||||
# Display device support
|
||||
#
|
||||
# CONFIG_DISPLAY_SUPPORT is not set
|
||||
# CONFIG_VGASTATE is not set
|
||||
# CONFIG_FB is not set
|
||||
|
||||
#
|
||||
# Console display driver support
|
||||
|
@ -859,6 +863,7 @@ CONFIG_DUMMY_CONSOLE=y
|
|||
CONFIG_HID_SUPPORT=y
|
||||
CONFIG_HID=y
|
||||
# CONFIG_HID_DEBUG is not set
|
||||
# CONFIG_HIDRAW is not set
|
||||
CONFIG_USB_SUPPORT=y
|
||||
CONFIG_USB_ARCH_HAS_HCD=y
|
||||
CONFIG_USB_ARCH_HAS_OHCI=y
|
||||
|
@ -874,16 +879,15 @@ CONFIG_USB_ARCH_HAS_EHCI=y
|
|||
#
|
||||
# CONFIG_USB_GADGET is not set
|
||||
# CONFIG_MMC is not set
|
||||
|
||||
#
|
||||
# Real Time Clock
|
||||
#
|
||||
# CONFIG_NEW_LEDS is not set
|
||||
CONFIG_RTC_LIB=y
|
||||
# CONFIG_RTC_CLASS is not set
|
||||
CONFIG_DMADEVICES=y
|
||||
|
||||
#
|
||||
# DMA Engine support
|
||||
# DMA Devices
|
||||
#
|
||||
CONFIG_INTEL_IOP_ADMA=y
|
||||
CONFIG_DMA_ENGINE=y
|
||||
|
||||
#
|
||||
|
@ -891,12 +895,6 @@ CONFIG_DMA_ENGINE=y
|
|||
#
|
||||
CONFIG_NET_DMA=y
|
||||
|
||||
#
|
||||
# DMA Devices
|
||||
#
|
||||
# CONFIG_INTEL_IOATDMA is not set
|
||||
CONFIG_INTEL_IOP_ADMA=y
|
||||
|
||||
#
|
||||
# File systems
|
||||
#
|
||||
|
@ -909,7 +907,6 @@ CONFIG_EXT3_FS_XATTR=y
|
|||
# CONFIG_EXT3_FS_SECURITY is not set
|
||||
# CONFIG_EXT4DEV_FS is not set
|
||||
CONFIG_JBD=y
|
||||
# CONFIG_JBD_DEBUG is not set
|
||||
CONFIG_FS_MBCACHE=y
|
||||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
|
@ -949,7 +946,6 @@ CONFIG_SYSFS=y
|
|||
CONFIG_TMPFS=y
|
||||
# CONFIG_TMPFS_POSIX_ACL is not set
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_CONFIGFS_FS is not set
|
||||
|
||||
#
|
||||
|
@ -969,10 +965,7 @@ CONFIG_CRAMFS=y
|
|||
# CONFIG_QNX4FS_FS is not set
|
||||
# CONFIG_SYSV_FS is not set
|
||||
# CONFIG_UFS_FS is not set
|
||||
|
||||
#
|
||||
# Network File Systems
|
||||
#
|
||||
CONFIG_NETWORK_FILESYSTEMS=y
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
# CONFIG_NFS_V3_ACL is not set
|
||||
|
@ -1019,26 +1012,17 @@ CONFIG_MSDOS_PARTITION=y
|
|||
# CONFIG_KARMA_PARTITION is not set
|
||||
# CONFIG_EFI_PARTITION is not set
|
||||
# CONFIG_SYSV68_PARTITION is not set
|
||||
|
||||
#
|
||||
# Native Language Support
|
||||
#
|
||||
# CONFIG_NLS is not set
|
||||
|
||||
#
|
||||
# Distributed Lock Manager
|
||||
#
|
||||
# CONFIG_DLM is not set
|
||||
|
||||
#
|
||||
# Profiling support
|
||||
#
|
||||
CONFIG_INSTRUMENTATION=y
|
||||
# CONFIG_PROFILING is not set
|
||||
# CONFIG_MARKERS is not set
|
||||
|
||||
#
|
||||
# Kernel hacking
|
||||
#
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_ENABLE_WARN_DEPRECATED=y
|
||||
CONFIG_ENABLE_MUST_CHECK=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
# CONFIG_UNUSED_SYMBOLS is not set
|
||||
|
@ -1065,10 +1049,13 @@ CONFIG_DEBUG_BUGVERBOSE=y
|
|||
# CONFIG_DEBUG_INFO is not set
|
||||
# CONFIG_DEBUG_VM is not set
|
||||
# CONFIG_DEBUG_LIST is not set
|
||||
# CONFIG_DEBUG_SG is not set
|
||||
CONFIG_FRAME_POINTER=y
|
||||
# CONFIG_FORCED_INLINING is not set
|
||||
# CONFIG_BOOT_PRINTK_DELAY is not set
|
||||
# CONFIG_RCU_TORTURE_TEST is not set
|
||||
# CONFIG_FAULT_INJECTION is not set
|
||||
# CONFIG_SAMPLES is not set
|
||||
CONFIG_DEBUG_USER=y
|
||||
# CONFIG_DEBUG_ERRORS is not set
|
||||
CONFIG_DEBUG_LL=y
|
||||
|
@ -1079,6 +1066,7 @@ CONFIG_DEBUG_LL=y
|
|||
#
|
||||
# CONFIG_KEYS is not set
|
||||
# CONFIG_SECURITY is not set
|
||||
# CONFIG_SECURITY_FILE_CAPABILITIES is not set
|
||||
CONFIG_XOR_BLOCKS=y
|
||||
CONFIG_ASYNC_CORE=y
|
||||
CONFIG_ASYNC_MEMCPY=y
|
||||
|
|
|
@ -0,0 +1,895 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.23
|
||||
# Wed Nov 7 01:36:45 2007
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
|
||||
# CONFIG_GENERIC_GPIO is not set
|
||||
CONFIG_GENERIC_TIME=y
|
||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||
CONFIG_MMU=y
|
||||
# CONFIG_NO_IOPORT is not set
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_GENERIC_GPIOS=y
|
||||
CONFIG_STACKTRACE_SUPPORT=y
|
||||
CONFIG_LOCKDEP_SUPPORT=y
|
||||
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
|
||||
CONFIG_HARDIRQS_SW_RESEND=y
|
||||
CONFIG_GENERIC_IRQ_PROBE=y
|
||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||
# CONFIG_ARCH_HAS_ILOG2_U32 is not set
|
||||
# CONFIG_ARCH_HAS_ILOG2_U64 is not set
|
||||
CONFIG_GENERIC_HWEIGHT=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_ZONE_DMA=y
|
||||
CONFIG_VECTORS_BASE=0xffff0000
|
||||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||
|
||||
#
|
||||
# General setup
|
||||
#
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_BROKEN_ON_SMP=y
|
||||
CONFIG_LOCK_KERNEL=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
CONFIG_LOCALVERSION=""
|
||||
CONFIG_LOCALVERSION_AUTO=y
|
||||
CONFIG_SWAP=y
|
||||
# CONFIG_SYSVIPC is not set
|
||||
# CONFIG_POSIX_MQUEUE is not set
|
||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||
# CONFIG_TASKSTATS is not set
|
||||
# CONFIG_USER_NS is not set
|
||||
# CONFIG_AUDIT is not set
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
CONFIG_LOG_BUF_SHIFT=17
|
||||
CONFIG_SYSFS_DEPRECATED=y
|
||||
# CONFIG_RELAY is not set
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
||||
CONFIG_SYSCTL=y
|
||||
CONFIG_PANIC_TIMEOUT=0
|
||||
# CONFIG_EMBEDDED is not set
|
||||
CONFIG_UID16=y
|
||||
CONFIG_SYSCTL_SYSCALL=y
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
CONFIG_HOTPLUG=y
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
CONFIG_ELF_CORE=y
|
||||
CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_ANON_INODES=y
|
||||
CONFIG_EPOLL=y
|
||||
CONFIG_SIGNALFD=y
|
||||
CONFIG_EVENTFD=y
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_VM_EVENT_COUNTERS=y
|
||||
CONFIG_SLAB=y
|
||||
# CONFIG_SLUB is not set
|
||||
# CONFIG_SLOB is not set
|
||||
CONFIG_RT_MUTEXES=y
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
CONFIG_BASE_SMALL=0
|
||||
# CONFIG_MODULES is not set
|
||||
CONFIG_BLOCK=y
|
||||
# CONFIG_LBD is not set
|
||||
# CONFIG_BLK_DEV_IO_TRACE is not set
|
||||
# CONFIG_LSF is not set
|
||||
# CONFIG_BLK_DEV_BSG is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
# CONFIG_IOSCHED_DEADLINE is not set
|
||||
# CONFIG_IOSCHED_CFQ is not set
|
||||
CONFIG_DEFAULT_AS=y
|
||||
# CONFIG_DEFAULT_DEADLINE is not set
|
||||
# CONFIG_DEFAULT_CFQ is not set
|
||||
# CONFIG_DEFAULT_NOOP is not set
|
||||
CONFIG_DEFAULT_IOSCHED="anticipatory"
|
||||
|
||||
#
|
||||
# System Type
|
||||
#
|
||||
# CONFIG_ARCH_AAEC2000 is not set
|
||||
# CONFIG_ARCH_GOLDFISH is not set
|
||||
# CONFIG_ARCH_INTEGRATOR is not set
|
||||
# CONFIG_ARCH_REALVIEW is not set
|
||||
# CONFIG_ARCH_VERSATILE is not set
|
||||
# CONFIG_ARCH_AT91 is not set
|
||||
# CONFIG_ARCH_CLPS7500 is not set
|
||||
# CONFIG_ARCH_CLPS711X is not set
|
||||
# CONFIG_ARCH_CO285 is not set
|
||||
# CONFIG_ARCH_EBSA110 is not set
|
||||
# CONFIG_ARCH_EP93XX is not set
|
||||
# CONFIG_ARCH_FOOTBRIDGE is not set
|
||||
# CONFIG_ARCH_NETX is not set
|
||||
# CONFIG_ARCH_H720X is not set
|
||||
# CONFIG_ARCH_IMX is not set
|
||||
# CONFIG_ARCH_IOP13XX is not set
|
||||
# CONFIG_ARCH_IOP32X is not set
|
||||
# CONFIG_ARCH_IOP33X is not set
|
||||
# CONFIG_ARCH_IXP23XX is not set
|
||||
# CONFIG_ARCH_IXP2000 is not set
|
||||
# CONFIG_ARCH_IXP4XX is not set
|
||||
# CONFIG_ARCH_L7200 is not set
|
||||
# CONFIG_ARCH_KS8695 is not set
|
||||
# CONFIG_ARCH_NS9XXX is not set
|
||||
# CONFIG_ARCH_MXC is not set
|
||||
# CONFIG_ARCH_PNX4008 is not set
|
||||
# CONFIG_ARCH_PXA is not set
|
||||
# CONFIG_ARCH_RPC is not set
|
||||
# CONFIG_ARCH_SA1100 is not set
|
||||
# CONFIG_ARCH_S3C2410 is not set
|
||||
# CONFIG_ARCH_SHARK is not set
|
||||
# CONFIG_ARCH_LH7A40X is not set
|
||||
# CONFIG_ARCH_DAVINCI is not set
|
||||
# CONFIG_ARCH_OMAP is not set
|
||||
CONFIG_ARCH_MSM7X00A=y
|
||||
|
||||
#
|
||||
# Boot options
|
||||
#
|
||||
|
||||
#
|
||||
# Power management
|
||||
#
|
||||
|
||||
#
|
||||
# MSM7200 Board Type
|
||||
#
|
||||
CONFIG_MACH_HALIBUT=y
|
||||
CONFIG_SERIAL_MSM=y
|
||||
CONFIG_SERIAL_MSM_CONSOLE=y
|
||||
# CONFIG_SERIAL_MSM_NOINIT is not set
|
||||
CONFIG_MSM_SMD=y
|
||||
|
||||
#
|
||||
# Processor Type
|
||||
#
|
||||
CONFIG_CPU_32=y
|
||||
CONFIG_CPU_V6=y
|
||||
# CONFIG_CPU_32v6K is not set
|
||||
CONFIG_CPU_32v6=y
|
||||
CONFIG_CPU_ABRT_EV6=y
|
||||
CONFIG_CPU_CACHE_V6=y
|
||||
CONFIG_CPU_CACHE_VIPT=y
|
||||
CONFIG_CPU_COPY_V6=y
|
||||
CONFIG_CPU_TLB_V6=y
|
||||
CONFIG_CPU_HAS_ASID=y
|
||||
CONFIG_CPU_CP15=y
|
||||
CONFIG_CPU_CP15_MMU=y
|
||||
|
||||
#
|
||||
# Processor Features
|
||||
#
|
||||
CONFIG_ARM_THUMB=y
|
||||
# CONFIG_CPU_ICACHE_DISABLE is not set
|
||||
# CONFIG_CPU_DCACHE_DISABLE is not set
|
||||
# CONFIG_CPU_BPREDICT_DISABLE is not set
|
||||
# CONFIG_OUTER_CACHE is not set
|
||||
|
||||
#
|
||||
# Bus support
|
||||
#
|
||||
# CONFIG_PCI_SYSCALL is not set
|
||||
# CONFIG_ARCH_SUPPORTS_MSI is not set
|
||||
|
||||
#
|
||||
# PCCARD (PCMCIA/CardBus) support
|
||||
#
|
||||
# CONFIG_PCCARD is not set
|
||||
|
||||
#
|
||||
# Kernel Features
|
||||
#
|
||||
CONFIG_TICK_ONESHOT=y
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
CONFIG_PREEMPT=y
|
||||
CONFIG_HZ=100
|
||||
CONFIG_AEABI=y
|
||||
# CONFIG_OABI_COMPAT is not set
|
||||
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_FLATMEM_MANUAL=y
|
||||
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4
|
||||
CONFIG_RESOURCES_64BIT=y
|
||||
CONFIG_ZONE_DMA_FLAG=1
|
||||
CONFIG_BOUNCE=y
|
||||
CONFIG_VIRT_TO_BUS=y
|
||||
CONFIG_ALIGNMENT_TRAP=y
|
||||
|
||||
#
|
||||
# Boot options
|
||||
#
|
||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||
CONFIG_CMDLINE="mem=64M console=ttyMSM,115200n8"
|
||||
# CONFIG_XIP_KERNEL is not set
|
||||
# CONFIG_KEXEC is not set
|
||||
|
||||
#
|
||||
# Floating point emulation
|
||||
#
|
||||
|
||||
#
|
||||
# At least one emulation must be selected
|
||||
#
|
||||
# CONFIG_VFP is not set
|
||||
|
||||
#
|
||||
# Userspace binary formats
|
||||
#
|
||||
CONFIG_BINFMT_ELF=y
|
||||
# CONFIG_BINFMT_AOUT is not set
|
||||
# CONFIG_BINFMT_MISC is not set
|
||||
|
||||
#
|
||||
# Power management options
|
||||
#
|
||||
CONFIG_PM=y
|
||||
CONFIG_SUSPEND_UP_POSSIBLE=y
|
||||
|
||||
#
|
||||
# Networking
|
||||
#
|
||||
CONFIG_NET=y
|
||||
|
||||
#
|
||||
# Networking options
|
||||
#
|
||||
# CONFIG_PACKET is not set
|
||||
CONFIG_UNIX=y
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_INET=y
|
||||
# CONFIG_IP_MULTICAST is not set
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
CONFIG_IP_FIB_HASH=y
|
||||
# CONFIG_IP_PNP is not set
|
||||
# CONFIG_NET_IPIP is not set
|
||||
# CONFIG_NET_IPGRE is not set
|
||||
# CONFIG_ARPD is not set
|
||||
# CONFIG_SYN_COOKIES is not set
|
||||
# CONFIG_INET_AH is not set
|
||||
# CONFIG_INET_ESP is not set
|
||||
# CONFIG_INET_IPCOMP is not set
|
||||
# CONFIG_INET_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET_TUNNEL is not set
|
||||
# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
|
||||
# CONFIG_INET_XFRM_MODE_TUNNEL is not set
|
||||
# CONFIG_INET_XFRM_MODE_BEET is not set
|
||||
# CONFIG_INET_DIAG is not set
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_CUBIC=y
|
||||
CONFIG_DEFAULT_TCP_CONG="cubic"
|
||||
# CONFIG_TCP_MD5SIG is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_INET6_XFRM_TUNNEL is not set
|
||||
# CONFIG_INET6_TUNNEL is not set
|
||||
# CONFIG_NETWORK_SECMARK is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
# CONFIG_IP_DCCP is not set
|
||||
# CONFIG_IP_SCTP is not set
|
||||
# CONFIG_TIPC is not set
|
||||
# CONFIG_ATM is not set
|
||||
# CONFIG_BRIDGE is not set
|
||||
# CONFIG_VLAN_8021Q is not set
|
||||
# CONFIG_DECNET is not set
|
||||
# CONFIG_LLC2 is not set
|
||||
# CONFIG_IPX is not set
|
||||
# CONFIG_ATALK is not set
|
||||
# CONFIG_X25 is not set
|
||||
# CONFIG_LAPB is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
|
||||
#
|
||||
# QoS and/or fair queueing
|
||||
#
|
||||
# CONFIG_NET_SCHED is not set
|
||||
|
||||
#
|
||||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
# CONFIG_AF_RXRPC is not set
|
||||
|
||||
#
|
||||
# Wireless
|
||||
#
|
||||
# CONFIG_CFG80211 is not set
|
||||
# CONFIG_WIRELESS_EXT is not set
|
||||
# CONFIG_MAC80211 is not set
|
||||
# CONFIG_IEEE80211 is not set
|
||||
# CONFIG_RFKILL is not set
|
||||
# CONFIG_NET_9P is not set
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Generic Driver Options
|
||||
#
|
||||
CONFIG_STANDALONE=y
|
||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
CONFIG_FW_LOADER=y
|
||||
# CONFIG_DEBUG_DRIVER is not set
|
||||
# CONFIG_DEBUG_DEVRES is not set
|
||||
# CONFIG_SYS_HYPERVISOR is not set
|
||||
# CONFIG_CONNECTOR is not set
|
||||
CONFIG_MTD=y
|
||||
# CONFIG_MTD_DEBUG is not set
|
||||
# CONFIG_MTD_CONCAT is not set
|
||||
CONFIG_MTD_PARTITIONS=y
|
||||
# CONFIG_MTD_REDBOOT_PARTS is not set
|
||||
CONFIG_MTD_CMDLINE_PARTS=y
|
||||
# CONFIG_MTD_AFS_PARTS is not set
|
||||
|
||||
#
|
||||
# User Modules And Translation Layers
|
||||
#
|
||||
CONFIG_MTD_CHAR=y
|
||||
CONFIG_MTD_BLKDEVS=y
|
||||
CONFIG_MTD_BLOCK=y
|
||||
# CONFIG_FTL is not set
|
||||
# CONFIG_NFTL is not set
|
||||
# CONFIG_INFTL is not set
|
||||
# CONFIG_RFD_FTL is not set
|
||||
# CONFIG_SSFDC is not set
|
||||
|
||||
#
|
||||
# RAM/ROM/Flash chip drivers
|
||||
#
|
||||
# CONFIG_MTD_CFI is not set
|
||||
# CONFIG_MTD_JEDECPROBE is not set
|
||||
CONFIG_MTD_MAP_BANK_WIDTH_1=y
|
||||
CONFIG_MTD_MAP_BANK_WIDTH_2=y
|
||||
CONFIG_MTD_MAP_BANK_WIDTH_4=y
|
||||
# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
|
||||
# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
|
||||
# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
|
||||
CONFIG_MTD_CFI_I1=y
|
||||
CONFIG_MTD_CFI_I2=y
|
||||
# CONFIG_MTD_CFI_I4 is not set
|
||||
# CONFIG_MTD_CFI_I8 is not set
|
||||
# CONFIG_MTD_RAM is not set
|
||||
# CONFIG_MTD_ROM is not set
|
||||
# CONFIG_MTD_ABSENT is not set
|
||||
|
||||
#
|
||||
# Mapping drivers for chip access
|
||||
#
|
||||
# CONFIG_MTD_COMPLEX_MAPPINGS is not set
|
||||
# CONFIG_MTD_PLATRAM is not set
|
||||
|
||||
#
|
||||
# Self-contained MTD device drivers
|
||||
#
|
||||
# CONFIG_MTD_SLRAM is not set
|
||||
# CONFIG_MTD_PHRAM is not set
|
||||
# CONFIG_MTD_MTDRAM is not set
|
||||
# CONFIG_MTD_BLOCK2MTD is not set
|
||||
CONFIG_MTD_MSM_NAND=y
|
||||
|
||||
#
|
||||
# Disk-On-Chip Device Drivers
|
||||
#
|
||||
# CONFIG_MTD_DOC2000 is not set
|
||||
# CONFIG_MTD_DOC2001 is not set
|
||||
# CONFIG_MTD_DOC2001PLUS is not set
|
||||
# CONFIG_MTD_GOLDFISH_NAND is not set
|
||||
# CONFIG_MTD_NAND is not set
|
||||
# CONFIG_MTD_ONENAND is not set
|
||||
|
||||
#
|
||||
# UBI - Unsorted block images
|
||||
#
|
||||
# CONFIG_MTD_UBI is not set
|
||||
# CONFIG_PARPORT is not set
|
||||
CONFIG_BLK_DEV=y
|
||||
# CONFIG_BLK_DEV_COW_COMMON is not set
|
||||
# CONFIG_BLK_DEV_LOOP is not set
|
||||
# CONFIG_BLK_DEV_NBD is not set
|
||||
# CONFIG_BLK_DEV_RAM is not set
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
|
||||
#
|
||||
# SCSI device support
|
||||
#
|
||||
# CONFIG_RAID_ATTRS is not set
|
||||
# CONFIG_SCSI is not set
|
||||
# CONFIG_SCSI_DMA is not set
|
||||
# CONFIG_SCSI_NETLINK is not set
|
||||
# CONFIG_ATA is not set
|
||||
# CONFIG_MD is not set
|
||||
CONFIG_NETDEVICES=y
|
||||
# CONFIG_NETDEVICES_MULTIQUEUE is not set
|
||||
CONFIG_DUMMY=y
|
||||
# CONFIG_BONDING is not set
|
||||
# CONFIG_MACVLAN is not set
|
||||
# CONFIG_EQUALIZER is not set
|
||||
# CONFIG_TUN is not set
|
||||
# CONFIG_PHYLIB is not set
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_MII=y
|
||||
# CONFIG_AX88796 is not set
|
||||
CONFIG_SMC91X=y
|
||||
# CONFIG_DM9000 is not set
|
||||
CONFIG_NETDEV_1000=y
|
||||
CONFIG_NETDEV_10000=y
|
||||
|
||||
#
|
||||
# Wireless LAN
|
||||
#
|
||||
# CONFIG_WLAN_PRE80211 is not set
|
||||
# CONFIG_WLAN_80211 is not set
|
||||
# CONFIG_WAN is not set
|
||||
CONFIG_PPP=y
|
||||
# CONFIG_PPP_MULTILINK is not set
|
||||
# CONFIG_PPP_FILTER is not set
|
||||
CONFIG_PPP_ASYNC=y
|
||||
# CONFIG_PPP_SYNC_TTY is not set
|
||||
CONFIG_PPP_DEFLATE=y
|
||||
CONFIG_PPP_BSDCOMP=y
|
||||
# CONFIG_PPP_MPPE is not set
|
||||
# CONFIG_PPPOE is not set
|
||||
# CONFIG_PPPOL2TP is not set
|
||||
# CONFIG_SLIP is not set
|
||||
CONFIG_SLHC=y
|
||||
# CONFIG_SHAPER is not set
|
||||
# CONFIG_NETCONSOLE is not set
|
||||
CONFIG_MSM_RMNET=y
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
# CONFIG_ISDN is not set
|
||||
|
||||
#
|
||||
# Input device support
|
||||
#
|
||||
CONFIG_INPUT=y
|
||||
# CONFIG_INPUT_FF_MEMLESS is not set
|
||||
# CONFIG_INPUT_POLLDEV is not set
|
||||
|
||||
#
|
||||
# Userland interfaces
|
||||
#
|
||||
CONFIG_INPUT_MOUSEDEV=y
|
||||
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
||||
# CONFIG_INPUT_JOYDEV is not set
|
||||
# CONFIG_INPUT_TSDEV is not set
|
||||
CONFIG_INPUT_EVDEV=y
|
||||
# CONFIG_INPUT_EVBUG is not set
|
||||
|
||||
#
|
||||
# Input Device Drivers
|
||||
#
|
||||
CONFIG_INPUT_KEYBOARD=y
|
||||
# CONFIG_KEYBOARD_ATKBD is not set
|
||||
# CONFIG_KEYBOARD_SUNKBD is not set
|
||||
# CONFIG_KEYBOARD_LKKBD is not set
|
||||
# CONFIG_KEYBOARD_XTKBD is not set
|
||||
# CONFIG_KEYBOARD_NEWTON is not set
|
||||
# CONFIG_KEYBOARD_STOWAWAY is not set
|
||||
# CONFIG_KEYBOARD_GOLDFISH_EVENTS is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
# CONFIG_INPUT_JOYSTICK is not set
|
||||
# CONFIG_INPUT_TABLET is not set
|
||||
CONFIG_INPUT_TOUCHSCREEN=y
|
||||
# CONFIG_TOUCHSCREEN_FUJITSU is not set
|
||||
# CONFIG_TOUCHSCREEN_GUNZE is not set
|
||||
# CONFIG_TOUCHSCREEN_ELO is not set
|
||||
# CONFIG_TOUCHSCREEN_MTOUCH is not set
|
||||
# CONFIG_TOUCHSCREEN_MK712 is not set
|
||||
# CONFIG_TOUCHSCREEN_PENMOUNT is not set
|
||||
# CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_MEP is not set
|
||||
CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI=y
|
||||
# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
|
||||
# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
|
||||
# CONFIG_TOUCHSCREEN_UCB1400 is not set
|
||||
# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
|
||||
CONFIG_INPUT_MISC=y
|
||||
# CONFIG_INPUT_ATI_REMOTE is not set
|
||||
# CONFIG_INPUT_ATI_REMOTE2 is not set
|
||||
# CONFIG_INPUT_KEYSPAN_REMOTE is not set
|
||||
# CONFIG_INPUT_POWERMATE is not set
|
||||
# CONFIG_INPUT_YEALINK is not set
|
||||
# CONFIG_INPUT_UINPUT is not set
|
||||
CONFIG_INPUT_GPIO=y
|
||||
|
||||
#
|
||||
# Hardware I/O ports
|
||||
#
|
||||
# CONFIG_SERIO is not set
|
||||
# CONFIG_GAMEPORT is not set
|
||||
|
||||
#
|
||||
# Character devices
|
||||
#
|
||||
CONFIG_VT=y
|
||||
CONFIG_VT_CONSOLE=y
|
||||
CONFIG_HW_CONSOLE=y
|
||||
CONFIG_VT_HW_CONSOLE_BINDING=y
|
||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||
|
||||
#
|
||||
# Serial drivers
|
||||
#
|
||||
# CONFIG_SERIAL_8250 is not set
|
||||
|
||||
#
|
||||
# Non-8250 serial port support
|
||||
#
|
||||
CONFIG_SERIAL_CORE=y
|
||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
# CONFIG_LEGACY_PTYS is not set
|
||||
# CONFIG_IPMI_HANDLER is not set
|
||||
# CONFIG_WATCHDOG is not set
|
||||
# CONFIG_HW_RANDOM is not set
|
||||
# CONFIG_NVRAM is not set
|
||||
# CONFIG_R3964 is not set
|
||||
# CONFIG_RAW_DRIVER is not set
|
||||
# CONFIG_TCG_TPM is not set
|
||||
CONFIG_DCC_TTY=y
|
||||
# CONFIG_GOLDFISH_TTY is not set
|
||||
CONFIG_BINDER=y
|
||||
CONFIG_I2C=y
|
||||
CONFIG_I2C_BOARDINFO=y
|
||||
# CONFIG_I2C_CHARDEV is not set
|
||||
|
||||
#
|
||||
# I2C Algorithms
|
||||
#
|
||||
# CONFIG_I2C_ALGOBIT is not set
|
||||
# CONFIG_I2C_ALGOPCF is not set
|
||||
# CONFIG_I2C_ALGOPCA is not set
|
||||
|
||||
#
|
||||
# I2C Hardware Bus support
|
||||
#
|
||||
CONFIG_I2C_MSM=y
|
||||
# CONFIG_I2C_OCORES is not set
|
||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||
# CONFIG_I2C_SIMTEC is not set
|
||||
# CONFIG_I2C_TAOS_EVM is not set
|
||||
|
||||
#
|
||||
# Miscellaneous I2C Chip support
|
||||
#
|
||||
# CONFIG_SENSORS_DS1337 is not set
|
||||
# CONFIG_SENSORS_DS1374 is not set
|
||||
# CONFIG_DS1682 is not set
|
||||
# CONFIG_SENSORS_EEPROM is not set
|
||||
# CONFIG_SENSORS_PCF8574 is not set
|
||||
# CONFIG_SENSORS_PCA9539 is not set
|
||||
CONFIG_SENSORS_PCA9633=y
|
||||
# CONFIG_SENSORS_PCF8591 is not set
|
||||
# CONFIG_SENSORS_MAX6875 is not set
|
||||
CONFIG_SENSORS_AKM8976=y
|
||||
# CONFIG_SENSORS_TSL2550 is not set
|
||||
# CONFIG_I2C_DEBUG_CORE is not set
|
||||
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||
# CONFIG_I2C_DEBUG_BUS is not set
|
||||
# CONFIG_I2C_DEBUG_CHIP is not set
|
||||
|
||||
#
|
||||
# SPI support
|
||||
#
|
||||
# CONFIG_SPI is not set
|
||||
# CONFIG_SPI_MASTER is not set
|
||||
# CONFIG_W1 is not set
|
||||
# CONFIG_HWMON is not set
|
||||
CONFIG_MISC_DEVICES=y
|
||||
# CONFIG_EEPROM_93CX6 is not set
|
||||
CONFIG_LOW_MEMORY_KILLER=y
|
||||
|
||||
#
|
||||
# Multifunction device drivers
|
||||
#
|
||||
# CONFIG_MFD_SM501 is not set
|
||||
CONFIG_NEW_LEDS=y
|
||||
CONFIG_LEDS_CLASS=y
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
# CONFIG_VIDEO_DEV is not set
|
||||
# CONFIG_DVB_CORE is not set
|
||||
CONFIG_DAB=y
|
||||
|
||||
#
|
||||
# Graphics support
|
||||
#
|
||||
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
||||
|
||||
#
|
||||
# Display device support
|
||||
#
|
||||
# CONFIG_DISPLAY_SUPPORT is not set
|
||||
# CONFIG_VGASTATE is not set
|
||||
CONFIG_VIDEO_OUTPUT_CONTROL=y
|
||||
CONFIG_FB=y
|
||||
# CONFIG_FIRMWARE_EDID is not set
|
||||
# CONFIG_FB_DDC is not set
|
||||
CONFIG_FB_CFB_FILLRECT=y
|
||||
CONFIG_FB_CFB_COPYAREA=y
|
||||
CONFIG_FB_CFB_IMAGEBLIT=y
|
||||
# CONFIG_FB_SYS_FILLRECT is not set
|
||||
# CONFIG_FB_SYS_COPYAREA is not set
|
||||
# CONFIG_FB_SYS_IMAGEBLIT is not set
|
||||
# CONFIG_FB_SYS_FOPS is not set
|
||||
CONFIG_FB_DEFERRED_IO=y
|
||||
# CONFIG_FB_SVGALIB is not set
|
||||
# CONFIG_FB_MACMODES is not set
|
||||
# CONFIG_FB_BACKLIGHT is not set
|
||||
CONFIG_FB_MODE_HELPERS=y
|
||||
CONFIG_FB_TILEBLITTING=y
|
||||
|
||||
#
|
||||
# Frame buffer hardware drivers
|
||||
#
|
||||
# CONFIG_FB_S1D13XXX is not set
|
||||
CONFIG_FB_MSM=y
|
||||
# CONFIG_FB_GOLDFISH is not set
|
||||
# CONFIG_FB_VIRTUAL is not set
|
||||
|
||||
#
|
||||
# Console display driver support
|
||||
#
|
||||
# CONFIG_VGA_CONSOLE is not set
|
||||
CONFIG_DUMMY_CONSOLE=y
|
||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
|
||||
# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
|
||||
# CONFIG_FONTS is not set
|
||||
CONFIG_FONT_8x8=y
|
||||
CONFIG_FONT_8x16=y
|
||||
# CONFIG_LOGO is not set
|
||||
|
||||
#
|
||||
# Sound
|
||||
#
|
||||
# CONFIG_SOUND is not set
|
||||
CONFIG_HID_SUPPORT=y
|
||||
CONFIG_HID=y
|
||||
# CONFIG_HID_DEBUG is not set
|
||||
CONFIG_USB_SUPPORT=y
|
||||
CONFIG_USB_ARCH_HAS_HCD=y
|
||||
# CONFIG_USB_ARCH_HAS_OHCI is not set
|
||||
# CONFIG_USB_ARCH_HAS_EHCI is not set
|
||||
# CONFIG_USB is not set
|
||||
|
||||
#
|
||||
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
|
||||
#
|
||||
|
||||
#
|
||||
# USB Gadget Support
|
||||
#
|
||||
# CONFIG_USB_GADGET is not set
|
||||
|
||||
#
|
||||
# USB Function Support
|
||||
#
|
||||
CONFIG_USB_FUNCTION=y
|
||||
CONFIG_USB_FUNCTION_MSM_HSUSB=y
|
||||
# CONFIG_USB_FUNCTION_NULL is not set
|
||||
# CONFIG_USB_FUNCTION_ZERO is not set
|
||||
# CONFIG_USB_FUNCTION_LOOPBACK is not set
|
||||
CONFIG_USB_FUNCTION_ADB=y
|
||||
# CONFIG_MMC is not set
|
||||
CONFIG_RTC_LIB=y
|
||||
# CONFIG_RTC_CLASS is not set
|
||||
|
||||
#
|
||||
# DMA Engine support
|
||||
#
|
||||
# CONFIG_DMA_ENGINE is not set
|
||||
|
||||
#
|
||||
# DMA Clients
|
||||
#
|
||||
|
||||
#
|
||||
# DMA Devices
|
||||
#
|
||||
|
||||
#
|
||||
# Android
|
||||
#
|
||||
# CONFIG_ANDROID_GADGET is not set
|
||||
# CONFIG_ANDROID_RAM_CONSOLE is not set
|
||||
CONFIG_ANDROID_LOGGER=y
|
||||
CONFIG_ANDROID_VIBRATOR=y
|
||||
|
||||
#
|
||||
# File systems
|
||||
#
|
||||
# CONFIG_EXT2_FS is not set
|
||||
# CONFIG_EXT3_FS is not set
|
||||
# CONFIG_EXT4DEV_FS is not set
|
||||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
# CONFIG_FS_POSIX_ACL is not set
|
||||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_GFS2_FS is not set
|
||||
# CONFIG_OCFS2_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
CONFIG_INOTIFY=y
|
||||
CONFIG_INOTIFY_USER=y
|
||||
# CONFIG_QUOTA is not set
|
||||
CONFIG_DNOTIFY=y
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
# CONFIG_AUTOFS4_FS is not set
|
||||
# CONFIG_FUSE_FS is not set
|
||||
|
||||
#
|
||||
# CD-ROM/DVD Filesystems
|
||||
#
|
||||
# CONFIG_ISO9660_FS is not set
|
||||
# CONFIG_UDF_FS is not set
|
||||
|
||||
#
|
||||
# DOS/FAT/NT Filesystems
|
||||
#
|
||||
# CONFIG_MSDOS_FS is not set
|
||||
# CONFIG_VFAT_FS is not set
|
||||
# CONFIG_NTFS_FS is not set
|
||||
|
||||
#
|
||||
# Pseudo filesystems
|
||||
#
|
||||
CONFIG_PROC_FS=y
|
||||
CONFIG_PROC_SYSCTL=y
|
||||
CONFIG_SYSFS=y
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_TMPFS_POSIX_ACL is not set
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_CONFIGFS_FS is not set
|
||||
|
||||
#
|
||||
# Miscellaneous filesystems
|
||||
#
|
||||
# CONFIG_ADFS_FS is not set
|
||||
# CONFIG_AFFS_FS is not set
|
||||
# CONFIG_HFS_FS is not set
|
||||
# CONFIG_HFSPLUS_FS is not set
|
||||
# CONFIG_BEFS_FS is not set
|
||||
# CONFIG_BFS_FS is not set
|
||||
# CONFIG_EFS_FS is not set
|
||||
CONFIG_YAFFS_FS=y
|
||||
CONFIG_YAFFS_YAFFS1=y
|
||||
# CONFIG_YAFFS_9BYTE_TAGS is not set
|
||||
# CONFIG_YAFFS_DOES_ECC is not set
|
||||
CONFIG_YAFFS_YAFFS2=y
|
||||
CONFIG_YAFFS_AUTO_YAFFS2=y
|
||||
# CONFIG_YAFFS_DISABLE_LAZY_LOAD is not set
|
||||
CONFIG_YAFFS_CHECKPOINT_RESERVED_BLOCKS=10
|
||||
# CONFIG_YAFFS_DISABLE_WIDE_TNODES is not set
|
||||
# CONFIG_YAFFS_ALWAYS_CHECK_CHUNK_ERASED is not set
|
||||
CONFIG_YAFFS_SHORT_NAMES_IN_RAM=y
|
||||
# CONFIG_JFFS2_FS is not set
|
||||
# CONFIG_CRAMFS is not set
|
||||
# CONFIG_VXFS_FS is not set
|
||||
# CONFIG_HPFS_FS is not set
|
||||
# CONFIG_QNX4FS_FS is not set
|
||||
# CONFIG_SYSV_FS is not set
|
||||
# CONFIG_UFS_FS is not set
|
||||
|
||||
#
|
||||
# Network File Systems
|
||||
#
|
||||
# CONFIG_NFS_FS is not set
|
||||
# CONFIG_NFSD is not set
|
||||
# CONFIG_SMB_FS is not set
|
||||
# CONFIG_CIFS is not set
|
||||
# CONFIG_NCP_FS is not set
|
||||
# CONFIG_CODA_FS is not set
|
||||
# CONFIG_AFS_FS is not set
|
||||
|
||||
#
|
||||
# Partition Types
|
||||
#
|
||||
# CONFIG_PARTITION_ADVANCED is not set
|
||||
CONFIG_MSDOS_PARTITION=y
|
||||
|
||||
#
|
||||
# Native Language Support
|
||||
#
|
||||
# CONFIG_NLS is not set
|
||||
|
||||
#
|
||||
# Distributed Lock Manager
|
||||
#
|
||||
# CONFIG_DLM is not set
|
||||
|
||||
#
|
||||
# Profiling support
|
||||
#
|
||||
# CONFIG_PROFILING is not set
|
||||
|
||||
#
|
||||
# Kernel hacking
|
||||
#
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_ENABLE_MUST_CHECK=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
# CONFIG_UNUSED_SYMBOLS is not set
|
||||
# CONFIG_DEBUG_FS is not set
|
||||
# CONFIG_HEADERS_CHECK is not set
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
# CONFIG_DEBUG_SHIRQ is not set
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
CONFIG_SCHED_DEBUG=y
|
||||
CONFIG_SCHEDSTATS=y
|
||||
# CONFIG_TIMER_STATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
CONFIG_DEBUG_PREEMPT=y
|
||||
# CONFIG_DEBUG_RT_MUTEXES is not set
|
||||
# CONFIG_RT_MUTEX_TESTER is not set
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
CONFIG_DEBUG_MUTEXES=y
|
||||
# CONFIG_DEBUG_LOCK_ALLOC is not set
|
||||
# CONFIG_PROVE_LOCKING is not set
|
||||
# CONFIG_LOCK_STAT is not set
|
||||
CONFIG_DEBUG_SPINLOCK_SLEEP=y
|
||||
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
CONFIG_DEBUG_BUGVERBOSE=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_DEBUG_VM is not set
|
||||
# CONFIG_DEBUG_LIST is not set
|
||||
CONFIG_FRAME_POINTER=y
|
||||
# CONFIG_FORCED_INLINING is not set
|
||||
# CONFIG_FAULT_INJECTION is not set
|
||||
# CONFIG_DEBUG_USER is not set
|
||||
# CONFIG_DEBUG_ERRORS is not set
|
||||
CONFIG_DEBUG_LL=y
|
||||
# CONFIG_DEBUG_ICEDCC is not set
|
||||
|
||||
#
|
||||
# Security options
|
||||
#
|
||||
# CONFIG_KEYS is not set
|
||||
# CONFIG_SECURITY is not set
|
||||
# CONFIG_CRYPTO is not set
|
||||
|
||||
#
|
||||
# Library routines
|
||||
#
|
||||
CONFIG_BITREVERSE=y
|
||||
CONFIG_CRC_CCITT=y
|
||||
# CONFIG_CRC16 is not set
|
||||
# CONFIG_CRC_ITU_T is not set
|
||||
CONFIG_CRC32=y
|
||||
# CONFIG_CRC7 is not set
|
||||
# CONFIG_LIBCRC32C is not set
|
||||
CONFIG_ZLIB_INFLATE=y
|
||||
CONFIG_ZLIB_DEFLATE=y
|
||||
CONFIG_PLIST=y
|
||||
CONFIG_HAS_IOMEM=y
|
||||
CONFIG_HAS_IOPORT=y
|
||||
CONFIG_HAS_DMA=y
|
|
@ -19,6 +19,7 @@ obj-$(CONFIG_ISA_DMA) += dma-isa.o
|
|||
obj-$(CONFIG_PCI) += bios32.o isa.o
|
||||
obj-$(CONFIG_SMP) += smp.o
|
||||
obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o
|
||||
obj-$(CONFIG_KPROBES) += kprobes.o kprobes-decode.o
|
||||
obj-$(CONFIG_OABI_COMPAT) += sys_oabi-compat.o
|
||||
|
||||
obj-$(CONFIG_CRUNCH) += crunch.o crunch-bits.o
|
||||
|
|
|
@ -216,7 +216,7 @@ void __init isa_init_dma(dma_t *dma)
|
|||
|
||||
request_dma(DMA_ISA_CASCADE, "cascade");
|
||||
|
||||
for (i = 0; i < sizeof(dma_resources) / sizeof(dma_resources[0]); i++)
|
||||
for (i = 0; i < ARRAY_SIZE(dma_resources); i++)
|
||||
request_resource(&ioport_resource, dma_resources + i);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,8 +11,8 @@
|
|||
*
|
||||
* Low-level vector interface routines
|
||||
*
|
||||
* Note: there is a StrongARM bug in the STMIA rn, {regs}^ instruction that causes
|
||||
* it to save wrong values... Be aware!
|
||||
* Note: there is a StrongARM bug in the STMIA rn, {regs}^ instruction
|
||||
* that causes it to save wrong values... Be aware!
|
||||
*/
|
||||
|
||||
#include <asm/memory.h>
|
||||
|
@ -58,6 +58,12 @@
|
|||
|
||||
.endm
|
||||
|
||||
#ifdef CONFIG_KPROBES
|
||||
.section .kprobes.text,"ax",%progbits
|
||||
#else
|
||||
.text
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Invalid mode handlers
|
||||
*/
|
||||
|
@ -112,8 +118,8 @@ common_invalid:
|
|||
#define SPFIX(code...)
|
||||
#endif
|
||||
|
||||
.macro svc_entry
|
||||
sub sp, sp, #S_FRAME_SIZE
|
||||
.macro svc_entry, stack_hole=0
|
||||
sub sp, sp, #(S_FRAME_SIZE + \stack_hole)
|
||||
SPFIX( tst sp, #4 )
|
||||
SPFIX( bicne sp, sp, #4 )
|
||||
stmib sp, {r1 - r12}
|
||||
|
@ -121,7 +127,7 @@ common_invalid:
|
|||
ldmia r0, {r1 - r3}
|
||||
add r5, sp, #S_SP @ here for interlock avoidance
|
||||
mov r4, #-1 @ "" "" "" ""
|
||||
add r0, sp, #S_FRAME_SIZE @ "" "" "" ""
|
||||
add r0, sp, #(S_FRAME_SIZE + \stack_hole)
|
||||
SPFIX( addne r0, r0, #4 )
|
||||
str r1, [sp] @ save the "real" r0 copied
|
||||
@ from the exception stack
|
||||
|
@ -242,7 +248,14 @@ svc_preempt:
|
|||
|
||||
.align 5
|
||||
__und_svc:
|
||||
#ifdef CONFIG_KPROBES
|
||||
@ If a kprobe is about to simulate a "stmdb sp..." instruction,
|
||||
@ it obviously needs free stack space which then will belong to
|
||||
@ the saved context.
|
||||
svc_entry 64
|
||||
#else
|
||||
svc_entry
|
||||
#endif
|
||||
|
||||
@
|
||||
@ call emulation code, which returns using r9 if it has emulated
|
||||
|
@ -480,6 +493,13 @@ __und_usr:
|
|||
* co-processor instructions. However, we have to watch out
|
||||
* for the ARM6/ARM7 SWI bug.
|
||||
*
|
||||
* NEON is a special case that has to be handled here. Not all
|
||||
* NEON instructions are co-processor instructions, so we have
|
||||
* to make a special case of checking for them. Plus, there's
|
||||
* five groups of them, so we have a table of mask/opcode pairs
|
||||
* to check against, and if any match then we branch off into the
|
||||
* NEON handler code.
|
||||
*
|
||||
* Emulators may wish to make use of the following registers:
|
||||
* r0 = instruction opcode.
|
||||
* r2 = PC+4
|
||||
|
@ -488,6 +508,23 @@ __und_usr:
|
|||
* lr = unrecognised instruction return address
|
||||
*/
|
||||
call_fpe:
|
||||
#ifdef CONFIG_NEON
|
||||
adr r6, .LCneon_opcodes
|
||||
2:
|
||||
ldr r7, [r6], #4 @ mask value
|
||||
cmp r7, #0 @ end mask?
|
||||
beq 1f
|
||||
and r8, r0, r7
|
||||
ldr r7, [r6], #4 @ opcode bits matching in mask
|
||||
cmp r8, r7 @ NEON instruction?
|
||||
bne 2b
|
||||
get_thread_info r10
|
||||
mov r7, #1
|
||||
strb r7, [r10, #TI_USED_CP + 10] @ mark CP#10 as used
|
||||
strb r7, [r10, #TI_USED_CP + 11] @ mark CP#11 as used
|
||||
b do_vfp @ let VFP handler handle this
|
||||
1:
|
||||
#endif
|
||||
tst r0, #0x08000000 @ only CDP/CPRT/LDC/STC have bit 27
|
||||
#if defined(CONFIG_CPU_ARM610) || defined(CONFIG_CPU_ARM710)
|
||||
and r8, r0, #0x0f000000 @ mask out op-code bits
|
||||
|
@ -537,6 +574,20 @@ call_fpe:
|
|||
mov pc, lr @ CP#14 (Debug)
|
||||
mov pc, lr @ CP#15 (Control)
|
||||
|
||||
#ifdef CONFIG_NEON
|
||||
.align 6
|
||||
|
||||
.LCneon_opcodes:
|
||||
.word 0xfe000000 @ mask
|
||||
.word 0xf2000000 @ opcode
|
||||
|
||||
.word 0xff100000 @ mask
|
||||
.word 0xf4000000 @ opcode
|
||||
|
||||
.word 0x00000000 @ mask
|
||||
.word 0x00000000 @ opcode
|
||||
#endif
|
||||
|
||||
do_fpe:
|
||||
enable_irq
|
||||
ldr r4, .LCfp
|
||||
|
@ -555,7 +606,7 @@ do_fpe:
|
|||
.data
|
||||
ENTRY(fp_enter)
|
||||
.word no_fp
|
||||
.text
|
||||
.previous
|
||||
|
||||
no_fp: mov pc, lr
|
||||
|
||||
|
|
|
@ -72,7 +72,7 @@ no_work_pending:
|
|||
ldr r1, [sp, #S_PSR] @ get calling cpsr
|
||||
ldr lr, [sp, #S_PC]! @ get pc
|
||||
msr spsr_cxsf, r1 @ save in spsr_svc
|
||||
ldmdb sp, {r0 - lr}^ @ get calling r1 - lr
|
||||
ldmdb sp, {r0 - lr}^ @ get calling r0 - lr
|
||||
mov r0, r0
|
||||
add sp, sp, #S_FRAME_SIZE - S_PC
|
||||
movs pc, lr @ return & move spsr_svc into cpsr
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -0,0 +1,447 @@
|
|||
/*
|
||||
* arch/arm/kernel/kprobes.c
|
||||
*
|
||||
* Kprobes on ARM
|
||||
*
|
||||
* Abhishek Sagar <sagar.abhishek@gmail.com>
|
||||
* Copyright (C) 2006, 2007 Motorola Inc.
|
||||
*
|
||||
* Nicolas Pitre <nico@marvell.com>
|
||||
* Copyright (C) 2007 Marvell Ltd.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/kprobes.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/stringify.h>
|
||||
#include <asm/traps.h>
|
||||
#include <asm/cacheflush.h>
|
||||
|
||||
#define MIN_STACK_SIZE(addr) \
|
||||
min((unsigned long)MAX_STACK_SIZE, \
|
||||
(unsigned long)current_thread_info() + THREAD_START_SP - (addr))
|
||||
|
||||
#define flush_insns(addr, cnt) \
|
||||
flush_icache_range((unsigned long)(addr), \
|
||||
(unsigned long)(addr) + \
|
||||
sizeof(kprobe_opcode_t) * (cnt))
|
||||
|
||||
/* Used as a marker in ARM_pc to note when we're in a jprobe. */
|
||||
#define JPROBE_MAGIC_ADDR 0xffffffff
|
||||
|
||||
DEFINE_PER_CPU(struct kprobe *, current_kprobe) = NULL;
|
||||
DEFINE_PER_CPU(struct kprobe_ctlblk, kprobe_ctlblk);
|
||||
|
||||
|
||||
int __kprobes arch_prepare_kprobe(struct kprobe *p)
|
||||
{
|
||||
kprobe_opcode_t insn;
|
||||
kprobe_opcode_t tmp_insn[MAX_INSN_SIZE];
|
||||
unsigned long addr = (unsigned long)p->addr;
|
||||
int is;
|
||||
|
||||
if (addr & 0x3 || in_exception_text(addr))
|
||||
return -EINVAL;
|
||||
|
||||
insn = *p->addr;
|
||||
p->opcode = insn;
|
||||
p->ainsn.insn = tmp_insn;
|
||||
|
||||
switch (arm_kprobe_decode_insn(insn, &p->ainsn)) {
|
||||
case INSN_REJECTED: /* not supported */
|
||||
return -EINVAL;
|
||||
|
||||
case INSN_GOOD: /* instruction uses slot */
|
||||
p->ainsn.insn = get_insn_slot();
|
||||
if (!p->ainsn.insn)
|
||||
return -ENOMEM;
|
||||
for (is = 0; is < MAX_INSN_SIZE; ++is)
|
||||
p->ainsn.insn[is] = tmp_insn[is];
|
||||
flush_insns(&p->ainsn.insn, MAX_INSN_SIZE);
|
||||
break;
|
||||
|
||||
case INSN_GOOD_NO_SLOT: /* instruction doesn't need insn slot */
|
||||
p->ainsn.insn = NULL;
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __kprobes arch_arm_kprobe(struct kprobe *p)
|
||||
{
|
||||
*p->addr = KPROBE_BREAKPOINT_INSTRUCTION;
|
||||
flush_insns(p->addr, 1);
|
||||
}
|
||||
|
||||
void __kprobes arch_disarm_kprobe(struct kprobe *p)
|
||||
{
|
||||
*p->addr = p->opcode;
|
||||
flush_insns(p->addr, 1);
|
||||
}
|
||||
|
||||
void __kprobes arch_remove_kprobe(struct kprobe *p)
|
||||
{
|
||||
if (p->ainsn.insn) {
|
||||
mutex_lock(&kprobe_mutex);
|
||||
free_insn_slot(p->ainsn.insn, 0);
|
||||
mutex_unlock(&kprobe_mutex);
|
||||
p->ainsn.insn = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void __kprobes save_previous_kprobe(struct kprobe_ctlblk *kcb)
|
||||
{
|
||||
kcb->prev_kprobe.kp = kprobe_running();
|
||||
kcb->prev_kprobe.status = kcb->kprobe_status;
|
||||
}
|
||||
|
||||
static void __kprobes restore_previous_kprobe(struct kprobe_ctlblk *kcb)
|
||||
{
|
||||
__get_cpu_var(current_kprobe) = kcb->prev_kprobe.kp;
|
||||
kcb->kprobe_status = kcb->prev_kprobe.status;
|
||||
}
|
||||
|
||||
static void __kprobes set_current_kprobe(struct kprobe *p)
|
||||
{
|
||||
__get_cpu_var(current_kprobe) = p;
|
||||
}
|
||||
|
||||
static void __kprobes singlestep(struct kprobe *p, struct pt_regs *regs,
|
||||
struct kprobe_ctlblk *kcb)
|
||||
{
|
||||
regs->ARM_pc += 4;
|
||||
p->ainsn.insn_handler(p, regs);
|
||||
}
|
||||
|
||||
/*
|
||||
* Called with IRQs disabled. IRQs must remain disabled from that point
|
||||
* all the way until processing this kprobe is complete. The current
|
||||
* kprobes implementation cannot process more than one nested level of
|
||||
* kprobe, and that level is reserved for user kprobe handlers, so we can't
|
||||
* risk encountering a new kprobe in an interrupt handler.
|
||||
*/
|
||||
void __kprobes kprobe_handler(struct pt_regs *regs)
|
||||
{
|
||||
struct kprobe *p, *cur;
|
||||
struct kprobe_ctlblk *kcb;
|
||||
kprobe_opcode_t *addr = (kprobe_opcode_t *)regs->ARM_pc;
|
||||
|
||||
kcb = get_kprobe_ctlblk();
|
||||
cur = kprobe_running();
|
||||
p = get_kprobe(addr);
|
||||
|
||||
if (p) {
|
||||
if (cur) {
|
||||
/* Kprobe is pending, so we're recursing. */
|
||||
switch (kcb->kprobe_status) {
|
||||
case KPROBE_HIT_ACTIVE:
|
||||
case KPROBE_HIT_SSDONE:
|
||||
/* A pre- or post-handler probe got us here. */
|
||||
kprobes_inc_nmissed_count(p);
|
||||
save_previous_kprobe(kcb);
|
||||
set_current_kprobe(p);
|
||||
kcb->kprobe_status = KPROBE_REENTER;
|
||||
singlestep(p, regs, kcb);
|
||||
restore_previous_kprobe(kcb);
|
||||
break;
|
||||
default:
|
||||
/* impossible cases */
|
||||
BUG();
|
||||
}
|
||||
} else {
|
||||
set_current_kprobe(p);
|
||||
kcb->kprobe_status = KPROBE_HIT_ACTIVE;
|
||||
|
||||
/*
|
||||
* If we have no pre-handler or it returned 0, we
|
||||
* continue with normal processing. If we have a
|
||||
* pre-handler and it returned non-zero, it prepped
|
||||
* for calling the break_handler below on re-entry,
|
||||
* so get out doing nothing more here.
|
||||
*/
|
||||
if (!p->pre_handler || !p->pre_handler(p, regs)) {
|
||||
kcb->kprobe_status = KPROBE_HIT_SS;
|
||||
singlestep(p, regs, kcb);
|
||||
if (p->post_handler) {
|
||||
kcb->kprobe_status = KPROBE_HIT_SSDONE;
|
||||
p->post_handler(p, regs, 0);
|
||||
}
|
||||
reset_current_kprobe();
|
||||
}
|
||||
}
|
||||
} else if (cur) {
|
||||
/* We probably hit a jprobe. Call its break handler. */
|
||||
if (cur->break_handler && cur->break_handler(cur, regs)) {
|
||||
kcb->kprobe_status = KPROBE_HIT_SS;
|
||||
singlestep(cur, regs, kcb);
|
||||
if (cur->post_handler) {
|
||||
kcb->kprobe_status = KPROBE_HIT_SSDONE;
|
||||
cur->post_handler(cur, regs, 0);
|
||||
}
|
||||
}
|
||||
reset_current_kprobe();
|
||||
} else {
|
||||
/*
|
||||
* The probe was removed and a race is in progress.
|
||||
* There is nothing we can do about it. Let's restart
|
||||
* the instruction. By the time we can restart, the
|
||||
* real instruction will be there.
|
||||
*/
|
||||
}
|
||||
}
|
||||
|
||||
int kprobe_trap_handler(struct pt_regs *regs, unsigned int instr)
|
||||
{
|
||||
kprobe_handler(regs);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int __kprobes kprobe_fault_handler(struct pt_regs *regs, unsigned int fsr)
|
||||
{
|
||||
struct kprobe *cur = kprobe_running();
|
||||
struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
|
||||
|
||||
switch (kcb->kprobe_status) {
|
||||
case KPROBE_HIT_SS:
|
||||
case KPROBE_REENTER:
|
||||
/*
|
||||
* We are here because the instruction being single
|
||||
* stepped caused a page fault. We reset the current
|
||||
* kprobe and the PC to point back to the probe address
|
||||
* and allow the page fault handler to continue as a
|
||||
* normal page fault.
|
||||
*/
|
||||
regs->ARM_pc = (long)cur->addr;
|
||||
if (kcb->kprobe_status == KPROBE_REENTER) {
|
||||
restore_previous_kprobe(kcb);
|
||||
} else {
|
||||
reset_current_kprobe();
|
||||
}
|
||||
break;
|
||||
|
||||
case KPROBE_HIT_ACTIVE:
|
||||
case KPROBE_HIT_SSDONE:
|
||||
/*
|
||||
* We increment the nmissed count for accounting,
|
||||
* we can also use npre/npostfault count for accounting
|
||||
* these specific fault cases.
|
||||
*/
|
||||
kprobes_inc_nmissed_count(cur);
|
||||
|
||||
/*
|
||||
* We come here because instructions in the pre/post
|
||||
* handler caused the page_fault, this could happen
|
||||
* if handler tries to access user space by
|
||||
* copy_from_user(), get_user() etc. Let the
|
||||
* user-specified handler try to fix it.
|
||||
*/
|
||||
if (cur->fault_handler && cur->fault_handler(cur, regs, fsr))
|
||||
return 1;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int __kprobes kprobe_exceptions_notify(struct notifier_block *self,
|
||||
unsigned long val, void *data)
|
||||
{
|
||||
/*
|
||||
* notify_die() is currently never called on ARM,
|
||||
* so this callback is currently empty.
|
||||
*/
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
/*
|
||||
* When a retprobed function returns, trampoline_handler() is called,
|
||||
* calling the kretprobe's handler. We construct a struct pt_regs to
|
||||
* give a view of registers r0-r11 to the user return-handler. This is
|
||||
* not a complete pt_regs structure, but that should be plenty sufficient
|
||||
* for kretprobe handlers which should normally be interested in r0 only
|
||||
* anyway.
|
||||
*/
|
||||
static void __attribute__((naked)) __kprobes kretprobe_trampoline(void)
|
||||
{
|
||||
__asm__ __volatile__ (
|
||||
"stmdb sp!, {r0 - r11} \n\t"
|
||||
"mov r0, sp \n\t"
|
||||
"bl trampoline_handler \n\t"
|
||||
"mov lr, r0 \n\t"
|
||||
"ldmia sp!, {r0 - r11} \n\t"
|
||||
"mov pc, lr \n\t"
|
||||
: : : "memory");
|
||||
}
|
||||
|
||||
/* Called from kretprobe_trampoline */
|
||||
static __used __kprobes void *trampoline_handler(struct pt_regs *regs)
|
||||
{
|
||||
struct kretprobe_instance *ri = NULL;
|
||||
struct hlist_head *head, empty_rp;
|
||||
struct hlist_node *node, *tmp;
|
||||
unsigned long flags, orig_ret_address = 0;
|
||||
unsigned long trampoline_address = (unsigned long)&kretprobe_trampoline;
|
||||
|
||||
INIT_HLIST_HEAD(&empty_rp);
|
||||
spin_lock_irqsave(&kretprobe_lock, flags);
|
||||
head = kretprobe_inst_table_head(current);
|
||||
|
||||
/*
|
||||
* It is possible to have multiple instances associated with a given
|
||||
* task either because multiple functions in the call path have
|
||||
* a return probe installed on them, and/or more than one return
|
||||
* probe was registered for a target function.
|
||||
*
|
||||
* We can handle this because:
|
||||
* - instances are always inserted at the head of the list
|
||||
* - when multiple return probes are registered for the same
|
||||
* function, the first instance's ret_addr will point to the
|
||||
* real return address, and all the rest will point to
|
||||
* kretprobe_trampoline
|
||||
*/
|
||||
hlist_for_each_entry_safe(ri, node, tmp, head, hlist) {
|
||||
if (ri->task != current)
|
||||
/* another task is sharing our hash bucket */
|
||||
continue;
|
||||
|
||||
if (ri->rp && ri->rp->handler) {
|
||||
__get_cpu_var(current_kprobe) = &ri->rp->kp;
|
||||
get_kprobe_ctlblk()->kprobe_status = KPROBE_HIT_ACTIVE;
|
||||
ri->rp->handler(ri, regs);
|
||||
__get_cpu_var(current_kprobe) = NULL;
|
||||
}
|
||||
|
||||
orig_ret_address = (unsigned long)ri->ret_addr;
|
||||
recycle_rp_inst(ri, &empty_rp);
|
||||
|
||||
if (orig_ret_address != trampoline_address)
|
||||
/*
|
||||
* This is the real return address. Any other
|
||||
* instances associated with this task are for
|
||||
* other calls deeper on the call stack
|
||||
*/
|
||||
break;
|
||||
}
|
||||
|
||||
kretprobe_assert(ri, orig_ret_address, trampoline_address);
|
||||
spin_unlock_irqrestore(&kretprobe_lock, flags);
|
||||
|
||||
hlist_for_each_entry_safe(ri, node, tmp, &empty_rp, hlist) {
|
||||
hlist_del(&ri->hlist);
|
||||
kfree(ri);
|
||||
}
|
||||
|
||||
return (void *)orig_ret_address;
|
||||
}
|
||||
|
||||
/* Called with kretprobe_lock held. */
|
||||
void __kprobes arch_prepare_kretprobe(struct kretprobe_instance *ri,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
ri->ret_addr = (kprobe_opcode_t *)regs->ARM_lr;
|
||||
|
||||
/* Replace the return addr with trampoline addr. */
|
||||
regs->ARM_lr = (unsigned long)&kretprobe_trampoline;
|
||||
}
|
||||
|
||||
int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs)
|
||||
{
|
||||
struct jprobe *jp = container_of(p, struct jprobe, kp);
|
||||
struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
|
||||
long sp_addr = regs->ARM_sp;
|
||||
|
||||
kcb->jprobe_saved_regs = *regs;
|
||||
memcpy(kcb->jprobes_stack, (void *)sp_addr, MIN_STACK_SIZE(sp_addr));
|
||||
regs->ARM_pc = (long)jp->entry;
|
||||
regs->ARM_cpsr |= PSR_I_BIT;
|
||||
preempt_disable();
|
||||
return 1;
|
||||
}
|
||||
|
||||
void __kprobes jprobe_return(void)
|
||||
{
|
||||
struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
|
||||
|
||||
__asm__ __volatile__ (
|
||||
/*
|
||||
* Setup an empty pt_regs. Fill SP and PC fields as
|
||||
* they're needed by longjmp_break_handler.
|
||||
*/
|
||||
"sub sp, %0, %1 \n\t"
|
||||
"ldr r0, ="__stringify(JPROBE_MAGIC_ADDR)"\n\t"
|
||||
"str %0, [sp, %2] \n\t"
|
||||
"str r0, [sp, %3] \n\t"
|
||||
"mov r0, sp \n\t"
|
||||
"bl kprobe_handler \n\t"
|
||||
|
||||
/*
|
||||
* Return to the context saved by setjmp_pre_handler
|
||||
* and restored by longjmp_break_handler.
|
||||
*/
|
||||
"ldr r0, [sp, %4] \n\t"
|
||||
"msr cpsr_cxsf, r0 \n\t"
|
||||
"ldmia sp, {r0 - pc} \n\t"
|
||||
:
|
||||
: "r" (kcb->jprobe_saved_regs.ARM_sp),
|
||||
"I" (sizeof(struct pt_regs)),
|
||||
"J" (offsetof(struct pt_regs, ARM_sp)),
|
||||
"J" (offsetof(struct pt_regs, ARM_pc)),
|
||||
"J" (offsetof(struct pt_regs, ARM_cpsr))
|
||||
: "memory", "cc");
|
||||
}
|
||||
|
||||
int __kprobes longjmp_break_handler(struct kprobe *p, struct pt_regs *regs)
|
||||
{
|
||||
struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
|
||||
long stack_addr = kcb->jprobe_saved_regs.ARM_sp;
|
||||
long orig_sp = regs->ARM_sp;
|
||||
struct jprobe *jp = container_of(p, struct jprobe, kp);
|
||||
|
||||
if (regs->ARM_pc == JPROBE_MAGIC_ADDR) {
|
||||
if (orig_sp != stack_addr) {
|
||||
struct pt_regs *saved_regs =
|
||||
(struct pt_regs *)kcb->jprobe_saved_regs.ARM_sp;
|
||||
printk("current sp %lx does not match saved sp %lx\n",
|
||||
orig_sp, stack_addr);
|
||||
printk("Saved registers for jprobe %p\n", jp);
|
||||
show_regs(saved_regs);
|
||||
printk("Current registers\n");
|
||||
show_regs(regs);
|
||||
BUG();
|
||||
}
|
||||
*regs = kcb->jprobe_saved_regs;
|
||||
memcpy((void *)stack_addr, kcb->jprobes_stack,
|
||||
MIN_STACK_SIZE(stack_addr));
|
||||
preempt_enable_no_resched();
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct undef_hook kprobes_break_hook = {
|
||||
.instr_mask = 0xffffffff,
|
||||
.instr_val = KPROBE_BREAKPOINT_INSTRUCTION,
|
||||
.cpsr_mask = MODE_MASK,
|
||||
.cpsr_val = SVC_MODE,
|
||||
.fn = kprobe_trap_handler,
|
||||
};
|
||||
|
||||
int __init arch_init_kprobes()
|
||||
{
|
||||
arm_kprobe_decode_init();
|
||||
register_undef_hook(&kprobes_break_hook);
|
||||
return 0;
|
||||
}
|
|
@ -19,6 +19,7 @@
|
|||
#include <linux/kallsyms.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/kprobes.h>
|
||||
|
||||
#include <asm/atomic.h>
|
||||
#include <asm/cacheflush.h>
|
||||
|
@ -46,15 +47,6 @@ __setup("user_debug=", user_debug_setup);
|
|||
|
||||
static void dump_mem(const char *str, unsigned long bottom, unsigned long top);
|
||||
|
||||
static inline int in_exception_text(unsigned long ptr)
|
||||
{
|
||||
extern char __exception_text_start[];
|
||||
extern char __exception_text_end[];
|
||||
|
||||
return ptr >= (unsigned long)&__exception_text_start &&
|
||||
ptr < (unsigned long)&__exception_text_end;
|
||||
}
|
||||
|
||||
void dump_backtrace_entry(unsigned long where, unsigned long from, unsigned long frame)
|
||||
{
|
||||
#ifdef CONFIG_KALLSYMS
|
||||
|
@ -322,6 +314,17 @@ asmlinkage void __exception do_undefinstr(struct pt_regs *regs)
|
|||
get_user(instr, (u32 __user *)pc);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_KPROBES
|
||||
/*
|
||||
* It is possible to have recursive kprobes, so we can't call
|
||||
* the kprobe trap handler with the undef_lock held.
|
||||
*/
|
||||
if (instr == KPROBE_BREAKPOINT_INSTRUCTION && !user_mode(regs)) {
|
||||
kprobe_trap_handler(regs, instr);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
spin_lock_irqsave(&undef_lock, flags);
|
||||
list_for_each_entry(hook, &undef_hook, node) {
|
||||
if ((instr & hook->instr_mask) == hook->instr_val &&
|
||||
|
|
|
@ -94,6 +94,7 @@ SECTIONS
|
|||
TEXT_TEXT
|
||||
SCHED_TEXT
|
||||
LOCK_TEXT
|
||||
KPROBES_TEXT
|
||||
#ifdef CONFIG_MMU
|
||||
*(.fixup)
|
||||
#endif
|
||||
|
|
|
@ -22,6 +22,9 @@ config ARCH_AT91SAM9263
|
|||
config ARCH_AT91SAM9RL
|
||||
bool "AT91SAM9RL"
|
||||
|
||||
config ARCH_AT91CAP9
|
||||
bool "AT91CAP9"
|
||||
|
||||
config ARCH_AT91X40
|
||||
bool "AT91x40"
|
||||
|
||||
|
@ -178,6 +181,21 @@ endif
|
|||
|
||||
# ----------------------------------------------------------
|
||||
|
||||
if ARCH_AT91CAP9
|
||||
|
||||
comment "AT91CAP9 Board Type"
|
||||
|
||||
config MACH_AT91CAP9ADK
|
||||
bool "Atmel AT91CAP9A-DK Evaluation Kit"
|
||||
depends on ARCH_AT91CAP9
|
||||
help
|
||||
Select this if you are using Atmel's AT91CAP9A-DK Evaluation Kit.
|
||||
<http://www.atmel.com/dyn/products/tools_card.asp?tool_id=4138>
|
||||
|
||||
endif
|
||||
|
||||
# ----------------------------------------------------------
|
||||
|
||||
if ARCH_AT91X40
|
||||
|
||||
comment "AT91X40 Board Type"
|
||||
|
@ -198,13 +216,13 @@ comment "AT91 Board Options"
|
|||
|
||||
config MTD_AT91_DATAFLASH_CARD
|
||||
bool "Enable DataFlash Card support"
|
||||
depends on (ARCH_AT91RM9200DK || MACH_AT91RM9200EK || MACH_AT91SAM9260EK || MACH_AT91SAM9261EK || MACH_AT91SAM9263EK)
|
||||
depends on (ARCH_AT91RM9200DK || MACH_AT91RM9200EK || MACH_AT91SAM9260EK || MACH_AT91SAM9261EK || MACH_AT91SAM9263EK || MACH_AT91CAP9ADK)
|
||||
help
|
||||
Enable support for the DataFlash card.
|
||||
|
||||
config MTD_NAND_AT91_BUSWIDTH_16
|
||||
bool "Enable 16-bit data bus interface to NAND flash"
|
||||
depends on (MACH_AT91SAM9260EK || MACH_AT91SAM9261EK || MACH_AT91SAM9263EK)
|
||||
depends on (MACH_AT91SAM9260EK || MACH_AT91SAM9261EK || MACH_AT91SAM9263EK || MACH_AT91CAP9ADK)
|
||||
help
|
||||
On AT91SAM926x boards both types of NAND flash can be present
|
||||
(8 and 16 bit data bus width).
|
||||
|
@ -219,6 +237,22 @@ config AT91_PROGRAMMABLE_CLOCKS
|
|||
Select this if you need to program one or more of the PCK0..PCK3
|
||||
programmable clock outputs.
|
||||
|
||||
config AT91_TIMER_HZ
|
||||
int "Kernel HZ (jiffies per second)"
|
||||
range 32 1024
|
||||
depends on ARCH_AT91
|
||||
default "128" if ARCH_AT91RM9200
|
||||
default "100"
|
||||
help
|
||||
On AT91rm9200 chips where you're using a system clock derived
|
||||
from the 32768 Hz hardware clock, this tick rate should divide
|
||||
it exactly: use a power-of-two value, such as 128 or 256, to
|
||||
reduce timing errors caused by rounding.
|
||||
|
||||
On AT91sam926x chips, or otherwise when using a higher precision
|
||||
system clock (of at least several MHz), rounding is less of a
|
||||
problem so it can be safer to use a decimal values like 100.
|
||||
|
||||
endmenu
|
||||
|
||||
endif
|
||||
|
|
|
@ -8,7 +8,6 @@ obj-n :=
|
|||
obj- :=
|
||||
|
||||
obj-$(CONFIG_AT91_PMC_UNIT) += clock.o
|
||||
obj-$(CONFIG_PM) += pm.o
|
||||
|
||||
# CPU-specific support
|
||||
obj-$(CONFIG_ARCH_AT91RM9200) += at91rm9200.o at91rm9200_time.o at91rm9200_devices.o
|
||||
|
@ -16,6 +15,7 @@ obj-$(CONFIG_ARCH_AT91SAM9260) += at91sam9260.o at91sam926x_time.o at91sam9260_d
|
|||
obj-$(CONFIG_ARCH_AT91SAM9261) += at91sam9261.o at91sam926x_time.o at91sam9261_devices.o
|
||||
obj-$(CONFIG_ARCH_AT91SAM9263) += at91sam9263.o at91sam926x_time.o at91sam9263_devices.o
|
||||
obj-$(CONFIG_ARCH_AT91SAM9RL) += at91sam9rl.o at91sam926x_time.o at91sam9rl_devices.o
|
||||
obj-$(CONFIG_ARCH_AT91CAP9) += at91cap9.o at91sam926x_time.o at91cap9_devices.o
|
||||
obj-$(CONFIG_ARCH_AT91X40) += at91x40.o at91x40_time.o
|
||||
|
||||
# AT91RM9200 board-specific support
|
||||
|
@ -29,7 +29,6 @@ obj-$(CONFIG_MACH_KB9200) += board-kb9202.o
|
|||
obj-$(CONFIG_MACH_ATEB9200) += board-eb9200.o
|
||||
obj-$(CONFIG_MACH_KAFA) += board-kafa.o
|
||||
obj-$(CONFIG_MACH_PICOTUX2XX) += board-picotux200.o
|
||||
obj-$(CONFIG_MACH_AT91EB01) += board-eb01.o
|
||||
|
||||
# AT91SAM9260 board-specific support
|
||||
obj-$(CONFIG_MACH_AT91SAM9260EK) += board-sam9260ek.o
|
||||
|
@ -43,19 +42,17 @@ obj-$(CONFIG_MACH_AT91SAM9263EK) += board-sam9263ek.o
|
|||
# AT91SAM9RL board-specific support
|
||||
obj-$(CONFIG_MACH_AT91SAM9RLEK) += board-sam9rlek.o
|
||||
|
||||
# LEDs support
|
||||
led-$(CONFIG_ARCH_AT91RM9200DK) += leds.o
|
||||
led-$(CONFIG_MACH_AT91RM9200EK) += leds.o
|
||||
led-$(CONFIG_MACH_AT91SAM9261EK)+= leds.o
|
||||
led-$(CONFIG_MACH_CSB337) += leds.o
|
||||
led-$(CONFIG_MACH_CSB637) += leds.o
|
||||
led-$(CONFIG_MACH_KB9200) += leds.o
|
||||
led-$(CONFIG_MACH_KAFA) += leds.o
|
||||
obj-$(CONFIG_LEDS) += $(led-y)
|
||||
# AT91CAP9 board-specific support
|
||||
obj-$(CONFIG_MACH_AT91CAP9ADK) += board-cap9adk.o
|
||||
|
||||
# VGA support
|
||||
#obj-$(CONFIG_FB_S1D13XXX) += ics1523.o
|
||||
# AT91X40 board-specific support
|
||||
obj-$(CONFIG_MACH_AT91EB01) += board-eb01.o
|
||||
|
||||
# Drivers
|
||||
obj-y += leds.o
|
||||
|
||||
# Power Management
|
||||
obj-$(CONFIG_PM) += pm.o
|
||||
|
||||
ifeq ($(CONFIG_PM_DEBUG),y)
|
||||
CFLAGS_pm.o += -DDEBUG
|
||||
|
|
|
@ -3,7 +3,12 @@
|
|||
# PARAMS_PHYS must be within 4MB of ZRELADDR
|
||||
# INITRD_PHYS must be in RAM
|
||||
|
||||
ifeq ($(CONFIG_ARCH_AT91CAP9),y)
|
||||
zreladdr-y := 0x70008000
|
||||
params_phys-y := 0x70000100
|
||||
initrd_phys-y := 0x70410000
|
||||
else
|
||||
zreladdr-y := 0x20008000
|
||||
params_phys-y := 0x20000100
|
||||
initrd_phys-y := 0x20410000
|
||||
|
||||
endif
|
||||
|
|
|
@ -0,0 +1,365 @@
|
|||
/*
|
||||
* arch/arm/mach-at91/at91cap9.c
|
||||
*
|
||||
* Copyright (C) 2007 Stelian Pop <stelian.pop@leadtechdesign.com>
|
||||
* Copyright (C) 2007 Lead Tech Design <www.leadtechdesign.com>
|
||||
* Copyright (C) 2007 Atmel Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/arch/at91cap9.h>
|
||||
#include <asm/arch/at91_pmc.h>
|
||||
#include <asm/arch/at91_rstc.h>
|
||||
|
||||
#include "generic.h"
|
||||
#include "clock.h"
|
||||
|
||||
static struct map_desc at91cap9_io_desc[] __initdata = {
|
||||
{
|
||||
.virtual = AT91_VA_BASE_SYS,
|
||||
.pfn = __phys_to_pfn(AT91_BASE_SYS),
|
||||
.length = SZ_16K,
|
||||
.type = MT_DEVICE,
|
||||
}, {
|
||||
.virtual = AT91_IO_VIRT_BASE - AT91CAP9_SRAM_SIZE,
|
||||
.pfn = __phys_to_pfn(AT91CAP9_SRAM_BASE),
|
||||
.length = AT91CAP9_SRAM_SIZE,
|
||||
.type = MT_DEVICE,
|
||||
},
|
||||
};
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* Clocks
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* The peripheral clocks.
|
||||
*/
|
||||
static struct clk pioABCD_clk = {
|
||||
.name = "pioABCD_clk",
|
||||
.pmc_mask = 1 << AT91CAP9_ID_PIOABCD,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk mpb0_clk = {
|
||||
.name = "mpb0_clk",
|
||||
.pmc_mask = 1 << AT91CAP9_ID_MPB0,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk mpb1_clk = {
|
||||
.name = "mpb1_clk",
|
||||
.pmc_mask = 1 << AT91CAP9_ID_MPB1,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk mpb2_clk = {
|
||||
.name = "mpb2_clk",
|
||||
.pmc_mask = 1 << AT91CAP9_ID_MPB2,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk mpb3_clk = {
|
||||
.name = "mpb3_clk",
|
||||
.pmc_mask = 1 << AT91CAP9_ID_MPB3,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk mpb4_clk = {
|
||||
.name = "mpb4_clk",
|
||||
.pmc_mask = 1 << AT91CAP9_ID_MPB4,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk usart0_clk = {
|
||||
.name = "usart0_clk",
|
||||
.pmc_mask = 1 << AT91CAP9_ID_US0,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk usart1_clk = {
|
||||
.name = "usart1_clk",
|
||||
.pmc_mask = 1 << AT91CAP9_ID_US1,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk usart2_clk = {
|
||||
.name = "usart2_clk",
|
||||
.pmc_mask = 1 << AT91CAP9_ID_US2,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk mmc0_clk = {
|
||||
.name = "mci0_clk",
|
||||
.pmc_mask = 1 << AT91CAP9_ID_MCI0,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk mmc1_clk = {
|
||||
.name = "mci1_clk",
|
||||
.pmc_mask = 1 << AT91CAP9_ID_MCI1,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk can_clk = {
|
||||
.name = "can_clk",
|
||||
.pmc_mask = 1 << AT91CAP9_ID_CAN,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk twi_clk = {
|
||||
.name = "twi_clk",
|
||||
.pmc_mask = 1 << AT91CAP9_ID_TWI,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk spi0_clk = {
|
||||
.name = "spi0_clk",
|
||||
.pmc_mask = 1 << AT91CAP9_ID_SPI0,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk spi1_clk = {
|
||||
.name = "spi1_clk",
|
||||
.pmc_mask = 1 << AT91CAP9_ID_SPI1,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk ssc0_clk = {
|
||||
.name = "ssc0_clk",
|
||||
.pmc_mask = 1 << AT91CAP9_ID_SSC0,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk ssc1_clk = {
|
||||
.name = "ssc1_clk",
|
||||
.pmc_mask = 1 << AT91CAP9_ID_SSC1,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk ac97_clk = {
|
||||
.name = "ac97_clk",
|
||||
.pmc_mask = 1 << AT91CAP9_ID_AC97C,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk tcb_clk = {
|
||||
.name = "tcb_clk",
|
||||
.pmc_mask = 1 << AT91CAP9_ID_TCB,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk pwmc_clk = {
|
||||
.name = "pwmc_clk",
|
||||
.pmc_mask = 1 << AT91CAP9_ID_PWMC,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk macb_clk = {
|
||||
.name = "macb_clk",
|
||||
.pmc_mask = 1 << AT91CAP9_ID_EMAC,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk aestdes_clk = {
|
||||
.name = "aestdes_clk",
|
||||
.pmc_mask = 1 << AT91CAP9_ID_AESTDES,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk adc_clk = {
|
||||
.name = "adc_clk",
|
||||
.pmc_mask = 1 << AT91CAP9_ID_ADC,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk isi_clk = {
|
||||
.name = "isi_clk",
|
||||
.pmc_mask = 1 << AT91CAP9_ID_ISI,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk lcdc_clk = {
|
||||
.name = "lcdc_clk",
|
||||
.pmc_mask = 1 << AT91CAP9_ID_LCDC,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk dma_clk = {
|
||||
.name = "dma_clk",
|
||||
.pmc_mask = 1 << AT91CAP9_ID_DMA,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk udphs_clk = {
|
||||
.name = "udphs_clk",
|
||||
.pmc_mask = 1 << AT91CAP9_ID_UDPHS,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
static struct clk ohci_clk = {
|
||||
.name = "ohci_clk",
|
||||
.pmc_mask = 1 << AT91CAP9_ID_UHP,
|
||||
.type = CLK_TYPE_PERIPHERAL,
|
||||
};
|
||||
|
||||
static struct clk *periph_clocks[] __initdata = {
|
||||
&pioABCD_clk,
|
||||
&mpb0_clk,
|
||||
&mpb1_clk,
|
||||
&mpb2_clk,
|
||||
&mpb3_clk,
|
||||
&mpb4_clk,
|
||||
&usart0_clk,
|
||||
&usart1_clk,
|
||||
&usart2_clk,
|
||||
&mmc0_clk,
|
||||
&mmc1_clk,
|
||||
&can_clk,
|
||||
&twi_clk,
|
||||
&spi0_clk,
|
||||
&spi1_clk,
|
||||
&ssc0_clk,
|
||||
&ssc1_clk,
|
||||
&ac97_clk,
|
||||
&tcb_clk,
|
||||
&pwmc_clk,
|
||||
&macb_clk,
|
||||
&aestdes_clk,
|
||||
&adc_clk,
|
||||
&isi_clk,
|
||||
&lcdc_clk,
|
||||
&dma_clk,
|
||||
&udphs_clk,
|
||||
&ohci_clk,
|
||||
// irq0 .. irq1
|
||||
};
|
||||
|
||||
/*
|
||||
* The four programmable clocks.
|
||||
* You must configure pin multiplexing to bring these signals out.
|
||||
*/
|
||||
static struct clk pck0 = {
|
||||
.name = "pck0",
|
||||
.pmc_mask = AT91_PMC_PCK0,
|
||||
.type = CLK_TYPE_PROGRAMMABLE,
|
||||
.id = 0,
|
||||
};
|
||||
static struct clk pck1 = {
|
||||
.name = "pck1",
|
||||
.pmc_mask = AT91_PMC_PCK1,
|
||||
.type = CLK_TYPE_PROGRAMMABLE,
|
||||
.id = 1,
|
||||
};
|
||||
static struct clk pck2 = {
|
||||
.name = "pck2",
|
||||
.pmc_mask = AT91_PMC_PCK2,
|
||||
.type = CLK_TYPE_PROGRAMMABLE,
|
||||
.id = 2,
|
||||
};
|
||||
static struct clk pck3 = {
|
||||
.name = "pck3",
|
||||
.pmc_mask = AT91_PMC_PCK3,
|
||||
.type = CLK_TYPE_PROGRAMMABLE,
|
||||
.id = 3,
|
||||
};
|
||||
|
||||
static void __init at91cap9_register_clocks(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(periph_clocks); i++)
|
||||
clk_register(periph_clocks[i]);
|
||||
|
||||
clk_register(&pck0);
|
||||
clk_register(&pck1);
|
||||
clk_register(&pck2);
|
||||
clk_register(&pck3);
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* GPIO
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
static struct at91_gpio_bank at91cap9_gpio[] = {
|
||||
{
|
||||
.id = AT91CAP9_ID_PIOABCD,
|
||||
.offset = AT91_PIOA,
|
||||
.clock = &pioABCD_clk,
|
||||
}, {
|
||||
.id = AT91CAP9_ID_PIOABCD,
|
||||
.offset = AT91_PIOB,
|
||||
.clock = &pioABCD_clk,
|
||||
}, {
|
||||
.id = AT91CAP9_ID_PIOABCD,
|
||||
.offset = AT91_PIOC,
|
||||
.clock = &pioABCD_clk,
|
||||
}, {
|
||||
.id = AT91CAP9_ID_PIOABCD,
|
||||
.offset = AT91_PIOD,
|
||||
.clock = &pioABCD_clk,
|
||||
}
|
||||
};
|
||||
|
||||
static void at91cap9_reset(void)
|
||||
{
|
||||
at91_sys_write(AT91_RSTC_CR, AT91_RSTC_KEY | AT91_RSTC_PROCRST | AT91_RSTC_PERRST);
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* AT91CAP9 processor initialization
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
void __init at91cap9_initialize(unsigned long main_clock)
|
||||
{
|
||||
/* Map peripherals */
|
||||
iotable_init(at91cap9_io_desc, ARRAY_SIZE(at91cap9_io_desc));
|
||||
|
||||
at91_arch_reset = at91cap9_reset;
|
||||
at91_extern_irq = (1 << AT91CAP9_ID_IRQ0) | (1 << AT91CAP9_ID_IRQ1);
|
||||
|
||||
/* Init clock subsystem */
|
||||
at91_clock_init(main_clock);
|
||||
|
||||
/* Register the processor-specific clocks */
|
||||
at91cap9_register_clocks();
|
||||
|
||||
/* Register GPIO subsystem */
|
||||
at91_gpio_init(at91cap9_gpio, 4);
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* Interrupt initialization
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
* The default interrupt priority levels (0 = lowest, 7 = highest).
|
||||
*/
|
||||
static unsigned int at91cap9_default_irq_priority[NR_AIC_IRQS] __initdata = {
|
||||
7, /* Advanced Interrupt Controller (FIQ) */
|
||||
7, /* System Peripherals */
|
||||
1, /* Parallel IO Controller A, B, C and D */
|
||||
0, /* MP Block Peripheral 0 */
|
||||
0, /* MP Block Peripheral 1 */
|
||||
0, /* MP Block Peripheral 2 */
|
||||
0, /* MP Block Peripheral 3 */
|
||||
0, /* MP Block Peripheral 4 */
|
||||
5, /* USART 0 */
|
||||
5, /* USART 1 */
|
||||
5, /* USART 2 */
|
||||
0, /* Multimedia Card Interface 0 */
|
||||
0, /* Multimedia Card Interface 1 */
|
||||
3, /* CAN */
|
||||
6, /* Two-Wire Interface */
|
||||
5, /* Serial Peripheral Interface 0 */
|
||||
5, /* Serial Peripheral Interface 1 */
|
||||
4, /* Serial Synchronous Controller 0 */
|
||||
4, /* Serial Synchronous Controller 1 */
|
||||
5, /* AC97 Controller */
|
||||
0, /* Timer Counter 0, 1 and 2 */
|
||||
0, /* Pulse Width Modulation Controller */
|
||||
3, /* Ethernet */
|
||||
0, /* Advanced Encryption Standard, Triple DES*/
|
||||
0, /* Analog-to-Digital Converter */
|
||||
0, /* Image Sensor Interface */
|
||||
3, /* LCD Controller */
|
||||
0, /* DMA Controller */
|
||||
2, /* USB Device Port */
|
||||
2, /* USB Host port */
|
||||
0, /* Advanced Interrupt Controller (IRQ0) */
|
||||
0, /* Advanced Interrupt Controller (IRQ1) */
|
||||
};
|
||||
|
||||
void __init at91cap9_init_interrupts(unsigned int priority[NR_AIC_IRQS])
|
||||
{
|
||||
if (!priority)
|
||||
priority = at91cap9_default_irq_priority;
|
||||
|
||||
/* Initialize the AIC interrupt controller */
|
||||
at91_aic_init(priority);
|
||||
|
||||
/* Enable GPIO interrupts */
|
||||
at91_gpio_irq_setup();
|
||||
}
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -301,28 +301,28 @@ void __init at91rm9200_initialize(unsigned long main_clock, unsigned short banks
|
|||
static unsigned int at91rm9200_default_irq_priority[NR_AIC_IRQS] __initdata = {
|
||||
7, /* Advanced Interrupt Controller (FIQ) */
|
||||
7, /* System Peripherals */
|
||||
0, /* Parallel IO Controller A */
|
||||
0, /* Parallel IO Controller B */
|
||||
0, /* Parallel IO Controller C */
|
||||
0, /* Parallel IO Controller D */
|
||||
6, /* USART 0 */
|
||||
6, /* USART 1 */
|
||||
6, /* USART 2 */
|
||||
6, /* USART 3 */
|
||||
1, /* Parallel IO Controller A */
|
||||
1, /* Parallel IO Controller B */
|
||||
1, /* Parallel IO Controller C */
|
||||
1, /* Parallel IO Controller D */
|
||||
5, /* USART 0 */
|
||||
5, /* USART 1 */
|
||||
5, /* USART 2 */
|
||||
5, /* USART 3 */
|
||||
0, /* Multimedia Card Interface */
|
||||
4, /* USB Device Port */
|
||||
0, /* Two-Wire Interface */
|
||||
6, /* Serial Peripheral Interface */
|
||||
5, /* Serial Synchronous Controller 0 */
|
||||
5, /* Serial Synchronous Controller 1 */
|
||||
5, /* Serial Synchronous Controller 2 */
|
||||
2, /* USB Device Port */
|
||||
6, /* Two-Wire Interface */
|
||||
5, /* Serial Peripheral Interface */
|
||||
4, /* Serial Synchronous Controller 0 */
|
||||
4, /* Serial Synchronous Controller 1 */
|
||||
4, /* Serial Synchronous Controller 2 */
|
||||
0, /* Timer Counter 0 */
|
||||
0, /* Timer Counter 1 */
|
||||
0, /* Timer Counter 2 */
|
||||
0, /* Timer Counter 3 */
|
||||
0, /* Timer Counter 4 */
|
||||
0, /* Timer Counter 5 */
|
||||
3, /* USB Host port */
|
||||
2, /* USB Host port */
|
||||
3, /* Ethernet MAC */
|
||||
0, /* Advanced Interrupt Controller (IRQ0) */
|
||||
0, /* Advanced Interrupt Controller (IRQ1) */
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/i2c-gpio.h>
|
||||
|
||||
|
@ -29,7 +30,7 @@
|
|||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
|
||||
static u64 ohci_dmamask = 0xffffffffUL;
|
||||
static u64 ohci_dmamask = DMA_BIT_MASK(32);
|
||||
static struct at91_usbh_data usbh_data;
|
||||
|
||||
static struct resource usbh_resources[] = {
|
||||
|
@ -50,7 +51,7 @@ static struct platform_device at91rm9200_usbh_device = {
|
|||
.id = -1,
|
||||
.dev = {
|
||||
.dma_mask = &ohci_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &usbh_data,
|
||||
},
|
||||
.resource = usbh_resources,
|
||||
|
@ -125,7 +126,7 @@ void __init at91_add_device_udc(struct at91_udc_data *data) {}
|
|||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_ARM_AT91_ETHER) || defined(CONFIG_ARM_AT91_ETHER_MODULE)
|
||||
static u64 eth_dmamask = 0xffffffffUL;
|
||||
static u64 eth_dmamask = DMA_BIT_MASK(32);
|
||||
static struct at91_eth_data eth_data;
|
||||
|
||||
static struct resource eth_resources[] = {
|
||||
|
@ -146,7 +147,7 @@ static struct platform_device at91rm9200_eth_device = {
|
|||
.id = -1,
|
||||
.dev = {
|
||||
.dma_mask = ð_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = ð_data,
|
||||
},
|
||||
.resource = eth_resources,
|
||||
|
@ -285,7 +286,7 @@ void __init at91_add_device_cf(struct at91_cf_data *data) {}
|
|||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_MMC_AT91) || defined(CONFIG_MMC_AT91_MODULE)
|
||||
static u64 mmc_dmamask = 0xffffffffUL;
|
||||
static u64 mmc_dmamask = DMA_BIT_MASK(32);
|
||||
static struct at91_mmc_data mmc_data;
|
||||
|
||||
static struct resource mmc_resources[] = {
|
||||
|
@ -306,7 +307,7 @@ static struct platform_device at91rm9200_mmc_device = {
|
|||
.id = -1,
|
||||
.dev = {
|
||||
.dma_mask = &mmc_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &mmc_data,
|
||||
},
|
||||
.resource = mmc_resources,
|
||||
|
@ -375,7 +376,7 @@ static struct at91_nand_data nand_data;
|
|||
static struct resource nand_resources[] = {
|
||||
{
|
||||
.start = NAND_BASE,
|
||||
.end = NAND_BASE + SZ_8M - 1,
|
||||
.end = NAND_BASE + SZ_256M - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}
|
||||
};
|
||||
|
@ -513,7 +514,7 @@ void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices)
|
|||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_SPI_ATMEL) || defined(CONFIG_SPI_ATMEL_MODULE)
|
||||
static u64 spi_dmamask = 0xffffffffUL;
|
||||
static u64 spi_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct resource spi_resources[] = {
|
||||
[0] = {
|
||||
|
@ -533,7 +534,7 @@ static struct platform_device at91rm9200_spi_device = {
|
|||
.id = 0,
|
||||
.dev = {
|
||||
.dma_mask = &spi_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
.resource = spi_resources,
|
||||
.num_resources = ARRAY_SIZE(spi_resources),
|
||||
|
@ -557,8 +558,11 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)
|
|||
else
|
||||
cs_pin = spi_standard_cs[devices[i].chip_select];
|
||||
|
||||
/* enable chip-select pin */
|
||||
at91_set_gpio_output(cs_pin, 1);
|
||||
if (devices[i].chip_select == 0) /* for CS0 errata */
|
||||
at91_set_A_periph(cs_pin, 0);
|
||||
else
|
||||
at91_set_gpio_output(cs_pin, 1);
|
||||
|
||||
|
||||
/* pass chip-select pin to driver */
|
||||
devices[i].controller_data = (void *) cs_pin;
|
||||
|
@ -613,24 +617,175 @@ static void __init at91_add_device_watchdog(void) {}
|
|||
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* LEDs
|
||||
* SSC -- Synchronous Serial Controller
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_LEDS)
|
||||
u8 at91_leds_cpu;
|
||||
u8 at91_leds_timer;
|
||||
#if defined(CONFIG_ATMEL_SSC) || defined(CONFIG_ATMEL_SSC_MODULE)
|
||||
static u64 ssc0_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
void __init at91_init_leds(u8 cpu_led, u8 timer_led)
|
||||
static struct resource ssc0_resources[] = {
|
||||
[0] = {
|
||||
.start = AT91RM9200_BASE_SSC0,
|
||||
.end = AT91RM9200_BASE_SSC0 + SZ_16K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = AT91RM9200_ID_SSC0,
|
||||
.end = AT91RM9200_ID_SSC0,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device at91rm9200_ssc0_device = {
|
||||
.name = "ssc",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.dma_mask = &ssc0_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
.resource = ssc0_resources,
|
||||
.num_resources = ARRAY_SIZE(ssc0_resources),
|
||||
};
|
||||
|
||||
static inline void configure_ssc0_pins(unsigned pins)
|
||||
{
|
||||
/* Enable GPIO to access the LEDs */
|
||||
at91_set_gpio_output(cpu_led, 1);
|
||||
at91_set_gpio_output(timer_led, 1);
|
||||
|
||||
at91_leds_cpu = cpu_led;
|
||||
at91_leds_timer = timer_led;
|
||||
if (pins & ATMEL_SSC_TF)
|
||||
at91_set_A_periph(AT91_PIN_PB0, 1);
|
||||
if (pins & ATMEL_SSC_TK)
|
||||
at91_set_A_periph(AT91_PIN_PB1, 1);
|
||||
if (pins & ATMEL_SSC_TD)
|
||||
at91_set_A_periph(AT91_PIN_PB2, 1);
|
||||
if (pins & ATMEL_SSC_RD)
|
||||
at91_set_A_periph(AT91_PIN_PB3, 1);
|
||||
if (pins & ATMEL_SSC_RK)
|
||||
at91_set_A_periph(AT91_PIN_PB4, 1);
|
||||
if (pins & ATMEL_SSC_RF)
|
||||
at91_set_A_periph(AT91_PIN_PB5, 1);
|
||||
}
|
||||
|
||||
static u64 ssc1_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct resource ssc1_resources[] = {
|
||||
[0] = {
|
||||
.start = AT91RM9200_BASE_SSC1,
|
||||
.end = AT91RM9200_BASE_SSC1 + SZ_16K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = AT91RM9200_ID_SSC1,
|
||||
.end = AT91RM9200_ID_SSC1,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device at91rm9200_ssc1_device = {
|
||||
.name = "ssc",
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.dma_mask = &ssc1_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
.resource = ssc1_resources,
|
||||
.num_resources = ARRAY_SIZE(ssc1_resources),
|
||||
};
|
||||
|
||||
static inline void configure_ssc1_pins(unsigned pins)
|
||||
{
|
||||
if (pins & ATMEL_SSC_TF)
|
||||
at91_set_A_periph(AT91_PIN_PB6, 1);
|
||||
if (pins & ATMEL_SSC_TK)
|
||||
at91_set_A_periph(AT91_PIN_PB7, 1);
|
||||
if (pins & ATMEL_SSC_TD)
|
||||
at91_set_A_periph(AT91_PIN_PB8, 1);
|
||||
if (pins & ATMEL_SSC_RD)
|
||||
at91_set_A_periph(AT91_PIN_PB9, 1);
|
||||
if (pins & ATMEL_SSC_RK)
|
||||
at91_set_A_periph(AT91_PIN_PB10, 1);
|
||||
if (pins & ATMEL_SSC_RF)
|
||||
at91_set_A_periph(AT91_PIN_PB11, 1);
|
||||
}
|
||||
|
||||
static u64 ssc2_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct resource ssc2_resources[] = {
|
||||
[0] = {
|
||||
.start = AT91RM9200_BASE_SSC2,
|
||||
.end = AT91RM9200_BASE_SSC2 + SZ_16K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = AT91RM9200_ID_SSC2,
|
||||
.end = AT91RM9200_ID_SSC2,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device at91rm9200_ssc2_device = {
|
||||
.name = "ssc",
|
||||
.id = 2,
|
||||
.dev = {
|
||||
.dma_mask = &ssc2_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
.resource = ssc2_resources,
|
||||
.num_resources = ARRAY_SIZE(ssc2_resources),
|
||||
};
|
||||
|
||||
static inline void configure_ssc2_pins(unsigned pins)
|
||||
{
|
||||
if (pins & ATMEL_SSC_TF)
|
||||
at91_set_A_periph(AT91_PIN_PB12, 1);
|
||||
if (pins & ATMEL_SSC_TK)
|
||||
at91_set_A_periph(AT91_PIN_PB13, 1);
|
||||
if (pins & ATMEL_SSC_TD)
|
||||
at91_set_A_periph(AT91_PIN_PB14, 1);
|
||||
if (pins & ATMEL_SSC_RD)
|
||||
at91_set_A_periph(AT91_PIN_PB15, 1);
|
||||
if (pins & ATMEL_SSC_RK)
|
||||
at91_set_A_periph(AT91_PIN_PB16, 1);
|
||||
if (pins & ATMEL_SSC_RF)
|
||||
at91_set_A_periph(AT91_PIN_PB17, 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* SSC controllers are accessed through library code, instead of any
|
||||
* kind of all-singing/all-dancing driver. For example one could be
|
||||
* used by a particular I2S audio codec's driver, while another one
|
||||
* on the same system might be used by a custom data capture driver.
|
||||
*/
|
||||
void __init at91_add_device_ssc(unsigned id, unsigned pins)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
|
||||
/*
|
||||
* NOTE: caller is responsible for passing information matching
|
||||
* "pins" to whatever will be using each particular controller.
|
||||
*/
|
||||
switch (id) {
|
||||
case AT91RM9200_ID_SSC0:
|
||||
pdev = &at91rm9200_ssc0_device;
|
||||
configure_ssc0_pins(pins);
|
||||
at91_clock_associate("ssc0_clk", &pdev->dev, "ssc");
|
||||
break;
|
||||
case AT91RM9200_ID_SSC1:
|
||||
pdev = &at91rm9200_ssc1_device;
|
||||
configure_ssc1_pins(pins);
|
||||
at91_clock_associate("ssc1_clk", &pdev->dev, "ssc");
|
||||
break;
|
||||
case AT91RM9200_ID_SSC2:
|
||||
pdev = &at91rm9200_ssc2_device;
|
||||
configure_ssc2_pins(pins);
|
||||
at91_clock_associate("ssc2_clk", &pdev->dev, "ssc");
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
platform_device_register(pdev);
|
||||
}
|
||||
|
||||
#else
|
||||
void __init at91_init_leds(u8 cpu_led, u8 timer_led) {}
|
||||
void __init at91_add_device_ssc(unsigned id, unsigned pins) {}
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -658,12 +813,15 @@ static struct atmel_uart_data dbgu_data = {
|
|||
.regs = (void __iomem *)(AT91_VA_BASE_SYS + AT91_DBGU),
|
||||
};
|
||||
|
||||
static u64 dbgu_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct platform_device at91rm9200_dbgu_device = {
|
||||
.name = "atmel_usart",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &dbgu_data,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.dma_mask = &dbgu_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &dbgu_data,
|
||||
},
|
||||
.resource = dbgu_resources,
|
||||
.num_resources = ARRAY_SIZE(dbgu_resources),
|
||||
|
@ -693,28 +851,35 @@ static struct atmel_uart_data uart0_data = {
|
|||
.use_dma_rx = 1,
|
||||
};
|
||||
|
||||
static u64 uart0_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct platform_device at91rm9200_uart0_device = {
|
||||
.name = "atmel_usart",
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.platform_data = &uart0_data,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.dma_mask = &uart0_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &uart0_data,
|
||||
},
|
||||
.resource = uart0_resources,
|
||||
.num_resources = ARRAY_SIZE(uart0_resources),
|
||||
};
|
||||
|
||||
static inline void configure_usart0_pins(void)
|
||||
static inline void configure_usart0_pins(unsigned pins)
|
||||
{
|
||||
at91_set_A_periph(AT91_PIN_PA17, 1); /* TXD0 */
|
||||
at91_set_A_periph(AT91_PIN_PA18, 0); /* RXD0 */
|
||||
at91_set_A_periph(AT91_PIN_PA20, 0); /* CTS0 */
|
||||
|
||||
/*
|
||||
* AT91RM9200 Errata #39 - RTS0 is not internally connected to PA21.
|
||||
* We need to drive the pin manually. Default is off (RTS is active low).
|
||||
*/
|
||||
at91_set_gpio_output(AT91_PIN_PA21, 1);
|
||||
if (pins & ATMEL_UART_CTS)
|
||||
at91_set_A_periph(AT91_PIN_PA20, 0); /* CTS0 */
|
||||
|
||||
if (pins & ATMEL_UART_RTS) {
|
||||
/*
|
||||
* AT91RM9200 Errata #39 - RTS0 is not internally connected to PA21.
|
||||
* We need to drive the pin manually. Default is off (RTS is active low).
|
||||
*/
|
||||
at91_set_gpio_output(AT91_PIN_PA21, 1);
|
||||
}
|
||||
}
|
||||
|
||||
static struct resource uart1_resources[] = {
|
||||
|
@ -735,27 +900,37 @@ static struct atmel_uart_data uart1_data = {
|
|||
.use_dma_rx = 1,
|
||||
};
|
||||
|
||||
static u64 uart1_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct platform_device at91rm9200_uart1_device = {
|
||||
.name = "atmel_usart",
|
||||
.id = 2,
|
||||
.dev = {
|
||||
.platform_data = &uart1_data,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.dma_mask = &uart1_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &uart1_data,
|
||||
},
|
||||
.resource = uart1_resources,
|
||||
.num_resources = ARRAY_SIZE(uart1_resources),
|
||||
};
|
||||
|
||||
static inline void configure_usart1_pins(void)
|
||||
static inline void configure_usart1_pins(unsigned pins)
|
||||
{
|
||||
at91_set_A_periph(AT91_PIN_PB18, 0); /* RI1 */
|
||||
at91_set_A_periph(AT91_PIN_PB19, 0); /* DTR1 */
|
||||
at91_set_A_periph(AT91_PIN_PB20, 1); /* TXD1 */
|
||||
at91_set_A_periph(AT91_PIN_PB21, 0); /* RXD1 */
|
||||
at91_set_A_periph(AT91_PIN_PB23, 0); /* DCD1 */
|
||||
at91_set_A_periph(AT91_PIN_PB24, 0); /* CTS1 */
|
||||
at91_set_A_periph(AT91_PIN_PB25, 0); /* DSR1 */
|
||||
at91_set_A_periph(AT91_PIN_PB26, 0); /* RTS1 */
|
||||
|
||||
if (pins & ATMEL_UART_RI)
|
||||
at91_set_A_periph(AT91_PIN_PB18, 0); /* RI1 */
|
||||
if (pins & ATMEL_UART_DTR)
|
||||
at91_set_A_periph(AT91_PIN_PB19, 0); /* DTR1 */
|
||||
if (pins & ATMEL_UART_DCD)
|
||||
at91_set_A_periph(AT91_PIN_PB23, 0); /* DCD1 */
|
||||
if (pins & ATMEL_UART_CTS)
|
||||
at91_set_A_periph(AT91_PIN_PB24, 0); /* CTS1 */
|
||||
if (pins & ATMEL_UART_DSR)
|
||||
at91_set_A_periph(AT91_PIN_PB25, 0); /* DSR1 */
|
||||
if (pins & ATMEL_UART_RTS)
|
||||
at91_set_A_periph(AT91_PIN_PB26, 0); /* RTS1 */
|
||||
}
|
||||
|
||||
static struct resource uart2_resources[] = {
|
||||
|
@ -776,21 +951,29 @@ static struct atmel_uart_data uart2_data = {
|
|||
.use_dma_rx = 1,
|
||||
};
|
||||
|
||||
static u64 uart2_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct platform_device at91rm9200_uart2_device = {
|
||||
.name = "atmel_usart",
|
||||
.id = 3,
|
||||
.dev = {
|
||||
.platform_data = &uart2_data,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.dma_mask = &uart2_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &uart2_data,
|
||||
},
|
||||
.resource = uart2_resources,
|
||||
.num_resources = ARRAY_SIZE(uart2_resources),
|
||||
};
|
||||
|
||||
static inline void configure_usart2_pins(void)
|
||||
static inline void configure_usart2_pins(unsigned pins)
|
||||
{
|
||||
at91_set_A_periph(AT91_PIN_PA22, 0); /* RXD2 */
|
||||
at91_set_A_periph(AT91_PIN_PA23, 1); /* TXD2 */
|
||||
|
||||
if (pins & ATMEL_UART_CTS)
|
||||
at91_set_B_periph(AT91_PIN_PA30, 0); /* CTS2 */
|
||||
if (pins & ATMEL_UART_RTS)
|
||||
at91_set_B_periph(AT91_PIN_PA31, 0); /* RTS2 */
|
||||
}
|
||||
|
||||
static struct resource uart3_resources[] = {
|
||||
|
@ -811,27 +994,35 @@ static struct atmel_uart_data uart3_data = {
|
|||
.use_dma_rx = 1,
|
||||
};
|
||||
|
||||
static u64 uart3_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct platform_device at91rm9200_uart3_device = {
|
||||
.name = "atmel_usart",
|
||||
.id = 4,
|
||||
.dev = {
|
||||
.platform_data = &uart3_data,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.dma_mask = &uart3_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &uart3_data,
|
||||
},
|
||||
.resource = uart3_resources,
|
||||
.num_resources = ARRAY_SIZE(uart3_resources),
|
||||
};
|
||||
|
||||
static inline void configure_usart3_pins(void)
|
||||
static inline void configure_usart3_pins(unsigned pins)
|
||||
{
|
||||
at91_set_B_periph(AT91_PIN_PA5, 1); /* TXD3 */
|
||||
at91_set_B_periph(AT91_PIN_PA6, 0); /* RXD3 */
|
||||
|
||||
if (pins & ATMEL_UART_CTS)
|
||||
at91_set_B_periph(AT91_PIN_PB1, 0); /* CTS3 */
|
||||
if (pins & ATMEL_UART_RTS)
|
||||
at91_set_B_periph(AT91_PIN_PB0, 0); /* RTS3 */
|
||||
}
|
||||
|
||||
struct platform_device *at91_uarts[ATMEL_MAX_UART]; /* the UARTs to use */
|
||||
static struct platform_device *at91_uarts[ATMEL_MAX_UART]; /* the UARTs to use */
|
||||
struct platform_device *atmel_default_console_device; /* the serial console device */
|
||||
|
||||
void __init at91_init_serial(struct at91_uart_config *config)
|
||||
void __init __deprecated at91_init_serial(struct at91_uart_config *config)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
@ -839,22 +1030,22 @@ void __init at91_init_serial(struct at91_uart_config *config)
|
|||
for (i = 0; i < config->nr_tty; i++) {
|
||||
switch (config->tty_map[i]) {
|
||||
case 0:
|
||||
configure_usart0_pins();
|
||||
configure_usart0_pins(ATMEL_UART_CTS | ATMEL_UART_RTS);
|
||||
at91_uarts[i] = &at91rm9200_uart0_device;
|
||||
at91_clock_associate("usart0_clk", &at91rm9200_uart0_device.dev, "usart");
|
||||
break;
|
||||
case 1:
|
||||
configure_usart1_pins();
|
||||
configure_usart1_pins(ATMEL_UART_CTS | ATMEL_UART_RTS | ATMEL_UART_DSR | ATMEL_UART_DTR | ATMEL_UART_DCD | ATMEL_UART_RI);
|
||||
at91_uarts[i] = &at91rm9200_uart1_device;
|
||||
at91_clock_associate("usart1_clk", &at91rm9200_uart1_device.dev, "usart");
|
||||
break;
|
||||
case 2:
|
||||
configure_usart2_pins();
|
||||
configure_usart2_pins(0);
|
||||
at91_uarts[i] = &at91rm9200_uart2_device;
|
||||
at91_clock_associate("usart2_clk", &at91rm9200_uart2_device.dev, "usart");
|
||||
break;
|
||||
case 3:
|
||||
configure_usart3_pins();
|
||||
configure_usart3_pins(0);
|
||||
at91_uarts[i] = &at91rm9200_uart3_device;
|
||||
at91_clock_associate("usart3_clk", &at91rm9200_uart3_device.dev, "usart");
|
||||
break;
|
||||
|
@ -876,6 +1067,53 @@ void __init at91_init_serial(struct at91_uart_config *config)
|
|||
printk(KERN_INFO "AT91: No default serial console defined.\n");
|
||||
}
|
||||
|
||||
void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
|
||||
switch (id) {
|
||||
case 0: /* DBGU */
|
||||
pdev = &at91rm9200_dbgu_device;
|
||||
configure_dbgu_pins();
|
||||
at91_clock_associate("mck", &pdev->dev, "usart");
|
||||
break;
|
||||
case AT91RM9200_ID_US0:
|
||||
pdev = &at91rm9200_uart0_device;
|
||||
configure_usart0_pins(pins);
|
||||
at91_clock_associate("usart0_clk", &pdev->dev, "usart");
|
||||
break;
|
||||
case AT91RM9200_ID_US1:
|
||||
pdev = &at91rm9200_uart1_device;
|
||||
configure_usart1_pins(pins);
|
||||
at91_clock_associate("usart1_clk", &pdev->dev, "usart");
|
||||
break;
|
||||
case AT91RM9200_ID_US2:
|
||||
pdev = &at91rm9200_uart2_device;
|
||||
configure_usart2_pins(pins);
|
||||
at91_clock_associate("usart2_clk", &pdev->dev, "usart");
|
||||
break;
|
||||
case AT91RM9200_ID_US3:
|
||||
pdev = &at91rm9200_uart3_device;
|
||||
configure_usart3_pins(pins);
|
||||
at91_clock_associate("usart3_clk", &pdev->dev, "usart");
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
pdev->id = portnr; /* update to mapped ID */
|
||||
|
||||
if (portnr < ATMEL_MAX_UART)
|
||||
at91_uarts[portnr] = pdev;
|
||||
}
|
||||
|
||||
void __init at91_set_serial_console(unsigned portnr)
|
||||
{
|
||||
if (portnr < ATMEL_MAX_UART)
|
||||
atmel_default_console_device = at91_uarts[portnr];
|
||||
if (!atmel_default_console_device)
|
||||
printk(KERN_INFO "AT91: No default serial console defined.\n");
|
||||
}
|
||||
|
||||
void __init at91_add_device_serial(void)
|
||||
{
|
||||
int i;
|
||||
|
@ -886,7 +1124,9 @@ void __init at91_add_device_serial(void)
|
|||
}
|
||||
}
|
||||
#else
|
||||
void __init at91_init_serial(struct at91_uart_config *config) {}
|
||||
void __init __deprecated at91_init_serial(struct at91_uart_config *config) {}
|
||||
void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) {}
|
||||
void __init at91_set_serial_console(unsigned portnr) {}
|
||||
void __init at91_add_device_serial(void) {}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -327,30 +327,30 @@ void __init at91sam9260_initialize(unsigned long main_clock)
|
|||
static unsigned int at91sam9260_default_irq_priority[NR_AIC_IRQS] __initdata = {
|
||||
7, /* Advanced Interrupt Controller */
|
||||
7, /* System Peripherals */
|
||||
0, /* Parallel IO Controller A */
|
||||
0, /* Parallel IO Controller B */
|
||||
0, /* Parallel IO Controller C */
|
||||
1, /* Parallel IO Controller A */
|
||||
1, /* Parallel IO Controller B */
|
||||
1, /* Parallel IO Controller C */
|
||||
0, /* Analog-to-Digital Converter */
|
||||
6, /* USART 0 */
|
||||
6, /* USART 1 */
|
||||
6, /* USART 2 */
|
||||
5, /* USART 0 */
|
||||
5, /* USART 1 */
|
||||
5, /* USART 2 */
|
||||
0, /* Multimedia Card Interface */
|
||||
4, /* USB Device Port */
|
||||
0, /* Two-Wire Interface */
|
||||
6, /* Serial Peripheral Interface 0 */
|
||||
6, /* Serial Peripheral Interface 1 */
|
||||
2, /* USB Device Port */
|
||||
6, /* Two-Wire Interface */
|
||||
5, /* Serial Peripheral Interface 0 */
|
||||
5, /* Serial Peripheral Interface 1 */
|
||||
5, /* Serial Synchronous Controller */
|
||||
0,
|
||||
0,
|
||||
0, /* Timer Counter 0 */
|
||||
0, /* Timer Counter 1 */
|
||||
0, /* Timer Counter 2 */
|
||||
3, /* USB Host port */
|
||||
2, /* USB Host port */
|
||||
3, /* Ethernet */
|
||||
0, /* Image Sensor Interface */
|
||||
6, /* USART 3 */
|
||||
6, /* USART 4 */
|
||||
6, /* USART 5 */
|
||||
5, /* USART 3 */
|
||||
5, /* USART 4 */
|
||||
5, /* USART 5 */
|
||||
0, /* Timer Counter 3 */
|
||||
0, /* Timer Counter 4 */
|
||||
0, /* Timer Counter 5 */
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/i2c-gpio.h>
|
||||
|
||||
|
@ -29,7 +30,7 @@
|
|||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
|
||||
static u64 ohci_dmamask = 0xffffffffUL;
|
||||
static u64 ohci_dmamask = DMA_BIT_MASK(32);
|
||||
static struct at91_usbh_data usbh_data;
|
||||
|
||||
static struct resource usbh_resources[] = {
|
||||
|
@ -50,7 +51,7 @@ static struct platform_device at91_usbh_device = {
|
|||
.id = -1,
|
||||
.dev = {
|
||||
.dma_mask = &ohci_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &usbh_data,
|
||||
},
|
||||
.resource = usbh_resources,
|
||||
|
@ -125,7 +126,7 @@ void __init at91_add_device_udc(struct at91_udc_data *data) {}
|
|||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_MACB) || defined(CONFIG_MACB_MODULE)
|
||||
static u64 eth_dmamask = 0xffffffffUL;
|
||||
static u64 eth_dmamask = DMA_BIT_MASK(32);
|
||||
static struct at91_eth_data eth_data;
|
||||
|
||||
static struct resource eth_resources[] = {
|
||||
|
@ -146,7 +147,7 @@ static struct platform_device at91sam9260_eth_device = {
|
|||
.id = -1,
|
||||
.dev = {
|
||||
.dma_mask = ð_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = ð_data,
|
||||
},
|
||||
.resource = eth_resources,
|
||||
|
@ -199,7 +200,7 @@ void __init at91_add_device_eth(struct at91_eth_data *data) {}
|
|||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_MMC_AT91) || defined(CONFIG_MMC_AT91_MODULE)
|
||||
static u64 mmc_dmamask = 0xffffffffUL;
|
||||
static u64 mmc_dmamask = DMA_BIT_MASK(32);
|
||||
static struct at91_mmc_data mmc_data;
|
||||
|
||||
static struct resource mmc_resources[] = {
|
||||
|
@ -220,7 +221,7 @@ static struct platform_device at91sam9260_mmc_device = {
|
|||
.id = -1,
|
||||
.dev = {
|
||||
.dma_mask = &mmc_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &mmc_data,
|
||||
},
|
||||
.resource = mmc_resources,
|
||||
|
@ -289,7 +290,7 @@ static struct at91_nand_data nand_data;
|
|||
static struct resource nand_resources[] = {
|
||||
{
|
||||
.start = NAND_BASE,
|
||||
.end = NAND_BASE + SZ_8M - 1,
|
||||
.end = NAND_BASE + SZ_256M - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}
|
||||
};
|
||||
|
@ -312,7 +313,7 @@ void __init at91_add_device_nand(struct at91_nand_data *data)
|
|||
return;
|
||||
|
||||
csa = at91_sys_read(AT91_MATRIX_EBICSA);
|
||||
at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_CS3A_SMC);
|
||||
at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_CS3A_SMC_SMARTMEDIA);
|
||||
|
||||
/* set the bus interface characteristics */
|
||||
at91_sys_write(AT91_SMC_SETUP(3), AT91_SMC_NWESETUP_(0) | AT91_SMC_NCS_WRSETUP_(0)
|
||||
|
@ -431,7 +432,7 @@ void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices)
|
|||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_SPI_ATMEL) || defined(CONFIG_SPI_ATMEL_MODULE)
|
||||
static u64 spi_dmamask = 0xffffffffUL;
|
||||
static u64 spi_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct resource spi0_resources[] = {
|
||||
[0] = {
|
||||
|
@ -451,7 +452,7 @@ static struct platform_device at91sam9260_spi0_device = {
|
|||
.id = 0,
|
||||
.dev = {
|
||||
.dma_mask = &spi_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
.resource = spi0_resources,
|
||||
.num_resources = ARRAY_SIZE(spi0_resources),
|
||||
|
@ -477,7 +478,7 @@ static struct platform_device at91sam9260_spi1_device = {
|
|||
.id = 1,
|
||||
.dev = {
|
||||
.dma_mask = &spi_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
.resource = spi1_resources,
|
||||
.num_resources = ARRAY_SIZE(spi1_resources),
|
||||
|
@ -539,24 +540,126 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)
|
|||
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* LEDs
|
||||
* RTT
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_LEDS)
|
||||
u8 at91_leds_cpu;
|
||||
u8 at91_leds_timer;
|
||||
static struct resource rtt_resources[] = {
|
||||
{
|
||||
.start = AT91_BASE_SYS + AT91_RTT,
|
||||
.end = AT91_BASE_SYS + AT91_RTT + SZ_16 - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}
|
||||
};
|
||||
|
||||
void __init at91_init_leds(u8 cpu_led, u8 timer_led)
|
||||
static struct platform_device at91sam9260_rtt_device = {
|
||||
.name = "at91_rtt",
|
||||
.id = -1,
|
||||
.resource = rtt_resources,
|
||||
.num_resources = ARRAY_SIZE(rtt_resources),
|
||||
};
|
||||
|
||||
static void __init at91_add_device_rtt(void)
|
||||
{
|
||||
/* Enable GPIO to access the LEDs */
|
||||
at91_set_gpio_output(cpu_led, 1);
|
||||
at91_set_gpio_output(timer_led, 1);
|
||||
platform_device_register(&at91sam9260_rtt_device);
|
||||
}
|
||||
|
||||
at91_leds_cpu = cpu_led;
|
||||
at91_leds_timer = timer_led;
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* Watchdog
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE)
|
||||
static struct platform_device at91sam9260_wdt_device = {
|
||||
.name = "at91_wdt",
|
||||
.id = -1,
|
||||
.num_resources = 0,
|
||||
};
|
||||
|
||||
static void __init at91_add_device_watchdog(void)
|
||||
{
|
||||
platform_device_register(&at91sam9260_wdt_device);
|
||||
}
|
||||
#else
|
||||
void __init at91_init_leds(u8 cpu_led, u8 timer_led) {}
|
||||
static void __init at91_add_device_watchdog(void) {}
|
||||
#endif
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* SSC -- Synchronous Serial Controller
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_ATMEL_SSC) || defined(CONFIG_ATMEL_SSC_MODULE)
|
||||
static u64 ssc_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct resource ssc_resources[] = {
|
||||
[0] = {
|
||||
.start = AT91SAM9260_BASE_SSC,
|
||||
.end = AT91SAM9260_BASE_SSC + SZ_16K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = AT91SAM9260_ID_SSC,
|
||||
.end = AT91SAM9260_ID_SSC,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device at91sam9260_ssc_device = {
|
||||
.name = "ssc",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.dma_mask = &ssc_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
.resource = ssc_resources,
|
||||
.num_resources = ARRAY_SIZE(ssc_resources),
|
||||
};
|
||||
|
||||
static inline void configure_ssc_pins(unsigned pins)
|
||||
{
|
||||
if (pins & ATMEL_SSC_TF)
|
||||
at91_set_A_periph(AT91_PIN_PB17, 1);
|
||||
if (pins & ATMEL_SSC_TK)
|
||||
at91_set_A_periph(AT91_PIN_PB16, 1);
|
||||
if (pins & ATMEL_SSC_TD)
|
||||
at91_set_A_periph(AT91_PIN_PB18, 1);
|
||||
if (pins & ATMEL_SSC_RD)
|
||||
at91_set_A_periph(AT91_PIN_PB19, 1);
|
||||
if (pins & ATMEL_SSC_RK)
|
||||
at91_set_A_periph(AT91_PIN_PB20, 1);
|
||||
if (pins & ATMEL_SSC_RF)
|
||||
at91_set_A_periph(AT91_PIN_PB21, 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* SSC controllers are accessed through library code, instead of any
|
||||
* kind of all-singing/all-dancing driver. For example one could be
|
||||
* used by a particular I2S audio codec's driver, while another one
|
||||
* on the same system might be used by a custom data capture driver.
|
||||
*/
|
||||
void __init at91_add_device_ssc(unsigned id, unsigned pins)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
|
||||
/*
|
||||
* NOTE: caller is responsible for passing information matching
|
||||
* "pins" to whatever will be using each particular controller.
|
||||
*/
|
||||
switch (id) {
|
||||
case AT91SAM9260_ID_SSC:
|
||||
pdev = &at91sam9260_ssc_device;
|
||||
configure_ssc_pins(pins);
|
||||
at91_clock_associate("ssc_clk", &pdev->dev, "pclk");
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
platform_device_register(pdev);
|
||||
}
|
||||
|
||||
#else
|
||||
void __init at91_add_device_ssc(unsigned id, unsigned pins) {}
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -583,12 +686,15 @@ static struct atmel_uart_data dbgu_data = {
|
|||
.regs = (void __iomem *)(AT91_VA_BASE_SYS + AT91_DBGU),
|
||||
};
|
||||
|
||||
static u64 dbgu_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct platform_device at91sam9260_dbgu_device = {
|
||||
.name = "atmel_usart",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &dbgu_data,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.dma_mask = &dbgu_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &dbgu_data,
|
||||
},
|
||||
.resource = dbgu_resources,
|
||||
.num_resources = ARRAY_SIZE(dbgu_resources),
|
||||
|
@ -618,27 +724,37 @@ static struct atmel_uart_data uart0_data = {
|
|||
.use_dma_rx = 1,
|
||||
};
|
||||
|
||||
static u64 uart0_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct platform_device at91sam9260_uart0_device = {
|
||||
.name = "atmel_usart",
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.platform_data = &uart0_data,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.dma_mask = &uart0_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &uart0_data,
|
||||
},
|
||||
.resource = uart0_resources,
|
||||
.num_resources = ARRAY_SIZE(uart0_resources),
|
||||
};
|
||||
|
||||
static inline void configure_usart0_pins(void)
|
||||
static inline void configure_usart0_pins(unsigned pins)
|
||||
{
|
||||
at91_set_A_periph(AT91_PIN_PB4, 1); /* TXD0 */
|
||||
at91_set_A_periph(AT91_PIN_PB5, 0); /* RXD0 */
|
||||
at91_set_A_periph(AT91_PIN_PB26, 0); /* RTS0 */
|
||||
at91_set_A_periph(AT91_PIN_PB27, 0); /* CTS0 */
|
||||
at91_set_A_periph(AT91_PIN_PB24, 0); /* DTR0 */
|
||||
at91_set_A_periph(AT91_PIN_PB22, 0); /* DSR0 */
|
||||
at91_set_A_periph(AT91_PIN_PB23, 0); /* DCD0 */
|
||||
at91_set_A_periph(AT91_PIN_PB25, 0); /* RI0 */
|
||||
|
||||
if (pins & ATMEL_UART_RTS)
|
||||
at91_set_A_periph(AT91_PIN_PB26, 0); /* RTS0 */
|
||||
if (pins & ATMEL_UART_CTS)
|
||||
at91_set_A_periph(AT91_PIN_PB27, 0); /* CTS0 */
|
||||
if (pins & ATMEL_UART_DTR)
|
||||
at91_set_A_periph(AT91_PIN_PB24, 0); /* DTR0 */
|
||||
if (pins & ATMEL_UART_DSR)
|
||||
at91_set_A_periph(AT91_PIN_PB22, 0); /* DSR0 */
|
||||
if (pins & ATMEL_UART_DCD)
|
||||
at91_set_A_periph(AT91_PIN_PB23, 0); /* DCD0 */
|
||||
if (pins & ATMEL_UART_RI)
|
||||
at91_set_A_periph(AT91_PIN_PB25, 0); /* RI0 */
|
||||
}
|
||||
|
||||
static struct resource uart1_resources[] = {
|
||||
|
@ -659,23 +775,29 @@ static struct atmel_uart_data uart1_data = {
|
|||
.use_dma_rx = 1,
|
||||
};
|
||||
|
||||
static u64 uart1_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct platform_device at91sam9260_uart1_device = {
|
||||
.name = "atmel_usart",
|
||||
.id = 2,
|
||||
.dev = {
|
||||
.platform_data = &uart1_data,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.dma_mask = &uart1_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &uart1_data,
|
||||
},
|
||||
.resource = uart1_resources,
|
||||
.num_resources = ARRAY_SIZE(uart1_resources),
|
||||
};
|
||||
|
||||
static inline void configure_usart1_pins(void)
|
||||
static inline void configure_usart1_pins(unsigned pins)
|
||||
{
|
||||
at91_set_A_periph(AT91_PIN_PB6, 1); /* TXD1 */
|
||||
at91_set_A_periph(AT91_PIN_PB7, 0); /* RXD1 */
|
||||
at91_set_A_periph(AT91_PIN_PB28, 0); /* RTS1 */
|
||||
at91_set_A_periph(AT91_PIN_PB29, 0); /* CTS1 */
|
||||
|
||||
if (pins & ATMEL_UART_RTS)
|
||||
at91_set_A_periph(AT91_PIN_PB28, 0); /* RTS1 */
|
||||
if (pins & ATMEL_UART_CTS)
|
||||
at91_set_A_periph(AT91_PIN_PB29, 0); /* CTS1 */
|
||||
}
|
||||
|
||||
static struct resource uart2_resources[] = {
|
||||
|
@ -696,21 +818,29 @@ static struct atmel_uart_data uart2_data = {
|
|||
.use_dma_rx = 1,
|
||||
};
|
||||
|
||||
static u64 uart2_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct platform_device at91sam9260_uart2_device = {
|
||||
.name = "atmel_usart",
|
||||
.id = 3,
|
||||
.dev = {
|
||||
.platform_data = &uart2_data,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.dma_mask = &uart2_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &uart2_data,
|
||||
},
|
||||
.resource = uart2_resources,
|
||||
.num_resources = ARRAY_SIZE(uart2_resources),
|
||||
};
|
||||
|
||||
static inline void configure_usart2_pins(void)
|
||||
static inline void configure_usart2_pins(unsigned pins)
|
||||
{
|
||||
at91_set_A_periph(AT91_PIN_PB8, 1); /* TXD2 */
|
||||
at91_set_A_periph(AT91_PIN_PB9, 0); /* RXD2 */
|
||||
|
||||
if (pins & ATMEL_UART_RTS)
|
||||
at91_set_A_periph(AT91_PIN_PA4, 0); /* RTS2 */
|
||||
if (pins & ATMEL_UART_CTS)
|
||||
at91_set_A_periph(AT91_PIN_PA5, 0); /* CTS2 */
|
||||
}
|
||||
|
||||
static struct resource uart3_resources[] = {
|
||||
|
@ -731,21 +861,29 @@ static struct atmel_uart_data uart3_data = {
|
|||
.use_dma_rx = 1,
|
||||
};
|
||||
|
||||
static u64 uart3_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct platform_device at91sam9260_uart3_device = {
|
||||
.name = "atmel_usart",
|
||||
.id = 4,
|
||||
.dev = {
|
||||
.platform_data = &uart3_data,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.dma_mask = &uart3_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &uart3_data,
|
||||
},
|
||||
.resource = uart3_resources,
|
||||
.num_resources = ARRAY_SIZE(uart3_resources),
|
||||
};
|
||||
|
||||
static inline void configure_usart3_pins(void)
|
||||
static inline void configure_usart3_pins(unsigned pins)
|
||||
{
|
||||
at91_set_A_periph(AT91_PIN_PB10, 1); /* TXD3 */
|
||||
at91_set_A_periph(AT91_PIN_PB11, 0); /* RXD3 */
|
||||
|
||||
if (pins & ATMEL_UART_RTS)
|
||||
at91_set_B_periph(AT91_PIN_PC8, 0); /* RTS3 */
|
||||
if (pins & ATMEL_UART_CTS)
|
||||
at91_set_B_periph(AT91_PIN_PC10, 0); /* CTS3 */
|
||||
}
|
||||
|
||||
static struct resource uart4_resources[] = {
|
||||
|
@ -766,12 +904,15 @@ static struct atmel_uart_data uart4_data = {
|
|||
.use_dma_rx = 1,
|
||||
};
|
||||
|
||||
static u64 uart4_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct platform_device at91sam9260_uart4_device = {
|
||||
.name = "atmel_usart",
|
||||
.id = 5,
|
||||
.dev = {
|
||||
.platform_data = &uart4_data,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.dma_mask = &uart4_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &uart4_data,
|
||||
},
|
||||
.resource = uart4_resources,
|
||||
.num_resources = ARRAY_SIZE(uart4_resources),
|
||||
|
@ -801,12 +942,15 @@ static struct atmel_uart_data uart5_data = {
|
|||
.use_dma_rx = 1,
|
||||
};
|
||||
|
||||
static u64 uart5_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct platform_device at91sam9260_uart5_device = {
|
||||
.name = "atmel_usart",
|
||||
.id = 6,
|
||||
.dev = {
|
||||
.platform_data = &uart5_data,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.dma_mask = &uart5_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &uart5_data,
|
||||
},
|
||||
.resource = uart5_resources,
|
||||
.num_resources = ARRAY_SIZE(uart5_resources),
|
||||
|
@ -818,10 +962,10 @@ static inline void configure_usart5_pins(void)
|
|||
at91_set_A_periph(AT91_PIN_PB13, 0); /* RXD5 */
|
||||
}
|
||||
|
||||
struct platform_device *at91_uarts[ATMEL_MAX_UART]; /* the UARTs to use */
|
||||
static struct platform_device *at91_uarts[ATMEL_MAX_UART]; /* the UARTs to use */
|
||||
struct platform_device *atmel_default_console_device; /* the serial console device */
|
||||
|
||||
void __init at91_init_serial(struct at91_uart_config *config)
|
||||
void __init __deprecated at91_init_serial(struct at91_uart_config *config)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
@ -829,22 +973,22 @@ void __init at91_init_serial(struct at91_uart_config *config)
|
|||
for (i = 0; i < config->nr_tty; i++) {
|
||||
switch (config->tty_map[i]) {
|
||||
case 0:
|
||||
configure_usart0_pins();
|
||||
configure_usart0_pins(ATMEL_UART_CTS | ATMEL_UART_RTS | ATMEL_UART_DSR | ATMEL_UART_DTR | ATMEL_UART_DCD | ATMEL_UART_RI);
|
||||
at91_uarts[i] = &at91sam9260_uart0_device;
|
||||
at91_clock_associate("usart0_clk", &at91sam9260_uart0_device.dev, "usart");
|
||||
break;
|
||||
case 1:
|
||||
configure_usart1_pins();
|
||||
configure_usart1_pins(ATMEL_UART_CTS | ATMEL_UART_RTS);
|
||||
at91_uarts[i] = &at91sam9260_uart1_device;
|
||||
at91_clock_associate("usart1_clk", &at91sam9260_uart1_device.dev, "usart");
|
||||
break;
|
||||
case 2:
|
||||
configure_usart2_pins();
|
||||
configure_usart2_pins(0);
|
||||
at91_uarts[i] = &at91sam9260_uart2_device;
|
||||
at91_clock_associate("usart2_clk", &at91sam9260_uart2_device.dev, "usart");
|
||||
break;
|
||||
case 3:
|
||||
configure_usart3_pins();
|
||||
configure_usart3_pins(0);
|
||||
at91_uarts[i] = &at91sam9260_uart3_device;
|
||||
at91_clock_associate("usart3_clk", &at91sam9260_uart3_device.dev, "usart");
|
||||
break;
|
||||
|
@ -876,6 +1020,63 @@ void __init at91_init_serial(struct at91_uart_config *config)
|
|||
printk(KERN_INFO "AT91: No default serial console defined.\n");
|
||||
}
|
||||
|
||||
void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
|
||||
switch (id) {
|
||||
case 0: /* DBGU */
|
||||
pdev = &at91sam9260_dbgu_device;
|
||||
configure_dbgu_pins();
|
||||
at91_clock_associate("mck", &pdev->dev, "usart");
|
||||
break;
|
||||
case AT91SAM9260_ID_US0:
|
||||
pdev = &at91sam9260_uart0_device;
|
||||
configure_usart0_pins(pins);
|
||||
at91_clock_associate("usart0_clk", &pdev->dev, "usart");
|
||||
break;
|
||||
case AT91SAM9260_ID_US1:
|
||||
pdev = &at91sam9260_uart1_device;
|
||||
configure_usart1_pins(pins);
|
||||
at91_clock_associate("usart1_clk", &pdev->dev, "usart");
|
||||
break;
|
||||
case AT91SAM9260_ID_US2:
|
||||
pdev = &at91sam9260_uart2_device;
|
||||
configure_usart2_pins(pins);
|
||||
at91_clock_associate("usart2_clk", &pdev->dev, "usart");
|
||||
break;
|
||||
case AT91SAM9260_ID_US3:
|
||||
pdev = &at91sam9260_uart3_device;
|
||||
configure_usart3_pins(pins);
|
||||
at91_clock_associate("usart3_clk", &pdev->dev, "usart");
|
||||
break;
|
||||
case AT91SAM9260_ID_US4:
|
||||
pdev = &at91sam9260_uart4_device;
|
||||
configure_usart4_pins();
|
||||
at91_clock_associate("usart4_clk", &pdev->dev, "usart");
|
||||
break;
|
||||
case AT91SAM9260_ID_US5:
|
||||
pdev = &at91sam9260_uart5_device;
|
||||
configure_usart5_pins();
|
||||
at91_clock_associate("usart5_clk", &pdev->dev, "usart");
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
pdev->id = portnr; /* update to mapped ID */
|
||||
|
||||
if (portnr < ATMEL_MAX_UART)
|
||||
at91_uarts[portnr] = pdev;
|
||||
}
|
||||
|
||||
void __init at91_set_serial_console(unsigned portnr)
|
||||
{
|
||||
if (portnr < ATMEL_MAX_UART)
|
||||
atmel_default_console_device = at91_uarts[portnr];
|
||||
if (!atmel_default_console_device)
|
||||
printk(KERN_INFO "AT91: No default serial console defined.\n");
|
||||
}
|
||||
|
||||
void __init at91_add_device_serial(void)
|
||||
{
|
||||
int i;
|
||||
|
@ -886,7 +1087,9 @@ void __init at91_add_device_serial(void)
|
|||
}
|
||||
}
|
||||
#else
|
||||
void __init at91_init_serial(struct at91_uart_config *config) {}
|
||||
void __init __deprecated at91_init_serial(struct at91_uart_config *config) {}
|
||||
void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) {}
|
||||
void __init at91_set_serial_console(unsigned portnr) {}
|
||||
void __init at91_add_device_serial(void) {}
|
||||
#endif
|
||||
|
||||
|
@ -898,6 +1101,8 @@ void __init at91_add_device_serial(void) {}
|
|||
*/
|
||||
static int __init at91_add_standard_devices(void)
|
||||
{
|
||||
at91_add_device_rtt();
|
||||
at91_add_device_watchdog();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -279,25 +279,25 @@ void __init at91sam9261_initialize(unsigned long main_clock)
|
|||
static unsigned int at91sam9261_default_irq_priority[NR_AIC_IRQS] __initdata = {
|
||||
7, /* Advanced Interrupt Controller */
|
||||
7, /* System Peripherals */
|
||||
0, /* Parallel IO Controller A */
|
||||
0, /* Parallel IO Controller B */
|
||||
0, /* Parallel IO Controller C */
|
||||
1, /* Parallel IO Controller A */
|
||||
1, /* Parallel IO Controller B */
|
||||
1, /* Parallel IO Controller C */
|
||||
0,
|
||||
6, /* USART 0 */
|
||||
6, /* USART 1 */
|
||||
6, /* USART 2 */
|
||||
5, /* USART 0 */
|
||||
5, /* USART 1 */
|
||||
5, /* USART 2 */
|
||||
0, /* Multimedia Card Interface */
|
||||
4, /* USB Device Port */
|
||||
0, /* Two-Wire Interface */
|
||||
6, /* Serial Peripheral Interface 0 */
|
||||
6, /* Serial Peripheral Interface 1 */
|
||||
5, /* Serial Synchronous Controller 0 */
|
||||
5, /* Serial Synchronous Controller 1 */
|
||||
5, /* Serial Synchronous Controller 2 */
|
||||
2, /* USB Device Port */
|
||||
6, /* Two-Wire Interface */
|
||||
5, /* Serial Peripheral Interface 0 */
|
||||
5, /* Serial Peripheral Interface 1 */
|
||||
4, /* Serial Synchronous Controller 0 */
|
||||
4, /* Serial Synchronous Controller 1 */
|
||||
4, /* Serial Synchronous Controller 2 */
|
||||
0, /* Timer Counter 0 */
|
||||
0, /* Timer Counter 1 */
|
||||
0, /* Timer Counter 2 */
|
||||
3, /* USB Host port */
|
||||
2, /* USB Host port */
|
||||
3, /* LCD Controller */
|
||||
0,
|
||||
0,
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/i2c-gpio.h>
|
||||
|
||||
|
@ -33,7 +34,7 @@
|
|||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
|
||||
static u64 ohci_dmamask = 0xffffffffUL;
|
||||
static u64 ohci_dmamask = DMA_BIT_MASK(32);
|
||||
static struct at91_usbh_data usbh_data;
|
||||
|
||||
static struct resource usbh_resources[] = {
|
||||
|
@ -54,7 +55,7 @@ static struct platform_device at91sam9261_usbh_device = {
|
|||
.id = -1,
|
||||
.dev = {
|
||||
.dma_mask = &ohci_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &usbh_data,
|
||||
},
|
||||
.resource = usbh_resources,
|
||||
|
@ -106,8 +107,6 @@ static struct platform_device at91sam9261_udc_device = {
|
|||
|
||||
void __init at91_add_device_udc(struct at91_udc_data *data)
|
||||
{
|
||||
unsigned long x;
|
||||
|
||||
if (!data)
|
||||
return;
|
||||
|
||||
|
@ -116,9 +115,7 @@ void __init at91_add_device_udc(struct at91_udc_data *data)
|
|||
at91_set_deglitch(data->vbus_pin, 1);
|
||||
}
|
||||
|
||||
/* Pullup pin is handled internally */
|
||||
x = at91_sys_read(AT91_MATRIX_USBPUCR);
|
||||
at91_sys_write(AT91_MATRIX_USBPUCR, x | AT91_MATRIX_USBPUCR_PUON);
|
||||
/* Pullup pin is handled internally by USB device peripheral */
|
||||
|
||||
udc_data = *data;
|
||||
platform_device_register(&at91sam9261_udc_device);
|
||||
|
@ -132,7 +129,7 @@ void __init at91_add_device_udc(struct at91_udc_data *data) {}
|
|||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_MMC_AT91) || defined(CONFIG_MMC_AT91_MODULE)
|
||||
static u64 mmc_dmamask = 0xffffffffUL;
|
||||
static u64 mmc_dmamask = DMA_BIT_MASK(32);
|
||||
static struct at91_mmc_data mmc_data;
|
||||
|
||||
static struct resource mmc_resources[] = {
|
||||
|
@ -153,7 +150,7 @@ static struct platform_device at91sam9261_mmc_device = {
|
|||
.id = -1,
|
||||
.dev = {
|
||||
.dma_mask = &mmc_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &mmc_data,
|
||||
},
|
||||
.resource = mmc_resources,
|
||||
|
@ -232,7 +229,7 @@ void __init at91_add_device_nand(struct at91_nand_data *data)
|
|||
return;
|
||||
|
||||
csa = at91_sys_read(AT91_MATRIX_EBICSA);
|
||||
at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_CS3A_SMC);
|
||||
at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_CS3A_SMC_SMARTMEDIA);
|
||||
|
||||
/* set the bus interface characteristics */
|
||||
at91_sys_write(AT91_SMC_SETUP(3), AT91_SMC_NWESETUP_(0) | AT91_SMC_NCS_WRSETUP_(0)
|
||||
|
@ -354,7 +351,7 @@ void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices)
|
|||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_SPI_ATMEL) || defined(CONFIG_SPI_ATMEL_MODULE)
|
||||
static u64 spi_dmamask = 0xffffffffUL;
|
||||
static u64 spi_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct resource spi0_resources[] = {
|
||||
[0] = {
|
||||
|
@ -374,7 +371,7 @@ static struct platform_device at91sam9261_spi0_device = {
|
|||
.id = 0,
|
||||
.dev = {
|
||||
.dma_mask = &spi_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
.resource = spi0_resources,
|
||||
.num_resources = ARRAY_SIZE(spi0_resources),
|
||||
|
@ -400,7 +397,7 @@ static struct platform_device at91sam9261_spi1_device = {
|
|||
.id = 1,
|
||||
.dev = {
|
||||
.dma_mask = &spi_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
.resource = spi1_resources,
|
||||
.num_resources = ARRAY_SIZE(spi1_resources),
|
||||
|
@ -466,7 +463,7 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)
|
|||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE)
|
||||
static u64 lcdc_dmamask = 0xffffffffUL;
|
||||
static u64 lcdc_dmamask = DMA_BIT_MASK(32);
|
||||
static struct atmel_lcdfb_info lcdc_data;
|
||||
|
||||
static struct resource lcdc_resources[] = {
|
||||
|
@ -494,7 +491,7 @@ static struct platform_device at91_lcdc_device = {
|
|||
.id = 0,
|
||||
.dev = {
|
||||
.dma_mask = &lcdc_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &lcdc_data,
|
||||
},
|
||||
.resource = lcdc_resources,
|
||||
|
@ -507,6 +504,17 @@ void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data)
|
|||
return;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_FB_ATMEL_STN)
|
||||
at91_set_A_periph(AT91_PIN_PB0, 0); /* LCDVSYNC */
|
||||
at91_set_A_periph(AT91_PIN_PB1, 0); /* LCDHSYNC */
|
||||
at91_set_A_periph(AT91_PIN_PB2, 0); /* LCDDOTCK */
|
||||
at91_set_A_periph(AT91_PIN_PB3, 0); /* LCDDEN */
|
||||
at91_set_A_periph(AT91_PIN_PB4, 0); /* LCDCC */
|
||||
at91_set_A_periph(AT91_PIN_PB5, 0); /* LCDD0 */
|
||||
at91_set_A_periph(AT91_PIN_PB6, 0); /* LCDD1 */
|
||||
at91_set_A_periph(AT91_PIN_PB7, 0); /* LCDD2 */
|
||||
at91_set_A_periph(AT91_PIN_PB8, 0); /* LCDD3 */
|
||||
#else
|
||||
at91_set_A_periph(AT91_PIN_PB1, 0); /* LCDHSYNC */
|
||||
at91_set_A_periph(AT91_PIN_PB2, 0); /* LCDDOTCK */
|
||||
at91_set_A_periph(AT91_PIN_PB3, 0); /* LCDDEN */
|
||||
|
@ -529,6 +537,7 @@ void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data)
|
|||
at91_set_B_periph(AT91_PIN_PB26, 0); /* LCDD21 */
|
||||
at91_set_B_periph(AT91_PIN_PB27, 0); /* LCDD22 */
|
||||
at91_set_B_periph(AT91_PIN_PB28, 0); /* LCDD23 */
|
||||
#endif
|
||||
|
||||
lcdc_data = *data;
|
||||
platform_device_register(&at91_lcdc_device);
|
||||
|
@ -539,24 +548,220 @@ void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data) {}
|
|||
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* LEDs
|
||||
* RTT
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_LEDS)
|
||||
u8 at91_leds_cpu;
|
||||
u8 at91_leds_timer;
|
||||
static struct resource rtt_resources[] = {
|
||||
{
|
||||
.start = AT91_BASE_SYS + AT91_RTT,
|
||||
.end = AT91_BASE_SYS + AT91_RTT + SZ_16 - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}
|
||||
};
|
||||
|
||||
void __init at91_init_leds(u8 cpu_led, u8 timer_led)
|
||||
static struct platform_device at91sam9261_rtt_device = {
|
||||
.name = "at91_rtt",
|
||||
.id = -1,
|
||||
.resource = rtt_resources,
|
||||
.num_resources = ARRAY_SIZE(rtt_resources),
|
||||
};
|
||||
|
||||
static void __init at91_add_device_rtt(void)
|
||||
{
|
||||
/* Enable GPIO to access the LEDs */
|
||||
at91_set_gpio_output(cpu_led, 1);
|
||||
at91_set_gpio_output(timer_led, 1);
|
||||
platform_device_register(&at91sam9261_rtt_device);
|
||||
}
|
||||
|
||||
at91_leds_cpu = cpu_led;
|
||||
at91_leds_timer = timer_led;
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* Watchdog
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE)
|
||||
static struct platform_device at91sam9261_wdt_device = {
|
||||
.name = "at91_wdt",
|
||||
.id = -1,
|
||||
.num_resources = 0,
|
||||
};
|
||||
|
||||
static void __init at91_add_device_watchdog(void)
|
||||
{
|
||||
platform_device_register(&at91sam9261_wdt_device);
|
||||
}
|
||||
#else
|
||||
void __init at91_init_leds(u8 cpu_led, u8 timer_led) {}
|
||||
static void __init at91_add_device_watchdog(void) {}
|
||||
#endif
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* SSC -- Synchronous Serial Controller
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_ATMEL_SSC) || defined(CONFIG_ATMEL_SSC_MODULE)
|
||||
static u64 ssc0_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct resource ssc0_resources[] = {
|
||||
[0] = {
|
||||
.start = AT91SAM9261_BASE_SSC0,
|
||||
.end = AT91SAM9261_BASE_SSC0 + SZ_16K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = AT91SAM9261_ID_SSC0,
|
||||
.end = AT91SAM9261_ID_SSC0,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device at91sam9261_ssc0_device = {
|
||||
.name = "ssc",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.dma_mask = &ssc0_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
.resource = ssc0_resources,
|
||||
.num_resources = ARRAY_SIZE(ssc0_resources),
|
||||
};
|
||||
|
||||
static inline void configure_ssc0_pins(unsigned pins)
|
||||
{
|
||||
if (pins & ATMEL_SSC_TF)
|
||||
at91_set_A_periph(AT91_PIN_PB21, 1);
|
||||
if (pins & ATMEL_SSC_TK)
|
||||
at91_set_A_periph(AT91_PIN_PB22, 1);
|
||||
if (pins & ATMEL_SSC_TD)
|
||||
at91_set_A_periph(AT91_PIN_PB23, 1);
|
||||
if (pins & ATMEL_SSC_RD)
|
||||
at91_set_A_periph(AT91_PIN_PB24, 1);
|
||||
if (pins & ATMEL_SSC_RK)
|
||||
at91_set_A_periph(AT91_PIN_PB25, 1);
|
||||
if (pins & ATMEL_SSC_RF)
|
||||
at91_set_A_periph(AT91_PIN_PB26, 1);
|
||||
}
|
||||
|
||||
static u64 ssc1_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct resource ssc1_resources[] = {
|
||||
[0] = {
|
||||
.start = AT91SAM9261_BASE_SSC1,
|
||||
.end = AT91SAM9261_BASE_SSC1 + SZ_16K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = AT91SAM9261_ID_SSC1,
|
||||
.end = AT91SAM9261_ID_SSC1,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device at91sam9261_ssc1_device = {
|
||||
.name = "ssc",
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.dma_mask = &ssc1_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
.resource = ssc1_resources,
|
||||
.num_resources = ARRAY_SIZE(ssc1_resources),
|
||||
};
|
||||
|
||||
static inline void configure_ssc1_pins(unsigned pins)
|
||||
{
|
||||
if (pins & ATMEL_SSC_TF)
|
||||
at91_set_B_periph(AT91_PIN_PA17, 1);
|
||||
if (pins & ATMEL_SSC_TK)
|
||||
at91_set_B_periph(AT91_PIN_PA18, 1);
|
||||
if (pins & ATMEL_SSC_TD)
|
||||
at91_set_B_periph(AT91_PIN_PA19, 1);
|
||||
if (pins & ATMEL_SSC_RD)
|
||||
at91_set_B_periph(AT91_PIN_PA20, 1);
|
||||
if (pins & ATMEL_SSC_RK)
|
||||
at91_set_B_periph(AT91_PIN_PA21, 1);
|
||||
if (pins & ATMEL_SSC_RF)
|
||||
at91_set_B_periph(AT91_PIN_PA22, 1);
|
||||
}
|
||||
|
||||
static u64 ssc2_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct resource ssc2_resources[] = {
|
||||
[0] = {
|
||||
.start = AT91SAM9261_BASE_SSC2,
|
||||
.end = AT91SAM9261_BASE_SSC2 + SZ_16K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = AT91SAM9261_ID_SSC2,
|
||||
.end = AT91SAM9261_ID_SSC2,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device at91sam9261_ssc2_device = {
|
||||
.name = "ssc",
|
||||
.id = 2,
|
||||
.dev = {
|
||||
.dma_mask = &ssc2_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
.resource = ssc2_resources,
|
||||
.num_resources = ARRAY_SIZE(ssc2_resources),
|
||||
};
|
||||
|
||||
static inline void configure_ssc2_pins(unsigned pins)
|
||||
{
|
||||
if (pins & ATMEL_SSC_TF)
|
||||
at91_set_B_periph(AT91_PIN_PC25, 1);
|
||||
if (pins & ATMEL_SSC_TK)
|
||||
at91_set_B_periph(AT91_PIN_PC26, 1);
|
||||
if (pins & ATMEL_SSC_TD)
|
||||
at91_set_B_periph(AT91_PIN_PC27, 1);
|
||||
if (pins & ATMEL_SSC_RD)
|
||||
at91_set_B_periph(AT91_PIN_PC28, 1);
|
||||
if (pins & ATMEL_SSC_RK)
|
||||
at91_set_B_periph(AT91_PIN_PC29, 1);
|
||||
if (pins & ATMEL_SSC_RF)
|
||||
at91_set_B_periph(AT91_PIN_PC30, 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* SSC controllers are accessed through library code, instead of any
|
||||
* kind of all-singing/all-dancing driver. For example one could be
|
||||
* used by a particular I2S audio codec's driver, while another one
|
||||
* on the same system might be used by a custom data capture driver.
|
||||
*/
|
||||
void __init at91_add_device_ssc(unsigned id, unsigned pins)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
|
||||
/*
|
||||
* NOTE: caller is responsible for passing information matching
|
||||
* "pins" to whatever will be using each particular controller.
|
||||
*/
|
||||
switch (id) {
|
||||
case AT91SAM9261_ID_SSC0:
|
||||
pdev = &at91sam9261_ssc0_device;
|
||||
configure_ssc0_pins(pins);
|
||||
at91_clock_associate("ssc0_clk", &pdev->dev, "pclk");
|
||||
break;
|
||||
case AT91SAM9261_ID_SSC1:
|
||||
pdev = &at91sam9261_ssc1_device;
|
||||
configure_ssc1_pins(pins);
|
||||
at91_clock_associate("ssc1_clk", &pdev->dev, "pclk");
|
||||
break;
|
||||
case AT91SAM9261_ID_SSC2:
|
||||
pdev = &at91sam9261_ssc2_device;
|
||||
configure_ssc2_pins(pins);
|
||||
at91_clock_associate("ssc2_clk", &pdev->dev, "pclk");
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
platform_device_register(pdev);
|
||||
}
|
||||
|
||||
#else
|
||||
void __init at91_add_device_ssc(unsigned id, unsigned pins) {}
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -584,12 +789,15 @@ static struct atmel_uart_data dbgu_data = {
|
|||
.regs = (void __iomem *)(AT91_VA_BASE_SYS + AT91_DBGU),
|
||||
};
|
||||
|
||||
static u64 dbgu_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct platform_device at91sam9261_dbgu_device = {
|
||||
.name = "atmel_usart",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &dbgu_data,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.dma_mask = &dbgu_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &dbgu_data,
|
||||
},
|
||||
.resource = dbgu_resources,
|
||||
.num_resources = ARRAY_SIZE(dbgu_resources),
|
||||
|
@ -619,23 +827,29 @@ static struct atmel_uart_data uart0_data = {
|
|||
.use_dma_rx = 1,
|
||||
};
|
||||
|
||||
static u64 uart0_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct platform_device at91sam9261_uart0_device = {
|
||||
.name = "atmel_usart",
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.platform_data = &uart0_data,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.dma_mask = &uart0_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &uart0_data,
|
||||
},
|
||||
.resource = uart0_resources,
|
||||
.num_resources = ARRAY_SIZE(uart0_resources),
|
||||
};
|
||||
|
||||
static inline void configure_usart0_pins(void)
|
||||
static inline void configure_usart0_pins(unsigned pins)
|
||||
{
|
||||
at91_set_A_periph(AT91_PIN_PC8, 1); /* TXD0 */
|
||||
at91_set_A_periph(AT91_PIN_PC9, 0); /* RXD0 */
|
||||
at91_set_A_periph(AT91_PIN_PC10, 0); /* RTS0 */
|
||||
at91_set_A_periph(AT91_PIN_PC11, 0); /* CTS0 */
|
||||
|
||||
if (pins & ATMEL_UART_RTS)
|
||||
at91_set_A_periph(AT91_PIN_PC10, 0); /* RTS0 */
|
||||
if (pins & ATMEL_UART_CTS)
|
||||
at91_set_A_periph(AT91_PIN_PC11, 0); /* CTS0 */
|
||||
}
|
||||
|
||||
static struct resource uart1_resources[] = {
|
||||
|
@ -656,21 +870,29 @@ static struct atmel_uart_data uart1_data = {
|
|||
.use_dma_rx = 1,
|
||||
};
|
||||
|
||||
static u64 uart1_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct platform_device at91sam9261_uart1_device = {
|
||||
.name = "atmel_usart",
|
||||
.id = 2,
|
||||
.dev = {
|
||||
.platform_data = &uart1_data,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.dma_mask = &uart1_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &uart1_data,
|
||||
},
|
||||
.resource = uart1_resources,
|
||||
.num_resources = ARRAY_SIZE(uart1_resources),
|
||||
};
|
||||
|
||||
static inline void configure_usart1_pins(void)
|
||||
static inline void configure_usart1_pins(unsigned pins)
|
||||
{
|
||||
at91_set_A_periph(AT91_PIN_PC12, 1); /* TXD1 */
|
||||
at91_set_A_periph(AT91_PIN_PC13, 0); /* RXD1 */
|
||||
|
||||
if (pins & ATMEL_UART_RTS)
|
||||
at91_set_B_periph(AT91_PIN_PA12, 0); /* RTS1 */
|
||||
if (pins & ATMEL_UART_CTS)
|
||||
at91_set_B_periph(AT91_PIN_PA13, 0); /* CTS1 */
|
||||
}
|
||||
|
||||
static struct resource uart2_resources[] = {
|
||||
|
@ -691,27 +913,35 @@ static struct atmel_uart_data uart2_data = {
|
|||
.use_dma_rx = 1,
|
||||
};
|
||||
|
||||
static u64 uart2_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct platform_device at91sam9261_uart2_device = {
|
||||
.name = "atmel_usart",
|
||||
.id = 3,
|
||||
.dev = {
|
||||
.platform_data = &uart2_data,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.dma_mask = &uart2_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &uart2_data,
|
||||
},
|
||||
.resource = uart2_resources,
|
||||
.num_resources = ARRAY_SIZE(uart2_resources),
|
||||
};
|
||||
|
||||
static inline void configure_usart2_pins(void)
|
||||
static inline void configure_usart2_pins(unsigned pins)
|
||||
{
|
||||
at91_set_A_periph(AT91_PIN_PC15, 0); /* RXD2 */
|
||||
at91_set_A_periph(AT91_PIN_PC14, 1); /* TXD2 */
|
||||
|
||||
if (pins & ATMEL_UART_RTS)
|
||||
at91_set_B_periph(AT91_PIN_PA15, 0); /* RTS2*/
|
||||
if (pins & ATMEL_UART_CTS)
|
||||
at91_set_B_periph(AT91_PIN_PA16, 0); /* CTS2 */
|
||||
}
|
||||
|
||||
struct platform_device *at91_uarts[ATMEL_MAX_UART]; /* the UARTs to use */
|
||||
static struct platform_device *at91_uarts[ATMEL_MAX_UART]; /* the UARTs to use */
|
||||
struct platform_device *atmel_default_console_device; /* the serial console device */
|
||||
|
||||
void __init at91_init_serial(struct at91_uart_config *config)
|
||||
void __init __deprecated at91_init_serial(struct at91_uart_config *config)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
@ -719,17 +949,17 @@ void __init at91_init_serial(struct at91_uart_config *config)
|
|||
for (i = 0; i < config->nr_tty; i++) {
|
||||
switch (config->tty_map[i]) {
|
||||
case 0:
|
||||
configure_usart0_pins();
|
||||
configure_usart0_pins(ATMEL_UART_CTS | ATMEL_UART_RTS);
|
||||
at91_uarts[i] = &at91sam9261_uart0_device;
|
||||
at91_clock_associate("usart0_clk", &at91sam9261_uart0_device.dev, "usart");
|
||||
break;
|
||||
case 1:
|
||||
configure_usart1_pins();
|
||||
configure_usart1_pins(0);
|
||||
at91_uarts[i] = &at91sam9261_uart1_device;
|
||||
at91_clock_associate("usart1_clk", &at91sam9261_uart1_device.dev, "usart");
|
||||
break;
|
||||
case 2:
|
||||
configure_usart2_pins();
|
||||
configure_usart2_pins(0);
|
||||
at91_uarts[i] = &at91sam9261_uart2_device;
|
||||
at91_clock_associate("usart2_clk", &at91sam9261_uart2_device.dev, "usart");
|
||||
break;
|
||||
|
@ -751,6 +981,48 @@ void __init at91_init_serial(struct at91_uart_config *config)
|
|||
printk(KERN_INFO "AT91: No default serial console defined.\n");
|
||||
}
|
||||
|
||||
void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
|
||||
switch (id) {
|
||||
case 0: /* DBGU */
|
||||
pdev = &at91sam9261_dbgu_device;
|
||||
configure_dbgu_pins();
|
||||
at91_clock_associate("mck", &pdev->dev, "usart");
|
||||
break;
|
||||
case AT91SAM9261_ID_US0:
|
||||
pdev = &at91sam9261_uart0_device;
|
||||
configure_usart0_pins(pins);
|
||||
at91_clock_associate("usart0_clk", &pdev->dev, "usart");
|
||||
break;
|
||||
case AT91SAM9261_ID_US1:
|
||||
pdev = &at91sam9261_uart1_device;
|
||||
configure_usart1_pins(pins);
|
||||
at91_clock_associate("usart1_clk", &pdev->dev, "usart");
|
||||
break;
|
||||
case AT91SAM9261_ID_US2:
|
||||
pdev = &at91sam9261_uart2_device;
|
||||
configure_usart2_pins(pins);
|
||||
at91_clock_associate("usart2_clk", &pdev->dev, "usart");
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
pdev->id = portnr; /* update to mapped ID */
|
||||
|
||||
if (portnr < ATMEL_MAX_UART)
|
||||
at91_uarts[portnr] = pdev;
|
||||
}
|
||||
|
||||
void __init at91_set_serial_console(unsigned portnr)
|
||||
{
|
||||
if (portnr < ATMEL_MAX_UART)
|
||||
atmel_default_console_device = at91_uarts[portnr];
|
||||
if (!atmel_default_console_device)
|
||||
printk(KERN_INFO "AT91: No default serial console defined.\n");
|
||||
}
|
||||
|
||||
void __init at91_add_device_serial(void)
|
||||
{
|
||||
int i;
|
||||
|
@ -761,7 +1033,9 @@ void __init at91_add_device_serial(void)
|
|||
}
|
||||
}
|
||||
#else
|
||||
void __init at91_init_serial(struct at91_uart_config *config) {}
|
||||
void __init __deprecated at91_init_serial(struct at91_uart_config *config) {}
|
||||
void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) {}
|
||||
void __init at91_set_serial_console(unsigned portnr) {}
|
||||
void __init at91_add_device_serial(void) {}
|
||||
#endif
|
||||
|
||||
|
@ -774,6 +1048,8 @@ void __init at91_add_device_serial(void) {}
|
|||
*/
|
||||
static int __init at91_add_standard_devices(void)
|
||||
{
|
||||
at91_add_device_rtt();
|
||||
at91_add_device_watchdog();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -304,34 +304,34 @@ void __init at91sam9263_initialize(unsigned long main_clock)
|
|||
static unsigned int at91sam9263_default_irq_priority[NR_AIC_IRQS] __initdata = {
|
||||
7, /* Advanced Interrupt Controller (FIQ) */
|
||||
7, /* System Peripherals */
|
||||
0, /* Parallel IO Controller A */
|
||||
0, /* Parallel IO Controller B */
|
||||
0, /* Parallel IO Controller C, D and E */
|
||||
1, /* Parallel IO Controller A */
|
||||
1, /* Parallel IO Controller B */
|
||||
1, /* Parallel IO Controller C, D and E */
|
||||
0,
|
||||
0,
|
||||
6, /* USART 0 */
|
||||
6, /* USART 1 */
|
||||
6, /* USART 2 */
|
||||
5, /* USART 0 */
|
||||
5, /* USART 1 */
|
||||
5, /* USART 2 */
|
||||
0, /* Multimedia Card Interface 0 */
|
||||
0, /* Multimedia Card Interface 1 */
|
||||
4, /* CAN */
|
||||
0, /* Two-Wire Interface */
|
||||
6, /* Serial Peripheral Interface 0 */
|
||||
6, /* Serial Peripheral Interface 1 */
|
||||
5, /* Serial Synchronous Controller 0 */
|
||||
5, /* Serial Synchronous Controller 1 */
|
||||
6, /* AC97 Controller */
|
||||
3, /* CAN */
|
||||
6, /* Two-Wire Interface */
|
||||
5, /* Serial Peripheral Interface 0 */
|
||||
5, /* Serial Peripheral Interface 1 */
|
||||
4, /* Serial Synchronous Controller 0 */
|
||||
4, /* Serial Synchronous Controller 1 */
|
||||
5, /* AC97 Controller */
|
||||
0, /* Timer Counter 0, 1 and 2 */
|
||||
0, /* Pulse Width Modulation Controller */
|
||||
3, /* Ethernet */
|
||||
0,
|
||||
0, /* 2D Graphic Engine */
|
||||
3, /* USB Device Port */
|
||||
2, /* USB Device Port */
|
||||
0, /* Image Sensor Interface */
|
||||
3, /* LDC Controller */
|
||||
0, /* DMA Controller */
|
||||
0,
|
||||
3, /* USB Host port */
|
||||
2, /* USB Host port */
|
||||
0, /* Advanced Interrupt Controller (IRQ0) */
|
||||
0, /* Advanced Interrupt Controller (IRQ1) */
|
||||
};
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/i2c-gpio.h>
|
||||
|
||||
|
@ -32,7 +33,7 @@
|
|||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_USB_OHCI_HCD) || defined(CONFIG_USB_OHCI_HCD_MODULE)
|
||||
static u64 ohci_dmamask = 0xffffffffUL;
|
||||
static u64 ohci_dmamask = DMA_BIT_MASK(32);
|
||||
static struct at91_usbh_data usbh_data;
|
||||
|
||||
static struct resource usbh_resources[] = {
|
||||
|
@ -53,7 +54,7 @@ static struct platform_device at91_usbh_device = {
|
|||
.id = -1,
|
||||
.dev = {
|
||||
.dma_mask = &ohci_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &usbh_data,
|
||||
},
|
||||
.resource = usbh_resources,
|
||||
|
@ -136,7 +137,7 @@ void __init at91_add_device_udc(struct at91_udc_data *data) {}
|
|||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_MACB) || defined(CONFIG_MACB_MODULE)
|
||||
static u64 eth_dmamask = 0xffffffffUL;
|
||||
static u64 eth_dmamask = DMA_BIT_MASK(32);
|
||||
static struct at91_eth_data eth_data;
|
||||
|
||||
static struct resource eth_resources[] = {
|
||||
|
@ -157,7 +158,7 @@ static struct platform_device at91sam9263_eth_device = {
|
|||
.id = -1,
|
||||
.dev = {
|
||||
.dma_mask = ð_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = ð_data,
|
||||
},
|
||||
.resource = eth_resources,
|
||||
|
@ -210,7 +211,7 @@ void __init at91_add_device_eth(struct at91_eth_data *data) {}
|
|||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_MMC_AT91) || defined(CONFIG_MMC_AT91_MODULE)
|
||||
static u64 mmc_dmamask = 0xffffffffUL;
|
||||
static u64 mmc_dmamask = DMA_BIT_MASK(32);
|
||||
static struct at91_mmc_data mmc0_data, mmc1_data;
|
||||
|
||||
static struct resource mmc0_resources[] = {
|
||||
|
@ -231,7 +232,7 @@ static struct platform_device at91sam9263_mmc0_device = {
|
|||
.id = 0,
|
||||
.dev = {
|
||||
.dma_mask = &mmc_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &mmc0_data,
|
||||
},
|
||||
.resource = mmc0_resources,
|
||||
|
@ -256,7 +257,7 @@ static struct platform_device at91sam9263_mmc1_device = {
|
|||
.id = 1,
|
||||
.dev = {
|
||||
.dma_mask = &mmc_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &mmc1_data,
|
||||
},
|
||||
.resource = mmc1_resources,
|
||||
|
@ -382,7 +383,7 @@ void __init at91_add_device_nand(struct at91_nand_data *data)
|
|||
return;
|
||||
|
||||
csa = at91_sys_read(AT91_MATRIX_EBI0CSA);
|
||||
at91_sys_write(AT91_MATRIX_EBI0CSA, csa | AT91_MATRIX_EBI0_CS3A_SMC);
|
||||
at91_sys_write(AT91_MATRIX_EBI0CSA, csa | AT91_MATRIX_EBI0_CS3A_SMC_SMARTMEDIA);
|
||||
|
||||
/* set the bus interface characteristics */
|
||||
at91_sys_write(AT91_SMC_SETUP(3), AT91_SMC_NWESETUP_(0) | AT91_SMC_NCS_WRSETUP_(0)
|
||||
|
@ -500,7 +501,7 @@ void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices)
|
|||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_SPI_ATMEL) || defined(CONFIG_SPI_ATMEL_MODULE)
|
||||
static u64 spi_dmamask = 0xffffffffUL;
|
||||
static u64 spi_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct resource spi0_resources[] = {
|
||||
[0] = {
|
||||
|
@ -520,7 +521,7 @@ static struct platform_device at91sam9263_spi0_device = {
|
|||
.id = 0,
|
||||
.dev = {
|
||||
.dma_mask = &spi_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
.resource = spi0_resources,
|
||||
.num_resources = ARRAY_SIZE(spi0_resources),
|
||||
|
@ -546,7 +547,7 @@ static struct platform_device at91sam9263_spi1_device = {
|
|||
.id = 1,
|
||||
.dev = {
|
||||
.dma_mask = &spi_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
.resource = spi1_resources,
|
||||
.num_resources = ARRAY_SIZE(spi1_resources),
|
||||
|
@ -612,7 +613,7 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)
|
|||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_SND_AT91_AC97) || defined(CONFIG_SND_AT91_AC97_MODULE)
|
||||
static u64 ac97_dmamask = 0xffffffffUL;
|
||||
static u64 ac97_dmamask = DMA_BIT_MASK(32);
|
||||
static struct atmel_ac97_data ac97_data;
|
||||
|
||||
static struct resource ac97_resources[] = {
|
||||
|
@ -633,7 +634,7 @@ static struct platform_device at91sam9263_ac97_device = {
|
|||
.id = 1,
|
||||
.dev = {
|
||||
.dma_mask = &ac97_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &ac97_data,
|
||||
},
|
||||
.resource = ac97_resources,
|
||||
|
@ -667,7 +668,7 @@ void __init at91_add_device_ac97(struct atmel_ac97_data *data) {}
|
|||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE)
|
||||
static u64 lcdc_dmamask = 0xffffffffUL;
|
||||
static u64 lcdc_dmamask = DMA_BIT_MASK(32);
|
||||
static struct atmel_lcdfb_info lcdc_data;
|
||||
|
||||
static struct resource lcdc_resources[] = {
|
||||
|
@ -688,7 +689,7 @@ static struct platform_device at91_lcdc_device = {
|
|||
.id = 0,
|
||||
.dev = {
|
||||
.dma_mask = &lcdc_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &lcdc_data,
|
||||
},
|
||||
.resource = lcdc_resources,
|
||||
|
@ -732,24 +733,242 @@ void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data) {}
|
|||
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* LEDs
|
||||
* Image Sensor Interface
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_LEDS)
|
||||
u8 at91_leds_cpu;
|
||||
u8 at91_leds_timer;
|
||||
#if defined(CONFIG_VIDEO_AT91_ISI) || defined(CONFIG_VIDEO_AT91_ISI_MODULE)
|
||||
|
||||
void __init at91_init_leds(u8 cpu_led, u8 timer_led)
|
||||
struct resource isi_resources[] = {
|
||||
[0] = {
|
||||
.start = AT91SAM9263_BASE_ISI,
|
||||
.end = AT91SAM9263_BASE_ISI + SZ_16K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = AT91SAM9263_ID_ISI,
|
||||
.end = AT91SAM9263_ID_ISI,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device at91sam9263_isi_device = {
|
||||
.name = "at91_isi",
|
||||
.id = -1,
|
||||
.resource = isi_resources,
|
||||
.num_resources = ARRAY_SIZE(isi_resources),
|
||||
};
|
||||
|
||||
void __init at91_add_device_isi(void)
|
||||
{
|
||||
/* Enable GPIO to access the LEDs */
|
||||
at91_set_gpio_output(cpu_led, 1);
|
||||
at91_set_gpio_output(timer_led, 1);
|
||||
|
||||
at91_leds_cpu = cpu_led;
|
||||
at91_leds_timer = timer_led;
|
||||
at91_set_A_periph(AT91_PIN_PE0, 0); /* ISI_D0 */
|
||||
at91_set_A_periph(AT91_PIN_PE1, 0); /* ISI_D1 */
|
||||
at91_set_A_periph(AT91_PIN_PE2, 0); /* ISI_D2 */
|
||||
at91_set_A_periph(AT91_PIN_PE3, 0); /* ISI_D3 */
|
||||
at91_set_A_periph(AT91_PIN_PE4, 0); /* ISI_D4 */
|
||||
at91_set_A_periph(AT91_PIN_PE5, 0); /* ISI_D5 */
|
||||
at91_set_A_periph(AT91_PIN_PE6, 0); /* ISI_D6 */
|
||||
at91_set_A_periph(AT91_PIN_PE7, 0); /* ISI_D7 */
|
||||
at91_set_A_periph(AT91_PIN_PE8, 0); /* ISI_PCK */
|
||||
at91_set_A_periph(AT91_PIN_PE9, 0); /* ISI_HSYNC */
|
||||
at91_set_A_periph(AT91_PIN_PE10, 0); /* ISI_VSYNC */
|
||||
at91_set_B_periph(AT91_PIN_PE11, 0); /* ISI_MCK (PCK3) */
|
||||
at91_set_B_periph(AT91_PIN_PE12, 0); /* ISI_PD8 */
|
||||
at91_set_B_periph(AT91_PIN_PE13, 0); /* ISI_PD9 */
|
||||
at91_set_B_periph(AT91_PIN_PE14, 0); /* ISI_PD10 */
|
||||
at91_set_B_periph(AT91_PIN_PE15, 0); /* ISI_PD11 */
|
||||
}
|
||||
#else
|
||||
void __init at91_init_leds(u8 cpu_led, u8 timer_led) {}
|
||||
void __init at91_add_device_isi(void) {}
|
||||
#endif
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* RTT
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
static struct resource rtt0_resources[] = {
|
||||
{
|
||||
.start = AT91_BASE_SYS + AT91_RTT0,
|
||||
.end = AT91_BASE_SYS + AT91_RTT0 + SZ_16 - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}
|
||||
};
|
||||
|
||||
static struct platform_device at91sam9263_rtt0_device = {
|
||||
.name = "at91_rtt",
|
||||
.id = 0,
|
||||
.resource = rtt0_resources,
|
||||
.num_resources = ARRAY_SIZE(rtt0_resources),
|
||||
};
|
||||
|
||||
static struct resource rtt1_resources[] = {
|
||||
{
|
||||
.start = AT91_BASE_SYS + AT91_RTT1,
|
||||
.end = AT91_BASE_SYS + AT91_RTT1 + SZ_16 - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}
|
||||
};
|
||||
|
||||
static struct platform_device at91sam9263_rtt1_device = {
|
||||
.name = "at91_rtt",
|
||||
.id = 1,
|
||||
.resource = rtt1_resources,
|
||||
.num_resources = ARRAY_SIZE(rtt1_resources),
|
||||
};
|
||||
|
||||
static void __init at91_add_device_rtt(void)
|
||||
{
|
||||
platform_device_register(&at91sam9263_rtt0_device);
|
||||
platform_device_register(&at91sam9263_rtt1_device);
|
||||
}
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* Watchdog
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE)
|
||||
static struct platform_device at91sam9263_wdt_device = {
|
||||
.name = "at91_wdt",
|
||||
.id = -1,
|
||||
.num_resources = 0,
|
||||
};
|
||||
|
||||
static void __init at91_add_device_watchdog(void)
|
||||
{
|
||||
platform_device_register(&at91sam9263_wdt_device);
|
||||
}
|
||||
#else
|
||||
static void __init at91_add_device_watchdog(void) {}
|
||||
#endif
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* SSC -- Synchronous Serial Controller
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_ATMEL_SSC) || defined(CONFIG_ATMEL_SSC_MODULE)
|
||||
static u64 ssc0_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct resource ssc0_resources[] = {
|
||||
[0] = {
|
||||
.start = AT91SAM9263_BASE_SSC0,
|
||||
.end = AT91SAM9263_BASE_SSC0 + SZ_16K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = AT91SAM9263_ID_SSC0,
|
||||
.end = AT91SAM9263_ID_SSC0,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device at91sam9263_ssc0_device = {
|
||||
.name = "ssc",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.dma_mask = &ssc0_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
.resource = ssc0_resources,
|
||||
.num_resources = ARRAY_SIZE(ssc0_resources),
|
||||
};
|
||||
|
||||
static inline void configure_ssc0_pins(unsigned pins)
|
||||
{
|
||||
if (pins & ATMEL_SSC_TF)
|
||||
at91_set_B_periph(AT91_PIN_PB0, 1);
|
||||
if (pins & ATMEL_SSC_TK)
|
||||
at91_set_B_periph(AT91_PIN_PB1, 1);
|
||||
if (pins & ATMEL_SSC_TD)
|
||||
at91_set_B_periph(AT91_PIN_PB2, 1);
|
||||
if (pins & ATMEL_SSC_RD)
|
||||
at91_set_B_periph(AT91_PIN_PB3, 1);
|
||||
if (pins & ATMEL_SSC_RK)
|
||||
at91_set_B_periph(AT91_PIN_PB4, 1);
|
||||
if (pins & ATMEL_SSC_RF)
|
||||
at91_set_B_periph(AT91_PIN_PB5, 1);
|
||||
}
|
||||
|
||||
static u64 ssc1_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct resource ssc1_resources[] = {
|
||||
[0] = {
|
||||
.start = AT91SAM9263_BASE_SSC1,
|
||||
.end = AT91SAM9263_BASE_SSC1 + SZ_16K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = AT91SAM9263_ID_SSC1,
|
||||
.end = AT91SAM9263_ID_SSC1,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device at91sam9263_ssc1_device = {
|
||||
.name = "ssc",
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.dma_mask = &ssc1_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
.resource = ssc1_resources,
|
||||
.num_resources = ARRAY_SIZE(ssc1_resources),
|
||||
};
|
||||
|
||||
static inline void configure_ssc1_pins(unsigned pins)
|
||||
{
|
||||
if (pins & ATMEL_SSC_TF)
|
||||
at91_set_A_periph(AT91_PIN_PB6, 1);
|
||||
if (pins & ATMEL_SSC_TK)
|
||||
at91_set_A_periph(AT91_PIN_PB7, 1);
|
||||
if (pins & ATMEL_SSC_TD)
|
||||
at91_set_A_periph(AT91_PIN_PB8, 1);
|
||||
if (pins & ATMEL_SSC_RD)
|
||||
at91_set_A_periph(AT91_PIN_PB9, 1);
|
||||
if (pins & ATMEL_SSC_RK)
|
||||
at91_set_A_periph(AT91_PIN_PB10, 1);
|
||||
if (pins & ATMEL_SSC_RF)
|
||||
at91_set_A_periph(AT91_PIN_PB11, 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the device node so that board init code can use it as the
|
||||
* parent for the device node reflecting how it's used on this board.
|
||||
*
|
||||
* SSC controllers are accessed through library code, instead of any
|
||||
* kind of all-singing/all-dancing driver. For example one could be
|
||||
* used by a particular I2S audio codec's driver, while another one
|
||||
* on the same system might be used by a custom data capture driver.
|
||||
*/
|
||||
void __init at91_add_device_ssc(unsigned id, unsigned pins)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
|
||||
/*
|
||||
* NOTE: caller is responsible for passing information matching
|
||||
* "pins" to whatever will be using each particular controller.
|
||||
*/
|
||||
switch (id) {
|
||||
case AT91SAM9263_ID_SSC0:
|
||||
pdev = &at91sam9263_ssc0_device;
|
||||
configure_ssc0_pins(pins);
|
||||
at91_clock_associate("ssc0_clk", &pdev->dev, "pclk");
|
||||
break;
|
||||
case AT91SAM9263_ID_SSC1:
|
||||
pdev = &at91sam9263_ssc1_device;
|
||||
configure_ssc1_pins(pins);
|
||||
at91_clock_associate("ssc1_clk", &pdev->dev, "pclk");
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
platform_device_register(pdev);
|
||||
}
|
||||
|
||||
#else
|
||||
void __init at91_add_device_ssc(unsigned id, unsigned pins) {}
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -778,12 +997,15 @@ static struct atmel_uart_data dbgu_data = {
|
|||
.regs = (void __iomem *)(AT91_VA_BASE_SYS + AT91_DBGU),
|
||||
};
|
||||
|
||||
static u64 dbgu_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct platform_device at91sam9263_dbgu_device = {
|
||||
.name = "atmel_usart",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &dbgu_data,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.dma_mask = &dbgu_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &dbgu_data,
|
||||
},
|
||||
.resource = dbgu_resources,
|
||||
.num_resources = ARRAY_SIZE(dbgu_resources),
|
||||
|
@ -813,23 +1035,29 @@ static struct atmel_uart_data uart0_data = {
|
|||
.use_dma_rx = 1,
|
||||
};
|
||||
|
||||
static u64 uart0_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct platform_device at91sam9263_uart0_device = {
|
||||
.name = "atmel_usart",
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.platform_data = &uart0_data,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.dma_mask = &uart0_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &uart0_data,
|
||||
},
|
||||
.resource = uart0_resources,
|
||||
.num_resources = ARRAY_SIZE(uart0_resources),
|
||||
};
|
||||
|
||||
static inline void configure_usart0_pins(void)
|
||||
static inline void configure_usart0_pins(unsigned pins)
|
||||
{
|
||||
at91_set_A_periph(AT91_PIN_PA26, 1); /* TXD0 */
|
||||
at91_set_A_periph(AT91_PIN_PA27, 0); /* RXD0 */
|
||||
at91_set_A_periph(AT91_PIN_PA28, 0); /* RTS0 */
|
||||
at91_set_A_periph(AT91_PIN_PA29, 0); /* CTS0 */
|
||||
|
||||
if (pins & ATMEL_UART_RTS)
|
||||
at91_set_A_periph(AT91_PIN_PA28, 0); /* RTS0 */
|
||||
if (pins & ATMEL_UART_CTS)
|
||||
at91_set_A_periph(AT91_PIN_PA29, 0); /* CTS0 */
|
||||
}
|
||||
|
||||
static struct resource uart1_resources[] = {
|
||||
|
@ -850,23 +1078,29 @@ static struct atmel_uart_data uart1_data = {
|
|||
.use_dma_rx = 1,
|
||||
};
|
||||
|
||||
static u64 uart1_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct platform_device at91sam9263_uart1_device = {
|
||||
.name = "atmel_usart",
|
||||
.id = 2,
|
||||
.dev = {
|
||||
.platform_data = &uart1_data,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.dma_mask = &uart1_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &uart1_data,
|
||||
},
|
||||
.resource = uart1_resources,
|
||||
.num_resources = ARRAY_SIZE(uart1_resources),
|
||||
};
|
||||
|
||||
static inline void configure_usart1_pins(void)
|
||||
static inline void configure_usart1_pins(unsigned pins)
|
||||
{
|
||||
at91_set_A_periph(AT91_PIN_PD0, 1); /* TXD1 */
|
||||
at91_set_A_periph(AT91_PIN_PD1, 0); /* RXD1 */
|
||||
at91_set_B_periph(AT91_PIN_PD7, 0); /* RTS1 */
|
||||
at91_set_B_periph(AT91_PIN_PD8, 0); /* CTS1 */
|
||||
|
||||
if (pins & ATMEL_UART_RTS)
|
||||
at91_set_B_periph(AT91_PIN_PD7, 0); /* RTS1 */
|
||||
if (pins & ATMEL_UART_CTS)
|
||||
at91_set_B_periph(AT91_PIN_PD8, 0); /* CTS1 */
|
||||
}
|
||||
|
||||
static struct resource uart2_resources[] = {
|
||||
|
@ -887,29 +1121,35 @@ static struct atmel_uart_data uart2_data = {
|
|||
.use_dma_rx = 1,
|
||||
};
|
||||
|
||||
static u64 uart2_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct platform_device at91sam9263_uart2_device = {
|
||||
.name = "atmel_usart",
|
||||
.id = 3,
|
||||
.dev = {
|
||||
.platform_data = &uart2_data,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.dma_mask = &uart2_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &uart2_data,
|
||||
},
|
||||
.resource = uart2_resources,
|
||||
.num_resources = ARRAY_SIZE(uart2_resources),
|
||||
};
|
||||
|
||||
static inline void configure_usart2_pins(void)
|
||||
static inline void configure_usart2_pins(unsigned pins)
|
||||
{
|
||||
at91_set_A_periph(AT91_PIN_PD2, 1); /* TXD2 */
|
||||
at91_set_A_periph(AT91_PIN_PD3, 0); /* RXD2 */
|
||||
at91_set_B_periph(AT91_PIN_PD5, 0); /* RTS2 */
|
||||
at91_set_B_periph(AT91_PIN_PD6, 0); /* CTS2 */
|
||||
|
||||
if (pins & ATMEL_UART_RTS)
|
||||
at91_set_B_periph(AT91_PIN_PD5, 0); /* RTS2 */
|
||||
if (pins & ATMEL_UART_CTS)
|
||||
at91_set_B_periph(AT91_PIN_PD6, 0); /* CTS2 */
|
||||
}
|
||||
|
||||
struct platform_device *at91_uarts[ATMEL_MAX_UART]; /* the UARTs to use */
|
||||
static struct platform_device *at91_uarts[ATMEL_MAX_UART]; /* the UARTs to use */
|
||||
struct platform_device *atmel_default_console_device; /* the serial console device */
|
||||
|
||||
void __init at91_init_serial(struct at91_uart_config *config)
|
||||
void __init __deprecated at91_init_serial(struct at91_uart_config *config)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
@ -917,17 +1157,17 @@ void __init at91_init_serial(struct at91_uart_config *config)
|
|||
for (i = 0; i < config->nr_tty; i++) {
|
||||
switch (config->tty_map[i]) {
|
||||
case 0:
|
||||
configure_usart0_pins();
|
||||
configure_usart0_pins(ATMEL_UART_CTS | ATMEL_UART_RTS);
|
||||
at91_uarts[i] = &at91sam9263_uart0_device;
|
||||
at91_clock_associate("usart0_clk", &at91sam9263_uart0_device.dev, "usart");
|
||||
break;
|
||||
case 1:
|
||||
configure_usart1_pins();
|
||||
configure_usart1_pins(ATMEL_UART_CTS | ATMEL_UART_RTS);
|
||||
at91_uarts[i] = &at91sam9263_uart1_device;
|
||||
at91_clock_associate("usart1_clk", &at91sam9263_uart1_device.dev, "usart");
|
||||
break;
|
||||
case 2:
|
||||
configure_usart2_pins();
|
||||
configure_usart2_pins(ATMEL_UART_CTS | ATMEL_UART_RTS);
|
||||
at91_uarts[i] = &at91sam9263_uart2_device;
|
||||
at91_clock_associate("usart2_clk", &at91sam9263_uart2_device.dev, "usart");
|
||||
break;
|
||||
|
@ -949,6 +1189,48 @@ void __init at91_init_serial(struct at91_uart_config *config)
|
|||
printk(KERN_INFO "AT91: No default serial console defined.\n");
|
||||
}
|
||||
|
||||
void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
|
||||
switch (id) {
|
||||
case 0: /* DBGU */
|
||||
pdev = &at91sam9263_dbgu_device;
|
||||
configure_dbgu_pins();
|
||||
at91_clock_associate("mck", &pdev->dev, "usart");
|
||||
break;
|
||||
case AT91SAM9263_ID_US0:
|
||||
pdev = &at91sam9263_uart0_device;
|
||||
configure_usart0_pins(pins);
|
||||
at91_clock_associate("usart0_clk", &pdev->dev, "usart");
|
||||
break;
|
||||
case AT91SAM9263_ID_US1:
|
||||
pdev = &at91sam9263_uart1_device;
|
||||
configure_usart1_pins(pins);
|
||||
at91_clock_associate("usart1_clk", &pdev->dev, "usart");
|
||||
break;
|
||||
case AT91SAM9263_ID_US2:
|
||||
pdev = &at91sam9263_uart2_device;
|
||||
configure_usart2_pins(pins);
|
||||
at91_clock_associate("usart2_clk", &pdev->dev, "usart");
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
pdev->id = portnr; /* update to mapped ID */
|
||||
|
||||
if (portnr < ATMEL_MAX_UART)
|
||||
at91_uarts[portnr] = pdev;
|
||||
}
|
||||
|
||||
void __init at91_set_serial_console(unsigned portnr)
|
||||
{
|
||||
if (portnr < ATMEL_MAX_UART)
|
||||
atmel_default_console_device = at91_uarts[portnr];
|
||||
if (!atmel_default_console_device)
|
||||
printk(KERN_INFO "AT91: No default serial console defined.\n");
|
||||
}
|
||||
|
||||
void __init at91_add_device_serial(void)
|
||||
{
|
||||
int i;
|
||||
|
@ -960,6 +1242,8 @@ void __init at91_add_device_serial(void)
|
|||
}
|
||||
#else
|
||||
void __init at91_init_serial(struct at91_uart_config *config) {}
|
||||
void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) {}
|
||||
void __init at91_set_serial_console(unsigned portnr) {}
|
||||
void __init at91_add_device_serial(void) {}
|
||||
#endif
|
||||
|
||||
|
@ -971,6 +1255,8 @@ void __init at91_add_device_serial(void) {}
|
|||
*/
|
||||
static int __init at91_add_standard_devices(void)
|
||||
{
|
||||
at91_add_device_rtt();
|
||||
at91_add_device_watchdog();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/i2c-gpio.h>
|
||||
|
||||
|
@ -29,7 +30,7 @@
|
|||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_MMC_AT91) || defined(CONFIG_MMC_AT91_MODULE)
|
||||
static u64 mmc_dmamask = 0xffffffffUL;
|
||||
static u64 mmc_dmamask = DMA_BIT_MASK(32);
|
||||
static struct at91_mmc_data mmc_data;
|
||||
|
||||
static struct resource mmc_resources[] = {
|
||||
|
@ -50,7 +51,7 @@ static struct platform_device at91sam9rl_mmc_device = {
|
|||
.id = -1,
|
||||
.dev = {
|
||||
.dma_mask = &mmc_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &mmc_data,
|
||||
},
|
||||
.resource = mmc_resources,
|
||||
|
@ -247,7 +248,7 @@ void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices)
|
|||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_SPI_ATMEL) || defined(CONFIG_SPI_ATMEL_MODULE)
|
||||
static u64 spi_dmamask = 0xffffffffUL;
|
||||
static u64 spi_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct resource spi_resources[] = {
|
||||
[0] = {
|
||||
|
@ -267,7 +268,7 @@ static struct platform_device at91sam9rl_spi_device = {
|
|||
.id = 0,
|
||||
.dev = {
|
||||
.dma_mask = &spi_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
.resource = spi_resources,
|
||||
.num_resources = ARRAY_SIZE(spi_resources),
|
||||
|
@ -312,7 +313,7 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices)
|
|||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE)
|
||||
static u64 lcdc_dmamask = 0xffffffffUL;
|
||||
static u64 lcdc_dmamask = DMA_BIT_MASK(32);
|
||||
static struct atmel_lcdfb_info lcdc_data;
|
||||
|
||||
static struct resource lcdc_resources[] = {
|
||||
|
@ -340,7 +341,7 @@ static struct platform_device at91_lcdc_device = {
|
|||
.id = 0,
|
||||
.dev = {
|
||||
.dma_mask = &lcdc_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &lcdc_data,
|
||||
},
|
||||
.resource = lcdc_resources,
|
||||
|
@ -384,24 +385,196 @@ void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data) {}
|
|||
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* LEDs
|
||||
* RTC
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_LEDS)
|
||||
u8 at91_leds_cpu;
|
||||
u8 at91_leds_timer;
|
||||
#if defined(CONFIG_RTC_DRV_AT91RM9200) || defined(CONFIG_RTC_DRV_AT91RM9200_MODULE)
|
||||
static struct platform_device at91sam9rl_rtc_device = {
|
||||
.name = "at91_rtc",
|
||||
.id = -1,
|
||||
.num_resources = 0,
|
||||
};
|
||||
|
||||
void __init at91_init_leds(u8 cpu_led, u8 timer_led)
|
||||
static void __init at91_add_device_rtc(void)
|
||||
{
|
||||
/* Enable GPIO to access the LEDs */
|
||||
at91_set_gpio_output(cpu_led, 1);
|
||||
at91_set_gpio_output(timer_led, 1);
|
||||
|
||||
at91_leds_cpu = cpu_led;
|
||||
at91_leds_timer = timer_led;
|
||||
platform_device_register(&at91sam9rl_rtc_device);
|
||||
}
|
||||
#else
|
||||
void __init at91_init_leds(u8 cpu_led, u8 timer_led) {}
|
||||
static void __init at91_add_device_rtc(void) {}
|
||||
#endif
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* RTT
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
static struct resource rtt_resources[] = {
|
||||
{
|
||||
.start = AT91_BASE_SYS + AT91_RTT,
|
||||
.end = AT91_BASE_SYS + AT91_RTT + SZ_16 - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}
|
||||
};
|
||||
|
||||
static struct platform_device at91sam9rl_rtt_device = {
|
||||
.name = "at91_rtt",
|
||||
.id = -1,
|
||||
.resource = rtt_resources,
|
||||
.num_resources = ARRAY_SIZE(rtt_resources),
|
||||
};
|
||||
|
||||
static void __init at91_add_device_rtt(void)
|
||||
{
|
||||
platform_device_register(&at91sam9rl_rtt_device);
|
||||
}
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* Watchdog
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE)
|
||||
static struct platform_device at91sam9rl_wdt_device = {
|
||||
.name = "at91_wdt",
|
||||
.id = -1,
|
||||
.num_resources = 0,
|
||||
};
|
||||
|
||||
static void __init at91_add_device_watchdog(void)
|
||||
{
|
||||
platform_device_register(&at91sam9rl_wdt_device);
|
||||
}
|
||||
#else
|
||||
static void __init at91_add_device_watchdog(void) {}
|
||||
#endif
|
||||
|
||||
|
||||
/* --------------------------------------------------------------------
|
||||
* SSC -- Synchronous Serial Controller
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_ATMEL_SSC) || defined(CONFIG_ATMEL_SSC_MODULE)
|
||||
static u64 ssc0_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct resource ssc0_resources[] = {
|
||||
[0] = {
|
||||
.start = AT91SAM9RL_BASE_SSC0,
|
||||
.end = AT91SAM9RL_BASE_SSC0 + SZ_16K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = AT91SAM9RL_ID_SSC0,
|
||||
.end = AT91SAM9RL_ID_SSC0,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device at91sam9rl_ssc0_device = {
|
||||
.name = "ssc",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.dma_mask = &ssc0_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
.resource = ssc0_resources,
|
||||
.num_resources = ARRAY_SIZE(ssc0_resources),
|
||||
};
|
||||
|
||||
static inline void configure_ssc0_pins(unsigned pins)
|
||||
{
|
||||
if (pins & ATMEL_SSC_TF)
|
||||
at91_set_A_periph(AT91_PIN_PC0, 1);
|
||||
if (pins & ATMEL_SSC_TK)
|
||||
at91_set_A_periph(AT91_PIN_PC1, 1);
|
||||
if (pins & ATMEL_SSC_TD)
|
||||
at91_set_A_periph(AT91_PIN_PA15, 1);
|
||||
if (pins & ATMEL_SSC_RD)
|
||||
at91_set_A_periph(AT91_PIN_PA16, 1);
|
||||
if (pins & ATMEL_SSC_RK)
|
||||
at91_set_B_periph(AT91_PIN_PA10, 1);
|
||||
if (pins & ATMEL_SSC_RF)
|
||||
at91_set_B_periph(AT91_PIN_PA22, 1);
|
||||
}
|
||||
|
||||
static u64 ssc1_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct resource ssc1_resources[] = {
|
||||
[0] = {
|
||||
.start = AT91SAM9RL_BASE_SSC1,
|
||||
.end = AT91SAM9RL_BASE_SSC1 + SZ_16K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = AT91SAM9RL_ID_SSC1,
|
||||
.end = AT91SAM9RL_ID_SSC1,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device at91sam9rl_ssc1_device = {
|
||||
.name = "ssc",
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.dma_mask = &ssc1_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
.resource = ssc1_resources,
|
||||
.num_resources = ARRAY_SIZE(ssc1_resources),
|
||||
};
|
||||
|
||||
static inline void configure_ssc1_pins(unsigned pins)
|
||||
{
|
||||
if (pins & ATMEL_SSC_TF)
|
||||
at91_set_B_periph(AT91_PIN_PA29, 1);
|
||||
if (pins & ATMEL_SSC_TK)
|
||||
at91_set_B_periph(AT91_PIN_PA30, 1);
|
||||
if (pins & ATMEL_SSC_TD)
|
||||
at91_set_B_periph(AT91_PIN_PA13, 1);
|
||||
if (pins & ATMEL_SSC_RD)
|
||||
at91_set_B_periph(AT91_PIN_PA14, 1);
|
||||
if (pins & ATMEL_SSC_RK)
|
||||
at91_set_B_periph(AT91_PIN_PA9, 1);
|
||||
if (pins & ATMEL_SSC_RF)
|
||||
at91_set_B_periph(AT91_PIN_PA8, 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the device node so that board init code can use it as the
|
||||
* parent for the device node reflecting how it's used on this board.
|
||||
*
|
||||
* SSC controllers are accessed through library code, instead of any
|
||||
* kind of all-singing/all-dancing driver. For example one could be
|
||||
* used by a particular I2S audio codec's driver, while another one
|
||||
* on the same system might be used by a custom data capture driver.
|
||||
*/
|
||||
void __init at91_add_device_ssc(unsigned id, unsigned pins)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
|
||||
/*
|
||||
* NOTE: caller is responsible for passing information matching
|
||||
* "pins" to whatever will be using each particular controller.
|
||||
*/
|
||||
switch (id) {
|
||||
case AT91SAM9RL_ID_SSC0:
|
||||
pdev = &at91sam9rl_ssc0_device;
|
||||
configure_ssc0_pins(pins);
|
||||
at91_clock_associate("ssc0_clk", &pdev->dev, "pclk");
|
||||
break;
|
||||
case AT91SAM9RL_ID_SSC1:
|
||||
pdev = &at91sam9rl_ssc1_device;
|
||||
configure_ssc1_pins(pins);
|
||||
at91_clock_associate("ssc1_clk", &pdev->dev, "pclk");
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
platform_device_register(pdev);
|
||||
}
|
||||
|
||||
#else
|
||||
void __init at91_add_device_ssc(unsigned id, unsigned pins) {}
|
||||
#endif
|
||||
|
||||
|
||||
|
@ -429,12 +602,15 @@ static struct atmel_uart_data dbgu_data = {
|
|||
.regs = (void __iomem *)(AT91_VA_BASE_SYS + AT91_DBGU),
|
||||
};
|
||||
|
||||
static u64 dbgu_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct platform_device at91sam9rl_dbgu_device = {
|
||||
.name = "atmel_usart",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &dbgu_data,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.dma_mask = &dbgu_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &dbgu_data,
|
||||
},
|
||||
.resource = dbgu_resources,
|
||||
.num_resources = ARRAY_SIZE(dbgu_resources),
|
||||
|
@ -464,23 +640,37 @@ static struct atmel_uart_data uart0_data = {
|
|||
.use_dma_rx = 1,
|
||||
};
|
||||
|
||||
static u64 uart0_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct platform_device at91sam9rl_uart0_device = {
|
||||
.name = "atmel_usart",
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.platform_data = &uart0_data,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.dma_mask = &uart0_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &uart0_data,
|
||||
},
|
||||
.resource = uart0_resources,
|
||||
.num_resources = ARRAY_SIZE(uart0_resources),
|
||||
};
|
||||
|
||||
static inline void configure_usart0_pins(void)
|
||||
static inline void configure_usart0_pins(unsigned pins)
|
||||
{
|
||||
at91_set_A_periph(AT91_PIN_PA6, 1); /* TXD0 */
|
||||
at91_set_A_periph(AT91_PIN_PA7, 0); /* RXD0 */
|
||||
at91_set_A_periph(AT91_PIN_PA9, 0); /* RTS0 */
|
||||
at91_set_A_periph(AT91_PIN_PA10, 0); /* CTS0 */
|
||||
|
||||
if (pins & ATMEL_UART_RTS)
|
||||
at91_set_A_periph(AT91_PIN_PA9, 0); /* RTS0 */
|
||||
if (pins & ATMEL_UART_CTS)
|
||||
at91_set_A_periph(AT91_PIN_PA10, 0); /* CTS0 */
|
||||
if (pins & ATMEL_UART_DSR)
|
||||
at91_set_A_periph(AT91_PIN_PD14, 0); /* DSR0 */
|
||||
if (pins & ATMEL_UART_DTR)
|
||||
at91_set_A_periph(AT91_PIN_PD15, 0); /* DTR0 */
|
||||
if (pins & ATMEL_UART_DCD)
|
||||
at91_set_A_periph(AT91_PIN_PD16, 0); /* DCD0 */
|
||||
if (pins & ATMEL_UART_RI)
|
||||
at91_set_A_periph(AT91_PIN_PD17, 0); /* RI0 */
|
||||
}
|
||||
|
||||
static struct resource uart1_resources[] = {
|
||||
|
@ -501,21 +691,29 @@ static struct atmel_uart_data uart1_data = {
|
|||
.use_dma_rx = 1,
|
||||
};
|
||||
|
||||
static u64 uart1_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct platform_device at91sam9rl_uart1_device = {
|
||||
.name = "atmel_usart",
|
||||
.id = 2,
|
||||
.dev = {
|
||||
.platform_data = &uart1_data,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.dma_mask = &uart1_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &uart1_data,
|
||||
},
|
||||
.resource = uart1_resources,
|
||||
.num_resources = ARRAY_SIZE(uart1_resources),
|
||||
};
|
||||
|
||||
static inline void configure_usart1_pins(void)
|
||||
static inline void configure_usart1_pins(unsigned pins)
|
||||
{
|
||||
at91_set_A_periph(AT91_PIN_PA11, 1); /* TXD1 */
|
||||
at91_set_A_periph(AT91_PIN_PA12, 0); /* RXD1 */
|
||||
|
||||
if (pins & ATMEL_UART_RTS)
|
||||
at91_set_B_periph(AT91_PIN_PA18, 0); /* RTS1 */
|
||||
if (pins & ATMEL_UART_CTS)
|
||||
at91_set_B_periph(AT91_PIN_PA19, 0); /* CTS1 */
|
||||
}
|
||||
|
||||
static struct resource uart2_resources[] = {
|
||||
|
@ -536,21 +734,29 @@ static struct atmel_uart_data uart2_data = {
|
|||
.use_dma_rx = 1,
|
||||
};
|
||||
|
||||
static u64 uart2_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct platform_device at91sam9rl_uart2_device = {
|
||||
.name = "atmel_usart",
|
||||
.id = 3,
|
||||
.dev = {
|
||||
.platform_data = &uart2_data,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.dma_mask = &uart2_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &uart2_data,
|
||||
},
|
||||
.resource = uart2_resources,
|
||||
.num_resources = ARRAY_SIZE(uart2_resources),
|
||||
};
|
||||
|
||||
static inline void configure_usart2_pins(void)
|
||||
static inline void configure_usart2_pins(unsigned pins)
|
||||
{
|
||||
at91_set_A_periph(AT91_PIN_PA13, 1); /* TXD2 */
|
||||
at91_set_A_periph(AT91_PIN_PA14, 0); /* RXD2 */
|
||||
|
||||
if (pins & ATMEL_UART_RTS)
|
||||
at91_set_A_periph(AT91_PIN_PA29, 0); /* RTS2 */
|
||||
if (pins & ATMEL_UART_CTS)
|
||||
at91_set_A_periph(AT91_PIN_PA30, 0); /* CTS2 */
|
||||
}
|
||||
|
||||
static struct resource uart3_resources[] = {
|
||||
|
@ -571,27 +777,35 @@ static struct atmel_uart_data uart3_data = {
|
|||
.use_dma_rx = 1,
|
||||
};
|
||||
|
||||
static u64 uart3_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct platform_device at91sam9rl_uart3_device = {
|
||||
.name = "atmel_usart",
|
||||
.id = 4,
|
||||
.dev = {
|
||||
.platform_data = &uart3_data,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.dma_mask = &uart3_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &uart3_data,
|
||||
},
|
||||
.resource = uart3_resources,
|
||||
.num_resources = ARRAY_SIZE(uart3_resources),
|
||||
};
|
||||
|
||||
static inline void configure_usart3_pins(void)
|
||||
static inline void configure_usart3_pins(unsigned pins)
|
||||
{
|
||||
at91_set_A_periph(AT91_PIN_PB0, 1); /* TXD3 */
|
||||
at91_set_A_periph(AT91_PIN_PB1, 0); /* RXD3 */
|
||||
|
||||
if (pins & ATMEL_UART_RTS)
|
||||
at91_set_B_periph(AT91_PIN_PD4, 0); /* RTS3 */
|
||||
if (pins & ATMEL_UART_CTS)
|
||||
at91_set_B_periph(AT91_PIN_PD3, 0); /* CTS3 */
|
||||
}
|
||||
|
||||
struct platform_device *at91_uarts[ATMEL_MAX_UART]; /* the UARTs to use */
|
||||
static struct platform_device *at91_uarts[ATMEL_MAX_UART]; /* the UARTs to use */
|
||||
struct platform_device *atmel_default_console_device; /* the serial console device */
|
||||
|
||||
void __init at91_init_serial(struct at91_uart_config *config)
|
||||
void __init __deprecated at91_init_serial(struct at91_uart_config *config)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
@ -599,22 +813,22 @@ void __init at91_init_serial(struct at91_uart_config *config)
|
|||
for (i = 0; i < config->nr_tty; i++) {
|
||||
switch (config->tty_map[i]) {
|
||||
case 0:
|
||||
configure_usart0_pins();
|
||||
configure_usart0_pins(ATMEL_UART_CTS | ATMEL_UART_RTS);
|
||||
at91_uarts[i] = &at91sam9rl_uart0_device;
|
||||
at91_clock_associate("usart0_clk", &at91sam9rl_uart0_device.dev, "usart");
|
||||
break;
|
||||
case 1:
|
||||
configure_usart1_pins();
|
||||
configure_usart1_pins(0);
|
||||
at91_uarts[i] = &at91sam9rl_uart1_device;
|
||||
at91_clock_associate("usart1_clk", &at91sam9rl_uart1_device.dev, "usart");
|
||||
break;
|
||||
case 2:
|
||||
configure_usart2_pins();
|
||||
configure_usart2_pins(0);
|
||||
at91_uarts[i] = &at91sam9rl_uart2_device;
|
||||
at91_clock_associate("usart2_clk", &at91sam9rl_uart2_device.dev, "usart");
|
||||
break;
|
||||
case 3:
|
||||
configure_usart3_pins();
|
||||
configure_usart3_pins(0);
|
||||
at91_uarts[i] = &at91sam9rl_uart3_device;
|
||||
at91_clock_associate("usart3_clk", &at91sam9rl_uart3_device.dev, "usart");
|
||||
break;
|
||||
|
@ -636,6 +850,53 @@ void __init at91_init_serial(struct at91_uart_config *config)
|
|||
printk(KERN_INFO "AT91: No default serial console defined.\n");
|
||||
}
|
||||
|
||||
void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
|
||||
switch (id) {
|
||||
case 0: /* DBGU */
|
||||
pdev = &at91sam9rl_dbgu_device;
|
||||
configure_dbgu_pins();
|
||||
at91_clock_associate("mck", &pdev->dev, "usart");
|
||||
break;
|
||||
case AT91SAM9RL_ID_US0:
|
||||
pdev = &at91sam9rl_uart0_device;
|
||||
configure_usart0_pins(pins);
|
||||
at91_clock_associate("usart0_clk", &pdev->dev, "usart");
|
||||
break;
|
||||
case AT91SAM9RL_ID_US1:
|
||||
pdev = &at91sam9rl_uart1_device;
|
||||
configure_usart1_pins(pins);
|
||||
at91_clock_associate("usart1_clk", &pdev->dev, "usart");
|
||||
break;
|
||||
case AT91SAM9RL_ID_US2:
|
||||
pdev = &at91sam9rl_uart2_device;
|
||||
configure_usart2_pins(pins);
|
||||
at91_clock_associate("usart2_clk", &pdev->dev, "usart");
|
||||
break;
|
||||
case AT91SAM9RL_ID_US3:
|
||||
pdev = &at91sam9rl_uart3_device;
|
||||
configure_usart3_pins(pins);
|
||||
at91_clock_associate("usart3_clk", &pdev->dev, "usart");
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
pdev->id = portnr; /* update to mapped ID */
|
||||
|
||||
if (portnr < ATMEL_MAX_UART)
|
||||
at91_uarts[portnr] = pdev;
|
||||
}
|
||||
|
||||
void __init at91_set_serial_console(unsigned portnr)
|
||||
{
|
||||
if (portnr < ATMEL_MAX_UART)
|
||||
atmel_default_console_device = at91_uarts[portnr];
|
||||
if (!atmel_default_console_device)
|
||||
printk(KERN_INFO "AT91: No default serial console defined.\n");
|
||||
}
|
||||
|
||||
void __init at91_add_device_serial(void)
|
||||
{
|
||||
int i;
|
||||
|
@ -646,7 +907,9 @@ void __init at91_add_device_serial(void)
|
|||
}
|
||||
}
|
||||
#else
|
||||
void __init at91_init_serial(struct at91_uart_config *config) {}
|
||||
void __init __deprecated at91_init_serial(struct at91_uart_config *config) {}
|
||||
void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) {}
|
||||
void __init at91_set_serial_console(unsigned portnr) {}
|
||||
void __init at91_add_device_serial(void) {}
|
||||
#endif
|
||||
|
||||
|
@ -659,6 +922,9 @@ void __init at91_add_device_serial(void) {}
|
|||
*/
|
||||
static int __init at91_add_standard_devices(void)
|
||||
{
|
||||
at91_add_device_rtc();
|
||||
at91_add_device_rtt();
|
||||
at91_add_device_watchdog();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,359 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-at91/board-cap9adk.c
|
||||
*
|
||||
* Copyright (C) 2007 Stelian Pop <stelian.pop@leadtechdesign.com>
|
||||
* Copyright (C) 2007 Lead Tech Design <www.leadtechdesign.com>
|
||||
* Copyright (C) 2005 SAN People
|
||||
* Copyright (C) 2007 Atmel Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/ads7846.h>
|
||||
#include <linux/fb.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
|
||||
#include <video/atmel_lcdc.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/irq.h>
|
||||
|
||||
#include <asm/arch/board.h>
|
||||
#include <asm/arch/gpio.h>
|
||||
#include <asm/arch/at91cap9_matrix.h>
|
||||
#include <asm/arch/at91sam926x_mc.h>
|
||||
|
||||
#include "generic.h"
|
||||
|
||||
|
||||
static void __init cap9adk_map_io(void)
|
||||
{
|
||||
/* Initialize processor: 12 MHz crystal */
|
||||
at91cap9_initialize(12000000);
|
||||
|
||||
/* Setup the LEDs: USER1 and USER2 LED for cpu/timer... */
|
||||
at91_init_leds(AT91_PIN_PA10, AT91_PIN_PA11);
|
||||
/* ... POWER LED always on */
|
||||
at91_set_gpio_output(AT91_PIN_PC29, 1);
|
||||
|
||||
/* Setup the serial ports and console */
|
||||
at91_register_uart(0, 0, 0); /* DBGU = ttyS0 */
|
||||
at91_set_serial_console(0);
|
||||
}
|
||||
|
||||
static void __init cap9adk_init_irq(void)
|
||||
{
|
||||
at91cap9_init_interrupts(NULL);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* USB Host port
|
||||
*/
|
||||
static struct at91_usbh_data __initdata cap9adk_usbh_data = {
|
||||
.ports = 2,
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* ADS7846 Touchscreen
|
||||
*/
|
||||
#if defined(CONFIG_TOUCHSCREEN_ADS7846) || defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
|
||||
static int ads7843_pendown_state(void)
|
||||
{
|
||||
return !at91_get_gpio_value(AT91_PIN_PC4); /* Touchscreen PENIRQ */
|
||||
}
|
||||
|
||||
static struct ads7846_platform_data ads_info = {
|
||||
.model = 7843,
|
||||
.x_min = 150,
|
||||
.x_max = 3830,
|
||||
.y_min = 190,
|
||||
.y_max = 3830,
|
||||
.vref_delay_usecs = 100,
|
||||
.x_plate_ohms = 450,
|
||||
.y_plate_ohms = 250,
|
||||
.pressure_max = 15000,
|
||||
.debounce_max = 1,
|
||||
.debounce_rep = 0,
|
||||
.debounce_tol = (~0),
|
||||
.get_pendown_state = ads7843_pendown_state,
|
||||
};
|
||||
|
||||
static void __init cap9adk_add_device_ts(void)
|
||||
{
|
||||
at91_set_gpio_input(AT91_PIN_PC4, 1); /* Touchscreen PENIRQ */
|
||||
at91_set_gpio_input(AT91_PIN_PC5, 1); /* Touchscreen BUSY */
|
||||
}
|
||||
#else
|
||||
static void __init cap9adk_add_device_ts(void) {}
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* SPI devices.
|
||||
*/
|
||||
static struct spi_board_info cap9adk_spi_devices[] = {
|
||||
#if defined(CONFIG_MTD_AT91_DATAFLASH_CARD)
|
||||
{ /* DataFlash card */
|
||||
.modalias = "mtd_dataflash",
|
||||
.chip_select = 0,
|
||||
.max_speed_hz = 15 * 1000 * 1000,
|
||||
.bus_num = 0,
|
||||
},
|
||||
#endif
|
||||
#if defined(CONFIG_TOUCHSCREEN_ADS7846) || defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
|
||||
{
|
||||
.modalias = "ads7846",
|
||||
.chip_select = 3, /* can be 2 or 3, depending on J2 jumper */
|
||||
.max_speed_hz = 125000 * 26, /* (max sample rate @ 3V) * (cmd + data + overhead) */
|
||||
.bus_num = 0,
|
||||
.platform_data = &ads_info,
|
||||
.irq = AT91_PIN_PC4,
|
||||
},
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* MCI (SD/MMC)
|
||||
*/
|
||||
static struct at91_mmc_data __initdata cap9adk_mmc_data = {
|
||||
.wire4 = 1,
|
||||
// .det_pin = ... not connected
|
||||
// .wp_pin = ... not connected
|
||||
// .vcc_pin = ... not connected
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* MACB Ethernet device
|
||||
*/
|
||||
static struct at91_eth_data __initdata cap9adk_macb_data = {
|
||||
.is_rmii = 1,
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* NAND flash
|
||||
*/
|
||||
static struct mtd_partition __initdata cap9adk_nand_partitions[] = {
|
||||
{
|
||||
.name = "NAND partition",
|
||||
.offset = 0,
|
||||
.size = MTDPART_SIZ_FULL,
|
||||
},
|
||||
};
|
||||
|
||||
static struct mtd_partition * __init nand_partitions(int size, int *num_partitions)
|
||||
{
|
||||
*num_partitions = ARRAY_SIZE(cap9adk_nand_partitions);
|
||||
return cap9adk_nand_partitions;
|
||||
}
|
||||
|
||||
static struct at91_nand_data __initdata cap9adk_nand_data = {
|
||||
.ale = 21,
|
||||
.cle = 22,
|
||||
// .det_pin = ... not connected
|
||||
// .rdy_pin = ... not connected
|
||||
.enable_pin = AT91_PIN_PD15,
|
||||
.partition_info = nand_partitions,
|
||||
#if defined(CONFIG_MTD_NAND_AT91_BUSWIDTH_16)
|
||||
.bus_width_16 = 1,
|
||||
#else
|
||||
.bus_width_16 = 0,
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* NOR flash
|
||||
*/
|
||||
static struct mtd_partition cap9adk_nor_partitions[] = {
|
||||
{
|
||||
.name = "NOR partition",
|
||||
.offset = 0,
|
||||
.size = MTDPART_SIZ_FULL,
|
||||
},
|
||||
};
|
||||
|
||||
static struct physmap_flash_data cap9adk_nor_data = {
|
||||
.width = 2,
|
||||
.parts = cap9adk_nor_partitions,
|
||||
.nr_parts = ARRAY_SIZE(cap9adk_nor_partitions),
|
||||
};
|
||||
|
||||
#define NOR_BASE AT91_CHIPSELECT_0
|
||||
#define NOR_SIZE 0x800000
|
||||
|
||||
static struct resource nor_flash_resources[] = {
|
||||
{
|
||||
.start = NOR_BASE,
|
||||
.end = NOR_BASE + NOR_SIZE - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}
|
||||
};
|
||||
|
||||
static struct platform_device cap9adk_nor_flash = {
|
||||
.name = "physmap-flash",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &cap9adk_nor_data,
|
||||
},
|
||||
.resource = nor_flash_resources,
|
||||
.num_resources = ARRAY_SIZE(nor_flash_resources),
|
||||
};
|
||||
|
||||
static __init void cap9adk_add_device_nor(void)
|
||||
{
|
||||
unsigned long csa;
|
||||
|
||||
csa = at91_sys_read(AT91_MATRIX_EBICSA);
|
||||
at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_EBI_VDDIOMSEL_3_3V);
|
||||
|
||||
/* set the bus interface characteristics */
|
||||
at91_sys_write(AT91_SMC_SETUP(0), AT91_SMC_NWESETUP_(4) | AT91_SMC_NCS_WRSETUP_(2)
|
||||
| AT91_SMC_NRDSETUP_(4) | AT91_SMC_NCS_RDSETUP_(2));
|
||||
|
||||
at91_sys_write(AT91_SMC_PULSE(0), AT91_SMC_NWEPULSE_(8) | AT91_SMC_NCS_WRPULSE_(10)
|
||||
| AT91_SMC_NRDPULSE_(8) | AT91_SMC_NCS_RDPULSE_(10));
|
||||
|
||||
at91_sys_write(AT91_SMC_CYCLE(0), AT91_SMC_NWECYCLE_(16) | AT91_SMC_NRDCYCLE_(16));
|
||||
|
||||
at91_sys_write(AT91_SMC_MODE(0), AT91_SMC_READMODE | AT91_SMC_WRITEMODE
|
||||
| AT91_SMC_EXNWMODE_DISABLE | AT91_SMC_BAT_WRITE
|
||||
| AT91_SMC_DBW_16 | AT91_SMC_TDF_(1));
|
||||
|
||||
platform_device_register(&cap9adk_nor_flash);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* LCD Controller
|
||||
*/
|
||||
#if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE)
|
||||
static struct fb_videomode at91_tft_vga_modes[] = {
|
||||
{
|
||||
.name = "TX09D50VM1CCA @ 60",
|
||||
.refresh = 60,
|
||||
.xres = 240, .yres = 320,
|
||||
.pixclock = KHZ2PICOS(4965),
|
||||
|
||||
.left_margin = 1, .right_margin = 33,
|
||||
.upper_margin = 1, .lower_margin = 0,
|
||||
.hsync_len = 5, .vsync_len = 1,
|
||||
|
||||
.sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
|
||||
.vmode = FB_VMODE_NONINTERLACED,
|
||||
},
|
||||
};
|
||||
|
||||
static struct fb_monspecs at91fb_default_monspecs = {
|
||||
.manufacturer = "HIT",
|
||||
.monitor = "TX09D70VM1CCA",
|
||||
|
||||
.modedb = at91_tft_vga_modes,
|
||||
.modedb_len = ARRAY_SIZE(at91_tft_vga_modes),
|
||||
.hfmin = 15000,
|
||||
.hfmax = 64000,
|
||||
.vfmin = 50,
|
||||
.vfmax = 150,
|
||||
};
|
||||
|
||||
#define AT91CAP9_DEFAULT_LCDCON2 (ATMEL_LCDC_MEMOR_LITTLE \
|
||||
| ATMEL_LCDC_DISTYPE_TFT \
|
||||
| ATMEL_LCDC_CLKMOD_ALWAYSACTIVE)
|
||||
|
||||
static void at91_lcdc_power_control(int on)
|
||||
{
|
||||
if (on)
|
||||
at91_set_gpio_value(AT91_PIN_PC0, 0); /* power up */
|
||||
else
|
||||
at91_set_gpio_value(AT91_PIN_PC0, 1); /* power down */
|
||||
}
|
||||
|
||||
/* Driver datas */
|
||||
static struct atmel_lcdfb_info __initdata cap9adk_lcdc_data = {
|
||||
.default_bpp = 16,
|
||||
.default_dmacon = ATMEL_LCDC_DMAEN,
|
||||
.default_lcdcon2 = AT91CAP9_DEFAULT_LCDCON2,
|
||||
.default_monspecs = &at91fb_default_monspecs,
|
||||
.atmel_lcdfb_power_control = at91_lcdc_power_control,
|
||||
.guard_time = 1,
|
||||
};
|
||||
|
||||
#else
|
||||
static struct atmel_lcdfb_info __initdata cap9adk_lcdc_data;
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* AC97
|
||||
*/
|
||||
static struct atmel_ac97_data cap9adk_ac97_data = {
|
||||
// .reset_pin = ... not connected
|
||||
};
|
||||
|
||||
|
||||
static void __init cap9adk_board_init(void)
|
||||
{
|
||||
/* Serial */
|
||||
at91_add_device_serial();
|
||||
/* USB Host */
|
||||
set_irq_type(AT91CAP9_ID_UHP, IRQT_HIGH);
|
||||
at91_add_device_usbh(&cap9adk_usbh_data);
|
||||
/* SPI */
|
||||
at91_add_device_spi(cap9adk_spi_devices, ARRAY_SIZE(cap9adk_spi_devices));
|
||||
/* Touchscreen */
|
||||
cap9adk_add_device_ts();
|
||||
/* MMC */
|
||||
at91_add_device_mmc(1, &cap9adk_mmc_data);
|
||||
/* Ethernet */
|
||||
at91_add_device_eth(&cap9adk_macb_data);
|
||||
/* NAND */
|
||||
at91_add_device_nand(&cap9adk_nand_data);
|
||||
/* NOR Flash */
|
||||
cap9adk_add_device_nor();
|
||||
/* I2C */
|
||||
at91_add_device_i2c(NULL, 0);
|
||||
/* LCD Controller */
|
||||
set_irq_type(AT91CAP9_ID_LCDC, IRQT_HIGH);
|
||||
at91_add_device_lcdc(&cap9adk_lcdc_data);
|
||||
/* AC97 */
|
||||
at91_add_device_ac97(&cap9adk_ac97_data);
|
||||
}
|
||||
|
||||
MACHINE_START(AT91CAP9ADK, "Atmel AT91CAP9A-DK")
|
||||
/* Maintainer: Stelian Pop <stelian.pop@leadtechdesign.com> */
|
||||
.phys_io = AT91_BASE_SYS,
|
||||
.io_pg_offst = (AT91_VA_BASE_SYS >> 18) & 0xfffc,
|
||||
.boot_params = AT91_SDRAM_BASE + 0x100,
|
||||
.timer = &at91sam926x_timer,
|
||||
.map_io = cap9adk_map_io,
|
||||
.init_irq = cap9adk_init_irq,
|
||||
.init_machine = cap9adk_board_init,
|
||||
MACHINE_END
|
|
@ -25,6 +25,8 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/gpio_keys.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/setup.h>
|
||||
|
@ -156,6 +158,85 @@ static struct platform_device csb_flash = {
|
|||
.num_resources = ARRAY_SIZE(csb_flash_resources),
|
||||
};
|
||||
|
||||
/*
|
||||
* GPIO Buttons (on CSB300)
|
||||
*/
|
||||
#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
|
||||
static struct gpio_keys_button csb300_buttons[] = {
|
||||
{
|
||||
.gpio = AT91_PIN_PB29,
|
||||
.code = BTN_0,
|
||||
.desc = "sw0",
|
||||
.active_low = 1,
|
||||
.wakeup = 1,
|
||||
},
|
||||
{
|
||||
.gpio = AT91_PIN_PB28,
|
||||
.code = BTN_1,
|
||||
.desc = "sw1",
|
||||
.active_low = 1,
|
||||
.wakeup = 1,
|
||||
},
|
||||
{
|
||||
.gpio = AT91_PIN_PA21,
|
||||
.code = BTN_2,
|
||||
.desc = "sw2",
|
||||
.active_low = 1,
|
||||
.wakeup = 1,
|
||||
}
|
||||
};
|
||||
|
||||
static struct gpio_keys_platform_data csb300_button_data = {
|
||||
.buttons = csb300_buttons,
|
||||
.nbuttons = ARRAY_SIZE(csb300_buttons),
|
||||
};
|
||||
|
||||
static struct platform_device csb300_button_device = {
|
||||
.name = "gpio-keys",
|
||||
.id = -1,
|
||||
.num_resources = 0,
|
||||
.dev = {
|
||||
.platform_data = &csb300_button_data,
|
||||
}
|
||||
};
|
||||
|
||||
static void __init csb300_add_device_buttons(void)
|
||||
{
|
||||
at91_set_gpio_input(AT91_PIN_PB29, 0); /* sw0 */
|
||||
at91_set_deglitch(AT91_PIN_PB29, 1);
|
||||
at91_set_gpio_input(AT91_PIN_PB28, 0); /* sw1 */
|
||||
at91_set_deglitch(AT91_PIN_PB28, 1);
|
||||
at91_set_gpio_input(AT91_PIN_PA21, 0); /* sw2 */
|
||||
at91_set_deglitch(AT91_PIN_PA21, 1);
|
||||
|
||||
platform_device_register(&csb300_button_device);
|
||||
}
|
||||
#else
|
||||
static void __init csb300_add_device_buttons(void) {}
|
||||
#endif
|
||||
|
||||
static struct gpio_led csb_leds[] = {
|
||||
{ /* "led0", yellow */
|
||||
.name = "led0",
|
||||
.gpio = AT91_PIN_PB2,
|
||||
.active_low = 1,
|
||||
.default_trigger = "heartbeat",
|
||||
},
|
||||
{ /* "led1", green */
|
||||
.name = "led1",
|
||||
.gpio = AT91_PIN_PB1,
|
||||
.active_low = 1,
|
||||
.default_trigger = "mmc0",
|
||||
},
|
||||
{ /* "led2", yellow */
|
||||
.name = "led2",
|
||||
.gpio = AT91_PIN_PB0,
|
||||
.active_low = 1,
|
||||
.default_trigger = "ide-disk",
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
static void __init csb337_board_init(void)
|
||||
{
|
||||
/* Serial */
|
||||
|
@ -177,6 +258,10 @@ static void __init csb337_board_init(void)
|
|||
at91_add_device_mmc(0, &csb337_mmc_data);
|
||||
/* NOR flash */
|
||||
platform_device_register(&csb_flash);
|
||||
/* LEDs */
|
||||
at91_gpio_leds(csb_leds, ARRAY_SIZE(csb_leds));
|
||||
/* Switches on CSB300 */
|
||||
csb300_add_device_buttons();
|
||||
}
|
||||
|
||||
MACHINE_START(CSB337, "Cogent CSB337")
|
||||
|
|
|
@ -183,6 +183,14 @@ static struct platform_device dk_flash = {
|
|||
.num_resources = 1,
|
||||
};
|
||||
|
||||
static struct gpio_led dk_leds[] = {
|
||||
{
|
||||
.name = "led0",
|
||||
.gpio = AT91_PIN_PB2,
|
||||
.active_low = 1,
|
||||
.default_trigger = "heartbeat",
|
||||
}
|
||||
};
|
||||
|
||||
static void __init dk_board_init(void)
|
||||
{
|
||||
|
@ -213,6 +221,8 @@ static void __init dk_board_init(void)
|
|||
at91_add_device_nand(&dk_nand_data);
|
||||
/* NOR Flash */
|
||||
platform_device_register(&dk_flash);
|
||||
/* LEDs */
|
||||
at91_gpio_leds(dk_leds, ARRAY_SIZE(dk_leds));
|
||||
/* VGA */
|
||||
// dk_add_device_video();
|
||||
}
|
||||
|
|
|
@ -141,6 +141,25 @@ static struct platform_device ek_flash = {
|
|||
.num_resources = 1,
|
||||
};
|
||||
|
||||
static struct gpio_led ek_leds[] = {
|
||||
{ /* "user led 1", DS2 */
|
||||
.name = "green",
|
||||
.gpio = AT91_PIN_PB0,
|
||||
.active_low = 1,
|
||||
.default_trigger = "mmc0",
|
||||
},
|
||||
{ /* "user led 2", DS4 */
|
||||
.name = "yellow",
|
||||
.gpio = AT91_PIN_PB1,
|
||||
.active_low = 1,
|
||||
.default_trigger = "heartbeat",
|
||||
},
|
||||
{ /* "user led 3", DS6 */
|
||||
.name = "red",
|
||||
.gpio = AT91_PIN_PB2,
|
||||
.active_low = 1,
|
||||
}
|
||||
};
|
||||
|
||||
static void __init ek_board_init(void)
|
||||
{
|
||||
|
@ -167,6 +186,8 @@ static void __init ek_board_init(void)
|
|||
#endif
|
||||
/* NOR Flash */
|
||||
platform_device_register(&ek_flash);
|
||||
/* LEDs */
|
||||
at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds));
|
||||
/* VGA */
|
||||
// ek_add_device_video();
|
||||
}
|
||||
|
|
|
@ -280,6 +280,68 @@ static struct spi_board_info ek_spi_devices[] = {
|
|||
* LCD Controller
|
||||
*/
|
||||
#if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE)
|
||||
|
||||
#if defined(CONFIG_FB_ATMEL_STN)
|
||||
|
||||
/* STN */
|
||||
static struct fb_videomode at91_stn_modes[] = {
|
||||
{
|
||||
.name = "SP06Q002 @ 75",
|
||||
.refresh = 75,
|
||||
.xres = 320, .yres = 240,
|
||||
.pixclock = KHZ2PICOS(1440),
|
||||
|
||||
.left_margin = 1, .right_margin = 1,
|
||||
.upper_margin = 0, .lower_margin = 0,
|
||||
.hsync_len = 1, .vsync_len = 1,
|
||||
|
||||
.sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
|
||||
.vmode = FB_VMODE_NONINTERLACED,
|
||||
},
|
||||
};
|
||||
|
||||
static struct fb_monspecs at91fb_default_stn_monspecs = {
|
||||
.manufacturer = "HIT",
|
||||
.monitor = "SP06Q002",
|
||||
|
||||
.modedb = at91_stn_modes,
|
||||
.modedb_len = ARRAY_SIZE(at91_stn_modes),
|
||||
.hfmin = 15000,
|
||||
.hfmax = 64000,
|
||||
.vfmin = 50,
|
||||
.vfmax = 150,
|
||||
};
|
||||
|
||||
#define AT91SAM9261_DEFAULT_STN_LCDCON2 (ATMEL_LCDC_MEMOR_LITTLE \
|
||||
| ATMEL_LCDC_DISTYPE_STNMONO \
|
||||
| ATMEL_LCDC_CLKMOD_ALWAYSACTIVE \
|
||||
| ATMEL_LCDC_IFWIDTH_4 \
|
||||
| ATMEL_LCDC_SCANMOD_SINGLE)
|
||||
|
||||
static void at91_lcdc_stn_power_control(int on)
|
||||
{
|
||||
/* backlight */
|
||||
if (on) { /* power up */
|
||||
at91_set_gpio_value(AT91_PIN_PC14, 0);
|
||||
at91_set_gpio_value(AT91_PIN_PC15, 0);
|
||||
} else { /* power down */
|
||||
at91_set_gpio_value(AT91_PIN_PC14, 1);
|
||||
at91_set_gpio_value(AT91_PIN_PC15, 1);
|
||||
}
|
||||
}
|
||||
|
||||
static struct atmel_lcdfb_info __initdata ek_lcdc_data = {
|
||||
.default_bpp = 1,
|
||||
.default_dmacon = ATMEL_LCDC_DMAEN,
|
||||
.default_lcdcon2 = AT91SAM9261_DEFAULT_STN_LCDCON2,
|
||||
.default_monspecs = &at91fb_default_stn_monspecs,
|
||||
.atmel_lcdfb_power_control = at91_lcdc_stn_power_control,
|
||||
.guard_time = 1,
|
||||
};
|
||||
|
||||
#else
|
||||
|
||||
/* TFT */
|
||||
static struct fb_videomode at91_tft_vga_modes[] = {
|
||||
{
|
||||
.name = "TX09D50VM1CCA @ 60",
|
||||
|
@ -296,7 +358,7 @@ static struct fb_videomode at91_tft_vga_modes[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static struct fb_monspecs at91fb_default_monspecs = {
|
||||
static struct fb_monspecs at91fb_default_tft_monspecs = {
|
||||
.manufacturer = "HIT",
|
||||
.monitor = "TX09D50VM1CCA",
|
||||
|
||||
|
@ -308,11 +370,11 @@ static struct fb_monspecs at91fb_default_monspecs = {
|
|||
.vfmax = 150,
|
||||
};
|
||||
|
||||
#define AT91SAM9261_DEFAULT_LCDCON2 (ATMEL_LCDC_MEMOR_LITTLE \
|
||||
#define AT91SAM9261_DEFAULT_TFT_LCDCON2 (ATMEL_LCDC_MEMOR_LITTLE \
|
||||
| ATMEL_LCDC_DISTYPE_TFT \
|
||||
| ATMEL_LCDC_CLKMOD_ALWAYSACTIVE)
|
||||
|
||||
static void at91_lcdc_power_control(int on)
|
||||
static void at91_lcdc_tft_power_control(int on)
|
||||
{
|
||||
if (on)
|
||||
at91_set_gpio_value(AT91_PIN_PA12, 0); /* power up */
|
||||
|
@ -320,15 +382,15 @@ static void at91_lcdc_power_control(int on)
|
|||
at91_set_gpio_value(AT91_PIN_PA12, 1); /* power down */
|
||||
}
|
||||
|
||||
/* Driver datas */
|
||||
static struct atmel_lcdfb_info __initdata ek_lcdc_data = {
|
||||
.default_bpp = 16,
|
||||
.default_dmacon = ATMEL_LCDC_DMAEN,
|
||||
.default_lcdcon2 = AT91SAM9261_DEFAULT_LCDCON2,
|
||||
.default_monspecs = &at91fb_default_monspecs,
|
||||
.atmel_lcdfb_power_control = at91_lcdc_power_control,
|
||||
.default_lcdcon2 = AT91SAM9261_DEFAULT_TFT_LCDCON2,
|
||||
.default_monspecs = &at91fb_default_tft_monspecs,
|
||||
.atmel_lcdfb_power_control = at91_lcdc_tft_power_control,
|
||||
.guard_time = 1,
|
||||
};
|
||||
#endif
|
||||
|
||||
#else
|
||||
static struct atmel_lcdfb_info __initdata ek_lcdc_data;
|
||||
|
@ -342,25 +404,25 @@ static struct atmel_lcdfb_info __initdata ek_lcdc_data;
|
|||
static struct gpio_keys_button ek_buttons[] = {
|
||||
{
|
||||
.gpio = AT91_PIN_PA27,
|
||||
.keycode = BTN_0,
|
||||
.code = BTN_0,
|
||||
.desc = "Button 0",
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.gpio = AT91_PIN_PA26,
|
||||
.keycode = BTN_1,
|
||||
.code = BTN_1,
|
||||
.desc = "Button 1",
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.gpio = AT91_PIN_PA25,
|
||||
.keycode = BTN_2,
|
||||
.code = BTN_2,
|
||||
.desc = "Button 2",
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.gpio = AT91_PIN_PA24,
|
||||
.keycode = BTN_3,
|
||||
.code = BTN_3,
|
||||
.desc = "Button 3",
|
||||
.active_low = 1,
|
||||
}
|
||||
|
|
|
@ -27,6 +27,8 @@
|
|||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/ads7846.h>
|
||||
#include <linux/fb.h>
|
||||
#include <linux/gpio_keys.h>
|
||||
#include <linux/input.h>
|
||||
|
||||
#include <video/atmel_lcdc.h>
|
||||
|
||||
|
@ -163,6 +165,7 @@ static struct at91_mmc_data __initdata ek_mmc_data = {
|
|||
* MACB Ethernet device
|
||||
*/
|
||||
static struct at91_eth_data __initdata ek_macb_data = {
|
||||
.phy_irq_pin = AT91_PIN_PE31,
|
||||
.is_rmii = 1,
|
||||
};
|
||||
|
||||
|
@ -263,6 +266,55 @@ static struct atmel_lcdfb_info __initdata ek_lcdc_data;
|
|||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* GPIO Buttons
|
||||
*/
|
||||
#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
|
||||
static struct gpio_keys_button ek_buttons[] = {
|
||||
{ /* BP1, "leftclic" */
|
||||
.code = BTN_LEFT,
|
||||
.gpio = AT91_PIN_PC5,
|
||||
.active_low = 1,
|
||||
.desc = "left_click",
|
||||
.wakeup = 1,
|
||||
},
|
||||
{ /* BP2, "rightclic" */
|
||||
.code = BTN_RIGHT,
|
||||
.gpio = AT91_PIN_PC4,
|
||||
.active_low = 1,
|
||||
.desc = "right_click",
|
||||
.wakeup = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_keys_platform_data ek_button_data = {
|
||||
.buttons = ek_buttons,
|
||||
.nbuttons = ARRAY_SIZE(ek_buttons),
|
||||
};
|
||||
|
||||
static struct platform_device ek_button_device = {
|
||||
.name = "gpio-keys",
|
||||
.id = -1,
|
||||
.num_resources = 0,
|
||||
.dev = {
|
||||
.platform_data = &ek_button_data,
|
||||
}
|
||||
};
|
||||
|
||||
static void __init ek_add_device_buttons(void)
|
||||
{
|
||||
at91_set_GPIO_periph(AT91_PIN_PC5, 0); /* left button */
|
||||
at91_set_deglitch(AT91_PIN_PC5, 1);
|
||||
at91_set_GPIO_periph(AT91_PIN_PC4, 0); /* right button */
|
||||
at91_set_deglitch(AT91_PIN_PC4, 1);
|
||||
|
||||
platform_device_register(&ek_button_device);
|
||||
}
|
||||
#else
|
||||
static void __init ek_add_device_buttons(void) {}
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* AC97
|
||||
*/
|
||||
|
@ -271,6 +323,30 @@ static struct atmel_ac97_data ek_ac97_data = {
|
|||
};
|
||||
|
||||
|
||||
/*
|
||||
* LEDs ... these could all be PWM-driven, for variable brightness
|
||||
*/
|
||||
static struct gpio_led ek_leds[] = {
|
||||
{ /* "left" led, green, userled1, pwm1 */
|
||||
.name = "ds1",
|
||||
.gpio = AT91_PIN_PB8,
|
||||
.active_low = 1,
|
||||
.default_trigger = "mmc0",
|
||||
},
|
||||
{ /* "right" led, green, userled2, pwm2 */
|
||||
.name = "ds2",
|
||||
.gpio = AT91_PIN_PC29,
|
||||
.active_low = 1,
|
||||
.default_trigger = "nand-disk",
|
||||
},
|
||||
{ /* "power" led, yellow, pwm0 */
|
||||
.name = "ds3",
|
||||
.gpio = AT91_PIN_PB7,
|
||||
.default_trigger = "heartbeat",
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
static void __init ek_board_init(void)
|
||||
{
|
||||
/* Serial */
|
||||
|
@ -294,8 +370,12 @@ static void __init ek_board_init(void)
|
|||
at91_add_device_i2c(NULL, 0);
|
||||
/* LCD Controller */
|
||||
at91_add_device_lcdc(&ek_lcdc_data);
|
||||
/* Push Buttons */
|
||||
ek_add_device_buttons();
|
||||
/* AC97 */
|
||||
at91_add_device_ac97(&ek_ac97_data);
|
||||
/* LEDs */
|
||||
at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds));
|
||||
}
|
||||
|
||||
MACHINE_START(AT91SAM9263EK, "Atmel AT91SAM9263-EK")
|
||||
|
|
|
@ -574,6 +574,8 @@ int __init at91_clock_init(unsigned long main_clock)
|
|||
} else if (cpu_is_at91sam9260() || cpu_is_at91sam9261() || cpu_is_at91sam9263()) {
|
||||
uhpck.pmc_mask = AT91SAM926x_PMC_UHP;
|
||||
udpck.pmc_mask = AT91SAM926x_PMC_UDP;
|
||||
} else if (cpu_is_at91cap9()) {
|
||||
uhpck.pmc_mask = AT91CAP9_PMC_UHP;
|
||||
}
|
||||
at91_sys_write(AT91_CKGR_PLLBR, 0);
|
||||
|
||||
|
|
|
@ -15,6 +15,7 @@ extern void __init at91sam9261_initialize(unsigned long main_clock);
|
|||
extern void __init at91sam9263_initialize(unsigned long main_clock);
|
||||
extern void __init at91sam9rl_initialize(unsigned long main_clock);
|
||||
extern void __init at91x40_initialize(unsigned long main_clock);
|
||||
extern void __init at91cap9_initialize(unsigned long main_clock);
|
||||
|
||||
/* Interrupts */
|
||||
extern void __init at91rm9200_init_interrupts(unsigned int priority[]);
|
||||
|
@ -23,6 +24,7 @@ extern void __init at91sam9261_init_interrupts(unsigned int priority[]);
|
|||
extern void __init at91sam9263_init_interrupts(unsigned int priority[]);
|
||||
extern void __init at91sam9rl_init_interrupts(unsigned int priority[]);
|
||||
extern void __init at91x40_init_interrupts(unsigned int priority[]);
|
||||
extern void __init at91cap9_init_interrupts(unsigned int priority[]);
|
||||
extern void __init at91_aic_init(unsigned int priority[]);
|
||||
|
||||
/* Timer */
|
||||
|
|
|
@ -13,6 +13,8 @@
|
|||
#include <linux/errno.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/module.h>
|
||||
|
@ -414,6 +416,66 @@ static void gpio_irq_handler(unsigned irq, struct irq_desc *desc)
|
|||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
|
||||
static int at91_gpio_show(struct seq_file *s, void *unused)
|
||||
{
|
||||
int bank, j;
|
||||
|
||||
/* print heading */
|
||||
seq_printf(s, "Pin\t");
|
||||
for (bank = 0; bank < gpio_banks; bank++) {
|
||||
seq_printf(s, "PIO%c\t", 'A' + bank);
|
||||
};
|
||||
seq_printf(s, "\n\n");
|
||||
|
||||
/* print pin status */
|
||||
for (j = 0; j < 32; j++) {
|
||||
seq_printf(s, "%i:\t", j);
|
||||
|
||||
for (bank = 0; bank < gpio_banks; bank++) {
|
||||
unsigned pin = PIN_BASE + (32 * bank) + j;
|
||||
void __iomem *pio = pin_to_controller(pin);
|
||||
unsigned mask = pin_to_mask(pin);
|
||||
|
||||
if (__raw_readl(pio + PIO_PSR) & mask)
|
||||
seq_printf(s, "GPIO:%s", __raw_readl(pio + PIO_PDSR) & mask ? "1" : "0");
|
||||
else
|
||||
seq_printf(s, "%s", __raw_readl(pio + PIO_ABSR) & mask ? "B" : "A");
|
||||
|
||||
seq_printf(s, "\t");
|
||||
}
|
||||
|
||||
seq_printf(s, "\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int at91_gpio_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, at91_gpio_show, NULL);
|
||||
}
|
||||
|
||||
static const struct file_operations at91_gpio_operations = {
|
||||
.open = at91_gpio_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static int __init at91_gpio_debugfs_init(void)
|
||||
{
|
||||
/* /sys/kernel/debug/at91_gpio */
|
||||
(void) debugfs_create_file("at91_gpio", S_IFREG | S_IRUGO, NULL, NULL, &at91_gpio_operations);
|
||||
return 0;
|
||||
}
|
||||
postcore_initcall(at91_gpio_debugfs_init);
|
||||
|
||||
#endif
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* Called from the processor-specific init to enable GPIO interrupt support.
|
||||
*/
|
||||
|
|
|
@ -14,11 +14,62 @@
|
|||
#include <linux/init.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/leds.h>
|
||||
#include <asm/arch/board.h>
|
||||
#include <asm/arch/gpio.h>
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_NEW_LEDS)
|
||||
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
/*
|
||||
* New cross-platform LED support.
|
||||
*/
|
||||
|
||||
static struct gpio_led_platform_data led_data;
|
||||
|
||||
static struct platform_device at91_leds = {
|
||||
.name = "leds-gpio",
|
||||
.id = -1,
|
||||
.dev.platform_data = &led_data,
|
||||
};
|
||||
|
||||
void __init at91_gpio_leds(struct gpio_led *leds, int nr)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!nr)
|
||||
return;
|
||||
|
||||
for (i = 0; i < nr; i++)
|
||||
at91_set_gpio_output(leds[i].gpio, leds[i].active_low);
|
||||
|
||||
led_data.leds = leds;
|
||||
led_data.num_leds = nr;
|
||||
platform_device_register(&at91_leds);
|
||||
}
|
||||
|
||||
#else
|
||||
void __init at91_gpio_leds(struct gpio_led *leds, int nr) {}
|
||||
#endif
|
||||
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
#if defined(CONFIG_LEDS)
|
||||
|
||||
#include <asm/leds.h>
|
||||
|
||||
/*
|
||||
* Old ARM-specific LED framework; not fully functional when generic time is
|
||||
* in use.
|
||||
*/
|
||||
|
||||
static u8 at91_leds_cpu;
|
||||
static u8 at91_leds_timer;
|
||||
|
||||
static inline void at91_led_on(unsigned int led)
|
||||
{
|
||||
at91_set_gpio_value(led, 0);
|
||||
|
@ -93,3 +144,18 @@ static int __init leds_init(void)
|
|||
}
|
||||
|
||||
__initcall(leds_init);
|
||||
|
||||
|
||||
void __init at91_init_leds(u8 cpu_led, u8 timer_led)
|
||||
{
|
||||
/* Enable GPIO to access the LEDs */
|
||||
at91_set_gpio_output(cpu_led, 1);
|
||||
at91_set_gpio_output(timer_led, 1);
|
||||
|
||||
at91_leds_cpu = cpu_led;
|
||||
at91_leds_timer = timer_led;
|
||||
}
|
||||
|
||||
#else
|
||||
void __init at91_init_leds(u8 cpu_led, u8 timer_led) {}
|
||||
#endif
|
||||
|
|
|
@ -80,6 +80,11 @@ static int at91_pm_verify_clocks(void)
|
|||
pr_debug("AT91: PM - Suspend-to-RAM with USB still active\n");
|
||||
return 0;
|
||||
}
|
||||
} else if (cpu_is_at91cap9()) {
|
||||
if ((scsr & AT91CAP9_PMC_UHP) != 0) {
|
||||
pr_debug("AT91: PM - Suspend-to-RAM with USB still active\n");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_AT91_PROGRAMMABLE_CLOCKS
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
* Core routines for Cirrus EP93xx chips.
|
||||
*
|
||||
* Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org>
|
||||
* Copyright (C) 2007 Herbert Valerio Riedel <hvr@gnu.org>
|
||||
*
|
||||
* Thanks go to Michael Burian and Ray Lehtiniemi for their key
|
||||
* role in the ep93xx linux community.
|
||||
|
@ -21,7 +22,6 @@
|
|||
#include <linux/serial.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/serial.h>
|
||||
#include <linux/serial_8250.h>
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/device.h>
|
||||
|
@ -153,38 +153,41 @@ static unsigned char gpio_int_enabled[3];
|
|||
static unsigned char gpio_int_type1[3];
|
||||
static unsigned char gpio_int_type2[3];
|
||||
|
||||
static void update_gpio_int_params(int abf)
|
||||
/* Port ordering is: A B F */
|
||||
static const u8 int_type1_register_offset[3] = { 0x90, 0xac, 0x4c };
|
||||
static const u8 int_type2_register_offset[3] = { 0x94, 0xb0, 0x50 };
|
||||
static const u8 eoi_register_offset[3] = { 0x98, 0xb4, 0x54 };
|
||||
static const u8 int_en_register_offset[3] = { 0x9c, 0xb8, 0x5c };
|
||||
|
||||
static void update_gpio_int_params(unsigned port)
|
||||
{
|
||||
if (abf == 0) {
|
||||
__raw_writeb(0, EP93XX_GPIO_A_INT_ENABLE);
|
||||
__raw_writeb(gpio_int_type2[0], EP93XX_GPIO_A_INT_TYPE2);
|
||||
__raw_writeb(gpio_int_type1[0], EP93XX_GPIO_A_INT_TYPE1);
|
||||
__raw_writeb(gpio_int_unmasked[0] & gpio_int_enabled[0], EP93XX_GPIO_A_INT_ENABLE);
|
||||
} else if (abf == 1) {
|
||||
__raw_writeb(0, EP93XX_GPIO_B_INT_ENABLE);
|
||||
__raw_writeb(gpio_int_type2[1], EP93XX_GPIO_B_INT_TYPE2);
|
||||
__raw_writeb(gpio_int_type1[1], EP93XX_GPIO_B_INT_TYPE1);
|
||||
__raw_writeb(gpio_int_unmasked[1] & gpio_int_enabled[1], EP93XX_GPIO_B_INT_ENABLE);
|
||||
} else if (abf == 2) {
|
||||
__raw_writeb(0, EP93XX_GPIO_F_INT_ENABLE);
|
||||
__raw_writeb(gpio_int_type2[2], EP93XX_GPIO_F_INT_TYPE2);
|
||||
__raw_writeb(gpio_int_type1[2], EP93XX_GPIO_F_INT_TYPE1);
|
||||
__raw_writeb(gpio_int_unmasked[2] & gpio_int_enabled[2], EP93XX_GPIO_F_INT_ENABLE);
|
||||
} else {
|
||||
BUG();
|
||||
}
|
||||
BUG_ON(port > 2);
|
||||
|
||||
__raw_writeb(0, EP93XX_GPIO_REG(int_en_register_offset[port]));
|
||||
|
||||
__raw_writeb(gpio_int_type2[port],
|
||||
EP93XX_GPIO_REG(int_type2_register_offset[port]));
|
||||
|
||||
__raw_writeb(gpio_int_type1[port],
|
||||
EP93XX_GPIO_REG(int_type1_register_offset[port]));
|
||||
|
||||
__raw_writeb(gpio_int_unmasked[port] & gpio_int_enabled[port],
|
||||
EP93XX_GPIO_REG(int_en_register_offset[port]));
|
||||
}
|
||||
|
||||
|
||||
static unsigned char data_register_offset[8] = {
|
||||
0x00, 0x04, 0x08, 0x0c, 0x20, 0x30, 0x38, 0x40,
|
||||
/* Port ordering is: A B F D E C G H */
|
||||
static const u8 data_register_offset[8] = {
|
||||
0x00, 0x04, 0x30, 0x0c, 0x20, 0x08, 0x38, 0x40,
|
||||
};
|
||||
|
||||
static unsigned char data_direction_register_offset[8] = {
|
||||
0x10, 0x14, 0x18, 0x1c, 0x24, 0x34, 0x3c, 0x44,
|
||||
static const u8 data_direction_register_offset[8] = {
|
||||
0x10, 0x14, 0x34, 0x1c, 0x24, 0x18, 0x3c, 0x44,
|
||||
};
|
||||
|
||||
void gpio_line_config(int line, int direction)
|
||||
#define GPIO_IN 0
|
||||
#define GPIO_OUT 1
|
||||
|
||||
static void ep93xx_gpio_set_direction(unsigned line, int direction)
|
||||
{
|
||||
unsigned int data_direction_register;
|
||||
unsigned long flags;
|
||||
|
@ -195,14 +198,10 @@ void gpio_line_config(int line, int direction)
|
|||
|
||||
local_irq_save(flags);
|
||||
if (direction == GPIO_OUT) {
|
||||
if (line >= 0 && line < 16) {
|
||||
/* Port A/B. */
|
||||
if (line >= 0 && line <= EP93XX_GPIO_LINE_MAX_IRQ) {
|
||||
/* Port A/B/F */
|
||||
gpio_int_unmasked[line >> 3] &= ~(1 << (line & 7));
|
||||
update_gpio_int_params(line >> 3);
|
||||
} else if (line >= 40 && line < 48) {
|
||||
/* Port F. */
|
||||
gpio_int_unmasked[2] &= ~(1 << (line & 7));
|
||||
update_gpio_int_params(2);
|
||||
}
|
||||
|
||||
v = __raw_readb(data_direction_register);
|
||||
|
@ -215,39 +214,58 @@ void gpio_line_config(int line, int direction)
|
|||
}
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
EXPORT_SYMBOL(gpio_line_config);
|
||||
|
||||
int gpio_line_get(int line)
|
||||
int gpio_direction_input(unsigned gpio)
|
||||
{
|
||||
if (gpio > EP93XX_GPIO_LINE_MAX)
|
||||
return -EINVAL;
|
||||
|
||||
ep93xx_gpio_set_direction(gpio, GPIO_IN);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(gpio_direction_input);
|
||||
|
||||
int gpio_direction_output(unsigned gpio, int value)
|
||||
{
|
||||
if (gpio > EP93XX_GPIO_LINE_MAX)
|
||||
return -EINVAL;
|
||||
|
||||
gpio_set_value(gpio, value);
|
||||
ep93xx_gpio_set_direction(gpio, GPIO_OUT);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(gpio_direction_output);
|
||||
|
||||
int gpio_get_value(unsigned gpio)
|
||||
{
|
||||
unsigned int data_register;
|
||||
|
||||
data_register = EP93XX_GPIO_REG(data_register_offset[line >> 3]);
|
||||
data_register = EP93XX_GPIO_REG(data_register_offset[gpio >> 3]);
|
||||
|
||||
return !!(__raw_readb(data_register) & (1 << (line & 7)));
|
||||
return !!(__raw_readb(data_register) & (1 << (gpio & 7)));
|
||||
}
|
||||
EXPORT_SYMBOL(gpio_line_get);
|
||||
EXPORT_SYMBOL(gpio_get_value);
|
||||
|
||||
void gpio_line_set(int line, int value)
|
||||
void gpio_set_value(unsigned gpio, int value)
|
||||
{
|
||||
unsigned int data_register;
|
||||
unsigned long flags;
|
||||
unsigned char v;
|
||||
|
||||
data_register = EP93XX_GPIO_REG(data_register_offset[line >> 3]);
|
||||
data_register = EP93XX_GPIO_REG(data_register_offset[gpio >> 3]);
|
||||
|
||||
local_irq_save(flags);
|
||||
if (value == EP93XX_GPIO_HIGH) {
|
||||
v = __raw_readb(data_register);
|
||||
v |= 1 << (line & 7);
|
||||
__raw_writeb(v, data_register);
|
||||
} else if (value == EP93XX_GPIO_LOW) {
|
||||
v = __raw_readb(data_register);
|
||||
v &= ~(1 << (line & 7));
|
||||
__raw_writeb(v, data_register);
|
||||
}
|
||||
v = __raw_readb(data_register);
|
||||
if (value)
|
||||
v |= 1 << (gpio & 7);
|
||||
else
|
||||
v &= ~(1 << (gpio & 7));
|
||||
__raw_writeb(v, data_register);
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
EXPORT_SYMBOL(gpio_line_set);
|
||||
EXPORT_SYMBOL(gpio_set_value);
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
|
@ -261,47 +279,67 @@ static void ep93xx_gpio_ab_irq_handler(unsigned int irq, struct irq_desc *desc)
|
|||
status = __raw_readb(EP93XX_GPIO_A_INT_STATUS);
|
||||
for (i = 0; i < 8; i++) {
|
||||
if (status & (1 << i)) {
|
||||
desc = irq_desc + IRQ_EP93XX_GPIO(0) + i;
|
||||
desc_handle_irq(IRQ_EP93XX_GPIO(0) + i, desc);
|
||||
int gpio_irq = gpio_to_irq(EP93XX_GPIO_LINE_A(0)) + i;
|
||||
desc = irq_desc + gpio_irq;
|
||||
desc_handle_irq(gpio_irq, desc);
|
||||
}
|
||||
}
|
||||
|
||||
status = __raw_readb(EP93XX_GPIO_B_INT_STATUS);
|
||||
for (i = 0; i < 8; i++) {
|
||||
if (status & (1 << i)) {
|
||||
desc = irq_desc + IRQ_EP93XX_GPIO(8) + i;
|
||||
desc_handle_irq(IRQ_EP93XX_GPIO(8) + i, desc);
|
||||
int gpio_irq = gpio_to_irq(EP93XX_GPIO_LINE_B(0)) + i;
|
||||
desc = irq_desc + gpio_irq;
|
||||
desc_handle_irq(gpio_irq, desc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void ep93xx_gpio_f_irq_handler(unsigned int irq, struct irq_desc *desc)
|
||||
{
|
||||
int gpio_irq = IRQ_EP93XX_GPIO(16) + (((irq + 1) & 7) ^ 4);
|
||||
/*
|
||||
* map discontiguous hw irq range to continous sw irq range:
|
||||
*
|
||||
* IRQ_EP93XX_GPIO{0..7}MUX -> gpio_to_irq(EP93XX_GPIO_LINE_F({0..7})
|
||||
*/
|
||||
int port_f_idx = ((irq + 1) & 7) ^ 4; /* {19..22,47..50} -> {0..7} */
|
||||
int gpio_irq = gpio_to_irq(EP93XX_GPIO_LINE_F(0)) + port_f_idx;
|
||||
|
||||
desc_handle_irq(gpio_irq, irq_desc + gpio_irq);
|
||||
}
|
||||
|
||||
static void ep93xx_gpio_irq_ack(unsigned int irq)
|
||||
{
|
||||
int line = irq_to_gpio(irq);
|
||||
int port = line >> 3;
|
||||
int port_mask = 1 << (line & 7);
|
||||
|
||||
if ((irq_desc[irq].status & IRQ_TYPE_SENSE_MASK) == IRQT_BOTHEDGE) {
|
||||
gpio_int_type2[port] ^= port_mask; /* switch edge direction */
|
||||
update_gpio_int_params(port);
|
||||
}
|
||||
|
||||
__raw_writeb(port_mask, EP93XX_GPIO_REG(eoi_register_offset[port]));
|
||||
}
|
||||
|
||||
static void ep93xx_gpio_irq_mask_ack(unsigned int irq)
|
||||
{
|
||||
int line = irq - IRQ_EP93XX_GPIO(0);
|
||||
int line = irq_to_gpio(irq);
|
||||
int port = line >> 3;
|
||||
int port_mask = 1 << (line & 7);
|
||||
|
||||
gpio_int_unmasked[port] &= ~(1 << (line & 7));
|
||||
if ((irq_desc[irq].status & IRQ_TYPE_SENSE_MASK) == IRQT_BOTHEDGE)
|
||||
gpio_int_type2[port] ^= port_mask; /* switch edge direction */
|
||||
|
||||
gpio_int_unmasked[port] &= ~port_mask;
|
||||
update_gpio_int_params(port);
|
||||
|
||||
if (port == 0) {
|
||||
__raw_writel(1 << (line & 7), EP93XX_GPIO_A_INT_ACK);
|
||||
} else if (port == 1) {
|
||||
__raw_writel(1 << (line & 7), EP93XX_GPIO_B_INT_ACK);
|
||||
} else if (port == 2) {
|
||||
__raw_writel(1 << (line & 7), EP93XX_GPIO_F_INT_ACK);
|
||||
}
|
||||
__raw_writeb(port_mask, EP93XX_GPIO_REG(eoi_register_offset[port]));
|
||||
}
|
||||
|
||||
static void ep93xx_gpio_irq_mask(unsigned int irq)
|
||||
{
|
||||
int line = irq - IRQ_EP93XX_GPIO(0);
|
||||
int line = irq_to_gpio(irq);
|
||||
int port = line >> 3;
|
||||
|
||||
gpio_int_unmasked[port] &= ~(1 << (line & 7));
|
||||
|
@ -310,7 +348,7 @@ static void ep93xx_gpio_irq_mask(unsigned int irq)
|
|||
|
||||
static void ep93xx_gpio_irq_unmask(unsigned int irq)
|
||||
{
|
||||
int line = irq - IRQ_EP93XX_GPIO(0);
|
||||
int line = irq_to_gpio(irq);
|
||||
int port = line >> 3;
|
||||
|
||||
gpio_int_unmasked[port] |= 1 << (line & 7);
|
||||
|
@ -325,38 +363,54 @@ static void ep93xx_gpio_irq_unmask(unsigned int irq)
|
|||
*/
|
||||
static int ep93xx_gpio_irq_type(unsigned int irq, unsigned int type)
|
||||
{
|
||||
int port;
|
||||
int line;
|
||||
struct irq_desc *desc = irq_desc + irq;
|
||||
const int gpio = irq_to_gpio(irq);
|
||||
const int port = gpio >> 3;
|
||||
const int port_mask = 1 << (gpio & 7);
|
||||
|
||||
line = irq - IRQ_EP93XX_GPIO(0);
|
||||
if (line >= 0 && line < 16) {
|
||||
gpio_line_config(line, GPIO_IN);
|
||||
} else {
|
||||
gpio_line_config(EP93XX_GPIO_LINE_F(line-16), GPIO_IN);
|
||||
ep93xx_gpio_set_direction(gpio, GPIO_IN);
|
||||
|
||||
switch (type) {
|
||||
case IRQT_RISING:
|
||||
gpio_int_type1[port] |= port_mask;
|
||||
gpio_int_type2[port] |= port_mask;
|
||||
desc->handle_irq = handle_edge_irq;
|
||||
break;
|
||||
case IRQT_FALLING:
|
||||
gpio_int_type1[port] |= port_mask;
|
||||
gpio_int_type2[port] &= ~port_mask;
|
||||
desc->handle_irq = handle_edge_irq;
|
||||
break;
|
||||
case IRQT_HIGH:
|
||||
gpio_int_type1[port] &= ~port_mask;
|
||||
gpio_int_type2[port] |= port_mask;
|
||||
desc->handle_irq = handle_level_irq;
|
||||
break;
|
||||
case IRQT_LOW:
|
||||
gpio_int_type1[port] &= ~port_mask;
|
||||
gpio_int_type2[port] &= ~port_mask;
|
||||
desc->handle_irq = handle_level_irq;
|
||||
break;
|
||||
case IRQT_BOTHEDGE:
|
||||
gpio_int_type1[port] |= port_mask;
|
||||
/* set initial polarity based on current input level */
|
||||
if (gpio_get_value(gpio))
|
||||
gpio_int_type2[port] &= ~port_mask; /* falling */
|
||||
else
|
||||
gpio_int_type2[port] |= port_mask; /* rising */
|
||||
desc->handle_irq = handle_edge_irq;
|
||||
break;
|
||||
default:
|
||||
pr_err("ep93xx: failed to set irq type %d for gpio %d\n",
|
||||
type, gpio);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
port = line >> 3;
|
||||
line &= 7;
|
||||
gpio_int_enabled[port] |= port_mask;
|
||||
|
||||
desc->status &= ~IRQ_TYPE_SENSE_MASK;
|
||||
desc->status |= type & IRQ_TYPE_SENSE_MASK;
|
||||
|
||||
if (type & IRQT_RISING) {
|
||||
gpio_int_enabled[port] |= 1 << line;
|
||||
gpio_int_type1[port] |= 1 << line;
|
||||
gpio_int_type2[port] |= 1 << line;
|
||||
} else if (type & IRQT_FALLING) {
|
||||
gpio_int_enabled[port] |= 1 << line;
|
||||
gpio_int_type1[port] |= 1 << line;
|
||||
gpio_int_type2[port] &= ~(1 << line);
|
||||
} else if (type & IRQT_HIGH) {
|
||||
gpio_int_enabled[port] |= 1 << line;
|
||||
gpio_int_type1[port] &= ~(1 << line);
|
||||
gpio_int_type2[port] |= 1 << line;
|
||||
} else if (type & IRQT_LOW) {
|
||||
gpio_int_enabled[port] |= 1 << line;
|
||||
gpio_int_type1[port] &= ~(1 << line);
|
||||
gpio_int_type2[port] &= ~(1 << line);
|
||||
} else {
|
||||
gpio_int_enabled[port] &= ~(1 << line);
|
||||
}
|
||||
update_gpio_int_params(port);
|
||||
|
||||
return 0;
|
||||
|
@ -364,7 +418,8 @@ static int ep93xx_gpio_irq_type(unsigned int irq, unsigned int type)
|
|||
|
||||
static struct irq_chip ep93xx_gpio_irq_chip = {
|
||||
.name = "GPIO",
|
||||
.ack = ep93xx_gpio_irq_mask_ack,
|
||||
.ack = ep93xx_gpio_irq_ack,
|
||||
.mask_ack = ep93xx_gpio_irq_mask_ack,
|
||||
.mask = ep93xx_gpio_irq_mask,
|
||||
.unmask = ep93xx_gpio_irq_unmask,
|
||||
.set_type = ep93xx_gpio_irq_type,
|
||||
|
@ -373,15 +428,16 @@ static struct irq_chip ep93xx_gpio_irq_chip = {
|
|||
|
||||
void __init ep93xx_init_irq(void)
|
||||
{
|
||||
int irq;
|
||||
int gpio_irq;
|
||||
|
||||
vic_init((void *)EP93XX_VIC1_BASE, 0, EP93XX_VIC1_VALID_IRQ_MASK);
|
||||
vic_init((void *)EP93XX_VIC2_BASE, 32, EP93XX_VIC2_VALID_IRQ_MASK);
|
||||
|
||||
for (irq = IRQ_EP93XX_GPIO(0); irq <= IRQ_EP93XX_GPIO(23); irq++) {
|
||||
set_irq_chip(irq, &ep93xx_gpio_irq_chip);
|
||||
set_irq_handler(irq, handle_level_irq);
|
||||
set_irq_flags(irq, IRQF_VALID);
|
||||
for (gpio_irq = gpio_to_irq(0);
|
||||
gpio_irq <= gpio_to_irq(EP93XX_GPIO_LINE_MAX_IRQ); ++gpio_irq) {
|
||||
set_irq_chip(gpio_irq, &ep93xx_gpio_irq_chip);
|
||||
set_irq_handler(gpio_irq, handle_level_irq);
|
||||
set_irq_flags(gpio_irq, IRQF_VALID);
|
||||
}
|
||||
|
||||
set_irq_chained_handler(IRQ_EP93XX_GPIO_AB, ep93xx_gpio_ab_irq_handler);
|
||||
|
|
|
@ -440,7 +440,7 @@ v3_pci_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
|
|||
return 1;
|
||||
}
|
||||
|
||||
static irqreturn_t v3_irq(int irq, void *devid)
|
||||
static irqreturn_t v3_irq(int dummy, void *devid)
|
||||
{
|
||||
#ifdef CONFIG_DEBUG_LL
|
||||
struct pt_regs *regs = get_irq_regs();
|
||||
|
@ -448,8 +448,10 @@ static irqreturn_t v3_irq(int irq, void *devid)
|
|||
unsigned long instr = *(unsigned long *)pc;
|
||||
char buf[128];
|
||||
|
||||
sprintf(buf, "V3 int %d: pc=0x%08lx [%08lx] LBFADDR=%08x LBFCODE=%02x ISTAT=%02x\n", irq,
|
||||
pc, instr, __raw_readl(SC_LBFADDR), __raw_readl(SC_LBFCODE) & 255,
|
||||
sprintf(buf, "V3 int %d: pc=0x%08lx [%08lx] LBFADDR=%08x LBFCODE=%02x "
|
||||
"ISTAT=%02x\n", IRQ_AP_V3INT, pc, instr,
|
||||
__raw_readl(SC_LBFADDR),
|
||||
__raw_readl(SC_LBFCODE) & 255,
|
||||
v3_readb(V3_LB_ISTAT));
|
||||
printascii(buf);
|
||||
#endif
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* Board support code for the GLAN Tank.
|
||||
*
|
||||
* Copyright (C) 2006 Martin Michlmayr <tbm@cyrius.com>
|
||||
* Copyright (C) 2006, 2007 Martin Michlmayr <tbm@cyrius.com>
|
||||
* Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
|
@ -21,6 +21,7 @@
|
|||
#include <linux/serial_core.h>
|
||||
#include <linux/serial_8250.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/io.h>
|
||||
|
@ -118,7 +119,7 @@ subsys_initcall(glantank_pci_init);
|
|||
* GLAN Tank machine initialization.
|
||||
*/
|
||||
static struct physmap_flash_data glantank_flash_data = {
|
||||
.width = 1,
|
||||
.width = 2,
|
||||
};
|
||||
|
||||
static struct resource glantank_flash_resource = {
|
||||
|
@ -166,6 +167,13 @@ static struct platform_device glantank_serial_device = {
|
|||
.resource = &glantank_uart_resource,
|
||||
};
|
||||
|
||||
static struct i2c_board_info __initdata glantank_i2c_devices[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("rtc-rs5c372", 0x32),
|
||||
.type = "rs5c372a",
|
||||
},
|
||||
};
|
||||
|
||||
static void glantank_power_off(void)
|
||||
{
|
||||
__raw_writeb(0x01, 0xfe8d0004);
|
||||
|
@ -183,6 +191,9 @@ static void __init glantank_init_machine(void)
|
|||
platform_device_register(&iop3xx_dma_0_channel);
|
||||
platform_device_register(&iop3xx_dma_1_channel);
|
||||
|
||||
i2c_register_board_info(0, glantank_i2c_devices,
|
||||
ARRAY_SIZE(glantank_i2c_devices));
|
||||
|
||||
pm_power_off = glantank_power_off;
|
||||
}
|
||||
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
#include <linux/serial.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/serial.h>
|
||||
#include <linux/serial_8250.h>
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/device.h>
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
#include <linux/tty.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/serial.h>
|
||||
#include <linux/serial_8250.h>
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/device.h>
|
||||
|
@ -40,7 +39,6 @@
|
|||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/irq.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/irq.h>
|
||||
#include <asm/mach/pci.h>
|
||||
|
||||
static int __init espresso_pci_init(void)
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
#include <linux/tty.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/serial.h>
|
||||
#include <linux/serial_8250.h>
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/device.h>
|
||||
|
@ -44,7 +43,6 @@
|
|||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/irq.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/irq.h>
|
||||
#include <asm/mach/pci.h>
|
||||
|
||||
/*
|
||||
|
|
|
@ -23,7 +23,6 @@
|
|||
#include <linux/tty.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/serial.h>
|
||||
#include <linux/serial_8250.h>
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/device.h>
|
||||
|
@ -44,7 +43,6 @@
|
|||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/irq.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/irq.h>
|
||||
#include <asm/mach/pci.h>
|
||||
|
||||
/*
|
||||
|
|
|
@ -21,7 +21,6 @@
|
|||
#include <linux/reboot.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/reboot.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@ obj-n :=
|
|||
obj- :=
|
||||
|
||||
# PCI support is optional
|
||||
#obj-$(CONFIG_PCI) += pci.o
|
||||
obj-$(CONFIG_PCI) += pci.o
|
||||
|
||||
# Board-specific support
|
||||
obj-$(CONFIG_MACH_KS8695) += board-micrel.o
|
||||
|
|
|
@ -40,7 +40,7 @@ static void __init micrel_init(void)
|
|||
printk(KERN_INFO "Micrel KS8695 Development Board initializing\n");
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
// ks8695_init_pci(&micrel_pci);
|
||||
ks8695_init_pci(&micrel_pci);
|
||||
#endif
|
||||
|
||||
/* Add devices */
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
@ -216,3 +218,84 @@ int irq_to_gpio(unsigned int irq)
|
|||
return (irq - KS8695_IRQ_EXTERN0);
|
||||
}
|
||||
EXPORT_SYMBOL(irq_to_gpio);
|
||||
|
||||
|
||||
/* .... Debug interface ..................................................... */
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
|
||||
static int ks8695_gpio_show(struct seq_file *s, void *unused)
|
||||
{
|
||||
unsigned int enable[] = { IOPC_IOEINT0EN, IOPC_IOEINT1EN, IOPC_IOEINT2EN, IOPC_IOEINT3EN, IOPC_IOTIM0EN, IOPC_IOTIM1EN };
|
||||
unsigned int intmask[] = { IOPC_IOEINT0TM, IOPC_IOEINT1TM, IOPC_IOEINT2TM, IOPC_IOEINT3TM };
|
||||
unsigned long mode, ctrl, data;
|
||||
int i;
|
||||
|
||||
mode = __raw_readl(KS8695_GPIO_VA + KS8695_IOPM);
|
||||
ctrl = __raw_readl(KS8695_GPIO_VA + KS8695_IOPC);
|
||||
data = __raw_readl(KS8695_GPIO_VA + KS8695_IOPD);
|
||||
|
||||
seq_printf(s, "Pin\tI/O\tFunction\tState\n\n");
|
||||
|
||||
for (i = KS8695_GPIO_0; i <= KS8695_GPIO_15 ; i++) {
|
||||
seq_printf(s, "%i:\t", i);
|
||||
|
||||
seq_printf(s, "%s\t", (mode & IOPM_(i)) ? "Output" : "Input");
|
||||
|
||||
if (i <= KS8695_GPIO_3) {
|
||||
if (ctrl & enable[i]) {
|
||||
seq_printf(s, "EXT%i ", i);
|
||||
|
||||
switch ((ctrl & intmask[i]) >> (4 * i)) {
|
||||
case IOPC_TM_LOW:
|
||||
seq_printf(s, "(Low)"); break;
|
||||
case IOPC_TM_HIGH:
|
||||
seq_printf(s, "(High)"); break;
|
||||
case IOPC_TM_RISING:
|
||||
seq_printf(s, "(Rising)"); break;
|
||||
case IOPC_TM_FALLING:
|
||||
seq_printf(s, "(Falling)"); break;
|
||||
case IOPC_TM_EDGE:
|
||||
seq_printf(s, "(Edges)"); break;
|
||||
}
|
||||
}
|
||||
else
|
||||
seq_printf(s, "GPIO\t");
|
||||
}
|
||||
else if (i <= KS8695_GPIO_5) {
|
||||
if (ctrl & enable[i])
|
||||
seq_printf(s, "TOUT%i\t", i - KS8695_GPIO_4);
|
||||
else
|
||||
seq_printf(s, "GPIO\t");
|
||||
}
|
||||
else
|
||||
seq_printf(s, "GPIO\t");
|
||||
|
||||
seq_printf(s, "\t");
|
||||
|
||||
seq_printf(s, "%i\n", (data & IOPD_(i)) ? 1 : 0);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ks8695_gpio_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, ks8695_gpio_show, NULL);
|
||||
}
|
||||
|
||||
static const struct file_operations ks8695_gpio_operations = {
|
||||
.open = ks8695_gpio_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static int __init ks8695_gpio_debugfs_init(void)
|
||||
{
|
||||
/* /sys/kernel/debug/ks8695_gpio */
|
||||
(void) debugfs_create_file("ks8695_gpio", S_IFREG | S_IRUGO, NULL, NULL, &ks8695_gpio_operations);
|
||||
return 0;
|
||||
}
|
||||
postcore_initcall(ks8695_gpio_debugfs_init);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -0,0 +1,326 @@
|
|||
/*
|
||||
* arch/arm/mach-ks8695/pci.c
|
||||
*
|
||||
* Copyright (C) 2003, Micrel Semiconductors
|
||||
* Copyright (C) 2006, Greg Ungerer <gerg@snapgear.com>
|
||||
* Copyright (C) 2006, Ben Dooks
|
||||
* Copyright (C) 2007, Andrew Victor
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/signal.h>
|
||||
#include <asm/mach/pci.h>
|
||||
#include <asm/hardware.h>
|
||||
|
||||
#include <asm/arch/devices.h>
|
||||
#include <asm/arch/regs-pci.h>
|
||||
|
||||
|
||||
static int pci_dbg;
|
||||
static int pci_cfg_dbg;
|
||||
|
||||
|
||||
static void ks8695_pci_setupconfig(unsigned int bus_nr, unsigned int devfn, unsigned int where)
|
||||
{
|
||||
unsigned long pbca;
|
||||
|
||||
pbca = PBCA_ENABLE | (where & ~3);
|
||||
pbca |= PCI_SLOT(devfn) << 11 ;
|
||||
pbca |= PCI_FUNC(devfn) << 8;
|
||||
pbca |= bus_nr << 16;
|
||||
|
||||
if (bus_nr == 0) {
|
||||
/* use Type-0 transaction */
|
||||
__raw_writel(pbca, KS8695_PCI_VA + KS8695_PBCA);
|
||||
} else {
|
||||
/* use Type-1 transaction */
|
||||
__raw_writel(pbca | PBCA_TYPE1, KS8695_PCI_VA + KS8695_PBCA);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* The KS8695 datasheet prohibits anything other than 32bit accesses
|
||||
* to the IO registers, so all our configuration must be done with
|
||||
* 32bit operations, and the correct bit masking and shifting.
|
||||
*/
|
||||
|
||||
static int ks8695_pci_readconfig(struct pci_bus *bus,
|
||||
unsigned int devfn, int where, int size, u32 *value)
|
||||
{
|
||||
ks8695_pci_setupconfig(bus->number, devfn, where);
|
||||
|
||||
*value = __raw_readl(KS8695_PCI_VA + KS8695_PBCD);
|
||||
|
||||
switch (size) {
|
||||
case 4:
|
||||
break;
|
||||
case 2:
|
||||
*value = *value >> ((where & 2) * 8);
|
||||
*value &= 0xffff;
|
||||
break;
|
||||
case 1:
|
||||
*value = *value >> ((where & 3) * 8);
|
||||
*value &= 0xff;
|
||||
break;
|
||||
}
|
||||
|
||||
if (pci_cfg_dbg) {
|
||||
printk("read: %d,%08x,%02x,%d: %08x (%08x)\n",
|
||||
bus->number, devfn, where, size, *value,
|
||||
__raw_readl(KS8695_PCI_VA + KS8695_PBCD));
|
||||
}
|
||||
|
||||
return PCIBIOS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
static int ks8695_pci_writeconfig(struct pci_bus *bus,
|
||||
unsigned int devfn, int where, int size, u32 value)
|
||||
{
|
||||
unsigned long tmp;
|
||||
|
||||
if (pci_cfg_dbg) {
|
||||
printk("write: %d,%08x,%02x,%d: %08x\n",
|
||||
bus->number, devfn, where, size, value);
|
||||
}
|
||||
|
||||
ks8695_pci_setupconfig(bus->number, devfn, where);
|
||||
|
||||
switch (size) {
|
||||
case 4:
|
||||
__raw_writel(value, KS8695_PCI_VA + KS8695_PBCD);
|
||||
break;
|
||||
case 2:
|
||||
tmp = __raw_readl(KS8695_PCI_VA + KS8695_PBCD);
|
||||
tmp &= ~(0xffff << ((where & 2) * 8));
|
||||
tmp |= value << ((where & 2) * 8);
|
||||
|
||||
__raw_writel(tmp, KS8695_PCI_VA + KS8695_PBCD);
|
||||
break;
|
||||
case 1:
|
||||
tmp = __raw_readl(KS8695_PCI_VA + KS8695_PBCD);
|
||||
tmp &= ~(0xff << ((where & 3) * 8));
|
||||
tmp |= value << ((where & 3) * 8);
|
||||
|
||||
__raw_writel(tmp, KS8695_PCI_VA + KS8695_PBCD);
|
||||
break;
|
||||
}
|
||||
|
||||
return PCIBIOS_SUCCESSFUL;
|
||||
}
|
||||
|
||||
static void ks8695_local_writeconfig(int where, u32 value)
|
||||
{
|
||||
ks8695_pci_setupconfig(0, 0, where);
|
||||
__raw_writel(value, KS8695_PCI_VA + KS8695_PBCD);
|
||||
}
|
||||
|
||||
static struct pci_ops ks8695_pci_ops = {
|
||||
.read = ks8695_pci_readconfig,
|
||||
.write = ks8695_pci_writeconfig,
|
||||
};
|
||||
|
||||
static struct pci_bus *ks8695_pci_scan_bus(int nr, struct pci_sys_data *sys)
|
||||
{
|
||||
return pci_scan_bus(sys->busnr, &ks8695_pci_ops, sys);
|
||||
}
|
||||
|
||||
static struct resource pci_mem = {
|
||||
.name = "PCI Memory space",
|
||||
.start = KS8695_PCIMEM_PA,
|
||||
.end = KS8695_PCIMEM_PA + (KS8695_PCIMEM_SIZE - 1),
|
||||
.flags = IORESOURCE_MEM,
|
||||
};
|
||||
|
||||
static struct resource pci_io = {
|
||||
.name = "PCI IO space",
|
||||
.start = KS8695_PCIIO_PA,
|
||||
.end = KS8695_PCIIO_PA + (KS8695_PCIIO_SIZE - 1),
|
||||
.flags = IORESOURCE_IO,
|
||||
};
|
||||
|
||||
static int __init ks8695_pci_setup(int nr, struct pci_sys_data *sys)
|
||||
{
|
||||
if (nr > 0)
|
||||
return 0;
|
||||
|
||||
request_resource(&iomem_resource, &pci_mem);
|
||||
request_resource(&ioport_resource, &pci_io);
|
||||
|
||||
sys->resource[0] = &pci_io;
|
||||
sys->resource[1] = &pci_mem;
|
||||
sys->resource[2] = NULL;
|
||||
|
||||
/* Assign and enable processor bridge */
|
||||
ks8695_local_writeconfig(PCI_BASE_ADDRESS_0, KS8695_PCIMEM_PA);
|
||||
|
||||
/* Enable bus-master & Memory Space access */
|
||||
ks8695_local_writeconfig(PCI_COMMAND, PCI_COMMAND_MASTER | PCI_COMMAND_MEMORY);
|
||||
|
||||
/* Set cache-line size & latency. */
|
||||
ks8695_local_writeconfig(PCI_CACHE_LINE_SIZE, (32 << 8) | (L1_CACHE_BYTES / sizeof(u32)));
|
||||
|
||||
/* Reserve PCI memory space for PCI-AHB resources */
|
||||
if (!request_mem_region(KS8695_PCIMEM_PA, SZ_64M, "PCI-AHB Bridge")) {
|
||||
printk(KERN_ERR "Cannot allocate PCI-AHB Bridge memory.\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline unsigned int size_mask(unsigned long size)
|
||||
{
|
||||
return (~size) + 1;
|
||||
}
|
||||
|
||||
static int ks8695_pci_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
|
||||
{
|
||||
unsigned long pc = instruction_pointer(regs);
|
||||
unsigned long instr = *(unsigned long *)pc;
|
||||
unsigned long cmdstat;
|
||||
|
||||
cmdstat = __raw_readl(KS8695_PCI_VA + KS8695_CRCFCS);
|
||||
|
||||
printk(KERN_ERR "PCI abort: address = 0x%08lx fsr = 0x%03x PC = 0x%08lx LR = 0x%08lx [%s%s%s%s%s]\n",
|
||||
addr, fsr, regs->ARM_pc, regs->ARM_lr,
|
||||
cmdstat & (PCI_STATUS_SIG_TARGET_ABORT << 16) ? "GenTarget" : " ",
|
||||
cmdstat & (PCI_STATUS_REC_TARGET_ABORT << 16) ? "RecvTarget" : " ",
|
||||
cmdstat & (PCI_STATUS_REC_MASTER_ABORT << 16) ? "MasterAbort" : " ",
|
||||
cmdstat & (PCI_STATUS_SIG_SYSTEM_ERROR << 16) ? "SysError" : " ",
|
||||
cmdstat & (PCI_STATUS_DETECTED_PARITY << 16) ? "Parity" : " "
|
||||
);
|
||||
|
||||
__raw_writel(cmdstat, KS8695_PCI_VA + KS8695_CRCFCS);
|
||||
|
||||
/*
|
||||
* If the instruction being executed was a read,
|
||||
* make it look like it read all-ones.
|
||||
*/
|
||||
if ((instr & 0x0c100000) == 0x04100000) {
|
||||
int reg = (instr >> 12) & 15;
|
||||
unsigned long val;
|
||||
|
||||
if (instr & 0x00400000)
|
||||
val = 255;
|
||||
else
|
||||
val = -1;
|
||||
|
||||
regs->uregs[reg] = val;
|
||||
regs->ARM_pc += 4;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ((instr & 0x0e100090) == 0x00100090) {
|
||||
int reg = (instr >> 12) & 15;
|
||||
|
||||
regs->uregs[reg] = -1;
|
||||
regs->ARM_pc += 4;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void __init ks8695_pci_preinit(void)
|
||||
{
|
||||
/* stage 1 initialization, subid, subdevice = 0x0001 */
|
||||
__raw_writel(0x00010001, KS8695_PCI_VA + KS8695_CRCSID);
|
||||
|
||||
/* stage 2 initialization */
|
||||
/* prefetch limits with 16 words, retry enable */
|
||||
__raw_writel(0x40000000, KS8695_PCI_VA + KS8695_PBCS);
|
||||
|
||||
/* configure memory mapping */
|
||||
__raw_writel(KS8695_PCIMEM_PA, KS8695_PCI_VA + KS8695_PMBA);
|
||||
__raw_writel(size_mask(KS8695_PCIMEM_SIZE), KS8695_PCI_VA + KS8695_PMBAM);
|
||||
__raw_writel(KS8695_PCIMEM_PA, KS8695_PCI_VA + KS8695_PMBAT);
|
||||
__raw_writel(0, KS8695_PCI_VA + KS8695_PMBAC);
|
||||
|
||||
/* configure IO mapping */
|
||||
__raw_writel(KS8695_PCIIO_PA, KS8695_PCI_VA + KS8695_PIOBA);
|
||||
__raw_writel(size_mask(KS8695_PCIIO_SIZE), KS8695_PCI_VA + KS8695_PIOBAM);
|
||||
__raw_writel(KS8695_PCIIO_PA, KS8695_PCI_VA + KS8695_PIOBAT);
|
||||
__raw_writel(0, KS8695_PCI_VA + KS8695_PIOBAC);
|
||||
|
||||
/* hook in fault handlers */
|
||||
hook_fault_code(8, ks8695_pci_fault, SIGBUS, "external abort on non-linefetch");
|
||||
hook_fault_code(10, ks8695_pci_fault, SIGBUS, "external abort on non-linefetch");
|
||||
}
|
||||
|
||||
static void ks8695_show_pciregs(void)
|
||||
{
|
||||
if (!pci_dbg)
|
||||
return;
|
||||
|
||||
printk(KERN_INFO "PCI: CRCFID = %08x\n", __raw_readl(KS8695_PCI_VA + KS8695_CRCFID));
|
||||
printk(KERN_INFO "PCI: CRCFCS = %08x\n", __raw_readl(KS8695_PCI_VA + KS8695_CRCFCS));
|
||||
printk(KERN_INFO "PCI: CRCFRV = %08x\n", __raw_readl(KS8695_PCI_VA + KS8695_CRCFRV));
|
||||
printk(KERN_INFO "PCI: CRCFLT = %08x\n", __raw_readl(KS8695_PCI_VA + KS8695_CRCFLT));
|
||||
printk(KERN_INFO "PCI: CRCBMA = %08x\n", __raw_readl(KS8695_PCI_VA + KS8695_CRCBMA));
|
||||
printk(KERN_INFO "PCI: CRCSID = %08x\n", __raw_readl(KS8695_PCI_VA + KS8695_CRCSID));
|
||||
printk(KERN_INFO "PCI: CRCFIT = %08x\n", __raw_readl(KS8695_PCI_VA + KS8695_CRCFIT));
|
||||
|
||||
printk(KERN_INFO "PCI: PBM = %08x\n", __raw_readl(KS8695_PCI_VA + KS8695_PBM));
|
||||
printk(KERN_INFO "PCI: PBCS = %08x\n", __raw_readl(KS8695_PCI_VA + KS8695_PBCS));
|
||||
|
||||
printk(KERN_INFO "PCI: PMBA = %08x\n", __raw_readl(KS8695_PCI_VA + KS8695_PMBA));
|
||||
printk(KERN_INFO "PCI: PMBAC = %08x\n", __raw_readl(KS8695_PCI_VA + KS8695_PMBAC));
|
||||
printk(KERN_INFO "PCI: PMBAM = %08x\n", __raw_readl(KS8695_PCI_VA + KS8695_PMBAM));
|
||||
printk(KERN_INFO "PCI: PMBAT = %08x\n", __raw_readl(KS8695_PCI_VA + KS8695_PMBAT));
|
||||
|
||||
printk(KERN_INFO "PCI: PIOBA = %08x\n", __raw_readl(KS8695_PCI_VA + KS8695_PIOBA));
|
||||
printk(KERN_INFO "PCI: PIOBAC = %08x\n", __raw_readl(KS8695_PCI_VA + KS8695_PIOBAC));
|
||||
printk(KERN_INFO "PCI: PIOBAM = %08x\n", __raw_readl(KS8695_PCI_VA + KS8695_PIOBAM));
|
||||
printk(KERN_INFO "PCI: PIOBAT = %08x\n", __raw_readl(KS8695_PCI_VA + KS8695_PIOBAT));
|
||||
}
|
||||
|
||||
|
||||
static struct hw_pci ks8695_pci __initdata = {
|
||||
.nr_controllers = 1,
|
||||
.preinit = ks8695_pci_preinit,
|
||||
.setup = ks8695_pci_setup,
|
||||
.scan = ks8695_pci_scan_bus,
|
||||
.postinit = NULL,
|
||||
.swizzle = pci_std_swizzle,
|
||||
.map_irq = NULL,
|
||||
};
|
||||
|
||||
void __init ks8695_init_pci(struct ks8695_pci_cfg *cfg)
|
||||
{
|
||||
if (__raw_readl(KS8695_PCI_VA + KS8695_CRCFRV) & CFRV_GUEST) {
|
||||
printk("PCI: KS8695 in guest mode, not initialising\n");
|
||||
return;
|
||||
}
|
||||
|
||||
printk(KERN_INFO "PCI: Initialising\n");
|
||||
ks8695_show_pciregs();
|
||||
|
||||
/* set Mode */
|
||||
__raw_writel(cfg->mode << 29, KS8695_PCI_VA + KS8695_PBM);
|
||||
|
||||
ks8695_pci.map_irq = cfg->map_irq; /* board-specific map_irq method */
|
||||
|
||||
pci_common_init(&ks8695_pci);
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
if ARCH_MSM7X00A
|
||||
|
||||
comment "MSM7X00A Board Type"
|
||||
depends on ARCH_MSM7X00A
|
||||
|
||||
config MACH_HALIBUT
|
||||
depends on ARCH_MSM7X00A
|
||||
default y
|
||||
bool "Halibut Board (QCT SURF7200A)"
|
||||
help
|
||||
Support for the Qualcomm SURF7200A eval board.
|
||||
|
||||
config MSM7X00A_IDLE
|
||||
depends on ARCH_MSM7X00A
|
||||
default y
|
||||
bool "Idle Support for MSM7X00A"
|
||||
|
||||
endif
|
|
@ -0,0 +1,7 @@
|
|||
obj-y += io.o idle.o irq.o timer.o dma.o
|
||||
|
||||
# Common code for board init
|
||||
obj-y += common.o
|
||||
|
||||
obj-$(CONFIG_MACH_HALIBUT) += board-halibut.o
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
zreladdr-y := 0x10008000
|
||||
params_phys-y := 0x10000100
|
||||
initrd_phys-y := 0x10800000
|
|
@ -0,0 +1,114 @@
|
|||
/* linux/arch/arm/mach-msm/board-halibut.c
|
||||
*
|
||||
* Copyright (C) 2007 Google, Inc.
|
||||
* Author: Brian Swetland <swetland@google.com>
|
||||
*
|
||||
* This software is licensed under the terms of the GNU General Public
|
||||
* License version 2, as published by the Free Software Foundation, and
|
||||
* may be copied, distributed, and modified under those terms.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/input.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/flash.h>
|
||||
|
||||
#include <asm/arch/board.h>
|
||||
#include <asm/arch/msm_iomap.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/delay.h>
|
||||
|
||||
#include <linux/mtd/nand.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
|
||||
static struct resource smc91x_resources[] = {
|
||||
[0] = {
|
||||
.start = 0x9C004300,
|
||||
.end = 0x9C004400,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = MSM_GPIO_TO_INT(49),
|
||||
.end = MSM_GPIO_TO_INT(49),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device smc91x_device = {
|
||||
.name = "smc91x",
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(smc91x_resources),
|
||||
.resource = smc91x_resources,
|
||||
};
|
||||
|
||||
static void mddi0_panel_power(int on)
|
||||
{
|
||||
}
|
||||
|
||||
static struct msm_mddi_platform_data msm_mddi0_pdata = {
|
||||
.panel_power = mddi0_panel_power,
|
||||
.has_vsync_irq = 0,
|
||||
};
|
||||
|
||||
static struct platform_device msm_mddi0_device = {
|
||||
.name = "msm_mddi",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &msm_mddi0_pdata
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device msm_serial0_device = {
|
||||
.name = "msm_serial",
|
||||
.id = 0,
|
||||
};
|
||||
|
||||
static struct platform_device *devices[] __initdata = {
|
||||
&msm_serial0_device,
|
||||
&msm_mddi0_device,
|
||||
&smc91x_device,
|
||||
};
|
||||
|
||||
extern struct sys_timer msm_timer;
|
||||
|
||||
static void __init halibut_init_irq(void)
|
||||
{
|
||||
msm_init_irq();
|
||||
}
|
||||
|
||||
static void __init halibut_init(void)
|
||||
{
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
msm_add_devices();
|
||||
}
|
||||
|
||||
static void __init halibut_map_io(void)
|
||||
{
|
||||
msm_map_common_io();
|
||||
}
|
||||
|
||||
MACHINE_START(HALIBUT, "Halibut Board (QCT SURF7200A)")
|
||||
|
||||
/* UART for LL DEBUG */
|
||||
.phys_io = MSM_UART1_PHYS,
|
||||
.io_pg_offst = ((MSM_UART1_BASE) >> 18) & 0xfffc,
|
||||
|
||||
.boot_params = 0x10000100,
|
||||
.map_io = halibut_map_io,
|
||||
.init_irq = halibut_init_irq,
|
||||
.init_machine = halibut_init,
|
||||
.timer = &msm_timer,
|
||||
MACHINE_END
|
|
@ -0,0 +1,116 @@
|
|||
/* linux/arch/arm/mach-msm/common.c
|
||||
*
|
||||
* Common setup code for MSM7K Boards
|
||||
*
|
||||
* Copyright (C) 2007 Google, Inc.
|
||||
* Author: Brian Swetland <swetland@google.com>
|
||||
*
|
||||
* This software is licensed under the terms of the GNU General Public
|
||||
* License version 2, as published by the Free Software Foundation, and
|
||||
* may be copied, distributed, and modified under those terms.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <asm/mach/flash.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
|
||||
#include <linux/mtd/nand.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
|
||||
#include <asm/arch/msm_iomap.h>
|
||||
|
||||
#include <asm/arch/board.h>
|
||||
|
||||
struct flash_platform_data msm_nand_data = {
|
||||
.parts = 0,
|
||||
.nr_parts = 0,
|
||||
};
|
||||
|
||||
static struct resource msm_nand_resources[] = {
|
||||
[0] = {
|
||||
.start = 7,
|
||||
.end = 7,
|
||||
.flags = IORESOURCE_DMA,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device msm_nand_device = {
|
||||
.name = "msm_nand",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(msm_nand_resources),
|
||||
.resource = msm_nand_resources,
|
||||
.dev = {
|
||||
.platform_data = &msm_nand_data,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device msm_smd_device = {
|
||||
.name = "msm_smd",
|
||||
.id = -1,
|
||||
};
|
||||
|
||||
static struct resource msm_i2c_resources[] = {
|
||||
{
|
||||
.start = MSM_I2C_BASE,
|
||||
.end = MSM_I2C_BASE + MSM_I2C_SIZE - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.start = INT_PWB_I2C,
|
||||
.end = INT_PWB_I2C,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device msm_i2c_device = {
|
||||
.name = "msm_i2c",
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(msm_i2c_resources),
|
||||
.resource = msm_i2c_resources,
|
||||
};
|
||||
|
||||
static struct resource usb_resources[] = {
|
||||
{
|
||||
.start = MSM_HSUSB_PHYS,
|
||||
.end = MSM_HSUSB_PHYS + MSM_HSUSB_SIZE,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.start = INT_USB_HS,
|
||||
.end = INT_USB_HS,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device msm_hsusb_device = {
|
||||
.name = "msm_hsusb",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(usb_resources),
|
||||
.resource = usb_resources,
|
||||
.dev = {
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device *devices[] __initdata = {
|
||||
&msm_nand_device,
|
||||
&msm_smd_device,
|
||||
&msm_i2c_device,
|
||||
&msm_hsusb_device,
|
||||
};
|
||||
|
||||
void __init msm_add_devices(void)
|
||||
{
|
||||
platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
}
|
|
@ -0,0 +1,214 @@
|
|||
/* linux/arch/arm/mach-msm/dma.c
|
||||
*
|
||||
* Copyright (C) 2007 Google, Inc.
|
||||
*
|
||||
* This software is licensed under the terms of the GNU General Public
|
||||
* License version 2, as published by the Free Software Foundation, and
|
||||
* may be copied, distributed, and modified under those terms.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <asm/arch/dma.h>
|
||||
|
||||
#define MSM_DMOV_CHANNEL_COUNT 16
|
||||
|
||||
enum {
|
||||
MSM_DMOV_PRINT_ERRORS = 1,
|
||||
MSM_DMOV_PRINT_IO = 2,
|
||||
MSM_DMOV_PRINT_FLOW = 4
|
||||
};
|
||||
|
||||
static DEFINE_SPINLOCK(msm_dmov_lock);
|
||||
static struct msm_dmov_cmd active_command;
|
||||
static struct list_head ready_commands[MSM_DMOV_CHANNEL_COUNT];
|
||||
static struct list_head active_commands[MSM_DMOV_CHANNEL_COUNT];
|
||||
unsigned int msm_dmov_print_mask = MSM_DMOV_PRINT_ERRORS;
|
||||
|
||||
#define MSM_DMOV_DPRINTF(mask, format, args...) \
|
||||
do { \
|
||||
if ((mask) & msm_dmov_print_mask) \
|
||||
printk(KERN_ERR format, args); \
|
||||
} while (0)
|
||||
#define PRINT_ERROR(format, args...) \
|
||||
MSM_DMOV_DPRINTF(MSM_DMOV_PRINT_ERRORS, format, args);
|
||||
#define PRINT_IO(format, args...) \
|
||||
MSM_DMOV_DPRINTF(MSM_DMOV_PRINT_IO, format, args);
|
||||
#define PRINT_FLOW(format, args...) \
|
||||
MSM_DMOV_DPRINTF(MSM_DMOV_PRINT_FLOW, format, args);
|
||||
|
||||
void msm_dmov_enqueue_cmd(unsigned id, struct msm_dmov_cmd *cmd)
|
||||
{
|
||||
unsigned long irq_flags;
|
||||
unsigned int status;
|
||||
|
||||
spin_lock_irqsave(&msm_dmov_lock, irq_flags);
|
||||
status = readl(DMOV_STATUS(id));
|
||||
if (list_empty(&ready_commands[id]) &&
|
||||
(status & DMOV_STATUS_CMD_PTR_RDY)) {
|
||||
#if 0
|
||||
if (list_empty(&active_commands[id])) {
|
||||
PRINT_FLOW("msm_dmov_enqueue_cmd(%d), enable interrupt\n", id);
|
||||
writel(DMOV_CONFIG_IRQ_EN, DMOV_CONFIG(id));
|
||||
}
|
||||
#endif
|
||||
PRINT_IO("msm_dmov_enqueue_cmd(%d), start command, status %x\n", id, status);
|
||||
list_add_tail(&cmd->list, &active_commands[id]);
|
||||
writel(cmd->cmdptr, DMOV_CMD_PTR(id));
|
||||
} else {
|
||||
if (list_empty(&active_commands[id]))
|
||||
PRINT_ERROR("msm_dmov_enqueue_cmd(%d), error datamover stalled, status %x\n", id, status);
|
||||
|
||||
PRINT_IO("msm_dmov_enqueue_cmd(%d), enqueue command, status %x\n", id, status);
|
||||
list_add_tail(&cmd->list, &ready_commands[id]);
|
||||
}
|
||||
spin_unlock_irqrestore(&msm_dmov_lock, irq_flags);
|
||||
}
|
||||
|
||||
struct msm_dmov_exec_cmdptr_cmd {
|
||||
struct msm_dmov_cmd dmov_cmd;
|
||||
struct completion complete;
|
||||
unsigned id;
|
||||
unsigned int result;
|
||||
unsigned int flush[6];
|
||||
};
|
||||
|
||||
static void dmov_exec_cmdptr_complete_func(struct msm_dmov_cmd *_cmd, unsigned int result)
|
||||
{
|
||||
struct msm_dmov_exec_cmdptr_cmd *cmd = container_of(_cmd, struct msm_dmov_exec_cmdptr_cmd, dmov_cmd);
|
||||
cmd->result = result;
|
||||
if (result != 0x80000002) {
|
||||
cmd->flush[0] = readl(DMOV_FLUSH0(cmd->id));
|
||||
cmd->flush[1] = readl(DMOV_FLUSH1(cmd->id));
|
||||
cmd->flush[2] = readl(DMOV_FLUSH2(cmd->id));
|
||||
cmd->flush[3] = readl(DMOV_FLUSH3(cmd->id));
|
||||
cmd->flush[4] = readl(DMOV_FLUSH4(cmd->id));
|
||||
cmd->flush[5] = readl(DMOV_FLUSH5(cmd->id));
|
||||
}
|
||||
complete(&cmd->complete);
|
||||
}
|
||||
|
||||
int msm_dmov_exec_cmd(unsigned id, unsigned int cmdptr)
|
||||
{
|
||||
struct msm_dmov_exec_cmdptr_cmd cmd;
|
||||
|
||||
PRINT_FLOW("dmov_exec_cmdptr(%d, %x)\n", id, cmdptr);
|
||||
|
||||
cmd.dmov_cmd.cmdptr = cmdptr;
|
||||
cmd.dmov_cmd.complete_func = dmov_exec_cmdptr_complete_func;
|
||||
cmd.id = id;
|
||||
init_completion(&cmd.complete);
|
||||
|
||||
msm_dmov_enqueue_cmd(id, &cmd.dmov_cmd);
|
||||
wait_for_completion(&cmd.complete);
|
||||
|
||||
if (cmd.result != 0x80000002) {
|
||||
PRINT_ERROR("dmov_exec_cmdptr(%d): ERROR, result: %x\n", id, cmd.result);
|
||||
PRINT_ERROR("dmov_exec_cmdptr(%d): flush: %x %x %x %x\n",
|
||||
id, cmd.flush[0], cmd.flush[1], cmd.flush[2], cmd.flush[3]);
|
||||
return -EIO;
|
||||
}
|
||||
PRINT_FLOW("dmov_exec_cmdptr(%d, %x) done\n", id, cmdptr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static irqreturn_t msm_datamover_irq_handler(int irq, void *dev_id)
|
||||
{
|
||||
unsigned int int_status, mask, id;
|
||||
unsigned long irq_flags;
|
||||
unsigned int ch_status;
|
||||
unsigned int ch_result;
|
||||
struct msm_dmov_cmd *cmd;
|
||||
|
||||
spin_lock_irqsave(&msm_dmov_lock, irq_flags);
|
||||
|
||||
int_status = readl(DMOV_ISR); /* read and clear interrupt */
|
||||
PRINT_FLOW("msm_datamover_irq_handler: DMOV_ISR %x\n", int_status);
|
||||
|
||||
while (int_status) {
|
||||
mask = int_status & -int_status;
|
||||
id = fls(mask) - 1;
|
||||
PRINT_FLOW("msm_datamover_irq_handler %08x %08x id %d\n", int_status, mask, id);
|
||||
int_status &= ~mask;
|
||||
ch_status = readl(DMOV_STATUS(id));
|
||||
if (!(ch_status & DMOV_STATUS_RSLT_VALID)) {
|
||||
PRINT_FLOW("msm_datamover_irq_handler id %d, result not valid %x\n", id, ch_status);
|
||||
continue;
|
||||
}
|
||||
do {
|
||||
ch_result = readl(DMOV_RSLT(id));
|
||||
if (list_empty(&active_commands[id])) {
|
||||
PRINT_ERROR("msm_datamover_irq_handler id %d, got result "
|
||||
"with no active command, status %x, result %x\n",
|
||||
id, ch_status, ch_result);
|
||||
cmd = NULL;
|
||||
} else
|
||||
cmd = list_entry(active_commands[id].next, typeof(*cmd), list);
|
||||
PRINT_FLOW("msm_datamover_irq_handler id %d, status %x, result %x\n", id, ch_status, ch_result);
|
||||
if (ch_result & DMOV_RSLT_DONE) {
|
||||
PRINT_FLOW("msm_datamover_irq_handler id %d, status %x\n",
|
||||
id, ch_status);
|
||||
PRINT_IO("msm_datamover_irq_handler id %d, got result "
|
||||
"for %p, result %x\n", id, cmd, ch_result);
|
||||
if (cmd) {
|
||||
list_del(&cmd->list);
|
||||
cmd->complete_func(cmd, ch_result);
|
||||
}
|
||||
}
|
||||
if (ch_result & DMOV_RSLT_FLUSH) {
|
||||
unsigned int flush0 = readl(DMOV_FLUSH0(id));
|
||||
PRINT_FLOW("msm_datamover_irq_handler id %d, status %x\n", id, ch_status);
|
||||
PRINT_FLOW("msm_datamover_irq_handler id %d, flush, result %x, flush0 %x\n", id, ch_result, flush0);
|
||||
if (cmd) {
|
||||
list_del(&cmd->list);
|
||||
cmd->complete_func(cmd, ch_result);
|
||||
}
|
||||
}
|
||||
if (ch_result & DMOV_RSLT_ERROR) {
|
||||
unsigned int flush0 = readl(DMOV_FLUSH0(id));
|
||||
PRINT_ERROR("msm_datamover_irq_handler id %d, status %x\n", id, ch_status);
|
||||
PRINT_ERROR("msm_datamover_irq_handler id %d, error, result %x, flush0 %x\n", id, ch_result, flush0);
|
||||
if (cmd) {
|
||||
list_del(&cmd->list);
|
||||
cmd->complete_func(cmd, ch_result);
|
||||
}
|
||||
/* this does not seem to work, once we get an error */
|
||||
/* the datamover will no longer accept commands */
|
||||
writel(0, DMOV_FLUSH0(id));
|
||||
}
|
||||
ch_status = readl(DMOV_STATUS(id));
|
||||
PRINT_FLOW("msm_datamover_irq_handler id %d, status %x\n", id, ch_status);
|
||||
if ((ch_status & DMOV_STATUS_CMD_PTR_RDY) && !list_empty(&ready_commands[id])) {
|
||||
cmd = list_entry(ready_commands[id].next, typeof(*cmd), list);
|
||||
list_del(&cmd->list);
|
||||
list_add_tail(&cmd->list, &active_commands[id]);
|
||||
PRINT_FLOW("msm_datamover_irq_handler id %d, start command\n", id);
|
||||
writel(cmd->cmdptr, DMOV_CMD_PTR(id));
|
||||
}
|
||||
} while (ch_status & DMOV_STATUS_RSLT_VALID);
|
||||
PRINT_FLOW("msm_datamover_irq_handler id %d, status %x\n", id, ch_status);
|
||||
}
|
||||
spin_unlock_irqrestore(&msm_dmov_lock, irq_flags);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int __init msm_init_datamover(void)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < MSM_DMOV_CHANNEL_COUNT; i++) {
|
||||
INIT_LIST_HEAD(&ready_commands[i]);
|
||||
INIT_LIST_HEAD(&active_commands[i]);
|
||||
writel(DMOV_CONFIG_IRQ_EN | DMOV_CONFIG_FORCE_TOP_PTR_RSLT | DMOV_CONFIG_FORCE_FLUSH_RSLT, DMOV_CONFIG(i));
|
||||
}
|
||||
return request_irq(INT_ADM_AARM, msm_datamover_irq_handler, 0, "msmdatamover", NULL);
|
||||
}
|
||||
|
||||
arch_initcall(msm_init_datamover);
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
/* linux/include/asm-arm/arch-msm/idle.S
|
||||
*
|
||||
* Idle processing for MSM7K - work around bugs with SWFI.
|
||||
*
|
||||
* Copyright (c) 2007 QUALCOMM Incorporated.
|
||||
* Copyright (C) 2007 Google, Inc.
|
||||
*
|
||||
* This software is licensed under the terms of the GNU General Public
|
||||
* License version 2, as published by the Free Software Foundation, and
|
||||
* may be copied, distributed, and modified under those terms.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
|
||||
ENTRY(arch_idle)
|
||||
#ifdef CONFIG_MSM7X00A_IDLE
|
||||
mrc p15, 0, r1, c1, c0, 0 /* read current CR */
|
||||
bic r0, r1, #(1 << 2) /* clear dcache bit */
|
||||
bic r0, r0, #(1 << 12) /* clear icache bit */
|
||||
mcr p15, 0, r0, c1, c0, 0 /* disable d/i cache */
|
||||
|
||||
mov r0, #0 /* prepare wfi value */
|
||||
mcr p15, 0, r0, c7, c10, 0 /* flush the cache */
|
||||
mcr p15, 0, r0, c7, c10, 4 /* memory barrier */
|
||||
mcr p15, 0, r0, c7, c0, 4 /* wait for interrupt */
|
||||
|
||||
mcr p15, 0, r1, c1, c0, 0 /* restore d/i cache */
|
||||
#endif
|
||||
mov pc, lr
|
|
@ -0,0 +1,85 @@
|
|||
/* arch/arm/mach-msm/io.c
|
||||
*
|
||||
* MSM7K io support
|
||||
*
|
||||
* Copyright (C) 2007 Google, Inc.
|
||||
* Author: Brian Swetland <swetland@google.com>
|
||||
*
|
||||
* This software is licensed under the terms of the GNU General Public
|
||||
* License version 2, as published by the Free Software Foundation, and
|
||||
* may be copied, distributed, and modified under those terms.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/arch/msm_iomap.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include <asm/arch/board.h>
|
||||
|
||||
#define MSM_DEVICE(name) { \
|
||||
.virtual = MSM_##name##_BASE, \
|
||||
.pfn = __phys_to_pfn(MSM_##name##_PHYS), \
|
||||
.length = MSM_##name##_SIZE, \
|
||||
.type = MT_DEVICE_NONSHARED, \
|
||||
}
|
||||
|
||||
static struct map_desc msm_io_desc[] __initdata = {
|
||||
MSM_DEVICE(VIC),
|
||||
MSM_DEVICE(CSR),
|
||||
MSM_DEVICE(GPT),
|
||||
MSM_DEVICE(DMOV),
|
||||
MSM_DEVICE(UART1),
|
||||
MSM_DEVICE(UART2),
|
||||
MSM_DEVICE(UART3),
|
||||
MSM_DEVICE(I2C),
|
||||
MSM_DEVICE(GPIO1),
|
||||
MSM_DEVICE(GPIO2),
|
||||
MSM_DEVICE(HSUSB),
|
||||
MSM_DEVICE(CLK_CTL),
|
||||
MSM_DEVICE(PMDH),
|
||||
MSM_DEVICE(EMDH),
|
||||
MSM_DEVICE(MDP),
|
||||
{
|
||||
.virtual = MSM_SHARED_RAM_BASE,
|
||||
.pfn = __phys_to_pfn(MSM_SHARED_RAM_PHYS),
|
||||
.length = MSM_SHARED_RAM_SIZE,
|
||||
.type = MT_DEVICE,
|
||||
},
|
||||
};
|
||||
|
||||
void __init msm_map_common_io(void)
|
||||
{
|
||||
/* Make sure the peripheral register window is closed, since
|
||||
* we will use PTE flags (TEX[1]=1,B=0,C=1) to determine which
|
||||
* pages are peripheral interface or not.
|
||||
*/
|
||||
asm("mcr p15, 0, %0, c15, c2, 4" : : "r" (0));
|
||||
|
||||
iotable_init(msm_io_desc, ARRAY_SIZE(msm_io_desc));
|
||||
}
|
||||
|
||||
void __iomem *
|
||||
__msm_ioremap(unsigned long phys_addr, size_t size, unsigned int mtype)
|
||||
{
|
||||
if (mtype == MT_DEVICE) {
|
||||
/* The peripherals in the 88000000 - D0000000 range
|
||||
* are only accessable by type MT_DEVICE_NONSHARED.
|
||||
* Adjust mtype as necessary to make this "just work."
|
||||
*/
|
||||
if ((phys_addr >= 0x88000000) && (phys_addr < 0xD0000000))
|
||||
mtype = MT_DEVICE_NONSHARED;
|
||||
}
|
||||
|
||||
return __arm_ioremap(phys_addr, size, mtype);
|
||||
}
|
|
@ -0,0 +1,154 @@
|
|||
/* linux/arch/arm/mach-msm/irq.c
|
||||
*
|
||||
* Copyright (C) 2007 Google, Inc.
|
||||
*
|
||||
* This software is licensed under the terms of the GNU General Public
|
||||
* License version 2, as published by the Free Software Foundation, and
|
||||
* may be copied, distributed, and modified under those terms.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/ptrace.h>
|
||||
#include <linux/timer.h>
|
||||
|
||||
#include <linux/irq.h>
|
||||
#include <asm/hardware.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
#include <asm/arch/msm_iomap.h>
|
||||
|
||||
#define VIC_REG(off) (MSM_VIC_BASE + (off))
|
||||
|
||||
#define VIC_INT_SELECT0 VIC_REG(0x0000) /* 1: FIQ, 0: IRQ */
|
||||
#define VIC_INT_SELECT1 VIC_REG(0x0004) /* 1: FIQ, 0: IRQ */
|
||||
#define VIC_INT_EN0 VIC_REG(0x0010)
|
||||
#define VIC_INT_EN1 VIC_REG(0x0014)
|
||||
#define VIC_INT_ENCLEAR0 VIC_REG(0x0020)
|
||||
#define VIC_INT_ENCLEAR1 VIC_REG(0x0024)
|
||||
#define VIC_INT_ENSET0 VIC_REG(0x0030)
|
||||
#define VIC_INT_ENSET1 VIC_REG(0x0034)
|
||||
#define VIC_INT_TYPE0 VIC_REG(0x0040) /* 1: EDGE, 0: LEVEL */
|
||||
#define VIC_INT_TYPE1 VIC_REG(0x0044) /* 1: EDGE, 0: LEVEL */
|
||||
#define VIC_INT_POLARITY0 VIC_REG(0x0050) /* 1: NEG, 0: POS */
|
||||
#define VIC_INT_POLARITY1 VIC_REG(0x0054) /* 1: NEG, 0: POS */
|
||||
#define VIC_NO_PEND_VAL VIC_REG(0x0060)
|
||||
#define VIC_INT_MASTEREN VIC_REG(0x0064) /* 1: IRQ, 2: FIQ */
|
||||
#define VIC_PROTECTION VIC_REG(0x006C) /* 1: ENABLE */
|
||||
#define VIC_CONFIG VIC_REG(0x0068) /* 1: USE ARM1136 VIC */
|
||||
#define VIC_IRQ_STATUS0 VIC_REG(0x0080)
|
||||
#define VIC_IRQ_STATUS1 VIC_REG(0x0084)
|
||||
#define VIC_FIQ_STATUS0 VIC_REG(0x0090)
|
||||
#define VIC_FIQ_STATUS1 VIC_REG(0x0094)
|
||||
#define VIC_RAW_STATUS0 VIC_REG(0x00A0)
|
||||
#define VIC_RAW_STATUS1 VIC_REG(0x00A4)
|
||||
#define VIC_INT_CLEAR0 VIC_REG(0x00B0)
|
||||
#define VIC_INT_CLEAR1 VIC_REG(0x00B4)
|
||||
#define VIC_SOFTINT0 VIC_REG(0x00C0)
|
||||
#define VIC_SOFTINT1 VIC_REG(0x00C4)
|
||||
#define VIC_IRQ_VEC_RD VIC_REG(0x00D0) /* pending int # */
|
||||
#define VIC_IRQ_VEC_PEND_RD VIC_REG(0x00D4) /* pending vector addr */
|
||||
#define VIC_IRQ_VEC_WR VIC_REG(0x00D8)
|
||||
#define VIC_IRQ_IN_SERVICE VIC_REG(0x00E0)
|
||||
#define VIC_IRQ_IN_STACK VIC_REG(0x00E4)
|
||||
#define VIC_TEST_BUS_SEL VIC_REG(0x00E8)
|
||||
|
||||
#define VIC_VECTPRIORITY(n) VIC_REG(0x0200+((n) * 4))
|
||||
#define VIC_VECTADDR(n) VIC_REG(0x0400+((n) * 4))
|
||||
|
||||
static void msm_irq_ack(unsigned int irq)
|
||||
{
|
||||
unsigned reg = VIC_INT_CLEAR0 + ((irq & 32) ? 4 : 0);
|
||||
irq = 1 << (irq & 31);
|
||||
writel(irq, reg);
|
||||
}
|
||||
|
||||
static void msm_irq_mask(unsigned int irq)
|
||||
{
|
||||
unsigned reg = VIC_INT_ENCLEAR0 + ((irq & 32) ? 4 : 0);
|
||||
writel(1 << (irq & 31), reg);
|
||||
}
|
||||
|
||||
static void msm_irq_unmask(unsigned int irq)
|
||||
{
|
||||
unsigned reg = VIC_INT_ENSET0 + ((irq & 32) ? 4 : 0);
|
||||
writel(1 << (irq & 31), reg);
|
||||
}
|
||||
|
||||
static int msm_irq_set_wake(unsigned int irq, unsigned int on)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int msm_irq_set_type(unsigned int irq, unsigned int flow_type)
|
||||
{
|
||||
unsigned treg = VIC_INT_TYPE0 + ((irq & 32) ? 4 : 0);
|
||||
unsigned preg = VIC_INT_POLARITY0 + ((irq & 32) ? 4 : 0);
|
||||
int b = 1 << (irq & 31);
|
||||
|
||||
if (flow_type & (IRQF_TRIGGER_FALLING | IRQF_TRIGGER_LOW))
|
||||
writel(readl(preg) | b, preg);
|
||||
if (flow_type & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_HIGH))
|
||||
writel(readl(preg) & (~b), preg);
|
||||
|
||||
if (flow_type & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)) {
|
||||
writel(readl(treg) | b, treg);
|
||||
set_irq_handler(irq, handle_edge_irq);
|
||||
}
|
||||
if (flow_type & (IRQF_TRIGGER_HIGH | IRQF_TRIGGER_LOW)) {
|
||||
writel(readl(treg) & (~b), treg);
|
||||
set_irq_handler(irq, handle_level_irq);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct irq_chip msm_irq_chip = {
|
||||
.name = "msm",
|
||||
.ack = msm_irq_ack,
|
||||
.mask = msm_irq_mask,
|
||||
.unmask = msm_irq_unmask,
|
||||
.set_wake = msm_irq_set_wake,
|
||||
.set_type = msm_irq_set_type,
|
||||
};
|
||||
|
||||
void __init msm_init_irq(void)
|
||||
{
|
||||
unsigned n;
|
||||
|
||||
/* select level interrupts */
|
||||
writel(0, VIC_INT_TYPE0);
|
||||
writel(0, VIC_INT_TYPE1);
|
||||
|
||||
/* select highlevel interrupts */
|
||||
writel(0, VIC_INT_POLARITY0);
|
||||
writel(0, VIC_INT_POLARITY1);
|
||||
|
||||
/* select IRQ for all INTs */
|
||||
writel(0, VIC_INT_SELECT0);
|
||||
writel(0, VIC_INT_SELECT1);
|
||||
|
||||
/* disable all INTs */
|
||||
writel(0, VIC_INT_EN0);
|
||||
writel(0, VIC_INT_EN1);
|
||||
|
||||
/* don't use 1136 vic */
|
||||
writel(0, VIC_CONFIG);
|
||||
|
||||
/* enable interrupt controller */
|
||||
writel(1, VIC_INT_MASTEREN);
|
||||
|
||||
for (n = 0; n < NR_MSM_IRQS; n++) {
|
||||
set_irq_chip(n, &msm_irq_chip);
|
||||
set_irq_handler(n, handle_level_irq);
|
||||
set_irq_flags(n, IRQF_VALID);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,205 @@
|
|||
/* linux/arch/arm/mach-msm/timer.c
|
||||
*
|
||||
* Copyright (C) 2007 Google, Inc.
|
||||
*
|
||||
* This software is licensed under the terms of the GNU General Public
|
||||
* License version 2, as published by the Free Software Foundation, and
|
||||
* may be copied, distributed, and modified under those terms.
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/clockchips.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include <asm/mach/time.h>
|
||||
#include <asm/arch/msm_iomap.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
#define MSM_DGT_BASE (MSM_GPT_BASE + 0x10)
|
||||
#define MSM_DGT_SHIFT (5)
|
||||
|
||||
#define TIMER_MATCH_VAL 0x0000
|
||||
#define TIMER_COUNT_VAL 0x0004
|
||||
#define TIMER_ENABLE 0x0008
|
||||
#define TIMER_ENABLE_CLR_ON_MATCH_EN 2
|
||||
#define TIMER_ENABLE_EN 1
|
||||
#define TIMER_CLEAR 0x000C
|
||||
|
||||
#define CSR_PROTECTION 0x0020
|
||||
#define CSR_PROTECTION_EN 1
|
||||
|
||||
#define GPT_HZ 32768
|
||||
#define DGT_HZ 19200000 /* 19.2 MHz or 600 KHz after shift */
|
||||
|
||||
struct msm_clock {
|
||||
struct clock_event_device clockevent;
|
||||
struct clocksource clocksource;
|
||||
struct irqaction irq;
|
||||
uint32_t regbase;
|
||||
uint32_t freq;
|
||||
uint32_t shift;
|
||||
};
|
||||
|
||||
static irqreturn_t msm_timer_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
struct clock_event_device *evt = dev_id;
|
||||
evt->event_handler(evt);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static cycle_t msm_gpt_read(void)
|
||||
{
|
||||
return readl(MSM_GPT_BASE + TIMER_COUNT_VAL);
|
||||
}
|
||||
|
||||
static cycle_t msm_dgt_read(void)
|
||||
{
|
||||
return readl(MSM_DGT_BASE + TIMER_COUNT_VAL) >> MSM_DGT_SHIFT;
|
||||
}
|
||||
|
||||
static int msm_timer_set_next_event(unsigned long cycles,
|
||||
struct clock_event_device *evt)
|
||||
{
|
||||
struct msm_clock *clock = container_of(evt, struct msm_clock, clockevent);
|
||||
uint32_t now = readl(clock->regbase + TIMER_COUNT_VAL);
|
||||
uint32_t alarm = now + (cycles << clock->shift);
|
||||
int late;
|
||||
|
||||
writel(alarm, clock->regbase + TIMER_MATCH_VAL);
|
||||
now = readl(clock->regbase + TIMER_COUNT_VAL);
|
||||
late = now - alarm;
|
||||
if (late >= (-2 << clock->shift) && late < DGT_HZ*5) {
|
||||
printk(KERN_NOTICE "msm_timer_set_next_event(%lu) clock %s, "
|
||||
"alarm already expired, now %x, alarm %x, late %d\n",
|
||||
cycles, clock->clockevent.name, now, alarm, late);
|
||||
return -ETIME;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void msm_timer_set_mode(enum clock_event_mode mode,
|
||||
struct clock_event_device *evt)
|
||||
{
|
||||
struct msm_clock *clock = container_of(evt, struct msm_clock, clockevent);
|
||||
switch (mode) {
|
||||
case CLOCK_EVT_MODE_RESUME:
|
||||
case CLOCK_EVT_MODE_PERIODIC:
|
||||
break;
|
||||
case CLOCK_EVT_MODE_ONESHOT:
|
||||
writel(TIMER_ENABLE_EN, clock->regbase + TIMER_ENABLE);
|
||||
break;
|
||||
case CLOCK_EVT_MODE_UNUSED:
|
||||
case CLOCK_EVT_MODE_SHUTDOWN:
|
||||
writel(0, clock->regbase + TIMER_ENABLE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static struct msm_clock msm_clocks[] = {
|
||||
{
|
||||
.clockevent = {
|
||||
.name = "gp_timer",
|
||||
.features = CLOCK_EVT_FEAT_ONESHOT,
|
||||
.shift = 32,
|
||||
.rating = 200,
|
||||
.set_next_event = msm_timer_set_next_event,
|
||||
.set_mode = msm_timer_set_mode,
|
||||
},
|
||||
.clocksource = {
|
||||
.name = "gp_timer",
|
||||
.rating = 200,
|
||||
.read = msm_gpt_read,
|
||||
.mask = CLOCKSOURCE_MASK(32),
|
||||
.shift = 24,
|
||||
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
|
||||
},
|
||||
.irq = {
|
||||
.name = "gp_timer",
|
||||
.flags = IRQF_DISABLED | IRQF_TIMER | IRQF_TRIGGER_RISING,
|
||||
.handler = msm_timer_interrupt,
|
||||
.dev_id = &msm_clocks[0].clockevent,
|
||||
.irq = INT_GP_TIMER_EXP
|
||||
},
|
||||
.regbase = MSM_GPT_BASE,
|
||||
.freq = GPT_HZ
|
||||
},
|
||||
{
|
||||
.clockevent = {
|
||||
.name = "dg_timer",
|
||||
.features = CLOCK_EVT_FEAT_ONESHOT,
|
||||
.shift = 32 + MSM_DGT_SHIFT,
|
||||
.rating = 300,
|
||||
.set_next_event = msm_timer_set_next_event,
|
||||
.set_mode = msm_timer_set_mode,
|
||||
},
|
||||
.clocksource = {
|
||||
.name = "dg_timer",
|
||||
.rating = 300,
|
||||
.read = msm_dgt_read,
|
||||
.mask = CLOCKSOURCE_MASK((32 - MSM_DGT_SHIFT)),
|
||||
.shift = 24 - MSM_DGT_SHIFT,
|
||||
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
|
||||
},
|
||||
.irq = {
|
||||
.name = "dg_timer",
|
||||
.flags = IRQF_DISABLED | IRQF_TIMER | IRQF_TRIGGER_RISING,
|
||||
.handler = msm_timer_interrupt,
|
||||
.dev_id = &msm_clocks[1].clockevent,
|
||||
.irq = INT_DEBUG_TIMER_EXP
|
||||
},
|
||||
.regbase = MSM_DGT_BASE,
|
||||
.freq = DGT_HZ >> MSM_DGT_SHIFT,
|
||||
.shift = MSM_DGT_SHIFT
|
||||
}
|
||||
};
|
||||
|
||||
static void __init msm_timer_init(void)
|
||||
{
|
||||
int i;
|
||||
int res;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(msm_clocks); i++) {
|
||||
struct msm_clock *clock = &msm_clocks[i];
|
||||
struct clock_event_device *ce = &clock->clockevent;
|
||||
struct clocksource *cs = &clock->clocksource;
|
||||
writel(0, clock->regbase + TIMER_ENABLE);
|
||||
writel(0, clock->regbase + TIMER_CLEAR);
|
||||
writel(~0, clock->regbase + TIMER_MATCH_VAL);
|
||||
|
||||
ce->mult = div_sc(clock->freq, NSEC_PER_SEC, ce->shift);
|
||||
/* allow at least 10 seconds to notice that the timer wrapped */
|
||||
ce->max_delta_ns =
|
||||
clockevent_delta2ns(0xf0000000 >> clock->shift, ce);
|
||||
/* 4 gets rounded down to 3 */
|
||||
ce->min_delta_ns = clockevent_delta2ns(4, ce);
|
||||
ce->cpumask = cpumask_of_cpu(0);
|
||||
|
||||
cs->mult = clocksource_hz2mult(clock->freq, cs->shift);
|
||||
res = clocksource_register(cs);
|
||||
if (res)
|
||||
printk(KERN_ERR "msm_timer_init: clocksource_register "
|
||||
"failed for %s\n", cs->name);
|
||||
|
||||
res = setup_irq(clock->irq.irq, &clock->irq);
|
||||
if (res)
|
||||
printk(KERN_ERR "msm_timer_init: setup_irq "
|
||||
"failed for %s\n", cs->name);
|
||||
|
||||
clockevents_register_device(ce);
|
||||
}
|
||||
}
|
||||
|
||||
struct sys_timer msm_timer = {
|
||||
.init = msm_timer_init
|
||||
};
|
|
@ -32,7 +32,6 @@
|
|||
#include <asm/arch/common.h>
|
||||
#include <asm/arch/dsp_common.h>
|
||||
#include <asm/arch/aic23.h>
|
||||
#include <asm/arch/gpio.h>
|
||||
#include <asm/arch/omapfb.h>
|
||||
#include <asm/arch/lcd_mipid.h>
|
||||
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/i2c.h>
|
||||
|
||||
#include <linux/mtd/mtd.h>
|
||||
|
|
|
@ -42,7 +42,6 @@
|
|||
#include <asm/arch/common.h>
|
||||
#include <asm/arch/omap-alsa.h>
|
||||
|
||||
#include <linux/input.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/ads7846.h>
|
||||
|
||||
|
|
|
@ -44,7 +44,6 @@
|
|||
#include <asm/arch/common.h>
|
||||
#include <asm/arch/omap-alsa.h>
|
||||
|
||||
#include <linux/input.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/ads7846.h>
|
||||
|
||||
|
|
|
@ -639,7 +639,7 @@ static void omap_pm_finish(void)
|
|||
}
|
||||
|
||||
|
||||
static irqreturn_t omap_wakeup_interrupt(int irq, void *dev)
|
||||
static irqreturn_t omap_wakeup_interrupt(int irq, void *dev)
|
||||
{
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
|
|
@ -26,7 +26,6 @@
|
|||
#include <linux/interrupt.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/irq.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
|
|
@ -67,7 +67,7 @@ static int use_count[PXA_SSP_PORTS] = {0, 0, 0};
|
|||
|
||||
static irqreturn_t ssp_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
struct ssp_dev *dev = (struct ssp_dev*) dev_id;
|
||||
struct ssp_dev *dev = dev_id;
|
||||
unsigned int status = SSSR_P(dev->port);
|
||||
|
||||
SSSR_P(dev->port) = status; /* clear status bits */
|
||||
|
|
|
@ -530,7 +530,7 @@ static struct s3c2410fb_mach_info __initdata bast_fb_info = {
|
|||
|
||||
.displays = bast_lcd_info,
|
||||
.num_displays = ARRAY_SIZE(bast_lcd_info),
|
||||
.default_display = 4,
|
||||
.default_display = 1,
|
||||
};
|
||||
|
||||
/* Standard BAST devices */
|
||||
|
@ -540,7 +540,6 @@ static struct platform_device *bast_devices[] __initdata = {
|
|||
&s3c_device_lcd,
|
||||
&s3c_device_wdt,
|
||||
&s3c_device_i2c,
|
||||
&s3c_device_iis,
|
||||
&s3c_device_rtc,
|
||||
&s3c_device_nand,
|
||||
&bast_device_nor,
|
||||
|
|
|
@ -365,7 +365,6 @@ static struct platform_device *vr1000_devices[] __initdata = {
|
|||
&s3c_device_lcd,
|
||||
&s3c_device_wdt,
|
||||
&s3c_device_i2c,
|
||||
&s3c_device_iis,
|
||||
&s3c_device_adc,
|
||||
&serial_device,
|
||||
&vr1000_nor,
|
||||
|
|
|
@ -60,7 +60,7 @@ usb_simtec_powercontrol(int port, int to)
|
|||
static irqreturn_t
|
||||
usb_simtec_ocirq(int irq, void *pw)
|
||||
{
|
||||
struct s3c2410_hcd_info *info = (struct s3c2410_hcd_info *)pw;
|
||||
struct s3c2410_hcd_info *info = pw;
|
||||
|
||||
if (s3c2410_gpio_getpin(S3C2410_GPG10) == 0) {
|
||||
pr_debug("usb_simtec: over-current irq (oc detected)\n");
|
||||
|
|
|
@ -10,6 +10,7 @@ config CPU_S3C2412
|
|||
select CPU_LLSERIAL_S3C2440
|
||||
select S3C2412_PM if PM
|
||||
select S3C2412_DMA if S3C2410_DMA
|
||||
select S3C2410_GPIO
|
||||
help
|
||||
Support for the S3C2412 and S3C2413 SoCs from the S3C24XX line
|
||||
|
||||
|
|
|
@ -12,8 +12,9 @@ obj- :=
|
|||
obj-$(CONFIG_CPU_S3C2412) += s3c2412.o
|
||||
obj-$(CONFIG_CPU_S3C2412) += irq.o
|
||||
obj-$(CONFIG_CPU_S3C2412) += clock.o
|
||||
obj-$(CONFIG_CPU_S3C2412) += gpio.o
|
||||
obj-$(CONFIG_S3C2412_DMA) += dma.o
|
||||
obj-$(CONFIG_S3C2412_PM) += pm.o
|
||||
obj-$(CONFIG_S3C2412_PM) += pm.o sleep.o
|
||||
|
||||
# Machine support
|
||||
|
||||
|
|
|
@ -217,7 +217,7 @@ static int s3c2412_setparent_msysclk(struct clk *clk, struct clk *parent)
|
|||
|
||||
if (parent == &clk_mdivclk)
|
||||
clksrc &= ~S3C2412_CLKSRC_MSYSCLK_MPLL;
|
||||
else if (parent == &clk_upll)
|
||||
else if (parent == &clk_mpll)
|
||||
clksrc |= S3C2412_CLKSRC_MSYSCLK_MPLL;
|
||||
else
|
||||
return -EINVAL;
|
||||
|
@ -234,6 +234,45 @@ static struct clk clk_msysclk = {
|
|||
.set_parent = s3c2412_setparent_msysclk,
|
||||
};
|
||||
|
||||
static int s3c2412_setparent_armclk(struct clk *clk, struct clk *parent)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned long clkdiv;
|
||||
unsigned long dvs;
|
||||
|
||||
/* Note, we current equate fclk andf msysclk for S3C2412 */
|
||||
|
||||
if (parent == &clk_msysclk || parent == &clk_f)
|
||||
dvs = 0;
|
||||
else if (parent == &clk_h)
|
||||
dvs = S3C2412_CLKDIVN_DVSEN;
|
||||
else
|
||||
return -EINVAL;
|
||||
|
||||
clk->parent = parent;
|
||||
|
||||
/* update this under irq lockdown, clkdivn is not protected
|
||||
* by the clock system. */
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
clkdiv = __raw_readl(S3C2410_CLKDIVN);
|
||||
clkdiv &= ~S3C2412_CLKDIVN_DVSEN;
|
||||
clkdiv |= dvs;
|
||||
__raw_writel(clkdiv, S3C2410_CLKDIVN);
|
||||
|
||||
local_irq_restore(flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct clk clk_armclk = {
|
||||
.name = "armclk",
|
||||
.id = -1,
|
||||
.parent = &clk_msysclk,
|
||||
.set_parent = s3c2412_setparent_armclk,
|
||||
};
|
||||
|
||||
/* these next clocks have an divider immediately after them,
|
||||
* so we can register them with their divider and leave out the
|
||||
* intermediate clock stage
|
||||
|
@ -630,11 +669,13 @@ static struct clk *clks[] __initdata = {
|
|||
&clk_erefclk,
|
||||
&clk_urefclk,
|
||||
&clk_mrefclk,
|
||||
&clk_armclk,
|
||||
};
|
||||
|
||||
int __init s3c2412_baseclk_add(void)
|
||||
{
|
||||
unsigned long clkcon = __raw_readl(S3C2410_CLKCON);
|
||||
unsigned int dvs;
|
||||
struct clk *clkp;
|
||||
int ret;
|
||||
int ptr;
|
||||
|
@ -643,6 +684,8 @@ int __init s3c2412_baseclk_add(void)
|
|||
clk_usb_bus.parent = &clk_usbsrc;
|
||||
clk_usb_bus.rate = 0x0;
|
||||
|
||||
clk_f.parent = &clk_msysclk;
|
||||
|
||||
s3c2412_clk_initparents();
|
||||
|
||||
for (ptr = 0; ptr < ARRAY_SIZE(clks); ptr++) {
|
||||
|
@ -655,6 +698,15 @@ int __init s3c2412_baseclk_add(void)
|
|||
}
|
||||
}
|
||||
|
||||
/* set the dvs state according to what we got at boot time */
|
||||
|
||||
dvs = __raw_readl(S3C2410_CLKDIVN) & S3C2412_CLKDIVN_DVSEN;
|
||||
|
||||
if (dvs)
|
||||
clk_armclk.parent = &clk_h;
|
||||
|
||||
printk(KERN_INFO "S3C2412: DVS is %s\n", dvs ? "on" : "off");
|
||||
|
||||
/* ensure usb bus clock is within correct rate of 48MHz */
|
||||
|
||||
if (clk_get_rate(&clk_usb_bus) != (48 * 1000 * 1000)) {
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#include <asm/arch/regs-mem.h>
|
||||
#include <asm/arch/regs-lcd.h>
|
||||
#include <asm/arch/regs-sdi.h>
|
||||
#include <asm/plat-s3c24xx/regs-s3c2412-iis.h>
|
||||
#include <asm/plat-s3c24xx/regs-iis.h>
|
||||
#include <asm/plat-s3c24xx/regs-spi.h>
|
||||
|
||||
|
@ -39,106 +40,141 @@ static struct s3c24xx_dma_map __initdata s3c2412_dma_mappings[] = {
|
|||
[DMACH_XD0] = {
|
||||
.name = "xdreq0",
|
||||
.channels = MAP(S3C2412_DMAREQSEL_XDREQ0),
|
||||
.channels_rx = MAP(S3C2412_DMAREQSEL_XDREQ0),
|
||||
},
|
||||
[DMACH_XD1] = {
|
||||
.name = "xdreq1",
|
||||
.channels = MAP(S3C2412_DMAREQSEL_XDREQ1),
|
||||
.channels_rx = MAP(S3C2412_DMAREQSEL_XDREQ1),
|
||||
},
|
||||
[DMACH_SDI] = {
|
||||
.name = "sdi",
|
||||
.channels = MAP(S3C2412_DMAREQSEL_SDI),
|
||||
.hw_addr.to = S3C2410_PA_IIS + S3C2410_IISFIFO,
|
||||
.hw_addr.from = S3C2410_PA_IIS + S3C2410_IISFIFO,
|
||||
.channels_rx = MAP(S3C2412_DMAREQSEL_SDI),
|
||||
.hw_addr.to = S3C2410_PA_SDI + S3C2410_SDIDATA,
|
||||
.hw_addr.from = S3C2410_PA_SDI + S3C2410_SDIDATA,
|
||||
},
|
||||
[DMACH_SPI0] = {
|
||||
.name = "spi0",
|
||||
.channels = MAP(S3C2412_DMAREQSEL_SPI0TX),
|
||||
.channels_rx = MAP(S3C2412_DMAREQSEL_SPI0RX),
|
||||
.hw_addr.to = S3C2410_PA_SPI + S3C2410_SPTDAT,
|
||||
.hw_addr.from = S3C2410_PA_SPI + S3C2410_SPRDAT,
|
||||
},
|
||||
[DMACH_SPI1] = {
|
||||
.name = "spi1",
|
||||
.channels = MAP(S3C2412_DMAREQSEL_SPI1TX),
|
||||
.channels_rx = MAP(S3C2412_DMAREQSEL_SPI1RX),
|
||||
.hw_addr.to = S3C2410_PA_SPI + S3C2412_SPI1 + S3C2410_SPTDAT,
|
||||
.hw_addr.from = S3C2410_PA_SPI + S3C2412_SPI1 + S3C2410_SPRDAT,
|
||||
},
|
||||
[DMACH_UART0] = {
|
||||
.name = "uart0",
|
||||
.channels = MAP(S3C2412_DMAREQSEL_UART0_0),
|
||||
.channels_rx = MAP(S3C2412_DMAREQSEL_UART0_0),
|
||||
.hw_addr.to = S3C2410_PA_UART0 + S3C2410_UTXH,
|
||||
.hw_addr.from = S3C2410_PA_UART0 + S3C2410_URXH,
|
||||
},
|
||||
[DMACH_UART1] = {
|
||||
.name = "uart1",
|
||||
.channels = MAP(S3C2412_DMAREQSEL_UART1_0),
|
||||
.channels_rx = MAP(S3C2412_DMAREQSEL_UART1_0),
|
||||
.hw_addr.to = S3C2410_PA_UART1 + S3C2410_UTXH,
|
||||
.hw_addr.from = S3C2410_PA_UART1 + S3C2410_URXH,
|
||||
},
|
||||
[DMACH_UART2] = {
|
||||
.name = "uart2",
|
||||
.channels = MAP(S3C2412_DMAREQSEL_UART2_0),
|
||||
.channels_rx = MAP(S3C2412_DMAREQSEL_UART2_0),
|
||||
.hw_addr.to = S3C2410_PA_UART2 + S3C2410_UTXH,
|
||||
.hw_addr.from = S3C2410_PA_UART2 + S3C2410_URXH,
|
||||
},
|
||||
[DMACH_UART0_SRC2] = {
|
||||
.name = "uart0",
|
||||
.channels = MAP(S3C2412_DMAREQSEL_UART0_1),
|
||||
.channels_rx = MAP(S3C2412_DMAREQSEL_UART0_1),
|
||||
.hw_addr.to = S3C2410_PA_UART0 + S3C2410_UTXH,
|
||||
.hw_addr.from = S3C2410_PA_UART0 + S3C2410_URXH,
|
||||
},
|
||||
[DMACH_UART1_SRC2] = {
|
||||
.name = "uart1",
|
||||
.channels = MAP(S3C2412_DMAREQSEL_UART1_1),
|
||||
.channels_rx = MAP(S3C2412_DMAREQSEL_UART1_1),
|
||||
.hw_addr.to = S3C2410_PA_UART1 + S3C2410_UTXH,
|
||||
.hw_addr.from = S3C2410_PA_UART1 + S3C2410_URXH,
|
||||
},
|
||||
[DMACH_UART2_SRC2] = {
|
||||
.name = "uart2",
|
||||
.channels = MAP(S3C2412_DMAREQSEL_UART2_1),
|
||||
.channels_rx = MAP(S3C2412_DMAREQSEL_UART2_1),
|
||||
.hw_addr.to = S3C2410_PA_UART2 + S3C2410_UTXH,
|
||||
.hw_addr.from = S3C2410_PA_UART2 + S3C2410_URXH,
|
||||
},
|
||||
[DMACH_TIMER] = {
|
||||
.name = "timer",
|
||||
.channels = MAP(S3C2412_DMAREQSEL_TIMER),
|
||||
.channels_rx = MAP(S3C2412_DMAREQSEL_TIMER),
|
||||
},
|
||||
[DMACH_I2S_IN] = {
|
||||
.name = "i2s-sdi",
|
||||
.channels = MAP(S3C2412_DMAREQSEL_I2SRX),
|
||||
.hw_addr.from = S3C2410_PA_IIS + S3C2410_IISFIFO,
|
||||
.channels_rx = MAP(S3C2412_DMAREQSEL_I2SRX),
|
||||
.hw_addr.from = S3C2410_PA_IIS + S3C2412_IISRXD,
|
||||
},
|
||||
[DMACH_I2S_OUT] = {
|
||||
.name = "i2s-sdo",
|
||||
.channels = MAP(S3C2412_DMAREQSEL_I2STX),
|
||||
.hw_addr.to = S3C2410_PA_IIS + S3C2410_IISFIFO,
|
||||
.channels_rx = MAP(S3C2412_DMAREQSEL_I2STX),
|
||||
.hw_addr.to = S3C2410_PA_IIS + S3C2412_IISTXD,
|
||||
},
|
||||
[DMACH_USB_EP1] = {
|
||||
.name = "usb-ep1",
|
||||
.channels = MAP(S3C2412_DMAREQSEL_USBEP1),
|
||||
.channels_rx = MAP(S3C2412_DMAREQSEL_USBEP1),
|
||||
},
|
||||
[DMACH_USB_EP2] = {
|
||||
.name = "usb-ep2",
|
||||
.channels = MAP(S3C2412_DMAREQSEL_USBEP2),
|
||||
.channels_rx = MAP(S3C2412_DMAREQSEL_USBEP2),
|
||||
},
|
||||
[DMACH_USB_EP3] = {
|
||||
.name = "usb-ep3",
|
||||
.channels = MAP(S3C2412_DMAREQSEL_USBEP3),
|
||||
.channels_rx = MAP(S3C2412_DMAREQSEL_USBEP3),
|
||||
},
|
||||
[DMACH_USB_EP4] = {
|
||||
.name = "usb-ep4",
|
||||
.channels = MAP(S3C2412_DMAREQSEL_USBEP4),
|
||||
.channels_rx = MAP(S3C2412_DMAREQSEL_USBEP4),
|
||||
},
|
||||
};
|
||||
|
||||
static void s3c2412_dma_direction(struct s3c2410_dma_chan *chan,
|
||||
struct s3c24xx_dma_map *map,
|
||||
enum s3c2410_dmasrc dir)
|
||||
{
|
||||
unsigned long chsel;
|
||||
|
||||
if (dir == S3C2410_DMASRC_HW)
|
||||
chsel = map->channels_rx[0];
|
||||
else
|
||||
chsel = map->channels[0];
|
||||
|
||||
chsel &= ~DMA_CH_VALID;
|
||||
chsel |= S3C2412_DMAREQSEL_HW;
|
||||
|
||||
writel(chsel, chan->regs + S3C2412_DMA_DMAREQSEL);
|
||||
}
|
||||
|
||||
static void s3c2412_dma_select(struct s3c2410_dma_chan *chan,
|
||||
struct s3c24xx_dma_map *map)
|
||||
{
|
||||
writel(map->channels[0] | S3C2412_DMAREQSEL_HW,
|
||||
chan->regs + S3C2412_DMA_DMAREQSEL);
|
||||
s3c2412_dma_direction(chan, map, chan->source);
|
||||
}
|
||||
|
||||
static struct s3c24xx_dma_selection __initdata s3c2412_dma_sel = {
|
||||
.select = s3c2412_dma_select,
|
||||
.direction = s3c2412_dma_direction,
|
||||
.dcon_mask = 0,
|
||||
.map = s3c2412_dma_mappings,
|
||||
.map_size = ARRAY_SIZE(s3c2412_dma_mappings),
|
||||
|
|
|
@ -0,0 +1,60 @@
|
|||
/* linux/arch/arm/mach-s3c2412/gpio.c
|
||||
*
|
||||
* Copyright (c) 2007 Simtec Electronics
|
||||
* Ben Dooks <ben@simtec.co.uk>
|
||||
*
|
||||
* http://armlinux.simtec.co.uk/.
|
||||
*
|
||||
* S3C2412/S3C2413 specific GPIO support
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include <asm/arch/regs-gpio.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
|
||||
int s3c2412_gpio_set_sleepcfg(unsigned int pin, unsigned int state)
|
||||
{
|
||||
void __iomem *base = S3C24XX_GPIO_BASE(pin);
|
||||
unsigned long offs = S3C2410_GPIO_OFFSET(pin);
|
||||
unsigned long flags;
|
||||
unsigned long slpcon;
|
||||
|
||||
offs *= 2;
|
||||
|
||||
if (pin < S3C2410_GPIO_BANKB)
|
||||
return -EINVAL;
|
||||
|
||||
if (pin >= S3C2410_GPIO_BANKF &&
|
||||
pin <= S3C2410_GPIO_BANKG)
|
||||
return -EINVAL;
|
||||
|
||||
if (pin > (S3C2410_GPIO_BANKH + 32))
|
||||
return -EINVAL;
|
||||
|
||||
local_irq_save(flags);
|
||||
|
||||
slpcon = __raw_readl(base + 0x0C);
|
||||
|
||||
slpcon &= ~(3 << offs);
|
||||
slpcon |= state << offs;
|
||||
|
||||
__raw_writel(slpcon, base + 0x0C);
|
||||
|
||||
local_irq_restore(flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(s3c2412_gpio_set_sleepcfg);
|
|
@ -33,6 +33,7 @@
|
|||
|
||||
#include <asm/arch/regs-irq.h>
|
||||
#include <asm/arch/regs-gpio.h>
|
||||
#include <asm/arch/regs-power.h>
|
||||
|
||||
#include <asm/plat-s3c24xx/cpu.h>
|
||||
#include <asm/plat-s3c24xx/irq.h>
|
||||
|
@ -153,6 +154,22 @@ static struct irq_chip s3c2412_irq_cfsdi = {
|
|||
.unmask = s3c2412_irq_cfsdi_unmask,
|
||||
};
|
||||
|
||||
static int s3c2412_irq_rtc_wake(unsigned int irqno, unsigned int state)
|
||||
{
|
||||
unsigned long pwrcfg;
|
||||
|
||||
pwrcfg = __raw_readl(S3C2412_PWRCFG);
|
||||
if (state)
|
||||
pwrcfg &= ~S3C2412_PWRCFG_RTC_MASKIRQ;
|
||||
else
|
||||
pwrcfg |= S3C2412_PWRCFG_RTC_MASKIRQ;
|
||||
__raw_writel(pwrcfg, S3C2412_PWRCFG);
|
||||
|
||||
return s3c_irq_chip.set_wake(irqno, state);
|
||||
}
|
||||
|
||||
static struct irq_chip s3c2412_irq_rtc_chip;
|
||||
|
||||
static int s3c2412_irq_add(struct sys_device *sysdev)
|
||||
{
|
||||
unsigned int irqno;
|
||||
|
@ -173,6 +190,13 @@ static int s3c2412_irq_add(struct sys_device *sysdev)
|
|||
set_irq_flags(irqno, IRQF_VALID);
|
||||
}
|
||||
|
||||
/* change RTC IRQ's set wake method */
|
||||
|
||||
s3c2412_irq_rtc_chip = s3c_irq_chip;
|
||||
s3c2412_irq_rtc_chip.set_wake = s3c2412_irq_rtc_wake;
|
||||
|
||||
set_irq_chip(IRQ_RTC, &s3c2412_irq_rtc_chip);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -33,6 +33,8 @@
|
|||
|
||||
#include <asm/plat-s3c24xx/s3c2412.h>
|
||||
|
||||
extern void s3c2412_sleep_enter(void);
|
||||
|
||||
static void s3c2412_cpu_suspend(void)
|
||||
{
|
||||
unsigned long tmp;
|
||||
|
@ -43,20 +45,7 @@ static void s3c2412_cpu_suspend(void)
|
|||
tmp |= S3C2412_PWRCFG_STANDBYWFI_SLEEP;
|
||||
__raw_writel(tmp, S3C2412_PWRCFG);
|
||||
|
||||
/* issue the standby signal into the pm unit. Note, we
|
||||
* issue a write-buffer drain just in case */
|
||||
|
||||
tmp = 0;
|
||||
|
||||
asm("b 1f\n\t"
|
||||
".align 5\n\t"
|
||||
"1:\n\t"
|
||||
"mcr p15, 0, %0, c7, c10, 4\n\t"
|
||||
"mcr p15, 0, %0, c7, c0, 4" :: "r" (tmp));
|
||||
|
||||
/* we should never get past here */
|
||||
|
||||
panic("sleep resumed to originator?");
|
||||
s3c2412_sleep_enter();
|
||||
}
|
||||
|
||||
static void s3c2412_pm_prepare(void)
|
||||
|
@ -88,7 +77,6 @@ static struct sleep_save s3c2412_sleep[] = {
|
|||
SAVE_ITEM(S3C2412_GPBSLPCON),
|
||||
SAVE_ITEM(S3C2412_GPCSLPCON),
|
||||
SAVE_ITEM(S3C2412_GPDSLPCON),
|
||||
SAVE_ITEM(S3C2412_GPESLPCON),
|
||||
SAVE_ITEM(S3C2412_GPFSLPCON),
|
||||
SAVE_ITEM(S3C2412_GPGSLPCON),
|
||||
SAVE_ITEM(S3C2412_GPHSLPCON),
|
||||
|
|
|
@ -168,6 +168,8 @@ void __init s3c2412_init_clocks(int xtal)
|
|||
|
||||
fclk = s3c2410_get_pll(__raw_readl(S3C2410_MPLLCON), xtal*2);
|
||||
|
||||
clk_mpll.rate = fclk;
|
||||
|
||||
tmp = __raw_readl(S3C2410_CLKDIVN);
|
||||
|
||||
/* work out clock scalings */
|
||||
|
|
|
@ -0,0 +1,68 @@
|
|||
/* linux/arch/arm/mach-s3c2412/sleep.S
|
||||
*
|
||||
* Copyright (c) 2007 Simtec Electronics
|
||||
* Ben Dooks <ben@simtec.co.uk>
|
||||
*
|
||||
* S3C2412 Power Manager low-level sleep support
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/arch/map.h>
|
||||
|
||||
#include <asm/arch/regs-irq.h>
|
||||
|
||||
.text
|
||||
|
||||
.global s3c2412_sleep_enter
|
||||
|
||||
s3c2412_sleep_enter:
|
||||
mov r0, #0 /* argument for coprocessors */
|
||||
ldr r1, =S3C2410_INTPND
|
||||
ldr r2, =S3C2410_SRCPND
|
||||
ldr r3, =S3C2410_EINTPEND
|
||||
|
||||
teq r0, r0
|
||||
bl s3c2412_sleep_enter1
|
||||
teq pc, r0
|
||||
bl s3c2412_sleep_enter1
|
||||
|
||||
.align 5
|
||||
|
||||
/* this is called twice, first with the Z flag to ensure that the
|
||||
* instructions have been loaded into the cache, and the second
|
||||
* time to try and suspend the system.
|
||||
*/
|
||||
s3c2412_sleep_enter1:
|
||||
mcr p15, 0, r0, c7, c10, 4
|
||||
mcrne p15, 0, r0, c7, c0, 4
|
||||
|
||||
/* if we return from here, it is because an interrupt was
|
||||
* active when we tried to shutdown. Try and ack the IRQ and
|
||||
* retry, as simply returning causes the system to lock.
|
||||
*/
|
||||
|
||||
ldrne r9, [ r1 ]
|
||||
strne r9, [ r1 ]
|
||||
ldrne r9, [ r2 ]
|
||||
strne r9, [ r2 ]
|
||||
ldrne r9, [ r3 ]
|
||||
strne r9, [ r3 ]
|
||||
bne s3c2412_sleep_enter1
|
||||
|
||||
mov pc, r14
|
|
@ -111,14 +111,9 @@ static struct clk s3c2440_clk_ac97 = {
|
|||
|
||||
static int s3c2440_clk_add(struct sys_device *sysdev)
|
||||
{
|
||||
unsigned long camdivn = __raw_readl(S3C2440_CAMDIVN);
|
||||
unsigned long clkdivn;
|
||||
struct clk *clock_upll;
|
||||
struct clk *clock_h;
|
||||
struct clk *clock_p;
|
||||
struct clk *clock_upll;
|
||||
|
||||
printk("S3C2440: Clock Support, DVS %s\n",
|
||||
(camdivn & S3C2440_CAMDIVN_DVSEN) ? "on" : "off");
|
||||
|
||||
clock_p = clk_get(NULL, "pclk");
|
||||
clock_h = clk_get(NULL, "hclk");
|
||||
|
@ -129,21 +124,6 @@ static int s3c2440_clk_add(struct sys_device *sysdev)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* check rate of UPLL, and if it is near 96MHz, then change
|
||||
* to using half the UPLL rate for the system */
|
||||
|
||||
if (clk_get_rate(clock_upll) > (94 * MHZ)) {
|
||||
clk_usb_bus.rate = clk_get_rate(clock_upll) / 2;
|
||||
|
||||
mutex_lock(&clocks_mutex);
|
||||
|
||||
clkdivn = __raw_readl(S3C2410_CLKDIVN);
|
||||
clkdivn |= S3C2440_CLKDIVN_UCLK;
|
||||
__raw_writel(clkdivn, S3C2410_CLKDIVN);
|
||||
|
||||
mutex_unlock(&clocks_mutex);
|
||||
}
|
||||
|
||||
s3c2440_clk_cam.parent = clock_h;
|
||||
s3c2440_clk_ac97.parent = clock_p;
|
||||
s3c2440_clk_cam_upll.parent = clock_upll;
|
||||
|
|
|
@ -115,14 +115,9 @@ static struct clk s3c2442_clk_cam_upll = {
|
|||
|
||||
static int s3c2442_clk_add(struct sys_device *sysdev)
|
||||
{
|
||||
unsigned long camdivn = __raw_readl(S3C2440_CAMDIVN);
|
||||
unsigned long clkdivn;
|
||||
struct clk *clock_upll;
|
||||
struct clk *clock_h;
|
||||
struct clk *clock_p;
|
||||
struct clk *clock_upll;
|
||||
|
||||
printk("S3C2442: Clock Support, DVS %s\n",
|
||||
(camdivn & S3C2440_CAMDIVN_DVSEN) ? "on" : "off");
|
||||
|
||||
clock_p = clk_get(NULL, "pclk");
|
||||
clock_h = clk_get(NULL, "hclk");
|
||||
|
@ -133,21 +128,6 @@ static int s3c2442_clk_add(struct sys_device *sysdev)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* check rate of UPLL, and if it is near 96MHz, then change
|
||||
* to using half the UPLL rate for the system */
|
||||
|
||||
if (clk_get_rate(clock_upll) > (94 * MHZ)) {
|
||||
clk_usb_bus.rate = clk_get_rate(clock_upll) / 2;
|
||||
|
||||
mutex_lock(&clocks_mutex);
|
||||
|
||||
clkdivn = __raw_readl(S3C2410_CLKDIVN);
|
||||
clkdivn |= S3C2440_CLKDIVN_UCLK;
|
||||
__raw_writel(clkdivn, S3C2410_CLKDIVN);
|
||||
|
||||
mutex_unlock(&clocks_mutex);
|
||||
}
|
||||
|
||||
s3c2442_clk_cam.parent = clock_h;
|
||||
s3c2442_clk_cam_upll.parent = clock_upll;
|
||||
|
||||
|
|
|
@ -29,9 +29,8 @@ static irqreturn_t ssp_interrupt(int irq, void *dev_id)
|
|||
{
|
||||
unsigned int status = Ser4SSSR;
|
||||
|
||||
if (status & SSSR_ROR) {
|
||||
if (status & SSSR_ROR)
|
||||
printk(KERN_WARNING "SSP: receiver overrun\n");
|
||||
}
|
||||
|
||||
Ser4SSSR = SSSR_ROR;
|
||||
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include <linux/irq.h>
|
||||
#include <linux/timex.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/clocksource.h>
|
||||
|
||||
#include <asm/mach/time.h>
|
||||
#include <asm/hardware.h>
|
||||
|
@ -35,23 +36,6 @@ static int sa1100_set_rtc(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* IRQs are disabled before entering here from do_gettimeofday() */
|
||||
static unsigned long sa1100_gettimeoffset (void)
|
||||
{
|
||||
unsigned long ticks_to_match, elapsed, usec;
|
||||
|
||||
/* Get ticks before next timer match */
|
||||
ticks_to_match = OSMR0 - OSCR;
|
||||
|
||||
/* We need elapsed ticks since last match */
|
||||
elapsed = LATCH - ticks_to_match;
|
||||
|
||||
/* Now convert them to usec */
|
||||
usec = (unsigned long)(elapsed * (tick_nsec / 1000))/LATCH;
|
||||
|
||||
return usec;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NO_IDLE_HZ
|
||||
static unsigned long initial_match;
|
||||
static int match_posponed;
|
||||
|
@ -92,6 +76,20 @@ static struct irqaction sa1100_timer_irq = {
|
|||
.handler = sa1100_timer_interrupt,
|
||||
};
|
||||
|
||||
static cycle_t sa1100_read_oscr(void)
|
||||
{
|
||||
return OSCR;
|
||||
}
|
||||
|
||||
static struct clocksource cksrc_sa1100_oscr = {
|
||||
.name = "oscr",
|
||||
.rating = 200,
|
||||
.read = sa1100_read_oscr,
|
||||
.mask = CLOCKSOURCE_MASK(32),
|
||||
.shift = 20,
|
||||
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
|
||||
};
|
||||
|
||||
static void __init sa1100_timer_init(void)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
@ -105,6 +103,11 @@ static void __init sa1100_timer_init(void)
|
|||
OIER = OIER_E0; /* enable match on timer 0 to cause interrupts */
|
||||
OSMR0 = OSCR + LATCH; /* set initial match */
|
||||
local_irq_restore(flags);
|
||||
|
||||
cksrc_sa1100_oscr.mult =
|
||||
clocksource_hz2mult(CLOCK_TICK_RATE, cksrc_sa1100_oscr.shift);
|
||||
|
||||
clocksource_register(&cksrc_sa1100_oscr);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NO_IDLE_HZ
|
||||
|
@ -178,7 +181,6 @@ struct sys_timer sa1100_timer = {
|
|||
.init = sa1100_timer_init,
|
||||
.suspend = sa1100_timer_suspend,
|
||||
.resume = sa1100_timer_resume,
|
||||
.offset = sa1100_gettimeoffset,
|
||||
#ifdef CONFIG_NO_IDLE_HZ
|
||||
.dyn_tick = &sa1100_dyn_tick,
|
||||
#endif
|
||||
|
|
|
@ -171,8 +171,8 @@ config CPU_ARM925T
|
|||
# ARM926T
|
||||
config CPU_ARM926T
|
||||
bool "Support ARM926T processor"
|
||||
depends on ARCH_INTEGRATOR || ARCH_VERSATILE_PB || MACH_VERSATILE_AB || ARCH_OMAP730 || ARCH_OMAP16XX || MACH_REALVIEW_EB || ARCH_PNX4008 || ARCH_NETX || CPU_S3C2412 || ARCH_AT91SAM9260 || ARCH_AT91SAM9261 || ARCH_AT91SAM9263 || ARCH_AT91SAM9RL || ARCH_NS9XXX || ARCH_DAVINCI
|
||||
default y if ARCH_VERSATILE_PB || MACH_VERSATILE_AB || ARCH_OMAP730 || ARCH_OMAP16XX || ARCH_PNX4008 || ARCH_NETX || CPU_S3C2412 || ARCH_AT91SAM9260 || ARCH_AT91SAM9261 || ARCH_AT91SAM9263 || ARCH_AT91SAM9RL || ARCH_NS9XXX || ARCH_DAVINCI
|
||||
depends on ARCH_INTEGRATOR || ARCH_VERSATILE_PB || MACH_VERSATILE_AB || ARCH_OMAP730 || ARCH_OMAP16XX || MACH_REALVIEW_EB || ARCH_PNX4008 || ARCH_NETX || CPU_S3C2412 || ARCH_AT91SAM9260 || ARCH_AT91SAM9261 || ARCH_AT91SAM9263 || ARCH_AT91SAM9RL || ARCH_AT91CAP9 || ARCH_NS9XXX || ARCH_DAVINCI
|
||||
default y if ARCH_VERSATILE_PB || MACH_VERSATILE_AB || ARCH_OMAP730 || ARCH_OMAP16XX || ARCH_PNX4008 || ARCH_NETX || CPU_S3C2412 || ARCH_AT91SAM9260 || ARCH_AT91SAM9261 || ARCH_AT91SAM9263 || ARCH_AT91SAM9RL || ARCH_AT91CAP9 || ARCH_NS9XXX || ARCH_DAVINCI
|
||||
select CPU_32v5
|
||||
select CPU_ABRT_EV5TJ
|
||||
select CPU_CACHE_VIVT
|
||||
|
@ -345,8 +345,9 @@ config CPU_XSC3
|
|||
# ARMv6
|
||||
config CPU_V6
|
||||
bool "Support ARM V6 processor"
|
||||
depends on ARCH_INTEGRATOR || MACH_REALVIEW_EB || ARCH_OMAP2 || ARCH_MX3
|
||||
depends on ARCH_INTEGRATOR || MACH_REALVIEW_EB || ARCH_OMAP2 || ARCH_MX3 || ARCH_MSM7X00A
|
||||
default y if ARCH_MX3
|
||||
default y if ARCH_MSM7X00A
|
||||
select CPU_32v6
|
||||
select CPU_ABRT_EV6
|
||||
select CPU_CACHE_V6
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include <linux/signal.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/kprobes.h>
|
||||
|
||||
#include <asm/system.h>
|
||||
#include <asm/pgtable.h>
|
||||
|
@ -20,6 +21,29 @@
|
|||
|
||||
#include "fault.h"
|
||||
|
||||
|
||||
#ifdef CONFIG_KPROBES
|
||||
static inline int notify_page_fault(struct pt_regs *regs, unsigned int fsr)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
if (!user_mode(regs)) {
|
||||
/* kprobe_running() needs smp_processor_id() */
|
||||
preempt_disable();
|
||||
if (kprobe_running() && kprobe_fault_handler(regs, fsr))
|
||||
ret = 1;
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
#else
|
||||
static inline int notify_page_fault(struct pt_regs *regs, unsigned int fsr)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* This is useful to dump out the page tables associated with
|
||||
* 'addr' in mm 'mm'.
|
||||
|
@ -215,13 +239,16 @@ out:
|
|||
return fault;
|
||||
}
|
||||
|
||||
static int
|
||||
static int __kprobes
|
||||
do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
|
||||
{
|
||||
struct task_struct *tsk;
|
||||
struct mm_struct *mm;
|
||||
int fault, sig, code;
|
||||
|
||||
if (notify_page_fault(regs, fsr))
|
||||
return 0;
|
||||
|
||||
tsk = current;
|
||||
mm = tsk->mm;
|
||||
|
||||
|
@ -311,7 +338,7 @@ no_context:
|
|||
* interrupt or a critical region, and should only copy the information
|
||||
* from the master page table, nothing more.
|
||||
*/
|
||||
static int
|
||||
static int __kprobes
|
||||
do_translation_fault(unsigned long addr, unsigned int fsr,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
|
|
|
@ -212,7 +212,7 @@ static void __mbox_rx_interrupt(struct omap_mbox *mbox)
|
|||
|
||||
static irqreturn_t mbox_interrupt(int irq, void *p)
|
||||
{
|
||||
struct omap_mbox *mbox = (struct omap_mbox *)p;
|
||||
struct omap_mbox *mbox = p;
|
||||
|
||||
if (is_mbox_irq(mbox, IRQ_TX))
|
||||
__mbox_tx_interrupt(mbox);
|
||||
|
|
|
@ -98,9 +98,10 @@ static void omap_mcbsp_dump_reg(u8 id)
|
|||
|
||||
static irqreturn_t omap_mcbsp_tx_irq_handler(int irq, void *dev_id)
|
||||
{
|
||||
struct omap_mcbsp * mcbsp_tx = (struct omap_mcbsp *)(dev_id);
|
||||
struct omap_mcbsp *mcbsp_tx = dev_id;
|
||||
|
||||
DBG("TX IRQ callback : 0x%x\n", OMAP_MCBSP_READ(mcbsp_tx->io_base, SPCR2));
|
||||
DBG("TX IRQ callback : 0x%x\n",
|
||||
OMAP_MCBSP_READ(mcbsp_tx->io_base, SPCR2));
|
||||
|
||||
complete(&mcbsp_tx->tx_irq_completion);
|
||||
return IRQ_HANDLED;
|
||||
|
@ -108,9 +109,10 @@ static irqreturn_t omap_mcbsp_tx_irq_handler(int irq, void *dev_id)
|
|||
|
||||
static irqreturn_t omap_mcbsp_rx_irq_handler(int irq, void *dev_id)
|
||||
{
|
||||
struct omap_mcbsp * mcbsp_rx = (struct omap_mcbsp *)(dev_id);
|
||||
struct omap_mcbsp *mcbsp_rx = dev_id;
|
||||
|
||||
DBG("RX IRQ callback : 0x%x\n", OMAP_MCBSP_READ(mcbsp_rx->io_base, SPCR2));
|
||||
DBG("RX IRQ callback : 0x%x\n",
|
||||
OMAP_MCBSP_READ(mcbsp_rx->io_base, SPCR2));
|
||||
|
||||
complete(&mcbsp_rx->rx_irq_completion);
|
||||
return IRQ_HANDLED;
|
||||
|
@ -118,9 +120,10 @@ static irqreturn_t omap_mcbsp_rx_irq_handler(int irq, void *dev_id)
|
|||
|
||||
static void omap_mcbsp_tx_dma_callback(int lch, u16 ch_status, void *data)
|
||||
{
|
||||
struct omap_mcbsp * mcbsp_dma_tx = (struct omap_mcbsp *)(data);
|
||||
struct omap_mcbsp *mcbsp_dma_tx = data;
|
||||
|
||||
DBG("TX DMA callback : 0x%x\n", OMAP_MCBSP_READ(mcbsp_dma_tx->io_base, SPCR2));
|
||||
DBG("TX DMA callback : 0x%x\n",
|
||||
OMAP_MCBSP_READ(mcbsp_dma_tx->io_base, SPCR2));
|
||||
|
||||
/* We can free the channels */
|
||||
omap_free_dma(mcbsp_dma_tx->dma_tx_lch);
|
||||
|
@ -131,9 +134,10 @@ static void omap_mcbsp_tx_dma_callback(int lch, u16 ch_status, void *data)
|
|||
|
||||
static void omap_mcbsp_rx_dma_callback(int lch, u16 ch_status, void *data)
|
||||
{
|
||||
struct omap_mcbsp * mcbsp_dma_rx = (struct omap_mcbsp *)(data);
|
||||
struct omap_mcbsp *mcbsp_dma_rx = data;
|
||||
|
||||
DBG("RX DMA callback : 0x%x\n", OMAP_MCBSP_READ(mcbsp_dma_rx->io_base, SPCR2));
|
||||
DBG("RX DMA callback : 0x%x\n",
|
||||
OMAP_MCBSP_READ(mcbsp_dma_rx->io_base, SPCR2));
|
||||
|
||||
/* We can free the channels */
|
||||
omap_free_dma(mcbsp_dma_rx->dma_rx_lch);
|
||||
|
|
|
@ -23,6 +23,7 @@ obj-y += clock.o
|
|||
|
||||
obj-$(CONFIG_CPU_S3C244X) += s3c244x.o
|
||||
obj-$(CONFIG_CPU_S3C244X) += s3c244x-irq.o
|
||||
obj-$(CONFIG_CPU_S3C244X) += s3c244x-clock.o
|
||||
obj-$(CONFIG_PM_SIMTEC) += pm-simtec.o
|
||||
obj-$(CONFIG_PM) += pm.o
|
||||
obj-$(CONFIG_PM) += sleep.o
|
||||
|
|
|
@ -172,6 +172,15 @@ int clk_set_rate(struct clk *clk, unsigned long rate)
|
|||
if (IS_ERR(clk))
|
||||
return -EINVAL;
|
||||
|
||||
/* We do not default just do a clk->rate = rate as
|
||||
* the clock may have been made this way by choice.
|
||||
*/
|
||||
|
||||
WARN_ON(clk->set_rate == NULL);
|
||||
|
||||
if (clk->set_rate == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&clocks_mutex);
|
||||
ret = (clk->set_rate)(clk, rate);
|
||||
mutex_unlock(&clocks_mutex);
|
||||
|
@ -213,6 +222,12 @@ EXPORT_SYMBOL(clk_set_parent);
|
|||
|
||||
/* base clocks */
|
||||
|
||||
static int clk_default_setrate(struct clk *clk, unsigned long rate)
|
||||
{
|
||||
clk->rate = rate;
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct clk clk_xtal = {
|
||||
.name = "xtal",
|
||||
.id = -1,
|
||||
|
@ -224,6 +239,7 @@ struct clk clk_xtal = {
|
|||
struct clk clk_mpll = {
|
||||
.name = "mpll",
|
||||
.id = -1,
|
||||
.set_rate = clk_default_setrate,
|
||||
};
|
||||
|
||||
struct clk clk_upll = {
|
||||
|
@ -239,6 +255,7 @@ struct clk clk_f = {
|
|||
.rate = 0,
|
||||
.parent = &clk_mpll,
|
||||
.ctrlbit = 0,
|
||||
.set_rate = clk_default_setrate,
|
||||
};
|
||||
|
||||
struct clk clk_h = {
|
||||
|
@ -247,6 +264,7 @@ struct clk clk_h = {
|
|||
.rate = 0,
|
||||
.parent = NULL,
|
||||
.ctrlbit = 0,
|
||||
.set_rate = clk_default_setrate,
|
||||
};
|
||||
|
||||
struct clk clk_p = {
|
||||
|
@ -255,6 +273,7 @@ struct clk clk_p = {
|
|||
.rate = 0,
|
||||
.parent = NULL,
|
||||
.ctrlbit = 0,
|
||||
.set_rate = clk_default_setrate,
|
||||
};
|
||||
|
||||
struct clk clk_usb_bus = {
|
||||
|
|
|
@ -525,7 +525,8 @@ int s3c2410_dma_enqueue(unsigned int channel, void *id,
|
|||
}
|
||||
} else if (chan->state == S3C2410_DMA_IDLE) {
|
||||
if (chan->flags & S3C2410_DMAF_AUTOSTART) {
|
||||
s3c2410_dma_ctrl(chan->number, S3C2410_DMAOP_START);
|
||||
s3c2410_dma_ctrl(chan->number | DMACH_LOW_LEVEL,
|
||||
S3C2410_DMAOP_START);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -787,7 +788,7 @@ int s3c2410_dma_request(unsigned int channel,
|
|||
|
||||
pr_debug("%s: channel initialised, %p\n", __FUNCTION__, chan);
|
||||
|
||||
return 0;
|
||||
return chan->number | DMACH_LOW_LEVEL;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(s3c2410_dma_request);
|
||||
|
@ -1173,6 +1174,7 @@ int s3c2410_dma_devconfig(int channel,
|
|||
|
||||
chan->source = source;
|
||||
chan->dev_addr = devaddr;
|
||||
chan->hw_cfg = hwcfg;
|
||||
|
||||
switch (source) {
|
||||
case S3C2410_DMASRC_HW:
|
||||
|
@ -1184,7 +1186,7 @@ int s3c2410_dma_devconfig(int channel,
|
|||
dma_wrreg(chan, S3C2410_DMA_DIDSTC, (0<<1) | (0<<0));
|
||||
|
||||
chan->addr_reg = dma_regaddr(chan, S3C2410_DMA_DIDST);
|
||||
return 0;
|
||||
break;
|
||||
|
||||
case S3C2410_DMASRC_MEM:
|
||||
/* source is memory */
|
||||
|
@ -1195,11 +1197,19 @@ int s3c2410_dma_devconfig(int channel,
|
|||
dma_wrreg(chan, S3C2410_DMA_DIDSTC, hwcfg & 3);
|
||||
|
||||
chan->addr_reg = dma_regaddr(chan, S3C2410_DMA_DISRC);
|
||||
return 0;
|
||||
break;
|
||||
|
||||
default:
|
||||
printk(KERN_ERR "dma%d: invalid source type (%d)\n",
|
||||
channel, source);
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
printk(KERN_ERR "dma%d: invalid source type (%d)\n", channel, source);
|
||||
return -EINVAL;
|
||||
if (dma_sel.direction != NULL)
|
||||
(dma_sel.direction)(chan, chan->map, source);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(s3c2410_dma_devconfig);
|
||||
|
@ -1227,6 +1237,10 @@ int s3c2410_dma_getposition(dmach_t channel, dma_addr_t *src, dma_addr_t *dst)
|
|||
|
||||
EXPORT_SYMBOL(s3c2410_dma_getposition);
|
||||
|
||||
static struct s3c2410_dma_chan *to_dma_chan(struct sys_device *dev)
|
||||
{
|
||||
return container_of(dev, struct s3c2410_dma_chan, dev);
|
||||
}
|
||||
|
||||
/* system device class */
|
||||
|
||||
|
@ -1234,7 +1248,7 @@ EXPORT_SYMBOL(s3c2410_dma_getposition);
|
|||
|
||||
static int s3c2410_dma_suspend(struct sys_device *dev, pm_message_t state)
|
||||
{
|
||||
struct s3c2410_dma_chan *cp = container_of(dev, struct s3c2410_dma_chan, dev);
|
||||
struct s3c2410_dma_chan *cp = to_dma_chan(dev);
|
||||
|
||||
printk(KERN_DEBUG "suspending dma channel %d\n", cp->number);
|
||||
|
||||
|
@ -1256,6 +1270,24 @@ static int s3c2410_dma_suspend(struct sys_device *dev, pm_message_t state)
|
|||
|
||||
static int s3c2410_dma_resume(struct sys_device *dev)
|
||||
{
|
||||
struct s3c2410_dma_chan *cp = to_dma_chan(dev);
|
||||
unsigned int no = cp->number | DMACH_LOW_LEVEL;
|
||||
|
||||
/* restore channel's hardware configuration */
|
||||
|
||||
if (!cp->in_use)
|
||||
return 0;
|
||||
|
||||
printk(KERN_INFO "dma%d: restoring configuration\n", cp->number);
|
||||
|
||||
s3c2410_dma_config(no, cp->xfer_unit, cp->dcon);
|
||||
s3c2410_dma_devconfig(no, cp->source, cp->hw_cfg, cp->dev_addr);
|
||||
|
||||
/* re-select the dma source for this channel */
|
||||
|
||||
if (cp->map != NULL)
|
||||
dma_sel.select(cp, cp->map);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1445,6 +1477,7 @@ static struct s3c2410_dma_chan *s3c2410_dma_map_channel(int channel)
|
|||
|
||||
found:
|
||||
dmach = &s3c2410_chans[ch];
|
||||
dmach->map = ch_map;
|
||||
dma_chan_map[channel] = dmach;
|
||||
|
||||
/* select the channel */
|
||||
|
|
|
@ -122,6 +122,19 @@ void s3c2410_gpio_pullup(unsigned int pin, unsigned int to)
|
|||
|
||||
EXPORT_SYMBOL(s3c2410_gpio_pullup);
|
||||
|
||||
int s3c2410_gpio_getpull(unsigned int pin)
|
||||
{
|
||||
void __iomem *base = S3C24XX_GPIO_BASE(pin);
|
||||
unsigned long offs = S3C2410_GPIO_OFFSET(pin);
|
||||
|
||||
if (pin < S3C2410_GPIO_BANKB)
|
||||
return -EINVAL;
|
||||
|
||||
return (__raw_readl(base + 0x08) & (1L << offs)) ? 1 : 0;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(s3c2410_gpio_getpull);
|
||||
|
||||
void s3c2410_gpio_setpin(unsigned int pin, unsigned int to)
|
||||
{
|
||||
void __iomem *base = S3C24XX_GPIO_BASE(pin);
|
||||
|
@ -186,3 +199,19 @@ int s3c2410_gpio_getirq(unsigned int pin)
|
|||
}
|
||||
|
||||
EXPORT_SYMBOL(s3c2410_gpio_getirq);
|
||||
|
||||
int s3c2410_gpio_irq2pin(unsigned int irq)
|
||||
{
|
||||
if (irq >= IRQ_EINT0 && irq <= IRQ_EINT3)
|
||||
return S3C2410_GPF0 + (irq - IRQ_EINT0);
|
||||
|
||||
if (irq >= IRQ_EINT4 && irq <= IRQ_EINT7)
|
||||
return S3C2410_GPF4 + (irq - IRQ_EINT4);
|
||||
|
||||
if (irq >= IRQ_EINT8 && irq <= IRQ_EINT23)
|
||||
return S3C2410_GPG0 + (irq - IRQ_EINT8);
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(s3c2410_gpio_irq2pin);
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче