You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'samsung/dt' into samsung/cleanup
Conflicts: arch/arm/mach-s3c64xx/Makefile arch/arm/mach-s5pc100/Makefile arch/arm/mach-s5pv210/Makefile Pull in previously resolved conflicts: The Makefiles were reorganized in the "rmk/restart" series and modified in the "samsung/cleanup series". This also pulls in the other conflict resolutions from the restart series against the samsung/dt series. Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
@@ -51,15 +51,14 @@ ffc00000 ffefffff DMA memory mapping region. Memory returned
|
||||
ff000000 ffbfffff Reserved for future expansion of DMA
|
||||
mapping region.
|
||||
|
||||
VMALLOC_END feffffff Free for platform use, recommended.
|
||||
VMALLOC_END must be aligned to a 2MB
|
||||
boundary.
|
||||
|
||||
VMALLOC_START VMALLOC_END-1 vmalloc() / ioremap() space.
|
||||
Memory returned by vmalloc/ioremap will
|
||||
be dynamically placed in this region.
|
||||
VMALLOC_START may be based upon the value
|
||||
of the high_memory variable.
|
||||
Machine specific static mappings are also
|
||||
located here through iotable_init().
|
||||
VMALLOC_START is based upon the value
|
||||
of the high_memory variable, and VMALLOC_END
|
||||
is equal to 0xff000000.
|
||||
|
||||
PAGE_OFFSET high_memory-1 Kernel direct-mapped RAM region.
|
||||
This maps the platforms RAM, and typically
|
||||
|
||||
@@ -42,6 +42,10 @@ Optional
|
||||
- interrupts : Interrupt source of the parent interrupt controller. Only
|
||||
present on secondary GICs.
|
||||
|
||||
- cpu-offset : per-cpu offset within the distributor and cpu interface
|
||||
regions, used when the GIC doesn't have banked registers. The offset is
|
||||
cpu-offset * cpu-nr.
|
||||
|
||||
Example:
|
||||
|
||||
intc: interrupt-controller@fff11000 {
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
* ARM Vectored Interrupt Controller
|
||||
|
||||
One or more Vectored Interrupt Controllers (VIC's) can be connected in an ARM
|
||||
system for interrupt routing. For multiple controllers they can either be
|
||||
nested or have the outputs wire-OR'd together.
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible : should be one of
|
||||
"arm,pl190-vic"
|
||||
"arm,pl192-vic"
|
||||
- interrupt-controller : Identifies the node as an interrupt controller
|
||||
- #interrupt-cells : The number of cells to define the interrupts. Must be 1 as
|
||||
the VIC has no configuration options for interrupt sources. The cell is a u32
|
||||
and defines the interrupt number.
|
||||
- reg : The register bank for the VIC.
|
||||
|
||||
Optional properties:
|
||||
|
||||
- interrupts : Interrupt source for parent controllers if the VIC is nested.
|
||||
|
||||
Example:
|
||||
|
||||
vic0: interrupt-controller@60000 {
|
||||
compatible = "arm,pl192-vic";
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <1>;
|
||||
reg = <0x60000 0x1000>;
|
||||
};
|
||||
@@ -1100,6 +1100,15 @@ emulate them efficiently. The fields in each entry are defined as follows:
|
||||
eax, ebx, ecx, edx: the values returned by the cpuid instruction for
|
||||
this function/index combination
|
||||
|
||||
The TSC deadline timer feature (CPUID leaf 1, ecx[24]) is always returned
|
||||
as false, since the feature depends on KVM_CREATE_IRQCHIP for local APIC
|
||||
support. Instead it is reported via
|
||||
|
||||
ioctl(KVM_CHECK_EXTENSION, KVM_CAP_TSC_DEADLINE_TIMER)
|
||||
|
||||
if that returns true and you use KVM_CREATE_IRQCHIP, or if you emulate the
|
||||
feature in userspace, then you can enable the feature for KVM_SET_CPUID2.
|
||||
|
||||
4.47 KVM_PPC_GET_PVINFO
|
||||
|
||||
Capability: KVM_CAP_PPC_GET_PVINFO
|
||||
@@ -1151,6 +1160,13 @@ following flags are specified:
|
||||
/* Depends on KVM_CAP_IOMMU */
|
||||
#define KVM_DEV_ASSIGN_ENABLE_IOMMU (1 << 0)
|
||||
|
||||
The KVM_DEV_ASSIGN_ENABLE_IOMMU flag is a mandatory option to ensure
|
||||
isolation of the device. Usages not specifying this flag are deprecated.
|
||||
|
||||
Only PCI header type 0 devices with PCI BAR resources are supported by
|
||||
device assignment. The user requesting this ioctl must have read/write
|
||||
access to the PCI sysfs resource files associated with the device.
|
||||
|
||||
4.49 KVM_DEASSIGN_PCI_DEVICE
|
||||
|
||||
Capability: KVM_CAP_DEVICE_DEASSIGNMENT
|
||||
|
||||
+21
-12
@@ -1124,13 +1124,6 @@ S: Supported
|
||||
F: arch/arm/mach-shmobile/
|
||||
F: drivers/sh/
|
||||
|
||||
ARM/TELECHIPS ARM ARCHITECTURE
|
||||
M: "Hans J. Koch" <hjk@hansjkoch.de>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: arch/arm/plat-tcc/
|
||||
F: arch/arm/mach-tcc8k/
|
||||
|
||||
ARM/TECHNOLOGIC SYSTEMS TS7250 MACHINE SUPPORT
|
||||
M: Lennert Buytenhek <kernel@wantstofly.org>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
@@ -2700,7 +2693,7 @@ FIREWIRE SUBSYSTEM
|
||||
M: Stefan Richter <stefanr@s5r6.in-berlin.de>
|
||||
L: linux1394-devel@lists.sourceforge.net
|
||||
W: http://ieee1394.wiki.kernel.org/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6.git
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394.git
|
||||
S: Maintained
|
||||
F: drivers/firewire/
|
||||
F: include/linux/firewire*.h
|
||||
@@ -3101,6 +3094,7 @@ F: include/linux/hid*
|
||||
|
||||
HIGH-RESOLUTION TIMERS, CLOCKEVENTS, DYNTICKS
|
||||
M: Thomas Gleixner <tglx@linutronix.de>
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core
|
||||
S: Maintained
|
||||
F: Documentation/timers/
|
||||
F: kernel/hrtimer.c
|
||||
@@ -3610,7 +3604,7 @@ F: net/irda/
|
||||
IRQ SUBSYSTEM
|
||||
M: Thomas Gleixner <tglx@linutronix.de>
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git irq/core
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git irq/core
|
||||
F: kernel/irq/
|
||||
|
||||
ISAPNP
|
||||
@@ -4098,7 +4092,7 @@ F: drivers/hwmon/lm90.c
|
||||
LOCKDEP AND LOCKSTAT
|
||||
M: Peter Zijlstra <peterz@infradead.org>
|
||||
M: Ingo Molnar <mingo@redhat.com>
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/peterz/linux-2.6-lockdep.git
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git core/locking
|
||||
S: Maintained
|
||||
F: Documentation/lockdep*.txt
|
||||
F: Documentation/lockstat.txt
|
||||
@@ -4280,7 +4274,9 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git
|
||||
S: Maintained
|
||||
F: Documentation/dvb/
|
||||
F: Documentation/video4linux/
|
||||
F: Documentation/DocBook/media/
|
||||
F: drivers/media/
|
||||
F: drivers/staging/media/
|
||||
F: include/media/
|
||||
F: include/linux/dvb/
|
||||
F: include/linux/videodev*.h
|
||||
@@ -5086,6 +5082,7 @@ M: Peter Zijlstra <a.p.zijlstra@chello.nl>
|
||||
M: Paul Mackerras <paulus@samba.org>
|
||||
M: Ingo Molnar <mingo@elte.hu>
|
||||
M: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf/core
|
||||
S: Supported
|
||||
F: kernel/events/*
|
||||
F: include/linux/perf_event.h
|
||||
@@ -5117,6 +5114,15 @@ L: linux-mtd@lists.infradead.org
|
||||
S: Maintained
|
||||
F: drivers/mtd/devices/phram.c
|
||||
|
||||
PICOXCELL SUPPORT
|
||||
M: Jamie Iles <jamie@jamieiles.com>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
T: git git://github.com/jamieiles/linux-2.6-ji.git
|
||||
S: Supported
|
||||
F: arch/arm/mach-picoxcell
|
||||
F: drivers/*/picoxcell*
|
||||
F: drivers/*/*/picoxcell*
|
||||
|
||||
PIN CONTROL SUBSYSTEM
|
||||
M: Linus Walleij <linus.walleij@linaro.org>
|
||||
S: Maintained
|
||||
@@ -5165,6 +5171,7 @@ F: drivers/scsi/pm8001/
|
||||
|
||||
POSIX CLOCKS and TIMERS
|
||||
M: Thomas Gleixner <tglx@linutronix.de>
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core
|
||||
S: Supported
|
||||
F: fs/timerfd.c
|
||||
F: include/linux/timer*
|
||||
@@ -5680,6 +5687,7 @@ F: drivers/dma/dw_dmac.c
|
||||
TIMEKEEPING, NTP
|
||||
M: John Stultz <johnstul@us.ibm.com>
|
||||
M: Thomas Gleixner <tglx@linutronix.de>
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core
|
||||
S: Supported
|
||||
F: include/linux/clocksource.h
|
||||
F: include/linux/time.h
|
||||
@@ -5704,6 +5712,7 @@ F: drivers/watchdog/sc1200wdt.c
|
||||
SCHEDULER
|
||||
M: Ingo Molnar <mingo@elte.hu>
|
||||
M: Peter Zijlstra <peterz@infradead.org>
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git sched/core
|
||||
S: Maintained
|
||||
F: kernel/sched*
|
||||
F: include/linux/sched.h
|
||||
@@ -6631,7 +6640,7 @@ TRACING
|
||||
M: Steven Rostedt <rostedt@goodmis.org>
|
||||
M: Frederic Weisbecker <fweisbec@gmail.com>
|
||||
M: Ingo Molnar <mingo@redhat.com>
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git perf/core
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf/core
|
||||
S: Maintained
|
||||
F: Documentation/trace/ftrace.txt
|
||||
F: arch/*/*/*/ftrace.h
|
||||
@@ -7381,7 +7390,7 @@ M: Thomas Gleixner <tglx@linutronix.de>
|
||||
M: Ingo Molnar <mingo@redhat.com>
|
||||
M: "H. Peter Anvin" <hpa@zytor.com>
|
||||
M: x86@kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86.git
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86/core
|
||||
S: Maintained
|
||||
F: Documentation/x86/
|
||||
F: arch/x86/
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 2
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc6
|
||||
EXTRAVERSION = -rc7
|
||||
NAME = Saber-toothed Squirrel
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
||||
+43
-21
@@ -258,6 +258,7 @@ config ARCH_INTEGRATOR
|
||||
select ARCH_HAS_CPUFREQ
|
||||
select CLKDEV_LOOKUP
|
||||
select HAVE_MACH_CLKDEV
|
||||
select HAVE_TCM
|
||||
select ICST
|
||||
select GENERIC_CLOCKEVENTS
|
||||
select PLAT_VERSATILE
|
||||
@@ -341,10 +342,12 @@ config ARCH_HIGHBANK
|
||||
select ARM_AMBA
|
||||
select ARM_GIC
|
||||
select ARM_TIMER_SP804
|
||||
select CACHE_L2X0
|
||||
select CLKDEV_LOOKUP
|
||||
select CPU_V7
|
||||
select GENERIC_CLOCKEVENTS
|
||||
select HAVE_ARM_SCU
|
||||
select HAVE_SMP
|
||||
select USE_OF
|
||||
help
|
||||
Support for the Calxeda Highbank SoC based boards.
|
||||
@@ -362,6 +365,7 @@ config ARCH_CNS3XXX
|
||||
select CPU_V6K
|
||||
select GENERIC_CLOCKEVENTS
|
||||
select ARM_GIC
|
||||
select MIGHT_HAVE_CACHE_L2X0
|
||||
select MIGHT_HAVE_PCI
|
||||
select PCI_DOMAINS if PCI
|
||||
help
|
||||
@@ -382,6 +386,7 @@ config ARCH_PRIMA2
|
||||
select GENERIC_CLOCKEVENTS
|
||||
select CLKDEV_LOOKUP
|
||||
select GENERIC_IRQ_CHIP
|
||||
select MIGHT_HAVE_CACHE_L2X0
|
||||
select USE_OF
|
||||
select ZONE_DMA
|
||||
help
|
||||
@@ -634,6 +639,8 @@ config ARCH_TEGRA
|
||||
select GENERIC_GPIO
|
||||
select HAVE_CLK
|
||||
select HAVE_SCHED_CLOCK
|
||||
select HAVE_SMP
|
||||
select MIGHT_HAVE_CACHE_L2X0
|
||||
select ARCH_HAS_CPUFREQ
|
||||
help
|
||||
This enables support for NVIDIA Tegra based systems (Tegra APX,
|
||||
@@ -651,6 +658,7 @@ config ARCH_PICOXCELL
|
||||
select HAVE_SCHED_CLOCK
|
||||
select HAVE_TCM
|
||||
select NO_IOPORT
|
||||
select SPARSE_IRQ
|
||||
select USE_OF
|
||||
help
|
||||
This enables support for systems based on the Picochip picoXcell
|
||||
@@ -703,7 +711,9 @@ config ARCH_SHMOBILE
|
||||
select HAVE_CLK
|
||||
select CLKDEV_LOOKUP
|
||||
select HAVE_MACH_CLKDEV
|
||||
select HAVE_SMP
|
||||
select GENERIC_CLOCKEVENTS
|
||||
select MIGHT_HAVE_CACHE_L2X0
|
||||
select NO_IOPORT
|
||||
select SPARSE_IRQ
|
||||
select MULTI_IRQ_HANDLER
|
||||
@@ -868,16 +878,6 @@ config ARCH_SHARK
|
||||
Support for the StrongARM based Digital DNARD machine, also known
|
||||
as "Shark" (<http://www.shark-linux.de/shark.html>).
|
||||
|
||||
config ARCH_TCC_926
|
||||
bool "Telechips TCC ARM926-based systems"
|
||||
select CLKSRC_MMIO
|
||||
select CPU_ARM926T
|
||||
select HAVE_CLK
|
||||
select CLKDEV_LOOKUP
|
||||
select GENERIC_CLOCKEVENTS
|
||||
help
|
||||
Support for Telechips TCC ARM926-based systems.
|
||||
|
||||
config ARCH_U300
|
||||
bool "ST-Ericsson U300 Series"
|
||||
depends on MMU
|
||||
@@ -893,7 +893,6 @@ config ARCH_U300
|
||||
select HAVE_MACH_CLKDEV
|
||||
select GENERIC_GPIO
|
||||
select ARCH_REQUIRE_GPIOLIB
|
||||
select NEED_MACH_MEMORY_H
|
||||
help
|
||||
Support for ST-Ericsson U300 series mobile platforms.
|
||||
|
||||
@@ -905,6 +904,8 @@ config ARCH_U8500
|
||||
select CLKDEV_LOOKUP
|
||||
select ARCH_REQUIRE_GPIOLIB
|
||||
select ARCH_HAS_CPUFREQ
|
||||
select HAVE_SMP
|
||||
select MIGHT_HAVE_CACHE_L2X0
|
||||
help
|
||||
Support for ST-Ericsson's Ux500 architecture
|
||||
|
||||
@@ -915,6 +916,7 @@ config ARCH_NOMADIK
|
||||
select CPU_ARM926T
|
||||
select CLKDEV_LOOKUP
|
||||
select GENERIC_CLOCKEVENTS
|
||||
select MIGHT_HAVE_CACHE_L2X0
|
||||
select ARCH_REQUIRE_GPIOLIB
|
||||
help
|
||||
Support for the Nomadik platform by ST-Ericsson
|
||||
@@ -974,6 +976,7 @@ config ARCH_ZYNQ
|
||||
select ARM_GIC
|
||||
select ARM_AMBA
|
||||
select ICST
|
||||
select MIGHT_HAVE_CACHE_L2X0
|
||||
select USE_OF
|
||||
help
|
||||
Support for Xilinx Zynq ARM Cortex A9 Platform
|
||||
@@ -1060,8 +1063,6 @@ source "arch/arm/plat-s5p/Kconfig"
|
||||
|
||||
source "arch/arm/plat-spear/Kconfig"
|
||||
|
||||
source "arch/arm/plat-tcc/Kconfig"
|
||||
|
||||
if ARCH_S3C2410
|
||||
source "arch/arm/mach-s3c2410/Kconfig"
|
||||
source "arch/arm/mach-s3c2412/Kconfig"
|
||||
@@ -1126,6 +1127,11 @@ config ARM_TIMER_SP804
|
||||
|
||||
source arch/arm/mm/Kconfig
|
||||
|
||||
config ARM_NR_BANKS
|
||||
int
|
||||
default 16 if ARCH_EP93XX
|
||||
default 8
|
||||
|
||||
config IWMMXT
|
||||
bool "Enable iWMMXt support"
|
||||
depends on CPU_XSCALE || CPU_XSC3 || CPU_MOHAWK || CPU_PJ4
|
||||
@@ -1246,7 +1252,7 @@ config PL310_ERRATA_588369
|
||||
|
||||
config ARM_ERRATA_720789
|
||||
bool "ARM errata: TLBIASIDIS and TLBIMVAIS operations can broadcast a faulty ASID"
|
||||
depends on CPU_V7 && SMP
|
||||
depends on CPU_V7
|
||||
help
|
||||
This option enables the workaround for the 720789 Cortex-A9 (prior to
|
||||
r2p0) erratum. A faulty ASID can be sent to the other CPUs for the
|
||||
@@ -1282,7 +1288,7 @@ config ARM_ERRATA_743622
|
||||
|
||||
config ARM_ERRATA_751472
|
||||
bool "ARM errata: Interrupted ICIALLUIS may prevent completion of broadcasted operation"
|
||||
depends on CPU_V7 && SMP
|
||||
depends on CPU_V7
|
||||
help
|
||||
This option enables the workaround for the 751472 Cortex-A9 (prior
|
||||
to r3p0) erratum. An interrupted ICIALLUIS operation may prevent the
|
||||
@@ -1435,14 +1441,20 @@ menu "Kernel Features"
|
||||
|
||||
source "kernel/time/Kconfig"
|
||||
|
||||
config HAVE_SMP
|
||||
bool
|
||||
help
|
||||
This option should be selected by machines which have an SMP-
|
||||
capable CPU.
|
||||
|
||||
The only effect of this option is to make the SMP-related
|
||||
options available to the user for configuration.
|
||||
|
||||
config SMP
|
||||
bool "Symmetric Multi-Processing"
|
||||
depends on CPU_V6K || CPU_V7
|
||||
depends on GENERIC_CLOCKEVENTS
|
||||
depends on REALVIEW_EB_ARM11MP || REALVIEW_EB_A9MP || \
|
||||
MACH_REALVIEW_PB11MP || MACH_REALVIEW_PBX || ARCH_OMAP4 || \
|
||||
ARCH_EXYNOS4 || ARCH_TEGRA || ARCH_U8500 || ARCH_VEXPRESS_CA9X4 || \
|
||||
ARCH_MSM_SCORPIONMP || ARCH_SHMOBILE || ARCH_HIGHBANK || SOC_IMX6Q
|
||||
depends on HAVE_SMP
|
||||
depends on MMU
|
||||
select USE_GENERIC_SMP_HELPERS
|
||||
select HAVE_ARM_SCU if !ARCH_MSM_SCORPIONMP
|
||||
@@ -1560,6 +1572,16 @@ config LOCAL_TIMERS
|
||||
accounting to be spread across the timer interval, preventing a
|
||||
"thundering herd" at every timer tick.
|
||||
|
||||
config ARCH_NR_GPIO
|
||||
int
|
||||
default 1024 if ARCH_SHMOBILE || ARCH_TEGRA
|
||||
default 350 if ARCH_U8500
|
||||
default 0
|
||||
help
|
||||
Maximum number of GPIOs in the system.
|
||||
|
||||
If unsure, leave the default value.
|
||||
|
||||
source kernel/Kconfig.preempt
|
||||
|
||||
config HZ
|
||||
@@ -1972,7 +1994,7 @@ endchoice
|
||||
|
||||
config XIP_KERNEL
|
||||
bool "Kernel Execute-In-Place from ROM"
|
||||
depends on !ZBOOT_ROM
|
||||
depends on !ZBOOT_ROM && !ARM_LPAE
|
||||
help
|
||||
Execute-In-Place allows the kernel to run from non-volatile storage
|
||||
directly addressable by the CPU, such as NOR flash. This saves RAM
|
||||
@@ -2002,7 +2024,7 @@ config XIP_PHYS_ADDR
|
||||
|
||||
config KEXEC
|
||||
bool "Kexec system call (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL
|
||||
depends on EXPERIMENTAL && (!SMP || HOTPLUG_CPU)
|
||||
help
|
||||
kexec is a system call that implements the ability to shutdown your
|
||||
current kernel, and to start another kernel. It is like a reboot
|
||||
|
||||
@@ -100,6 +100,14 @@ choice
|
||||
Note that the system will appear to hang during boot if there
|
||||
is nothing connected to read from the DCC.
|
||||
|
||||
config AT91_DEBUG_LL_DBGU0
|
||||
bool "Kernel low-level debugging on rm9200, 9260/9g20, 9261/9g10 and 9rl"
|
||||
depends on HAVE_AT91_DBGU0
|
||||
|
||||
config AT91_DEBUG_LL_DBGU1
|
||||
bool "Kernel low-level debugging on 9263, 9g45 and cap9"
|
||||
depends on HAVE_AT91_DBGU1
|
||||
|
||||
config DEBUG_FOOTBRIDGE_COM1
|
||||
bool "Kernel low-level debugging messages via footbridge 8250 at PCI COM1"
|
||||
depends on FOOTBRIDGE
|
||||
@@ -247,6 +255,43 @@ choice
|
||||
their output to the standard serial port on the RealView
|
||||
PB1176 platform.
|
||||
|
||||
config DEBUG_MSM_UART1
|
||||
bool "Kernel low-level debugging messages via MSM UART1"
|
||||
depends on ARCH_MSM7X00A || ARCH_MSM7X30 || ARCH_QSD8X50
|
||||
help
|
||||
Say Y here if you want the debug print routines to direct
|
||||
their output to the first serial port on MSM devices.
|
||||
|
||||
config DEBUG_MSM_UART2
|
||||
bool "Kernel low-level debugging messages via MSM UART2"
|
||||
depends on ARCH_MSM7X00A || ARCH_MSM7X30 || ARCH_QSD8X50
|
||||
help
|
||||
Say Y here if you want the debug print routines to direct
|
||||
their output to the second serial port on MSM devices.
|
||||
|
||||
config DEBUG_MSM_UART3
|
||||
bool "Kernel low-level debugging messages via MSM UART3"
|
||||
depends on ARCH_MSM7X00A || ARCH_MSM7X30 || ARCH_QSD8X50
|
||||
help
|
||||
Say Y here if you want the debug print routines to direct
|
||||
their output to the third serial port on MSM devices.
|
||||
|
||||
config DEBUG_MSM8660_UART
|
||||
bool "Kernel low-level debugging messages via MSM 8660 UART"
|
||||
depends on ARCH_MSM8X60
|
||||
select MSM_HAS_DEBUG_UART_HS
|
||||
help
|
||||
Say Y here if you want the debug print routines to direct
|
||||
their output to the serial port on MSM 8660 devices.
|
||||
|
||||
config DEBUG_MSM8960_UART
|
||||
bool "Kernel low-level debugging messages via MSM 8960 UART"
|
||||
depends on ARCH_MSM8960
|
||||
select MSM_HAS_DEBUG_UART_HS
|
||||
help
|
||||
Say Y here if you want the debug print routines to direct
|
||||
their output to the serial port on MSM 8960 devices.
|
||||
|
||||
endchoice
|
||||
|
||||
config EARLY_PRINTK
|
||||
|
||||
@@ -184,7 +184,6 @@ machine-$(CONFIG_ARCH_EXYNOS4) := exynos
|
||||
machine-$(CONFIG_ARCH_SA1100) := sa1100
|
||||
machine-$(CONFIG_ARCH_SHARK) := shark
|
||||
machine-$(CONFIG_ARCH_SHMOBILE) := shmobile
|
||||
machine-$(CONFIG_ARCH_TCC8K) := tcc8k
|
||||
machine-$(CONFIG_ARCH_TEGRA) := tegra
|
||||
machine-$(CONFIG_ARCH_U300) := u300
|
||||
machine-$(CONFIG_ARCH_U8500) := ux500
|
||||
@@ -204,7 +203,6 @@ machine-$(CONFIG_ARCH_ZYNQ) := zynq
|
||||
plat-$(CONFIG_ARCH_MXC) := mxc
|
||||
plat-$(CONFIG_ARCH_OMAP) := omap
|
||||
plat-$(CONFIG_ARCH_S3C64XX) := samsung
|
||||
plat-$(CONFIG_ARCH_TCC_926) := tcc
|
||||
plat-$(CONFIG_ARCH_ZYNQ) := versatile
|
||||
plat-$(CONFIG_PLAT_IOP) := iop
|
||||
plat-$(CONFIG_PLAT_NOMADIK) := nomadik
|
||||
|
||||
@@ -126,7 +126,8 @@ ccflags-y := -fpic -fno-builtin -I$(obj)
|
||||
asflags-y := -Wa,-march=all
|
||||
|
||||
# Supply kernel BSS size to the decompressor via a linker symbol.
|
||||
KBSS_SZ = $(shell size $(obj)/../../../../vmlinux | awk 'END{print $$3}')
|
||||
KBSS_SZ = $(shell $(CROSS_COMPILE)size $(obj)/../../../../vmlinux | \
|
||||
awk 'END{print $$3}')
|
||||
LDFLAGS_vmlinux = --defsym _kernel_bss_size=$(KBSS_SZ)
|
||||
# Supply ZRELADDR to the decompressor via a linker symbol.
|
||||
ifneq ($(CONFIG_AUTO_ZRELADDR),y)
|
||||
|
||||
@@ -659,6 +659,7 @@ __armv7_mmu_cache_on:
|
||||
mcrne p15, 0, r3, c2, c0, 0 @ load page table pointer
|
||||
mcrne p15, 0, r1, c3, c0, 0 @ load domain access control
|
||||
#endif
|
||||
mcr p15, 0, r0, c7, c5, 4 @ ISB
|
||||
mcr p15, 0, r0, c1, c0, 0 @ load control register
|
||||
mrc p15, 0, r0, c1, c0, 0 @ and read it back
|
||||
mov r0, #0
|
||||
|
||||
@@ -1,8 +1,14 @@
|
||||
config ARM_GIC
|
||||
select IRQ_DOMAIN
|
||||
select MULTI_IRQ_HANDLER
|
||||
bool
|
||||
|
||||
config GIC_NON_BANKED
|
||||
bool
|
||||
|
||||
config ARM_VIC
|
||||
select IRQ_DOMAIN
|
||||
select MULTI_IRQ_HANDLER
|
||||
bool
|
||||
|
||||
config ARM_VIC_NR
|
||||
|
||||
+141
-24
@@ -40,13 +40,36 @@
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <asm/irq.h>
|
||||
#include <asm/exception.h>
|
||||
#include <asm/mach/irq.h>
|
||||
#include <asm/hardware/gic.h>
|
||||
|
||||
static DEFINE_RAW_SPINLOCK(irq_controller_lock);
|
||||
union gic_base {
|
||||
void __iomem *common_base;
|
||||
void __percpu __iomem **percpu_base;
|
||||
};
|
||||
|
||||
/* Address of GIC 0 CPU interface */
|
||||
void __iomem *gic_cpu_base_addr __read_mostly;
|
||||
struct gic_chip_data {
|
||||
unsigned int irq_offset;
|
||||
union gic_base dist_base;
|
||||
union gic_base cpu_base;
|
||||
#ifdef CONFIG_CPU_PM
|
||||
u32 saved_spi_enable[DIV_ROUND_UP(1020, 32)];
|
||||
u32 saved_spi_conf[DIV_ROUND_UP(1020, 16)];
|
||||
u32 saved_spi_target[DIV_ROUND_UP(1020, 4)];
|
||||
u32 __percpu *saved_ppi_enable;
|
||||
u32 __percpu *saved_ppi_conf;
|
||||
#endif
|
||||
#ifdef CONFIG_IRQ_DOMAIN
|
||||
struct irq_domain domain;
|
||||
#endif
|
||||
unsigned int gic_irqs;
|
||||
#ifdef CONFIG_GIC_NON_BANKED
|
||||
void __iomem *(*get_base)(union gic_base *);
|
||||
#endif
|
||||
};
|
||||
|
||||
static DEFINE_RAW_SPINLOCK(irq_controller_lock);
|
||||
|
||||
/*
|
||||
* Supported arch specific GIC irq extension.
|
||||
@@ -67,16 +90,48 @@ struct irq_chip gic_arch_extn = {
|
||||
|
||||
static struct gic_chip_data gic_data[MAX_GIC_NR] __read_mostly;
|
||||
|
||||
#ifdef CONFIG_GIC_NON_BANKED
|
||||
static void __iomem *gic_get_percpu_base(union gic_base *base)
|
||||
{
|
||||
return *__this_cpu_ptr(base->percpu_base);
|
||||
}
|
||||
|
||||
static void __iomem *gic_get_common_base(union gic_base *base)
|
||||
{
|
||||
return base->common_base;
|
||||
}
|
||||
|
||||
static inline void __iomem *gic_data_dist_base(struct gic_chip_data *data)
|
||||
{
|
||||
return data->get_base(&data->dist_base);
|
||||
}
|
||||
|
||||
static inline void __iomem *gic_data_cpu_base(struct gic_chip_data *data)
|
||||
{
|
||||
return data->get_base(&data->cpu_base);
|
||||
}
|
||||
|
||||
static inline void gic_set_base_accessor(struct gic_chip_data *data,
|
||||
void __iomem *(*f)(union gic_base *))
|
||||
{
|
||||
data->get_base = f;
|
||||
}
|
||||
#else
|
||||
#define gic_data_dist_base(d) ((d)->dist_base.common_base)
|
||||
#define gic_data_cpu_base(d) ((d)->cpu_base.common_base)
|
||||
#define gic_set_base_accessor(d,f)
|
||||
#endif
|
||||
|
||||
static inline void __iomem *gic_dist_base(struct irq_data *d)
|
||||
{
|
||||
struct gic_chip_data *gic_data = irq_data_get_irq_chip_data(d);
|
||||
return gic_data->dist_base;
|
||||
return gic_data_dist_base(gic_data);
|
||||
}
|
||||
|
||||
static inline void __iomem *gic_cpu_base(struct irq_data *d)
|
||||
{
|
||||
struct gic_chip_data *gic_data = irq_data_get_irq_chip_data(d);
|
||||
return gic_data->cpu_base;
|
||||
return gic_data_cpu_base(gic_data);
|
||||
}
|
||||
|
||||
static inline unsigned int gic_irq(struct irq_data *d)
|
||||
@@ -215,6 +270,32 @@ static int gic_set_wake(struct irq_data *d, unsigned int on)
|
||||
#define gic_set_wake NULL
|
||||
#endif
|
||||
|
||||
asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs)
|
||||
{
|
||||
u32 irqstat, irqnr;
|
||||
struct gic_chip_data *gic = &gic_data[0];
|
||||
void __iomem *cpu_base = gic_data_cpu_base(gic);
|
||||
|
||||
do {
|
||||
irqstat = readl_relaxed(cpu_base + GIC_CPU_INTACK);
|
||||
irqnr = irqstat & ~0x1c00;
|
||||
|
||||
if (likely(irqnr > 15 && irqnr < 1021)) {
|
||||
irqnr = irq_domain_to_irq(&gic->domain, irqnr);
|
||||
handle_IRQ(irqnr, regs);
|
||||
continue;
|
||||
}
|
||||
if (irqnr < 16) {
|
||||
writel_relaxed(irqstat, cpu_base + GIC_CPU_EOI);
|
||||
#ifdef CONFIG_SMP
|
||||
handle_IPI(irqnr, regs);
|
||||
#endif
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
} while (1);
|
||||
}
|
||||
|
||||
static void gic_handle_cascade_irq(unsigned int irq, struct irq_desc *desc)
|
||||
{
|
||||
struct gic_chip_data *chip_data = irq_get_handler_data(irq);
|
||||
@@ -225,7 +306,7 @@ static void gic_handle_cascade_irq(unsigned int irq, struct irq_desc *desc)
|
||||
chained_irq_enter(chip, desc);
|
||||
|
||||
raw_spin_lock(&irq_controller_lock);
|
||||
status = readl_relaxed(chip_data->cpu_base + GIC_CPU_INTACK);
|
||||
status = readl_relaxed(gic_data_cpu_base(chip_data) + GIC_CPU_INTACK);
|
||||
raw_spin_unlock(&irq_controller_lock);
|
||||
|
||||
gic_irq = (status & 0x3ff);
|
||||
@@ -270,7 +351,7 @@ static void __init gic_dist_init(struct gic_chip_data *gic)
|
||||
u32 cpumask;
|
||||
unsigned int gic_irqs = gic->gic_irqs;
|
||||
struct irq_domain *domain = &gic->domain;
|
||||
void __iomem *base = gic->dist_base;
|
||||
void __iomem *base = gic_data_dist_base(gic);
|
||||
u32 cpu = 0;
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
@@ -330,8 +411,8 @@ static void __init gic_dist_init(struct gic_chip_data *gic)
|
||||
|
||||
static void __cpuinit gic_cpu_init(struct gic_chip_data *gic)
|
||||
{
|
||||
void __iomem *dist_base = gic->dist_base;
|
||||
void __iomem *base = gic->cpu_base;
|
||||
void __iomem *dist_base = gic_data_dist_base(gic);
|
||||
void __iomem *base = gic_data_cpu_base(gic);
|
||||
int i;
|
||||
|
||||
/*
|
||||
@@ -368,7 +449,7 @@ static void gic_dist_save(unsigned int gic_nr)
|
||||
BUG();
|
||||
|
||||
gic_irqs = gic_data[gic_nr].gic_irqs;
|
||||
dist_base = gic_data[gic_nr].dist_base;
|
||||
dist_base = gic_data_dist_base(&gic_data[gic_nr]);
|
||||
|
||||
if (!dist_base)
|
||||
return;
|
||||
@@ -403,7 +484,7 @@ static void gic_dist_restore(unsigned int gic_nr)
|
||||
BUG();
|
||||
|
||||
gic_irqs = gic_data[gic_nr].gic_irqs;
|
||||
dist_base = gic_data[gic_nr].dist_base;
|
||||
dist_base = gic_data_dist_base(&gic_data[gic_nr]);
|
||||
|
||||
if (!dist_base)
|
||||
return;
|
||||
@@ -439,8 +520,8 @@ static void gic_cpu_save(unsigned int gic_nr)
|
||||
if (gic_nr >= MAX_GIC_NR)
|
||||
BUG();
|
||||
|
||||
dist_base = gic_data[gic_nr].dist_base;
|
||||
cpu_base = gic_data[gic_nr].cpu_base;
|
||||
dist_base = gic_data_dist_base(&gic_data[gic_nr]);
|
||||
cpu_base = gic_data_cpu_base(&gic_data[gic_nr]);
|
||||
|
||||
if (!dist_base || !cpu_base)
|
||||
return;
|
||||
@@ -465,8 +546,8 @@ static void gic_cpu_restore(unsigned int gic_nr)
|
||||
if (gic_nr >= MAX_GIC_NR)
|
||||
BUG();
|
||||
|
||||
dist_base = gic_data[gic_nr].dist_base;
|
||||
cpu_base = gic_data[gic_nr].cpu_base;
|
||||
dist_base = gic_data_dist_base(&gic_data[gic_nr]);
|
||||
cpu_base = gic_data_cpu_base(&gic_data[gic_nr]);
|
||||
|
||||
if (!dist_base || !cpu_base)
|
||||
return;
|
||||
@@ -491,6 +572,11 @@ static int gic_notifier(struct notifier_block *self, unsigned long cmd, void *v)
|
||||
int i;
|
||||
|
||||
for (i = 0; i < MAX_GIC_NR; i++) {
|
||||
#ifdef CONFIG_GIC_NON_BANKED
|
||||
/* Skip over unused GICs */
|
||||
if (!gic_data[i].get_base)
|
||||
continue;
|
||||
#endif
|
||||
switch (cmd) {
|
||||
case CPU_PM_ENTER:
|
||||
gic_cpu_save(i);
|
||||
@@ -564,8 +650,9 @@ const struct irq_domain_ops gic_irq_domain_ops = {
|
||||
#endif
|
||||
};
|
||||
|
||||
void __init gic_init(unsigned int gic_nr, int irq_start,
|
||||
void __iomem *dist_base, void __iomem *cpu_base)
|
||||
void __init gic_init_bases(unsigned int gic_nr, int irq_start,
|
||||
void __iomem *dist_base, void __iomem *cpu_base,
|
||||
u32 percpu_offset)
|
||||
{
|
||||
struct gic_chip_data *gic;
|
||||
struct irq_domain *domain;
|
||||
@@ -575,8 +662,36 @@ void __init gic_init(unsigned int gic_nr, int irq_start,
|
||||
|
||||
gic = &gic_data[gic_nr];
|
||||
domain = &gic->domain;
|
||||
gic->dist_base = dist_base;
|
||||
gic->cpu_base = cpu_base;
|
||||
#ifdef CONFIG_GIC_NON_BANKED
|
||||
if (percpu_offset) { /* Frankein-GIC without banked registers... */
|
||||
unsigned int cpu;
|
||||
|
||||
gic->dist_base.percpu_base = alloc_percpu(void __iomem *);
|
||||
gic->cpu_base.percpu_base = alloc_percpu(void __iomem *);
|
||||
if (WARN_ON(!gic->dist_base.percpu_base ||
|
||||
!gic->cpu_base.percpu_base)) {
|
||||
free_percpu(gic->dist_base.percpu_base);
|
||||
free_percpu(gic->cpu_base.percpu_base);
|
||||
return;
|
||||
}
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
unsigned long offset = percpu_offset * cpu_logical_map(cpu);
|
||||
*per_cpu_ptr(gic->dist_base.percpu_base, cpu) = dist_base + offset;
|
||||
*per_cpu_ptr(gic->cpu_base.percpu_base, cpu) = cpu_base + offset;
|
||||
}
|
||||
|
||||
gic_set_base_accessor(gic, gic_get_percpu_base);
|
||||
} else
|
||||
#endif
|
||||
{ /* Normal, sane GIC... */
|
||||
WARN(percpu_offset,
|
||||
"GIC_NON_BANKED not enabled, ignoring %08x offset!",
|
||||
percpu_offset);
|
||||
gic->dist_base.common_base = dist_base;
|
||||
gic->cpu_base.common_base = cpu_base;
|
||||
gic_set_base_accessor(gic, gic_get_common_base);
|
||||
}
|
||||
|
||||
/*
|
||||
* For primary GICs, skip over SGIs.
|
||||
@@ -584,8 +699,6 @@ void __init gic_init(unsigned int gic_nr, int irq_start,
|
||||
*/
|
||||
domain->hwirq_base = 32;
|
||||
if (gic_nr == 0) {
|
||||
gic_cpu_base_addr = cpu_base;
|
||||
|
||||
if ((irq_start & 31) > 0) {
|
||||
domain->hwirq_base = 16;
|
||||
if (irq_start != -1)
|
||||
@@ -597,7 +710,7 @@ void __init gic_init(unsigned int gic_nr, int irq_start,
|
||||
* Find out how many interrupts are supported.
|
||||
* The GIC only supports up to 1020 interrupt sources.
|
||||
*/
|
||||
gic_irqs = readl_relaxed(dist_base + GIC_DIST_CTR) & 0x1f;
|
||||
gic_irqs = readl_relaxed(gic_data_dist_base(gic) + GIC_DIST_CTR) & 0x1f;
|
||||
gic_irqs = (gic_irqs + 1) * 32;
|
||||
if (gic_irqs > 1020)
|
||||
gic_irqs = 1020;
|
||||
@@ -645,7 +758,7 @@ void gic_raise_softirq(const struct cpumask *mask, unsigned int irq)
|
||||
dsb();
|
||||
|
||||
/* this always happens on GIC0 */
|
||||
writel_relaxed(map << 16 | irq, gic_data[0].dist_base + GIC_DIST_SOFTINT);
|
||||
writel_relaxed(map << 16 | irq, gic_data_dist_base(&gic_data[0]) + GIC_DIST_SOFTINT);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -656,6 +769,7 @@ int __init gic_of_init(struct device_node *node, struct device_node *parent)
|
||||
{
|
||||
void __iomem *cpu_base;
|
||||
void __iomem *dist_base;
|
||||
u32 percpu_offset;
|
||||
int irq;
|
||||
struct irq_domain *domain = &gic_data[gic_cnt].domain;
|
||||
|
||||
@@ -668,9 +782,12 @@ int __init gic_of_init(struct device_node *node, struct device_node *parent)
|
||||
cpu_base = of_iomap(node, 1);
|
||||
WARN(!cpu_base, "unable to map gic cpu registers\n");
|
||||
|
||||
if (of_property_read_u32(node, "cpu-offset", &percpu_offset))
|
||||
percpu_offset = 0;
|
||||
|
||||
domain->of_node = of_node_get(node);
|
||||
|
||||
gic_init(gic_cnt, -1, dist_base, cpu_base);
|
||||
gic_init_bases(gic_cnt, -1, dist_base, cpu_base, percpu_offset);
|
||||
|
||||
if (parent) {
|
||||
irq = irq_of_parse_and_map(node, 0);
|
||||
|
||||
+56
-68
@@ -221,17 +221,6 @@
|
||||
*/
|
||||
#define MCODE_BUFF_PER_REQ 256
|
||||
|
||||
/*
|
||||
* Mark a _pl330_req as free.
|
||||
* We do it by writing DMAEND as the first instruction
|
||||
* because no valid request is going to have DMAEND as
|
||||
* its first instruction to execute.
|
||||
*/
|
||||
#define MARK_FREE(req) do { \
|
||||
_emit_END(0, (req)->mc_cpu); \
|
||||
(req)->mc_len = 0; \
|
||||
} while (0)
|
||||
|
||||
/* If the _pl330_req is available to the client */
|
||||
#define IS_FREE(req) (*((u8 *)((req)->mc_cpu)) == CMD_DMAEND)
|
||||
|
||||
@@ -301,8 +290,10 @@ struct pl330_thread {
|
||||
struct pl330_dmac *dmac;
|
||||
/* Only two at a time */
|
||||
struct _pl330_req req[2];
|
||||
/* Index of the last submitted request */
|
||||
/* Index of the last enqueued request */
|
||||
unsigned lstenq;
|
||||
/* Index of the last submitted request or -1 if the DMA is stopped */
|
||||
int req_running;
|
||||
};
|
||||
|
||||
enum pl330_dmac_state {
|
||||
@@ -778,6 +769,22 @@ static inline void _execute_DBGINSN(struct pl330_thread *thrd,
|
||||
writel(0, regs + DBGCMD);
|
||||
}
|
||||
|
||||
/*
|
||||
* Mark a _pl330_req as free.
|
||||
* We do it by writing DMAEND as the first instruction
|
||||
* because no valid request is going to have DMAEND as
|
||||
* its first instruction to execute.
|
||||
*/
|
||||
static void mark_free(struct pl330_thread *thrd, int idx)
|
||||
{
|
||||
struct _pl330_req *req = &thrd->req[idx];
|
||||
|
||||
_emit_END(0, req->mc_cpu);
|
||||
req->mc_len = 0;
|
||||
|
||||
thrd->req_running = -1;
|
||||
}
|
||||
|
||||
static inline u32 _state(struct pl330_thread *thrd)
|
||||
{
|
||||
void __iomem *regs = thrd->dmac->pinfo->base;
|
||||
@@ -836,31 +843,6 @@ static inline u32 _state(struct pl330_thread *thrd)
|
||||
}
|
||||
}
|
||||
|
||||
/* If the request 'req' of thread 'thrd' is currently active */
|
||||
static inline bool _req_active(struct pl330_thread *thrd,
|
||||
struct _pl330_req *req)
|
||||
{
|
||||
void __iomem *regs = thrd->dmac->pinfo->base;
|
||||
u32 buf = req->mc_bus, pc = readl(regs + CPC(thrd->id));
|
||||
|
||||
if (IS_FREE(req))
|
||||
return false;
|
||||
|
||||
return (pc >= buf && pc <= buf + req->mc_len) ? true : false;
|
||||
}
|
||||
|
||||
/* Returns 0 if the thread is inactive, ID of active req + 1 otherwise */
|
||||
static inline unsigned _thrd_active(struct pl330_thread *thrd)
|
||||
{
|
||||
if (_req_active(thrd, &thrd->req[0]))
|
||||
return 1; /* First req active */
|
||||
|
||||
if (_req_active(thrd, &thrd->req[1]))
|
||||
return 2; /* Second req active */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void _stop(struct pl330_thread *thrd)
|
||||
{
|
||||
void __iomem *regs = thrd->dmac->pinfo->base;
|
||||
@@ -892,17 +874,22 @@ static bool _trigger(struct pl330_thread *thrd)
|
||||
struct _arg_GO go;
|
||||
unsigned ns;
|
||||
u8 insn[6] = {0, 0, 0, 0, 0, 0};
|
||||
int idx;
|
||||
|
||||
/* Return if already ACTIVE */
|
||||
if (_state(thrd) != PL330_STATE_STOPPED)
|
||||
return true;
|
||||
|
||||
if (!IS_FREE(&thrd->req[1 - thrd->lstenq]))
|
||||
req = &thrd->req[1 - thrd->lstenq];
|
||||
else if (!IS_FREE(&thrd->req[thrd->lstenq]))
|
||||
req = &thrd->req[thrd->lstenq];
|
||||
else
|
||||
req = NULL;
|
||||
idx = 1 - thrd->lstenq;
|
||||
if (!IS_FREE(&thrd->req[idx]))
|
||||
req = &thrd->req[idx];
|
||||
else {
|
||||
idx = thrd->lstenq;
|
||||
if (!IS_FREE(&thrd->req[idx]))
|
||||
req = &thrd->req[idx];
|
||||
else
|
||||
req = NULL;
|
||||
}
|
||||
|
||||
/* Return if no request */
|
||||
if (!req || !req->r)
|
||||
@@ -933,6 +920,8 @@ static bool _trigger(struct pl330_thread *thrd)
|
||||
/* Only manager can execute GO */
|
||||
_execute_DBGINSN(thrd, insn, true);
|
||||
|
||||
thrd->req_running = idx;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1382,8 +1371,8 @@ static void pl330_dotask(unsigned long data)
|
||||
|
||||
thrd->req[0].r = NULL;
|
||||
thrd->req[1].r = NULL;
|
||||
MARK_FREE(&thrd->req[0]);
|
||||
MARK_FREE(&thrd->req[1]);
|
||||
mark_free(thrd, 0);
|
||||
mark_free(thrd, 1);
|
||||
|
||||
/* Clear the reset flag */
|
||||
pl330->dmac_tbd.reset_chan &= ~(1 << i);
|
||||
@@ -1461,14 +1450,12 @@ int pl330_update(const struct pl330_info *pi)
|
||||
|
||||
thrd = &pl330->channels[id];
|
||||
|
||||
active = _thrd_active(thrd);
|
||||
if (!active) /* Aborted */
|
||||
active = thrd->req_running;
|
||||
if (active == -1) /* Aborted */
|
||||
continue;
|
||||
|
||||
active -= 1;
|
||||
|
||||
rqdone = &thrd->req[active];
|
||||
MARK_FREE(rqdone);
|
||||
mark_free(thrd, active);
|
||||
|
||||
/* Get going again ASAP */
|
||||
_start(thrd);
|
||||
@@ -1480,13 +1467,19 @@ int pl330_update(const struct pl330_info *pi)
|
||||
|
||||
/* Now that we are in no hurry, do the callbacks */
|
||||
while (!list_empty(&pl330->req_done)) {
|
||||
struct pl330_req *r;
|
||||
|
||||
rqdone = container_of(pl330->req_done.next,
|
||||
struct _pl330_req, rqd);
|
||||
|
||||
list_del_init(&rqdone->rqd);
|
||||
|
||||
/* Detach the req */
|
||||
r = rqdone->r;
|
||||
rqdone->r = NULL;
|
||||
|
||||
spin_unlock_irqrestore(&pl330->lock, flags);
|
||||
_callback(rqdone->r, PL330_ERR_NONE);
|
||||
_callback(r, PL330_ERR_NONE);
|
||||
spin_lock_irqsave(&pl330->lock, flags);
|
||||
}
|
||||
|
||||
@@ -1509,7 +1502,7 @@ int pl330_chan_ctrl(void *ch_id, enum pl330_chan_op op)
|
||||
struct pl330_thread *thrd = ch_id;
|
||||
struct pl330_dmac *pl330;
|
||||
unsigned long flags;
|
||||
int ret = 0, active;
|
||||
int ret = 0, active = thrd->req_running;
|
||||
|
||||
if (!thrd || thrd->free || thrd->dmac->state == DYING)
|
||||
return -EINVAL;
|
||||
@@ -1525,28 +1518,24 @@ int pl330_chan_ctrl(void *ch_id, enum pl330_chan_op op)
|
||||
|
||||
thrd->req[0].r = NULL;
|
||||
thrd->req[1].r = NULL;
|
||||
MARK_FREE(&thrd->req[0]);
|
||||
MARK_FREE(&thrd->req[1]);
|
||||
mark_free(thrd, 0);
|
||||
mark_free(thrd, 1);
|
||||
break;
|
||||
|
||||
case PL330_OP_ABORT:
|
||||
active = _thrd_active(thrd);
|
||||
|
||||
/* Make sure the channel is stopped */
|
||||
_stop(thrd);
|
||||
|
||||
/* ABORT is only for the active req */
|
||||
if (!active)
|
||||
if (active == -1)
|
||||
break;
|
||||
|
||||
active--;
|
||||
|
||||
thrd->req[active].r = NULL;
|
||||
MARK_FREE(&thrd->req[active]);
|
||||
mark_free(thrd, active);
|
||||
|
||||
/* Start the next */
|
||||
case PL330_OP_START:
|
||||
if (!_thrd_active(thrd) && !_start(thrd))
|
||||
if ((active == -1) && !_start(thrd))
|
||||
ret = -EIO;
|
||||
break;
|
||||
|
||||
@@ -1587,14 +1576,13 @@ int pl330_chan_status(void *ch_id, struct pl330_chanstatus *pstatus)
|
||||
else
|
||||
pstatus->faulting = false;
|
||||
|
||||
active = _thrd_active(thrd);
|
||||
active = thrd->req_running;
|
||||
|
||||
if (!active) {
|
||||
if (active == -1) {
|
||||
/* Indicate that the thread is not running */
|
||||
pstatus->top_req = NULL;
|
||||
pstatus->wait_req = NULL;
|
||||
} else {
|
||||
active--;
|
||||
pstatus->top_req = thrd->req[active].r;
|
||||
pstatus->wait_req = !IS_FREE(&thrd->req[1 - active])
|
||||
? thrd->req[1 - active].r : NULL;
|
||||
@@ -1659,9 +1647,9 @@ void *pl330_request_channel(const struct pl330_info *pi)
|
||||
thrd->free = false;
|
||||
thrd->lstenq = 1;
|
||||
thrd->req[0].r = NULL;
|
||||
MARK_FREE(&thrd->req[0]);
|
||||
mark_free(thrd, 0);
|
||||
thrd->req[1].r = NULL;
|
||||
MARK_FREE(&thrd->req[1]);
|
||||
mark_free(thrd, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1767,14 +1755,14 @@ static inline void _reset_thread(struct pl330_thread *thrd)
|
||||
thrd->req[0].mc_bus = pl330->mcode_bus
|
||||
+ (thrd->id * pi->mcbufsz);
|
||||
thrd->req[0].r = NULL;
|
||||
MARK_FREE(&thrd->req[0]);
|
||||
mark_free(thrd, 0);
|
||||
|
||||
thrd->req[1].mc_cpu = thrd->req[0].mc_cpu
|
||||
+ pi->mcbufsz / 2;
|
||||
thrd->req[1].mc_bus = thrd->req[0].mc_bus
|
||||
+ pi->mcbufsz / 2;
|
||||
thrd->req[1].r = NULL;
|
||||
MARK_FREE(&thrd->req[1]);
|
||||
mark_free(thrd, 1);
|
||||
}
|
||||
|
||||
static int dmac_alloc_threads(struct pl330_dmac *pl330)
|
||||
|
||||
@@ -143,7 +143,6 @@ static int sp804_set_next_event(unsigned long next,
|
||||
}
|
||||
|
||||
static struct clock_event_device sp804_clockevent = {
|
||||
.shift = 32,
|
||||
.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
|
||||
.set_mode = sp804_set_mode,
|
||||
.set_next_event = sp804_set_next_event,
|
||||
@@ -169,13 +168,9 @@ void __init sp804_clockevents_init(void __iomem *base, unsigned int irq,
|
||||
|
||||
clkevt_base = base;
|
||||
clkevt_reload = DIV_ROUND_CLOSEST(rate, HZ);
|
||||
|
||||
evt->name = name;
|
||||
evt->irq = irq;
|
||||
evt->mult = div_sc(rate, NSEC_PER_SEC, evt->shift);
|
||||
evt->max_delta_ns = clockevent_delta2ns(0xffffffff, evt);
|
||||
evt->min_delta_ns = clockevent_delta2ns(0xf, evt);
|
||||
|
||||
setup_irq(irq, &sp804_timer_irq);
|
||||
clockevents_register_device(evt);
|
||||
clockevents_config_and_register(evt, rate, 0xf, 0xffffffff);
|
||||
}
|
||||
|
||||
+118
-30
@@ -19,17 +19,22 @@
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <linux/export.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/irqdomain.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/amba/bus.h>
|
||||
|
||||
#include <asm/exception.h>
|
||||
#include <asm/mach/irq.h>
|
||||
#include <asm/hardware/vic.h>
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
/**
|
||||
* struct vic_device - VIC PM device
|
||||
* @irq: The IRQ number for the base of the VIC.
|
||||
@@ -40,6 +45,7 @@
|
||||
* @int_enable: Save for VIC_INT_ENABLE.
|
||||
* @soft_int: Save for VIC_INT_SOFT.
|
||||
* @protect: Save for VIC_PROTECT.
|
||||
* @domain: The IRQ domain for the VIC.
|
||||
*/
|
||||
struct vic_device {
|
||||
void __iomem *base;
|
||||
@@ -50,13 +56,13 @@ struct vic_device {
|
||||
u32 int_enable;
|
||||
u32 soft_int;
|
||||
u32 protect;
|
||||
struct irq_domain domain;
|
||||
};
|
||||
|
||||
/* we cannot allocate memory when VICs are initially registered */
|
||||
static struct vic_device vic_devices[CONFIG_ARM_VIC_NR];
|
||||
|
||||
static int vic_id;
|
||||
#endif /* CONFIG_PM */
|
||||
|
||||
/**
|
||||
* vic_init2 - common initialisation code
|
||||
@@ -156,39 +162,50 @@ static int __init vic_pm_init(void)
|
||||
return 0;
|
||||
}
|
||||
late_initcall(vic_pm_init);
|
||||
#endif /* CONFIG_PM */
|
||||
|
||||
/**
|
||||
* vic_pm_register - Register a VIC for later power management control
|
||||
* vic_register() - Register a VIC.
|
||||
* @base: The base address of the VIC.
|
||||
* @irq: The base IRQ for the VIC.
|
||||
* @resume_sources: bitmask of interrupts allowed for resume sources.
|
||||
* @node: The device tree node associated with the VIC.
|
||||
*
|
||||
* Register the VIC with the system device tree so that it can be notified
|
||||
* of suspend and resume requests and ensure that the correct actions are
|
||||
* taken to re-instate the settings on resume.
|
||||
*
|
||||
* This also configures the IRQ domain for the VIC.
|
||||
*/
|
||||
static void __init vic_pm_register(void __iomem *base, unsigned int irq, u32 resume_sources)
|
||||
static void __init vic_register(void __iomem *base, unsigned int irq,
|
||||
u32 resume_sources, struct device_node *node)
|
||||
{
|
||||
struct vic_device *v;
|
||||
|
||||
if (vic_id >= ARRAY_SIZE(vic_devices))
|
||||
if (vic_id >= ARRAY_SIZE(vic_devices)) {
|
||||
printk(KERN_ERR "%s: too few VICs, increase CONFIG_ARM_VIC_NR\n", __func__);
|
||||
else {
|
||||
v = &vic_devices[vic_id];
|
||||
v->base = base;
|
||||
v->resume_sources = resume_sources;
|
||||
v->irq = irq;
|
||||
vic_id++;
|
||||
return;
|
||||
}
|
||||
|
||||
v = &vic_devices[vic_id];
|
||||
v->base = base;
|
||||
v->resume_sources = resume_sources;
|
||||
v->irq = irq;
|
||||
vic_id++;
|
||||
|
||||
v->domain.irq_base = irq;
|
||||
v->domain.nr_irq = 32;
|
||||
#ifdef CONFIG_OF_IRQ
|
||||
v->domain.of_node = of_node_get(node);
|
||||
#endif /* CONFIG_OF */
|
||||
v->domain.ops = &irq_domain_simple_ops;
|
||||
irq_domain_add(&v->domain);
|
||||
}
|
||||
#else
|
||||
static inline void vic_pm_register(void __iomem *base, unsigned int irq, u32 arg1) { }
|
||||
#endif /* CONFIG_PM */
|
||||
|
||||
static void vic_ack_irq(struct irq_data *d)
|
||||
{
|
||||
void __iomem *base = irq_data_get_irq_chip_data(d);
|
||||
unsigned int irq = d->irq & 31;
|
||||
unsigned int irq = d->hwirq;
|
||||
writel(1 << irq, base + VIC_INT_ENABLE_CLEAR);
|
||||
/* moreover, clear the soft-triggered, in case it was the reason */
|
||||
writel(1 << irq, base + VIC_INT_SOFT_CLEAR);
|
||||
@@ -197,14 +214,14 @@ static void vic_ack_irq(struct irq_data *d)
|
||||
static void vic_mask_irq(struct irq_data *d)
|
||||
{
|
||||
void __iomem *base = irq_data_get_irq_chip_data(d);
|
||||
unsigned int irq = d->irq & 31;
|
||||
unsigned int irq = d->hwirq;
|
||||
writel(1 << irq, base + VIC_INT_ENABLE_CLEAR);
|
||||
}
|
||||
|
||||
static void vic_unmask_irq(struct irq_data *d)
|
||||
{
|
||||
void __iomem *base = irq_data_get_irq_chip_data(d);
|
||||
unsigned int irq = d->irq & 31;
|
||||
unsigned int irq = d->hwirq;
|
||||
writel(1 << irq, base + VIC_INT_ENABLE);
|
||||
}
|
||||
|
||||
@@ -226,7 +243,7 @@ static struct vic_device *vic_from_irq(unsigned int irq)
|
||||
static int vic_set_wake(struct irq_data *d, unsigned int on)
|
||||
{
|
||||
struct vic_device *v = vic_from_irq(d->irq);
|
||||
unsigned int off = d->irq & 31;
|
||||
unsigned int off = d->hwirq;
|
||||
u32 bit = 1 << off;
|
||||
|
||||
if (!v)
|
||||
@@ -301,7 +318,7 @@ static void __init vic_set_irq_sources(void __iomem *base,
|
||||
* and 020 within the page. We call this "second block".
|
||||
*/
|
||||
static void __init vic_init_st(void __iomem *base, unsigned int irq_start,
|
||||
u32 vic_sources)
|
||||
u32 vic_sources, struct device_node *node)
|
||||
{
|
||||
unsigned int i;
|
||||
int vic_2nd_block = ((unsigned long)base & ~PAGE_MASK) != 0;
|
||||
@@ -328,17 +345,12 @@ static void __init vic_init_st(void __iomem *base, unsigned int irq_start,
|
||||
}
|
||||
|
||||
vic_set_irq_sources(base, irq_start, vic_sources);
|
||||
vic_register(base, irq_start, 0, node);
|
||||
}
|
||||
|
||||
/**
|
||||
* vic_init - initialise a vectored interrupt controller
|
||||
* @base: iomem base address
|
||||
* @irq_start: starting interrupt number, must be muliple of 32
|
||||
* @vic_sources: bitmask of interrupt sources to allow
|
||||
* @resume_sources: bitmask of interrupt sources to allow for resume
|
||||
*/
|
||||
void __init vic_init(void __iomem *base, unsigned int irq_start,
|
||||
u32 vic_sources, u32 resume_sources)
|
||||
static void __init __vic_init(void __iomem *base, unsigned int irq_start,
|
||||
u32 vic_sources, u32 resume_sources,
|
||||
struct device_node *node)
|
||||
{
|
||||
unsigned int i;
|
||||
u32 cellid = 0;
|
||||
@@ -356,7 +368,7 @@ void __init vic_init(void __iomem *base, unsigned int irq_start,
|
||||
|
||||
switch(vendor) {
|
||||
case AMBA_VENDOR_ST:
|
||||
vic_init_st(base, irq_start, vic_sources);
|
||||
vic_init_st(base, irq_start, vic_sources, node);
|
||||
return;
|
||||
default:
|
||||
printk(KERN_WARNING "VIC: unknown vendor, continuing anyways\n");
|
||||
@@ -375,5 +387,81 @@ void __init vic_init(void __iomem *base, unsigned int irq_start,
|
||||
|
||||
vic_set_irq_sources(base, irq_start, vic_sources);
|
||||
|
||||
vic_pm_register(base, irq_start, resume_sources);
|
||||
vic_register(base, irq_start, resume_sources, node);
|
||||
}
|
||||
|
||||
/**
|
||||
* vic_init() - initialise a vectored interrupt controller
|
||||
* @base: iomem base address
|
||||
* @irq_start: starting interrupt number, must be muliple of 32
|
||||
* @vic_sources: bitmask of interrupt sources to allow
|
||||
* @resume_sources: bitmask of interrupt sources to allow for resume
|
||||
*/
|
||||
void __init vic_init(void __iomem *base, unsigned int irq_start,
|
||||
u32 vic_sources, u32 resume_sources)
|
||||
{
|
||||
__vic_init(base, irq_start, vic_sources, resume_sources, NULL);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
int __init vic_of_init(struct device_node *node, struct device_node *parent)
|
||||
{
|
||||
void __iomem *regs;
|
||||
int irq_base;
|
||||
|
||||
if (WARN(parent, "non-root VICs are not supported"))
|
||||
return -EINVAL;
|
||||
|
||||
regs = of_iomap(node, 0);
|
||||
if (WARN_ON(!regs))
|
||||
return -EIO;
|
||||
|
||||
irq_base = irq_alloc_descs(-1, 0, 32, numa_node_id());
|
||||
if (WARN_ON(irq_base < 0))
|
||||
goto out_unmap;
|
||||
|
||||
__vic_init(regs, irq_base, ~0, ~0, node);
|
||||
|
||||
return 0;
|
||||
|
||||
out_unmap:
|
||||
iounmap(regs);
|
||||
|
||||
return -EIO;
|
||||
}
|
||||
#endif /* CONFIG OF */
|
||||
|
||||
/*
|
||||
* Handle each interrupt in a single VIC. Returns non-zero if we've
|
||||
* handled at least one interrupt. This does a single read of the
|
||||
* status register and handles all interrupts in order from LSB first.
|
||||
*/
|
||||
static int handle_one_vic(struct vic_device *vic, struct pt_regs *regs)
|
||||
{
|
||||
u32 stat, irq;
|
||||
int handled = 0;
|
||||
|
||||
stat = readl_relaxed(vic->base + VIC_IRQ_STATUS);
|
||||
while (stat) {
|
||||
irq = ffs(stat) - 1;
|
||||
handle_IRQ(irq_domain_to_irq(&vic->domain, irq), regs);
|
||||
stat &= ~(1 << irq);
|
||||
handled = 1;
|
||||
}
|
||||
|
||||
return handled;
|
||||
}
|
||||
|
||||
/*
|
||||
* Keep iterating over all registered VIC's until there are no pending
|
||||
* interrupts.
|
||||
*/
|
||||
asmlinkage void __exception_irq_entry vic_handle_irq(struct pt_regs *regs)
|
||||
{
|
||||
int i, handled;
|
||||
|
||||
do {
|
||||
for (i = 0, handled = 0; i < vic_id; ++i)
|
||||
handled |= handle_one_vic(&vic_devices[i], regs);
|
||||
} while (handled);
|
||||
}
|
||||
|
||||
@@ -18,9 +18,10 @@ CONFIG_ARCH_MXC=y
|
||||
CONFIG_ARCH_IMX_V4_V5=y
|
||||
CONFIG_ARCH_MX1ADS=y
|
||||
CONFIG_MACH_SCB9328=y
|
||||
CONFIG_MACH_APF9328=y
|
||||
CONFIG_MACH_MX21ADS=y
|
||||
CONFIG_MACH_MX25_3DS=y
|
||||
CONFIG_MACH_EUKREA_CPUIMX25=y
|
||||
CONFIG_MACH_EUKREA_CPUIMX25SD=y
|
||||
CONFIG_MACH_MX27ADS=y
|
||||
CONFIG_MACH_PCM038=y
|
||||
CONFIG_MACH_CPUIMX27=y
|
||||
@@ -72,17 +73,16 @@ CONFIG_MTD_CFI_GEOMETRY=y
|
||||
CONFIG_MTD_CFI_INTELEXT=y
|
||||
CONFIG_MTD_PHYSMAP=y
|
||||
CONFIG_MTD_NAND=y
|
||||
CONFIG_MTD_NAND_MXC=y
|
||||
CONFIG_MTD_UBI=y
|
||||
CONFIG_MISC_DEVICES=y
|
||||
CONFIG_EEPROM_AT24=y
|
||||
CONFIG_EEPROM_AT25=y
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_SMC91X=y
|
||||
CONFIG_DM9000=y
|
||||
CONFIG_SMC91X=y
|
||||
CONFIG_SMC911X=y
|
||||
# CONFIG_NETDEV_1000 is not set
|
||||
# CONFIG_NETDEV_10000 is not set
|
||||
CONFIG_SMSC_PHY=y
|
||||
# CONFIG_INPUT_MOUSEDEV is not set
|
||||
CONFIG_INPUT_EVDEV=y
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
@@ -100,6 +100,7 @@ CONFIG_I2C_CHARDEV=y
|
||||
CONFIG_I2C_IMX=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_IMX=y
|
||||
CONFIG_SPI_SPIDEV=y
|
||||
CONFIG_W1=y
|
||||
CONFIG_W1_MASTER_MXC=y
|
||||
CONFIG_W1_SLAVE_THERM=y
|
||||
@@ -139,6 +140,7 @@ CONFIG_MMC=y
|
||||
CONFIG_MMC_MXC=y
|
||||
CONFIG_NEW_LEDS=y
|
||||
CONFIG_LEDS_CLASS=y
|
||||
CONFIG_LEDS_GPIO=y
|
||||
CONFIG_LEDS_MC13783=y
|
||||
CONFIG_LEDS_TRIGGERS=y
|
||||
CONFIG_LEDS_TRIGGER_TIMER=y
|
||||
|
||||
@@ -1,175 +0,0 @@
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_CROSS_COMPILE="/opt/arm-2010q1/bin/arm-none-linux-gnueabi-"
|
||||
# CONFIG_LOCALVERSION_AUTO is not set
|
||||
# CONFIG_SWAP is not set
|
||||
CONFIG_SYSVIPC=y
|
||||
CONFIG_POSIX_MQUEUE=y
|
||||
CONFIG_TREE_PREEMPT_RCU=y
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
CONFIG_NAMESPACES=y
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_EXPERT=y
|
||||
# CONFIG_SYSCTL_SYSCALL is not set
|
||||
# CONFIG_KALLSYMS is not set
|
||||
# CONFIG_VM_EVENT_COUNTERS is not set
|
||||
# CONFIG_COMPAT_BRK is not set
|
||||
CONFIG_SLAB=y
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
# CONFIG_LBDAF is not set
|
||||
# CONFIG_BLK_DEV_BSG is not set
|
||||
CONFIG_DEFAULT_DEADLINE=y
|
||||
CONFIG_ARCH_AT91=y
|
||||
CONFIG_ARCH_AT91SAM9G20=y
|
||||
CONFIG_MACH_PCONTROL_G20=y
|
||||
CONFIG_AT91_PROGRAMMABLE_CLOCKS=y
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
CONFIG_PREEMPT=y
|
||||
CONFIG_AEABI=y
|
||||
# CONFIG_OABI_COMPAT is not set
|
||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||
CONFIG_CMDLINE="console=ttyS0,115200 mem=128M mtdparts=atmel_nand:128k(bootstrap)ro,256k(uboot)ro,128k(env1)ro,128k(env2)ro,2M(linux),-(root) root=/dev/mmcblk0p1 rootwait rw"
|
||||
CONFIG_VFP=y
|
||||
CONFIG_BINFMT_MISC=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_INET=y
|
||||
# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
|
||||
# CONFIG_INET_XFRM_MODE_TUNNEL is not set
|
||||
# CONFIG_INET_XFRM_MODE_BEET is not set
|
||||
# CONFIG_INET_LRO is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
CONFIG_VLAN_8021Q=y
|
||||
# CONFIG_WIRELESS is not set
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
# CONFIG_FW_LOADER is not set
|
||||
CONFIG_MTD=y
|
||||
CONFIG_MTD_PARTITIONS=y
|
||||
CONFIG_MTD_CMDLINE_PARTS=y
|
||||
CONFIG_MTD_CHAR=y
|
||||
CONFIG_MTD_BLOCK=y
|
||||
CONFIG_MTD_COMPLEX_MAPPINGS=y
|
||||
CONFIG_MTD_PHRAM=m
|
||||
CONFIG_MTD_NAND=y
|
||||
CONFIG_MTD_NAND_ATMEL=y
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_SIZE=8192
|
||||
CONFIG_ATMEL_TCLIB=y
|
||||
CONFIG_EEPROM_AT24=m
|
||||
CONFIG_SCSI=m
|
||||
# CONFIG_SCSI_PROC_FS is not set
|
||||
CONFIG_BLK_DEV_SD=m
|
||||
CONFIG_SCSI_MULTI_LUN=y
|
||||
# CONFIG_SCSI_LOWLEVEL is not set
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_MACVLAN=m
|
||||
CONFIG_TUN=m
|
||||
CONFIG_SMSC_PHY=m
|
||||
CONFIG_BROADCOM_PHY=m
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_MII=y
|
||||
CONFIG_MACB=y
|
||||
CONFIG_SMSC911X=m
|
||||
# CONFIG_NETDEV_1000 is not set
|
||||
# CONFIG_NETDEV_10000 is not set
|
||||
# CONFIG_WLAN is not set
|
||||
CONFIG_PPP=m
|
||||
CONFIG_PPP_ASYNC=m
|
||||
CONFIG_PPP_DEFLATE=m
|
||||
CONFIG_PPP_MPPE=m
|
||||
CONFIG_INPUT_POLLDEV=y
|
||||
CONFIG_INPUT_SPARSEKMAP=y
|
||||
# CONFIG_INPUT_MOUSEDEV is not set
|
||||
CONFIG_INPUT_EVDEV=m
|
||||
CONFIG_INPUT_EVBUG=m
|
||||
# CONFIG_KEYBOARD_ATKBD is not set
|
||||
CONFIG_KEYBOARD_GPIO=m
|
||||
CONFIG_KEYBOARD_MATRIX=m
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
CONFIG_INPUT_TOUCHSCREEN=y
|
||||
CONFIG_INPUT_MISC=y
|
||||
CONFIG_INPUT_UINPUT=m
|
||||
CONFIG_INPUT_GPIO_ROTARY_ENCODER=m
|
||||
# CONFIG_SERIO is not set
|
||||
# CONFIG_DEVKMEM is not set
|
||||
CONFIG_SERIAL_ATMEL=y
|
||||
CONFIG_SERIAL_ATMEL_CONSOLE=y
|
||||
CONFIG_SERIAL_MAX3100=m
|
||||
# CONFIG_LEGACY_PTYS is not set
|
||||
# CONFIG_HW_RANDOM is not set
|
||||
CONFIG_R3964=m
|
||||
CONFIG_I2C=m
|
||||
CONFIG_I2C_CHARDEV=m
|
||||
# CONFIG_I2C_HELPER_AUTO is not set
|
||||
CONFIG_I2C_GPIO=m
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_ATMEL=m
|
||||
CONFIG_SPI_SPIDEV=m
|
||||
CONFIG_GPIO_SYSFS=y
|
||||
CONFIG_W1=m
|
||||
CONFIG_W1_MASTER_GPIO=m
|
||||
CONFIG_W1_SLAVE_DS2431=m
|
||||
# CONFIG_HWMON is not set
|
||||
CONFIG_WATCHDOG=y
|
||||
CONFIG_AT91SAM9X_WATCHDOG=y
|
||||
# CONFIG_MFD_SUPPORT is not set
|
||||
# CONFIG_HID_SUPPORT is not set
|
||||
CONFIG_USB=y
|
||||
# CONFIG_USB_DEVICE_CLASS is not set
|
||||
CONFIG_USB_OHCI_HCD=y
|
||||
CONFIG_USB_STORAGE=m
|
||||
CONFIG_USB_LIBUSUAL=y
|
||||
CONFIG_USB_SERIAL=m
|
||||
CONFIG_USB_SERIAL_GENERIC=y
|
||||
CONFIG_USB_SERIAL_FTDI_SIO=m
|
||||
CONFIG_USB_SERIAL_PL2303=m
|
||||
CONFIG_USB_GADGET=y
|
||||
CONFIG_USB_ZERO=m
|
||||
CONFIG_USB_ETH=m
|
||||
CONFIG_USB_FILE_STORAGE=m
|
||||
CONFIG_USB_G_SERIAL=m
|
||||
CONFIG_USB_G_HID=m
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_UNSAFE_RESUME=y
|
||||
CONFIG_MMC_ATMELMCI=y
|
||||
CONFIG_NEW_LEDS=y
|
||||
CONFIG_LEDS_CLASS=y
|
||||
CONFIG_LEDS_GPIO=y
|
||||
CONFIG_LEDS_TRIGGERS=y
|
||||
CONFIG_LEDS_TRIGGER_TIMER=y
|
||||
CONFIG_LEDS_TRIGGER_HEARTBEAT=y
|
||||
CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
|
||||
CONFIG_RTC_CLASS=y
|
||||
CONFIG_RTC_DRV_AT91SAM9=y
|
||||
CONFIG_AUXDISPLAY=y
|
||||
CONFIG_UIO=y
|
||||
CONFIG_UIO_PDRV=y
|
||||
CONFIG_STAGING=y
|
||||
# CONFIG_STAGING_EXCLUDE_BUILD is not set
|
||||
CONFIG_IIO=y
|
||||
CONFIG_EXT2_FS=y
|
||||
CONFIG_EXT3_FS=y
|
||||
# CONFIG_EXT3_FS_XATTR is not set
|
||||
CONFIG_VFAT_FS=y
|
||||
CONFIG_TMPFS=y
|
||||
CONFIG_JFFS2_FS=y
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
CONFIG_NFS_V4=y
|
||||
CONFIG_PARTITION_ADVANCED=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_CODEPAGE_850=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
CONFIG_NLS_ISO8859_15=y
|
||||
CONFIG_NLS_UTF8=y
|
||||
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
|
||||
CONFIG_CRYPTO=y
|
||||
CONFIG_CRYPTO_ANSI_CPRNG=y
|
||||
# CONFIG_CRYPTO_HW is not set
|
||||
CONFIG_CRC_CCITT=y
|
||||
@@ -186,6 +186,17 @@
|
||||
#define ALT_UP_B(label) b label
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Instruction barrier
|
||||
*/
|
||||
.macro instr_sync
|
||||
#if __LINUX_ARM_ARCH__ >= 7
|
||||
isb
|
||||
#elif __LINUX_ARM_ARCH__ == 6
|
||||
mcr p15, 0, r0, c7, c5, 4
|
||||
#endif
|
||||
.endm
|
||||
|
||||
/*
|
||||
* SMP data memory barrier
|
||||
*/
|
||||
|
||||
@@ -32,7 +32,6 @@
|
||||
|
||||
#define __BUG(__file, __line, __value) \
|
||||
do { \
|
||||
BUILD_BUG_ON(sizeof(struct bug_entry) != 12); \
|
||||
asm volatile("1:\t" BUG_INSTR_TYPE #__value "\n" \
|
||||
".pushsection .rodata.str, \"aMS\", %progbits, 1\n" \
|
||||
"2:\t.asciz " #__file "\n" \
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user