Merge branch 'timers/posix-cpu-timers-for-tglx' of
git://git.kernel.org/pub/scm/linux/kernel/git/frederic/linux-dynticks into timers/core Frederic sayed: "Most of these patches have been hanging around for several month now, in -mmotm for a significant chunk. They already missed a few releases." Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
Коммит
2b0f89317e
|
@ -1,18 +1,27 @@
|
||||||
<title>Codec Interface</title>
|
<title>Codec Interface</title>
|
||||||
|
|
||||||
<note>
|
|
||||||
<title>Suspended</title>
|
|
||||||
|
|
||||||
<para>This interface has been be suspended from the V4L2 API
|
|
||||||
implemented in Linux 2.6 until we have more experience with codec
|
|
||||||
device interfaces.</para>
|
|
||||||
</note>
|
|
||||||
|
|
||||||
<para>A V4L2 codec can compress, decompress, transform, or otherwise
|
<para>A V4L2 codec can compress, decompress, transform, or otherwise
|
||||||
convert video data from one format into another format, in memory.
|
convert video data from one format into another format, in memory. Typically
|
||||||
Applications send data to be converted to the driver through a
|
such devices are memory-to-memory devices (i.e. devices with the
|
||||||
&func-write; call, and receive the converted data through a
|
<constant>V4L2_CAP_VIDEO_M2M</constant> or <constant>V4L2_CAP_VIDEO_M2M_MPLANE</constant>
|
||||||
&func-read; call. For efficiency a driver may also support streaming
|
capability set).
|
||||||
I/O.</para>
|
</para>
|
||||||
|
|
||||||
<para>[to do]</para>
|
<para>A memory-to-memory video node acts just like a normal video node, but it
|
||||||
|
supports both output (sending frames from memory to the codec hardware) and
|
||||||
|
capture (receiving the processed frames from the codec hardware into memory)
|
||||||
|
stream I/O. An application will have to setup the stream
|
||||||
|
I/O for both sides and finally call &VIDIOC-STREAMON; for both capture and output
|
||||||
|
to start the codec.</para>
|
||||||
|
|
||||||
|
<para>Video compression codecs use the MPEG controls to setup their codec parameters
|
||||||
|
(note that the MPEG controls actually support many more codecs than just MPEG).
|
||||||
|
See <xref linkend="mpeg-controls"></xref>.</para>
|
||||||
|
|
||||||
|
<para>Memory-to-memory devices can often be used as a shared resource: you can
|
||||||
|
open the video node multiple times, each application setting up their own codec properties
|
||||||
|
that are local to the file handle, and each can use it independently from the others.
|
||||||
|
The driver will arbitrate access to the codec and reprogram it whenever another file
|
||||||
|
handler gets access. This is different from the usual video node behavior where the video properties
|
||||||
|
are global to the device (i.e. changing something through one file handle is visible
|
||||||
|
through another file handle).</para>
|
||||||
|
|
|
@ -493,7 +493,7 @@ and discussions on the V4L mailing list.</revremark>
|
||||||
</partinfo>
|
</partinfo>
|
||||||
|
|
||||||
<title>Video for Linux Two API Specification</title>
|
<title>Video for Linux Two API Specification</title>
|
||||||
<subtitle>Revision 3.9</subtitle>
|
<subtitle>Revision 3.10</subtitle>
|
||||||
|
|
||||||
<chapter id="common">
|
<chapter id="common">
|
||||||
&sub-common;
|
&sub-common;
|
||||||
|
|
|
@ -319,7 +319,10 @@ cache<0..n>
|
||||||
Symlink to each of the cache devices comprising this cache set.
|
Symlink to each of the cache devices comprising this cache set.
|
||||||
|
|
||||||
cache_available_percent
|
cache_available_percent
|
||||||
Percentage of cache device free.
|
Percentage of cache device which doesn't contain dirty data, and could
|
||||||
|
potentially be used for writeback. This doesn't mean this space isn't used
|
||||||
|
for clean cached data; the unused statistic (in priority_stats) is typically
|
||||||
|
much lower.
|
||||||
|
|
||||||
clear_stats
|
clear_stats
|
||||||
Clears the statistics associated with this cache
|
Clears the statistics associated with this cache
|
||||||
|
@ -423,8 +426,11 @@ nbuckets
|
||||||
Total buckets in this cache
|
Total buckets in this cache
|
||||||
|
|
||||||
priority_stats
|
priority_stats
|
||||||
Statistics about how recently data in the cache has been accessed. This can
|
Statistics about how recently data in the cache has been accessed.
|
||||||
reveal your working set size.
|
This can reveal your working set size. Unused is the percentage of
|
||||||
|
the cache that doesn't contain any data. Metadata is bcache's
|
||||||
|
metadata overhead. Average is the average priority of cache buckets.
|
||||||
|
Next is a list of quantiles with the priority threshold of each.
|
||||||
|
|
||||||
written
|
written
|
||||||
Sum of all data that has been written to the cache; comparison with
|
Sum of all data that has been written to the cache; comparison with
|
||||||
|
|
|
@ -498,12 +498,8 @@ Your cooperation is appreciated.
|
||||||
|
|
||||||
Each device type has 5 bits (32 minors).
|
Each device type has 5 bits (32 minors).
|
||||||
|
|
||||||
13 block 8-bit MFM/RLL/IDE controller
|
13 block Previously used for the XT disk (/dev/xdN)
|
||||||
0 = /dev/xda First XT disk whole disk
|
Deleted in kernel v3.9.
|
||||||
64 = /dev/xdb Second XT disk whole disk
|
|
||||||
|
|
||||||
Partitions are handled in the same way as IDE disks
|
|
||||||
(see major number 3).
|
|
||||||
|
|
||||||
14 char Open Sound System (OSS)
|
14 char Open Sound System (OSS)
|
||||||
0 = /dev/mixer Mixer control
|
0 = /dev/mixer Mixer control
|
||||||
|
|
|
@ -2,7 +2,7 @@ Exynos4x12/Exynos5 SoC series camera host interface (FIMC-LITE)
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
|
|
||||||
- compatible : should be "samsung,exynos4212-fimc" for Exynos4212 and
|
- compatible : should be "samsung,exynos4212-fimc-lite" for Exynos4212 and
|
||||||
Exynos4412 SoCs;
|
Exynos4412 SoCs;
|
||||||
- reg : physical base address and size of the device memory mapped
|
- reg : physical base address and size of the device memory mapped
|
||||||
registers;
|
registers;
|
||||||
|
|
|
@ -4,7 +4,7 @@ Required properties:
|
||||||
- compatible: Should be "cdns,[<chip>-]{macb|gem}"
|
- compatible: Should be "cdns,[<chip>-]{macb|gem}"
|
||||||
Use "cdns,at91sam9260-macb" Atmel at91sam9260 and at91sam9263 SoCs.
|
Use "cdns,at91sam9260-macb" Atmel at91sam9260 and at91sam9263 SoCs.
|
||||||
Use "cdns,at32ap7000-macb" for other 10/100 usage or use the generic form: "cdns,macb".
|
Use "cdns,at32ap7000-macb" for other 10/100 usage or use the generic form: "cdns,macb".
|
||||||
Use "cnds,pc302-gem" for Picochip picoXcell pc302 and later devices based on
|
Use "cdns,pc302-gem" for Picochip picoXcell pc302 and later devices based on
|
||||||
the Cadence GEM, or the generic form: "cdns,gem".
|
the Cadence GEM, or the generic form: "cdns,gem".
|
||||||
- reg: Address and length of the register set for the device
|
- reg: Address and length of the register set for the device
|
||||||
- interrupts: Should contain macb interrupt
|
- interrupts: Should contain macb interrupt
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
Atmel AT91RM9200 Real Time Clock
|
Atmel AT91RM9200 Real Time Clock
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
- compatible: should be: "atmel,at91rm9200-rtc"
|
- compatible: should be: "atmel,at91rm9200-rtc" or "atmel,at91sam9x5-rtc"
|
||||||
- reg: physical base address of the controller and length of memory mapped
|
- reg: physical base address of the controller and length of memory mapped
|
||||||
region.
|
region.
|
||||||
- interrupts: rtc alarm/event interrupt
|
- interrupts: rtc alarm/event interrupt
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
Simple Framebuffer
|
||||||
|
|
||||||
|
A simple frame-buffer describes a raw memory region that may be rendered to,
|
||||||
|
with the assumption that the display hardware has already been set up to scan
|
||||||
|
out from that buffer.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
- compatible: "simple-framebuffer"
|
||||||
|
- reg: Should contain the location and size of the framebuffer memory.
|
||||||
|
- width: The width of the framebuffer in pixels.
|
||||||
|
- height: The height of the framebuffer in pixels.
|
||||||
|
- stride: The number of bytes in each line of the framebuffer.
|
||||||
|
- format: The format of the framebuffer surface. Valid values are:
|
||||||
|
- r5g6b5 (16-bit pixels, d[15:11]=r, d[10:5]=g, d[4:0]=b).
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
framebuffer {
|
||||||
|
compatible = "simple-framebuffer";
|
||||||
|
reg = <0x1d385000 (1600 * 1200 * 2)>;
|
||||||
|
width = <1600>;
|
||||||
|
height = <1200>;
|
||||||
|
stride = <(1600 * 2)>;
|
||||||
|
format = "r5g6b5";
|
||||||
|
};
|
|
@ -191,9 +191,11 @@ Linux it will look something like this:
|
||||||
};
|
};
|
||||||
|
|
||||||
The bootargs property contains the kernel arguments, and the initrd-*
|
The bootargs property contains the kernel arguments, and the initrd-*
|
||||||
properties define the address and size of an initrd blob. The
|
properties define the address and size of an initrd blob. Note that
|
||||||
chosen node may also optionally contain an arbitrary number of
|
initrd-end is the first address after the initrd image, so this doesn't
|
||||||
additional properties for platform-specific configuration data.
|
match the usual semantic of struct resource. The chosen node may also
|
||||||
|
optionally contain an arbitrary number of additional properties for
|
||||||
|
platform-specific configuration data.
|
||||||
|
|
||||||
During early boot, the architecture setup code calls of_scan_flat_dt()
|
During early boot, the architecture setup code calls of_scan_flat_dt()
|
||||||
several times with different helper callbacks to parse device tree
|
several times with different helper callbacks to parse device tree
|
||||||
|
|
|
@ -34,7 +34,7 @@ command:
|
||||||
After a while you will start to get messages about current status or error like
|
After a while you will start to get messages about current status or error like
|
||||||
in the original code.
|
in the original code.
|
||||||
|
|
||||||
Note that running a new test will stop any in progress test.
|
Note that running a new test will not stop any in progress test.
|
||||||
|
|
||||||
The following command should return actual state of the test.
|
The following command should return actual state of the test.
|
||||||
% cat /sys/kernel/debug/dmatest/run
|
% cat /sys/kernel/debug/dmatest/run
|
||||||
|
@ -52,8 +52,8 @@ To wait for test done the user may perform a busy loop that checks the state.
|
||||||
|
|
||||||
The module parameters that is supplied to the kernel command line will be used
|
The module parameters that is supplied to the kernel command line will be used
|
||||||
for the first performed test. After user gets a control, the test could be
|
for the first performed test. After user gets a control, the test could be
|
||||||
interrupted or re-run with same or different parameters. For the details see
|
re-run with the same or different parameters. For the details see the above
|
||||||
the above section "Part 2 - When dmatest is built as a module..."
|
section "Part 2 - When dmatest is built as a module..."
|
||||||
|
|
||||||
In both cases the module parameters are used as initial values for the test case.
|
In both cases the module parameters are used as initial values for the test case.
|
||||||
You always could check them at run-time by running
|
You always could check them at run-time by running
|
||||||
|
|
|
@ -33,6 +33,9 @@ When mounting an XFS filesystem, the following options are accepted.
|
||||||
removing extended attributes) the on-disk superblock feature
|
removing extended attributes) the on-disk superblock feature
|
||||||
bit field will be updated to reflect this format being in use.
|
bit field will be updated to reflect this format being in use.
|
||||||
|
|
||||||
|
CRC enabled filesystems always use the attr2 format, and so
|
||||||
|
will reject the noattr2 mount option if it is set.
|
||||||
|
|
||||||
barrier
|
barrier
|
||||||
Enables the use of block layer write barriers for writes into
|
Enables the use of block layer write barriers for writes into
|
||||||
the journal and unwritten extent conversion. This allows for
|
the journal and unwritten extent conversion. This allows for
|
||||||
|
|
|
@ -3005,6 +3005,27 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
||||||
Force threading of all interrupt handlers except those
|
Force threading of all interrupt handlers except those
|
||||||
marked explicitly IRQF_NO_THREAD.
|
marked explicitly IRQF_NO_THREAD.
|
||||||
|
|
||||||
|
tmem [KNL,XEN]
|
||||||
|
Enable the Transcendent memory driver if built-in.
|
||||||
|
|
||||||
|
tmem.cleancache=0|1 [KNL, XEN]
|
||||||
|
Default is on (1). Disable the usage of the cleancache
|
||||||
|
API to send anonymous pages to the hypervisor.
|
||||||
|
|
||||||
|
tmem.frontswap=0|1 [KNL, XEN]
|
||||||
|
Default is on (1). Disable the usage of the frontswap
|
||||||
|
API to send swap pages to the hypervisor. If disabled
|
||||||
|
the selfballooning and selfshrinking are force disabled.
|
||||||
|
|
||||||
|
tmem.selfballooning=0|1 [KNL, XEN]
|
||||||
|
Default is on (1). Disable the driving of swap pages
|
||||||
|
to the hypervisor.
|
||||||
|
|
||||||
|
tmem.selfshrinking=0|1 [KNL, XEN]
|
||||||
|
Default is on (1). Partial swapoff that immediately
|
||||||
|
transfers pages from Xen hypervisor back to the
|
||||||
|
kernel based on different criteria.
|
||||||
|
|
||||||
topology= [S390]
|
topology= [S390]
|
||||||
Format: {off | on}
|
Format: {off | on}
|
||||||
Specify if the kernel should make use of the cpu
|
Specify if the kernel should make use of the cpu
|
||||||
|
@ -3330,9 +3351,6 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
||||||
plus one apbt timer for broadcast timer.
|
plus one apbt timer for broadcast timer.
|
||||||
x86_mrst_timer=apbt_only | lapic_and_apbt
|
x86_mrst_timer=apbt_only | lapic_and_apbt
|
||||||
|
|
||||||
xd= [HW,XT] Original XT pre-IDE (RLL encoded) disks.
|
|
||||||
xd_geo= See header of drivers/block/xd.c.
|
|
||||||
|
|
||||||
xen_emul_unplug= [HW,X86,XEN]
|
xen_emul_unplug= [HW,X86,XEN]
|
||||||
Unplug Xen emulated devices
|
Unplug Xen emulated devices
|
||||||
Format: [unplug0,][unplug1]
|
Format: [unplug0,][unplug1]
|
||||||
|
|
|
@ -80,8 +80,6 @@ Valid names are:
|
||||||
/dev/sdd: -> 0x0830 (forth SCSI disk)
|
/dev/sdd: -> 0x0830 (forth SCSI disk)
|
||||||
/dev/sde: -> 0x0840 (fifth SCSI disk)
|
/dev/sde: -> 0x0840 (fifth SCSI disk)
|
||||||
/dev/fd : -> 0x0200 (floppy disk)
|
/dev/fd : -> 0x0200 (floppy disk)
|
||||||
/dev/xda: -> 0x0c00 (first XT disk, unused in Linux/m68k)
|
|
||||||
/dev/xdb: -> 0x0c40 (second XT disk, unused in Linux/m68k)
|
|
||||||
|
|
||||||
The name must be followed by a decimal number, that stands for the
|
The name must be followed by a decimal number, that stands for the
|
||||||
partition number. Internally, the value of the number is just
|
partition number. Internally, the value of the number is just
|
||||||
|
|
|
@ -420,10 +420,10 @@ tcp_synack_retries - INTEGER
|
||||||
for a passive TCP connection will happen after 63seconds.
|
for a passive TCP connection will happen after 63seconds.
|
||||||
|
|
||||||
tcp_syncookies - BOOLEAN
|
tcp_syncookies - BOOLEAN
|
||||||
Only valid when the kernel was compiled with CONFIG_SYNCOOKIES
|
Only valid when the kernel was compiled with CONFIG_SYN_COOKIES
|
||||||
Send out syncookies when the syn backlog queue of a socket
|
Send out syncookies when the syn backlog queue of a socket
|
||||||
overflows. This is to prevent against the common 'SYN flood attack'
|
overflows. This is to prevent against the common 'SYN flood attack'
|
||||||
Default: FALSE
|
Default: 1
|
||||||
|
|
||||||
Note, that syncookies is fallback facility.
|
Note, that syncookies is fallback facility.
|
||||||
It MUST NOT be used to help highly loaded servers to stand
|
It MUST NOT be used to help highly loaded servers to stand
|
||||||
|
|
|
@ -268,7 +268,7 @@ situations.
|
||||||
System Power Management Phases
|
System Power Management Phases
|
||||||
------------------------------
|
------------------------------
|
||||||
Suspending or resuming the system is done in several phases. Different phases
|
Suspending or resuming the system is done in several phases. Different phases
|
||||||
are used for standby or memory sleep states ("suspend-to-RAM") and the
|
are used for freeze, standby, and memory sleep states ("suspend-to-RAM") and the
|
||||||
hibernation state ("suspend-to-disk"). Each phase involves executing callbacks
|
hibernation state ("suspend-to-disk"). Each phase involves executing callbacks
|
||||||
for every device before the next phase begins. Not all busses or classes
|
for every device before the next phase begins. Not all busses or classes
|
||||||
support all these callbacks and not all drivers use all the callbacks. The
|
support all these callbacks and not all drivers use all the callbacks. The
|
||||||
|
@ -309,7 +309,8 @@ execute the corresponding method from dev->driver->pm instead if there is one.
|
||||||
|
|
||||||
Entering System Suspend
|
Entering System Suspend
|
||||||
-----------------------
|
-----------------------
|
||||||
When the system goes into the standby or memory sleep state, the phases are:
|
When the system goes into the freeze, standby or memory sleep state,
|
||||||
|
the phases are:
|
||||||
|
|
||||||
prepare, suspend, suspend_late, suspend_noirq.
|
prepare, suspend, suspend_late, suspend_noirq.
|
||||||
|
|
||||||
|
@ -368,7 +369,7 @@ the devices that were suspended.
|
||||||
|
|
||||||
Leaving System Suspend
|
Leaving System Suspend
|
||||||
----------------------
|
----------------------
|
||||||
When resuming from standby or memory sleep, the phases are:
|
When resuming from freeze, standby or memory sleep, the phases are:
|
||||||
|
|
||||||
resume_noirq, resume_early, resume, complete.
|
resume_noirq, resume_early, resume, complete.
|
||||||
|
|
||||||
|
@ -433,8 +434,8 @@ the system log.
|
||||||
|
|
||||||
Entering Hibernation
|
Entering Hibernation
|
||||||
--------------------
|
--------------------
|
||||||
Hibernating the system is more complicated than putting it into the standby or
|
Hibernating the system is more complicated than putting it into the other
|
||||||
memory sleep state, because it involves creating and saving a system image.
|
sleep states, because it involves creating and saving a system image.
|
||||||
Therefore there are more phases for hibernation, with a different set of
|
Therefore there are more phases for hibernation, with a different set of
|
||||||
callbacks. These phases always run after tasks have been frozen and memory has
|
callbacks. These phases always run after tasks have been frozen and memory has
|
||||||
been freed.
|
been freed.
|
||||||
|
@ -485,8 +486,8 @@ image forms an atomic snapshot of the system state.
|
||||||
|
|
||||||
At this point the system image is saved, and the devices then need to be
|
At this point the system image is saved, and the devices then need to be
|
||||||
prepared for the upcoming system shutdown. This is much like suspending them
|
prepared for the upcoming system shutdown. This is much like suspending them
|
||||||
before putting the system into the standby or memory sleep state, and the phases
|
before putting the system into the freeze, standby or memory sleep state,
|
||||||
are similar.
|
and the phases are similar.
|
||||||
|
|
||||||
9. The prepare phase is discussed above.
|
9. The prepare phase is discussed above.
|
||||||
|
|
||||||
|
|
|
@ -7,8 +7,8 @@ running. The interface exists in /sys/power/ directory (assuming sysfs
|
||||||
is mounted at /sys).
|
is mounted at /sys).
|
||||||
|
|
||||||
/sys/power/state controls system power state. Reading from this file
|
/sys/power/state controls system power state. Reading from this file
|
||||||
returns what states are supported, which is hard-coded to 'standby'
|
returns what states are supported, which is hard-coded to 'freeze',
|
||||||
(Power-On Suspend), 'mem' (Suspend-to-RAM), and 'disk'
|
'standby' (Power-On Suspend), 'mem' (Suspend-to-RAM), and 'disk'
|
||||||
(Suspend-to-Disk).
|
(Suspend-to-Disk).
|
||||||
|
|
||||||
Writing to this file one of those strings causes the system to
|
Writing to this file one of those strings causes the system to
|
||||||
|
|
|
@ -15,8 +15,10 @@ A suspend/hibernation notifier may be used for this purpose.
|
||||||
The subsystems or drivers having such needs can register suspend notifiers that
|
The subsystems or drivers having such needs can register suspend notifiers that
|
||||||
will be called upon the following events by the PM core:
|
will be called upon the following events by the PM core:
|
||||||
|
|
||||||
PM_HIBERNATION_PREPARE The system is going to hibernate or suspend, tasks will
|
PM_HIBERNATION_PREPARE The system is going to hibernate, tasks will be frozen
|
||||||
be frozen immediately.
|
immediately. This is different from PM_SUSPEND_PREPARE
|
||||||
|
below because here we do additional work between notifiers
|
||||||
|
and drivers freezing.
|
||||||
|
|
||||||
PM_POST_HIBERNATION The system memory state has been restored from a
|
PM_POST_HIBERNATION The system memory state has been restored from a
|
||||||
hibernation image or an error occurred during
|
hibernation image or an error occurred during
|
||||||
|
|
|
@ -2,12 +2,26 @@
|
||||||
System Power Management States
|
System Power Management States
|
||||||
|
|
||||||
|
|
||||||
The kernel supports three power management states generically, though
|
The kernel supports four power management states generically, though
|
||||||
each is dependent on platform support code to implement the low-level
|
one is generic and the other three are dependent on platform support
|
||||||
details for each state. This file describes each state, what they are
|
code to implement the low-level details for each state.
|
||||||
|
This file describes each state, what they are
|
||||||
commonly called, what ACPI state they map to, and what string to write
|
commonly called, what ACPI state they map to, and what string to write
|
||||||
to /sys/power/state to enter that state
|
to /sys/power/state to enter that state
|
||||||
|
|
||||||
|
state: Freeze / Low-Power Idle
|
||||||
|
ACPI state: S0
|
||||||
|
String: "freeze"
|
||||||
|
|
||||||
|
This state is a generic, pure software, light-weight, low-power state.
|
||||||
|
It allows more energy to be saved relative to idle by freezing user
|
||||||
|
space and putting all I/O devices into low-power states (possibly
|
||||||
|
lower-power than available at run time), such that the processors can
|
||||||
|
spend more time in their idle states.
|
||||||
|
This state can be used for platforms without Standby/Suspend-to-RAM
|
||||||
|
support, or it can be used in addition to Suspend-to-RAM (memory sleep)
|
||||||
|
to provide reduced resume latency.
|
||||||
|
|
||||||
|
|
||||||
State: Standby / Power-On Suspend
|
State: Standby / Power-On Suspend
|
||||||
ACPI State: S1
|
ACPI State: S1
|
||||||
|
@ -22,9 +36,6 @@ We try to put devices in a low-power state equivalent to D1, which
|
||||||
also offers low power savings, but low resume latency. Not all devices
|
also offers low power savings, but low resume latency. Not all devices
|
||||||
support D1, and those that don't are left on.
|
support D1, and those that don't are left on.
|
||||||
|
|
||||||
A transition from Standby to the On state should take about 1-2
|
|
||||||
seconds.
|
|
||||||
|
|
||||||
|
|
||||||
State: Suspend-to-RAM
|
State: Suspend-to-RAM
|
||||||
ACPI State: S3
|
ACPI State: S3
|
||||||
|
@ -42,9 +53,6 @@ transition back to the On state.
|
||||||
For at least ACPI, STR requires some minimal boot-strapping code to
|
For at least ACPI, STR requires some minimal boot-strapping code to
|
||||||
resume the system from STR. This may be true on other platforms.
|
resume the system from STR. This may be true on other platforms.
|
||||||
|
|
||||||
A transition from Suspend-to-RAM to the On state should take about
|
|
||||||
3-5 seconds.
|
|
||||||
|
|
||||||
|
|
||||||
State: Suspend-to-disk
|
State: Suspend-to-disk
|
||||||
ACPI State: S4
|
ACPI State: S4
|
||||||
|
@ -74,7 +82,3 @@ low-power state (like ACPI S4), or it may simply power down. Powering
|
||||||
down offers greater savings, and allows this mechanism to work on any
|
down offers greater savings, and allows this mechanism to work on any
|
||||||
system. However, entering a real low-power state allows the user to
|
system. However, entering a real low-power state allows the user to
|
||||||
trigger wake up events (e.g. pressing a key or opening a laptop lid).
|
trigger wake up events (e.g. pressing a key or opening a laptop lid).
|
||||||
|
|
||||||
A transition from Suspend-to-Disk to the On state should take about 30
|
|
||||||
seconds, though it's typically a bit more with the current
|
|
||||||
implementation.
|
|
||||||
|
|
|
@ -147,6 +147,25 @@ Example signal handler:
|
||||||
fix_the_problem(ucp->dar);
|
fix_the_problem(ucp->dar);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
When in an active transaction that takes a signal, we need to be careful with
|
||||||
|
the stack. It's possible that the stack has moved back up after the tbegin.
|
||||||
|
The obvious case here is when the tbegin is called inside a function that
|
||||||
|
returns before a tend. In this case, the stack is part of the checkpointed
|
||||||
|
transactional memory state. If we write over this non transactionally or in
|
||||||
|
suspend, we are in trouble because if we get a tm abort, the program counter and
|
||||||
|
stack pointer will be back at the tbegin but our in memory stack won't be valid
|
||||||
|
anymore.
|
||||||
|
|
||||||
|
To avoid this, when taking a signal in an active transaction, we need to use
|
||||||
|
the stack pointer from the checkpointed state, rather than the speculated
|
||||||
|
state. This ensures that the signal context (written tm suspended) will be
|
||||||
|
written below the stack required for the rollback. The transaction is aborted
|
||||||
|
becuase of the treclaim, so any memory written between the tbegin and the
|
||||||
|
signal will be rolled back anyway.
|
||||||
|
|
||||||
|
For signals taken in non-TM or suspended mode, we use the
|
||||||
|
normal/non-checkpointed stack pointer.
|
||||||
|
|
||||||
|
|
||||||
Failure cause codes used by kernel
|
Failure cause codes used by kernel
|
||||||
==================================
|
==================================
|
||||||
|
@ -155,14 +174,18 @@ These are defined in <asm/reg.h>, and distinguish different reasons why the
|
||||||
kernel aborted a transaction:
|
kernel aborted a transaction:
|
||||||
|
|
||||||
TM_CAUSE_RESCHED Thread was rescheduled.
|
TM_CAUSE_RESCHED Thread was rescheduled.
|
||||||
|
TM_CAUSE_TLBI Software TLB invalide.
|
||||||
TM_CAUSE_FAC_UNAV FP/VEC/VSX unavailable trap.
|
TM_CAUSE_FAC_UNAV FP/VEC/VSX unavailable trap.
|
||||||
TM_CAUSE_SYSCALL Currently unused; future syscalls that must abort
|
TM_CAUSE_SYSCALL Currently unused; future syscalls that must abort
|
||||||
transactions for consistency will use this.
|
transactions for consistency will use this.
|
||||||
TM_CAUSE_SIGNAL Signal delivered.
|
TM_CAUSE_SIGNAL Signal delivered.
|
||||||
TM_CAUSE_MISC Currently unused.
|
TM_CAUSE_MISC Currently unused.
|
||||||
|
TM_CAUSE_ALIGNMENT Alignment fault.
|
||||||
|
TM_CAUSE_EMULATE Emulation that touched memory.
|
||||||
|
|
||||||
These can be checked by the user program's abort handler as TEXASR[0:7].
|
These can be checked by the user program's abort handler as TEXASR[0:7]. If
|
||||||
|
bit 7 is set, it indicates that the error is consider persistent. For example
|
||||||
|
a TM_CAUSE_ALIGNMENT will be persistent while a TM_CAUSE_RESCHED will not.q
|
||||||
|
|
||||||
GDB
|
GDB
|
||||||
===
|
===
|
||||||
|
|
|
@ -79,20 +79,63 @@ master port that is used to communicate with devices within the network.
|
||||||
In order to initialize the RapidIO subsystem, a platform must initialize and
|
In order to initialize the RapidIO subsystem, a platform must initialize and
|
||||||
register at least one master port within the RapidIO network. To register mport
|
register at least one master port within the RapidIO network. To register mport
|
||||||
within the subsystem controller driver initialization code calls function
|
within the subsystem controller driver initialization code calls function
|
||||||
rio_register_mport() for each available master port. After all active master
|
rio_register_mport() for each available master port.
|
||||||
ports are registered with a RapidIO subsystem, the rio_init_mports() routine
|
|
||||||
is called to perform enumeration and discovery.
|
|
||||||
|
|
||||||
In the current PowerPC-based implementation a subsys_initcall() is specified to
|
RapidIO subsystem uses subsys_initcall() or device_initcall() to perform
|
||||||
perform controller initialization and mport registration. At the end it directly
|
controller initialization (depending on controller device type).
|
||||||
calls rio_init_mports() to execute RapidIO enumeration and discovery.
|
|
||||||
|
After all active master ports are registered with a RapidIO subsystem,
|
||||||
|
an enumeration and/or discovery routine may be called automatically or
|
||||||
|
by user-space command.
|
||||||
|
|
||||||
4. Enumeration and Discovery
|
4. Enumeration and Discovery
|
||||||
----------------------------
|
----------------------------
|
||||||
|
|
||||||
When rio_init_mports() is called it scans a list of registered master ports and
|
4.1 Overview
|
||||||
calls an enumeration or discovery routine depending on the configured role of a
|
------------
|
||||||
master port: host or agent.
|
|
||||||
|
RapidIO subsystem configuration options allow users to specify enumeration and
|
||||||
|
discovery methods as statically linked components or loadable modules.
|
||||||
|
An enumeration/discovery method implementation and available input parameters
|
||||||
|
define how any given method can be attached to available RapidIO mports:
|
||||||
|
simply to all available mports OR individually to the specified mport device.
|
||||||
|
|
||||||
|
Depending on selected enumeration/discovery build configuration, there are
|
||||||
|
several methods to initiate an enumeration and/or discovery process:
|
||||||
|
|
||||||
|
(a) Statically linked enumeration and discovery process can be started
|
||||||
|
automatically during kernel initialization time using corresponding module
|
||||||
|
parameters. This was the original method used since introduction of RapidIO
|
||||||
|
subsystem. Now this method relies on enumerator module parameter which is
|
||||||
|
'rio-scan.scan' for existing basic enumeration/discovery method.
|
||||||
|
When automatic start of enumeration/discovery is used a user has to ensure
|
||||||
|
that all discovering endpoints are started before the enumerating endpoint
|
||||||
|
and are waiting for enumeration to be completed.
|
||||||
|
Configuration option CONFIG_RAPIDIO_DISC_TIMEOUT defines time that discovering
|
||||||
|
endpoint waits for enumeration to be completed. If the specified timeout
|
||||||
|
expires the discovery process is terminated without obtaining RapidIO network
|
||||||
|
information. NOTE: a timed out discovery process may be restarted later using
|
||||||
|
a user-space command as it is described later if the given endpoint was
|
||||||
|
enumerated successfully.
|
||||||
|
|
||||||
|
(b) Statically linked enumeration and discovery process can be started by
|
||||||
|
a command from user space. This initiation method provides more flexibility
|
||||||
|
for a system startup compared to the option (a) above. After all participating
|
||||||
|
endpoints have been successfully booted, an enumeration process shall be
|
||||||
|
started first by issuing a user-space command, after an enumeration is
|
||||||
|
completed a discovery process can be started on all remaining endpoints.
|
||||||
|
|
||||||
|
(c) Modular enumeration and discovery process can be started by a command from
|
||||||
|
user space. After an enumeration/discovery module is loaded, a network scan
|
||||||
|
process can be started by issuing a user-space command.
|
||||||
|
Similar to the option (b) above, an enumerator has to be started first.
|
||||||
|
|
||||||
|
(d) Modular enumeration and discovery process can be started by a module
|
||||||
|
initialization routine. In this case an enumerating module shall be loaded
|
||||||
|
first.
|
||||||
|
|
||||||
|
When a network scan process is started it calls an enumeration or discovery
|
||||||
|
routine depending on the configured role of a master port: host or agent.
|
||||||
|
|
||||||
Enumeration is performed by a master port if it is configured as a host port by
|
Enumeration is performed by a master port if it is configured as a host port by
|
||||||
assigning a host device ID greater than or equal to zero. A host device ID is
|
assigning a host device ID greater than or equal to zero. A host device ID is
|
||||||
|
@ -104,8 +147,58 @@ for it.
|
||||||
The enumeration and discovery routines use RapidIO maintenance transactions
|
The enumeration and discovery routines use RapidIO maintenance transactions
|
||||||
to access the configuration space of devices.
|
to access the configuration space of devices.
|
||||||
|
|
||||||
The enumeration process is implemented according to the enumeration algorithm
|
4.2 Automatic Start of Enumeration and Discovery
|
||||||
outlined in the RapidIO Interconnect Specification: Annex I [1].
|
------------------------------------------------
|
||||||
|
|
||||||
|
Automatic enumeration/discovery start method is applicable only to built-in
|
||||||
|
enumeration/discovery RapidIO configuration selection. To enable automatic
|
||||||
|
enumeration/discovery start by existing basic enumerator method set use boot
|
||||||
|
command line parameter "rio-scan.scan=1".
|
||||||
|
|
||||||
|
This configuration requires synchronized start of all RapidIO endpoints that
|
||||||
|
form a network which will be enumerated/discovered. Discovering endpoints have
|
||||||
|
to be started before an enumeration starts to ensure that all RapidIO
|
||||||
|
controllers have been initialized and are ready to be discovered. Configuration
|
||||||
|
parameter CONFIG_RAPIDIO_DISC_TIMEOUT defines time (in seconds) which
|
||||||
|
a discovering endpoint will wait for enumeration to be completed.
|
||||||
|
|
||||||
|
When automatic enumeration/discovery start is selected, basic method's
|
||||||
|
initialization routine calls rio_init_mports() to perform enumeration or
|
||||||
|
discovery for all known mport devices.
|
||||||
|
|
||||||
|
Depending on RapidIO network size and configuration this automatic
|
||||||
|
enumeration/discovery start method may be difficult to use due to the
|
||||||
|
requirement for synchronized start of all endpoints.
|
||||||
|
|
||||||
|
4.3 User-space Start of Enumeration and Discovery
|
||||||
|
-------------------------------------------------
|
||||||
|
|
||||||
|
User-space start of enumeration and discovery can be used with built-in and
|
||||||
|
modular build configurations. For user-space controlled start RapidIO subsystem
|
||||||
|
creates the sysfs write-only attribute file '/sys/bus/rapidio/scan'. To initiate
|
||||||
|
an enumeration or discovery process on specific mport device, a user needs to
|
||||||
|
write mport_ID (not RapidIO destination ID) into that file. The mport_ID is a
|
||||||
|
sequential number (0 ... RIO_MAX_MPORTS) assigned during mport device
|
||||||
|
registration. For example for machine with single RapidIO controller, mport_ID
|
||||||
|
for that controller always will be 0.
|
||||||
|
|
||||||
|
To initiate RapidIO enumeration/discovery on all available mports a user may
|
||||||
|
write '-1' (or RIO_MPORT_ANY) into the scan attribute file.
|
||||||
|
|
||||||
|
4.4 Basic Enumeration Method
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
This is an original enumeration/discovery method which is available since
|
||||||
|
first release of RapidIO subsystem code. The enumeration process is
|
||||||
|
implemented according to the enumeration algorithm outlined in the RapidIO
|
||||||
|
Interconnect Specification: Annex I [1].
|
||||||
|
|
||||||
|
This method can be configured as statically linked or loadable module.
|
||||||
|
The method's single parameter "scan" allows to trigger the enumeration/discovery
|
||||||
|
process from module initialization routine.
|
||||||
|
|
||||||
|
This enumeration/discovery method can be started only once and does not support
|
||||||
|
unloading if it is built as a module.
|
||||||
|
|
||||||
The enumeration process traverses the network using a recursive depth-first
|
The enumeration process traverses the network using a recursive depth-first
|
||||||
algorithm. When a new device is found, the enumerator takes ownership of that
|
algorithm. When a new device is found, the enumerator takes ownership of that
|
||||||
|
@ -160,6 +253,19 @@ time period. If this wait time period expires before enumeration is completed,
|
||||||
an agent skips RapidIO discovery and continues with remaining kernel
|
an agent skips RapidIO discovery and continues with remaining kernel
|
||||||
initialization.
|
initialization.
|
||||||
|
|
||||||
|
4.5 Adding New Enumeration/Discovery Method
|
||||||
|
-------------------------------------------
|
||||||
|
|
||||||
|
RapidIO subsystem code organization allows addition of new enumeration/discovery
|
||||||
|
methods as new configuration options without significant impact to to the core
|
||||||
|
RapidIO code.
|
||||||
|
|
||||||
|
A new enumeration/discovery method has to be attached to one or more mport
|
||||||
|
devices before an enumeration/discovery process can be started. Normally,
|
||||||
|
method's module initialization routine calls rio_register_scan() to attach
|
||||||
|
an enumerator to a specified mport device (or devices). The basic enumerator
|
||||||
|
implementation demonstrates this process.
|
||||||
|
|
||||||
5. References
|
5. References
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
|
|
|
@ -88,3 +88,20 @@ that exports additional attributes.
|
||||||
|
|
||||||
IDT_GEN2:
|
IDT_GEN2:
|
||||||
errlog - reads contents of device error log until it is empty.
|
errlog - reads contents of device error log until it is empty.
|
||||||
|
|
||||||
|
|
||||||
|
5. RapidIO Bus Attributes
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
RapidIO bus subdirectory /sys/bus/rapidio implements the following bus-specific
|
||||||
|
attribute:
|
||||||
|
|
||||||
|
scan - allows to trigger enumeration discovery process from user space. This
|
||||||
|
is a write-only attribute. To initiate an enumeration or discovery
|
||||||
|
process on specific mport device, a user needs to write mport_ID (not
|
||||||
|
RapidIO destination ID) into this file. The mport_ID is a sequential
|
||||||
|
number (0 ... RIO_MAX_MPORTS) assigned to the mport device.
|
||||||
|
For example, for a machine with a single RapidIO controller, mport_ID
|
||||||
|
for that controller always will be 0.
|
||||||
|
To initiate RapidIO enumeration/discovery on all available mports
|
||||||
|
a user must write '-1' (or RIO_MPORT_ANY) into this attribute file.
|
||||||
|
|
|
@ -29,6 +29,8 @@ ALC269/270/275/276/280/282
|
||||||
alc271-dmic Enable ALC271X digital mic workaround
|
alc271-dmic Enable ALC271X digital mic workaround
|
||||||
inv-dmic Inverted internal mic workaround
|
inv-dmic Inverted internal mic workaround
|
||||||
lenovo-dock Enables docking station I/O for some Lenovos
|
lenovo-dock Enables docking station I/O for some Lenovos
|
||||||
|
dell-headset-multi Headset jack, which can also be used as mic-in
|
||||||
|
dell-headset-dock Headset jack (without mic-in), and also dock I/O
|
||||||
|
|
||||||
ALC662/663/272
|
ALC662/663/272
|
||||||
==============
|
==============
|
||||||
|
@ -42,6 +44,7 @@ ALC662/663/272
|
||||||
asus-mode7 ASUS
|
asus-mode7 ASUS
|
||||||
asus-mode8 ASUS
|
asus-mode8 ASUS
|
||||||
inv-dmic Inverted internal mic workaround
|
inv-dmic Inverted internal mic workaround
|
||||||
|
dell-headset-multi Headset jack, which can also be used as mic-in
|
||||||
|
|
||||||
ALC680
|
ALC680
|
||||||
======
|
======
|
||||||
|
|
77
MAINTAINERS
77
MAINTAINERS
|
@ -2890,8 +2890,8 @@ F: drivers/media/dvb-frontends/ec100*
|
||||||
|
|
||||||
ECRYPT FILE SYSTEM
|
ECRYPT FILE SYSTEM
|
||||||
M: Tyler Hicks <tyhicks@canonical.com>
|
M: Tyler Hicks <tyhicks@canonical.com>
|
||||||
M: Dustin Kirkland <dustin.kirkland@gazzang.com>
|
|
||||||
L: ecryptfs@vger.kernel.org
|
L: ecryptfs@vger.kernel.org
|
||||||
|
W: http://ecryptfs.org
|
||||||
W: https://launchpad.net/ecryptfs
|
W: https://launchpad.net/ecryptfs
|
||||||
S: Supported
|
S: Supported
|
||||||
F: Documentation/filesystems/ecryptfs.txt
|
F: Documentation/filesystems/ecryptfs.txt
|
||||||
|
@ -3220,7 +3220,7 @@ F: lib/fault-inject.c
|
||||||
|
|
||||||
FCOE SUBSYSTEM (libfc, libfcoe, fcoe)
|
FCOE SUBSYSTEM (libfc, libfcoe, fcoe)
|
||||||
M: Robert Love <robert.w.love@intel.com>
|
M: Robert Love <robert.w.love@intel.com>
|
||||||
L: devel@open-fcoe.org
|
L: fcoe-devel@open-fcoe.org
|
||||||
W: www.Open-FCoE.org
|
W: www.Open-FCoE.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/scsi/libfc/
|
F: drivers/scsi/libfc/
|
||||||
|
@ -3322,11 +3322,12 @@ F: drivers/net/wan/dlci.c
|
||||||
F: drivers/net/wan/sdla.c
|
F: drivers/net/wan/sdla.c
|
||||||
|
|
||||||
FRAMEBUFFER LAYER
|
FRAMEBUFFER LAYER
|
||||||
M: Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
|
M: Jean-Christophe Plagniol-Villard <plagnioj@jcrosoft.com>
|
||||||
|
M: Tomi Valkeinen <tomi.valkeinen@ti.com>
|
||||||
L: linux-fbdev@vger.kernel.org
|
L: linux-fbdev@vger.kernel.org
|
||||||
W: http://linux-fbdev.sourceforge.net/
|
W: http://linux-fbdev.sourceforge.net/
|
||||||
Q: http://patchwork.kernel.org/project/linux-fbdev/list/
|
Q: http://patchwork.kernel.org/project/linux-fbdev/list/
|
||||||
T: git git://github.com/schandinat/linux-2.6.git fbdev-next
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/plagnioj/linux-fbdev.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/fb/
|
F: Documentation/fb/
|
||||||
F: Documentation/devicetree/bindings/fb/
|
F: Documentation/devicetree/bindings/fb/
|
||||||
|
@ -3865,9 +3866,16 @@ M: K. Y. Srinivasan <kys@microsoft.com>
|
||||||
M: Haiyang Zhang <haiyangz@microsoft.com>
|
M: Haiyang Zhang <haiyangz@microsoft.com>
|
||||||
L: devel@linuxdriverproject.org
|
L: devel@linuxdriverproject.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/hv/
|
F: arch/x86/include/asm/mshyperv.h
|
||||||
|
F: arch/x86/include/uapi/asm/hyperv.h
|
||||||
|
F: arch/x86/kernel/cpu/mshyperv.c
|
||||||
F: drivers/hid/hid-hyperv.c
|
F: drivers/hid/hid-hyperv.c
|
||||||
|
F: drivers/hv/
|
||||||
F: drivers/net/hyperv/
|
F: drivers/net/hyperv/
|
||||||
|
F: drivers/scsi/storvsc_drv.c
|
||||||
|
F: drivers/video/hyperv_fb.c
|
||||||
|
F: include/linux/hyperv.h
|
||||||
|
F: tools/hv/
|
||||||
|
|
||||||
I2C OVER PARALLEL PORT
|
I2C OVER PARALLEL PORT
|
||||||
M: Jean Delvare <khali@linux-fr.org>
|
M: Jean Delvare <khali@linux-fr.org>
|
||||||
|
@ -4440,6 +4448,16 @@ S: Maintained
|
||||||
F: drivers/scsi/*iscsi*
|
F: drivers/scsi/*iscsi*
|
||||||
F: include/scsi/*iscsi*
|
F: include/scsi/*iscsi*
|
||||||
|
|
||||||
|
ISCSI EXTENSIONS FOR RDMA (ISER) INITIATOR
|
||||||
|
M: Or Gerlitz <ogerlitz@mellanox.com>
|
||||||
|
M: Roi Dayan <roid@mellanox.com>
|
||||||
|
L: linux-rdma@vger.kernel.org
|
||||||
|
S: Supported
|
||||||
|
W: http://www.openfabrics.org
|
||||||
|
W: www.open-iscsi.org
|
||||||
|
Q: http://patchwork.kernel.org/project/linux-rdma/list/
|
||||||
|
F: drivers/infiniband/ulp/iser
|
||||||
|
|
||||||
ISDN SUBSYSTEM
|
ISDN SUBSYSTEM
|
||||||
M: Karsten Keil <isdn@linux-pingi.de>
|
M: Karsten Keil <isdn@linux-pingi.de>
|
||||||
L: isdn4linux@listserv.isdn4linux.de (subscribers-only)
|
L: isdn4linux@listserv.isdn4linux.de (subscribers-only)
|
||||||
|
@ -4641,12 +4659,13 @@ F: include/linux/sunrpc/
|
||||||
F: include/uapi/linux/sunrpc/
|
F: include/uapi/linux/sunrpc/
|
||||||
|
|
||||||
KERNEL VIRTUAL MACHINE (KVM)
|
KERNEL VIRTUAL MACHINE (KVM)
|
||||||
M: Marcelo Tosatti <mtosatti@redhat.com>
|
|
||||||
M: Gleb Natapov <gleb@redhat.com>
|
M: Gleb Natapov <gleb@redhat.com>
|
||||||
|
M: Paolo Bonzini <pbonzini@redhat.com>
|
||||||
L: kvm@vger.kernel.org
|
L: kvm@vger.kernel.org
|
||||||
W: http://kvm.qumranet.com
|
W: http://linux-kvm.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: Documentation/*/kvm.txt
|
F: Documentation/*/kvm*.txt
|
||||||
|
F: Documentation/virtual/kvm/
|
||||||
F: arch/*/kvm/
|
F: arch/*/kvm/
|
||||||
F: arch/*/include/asm/kvm*
|
F: arch/*/include/asm/kvm*
|
||||||
F: include/linux/kvm*
|
F: include/linux/kvm*
|
||||||
|
@ -4976,6 +4995,13 @@ S: Maintained
|
||||||
F: Documentation/hwmon/lm90
|
F: Documentation/hwmon/lm90
|
||||||
F: drivers/hwmon/lm90.c
|
F: drivers/hwmon/lm90.c
|
||||||
|
|
||||||
|
LM95234 HARDWARE MONITOR DRIVER
|
||||||
|
M: Guenter Roeck <linux@roeck-us.net>
|
||||||
|
L: lm-sensors@lm-sensors.org
|
||||||
|
S: Maintained
|
||||||
|
F: Documentation/hwmon/lm95234
|
||||||
|
F: drivers/hwmon/lm95234.c
|
||||||
|
|
||||||
LME2510 MEDIA DRIVER
|
LME2510 MEDIA DRIVER
|
||||||
M: Malcolm Priestley <tvboxspy@gmail.com>
|
M: Malcolm Priestley <tvboxspy@gmail.com>
|
||||||
L: linux-media@vger.kernel.org
|
L: linux-media@vger.kernel.org
|
||||||
|
@ -5509,18 +5535,18 @@ F: Documentation/networking/s2io.txt
|
||||||
F: Documentation/networking/vxge.txt
|
F: Documentation/networking/vxge.txt
|
||||||
F: drivers/net/ethernet/neterion/
|
F: drivers/net/ethernet/neterion/
|
||||||
|
|
||||||
NETFILTER/IPTABLES/IPCHAINS
|
NETFILTER/IPTABLES
|
||||||
P: Harald Welte
|
|
||||||
P: Jozsef Kadlecsik
|
|
||||||
M: Pablo Neira Ayuso <pablo@netfilter.org>
|
M: Pablo Neira Ayuso <pablo@netfilter.org>
|
||||||
M: Patrick McHardy <kaber@trash.net>
|
M: Patrick McHardy <kaber@trash.net>
|
||||||
|
M: Jozsef Kadlecsik <kadlec@blackhole.kfki.hu>
|
||||||
L: netfilter-devel@vger.kernel.org
|
L: netfilter-devel@vger.kernel.org
|
||||||
L: netfilter@vger.kernel.org
|
L: netfilter@vger.kernel.org
|
||||||
L: coreteam@netfilter.org
|
L: coreteam@netfilter.org
|
||||||
W: http://www.netfilter.org/
|
W: http://www.netfilter.org/
|
||||||
W: http://www.iptables.org/
|
W: http://www.iptables.org/
|
||||||
T: git git://1984.lsi.us.es/nf
|
Q: http://patchwork.ozlabs.org/project/netfilter-devel/list/
|
||||||
T: git git://1984.lsi.us.es/nf-next
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf.git
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf-next.git
|
||||||
S: Supported
|
S: Supported
|
||||||
F: include/linux/netfilter*
|
F: include/linux/netfilter*
|
||||||
F: include/linux/netfilter/
|
F: include/linux/netfilter/
|
||||||
|
@ -5740,7 +5766,7 @@ M: Matthew Wilcox <willy@linux.intel.com>
|
||||||
L: linux-nvme@lists.infradead.org
|
L: linux-nvme@lists.infradead.org
|
||||||
T: git git://git.infradead.org/users/willy/linux-nvme.git
|
T: git git://git.infradead.org/users/willy/linux-nvme.git
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/block/nvme.c
|
F: drivers/block/nvme*
|
||||||
F: include/linux/nvme.h
|
F: include/linux/nvme.h
|
||||||
|
|
||||||
OMAP SUPPORT
|
OMAP SUPPORT
|
||||||
|
@ -6069,9 +6095,18 @@ L: linux-parisc@vger.kernel.org
|
||||||
W: http://www.parisc-linux.org/
|
W: http://www.parisc-linux.org/
|
||||||
Q: http://patchwork.kernel.org/project/linux-parisc/list/
|
Q: http://patchwork.kernel.org/project/linux-parisc/list/
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jejb/parisc-2.6.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jejb/parisc-2.6.git
|
||||||
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/deller/parisc-linux.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/parisc/
|
F: arch/parisc/
|
||||||
|
F: Documentation/parisc/
|
||||||
F: drivers/parisc/
|
F: drivers/parisc/
|
||||||
|
F: drivers/char/agp/parisc-agp.c
|
||||||
|
F: drivers/input/serio/gscps2.c
|
||||||
|
F: drivers/parport/parport_gsc.*
|
||||||
|
F: drivers/tty/serial/8250/8250_gsc.c
|
||||||
|
F: drivers/video/sti*
|
||||||
|
F: drivers/video/console/sti*
|
||||||
|
F: drivers/video/logo/logo_parisc*
|
||||||
|
|
||||||
PC87360 HARDWARE MONITORING DRIVER
|
PC87360 HARDWARE MONITORING DRIVER
|
||||||
M: Jim Cromie <jim.cromie@gmail.com>
|
M: Jim Cromie <jim.cromie@gmail.com>
|
||||||
|
@ -7589,7 +7624,7 @@ F: drivers/clk/spear/
|
||||||
SPI SUBSYSTEM
|
SPI SUBSYSTEM
|
||||||
M: Mark Brown <broonie@kernel.org>
|
M: Mark Brown <broonie@kernel.org>
|
||||||
M: Grant Likely <grant.likely@linaro.org>
|
M: Grant Likely <grant.likely@linaro.org>
|
||||||
L: spi-devel-general@lists.sourceforge.net
|
L: linux-spi@vger.kernel.org
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi.git
|
||||||
Q: http://patchwork.kernel.org/project/spi-devel-general/list/
|
Q: http://patchwork.kernel.org/project/spi-devel-general/list/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -7854,7 +7889,7 @@ L: linux-scsi@vger.kernel.org
|
||||||
L: target-devel@vger.kernel.org
|
L: target-devel@vger.kernel.org
|
||||||
L: http://groups.google.com/group/linux-iscsi-target-dev
|
L: http://groups.google.com/group/linux-iscsi-target-dev
|
||||||
W: http://www.linux-iscsi.org
|
W: http://www.linux-iscsi.org
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/nab/lio-core.git master
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending.git master
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/target/
|
F: drivers/target/
|
||||||
F: include/target/
|
F: include/target/
|
||||||
|
@ -8182,6 +8217,13 @@ F: drivers/mmc/host/sh_mobile_sdhi.c
|
||||||
F: include/linux/mmc/tmio.h
|
F: include/linux/mmc/tmio.h
|
||||||
F: include/linux/mmc/sh_mobile_sdhi.h
|
F: include/linux/mmc/sh_mobile_sdhi.h
|
||||||
|
|
||||||
|
TMP401 HARDWARE MONITOR DRIVER
|
||||||
|
M: Guenter Roeck <linux@roeck-us.net>
|
||||||
|
L: lm-sensors@lm-sensors.org
|
||||||
|
S: Maintained
|
||||||
|
F: Documentation/hwmon/tmp401
|
||||||
|
F: drivers/hwmon/tmp401.c
|
||||||
|
|
||||||
TMPFS (SHMEM FILESYSTEM)
|
TMPFS (SHMEM FILESYSTEM)
|
||||||
M: Hugh Dickins <hughd@google.com>
|
M: Hugh Dickins <hughd@google.com>
|
||||||
L: linux-mm@kvack.org
|
L: linux-mm@kvack.org
|
||||||
|
@ -8962,7 +9004,7 @@ S: Maintained
|
||||||
F: drivers/net/wireless/wl3501*
|
F: drivers/net/wireless/wl3501*
|
||||||
|
|
||||||
WM97XX TOUCHSCREEN DRIVERS
|
WM97XX TOUCHSCREEN DRIVERS
|
||||||
M: Mark Brown <broonie@opensource.wolfsonmicro.com>
|
M: Mark Brown <broonie@kernel.org>
|
||||||
M: Liam Girdwood <lrg@slimlogic.co.uk>
|
M: Liam Girdwood <lrg@slimlogic.co.uk>
|
||||||
L: linux-input@vger.kernel.org
|
L: linux-input@vger.kernel.org
|
||||||
T: git git://opensource.wolfsonmicro.com/linux-2.6-touch
|
T: git git://opensource.wolfsonmicro.com/linux-2.6-touch
|
||||||
|
@ -8972,7 +9014,6 @@ F: drivers/input/touchscreen/*wm97*
|
||||||
F: include/linux/wm97xx.h
|
F: include/linux/wm97xx.h
|
||||||
|
|
||||||
WOLFSON MICROELECTRONICS DRIVERS
|
WOLFSON MICROELECTRONICS DRIVERS
|
||||||
M: Mark Brown <broonie@opensource.wolfsonmicro.com>
|
|
||||||
L: patches@opensource.wolfsonmicro.com
|
L: patches@opensource.wolfsonmicro.com
|
||||||
T: git git://opensource.wolfsonmicro.com/linux-2.6-asoc
|
T: git git://opensource.wolfsonmicro.com/linux-2.6-asoc
|
||||||
T: git git://opensource.wolfsonmicro.com/linux-2.6-audioplus
|
T: git git://opensource.wolfsonmicro.com/linux-2.6-audioplus
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
||||||
VERSION = 3
|
VERSION = 3
|
||||||
PATCHLEVEL = 10
|
PATCHLEVEL = 10
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc1
|
EXTRAVERSION =
|
||||||
NAME = Unicycling Gorilla
|
NAME = Unicycling Gorilla
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
|
|
||||||
soc100 {
|
soc100 {
|
||||||
uart@FF100000 {
|
uart@FF100000 {
|
||||||
pinctrl-names = "abilis,simple-default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&pctl_uart0>;
|
pinctrl-0 = <&pctl_uart0>;
|
||||||
};
|
};
|
||||||
ethernet@FE100000 {
|
ethernet@FE100000 {
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
|
|
||||||
soc100 {
|
soc100 {
|
||||||
uart@FF100000 {
|
uart@FF100000 {
|
||||||
pinctrl-names = "abilis,simple-default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&pctl_uart0>;
|
pinctrl-0 = <&pctl_uart0>;
|
||||||
};
|
};
|
||||||
ethernet@FE100000 {
|
ethernet@FE100000 {
|
||||||
|
|
|
@ -88,8 +88,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
uart@FF100000 {
|
uart@FF100000 {
|
||||||
compatible = "snps,dw-apb-uart",
|
compatible = "snps,dw-apb-uart";
|
||||||
"abilis,simple-pinctrl";
|
|
||||||
reg = <0xFF100000 0x100>;
|
reg = <0xFF100000 0x100>;
|
||||||
clock-frequency = <166666666>;
|
clock-frequency = <166666666>;
|
||||||
interrupts = <25 1>;
|
interrupts = <25 1>;
|
||||||
|
@ -184,8 +183,7 @@
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
cell-index = <1>;
|
cell-index = <1>;
|
||||||
compatible = "abilis,tb100-spi",
|
compatible = "abilis,tb100-spi";
|
||||||
"abilis,simple-pinctrl";
|
|
||||||
num-cs = <2>;
|
num-cs = <2>;
|
||||||
reg = <0xFE011000 0x20>;
|
reg = <0xFE011000 0x20>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
|
|
|
@ -93,14 +93,16 @@ static inline int cache_is_vipt_aliasing(void)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#define CACHE_COLOR(addr) (((unsigned long)(addr) >> (PAGE_SHIFT)) & 3)
|
#define CACHE_COLOR(addr) (((unsigned long)(addr) >> (PAGE_SHIFT)) & 1)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* checks if two addresses (after page aligning) index into same cache set
|
* checks if two addresses (after page aligning) index into same cache set
|
||||||
*/
|
*/
|
||||||
#define addr_not_cache_congruent(addr1, addr2) \
|
#define addr_not_cache_congruent(addr1, addr2) \
|
||||||
|
({ \
|
||||||
cache_is_vipt_aliasing() ? \
|
cache_is_vipt_aliasing() ? \
|
||||||
(CACHE_COLOR(addr1) != CACHE_COLOR(addr2)) : 0 \
|
(CACHE_COLOR(addr1) != CACHE_COLOR(addr2)) : 0; \
|
||||||
|
})
|
||||||
|
|
||||||
#define copy_to_user_page(vma, page, vaddr, dst, src, len) \
|
#define copy_to_user_page(vma, page, vaddr, dst, src, len) \
|
||||||
do { \
|
do { \
|
||||||
|
|
|
@ -19,13 +19,6 @@
|
||||||
#define clear_page(paddr) memset((paddr), 0, PAGE_SIZE)
|
#define clear_page(paddr) memset((paddr), 0, PAGE_SIZE)
|
||||||
#define copy_page(to, from) memcpy((to), (from), PAGE_SIZE)
|
#define copy_page(to, from) memcpy((to), (from), PAGE_SIZE)
|
||||||
|
|
||||||
#ifndef CONFIG_ARC_CACHE_VIPT_ALIASING
|
|
||||||
|
|
||||||
#define clear_user_page(addr, vaddr, pg) clear_page(addr)
|
|
||||||
#define copy_user_page(vto, vfrom, vaddr, pg) copy_page(vto, vfrom)
|
|
||||||
|
|
||||||
#else /* VIPT aliasing dcache */
|
|
||||||
|
|
||||||
struct vm_area_struct;
|
struct vm_area_struct;
|
||||||
struct page;
|
struct page;
|
||||||
|
|
||||||
|
@ -35,8 +28,6 @@ void copy_user_highpage(struct page *to, struct page *from,
|
||||||
unsigned long u_vaddr, struct vm_area_struct *vma);
|
unsigned long u_vaddr, struct vm_area_struct *vma);
|
||||||
void clear_user_page(void *to, unsigned long u_vaddr, struct page *page);
|
void clear_user_page(void *to, unsigned long u_vaddr, struct page *page);
|
||||||
|
|
||||||
#endif /* CONFIG_ARC_CACHE_VIPT_ALIASING */
|
|
||||||
|
|
||||||
#undef STRICT_MM_TYPECHECKS
|
#undef STRICT_MM_TYPECHECKS
|
||||||
|
|
||||||
#ifdef STRICT_MM_TYPECHECKS
|
#ifdef STRICT_MM_TYPECHECKS
|
||||||
|
|
|
@ -57,9 +57,9 @@
|
||||||
|
|
||||||
#define _PAGE_ACCESSED (1<<1) /* Page is accessed (S) */
|
#define _PAGE_ACCESSED (1<<1) /* Page is accessed (S) */
|
||||||
#define _PAGE_CACHEABLE (1<<2) /* Page is cached (H) */
|
#define _PAGE_CACHEABLE (1<<2) /* Page is cached (H) */
|
||||||
#define _PAGE_EXECUTE (1<<3) /* Page has user execute perm (H) */
|
#define _PAGE_U_EXECUTE (1<<3) /* Page has user execute perm (H) */
|
||||||
#define _PAGE_WRITE (1<<4) /* Page has user write perm (H) */
|
#define _PAGE_U_WRITE (1<<4) /* Page has user write perm (H) */
|
||||||
#define _PAGE_READ (1<<5) /* Page has user read perm (H) */
|
#define _PAGE_U_READ (1<<5) /* Page has user read perm (H) */
|
||||||
#define _PAGE_K_EXECUTE (1<<6) /* Page has kernel execute perm (H) */
|
#define _PAGE_K_EXECUTE (1<<6) /* Page has kernel execute perm (H) */
|
||||||
#define _PAGE_K_WRITE (1<<7) /* Page has kernel write perm (H) */
|
#define _PAGE_K_WRITE (1<<7) /* Page has kernel write perm (H) */
|
||||||
#define _PAGE_K_READ (1<<8) /* Page has kernel perm (H) */
|
#define _PAGE_K_READ (1<<8) /* Page has kernel perm (H) */
|
||||||
|
@ -72,9 +72,9 @@
|
||||||
|
|
||||||
/* PD1 */
|
/* PD1 */
|
||||||
#define _PAGE_CACHEABLE (1<<0) /* Page is cached (H) */
|
#define _PAGE_CACHEABLE (1<<0) /* Page is cached (H) */
|
||||||
#define _PAGE_EXECUTE (1<<1) /* Page has user execute perm (H) */
|
#define _PAGE_U_EXECUTE (1<<1) /* Page has user execute perm (H) */
|
||||||
#define _PAGE_WRITE (1<<2) /* Page has user write perm (H) */
|
#define _PAGE_U_WRITE (1<<2) /* Page has user write perm (H) */
|
||||||
#define _PAGE_READ (1<<3) /* Page has user read perm (H) */
|
#define _PAGE_U_READ (1<<3) /* Page has user read perm (H) */
|
||||||
#define _PAGE_K_EXECUTE (1<<4) /* Page has kernel execute perm (H) */
|
#define _PAGE_K_EXECUTE (1<<4) /* Page has kernel execute perm (H) */
|
||||||
#define _PAGE_K_WRITE (1<<5) /* Page has kernel write perm (H) */
|
#define _PAGE_K_WRITE (1<<5) /* Page has kernel write perm (H) */
|
||||||
#define _PAGE_K_READ (1<<6) /* Page has kernel perm (H) */
|
#define _PAGE_K_READ (1<<6) /* Page has kernel perm (H) */
|
||||||
|
@ -93,7 +93,8 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Kernel allowed all permissions for all pages */
|
/* Kernel allowed all permissions for all pages */
|
||||||
#define _K_PAGE_PERMS (_PAGE_K_EXECUTE | _PAGE_K_WRITE | _PAGE_K_READ)
|
#define _K_PAGE_PERMS (_PAGE_K_EXECUTE | _PAGE_K_WRITE | _PAGE_K_READ | \
|
||||||
|
_PAGE_GLOBAL | _PAGE_PRESENT)
|
||||||
|
|
||||||
#ifdef CONFIG_ARC_CACHE_PAGES
|
#ifdef CONFIG_ARC_CACHE_PAGES
|
||||||
#define _PAGE_DEF_CACHEABLE _PAGE_CACHEABLE
|
#define _PAGE_DEF_CACHEABLE _PAGE_CACHEABLE
|
||||||
|
@ -106,7 +107,11 @@
|
||||||
* -by default cached, unless config otherwise
|
* -by default cached, unless config otherwise
|
||||||
* -present in memory
|
* -present in memory
|
||||||
*/
|
*/
|
||||||
#define ___DEF (_PAGE_PRESENT | _K_PAGE_PERMS | _PAGE_DEF_CACHEABLE)
|
#define ___DEF (_PAGE_PRESENT | _PAGE_DEF_CACHEABLE)
|
||||||
|
|
||||||
|
#define _PAGE_READ (_PAGE_U_READ | _PAGE_K_READ)
|
||||||
|
#define _PAGE_WRITE (_PAGE_U_WRITE | _PAGE_K_WRITE)
|
||||||
|
#define _PAGE_EXECUTE (_PAGE_U_EXECUTE | _PAGE_K_EXECUTE)
|
||||||
|
|
||||||
/* Set of bits not changed in pte_modify */
|
/* Set of bits not changed in pte_modify */
|
||||||
#define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_MODIFIED)
|
#define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_ACCESSED | _PAGE_MODIFIED)
|
||||||
|
@ -125,11 +130,10 @@
|
||||||
* kernel vaddr space - visible in all addr spaces, but kernel mode only
|
* kernel vaddr space - visible in all addr spaces, but kernel mode only
|
||||||
* Thus Global, all-kernel-access, no-user-access, cached
|
* Thus Global, all-kernel-access, no-user-access, cached
|
||||||
*/
|
*/
|
||||||
#define PAGE_KERNEL __pgprot(___DEF | _PAGE_GLOBAL)
|
#define PAGE_KERNEL __pgprot(_K_PAGE_PERMS | _PAGE_DEF_CACHEABLE)
|
||||||
|
|
||||||
/* ioremap */
|
/* ioremap */
|
||||||
#define PAGE_KERNEL_NO_CACHE __pgprot(_PAGE_PRESENT | _K_PAGE_PERMS | \
|
#define PAGE_KERNEL_NO_CACHE __pgprot(_K_PAGE_PERMS)
|
||||||
_PAGE_GLOBAL)
|
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* Mapping of vm_flags (Generic VM) to PTE flags (arch specific)
|
* Mapping of vm_flags (Generic VM) to PTE flags (arch specific)
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
/* Masks for actual TLB "PD"s */
|
/* Masks for actual TLB "PD"s */
|
||||||
#define PTE_BITS_IN_PD0 (_PAGE_GLOBAL | _PAGE_PRESENT)
|
#define PTE_BITS_IN_PD0 (_PAGE_GLOBAL | _PAGE_PRESENT)
|
||||||
#define PTE_BITS_IN_PD1 (PAGE_MASK | _PAGE_CACHEABLE | \
|
#define PTE_BITS_IN_PD1 (PAGE_MASK | _PAGE_CACHEABLE | \
|
||||||
_PAGE_EXECUTE | _PAGE_WRITE | _PAGE_READ | \
|
_PAGE_U_EXECUTE | _PAGE_U_WRITE | _PAGE_U_READ | \
|
||||||
_PAGE_K_EXECUTE | _PAGE_K_WRITE | _PAGE_K_READ)
|
_PAGE_K_EXECUTE | _PAGE_K_WRITE | _PAGE_K_READ)
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
|
@ -610,7 +610,7 @@ void __sync_icache_dcache(unsigned long paddr, unsigned long vaddr, int len)
|
||||||
|
|
||||||
local_irq_save(flags);
|
local_irq_save(flags);
|
||||||
__ic_line_inv_vaddr(paddr, vaddr, len);
|
__ic_line_inv_vaddr(paddr, vaddr, len);
|
||||||
__dc_line_op(paddr, vaddr, len, OP_FLUSH);
|
__dc_line_op(paddr, vaddr, len, OP_FLUSH_N_INV);
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -676,6 +676,17 @@ void flush_cache_range(struct vm_area_struct *vma, unsigned long start,
|
||||||
flush_cache_all();
|
flush_cache_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void flush_anon_page(struct vm_area_struct *vma, struct page *page,
|
||||||
|
unsigned long u_vaddr)
|
||||||
|
{
|
||||||
|
/* TBD: do we really need to clear the kernel mapping */
|
||||||
|
__flush_dcache_page(page_address(page), u_vaddr);
|
||||||
|
__flush_dcache_page(page_address(page), page_address(page));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
void copy_user_highpage(struct page *to, struct page *from,
|
void copy_user_highpage(struct page *to, struct page *from,
|
||||||
unsigned long u_vaddr, struct vm_area_struct *vma)
|
unsigned long u_vaddr, struct vm_area_struct *vma)
|
||||||
{
|
{
|
||||||
|
@ -725,16 +736,6 @@ void clear_user_page(void *to, unsigned long u_vaddr, struct page *page)
|
||||||
set_bit(PG_arch_1, &page->flags);
|
set_bit(PG_arch_1, &page->flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
void flush_anon_page(struct vm_area_struct *vma, struct page *page,
|
|
||||||
unsigned long u_vaddr)
|
|
||||||
{
|
|
||||||
/* TBD: do we really need to clear the kernel mapping */
|
|
||||||
__flush_dcache_page(page_address(page), u_vaddr);
|
|
||||||
__flush_dcache_page(page_address(page), page_address(page));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* Explicit Cache flush request from user space via syscall
|
* Explicit Cache flush request from user space via syscall
|
||||||
|
|
|
@ -444,7 +444,8 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long vaddr_unaligned,
|
||||||
* so userspace sees the right data.
|
* so userspace sees the right data.
|
||||||
* (Avoids the flush for Non-exec + congruent mapping case)
|
* (Avoids the flush for Non-exec + congruent mapping case)
|
||||||
*/
|
*/
|
||||||
if (vma->vm_flags & VM_EXEC || addr_not_cache_congruent(paddr, vaddr)) {
|
if ((vma->vm_flags & VM_EXEC) ||
|
||||||
|
addr_not_cache_congruent(paddr, vaddr)) {
|
||||||
struct page *page = pfn_to_page(pte_pfn(*ptep));
|
struct page *page = pfn_to_page(pte_pfn(*ptep));
|
||||||
|
|
||||||
int dirty = test_and_clear_bit(PG_arch_1, &page->flags);
|
int dirty = test_and_clear_bit(PG_arch_1, &page->flags);
|
||||||
|
|
|
@ -277,7 +277,7 @@ ARC_ENTRY EV_TLBMissI
|
||||||
;----------------------------------------------------------------
|
;----------------------------------------------------------------
|
||||||
; VERIFY_PTE: Check if PTE permissions approp for executing code
|
; VERIFY_PTE: Check if PTE permissions approp for executing code
|
||||||
cmp_s r2, VMALLOC_START
|
cmp_s r2, VMALLOC_START
|
||||||
mov.lo r2, (_PAGE_PRESENT | _PAGE_READ | _PAGE_EXECUTE)
|
mov.lo r2, (_PAGE_PRESENT | _PAGE_U_READ | _PAGE_U_EXECUTE)
|
||||||
mov.hs r2, (_PAGE_PRESENT | _PAGE_K_READ | _PAGE_K_EXECUTE)
|
mov.hs r2, (_PAGE_PRESENT | _PAGE_K_READ | _PAGE_K_EXECUTE)
|
||||||
|
|
||||||
and r3, r0, r2 ; Mask out NON Flag bits from PTE
|
and r3, r0, r2 ; Mask out NON Flag bits from PTE
|
||||||
|
@ -320,9 +320,9 @@ ARC_ENTRY EV_TLBMissD
|
||||||
mov_s r2, 0
|
mov_s r2, 0
|
||||||
lr r3, [ecr]
|
lr r3, [ecr]
|
||||||
btst_s r3, ECR_C_BIT_DTLB_LD_MISS ; Read Access
|
btst_s r3, ECR_C_BIT_DTLB_LD_MISS ; Read Access
|
||||||
or.nz r2, r2, _PAGE_READ ; chk for Read flag in PTE
|
or.nz r2, r2, _PAGE_U_READ ; chk for Read flag in PTE
|
||||||
btst_s r3, ECR_C_BIT_DTLB_ST_MISS ; Write Access
|
btst_s r3, ECR_C_BIT_DTLB_ST_MISS ; Write Access
|
||||||
or.nz r2, r2, _PAGE_WRITE ; chk for Write flag in PTE
|
or.nz r2, r2, _PAGE_U_WRITE ; chk for Write flag in PTE
|
||||||
; Above laddering takes care of XCHG access
|
; Above laddering takes care of XCHG access
|
||||||
; which is both Read and Write
|
; which is both Read and Write
|
||||||
|
|
||||||
|
|
|
@ -34,31 +34,6 @@ static void __init tb10x_platform_init(void)
|
||||||
of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
|
of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init tb10x_platform_late_init(void)
|
|
||||||
{
|
|
||||||
struct device_node *dn;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Pinctrl documentation recommends setting up the iomux here for
|
|
||||||
* all modules which don't require control over the pins themselves.
|
|
||||||
* Modules which need this kind of assistance are compatible with
|
|
||||||
* "abilis,simple-pinctrl", i.e. we can easily iterate over them.
|
|
||||||
* TODO: Does this recommended method work cleanly with pins required
|
|
||||||
* by modules?
|
|
||||||
*/
|
|
||||||
for_each_compatible_node(dn, NULL, "abilis,simple-pinctrl") {
|
|
||||||
struct platform_device *pd = of_find_device_by_node(dn);
|
|
||||||
struct pinctrl *pctl;
|
|
||||||
|
|
||||||
pctl = pinctrl_get_select(&pd->dev, "abilis,simple-default");
|
|
||||||
if (IS_ERR(pctl)) {
|
|
||||||
int ret = PTR_ERR(pctl);
|
|
||||||
dev_err(&pd->dev, "Could not set up pinctrl: %d\n",
|
|
||||||
ret);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char *tb10x_compat[] __initdata = {
|
static const char *tb10x_compat[] __initdata = {
|
||||||
"abilis,arc-tb10x",
|
"abilis,arc-tb10x",
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -67,5 +42,4 @@ static const char *tb10x_compat[] __initdata = {
|
||||||
MACHINE_START(TB10x, "tb10x")
|
MACHINE_START(TB10x, "tb10x")
|
||||||
.dt_compat = tb10x_compat,
|
.dt_compat = tb10x_compat,
|
||||||
.init_machine = tb10x_platform_init,
|
.init_machine = tb10x_platform_init,
|
||||||
.init_late = tb10x_platform_late_init,
|
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -1088,6 +1088,20 @@ if !MMU
|
||||||
source "arch/arm/Kconfig-nommu"
|
source "arch/arm/Kconfig-nommu"
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
config PJ4B_ERRATA_4742
|
||||||
|
bool "PJ4B Errata 4742: IDLE Wake Up Commands can Cause the CPU Core to Cease Operation"
|
||||||
|
depends on CPU_PJ4B && MACH_ARMADA_370
|
||||||
|
default y
|
||||||
|
help
|
||||||
|
When coming out of either a Wait for Interrupt (WFI) or a Wait for
|
||||||
|
Event (WFE) IDLE states, a specific timing sensitivity exists between
|
||||||
|
the retiring WFI/WFE instructions and the newly issued subsequent
|
||||||
|
instructions. This sensitivity can result in a CPU hang scenario.
|
||||||
|
Workaround:
|
||||||
|
The software must insert either a Data Synchronization Barrier (DSB)
|
||||||
|
or Data Memory Barrier (DMB) command immediately after the WFI/WFE
|
||||||
|
instruction
|
||||||
|
|
||||||
config ARM_ERRATA_326103
|
config ARM_ERRATA_326103
|
||||||
bool "ARM errata: FSR write bit incorrect on a SWP to read-only memory"
|
bool "ARM errata: FSR write bit incorrect on a SWP to read-only memory"
|
||||||
depends on CPU_V6
|
depends on CPU_V6
|
||||||
|
@ -1190,6 +1204,16 @@ config PL310_ERRATA_588369
|
||||||
is not correctly implemented in PL310 as clean lines are not
|
is not correctly implemented in PL310 as clean lines are not
|
||||||
invalidated as a result of these operations.
|
invalidated as a result of these operations.
|
||||||
|
|
||||||
|
config ARM_ERRATA_643719
|
||||||
|
bool "ARM errata: LoUIS bit field in CLIDR register is incorrect"
|
||||||
|
depends on CPU_V7 && SMP
|
||||||
|
help
|
||||||
|
This option enables the workaround for the 643719 Cortex-A9 (prior to
|
||||||
|
r1p0) erratum. On affected cores the LoUIS bit field of the CLIDR
|
||||||
|
register returns zero when it should return one. The workaround
|
||||||
|
corrects this value, ensuring cache maintenance operations which use
|
||||||
|
it behave as intended and avoiding data corruption.
|
||||||
|
|
||||||
config ARM_ERRATA_720789
|
config ARM_ERRATA_720789
|
||||||
bool "ARM errata: TLBIASIDIS and TLBIMVAIS operations can broadcast a faulty ASID"
|
bool "ARM errata: TLBIASIDIS and TLBIMVAIS operations can broadcast a faulty ASID"
|
||||||
depends on CPU_V7
|
depends on CPU_V7
|
||||||
|
@ -2007,7 +2031,7 @@ config XIP_PHYS_ADDR
|
||||||
|
|
||||||
config KEXEC
|
config KEXEC
|
||||||
bool "Kexec system call (EXPERIMENTAL)"
|
bool "Kexec system call (EXPERIMENTAL)"
|
||||||
depends on (!SMP || HOTPLUG_CPU)
|
depends on (!SMP || PM_SLEEP_SMP)
|
||||||
help
|
help
|
||||||
kexec is a system call that implements the ability to shutdown your
|
kexec is a system call that implements the ability to shutdown your
|
||||||
current kernel, and to start another kernel. It is like a reboot
|
current kernel, and to start another kernel. It is like a reboot
|
||||||
|
|
|
@ -116,7 +116,8 @@ targets := vmlinux vmlinux.lds \
|
||||||
|
|
||||||
# Make sure files are removed during clean
|
# Make sure files are removed during clean
|
||||||
extra-y += piggy.gzip piggy.lzo piggy.lzma piggy.xzkern \
|
extra-y += piggy.gzip piggy.lzo piggy.lzma piggy.xzkern \
|
||||||
lib1funcs.S ashldi3.S $(libfdt) $(libfdt_hdrs)
|
lib1funcs.S ashldi3.S $(libfdt) $(libfdt_hdrs) \
|
||||||
|
hyp-stub.S
|
||||||
|
|
||||||
ifeq ($(CONFIG_FUNCTION_TRACER),y)
|
ifeq ($(CONFIG_FUNCTION_TRACER),y)
|
||||||
ORIG_CFLAGS := $(KBUILD_CFLAGS)
|
ORIG_CFLAGS := $(KBUILD_CFLAGS)
|
||||||
|
@ -124,7 +125,7 @@ KBUILD_CFLAGS = $(subst -pg, , $(ORIG_CFLAGS))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ccflags-y := -fpic -mno-single-pic-base -fno-builtin -I$(obj)
|
ccflags-y := -fpic -mno-single-pic-base -fno-builtin -I$(obj)
|
||||||
asflags-y := -Wa,-march=all -DZIMAGE
|
asflags-y := -DZIMAGE
|
||||||
|
|
||||||
# Supply kernel BSS size to the decompressor via a linker symbol.
|
# Supply kernel BSS size to the decompressor via a linker symbol.
|
||||||
KBSS_SZ = $(shell $(CROSS_COMPILE)size $(obj)/../../../../vmlinux | \
|
KBSS_SZ = $(shell $(CROSS_COMPILE)size $(obj)/../../../../vmlinux | \
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <asm/assembler.h>
|
#include <asm/assembler.h>
|
||||||
|
|
||||||
|
#ifndef CONFIG_DEBUG_SEMIHOSTING
|
||||||
|
|
||||||
#include CONFIG_DEBUG_LL_INCLUDE
|
#include CONFIG_DEBUG_LL_INCLUDE
|
||||||
|
|
||||||
ENTRY(putc)
|
ENTRY(putc)
|
||||||
|
@ -10,3 +12,29 @@ ENTRY(putc)
|
||||||
busyuart r3, r1
|
busyuart r3, r1
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
ENDPROC(putc)
|
ENDPROC(putc)
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
ENTRY(putc)
|
||||||
|
adr r1, 1f
|
||||||
|
ldmia r1, {r2, r3}
|
||||||
|
add r2, r2, r1
|
||||||
|
ldr r1, [r2, r3]
|
||||||
|
strb r0, [r1]
|
||||||
|
mov r0, #0x03 @ SYS_WRITEC
|
||||||
|
ARM( svc #0x123456 )
|
||||||
|
THUMB( svc #0xab )
|
||||||
|
mov pc, lr
|
||||||
|
.align 2
|
||||||
|
1: .word _GLOBAL_OFFSET_TABLE_ - .
|
||||||
|
.word semi_writec_buf(GOT)
|
||||||
|
ENDPROC(putc)
|
||||||
|
|
||||||
|
.bss
|
||||||
|
.global semi_writec_buf
|
||||||
|
.type semi_writec_buf, %object
|
||||||
|
semi_writec_buf:
|
||||||
|
.space 4
|
||||||
|
.size semi_writec_buf, 4
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
|
|
||||||
.section ".start", "ax"
|
.section ".start", "ax"
|
||||||
|
.arch armv4
|
||||||
|
|
||||||
__SA1100_start:
|
__SA1100_start:
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
|
|
||||||
.section ".start", "ax"
|
.section ".start", "ax"
|
||||||
|
|
||||||
|
.arch armv4
|
||||||
b __beginning
|
b __beginning
|
||||||
|
|
||||||
__ofw_data: .long 0 @ the number of memory blocks
|
__ofw_data: .long 0 @ the number of memory blocks
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <asm/assembler.h>
|
#include <asm/assembler.h>
|
||||||
|
|
||||||
|
.arch armv7-a
|
||||||
/*
|
/*
|
||||||
* Debugging stuff
|
* Debugging stuff
|
||||||
*
|
*
|
||||||
|
@ -805,8 +806,8 @@ call_cache_fn: adr r12, proc_types
|
||||||
.align 2
|
.align 2
|
||||||
.type proc_types,#object
|
.type proc_types,#object
|
||||||
proc_types:
|
proc_types:
|
||||||
.word 0x00000000 @ old ARM ID
|
.word 0x41000000 @ old ARM ID
|
||||||
.word 0x0000f000
|
.word 0xff00f000
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
THUMB( nop )
|
THUMB( nop )
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
|
|
|
@ -177,7 +177,9 @@ dtb-$(CONFIG_ARCH_SPEAR3XX)+= spear300-evb.dtb \
|
||||||
spear320-evb.dtb \
|
spear320-evb.dtb \
|
||||||
spear320-hmi.dtb
|
spear320-hmi.dtb
|
||||||
dtb-$(CONFIG_ARCH_SPEAR6XX)+= spear600-evb.dtb
|
dtb-$(CONFIG_ARCH_SPEAR6XX)+= spear600-evb.dtb
|
||||||
dtb-$(CONFIG_ARCH_SUNXI) += sun4i-a10-cubieboard.dtb \
|
dtb-$(CONFIG_ARCH_SUNXI) += \
|
||||||
|
sun4i-a10-cubieboard.dtb \
|
||||||
|
sun4i-a10-mini-xplus.dtb \
|
||||||
sun4i-a10-hackberry.dtb \
|
sun4i-a10-hackberry.dtb \
|
||||||
sun5i-a13-olinuxino.dtb
|
sun5i-a13-olinuxino.dtb
|
||||||
dtb-$(CONFIG_ARCH_TEGRA) += tegra20-harmony.dtb \
|
dtb-$(CONFIG_ARCH_TEGRA) += tegra20-harmony.dtb \
|
||||||
|
|
|
@ -409,8 +409,8 @@
|
||||||
ti,hwmods = "gpmc";
|
ti,hwmods = "gpmc";
|
||||||
reg = <0x50000000 0x2000>;
|
reg = <0x50000000 0x2000>;
|
||||||
interrupts = <100>;
|
interrupts = <100>;
|
||||||
num-cs = <7>;
|
gpmc,num-cs = <7>;
|
||||||
num-waitpins = <2>;
|
gpmc,num-waitpins = <2>;
|
||||||
#address-cells = <2>;
|
#address-cells = <2>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
|
@ -33,7 +33,8 @@
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
compatible = "simple-bus";
|
compatible = "simple-bus";
|
||||||
interrupt-parent = <&mpic>;
|
interrupt-parent = <&mpic>;
|
||||||
ranges = <0 0 0xd0000000 0x100000>;
|
ranges = <0 0 0xd0000000 0x0100000 /* internal registers */
|
||||||
|
0xe0000000 0 0xe0000000 0x8100000 /* PCIe */>;
|
||||||
|
|
||||||
internal-regs {
|
internal-regs {
|
||||||
compatible = "simple-bus";
|
compatible = "simple-bus";
|
||||||
|
|
|
@ -29,7 +29,8 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
soc {
|
soc {
|
||||||
ranges = <0 0xd0000000 0x100000>;
|
ranges = <0 0xd0000000 0x0100000 /* internal registers */
|
||||||
|
0xe0000000 0xe0000000 0x8100000 /* PCIe */>;
|
||||||
internal-regs {
|
internal-regs {
|
||||||
system-controller@18200 {
|
system-controller@18200 {
|
||||||
compatible = "marvell,armada-370-xp-system-controller";
|
compatible = "marvell,armada-370-xp-system-controller";
|
||||||
|
@ -38,12 +39,12 @@
|
||||||
|
|
||||||
L2: l2-cache {
|
L2: l2-cache {
|
||||||
compatible = "marvell,aurora-outer-cache";
|
compatible = "marvell,aurora-outer-cache";
|
||||||
reg = <0xd0008000 0x1000>;
|
reg = <0x08000 0x1000>;
|
||||||
cache-id-part = <0x100>;
|
cache-id-part = <0x100>;
|
||||||
wt-override;
|
wt-override;
|
||||||
};
|
};
|
||||||
|
|
||||||
mpic: interrupt-controller@20000 {
|
interrupt-controller@20000 {
|
||||||
reg = <0x20a00 0x1d0>, <0x21870 0x58>;
|
reg = <0x20a00 0x1d0>, <0x21870 0x58>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -39,6 +39,10 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
soc {
|
soc {
|
||||||
|
ranges = <0 0 0xd0000000 0x100000 /* Internal registers 1MiB */
|
||||||
|
0xe0000000 0 0xe0000000 0x8100000 /* PCIe */
|
||||||
|
0xf0000000 0 0xf0000000 0x1000000 /* Device Bus, NOR 16MiB */>;
|
||||||
|
|
||||||
internal-regs {
|
internal-regs {
|
||||||
serial@12000 {
|
serial@12000 {
|
||||||
clock-frequency = <250000000>;
|
clock-frequency = <250000000>;
|
||||||
|
|
|
@ -27,6 +27,10 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
soc {
|
soc {
|
||||||
|
ranges = <0 0 0xd0000000 0x100000 /* Internal registers 1MiB */
|
||||||
|
0xe0000000 0 0xe0000000 0x8100000 /* PCIe */
|
||||||
|
0xf0000000 0 0xf0000000 0x8000000 /* Device Bus, NOR 128MiB */>;
|
||||||
|
|
||||||
internal-regs {
|
internal-regs {
|
||||||
serial@12000 {
|
serial@12000 {
|
||||||
clock-frequency = <250000000>;
|
clock-frequency = <250000000>;
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
wt-override;
|
wt-override;
|
||||||
};
|
};
|
||||||
|
|
||||||
mpic: interrupt-controller@20000 {
|
interrupt-controller@20000 {
|
||||||
reg = <0x20a00 0x2d0>, <0x21070 0x58>;
|
reg = <0x20a00 0x2d0>, <0x21070 0x58>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -264,7 +264,7 @@
|
||||||
atmel,pins =
|
atmel,pins =
|
||||||
<0 10 0x2 0x0 /* PA10 periph B */
|
<0 10 0x2 0x0 /* PA10 periph B */
|
||||||
0 11 0x2 0x0 /* PA11 periph B */
|
0 11 0x2 0x0 /* PA11 periph B */
|
||||||
0 24 0x2 0x0 /* PA24 periph B */
|
0 22 0x2 0x0 /* PA22 periph B */
|
||||||
0 25 0x2 0x0 /* PA25 periph B */
|
0 25 0x2 0x0 /* PA25 periph B */
|
||||||
0 26 0x2 0x0 /* PA26 periph B */
|
0 26 0x2 0x0 /* PA26 periph B */
|
||||||
0 27 0x2 0x0 /* PA27 periph B */
|
0 27 0x2 0x0 /* PA27 periph B */
|
||||||
|
|
|
@ -57,6 +57,7 @@
|
||||||
compatible = "atmel,at91rm9200-aic";
|
compatible = "atmel,at91rm9200-aic";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
reg = <0xfffff000 0x200>;
|
reg = <0xfffff000 0x200>;
|
||||||
|
atmel,external-irqs = <31>;
|
||||||
};
|
};
|
||||||
|
|
||||||
ramc0: ramc@ffffe800 {
|
ramc0: ramc@ffffe800 {
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
/include/ "at91sam9x5ek.dtsi"
|
/include/ "at91sam9x5ek.dtsi"
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
model = "Atmel AT91SAM9G25-EK";
|
model = "Atmel AT91SAM9X25-EK";
|
||||||
compatible = "atmel,at91sam9x25ek", "atmel,at91sam9x5ek", "atmel,at91sam9x5", "atmel,at91sam9";
|
compatible = "atmel,at91sam9x25ek", "atmel,at91sam9x5ek", "atmel,at91sam9x5", "atmel,at91sam9";
|
||||||
|
|
||||||
ahb {
|
ahb {
|
||||||
|
|
|
@ -44,6 +44,7 @@
|
||||||
reg = <0x7e201000 0x1000>;
|
reg = <0x7e201000 0x1000>;
|
||||||
interrupts = <2 25>;
|
interrupts = <2 25>;
|
||||||
clock-frequency = <3000000>;
|
clock-frequency = <3000000>;
|
||||||
|
arm,primecell-periphid = <0x00241011>;
|
||||||
};
|
};
|
||||||
|
|
||||||
gpio: gpio {
|
gpio: gpio {
|
||||||
|
|
|
@ -763,7 +763,7 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
pinctrl@03680000 {
|
pinctrl@03860000 {
|
||||||
gpz: gpz {
|
gpz: gpz {
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
|
|
|
@ -161,9 +161,9 @@
|
||||||
interrupts = <0 50 0>;
|
interrupts = <0 50 0>;
|
||||||
};
|
};
|
||||||
|
|
||||||
pinctrl_3: pinctrl@03680000 {
|
pinctrl_3: pinctrl@03860000 {
|
||||||
compatible = "samsung,exynos5250-pinctrl";
|
compatible = "samsung,exynos5250-pinctrl";
|
||||||
reg = <0x0368000 0x1000>;
|
reg = <0x03860000 0x1000>;
|
||||||
interrupts = <0 47 0>;
|
interrupts = <0 47 0>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -497,6 +497,21 @@
|
||||||
clock-names = "usbhost";
|
clock-names = "usbhost";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
usbphy@12130000 {
|
||||||
|
compatible = "samsung,exynos5250-usb2phy";
|
||||||
|
reg = <0x12130000 0x100>;
|
||||||
|
clocks = <&clock 1>, <&clock 285>;
|
||||||
|
clock-names = "ext_xtal", "usbhost";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
ranges;
|
||||||
|
|
||||||
|
usbphy-sys {
|
||||||
|
reg = <0x10040704 0x8>,
|
||||||
|
<0x10050230 0x4>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
amba {
|
amba {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
|
|
|
@ -141,8 +141,8 @@
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
compatible = "fsl,imx25-cspi", "fsl,imx35-cspi";
|
compatible = "fsl,imx25-cspi", "fsl,imx35-cspi";
|
||||||
reg = <0x43fa4000 0x4000>;
|
reg = <0x43fa4000 0x4000>;
|
||||||
clocks = <&clks 62>;
|
clocks = <&clks 62>, <&clks 62>;
|
||||||
clock-names = "ipg";
|
clock-names = "ipg", "per";
|
||||||
interrupts = <14>;
|
interrupts = <14>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
@ -182,8 +182,8 @@
|
||||||
compatible = "fsl,imx25-cspi", "fsl,imx35-cspi";
|
compatible = "fsl,imx25-cspi", "fsl,imx35-cspi";
|
||||||
reg = <0x50004000 0x4000>;
|
reg = <0x50004000 0x4000>;
|
||||||
interrupts = <0>;
|
interrupts = <0>;
|
||||||
clocks = <&clks 80>;
|
clocks = <&clks 80>, <&clks 80>;
|
||||||
clock-names = "ipg";
|
clock-names = "ipg", "per";
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -210,8 +210,8 @@
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
compatible = "fsl,imx25-cspi", "fsl,imx35-cspi";
|
compatible = "fsl,imx25-cspi", "fsl,imx35-cspi";
|
||||||
reg = <0x50010000 0x4000>;
|
reg = <0x50010000 0x4000>;
|
||||||
clocks = <&clks 79>;
|
clocks = <&clks 79>, <&clks 79>;
|
||||||
clock-names = "ipg";
|
clock-names = "ipg", "per";
|
||||||
interrupts = <13>;
|
interrupts = <13>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
|
@ -131,7 +131,7 @@
|
||||||
compatible = "fsl,imx27-cspi";
|
compatible = "fsl,imx27-cspi";
|
||||||
reg = <0x1000e000 0x1000>;
|
reg = <0x1000e000 0x1000>;
|
||||||
interrupts = <16>;
|
interrupts = <16>;
|
||||||
clocks = <&clks 53>, <&clks 0>;
|
clocks = <&clks 53>, <&clks 53>;
|
||||||
clock-names = "ipg", "per";
|
clock-names = "ipg", "per";
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
@ -142,7 +142,7 @@
|
||||||
compatible = "fsl,imx27-cspi";
|
compatible = "fsl,imx27-cspi";
|
||||||
reg = <0x1000f000 0x1000>;
|
reg = <0x1000f000 0x1000>;
|
||||||
interrupts = <15>;
|
interrupts = <15>;
|
||||||
clocks = <&clks 52>, <&clks 0>;
|
clocks = <&clks 52>, <&clks 52>;
|
||||||
clock-names = "ipg", "per";
|
clock-names = "ipg", "per";
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
@ -223,7 +223,7 @@
|
||||||
compatible = "fsl,imx27-cspi";
|
compatible = "fsl,imx27-cspi";
|
||||||
reg = <0x10017000 0x1000>;
|
reg = <0x10017000 0x1000>;
|
||||||
interrupts = <6>;
|
interrupts = <6>;
|
||||||
clocks = <&clks 51>, <&clks 0>;
|
clocks = <&clks 51>, <&clks 51>;
|
||||||
clock-names = "ipg", "per";
|
clock-names = "ipg", "per";
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
|
@ -631,7 +631,7 @@
|
||||||
compatible = "fsl,imx51-cspi", "fsl,imx35-cspi";
|
compatible = "fsl,imx51-cspi", "fsl,imx35-cspi";
|
||||||
reg = <0x83fc0000 0x4000>;
|
reg = <0x83fc0000 0x4000>;
|
||||||
interrupts = <38>;
|
interrupts = <38>;
|
||||||
clocks = <&clks 55>, <&clks 0>;
|
clocks = <&clks 55>, <&clks 55>;
|
||||||
clock-names = "ipg", "per";
|
clock-names = "ipg", "per";
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
|
@ -714,7 +714,7 @@
|
||||||
compatible = "fsl,imx53-cspi", "fsl,imx35-cspi";
|
compatible = "fsl,imx53-cspi", "fsl,imx35-cspi";
|
||||||
reg = <0x63fc0000 0x4000>;
|
reg = <0x63fc0000 0x4000>;
|
||||||
interrupts = <38>;
|
interrupts = <38>;
|
||||||
clocks = <&clks 55>, <&clks 0>;
|
clocks = <&clks 55>, <&clks 55>;
|
||||||
clock-names = "ipg", "per";
|
clock-names = "ipg", "per";
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
|
@ -516,7 +516,7 @@
|
||||||
usb_otg_hs: usb_otg_hs@480ab000 {
|
usb_otg_hs: usb_otg_hs@480ab000 {
|
||||||
compatible = "ti,omap3-musb";
|
compatible = "ti,omap3-musb";
|
||||||
reg = <0x480ab000 0x1000>;
|
reg = <0x480ab000 0x1000>;
|
||||||
interrupts = <0 92 0x4>, <0 93 0x4>;
|
interrupts = <92>, <93>;
|
||||||
interrupt-names = "mc", "dma";
|
interrupt-names = "mc", "dma";
|
||||||
ti,hwmods = "usb_otg_hs";
|
ti,hwmods = "usb_otg_hs";
|
||||||
multipoint = <1>;
|
multipoint = <1>;
|
||||||
|
|
|
@ -56,9 +56,23 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
&omap4_pmx_wkup {
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <
|
||||||
|
&twl6030_wkup_pins
|
||||||
|
>;
|
||||||
|
|
||||||
|
twl6030_wkup_pins: pinmux_twl6030_wkup_pins {
|
||||||
|
pinctrl-single,pins = <
|
||||||
|
0x14 0x2 /* fref_clk0_out.sys_drm_msecure OUTPUT | MODE2 */
|
||||||
|
>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
&omap4_pmx_core {
|
&omap4_pmx_core {
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <
|
pinctrl-0 = <
|
||||||
|
&twl6030_pins
|
||||||
&twl6040_pins
|
&twl6040_pins
|
||||||
&mcpdm_pins
|
&mcpdm_pins
|
||||||
&mcbsp1_pins
|
&mcbsp1_pins
|
||||||
|
@ -66,6 +80,12 @@
|
||||||
&tpd12s015_pins
|
&tpd12s015_pins
|
||||||
>;
|
>;
|
||||||
|
|
||||||
|
twl6030_pins: pinmux_twl6030_pins {
|
||||||
|
pinctrl-single,pins = <
|
||||||
|
0x15e 0x4118 /* sys_nirq1.sys_nirq1 OMAP_WAKEUP_EN | INPUT_PULLUP | MODE0 */
|
||||||
|
>;
|
||||||
|
};
|
||||||
|
|
||||||
twl6040_pins: pinmux_twl6040_pins {
|
twl6040_pins: pinmux_twl6040_pins {
|
||||||
pinctrl-single,pins = <
|
pinctrl-single,pins = <
|
||||||
0xe0 0x3 /* hdq_sio.gpio_127 OUTPUT | MODE3 */
|
0xe0 0x3 /* hdq_sio.gpio_127 OUTPUT | MODE3 */
|
||||||
|
|
|
@ -142,9 +142,23 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
&omap4_pmx_wkup {
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <
|
||||||
|
&twl6030_wkup_pins
|
||||||
|
>;
|
||||||
|
|
||||||
|
twl6030_wkup_pins: pinmux_twl6030_wkup_pins {
|
||||||
|
pinctrl-single,pins = <
|
||||||
|
0x14 0x2 /* fref_clk0_out.sys_drm_msecure OUTPUT | MODE2 */
|
||||||
|
>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
&omap4_pmx_core {
|
&omap4_pmx_core {
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <
|
pinctrl-0 = <
|
||||||
|
&twl6030_pins
|
||||||
&twl6040_pins
|
&twl6040_pins
|
||||||
&mcpdm_pins
|
&mcpdm_pins
|
||||||
&dmic_pins
|
&dmic_pins
|
||||||
|
@ -179,6 +193,12 @@
|
||||||
>;
|
>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
twl6030_pins: pinmux_twl6030_pins {
|
||||||
|
pinctrl-single,pins = <
|
||||||
|
0x15e 0x4118 /* sys_nirq1.sys_nirq1 OMAP_WAKEUP_EN | INPUT_PULLUP | MODE0 */
|
||||||
|
>;
|
||||||
|
};
|
||||||
|
|
||||||
twl6040_pins: pinmux_twl6040_pins {
|
twl6040_pins: pinmux_twl6040_pins {
|
||||||
pinctrl-single,pins = <
|
pinctrl-single,pins = <
|
||||||
0xe0 0x3 /* hdq_sio.gpio_127 OUTPUT | MODE3 */
|
0xe0 0x3 /* hdq_sio.gpio_127 OUTPUT | MODE3 */
|
||||||
|
|
|
@ -538,6 +538,7 @@
|
||||||
interrupts = <0 41 0x4>;
|
interrupts = <0 41 0x4>;
|
||||||
ti,hwmods = "timer5";
|
ti,hwmods = "timer5";
|
||||||
ti,timer-dsp;
|
ti,timer-dsp;
|
||||||
|
ti,timer-pwm;
|
||||||
};
|
};
|
||||||
|
|
||||||
timer6: timer@4013a000 {
|
timer6: timer@4013a000 {
|
||||||
|
@ -574,6 +575,7 @@
|
||||||
reg = <0x4803e000 0x80>;
|
reg = <0x4803e000 0x80>;
|
||||||
interrupts = <0 45 0x4>;
|
interrupts = <0 45 0x4>;
|
||||||
ti,hwmods = "timer9";
|
ti,hwmods = "timer9";
|
||||||
|
ti,timer-pwm;
|
||||||
};
|
};
|
||||||
|
|
||||||
timer10: timer@48086000 {
|
timer10: timer@48086000 {
|
||||||
|
@ -581,6 +583,7 @@
|
||||||
reg = <0x48086000 0x80>;
|
reg = <0x48086000 0x80>;
|
||||||
interrupts = <0 46 0x4>;
|
interrupts = <0 46 0x4>;
|
||||||
ti,hwmods = "timer10";
|
ti,hwmods = "timer10";
|
||||||
|
ti,timer-pwm;
|
||||||
};
|
};
|
||||||
|
|
||||||
timer11: timer@48088000 {
|
timer11: timer@48088000 {
|
||||||
|
|
|
@ -75,11 +75,6 @@
|
||||||
compatible = "atmel,at91sam9x5-spi";
|
compatible = "atmel,at91sam9x5-spi";
|
||||||
reg = <0xf0004000 0x100>;
|
reg = <0xf0004000 0x100>;
|
||||||
interrupts = <24 4 3>;
|
interrupts = <24 4 3>;
|
||||||
cs-gpios = <&pioD 13 0
|
|
||||||
&pioD 14 0 /* conflicts with SCK0 and CANRX0 */
|
|
||||||
&pioD 15 0 /* conflicts with CTS0 and CANTX0 */
|
|
||||||
&pioD 16 0 /* conflicts with RTS0 and PWMFI3 */
|
|
||||||
>;
|
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&pinctrl_spi0>;
|
pinctrl-0 = <&pinctrl_spi0>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
@ -156,7 +151,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
macb0: ethernet@f0028000 {
|
macb0: ethernet@f0028000 {
|
||||||
compatible = "cnds,pc302-gem", "cdns,gem";
|
compatible = "cdns,pc302-gem", "cdns,gem";
|
||||||
reg = <0xf0028000 0x100>;
|
reg = <0xf0028000 0x100>;
|
||||||
interrupts = <34 4 3>;
|
interrupts = <34 4 3>;
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
|
@ -203,11 +198,6 @@
|
||||||
compatible = "atmel,at91sam9x5-spi";
|
compatible = "atmel,at91sam9x5-spi";
|
||||||
reg = <0xf8008000 0x100>;
|
reg = <0xf8008000 0x100>;
|
||||||
interrupts = <25 4 3>;
|
interrupts = <25 4 3>;
|
||||||
cs-gpios = <&pioC 25 0
|
|
||||||
&pioC 26 0 /* conflitcs with TWD1 and ISI_D11 */
|
|
||||||
&pioC 27 0 /* conflitcs with TWCK1 and ISI_D10 */
|
|
||||||
&pioC 28 0 /* conflitcs with PWMFI0 and ISI_D9 */
|
|
||||||
>;
|
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&pinctrl_spi1>;
|
pinctrl-0 = <&pinctrl_spi1>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
|
@ -32,6 +32,10 @@
|
||||||
|
|
||||||
ahb {
|
ahb {
|
||||||
apb {
|
apb {
|
||||||
|
spi0: spi@f0004000 {
|
||||||
|
cs-gpios = <&pioD 13 0>, <0>, <0>, <0>;
|
||||||
|
};
|
||||||
|
|
||||||
macb0: ethernet@f0028000 {
|
macb0: ethernet@f0028000 {
|
||||||
phy-mode = "rgmii";
|
phy-mode = "rgmii";
|
||||||
};
|
};
|
||||||
|
|
|
@ -14,13 +14,19 @@
|
||||||
bootargs = "root=/dev/ram0 console=ttyAMA1,115200n8 earlyprintk";
|
bootargs = "root=/dev/ram0 console=ttyAMA1,115200n8 earlyprintk";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* This is where the interrupt is routed on the S8815 board */
|
||||||
|
external-bus@34000000 {
|
||||||
|
ethernet@300 {
|
||||||
|
interrupt-parent = <&gpio3>;
|
||||||
|
interrupts = <8 0x1>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
/* Custom board node with GPIO pins to active etc */
|
/* Custom board node with GPIO pins to active etc */
|
||||||
usb-s8815 {
|
usb-s8815 {
|
||||||
/* The S8815 is using this very GPIO pin for the SMSC91x IRQs */
|
/* The S8815 is using this very GPIO pin for the SMSC91x IRQs */
|
||||||
ethernet-gpio {
|
ethernet-gpio {
|
||||||
gpios = <&gpio3 19 0x1>;
|
gpios = <&gpio3 8 0x1>;
|
||||||
interrupts = <19 0x1>;
|
|
||||||
interrupt-parent = <&gpio3>;
|
|
||||||
};
|
};
|
||||||
/* This will bias the MMC/SD card detect line */
|
/* This will bias the MMC/SD card detect line */
|
||||||
mmcsd-gpio {
|
mmcsd-gpio {
|
||||||
|
|
|
@ -22,8 +22,8 @@
|
||||||
bootargs = "earlyprintk console=ttyS0,115200";
|
bootargs = "earlyprintk console=ttyS0,115200";
|
||||||
};
|
};
|
||||||
|
|
||||||
soc {
|
soc@01c20000 {
|
||||||
uart0: uart@01c28000 {
|
uart0: serial@01c28000 {
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&uart0_pins_a>;
|
pinctrl-0 = <&uart0_pins_a>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
CONFIG_EXPERIMENTAL=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_NO_HZ=y
|
CONFIG_NO_HZ=y
|
||||||
CONFIG_HIGH_RES_TIMERS=y
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
CONFIG_BLK_DEV_INITRD=y
|
CONFIG_BLK_DEV_INITRD=y
|
||||||
|
@ -7,17 +7,18 @@ CONFIG_MODULES=y
|
||||||
CONFIG_MODULE_UNLOAD=y
|
CONFIG_MODULE_UNLOAD=y
|
||||||
# CONFIG_BLK_DEV_BSG is not set
|
# CONFIG_BLK_DEV_BSG is not set
|
||||||
CONFIG_PARTITION_ADVANCED=y
|
CONFIG_PARTITION_ADVANCED=y
|
||||||
CONFIG_EFI_PARTITION=y
|
|
||||||
CONFIG_ARCH_EXYNOS=y
|
CONFIG_ARCH_EXYNOS=y
|
||||||
CONFIG_S3C_LOWLEVEL_UART_PORT=1
|
CONFIG_S3C_LOWLEVEL_UART_PORT=3
|
||||||
CONFIG_S3C24XX_PWM=y
|
CONFIG_S3C24XX_PWM=y
|
||||||
CONFIG_ARCH_EXYNOS5=y
|
CONFIG_ARCH_EXYNOS5=y
|
||||||
CONFIG_MACH_EXYNOS4_DT=y
|
CONFIG_MACH_EXYNOS4_DT=y
|
||||||
CONFIG_MACH_EXYNOS5_DT=y
|
|
||||||
CONFIG_SMP=y
|
CONFIG_SMP=y
|
||||||
CONFIG_NR_CPUS=2
|
CONFIG_NR_CPUS=2
|
||||||
CONFIG_PREEMPT=y
|
CONFIG_PREEMPT=y
|
||||||
CONFIG_AEABI=y
|
CONFIG_AEABI=y
|
||||||
|
CONFIG_HIGHMEM=y
|
||||||
|
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||||
|
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||||
CONFIG_ARM_APPENDED_DTB=y
|
CONFIG_ARM_APPENDED_DTB=y
|
||||||
CONFIG_ARM_ATAG_DTB_COMPAT=y
|
CONFIG_ARM_ATAG_DTB_COMPAT=y
|
||||||
CONFIG_CMDLINE="root=/dev/ram0 rw ramdisk=8192 initrd=0x41000000,8M console=ttySAC1,115200 init=/linuxrc mem=256M"
|
CONFIG_CMDLINE="root=/dev/ram0 rw ramdisk=8192 initrd=0x41000000,8M console=ttySAC1,115200 init=/linuxrc mem=256M"
|
||||||
|
@ -30,35 +31,58 @@ CONFIG_NET_KEY=y
|
||||||
CONFIG_INET=y
|
CONFIG_INET=y
|
||||||
CONFIG_RFKILL_REGULATOR=y
|
CONFIG_RFKILL_REGULATOR=y
|
||||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||||
|
CONFIG_DEVTMPFS=y
|
||||||
|
CONFIG_DEVTMPFS_MOUNT=y
|
||||||
CONFIG_PROC_DEVICETREE=y
|
CONFIG_PROC_DEVICETREE=y
|
||||||
CONFIG_BLK_DEV_LOOP=y
|
CONFIG_BLK_DEV_LOOP=y
|
||||||
|
CONFIG_BLK_DEV_CRYPTOLOOP=y
|
||||||
CONFIG_BLK_DEV_RAM=y
|
CONFIG_BLK_DEV_RAM=y
|
||||||
CONFIG_BLK_DEV_RAM_SIZE=8192
|
CONFIG_BLK_DEV_RAM_SIZE=8192
|
||||||
CONFIG_SCSI=y
|
CONFIG_SCSI=y
|
||||||
CONFIG_BLK_DEV_SD=y
|
CONFIG_BLK_DEV_SD=y
|
||||||
CONFIG_CHR_DEV_SG=y
|
CONFIG_CHR_DEV_SG=y
|
||||||
|
CONFIG_MD=y
|
||||||
|
CONFIG_BLK_DEV_DM=y
|
||||||
|
CONFIG_DM_CRYPT=m
|
||||||
CONFIG_NETDEVICES=y
|
CONFIG_NETDEVICES=y
|
||||||
CONFIG_SMSC911X=y
|
CONFIG_SMSC911X=y
|
||||||
CONFIG_USB_USBNET=y
|
CONFIG_USB_USBNET=y
|
||||||
CONFIG_USB_NET_SMSC75XX=y
|
CONFIG_USB_NET_SMSC75XX=y
|
||||||
CONFIG_USB_NET_SMSC95XX=y
|
CONFIG_USB_NET_SMSC95XX=y
|
||||||
CONFIG_INPUT_EVDEV=y
|
CONFIG_INPUT_EVDEV=y
|
||||||
# CONFIG_INPUT_KEYBOARD is not set
|
CONFIG_KEYBOARD_CROS_EC=y
|
||||||
# CONFIG_INPUT_MOUSE is not set
|
# CONFIG_MOUSE_PS2 is not set
|
||||||
|
CONFIG_MOUSE_CYAPA=y
|
||||||
CONFIG_INPUT_TOUCHSCREEN=y
|
CONFIG_INPUT_TOUCHSCREEN=y
|
||||||
CONFIG_SERIAL_8250=y
|
CONFIG_SERIAL_8250=y
|
||||||
CONFIG_SERIAL_SAMSUNG=y
|
CONFIG_SERIAL_SAMSUNG=y
|
||||||
CONFIG_SERIAL_SAMSUNG_CONSOLE=y
|
CONFIG_SERIAL_SAMSUNG_CONSOLE=y
|
||||||
CONFIG_SERIAL_OF_PLATFORM=y
|
CONFIG_SERIAL_OF_PLATFORM=y
|
||||||
CONFIG_HW_RANDOM=y
|
CONFIG_HW_RANDOM=y
|
||||||
|
CONFIG_TCG_TPM=y
|
||||||
|
CONFIG_TCG_TIS_I2C_INFINEON=y
|
||||||
CONFIG_I2C=y
|
CONFIG_I2C=y
|
||||||
|
CONFIG_I2C_MUX=y
|
||||||
|
CONFIG_I2C_ARB_GPIO_CHALLENGE=y
|
||||||
|
CONFIG_I2C_S3C2410=y
|
||||||
|
CONFIG_DEBUG_GPIO=y
|
||||||
# CONFIG_HWMON is not set
|
# CONFIG_HWMON is not set
|
||||||
|
CONFIG_MFD_CROS_EC=y
|
||||||
|
CONFIG_MFD_CROS_EC_I2C=y
|
||||||
|
CONFIG_MFD_MAX77686=y
|
||||||
|
CONFIG_MFD_MAX8997=y
|
||||||
|
CONFIG_MFD_SEC_CORE=y
|
||||||
CONFIG_MFD_TPS65090=y
|
CONFIG_MFD_TPS65090=y
|
||||||
CONFIG_REGULATOR=y
|
CONFIG_REGULATOR=y
|
||||||
CONFIG_REGULATOR_FIXED_VOLTAGE=y
|
CONFIG_REGULATOR_FIXED_VOLTAGE=y
|
||||||
CONFIG_REGULATOR_GPIO=y
|
CONFIG_REGULATOR_GPIO=y
|
||||||
|
CONFIG_REGULATOR_MAX8997=y
|
||||||
|
CONFIG_REGULATOR_MAX77686=y
|
||||||
|
CONFIG_REGULATOR_S5M8767=y
|
||||||
CONFIG_REGULATOR_TPS65090=y
|
CONFIG_REGULATOR_TPS65090=y
|
||||||
CONFIG_FB=y
|
CONFIG_FB=y
|
||||||
|
CONFIG_FB_MODE_HELPERS=y
|
||||||
|
CONFIG_FB_SIMPLE=y
|
||||||
CONFIG_EXYNOS_VIDEO=y
|
CONFIG_EXYNOS_VIDEO=y
|
||||||
CONFIG_EXYNOS_MIPI_DSI=y
|
CONFIG_EXYNOS_MIPI_DSI=y
|
||||||
CONFIG_EXYNOS_DP=y
|
CONFIG_EXYNOS_DP=y
|
||||||
|
@ -67,6 +91,20 @@ CONFIG_FONTS=y
|
||||||
CONFIG_FONT_7x14=y
|
CONFIG_FONT_7x14=y
|
||||||
CONFIG_LOGO=y
|
CONFIG_LOGO=y
|
||||||
CONFIG_USB=y
|
CONFIG_USB=y
|
||||||
|
CONFIG_USB_EHCI_HCD=y
|
||||||
|
CONFIG_USB_EHCI_S5P=y
|
||||||
|
CONFIG_USB_STORAGE=y
|
||||||
|
CONFIG_USB_DWC3=y
|
||||||
|
CONFIG_USB_PHY=y
|
||||||
|
CONFIG_SAMSUNG_USB2PHY=y
|
||||||
|
CONFIG_SAMSUNG_USB3PHY=y
|
||||||
|
CONFIG_MMC=y
|
||||||
|
CONFIG_MMC_SDHCI=y
|
||||||
|
CONFIG_MMC_SDHCI_S3C=y
|
||||||
|
CONFIG_MMC_DW=y
|
||||||
|
CONFIG_MMC_DW_IDMAC=y
|
||||||
|
CONFIG_MMC_DW_EXYNOS=y
|
||||||
|
CONFIG_COMMON_CLK_MAX77686=y
|
||||||
CONFIG_EXT2_FS=y
|
CONFIG_EXT2_FS=y
|
||||||
CONFIG_EXT3_FS=y
|
CONFIG_EXT3_FS=y
|
||||||
CONFIG_EXT4_FS=y
|
CONFIG_EXT4_FS=y
|
||||||
|
@ -79,6 +117,7 @@ CONFIG_ROMFS_FS=y
|
||||||
CONFIG_NLS_CODEPAGE_437=y
|
CONFIG_NLS_CODEPAGE_437=y
|
||||||
CONFIG_NLS_ASCII=y
|
CONFIG_NLS_ASCII=y
|
||||||
CONFIG_NLS_ISO8859_1=y
|
CONFIG_NLS_ISO8859_1=y
|
||||||
|
CONFIG_PRINTK_TIME=y
|
||||||
CONFIG_MAGIC_SYSRQ=y
|
CONFIG_MAGIC_SYSRQ=y
|
||||||
CONFIG_DEBUG_KERNEL=y
|
CONFIG_DEBUG_KERNEL=y
|
||||||
CONFIG_DETECT_HUNG_TASK=y
|
CONFIG_DETECT_HUNG_TASK=y
|
||||||
|
@ -87,6 +126,5 @@ CONFIG_DEBUG_SPINLOCK=y
|
||||||
CONFIG_DEBUG_MUTEXES=y
|
CONFIG_DEBUG_MUTEXES=y
|
||||||
CONFIG_DEBUG_INFO=y
|
CONFIG_DEBUG_INFO=y
|
||||||
CONFIG_DEBUG_USER=y
|
CONFIG_DEBUG_USER=y
|
||||||
CONFIG_DEBUG_LL=y
|
CONFIG_CRYPTO_SHA256=y
|
||||||
CONFIG_EARLY_PRINTK=y
|
|
||||||
CONFIG_CRC_CCITT=y
|
CONFIG_CRC_CCITT=y
|
||||||
|
|
|
@ -199,7 +199,6 @@ CONFIG_USB_PHY=y
|
||||||
CONFIG_USB_DEBUG=y
|
CONFIG_USB_DEBUG=y
|
||||||
CONFIG_USB_DEVICEFS=y
|
CONFIG_USB_DEVICEFS=y
|
||||||
# CONFIG_USB_DEVICE_CLASS is not set
|
# CONFIG_USB_DEVICE_CLASS is not set
|
||||||
CONFIG_USB_SUSPEND=y
|
|
||||||
CONFIG_USB_MON=y
|
CONFIG_USB_MON=y
|
||||||
CONFIG_USB_OHCI_HCD=y
|
CONFIG_USB_OHCI_HCD=y
|
||||||
CONFIG_USB_STORAGE=y
|
CONFIG_USB_STORAGE=y
|
||||||
|
|
|
@ -20,6 +20,7 @@ CONFIG_MODULE_FORCE_UNLOAD=y
|
||||||
CONFIG_MODVERSIONS=y
|
CONFIG_MODVERSIONS=y
|
||||||
CONFIG_MODULE_SRCVERSION_ALL=y
|
CONFIG_MODULE_SRCVERSION_ALL=y
|
||||||
# CONFIG_BLK_DEV_BSG is not set
|
# CONFIG_BLK_DEV_BSG is not set
|
||||||
|
CONFIG_ARCH_MULTI_V6=y
|
||||||
CONFIG_ARCH_OMAP2PLUS=y
|
CONFIG_ARCH_OMAP2PLUS=y
|
||||||
CONFIG_OMAP_RESET_CLOCKS=y
|
CONFIG_OMAP_RESET_CLOCKS=y
|
||||||
CONFIG_OMAP_MUX_DEBUG=y
|
CONFIG_OMAP_MUX_DEBUG=y
|
||||||
|
@ -204,7 +205,6 @@ CONFIG_USB=y
|
||||||
CONFIG_USB_DEBUG=y
|
CONFIG_USB_DEBUG=y
|
||||||
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
|
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
|
||||||
CONFIG_USB_DEVICEFS=y
|
CONFIG_USB_DEVICEFS=y
|
||||||
CONFIG_USB_SUSPEND=y
|
|
||||||
CONFIG_USB_MON=y
|
CONFIG_USB_MON=y
|
||||||
CONFIG_USB_WDM=y
|
CONFIG_USB_WDM=y
|
||||||
CONFIG_USB_STORAGE=y
|
CONFIG_USB_STORAGE=y
|
||||||
|
|
|
@ -153,6 +153,7 @@ CONFIG_MEDIA_CAMERA_SUPPORT=y
|
||||||
CONFIG_MEDIA_USB_SUPPORT=y
|
CONFIG_MEDIA_USB_SUPPORT=y
|
||||||
CONFIG_USB_VIDEO_CLASS=m
|
CONFIG_USB_VIDEO_CLASS=m
|
||||||
CONFIG_DRM=y
|
CONFIG_DRM=y
|
||||||
|
CONFIG_TEGRA_HOST1X=y
|
||||||
CONFIG_DRM_TEGRA=y
|
CONFIG_DRM_TEGRA=y
|
||||||
CONFIG_BACKLIGHT_LCD_SUPPORT=y
|
CONFIG_BACKLIGHT_LCD_SUPPORT=y
|
||||||
# CONFIG_LCD_CLASS_DEVICE is not set
|
# CONFIG_LCD_CLASS_DEVICE is not set
|
||||||
|
@ -202,7 +203,7 @@ CONFIG_TEGRA20_APB_DMA=y
|
||||||
CONFIG_STAGING=y
|
CONFIG_STAGING=y
|
||||||
CONFIG_SENSORS_ISL29018=y
|
CONFIG_SENSORS_ISL29018=y
|
||||||
CONFIG_SENSORS_ISL29028=y
|
CONFIG_SENSORS_ISL29028=y
|
||||||
CONFIG_SENSORS_AK8975=y
|
CONFIG_AK8975=y
|
||||||
CONFIG_MFD_NVEC=y
|
CONFIG_MFD_NVEC=y
|
||||||
CONFIG_KEYBOARD_NVEC=y
|
CONFIG_KEYBOARD_NVEC=y
|
||||||
CONFIG_SERIO_NVEC_PS2=y
|
CONFIG_SERIO_NVEC_PS2=y
|
||||||
|
|
|
@ -195,6 +195,7 @@ ENTRY(sha1_block_data_order)
|
||||||
add r3,r3,r10 @ E+=F_00_19(B,C,D)
|
add r3,r3,r10 @ E+=F_00_19(B,C,D)
|
||||||
cmp r14,sp
|
cmp r14,sp
|
||||||
bne .L_00_15 @ [((11+4)*5+2)*3]
|
bne .L_00_15 @ [((11+4)*5+2)*3]
|
||||||
|
sub sp,sp,#25*4
|
||||||
#if __ARM_ARCH__<7
|
#if __ARM_ARCH__<7
|
||||||
ldrb r10,[r1,#2]
|
ldrb r10,[r1,#2]
|
||||||
ldrb r9,[r1,#3]
|
ldrb r9,[r1,#3]
|
||||||
|
@ -290,7 +291,6 @@ ENTRY(sha1_block_data_order)
|
||||||
add r3,r3,r10 @ E+=F_00_19(B,C,D)
|
add r3,r3,r10 @ E+=F_00_19(B,C,D)
|
||||||
|
|
||||||
ldr r8,.LK_20_39 @ [+15+16*4]
|
ldr r8,.LK_20_39 @ [+15+16*4]
|
||||||
sub sp,sp,#25*4
|
|
||||||
cmn sp,#0 @ [+3], clear carry to denote 20_39
|
cmn sp,#0 @ [+3], clear carry to denote 20_39
|
||||||
.L_20_39_or_60_79:
|
.L_20_39_or_60_79:
|
||||||
ldr r9,[r14,#15*4]
|
ldr r9,[r14,#15*4]
|
||||||
|
|
|
@ -320,9 +320,7 @@ static inline void flush_anon_page(struct vm_area_struct *vma,
|
||||||
}
|
}
|
||||||
|
|
||||||
#define ARCH_HAS_FLUSH_KERNEL_DCACHE_PAGE
|
#define ARCH_HAS_FLUSH_KERNEL_DCACHE_PAGE
|
||||||
static inline void flush_kernel_dcache_page(struct page *page)
|
extern void flush_kernel_dcache_page(struct page *);
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
#define flush_dcache_mmap_lock(mapping) \
|
#define flush_dcache_mmap_lock(mapping) \
|
||||||
spin_lock_irq(&(mapping)->tree_lock)
|
spin_lock_irq(&(mapping)->tree_lock)
|
||||||
|
|
|
@ -32,6 +32,8 @@
|
||||||
|
|
||||||
#define MPIDR_HWID_BITMASK 0xFFFFFF
|
#define MPIDR_HWID_BITMASK 0xFFFFFF
|
||||||
|
|
||||||
|
#define MPIDR_INVALID (~MPIDR_HWID_BITMASK)
|
||||||
|
|
||||||
#define MPIDR_LEVEL_BITS 8
|
#define MPIDR_LEVEL_BITS 8
|
||||||
#define MPIDR_LEVEL_MASK ((1 << MPIDR_LEVEL_BITS) - 1)
|
#define MPIDR_LEVEL_MASK ((1 << MPIDR_LEVEL_BITS) - 1)
|
||||||
|
|
||||||
|
|
|
@ -230,6 +230,15 @@
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_CPU_PJ4B
|
||||||
|
# ifdef CPU_NAME
|
||||||
|
# undef MULTI_CPU
|
||||||
|
# define MULTI_CPU
|
||||||
|
# else
|
||||||
|
# define CPU_NAME cpu_pj4b
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef MULTI_CPU
|
#ifndef MULTI_CPU
|
||||||
#define cpu_proc_init __glue(CPU_NAME,_proc_init)
|
#define cpu_proc_init __glue(CPU_NAME,_proc_init)
|
||||||
#define cpu_proc_fin __glue(CPU_NAME,_proc_fin)
|
#define cpu_proc_fin __glue(CPU_NAME,_proc_fin)
|
||||||
|
|
|
@ -30,8 +30,15 @@ static inline void set_my_cpu_offset(unsigned long off)
|
||||||
static inline unsigned long __my_cpu_offset(void)
|
static inline unsigned long __my_cpu_offset(void)
|
||||||
{
|
{
|
||||||
unsigned long off;
|
unsigned long off;
|
||||||
/* Read TPIDRPRW */
|
register unsigned long *sp asm ("sp");
|
||||||
asm("mrc p15, 0, %0, c13, c0, 4" : "=r" (off) : : "memory");
|
|
||||||
|
/*
|
||||||
|
* Read TPIDRPRW.
|
||||||
|
* We want to allow caching the value, so avoid using volatile and
|
||||||
|
* instead use a fake stack read to hazard against barrier().
|
||||||
|
*/
|
||||||
|
asm("mrc p15, 0, %0, c13, c0, 4" : "=r" (off) : "Q" (*sp));
|
||||||
|
|
||||||
return off;
|
return off;
|
||||||
}
|
}
|
||||||
#define __my_cpu_offset __my_cpu_offset()
|
#define __my_cpu_offset __my_cpu_offset()
|
||||||
|
|
|
@ -49,7 +49,7 @@ static inline int cache_ops_need_broadcast(void)
|
||||||
/*
|
/*
|
||||||
* Logical CPU mapping.
|
* Logical CPU mapping.
|
||||||
*/
|
*/
|
||||||
extern int __cpu_logical_map[];
|
extern u32 __cpu_logical_map[];
|
||||||
#define cpu_logical_map(cpu) __cpu_logical_map[cpu]
|
#define cpu_logical_map(cpu) __cpu_logical_map[cpu]
|
||||||
/*
|
/*
|
||||||
* Retrieve logical cpu index corresponding to a given MPIDR[23:0]
|
* Retrieve logical cpu index corresponding to a given MPIDR[23:0]
|
||||||
|
|
|
@ -33,18 +33,6 @@
|
||||||
#include <asm/pgalloc.h>
|
#include <asm/pgalloc.h>
|
||||||
#include <asm/tlbflush.h>
|
#include <asm/tlbflush.h>
|
||||||
|
|
||||||
/*
|
|
||||||
* We need to delay page freeing for SMP as other CPUs can access pages
|
|
||||||
* which have been removed but not yet had their TLB entries invalidated.
|
|
||||||
* Also, as ARMv7 speculative prefetch can drag new entries into the TLB,
|
|
||||||
* we need to apply this same delaying tactic to ensure correct operation.
|
|
||||||
*/
|
|
||||||
#if defined(CONFIG_SMP) || defined(CONFIG_CPU_32v7)
|
|
||||||
#define tlb_fast_mode(tlb) 0
|
|
||||||
#else
|
|
||||||
#define tlb_fast_mode(tlb) 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define MMU_GATHER_BUNDLE 8
|
#define MMU_GATHER_BUNDLE 8
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -112,12 +100,10 @@ static inline void __tlb_alloc_page(struct mmu_gather *tlb)
|
||||||
static inline void tlb_flush_mmu(struct mmu_gather *tlb)
|
static inline void tlb_flush_mmu(struct mmu_gather *tlb)
|
||||||
{
|
{
|
||||||
tlb_flush(tlb);
|
tlb_flush(tlb);
|
||||||
if (!tlb_fast_mode(tlb)) {
|
free_pages_and_swap_cache(tlb->pages, tlb->nr);
|
||||||
free_pages_and_swap_cache(tlb->pages, tlb->nr);
|
tlb->nr = 0;
|
||||||
tlb->nr = 0;
|
if (tlb->pages == tlb->local)
|
||||||
if (tlb->pages == tlb->local)
|
__tlb_alloc_page(tlb);
|
||||||
__tlb_alloc_page(tlb);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
|
@ -178,11 +164,6 @@ tlb_end_vma(struct mmu_gather *tlb, struct vm_area_struct *vma)
|
||||||
|
|
||||||
static inline int __tlb_remove_page(struct mmu_gather *tlb, struct page *page)
|
static inline int __tlb_remove_page(struct mmu_gather *tlb, struct page *page)
|
||||||
{
|
{
|
||||||
if (tlb_fast_mode(tlb)) {
|
|
||||||
free_page_and_swap_cache(page);
|
|
||||||
return 1; /* avoid calling tlb_flush_mmu */
|
|
||||||
}
|
|
||||||
|
|
||||||
tlb->pages[tlb->nr++] = page;
|
tlb->pages[tlb->nr++] = page;
|
||||||
VM_BUG_ON(tlb->nr > tlb->max);
|
VM_BUG_ON(tlb->nr > tlb->max);
|
||||||
return tlb->max - tlb->nr;
|
return tlb->max - tlb->nr;
|
||||||
|
|
|
@ -24,9 +24,9 @@
|
||||||
#define U8500_UART0_PHYS_BASE (0x80120000)
|
#define U8500_UART0_PHYS_BASE (0x80120000)
|
||||||
#define U8500_UART1_PHYS_BASE (0x80121000)
|
#define U8500_UART1_PHYS_BASE (0x80121000)
|
||||||
#define U8500_UART2_PHYS_BASE (0x80007000)
|
#define U8500_UART2_PHYS_BASE (0x80007000)
|
||||||
#define U8500_UART0_VIRT_BASE (0xa8120000)
|
#define U8500_UART0_VIRT_BASE (0xf8120000)
|
||||||
#define U8500_UART1_VIRT_BASE (0xa8121000)
|
#define U8500_UART1_VIRT_BASE (0xf8121000)
|
||||||
#define U8500_UART2_VIRT_BASE (0xa8007000)
|
#define U8500_UART2_VIRT_BASE (0xf8007000)
|
||||||
#define __UX500_PHYS_UART(n) U8500_UART##n##_PHYS_BASE
|
#define __UX500_PHYS_UART(n) U8500_UART##n##_PHYS_BASE
|
||||||
#define __UX500_VIRT_UART(n) U8500_UART##n##_VIRT_BASE
|
#define __UX500_VIRT_UART(n) U8500_UART##n##_VIRT_BASE
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -82,7 +82,7 @@ void __init arm_dt_init_cpu_maps(void)
|
||||||
u32 i, j, cpuidx = 1;
|
u32 i, j, cpuidx = 1;
|
||||||
u32 mpidr = is_smp() ? read_cpuid_mpidr() & MPIDR_HWID_BITMASK : 0;
|
u32 mpidr = is_smp() ? read_cpuid_mpidr() & MPIDR_HWID_BITMASK : 0;
|
||||||
|
|
||||||
u32 tmp_map[NR_CPUS] = { [0 ... NR_CPUS-1] = UINT_MAX };
|
u32 tmp_map[NR_CPUS] = { [0 ... NR_CPUS-1] = MPIDR_INVALID };
|
||||||
bool bootcpu_valid = false;
|
bool bootcpu_valid = false;
|
||||||
cpus = of_find_node_by_path("/cpus");
|
cpus = of_find_node_by_path("/cpus");
|
||||||
|
|
||||||
|
@ -92,6 +92,9 @@ void __init arm_dt_init_cpu_maps(void)
|
||||||
for_each_child_of_node(cpus, cpu) {
|
for_each_child_of_node(cpus, cpu) {
|
||||||
u32 hwid;
|
u32 hwid;
|
||||||
|
|
||||||
|
if (of_node_cmp(cpu->type, "cpu"))
|
||||||
|
continue;
|
||||||
|
|
||||||
pr_debug(" * %s...\n", cpu->full_name);
|
pr_debug(" * %s...\n", cpu->full_name);
|
||||||
/*
|
/*
|
||||||
* A device tree containing CPU nodes with missing "reg"
|
* A device tree containing CPU nodes with missing "reg"
|
||||||
|
@ -149,9 +152,10 @@ void __init arm_dt_init_cpu_maps(void)
|
||||||
tmp_map[i] = hwid;
|
tmp_map[i] = hwid;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (WARN(!bootcpu_valid, "DT missing boot CPU MPIDR[23:0], "
|
if (!bootcpu_valid) {
|
||||||
"fall back to default cpu_logical_map\n"))
|
pr_warn("DT missing boot CPU MPIDR[23:0], fall back to default cpu_logical_map\n");
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Since the boot CPU node contains proper data, and all nodes have
|
* Since the boot CPU node contains proper data, and all nodes have
|
||||||
|
|
|
@ -134,6 +134,10 @@ void machine_kexec(struct kimage *image)
|
||||||
unsigned long reboot_code_buffer_phys;
|
unsigned long reboot_code_buffer_phys;
|
||||||
void *reboot_code_buffer;
|
void *reboot_code_buffer;
|
||||||
|
|
||||||
|
if (num_online_cpus() > 1) {
|
||||||
|
pr_err("kexec: error: multiple CPUs still online\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
page_list = image->head & PAGE_MASK;
|
page_list = image->head & PAGE_MASK;
|
||||||
|
|
||||||
|
|
|
@ -184,30 +184,61 @@ int __init reboot_setup(char *str)
|
||||||
|
|
||||||
__setup("reboot=", reboot_setup);
|
__setup("reboot=", reboot_setup);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Called by kexec, immediately prior to machine_kexec().
|
||||||
|
*
|
||||||
|
* This must completely disable all secondary CPUs; simply causing those CPUs
|
||||||
|
* to execute e.g. a RAM-based pin loop is not sufficient. This allows the
|
||||||
|
* kexec'd kernel to use any and all RAM as it sees fit, without having to
|
||||||
|
* avoid any code or data used by any SW CPU pin loop. The CPU hotplug
|
||||||
|
* functionality embodied in disable_nonboot_cpus() to achieve this.
|
||||||
|
*/
|
||||||
void machine_shutdown(void)
|
void machine_shutdown(void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_SMP
|
disable_nonboot_cpus();
|
||||||
smp_send_stop();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Halting simply requires that the secondary CPUs stop performing any
|
||||||
|
* activity (executing tasks, handling interrupts). smp_send_stop()
|
||||||
|
* achieves this.
|
||||||
|
*/
|
||||||
void machine_halt(void)
|
void machine_halt(void)
|
||||||
{
|
{
|
||||||
machine_shutdown();
|
smp_send_stop();
|
||||||
|
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
while (1);
|
while (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Power-off simply requires that the secondary CPUs stop performing any
|
||||||
|
* activity (executing tasks, handling interrupts). smp_send_stop()
|
||||||
|
* achieves this. When the system power is turned off, it will take all CPUs
|
||||||
|
* with it.
|
||||||
|
*/
|
||||||
void machine_power_off(void)
|
void machine_power_off(void)
|
||||||
{
|
{
|
||||||
machine_shutdown();
|
smp_send_stop();
|
||||||
|
|
||||||
if (pm_power_off)
|
if (pm_power_off)
|
||||||
pm_power_off();
|
pm_power_off();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Restart requires that the secondary CPUs stop performing any activity
|
||||||
|
* while the primary CPU resets the system. Systems with a single CPU can
|
||||||
|
* use soft_restart() as their machine descriptor's .restart hook, since that
|
||||||
|
* will cause the only available CPU to reset. Systems with multiple CPUs must
|
||||||
|
* provide a HW restart implementation, to ensure that all CPUs reset at once.
|
||||||
|
* This is required so that any code running after reset on the primary CPU
|
||||||
|
* doesn't have to co-ordinate with other CPUs to ensure they aren't still
|
||||||
|
* executing pre-reset code, and using RAM that the primary CPU's code wishes
|
||||||
|
* to use. Implementing such co-ordination would be essentially impossible.
|
||||||
|
*/
|
||||||
void machine_restart(char *cmd)
|
void machine_restart(char *cmd)
|
||||||
{
|
{
|
||||||
machine_shutdown();
|
smp_send_stop();
|
||||||
|
|
||||||
arm_pm_restart(reboot_mode, cmd);
|
arm_pm_restart(reboot_mode, cmd);
|
||||||
|
|
||||||
|
@ -411,7 +442,6 @@ static struct vm_area_struct gate_vma = {
|
||||||
.vm_start = 0xffff0000,
|
.vm_start = 0xffff0000,
|
||||||
.vm_end = 0xffff0000 + PAGE_SIZE,
|
.vm_end = 0xffff0000 + PAGE_SIZE,
|
||||||
.vm_flags = VM_READ | VM_EXEC | VM_MAYREAD | VM_MAYEXEC,
|
.vm_flags = VM_READ | VM_EXEC | VM_MAYREAD | VM_MAYEXEC,
|
||||||
.vm_mm = &init_mm,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init gate_vma_init(void)
|
static int __init gate_vma_init(void)
|
||||||
|
|
|
@ -444,7 +444,7 @@ void notrace cpu_init(void)
|
||||||
: "r14");
|
: "r14");
|
||||||
}
|
}
|
||||||
|
|
||||||
int __cpu_logical_map[NR_CPUS];
|
u32 __cpu_logical_map[NR_CPUS] = { [0 ... NR_CPUS-1] = MPIDR_INVALID };
|
||||||
|
|
||||||
void __init smp_setup_processor_id(void)
|
void __init smp_setup_processor_id(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -251,7 +251,7 @@ void __ref cpu_die(void)
|
||||||
* this returns, power and/or clocks can be removed at any point
|
* this returns, power and/or clocks can be removed at any point
|
||||||
* from this CPU and its cache by platform_cpu_kill().
|
* from this CPU and its cache by platform_cpu_kill().
|
||||||
*/
|
*/
|
||||||
RCU_NONIDLE(complete(&cpu_died));
|
complete(&cpu_died);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Ensure that the cache lines associated with that completion are
|
* Ensure that the cache lines associated with that completion are
|
||||||
|
@ -651,17 +651,6 @@ void smp_send_reschedule(int cpu)
|
||||||
smp_cross_call(cpumask_of(cpu), IPI_RESCHEDULE);
|
smp_cross_call(cpumask_of(cpu), IPI_RESCHEDULE);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_HOTPLUG_CPU
|
|
||||||
static void smp_kill_cpus(cpumask_t *mask)
|
|
||||||
{
|
|
||||||
unsigned int cpu;
|
|
||||||
for_each_cpu(cpu, mask)
|
|
||||||
platform_cpu_kill(cpu);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
static void smp_kill_cpus(cpumask_t *mask) { }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void smp_send_stop(void)
|
void smp_send_stop(void)
|
||||||
{
|
{
|
||||||
unsigned long timeout;
|
unsigned long timeout;
|
||||||
|
@ -679,8 +668,6 @@ void smp_send_stop(void)
|
||||||
|
|
||||||
if (num_online_cpus() > 1)
|
if (num_online_cpus() > 1)
|
||||||
pr_warning("SMP: failed to stop secondary CPUs\n");
|
pr_warning("SMP: failed to stop secondary CPUs\n");
|
||||||
|
|
||||||
smp_kill_cpus(&mask);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
|
|
||||||
#include <linux/cpu.h>
|
#include <linux/cpu.h>
|
||||||
#include <linux/cpumask.h>
|
#include <linux/cpumask.h>
|
||||||
|
#include <linux/export.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/percpu.h>
|
#include <linux/percpu.h>
|
||||||
#include <linux/node.h>
|
#include <linux/node.h>
|
||||||
|
@ -200,6 +201,7 @@ static inline void update_cpu_power(unsigned int cpuid, unsigned int mpidr) {}
|
||||||
* cpu topology table
|
* cpu topology table
|
||||||
*/
|
*/
|
||||||
struct cputopo_arm cpu_topology[NR_CPUS];
|
struct cputopo_arm cpu_topology[NR_CPUS];
|
||||||
|
EXPORT_SYMBOL_GPL(cpu_topology);
|
||||||
|
|
||||||
const struct cpumask *cpu_coregroup_mask(int cpu)
|
const struct cpumask *cpu_coregroup_mask(int cpu)
|
||||||
{
|
{
|
||||||
|
|
|
@ -492,6 +492,11 @@ static void vcpu_pause(struct kvm_vcpu *vcpu)
|
||||||
wait_event_interruptible(*wq, !vcpu->arch.pause);
|
wait_event_interruptible(*wq, !vcpu->arch.pause);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int kvm_vcpu_initialized(struct kvm_vcpu *vcpu)
|
||||||
|
{
|
||||||
|
return vcpu->arch.target >= 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* kvm_arch_vcpu_ioctl_run - the main VCPU run function to execute guest code
|
* kvm_arch_vcpu_ioctl_run - the main VCPU run function to execute guest code
|
||||||
* @vcpu: The VCPU pointer
|
* @vcpu: The VCPU pointer
|
||||||
|
@ -508,8 +513,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)
|
||||||
int ret;
|
int ret;
|
||||||
sigset_t sigsaved;
|
sigset_t sigsaved;
|
||||||
|
|
||||||
/* Make sure they initialize the vcpu with KVM_ARM_VCPU_INIT */
|
if (unlikely(!kvm_vcpu_initialized(vcpu)))
|
||||||
if (unlikely(vcpu->arch.target < 0))
|
|
||||||
return -ENOEXEC;
|
return -ENOEXEC;
|
||||||
|
|
||||||
ret = kvm_vcpu_first_run_init(vcpu);
|
ret = kvm_vcpu_first_run_init(vcpu);
|
||||||
|
@ -710,6 +714,10 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
|
||||||
case KVM_SET_ONE_REG:
|
case KVM_SET_ONE_REG:
|
||||||
case KVM_GET_ONE_REG: {
|
case KVM_GET_ONE_REG: {
|
||||||
struct kvm_one_reg reg;
|
struct kvm_one_reg reg;
|
||||||
|
|
||||||
|
if (unlikely(!kvm_vcpu_initialized(vcpu)))
|
||||||
|
return -ENOEXEC;
|
||||||
|
|
||||||
if (copy_from_user(®, argp, sizeof(reg)))
|
if (copy_from_user(®, argp, sizeof(reg)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
if (ioctl == KVM_SET_ONE_REG)
|
if (ioctl == KVM_SET_ONE_REG)
|
||||||
|
@ -722,6 +730,9 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
|
||||||
struct kvm_reg_list reg_list;
|
struct kvm_reg_list reg_list;
|
||||||
unsigned n;
|
unsigned n;
|
||||||
|
|
||||||
|
if (unlikely(!kvm_vcpu_initialized(vcpu)))
|
||||||
|
return -ENOEXEC;
|
||||||
|
|
||||||
if (copy_from_user(®_list, user_list, sizeof(reg_list)))
|
if (copy_from_user(®_list, user_list, sizeof(reg_list)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
n = reg_list.n;
|
n = reg_list.n;
|
||||||
|
|
|
@ -43,7 +43,14 @@ static phys_addr_t hyp_idmap_vector;
|
||||||
|
|
||||||
static void kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa)
|
static void kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa)
|
||||||
{
|
{
|
||||||
kvm_call_hyp(__kvm_tlb_flush_vmid_ipa, kvm, ipa);
|
/*
|
||||||
|
* This function also gets called when dealing with HYP page
|
||||||
|
* tables. As HYP doesn't have an associated struct kvm (and
|
||||||
|
* the HYP page tables are fairly static), we don't do
|
||||||
|
* anything there.
|
||||||
|
*/
|
||||||
|
if (kvm)
|
||||||
|
kvm_call_hyp(__kvm_tlb_flush_vmid_ipa, kvm, ipa);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mmu_topup_memory_cache(struct kvm_mmu_memory_cache *cache,
|
static int mmu_topup_memory_cache(struct kvm_mmu_memory_cache *cache,
|
||||||
|
@ -78,18 +85,20 @@ static void *mmu_memory_cache_alloc(struct kvm_mmu_memory_cache *mc)
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void clear_pud_entry(pud_t *pud)
|
static void clear_pud_entry(struct kvm *kvm, pud_t *pud, phys_addr_t addr)
|
||||||
{
|
{
|
||||||
pmd_t *pmd_table = pmd_offset(pud, 0);
|
pmd_t *pmd_table = pmd_offset(pud, 0);
|
||||||
pud_clear(pud);
|
pud_clear(pud);
|
||||||
|
kvm_tlb_flush_vmid_ipa(kvm, addr);
|
||||||
pmd_free(NULL, pmd_table);
|
pmd_free(NULL, pmd_table);
|
||||||
put_page(virt_to_page(pud));
|
put_page(virt_to_page(pud));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void clear_pmd_entry(pmd_t *pmd)
|
static void clear_pmd_entry(struct kvm *kvm, pmd_t *pmd, phys_addr_t addr)
|
||||||
{
|
{
|
||||||
pte_t *pte_table = pte_offset_kernel(pmd, 0);
|
pte_t *pte_table = pte_offset_kernel(pmd, 0);
|
||||||
pmd_clear(pmd);
|
pmd_clear(pmd);
|
||||||
|
kvm_tlb_flush_vmid_ipa(kvm, addr);
|
||||||
pte_free_kernel(NULL, pte_table);
|
pte_free_kernel(NULL, pte_table);
|
||||||
put_page(virt_to_page(pmd));
|
put_page(virt_to_page(pmd));
|
||||||
}
|
}
|
||||||
|
@ -100,11 +109,12 @@ static bool pmd_empty(pmd_t *pmd)
|
||||||
return page_count(pmd_page) == 1;
|
return page_count(pmd_page) == 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void clear_pte_entry(pte_t *pte)
|
static void clear_pte_entry(struct kvm *kvm, pte_t *pte, phys_addr_t addr)
|
||||||
{
|
{
|
||||||
if (pte_present(*pte)) {
|
if (pte_present(*pte)) {
|
||||||
kvm_set_pte(pte, __pte(0));
|
kvm_set_pte(pte, __pte(0));
|
||||||
put_page(virt_to_page(pte));
|
put_page(virt_to_page(pte));
|
||||||
|
kvm_tlb_flush_vmid_ipa(kvm, addr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -114,7 +124,8 @@ static bool pte_empty(pte_t *pte)
|
||||||
return page_count(pte_page) == 1;
|
return page_count(pte_page) == 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void unmap_range(pgd_t *pgdp, unsigned long long start, u64 size)
|
static void unmap_range(struct kvm *kvm, pgd_t *pgdp,
|
||||||
|
unsigned long long start, u64 size)
|
||||||
{
|
{
|
||||||
pgd_t *pgd;
|
pgd_t *pgd;
|
||||||
pud_t *pud;
|
pud_t *pud;
|
||||||
|
@ -138,15 +149,15 @@ static void unmap_range(pgd_t *pgdp, unsigned long long start, u64 size)
|
||||||
}
|
}
|
||||||
|
|
||||||
pte = pte_offset_kernel(pmd, addr);
|
pte = pte_offset_kernel(pmd, addr);
|
||||||
clear_pte_entry(pte);
|
clear_pte_entry(kvm, pte, addr);
|
||||||
range = PAGE_SIZE;
|
range = PAGE_SIZE;
|
||||||
|
|
||||||
/* If we emptied the pte, walk back up the ladder */
|
/* If we emptied the pte, walk back up the ladder */
|
||||||
if (pte_empty(pte)) {
|
if (pte_empty(pte)) {
|
||||||
clear_pmd_entry(pmd);
|
clear_pmd_entry(kvm, pmd, addr);
|
||||||
range = PMD_SIZE;
|
range = PMD_SIZE;
|
||||||
if (pmd_empty(pmd)) {
|
if (pmd_empty(pmd)) {
|
||||||
clear_pud_entry(pud);
|
clear_pud_entry(kvm, pud, addr);
|
||||||
range = PUD_SIZE;
|
range = PUD_SIZE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -165,14 +176,14 @@ void free_boot_hyp_pgd(void)
|
||||||
mutex_lock(&kvm_hyp_pgd_mutex);
|
mutex_lock(&kvm_hyp_pgd_mutex);
|
||||||
|
|
||||||
if (boot_hyp_pgd) {
|
if (boot_hyp_pgd) {
|
||||||
unmap_range(boot_hyp_pgd, hyp_idmap_start, PAGE_SIZE);
|
unmap_range(NULL, boot_hyp_pgd, hyp_idmap_start, PAGE_SIZE);
|
||||||
unmap_range(boot_hyp_pgd, TRAMPOLINE_VA, PAGE_SIZE);
|
unmap_range(NULL, boot_hyp_pgd, TRAMPOLINE_VA, PAGE_SIZE);
|
||||||
kfree(boot_hyp_pgd);
|
kfree(boot_hyp_pgd);
|
||||||
boot_hyp_pgd = NULL;
|
boot_hyp_pgd = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hyp_pgd)
|
if (hyp_pgd)
|
||||||
unmap_range(hyp_pgd, TRAMPOLINE_VA, PAGE_SIZE);
|
unmap_range(NULL, hyp_pgd, TRAMPOLINE_VA, PAGE_SIZE);
|
||||||
|
|
||||||
kfree(init_bounce_page);
|
kfree(init_bounce_page);
|
||||||
init_bounce_page = NULL;
|
init_bounce_page = NULL;
|
||||||
|
@ -200,9 +211,10 @@ void free_hyp_pgds(void)
|
||||||
|
|
||||||
if (hyp_pgd) {
|
if (hyp_pgd) {
|
||||||
for (addr = PAGE_OFFSET; virt_addr_valid(addr); addr += PGDIR_SIZE)
|
for (addr = PAGE_OFFSET; virt_addr_valid(addr); addr += PGDIR_SIZE)
|
||||||
unmap_range(hyp_pgd, KERN_TO_HYP(addr), PGDIR_SIZE);
|
unmap_range(NULL, hyp_pgd, KERN_TO_HYP(addr), PGDIR_SIZE);
|
||||||
for (addr = VMALLOC_START; is_vmalloc_addr((void*)addr); addr += PGDIR_SIZE)
|
for (addr = VMALLOC_START; is_vmalloc_addr((void*)addr); addr += PGDIR_SIZE)
|
||||||
unmap_range(hyp_pgd, KERN_TO_HYP(addr), PGDIR_SIZE);
|
unmap_range(NULL, hyp_pgd, KERN_TO_HYP(addr), PGDIR_SIZE);
|
||||||
|
|
||||||
kfree(hyp_pgd);
|
kfree(hyp_pgd);
|
||||||
hyp_pgd = NULL;
|
hyp_pgd = NULL;
|
||||||
}
|
}
|
||||||
|
@ -393,7 +405,7 @@ int kvm_alloc_stage2_pgd(struct kvm *kvm)
|
||||||
*/
|
*/
|
||||||
static void unmap_stage2_range(struct kvm *kvm, phys_addr_t start, u64 size)
|
static void unmap_stage2_range(struct kvm *kvm, phys_addr_t start, u64 size)
|
||||||
{
|
{
|
||||||
unmap_range(kvm->arch.pgd, start, size);
|
unmap_range(kvm, kvm->arch.pgd, start, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -675,7 +687,6 @@ static void handle_hva_to_gpa(struct kvm *kvm,
|
||||||
static void kvm_unmap_hva_handler(struct kvm *kvm, gpa_t gpa, void *data)
|
static void kvm_unmap_hva_handler(struct kvm *kvm, gpa_t gpa, void *data)
|
||||||
{
|
{
|
||||||
unmap_stage2_range(kvm, gpa, PAGE_SIZE);
|
unmap_stage2_range(kvm, gpa, PAGE_SIZE);
|
||||||
kvm_tlb_flush_vmid_ipa(kvm, gpa);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int kvm_unmap_hva(struct kvm *kvm, unsigned long hva)
|
int kvm_unmap_hva(struct kvm *kvm, unsigned long hva)
|
||||||
|
|
|
@ -174,6 +174,7 @@ clkevt32k_next_event(unsigned long delta, struct clock_event_device *dev)
|
||||||
static struct clock_event_device clkevt = {
|
static struct clock_event_device clkevt = {
|
||||||
.name = "at91_tick",
|
.name = "at91_tick",
|
||||||
.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
|
.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
|
||||||
|
.shift = 32,
|
||||||
.rating = 150,
|
.rating = 150,
|
||||||
.set_next_event = clkevt32k_next_event,
|
.set_next_event = clkevt32k_next_event,
|
||||||
.set_mode = clkevt32k_mode,
|
.set_mode = clkevt32k_mode,
|
||||||
|
@ -264,9 +265,11 @@ void __init at91rm9200_timer_init(void)
|
||||||
at91_st_write(AT91_ST_RTMR, 1);
|
at91_st_write(AT91_ST_RTMR, 1);
|
||||||
|
|
||||||
/* Setup timer clockevent, with minimum of two ticks (important!!) */
|
/* Setup timer clockevent, with minimum of two ticks (important!!) */
|
||||||
|
clkevt.mult = div_sc(AT91_SLOW_CLOCK, NSEC_PER_SEC, clkevt.shift);
|
||||||
|
clkevt.max_delta_ns = clockevent_delta2ns(AT91_ST_ALMV, &clkevt);
|
||||||
|
clkevt.min_delta_ns = clockevent_delta2ns(2, &clkevt) + 1;
|
||||||
clkevt.cpumask = cpumask_of(0);
|
clkevt.cpumask = cpumask_of(0);
|
||||||
clockevents_config_and_register(&clkevt, AT91_SLOW_CLOCK,
|
clockevents_register_device(&clkevt);
|
||||||
2, AT91_ST_ALMV);
|
|
||||||
|
|
||||||
/* register clocksource */
|
/* register clocksource */
|
||||||
clocksource_register_hz(&clk32k, AT91_SLOW_CLOCK);
|
clocksource_register_hz(&clk32k, AT91_SLOW_CLOCK);
|
||||||
|
|
|
@ -223,13 +223,7 @@ static void __init at91sam9n12_map_io(void)
|
||||||
at91_init_sram(0, AT91SAM9N12_SRAM_BASE, AT91SAM9N12_SRAM_SIZE);
|
at91_init_sram(0, AT91SAM9N12_SRAM_BASE, AT91SAM9N12_SRAM_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init at91sam9n12_initialize(void)
|
|
||||||
{
|
|
||||||
at91_extern_irq = (1 << AT91SAM9N12_ID_IRQ0);
|
|
||||||
}
|
|
||||||
|
|
||||||
AT91_SOC_START(at91sam9n12)
|
AT91_SOC_START(at91sam9n12)
|
||||||
.map_io = at91sam9n12_map_io,
|
.map_io = at91sam9n12_map_io,
|
||||||
.register_clocks = at91sam9n12_register_clocks,
|
.register_clocks = at91sam9n12_register_clocks,
|
||||||
.init = at91sam9n12_initialize,
|
|
||||||
AT91_SOC_END
|
AT91_SOC_END
|
||||||
|
|
|
@ -179,9 +179,9 @@ extern void __iomem *at91_pmc_base;
|
||||||
#define AT91_PMC_PCR_CMD (0x1 << 12) /* Command (read=0, write=1) */
|
#define AT91_PMC_PCR_CMD (0x1 << 12) /* Command (read=0, write=1) */
|
||||||
#define AT91_PMC_PCR_DIV(n) ((n) << 16) /* Divisor Value */
|
#define AT91_PMC_PCR_DIV(n) ((n) << 16) /* Divisor Value */
|
||||||
#define AT91_PMC_PCR_DIV0 0x0 /* Peripheral clock is MCK */
|
#define AT91_PMC_PCR_DIV0 0x0 /* Peripheral clock is MCK */
|
||||||
#define AT91_PMC_PCR_DIV2 0x2 /* Peripheral clock is MCK/2 */
|
#define AT91_PMC_PCR_DIV2 0x1 /* Peripheral clock is MCK/2 */
|
||||||
#define AT91_PMC_PCR_DIV4 0x4 /* Peripheral clock is MCK/4 */
|
#define AT91_PMC_PCR_DIV4 0x2 /* Peripheral clock is MCK/4 */
|
||||||
#define AT91_PMC_PCR_DIV8 0x8 /* Peripheral clock is MCK/8 */
|
#define AT91_PMC_PCR_DIV8 0x3 /* Peripheral clock is MCK/8 */
|
||||||
#define AT91_PMC_PCR_EN (0x1 << 28) /* Enable */
|
#define AT91_PMC_PCR_EN (0x1 << 28) /* Enable */
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -250,6 +250,7 @@ config MACH_ARMLEX4210
|
||||||
config MACH_UNIVERSAL_C210
|
config MACH_UNIVERSAL_C210
|
||||||
bool "Mobile UNIVERSAL_C210 Board"
|
bool "Mobile UNIVERSAL_C210 Board"
|
||||||
select CLKSRC_MMIO
|
select CLKSRC_MMIO
|
||||||
|
select CLKSRC_SAMSUNG_PWM
|
||||||
select CPU_EXYNOS4210
|
select CPU_EXYNOS4210
|
||||||
select EXYNOS4_SETUP_FIMC
|
select EXYNOS4_SETUP_FIMC
|
||||||
select EXYNOS4_SETUP_FIMD0
|
select EXYNOS4_SETUP_FIMD0
|
||||||
|
@ -281,7 +282,6 @@ config MACH_UNIVERSAL_C210
|
||||||
select S5P_DEV_TV
|
select S5P_DEV_TV
|
||||||
select S5P_GPIO_INT
|
select S5P_GPIO_INT
|
||||||
select S5P_SETUP_MIPIPHY
|
select S5P_SETUP_MIPIPHY
|
||||||
select SAMSUNG_HRT
|
|
||||||
help
|
help
|
||||||
Machine support for Samsung Mobile Universal S5PC210 Reference
|
Machine support for Samsung Mobile Universal S5PC210 Reference
|
||||||
Board.
|
Board.
|
||||||
|
@ -410,6 +410,7 @@ config MACH_EXYNOS4_DT
|
||||||
depends on ARCH_EXYNOS4
|
depends on ARCH_EXYNOS4
|
||||||
select ARM_AMBA
|
select ARM_AMBA
|
||||||
select CLKSRC_OF
|
select CLKSRC_OF
|
||||||
|
select CLKSRC_SAMSUNG_PWM if CPU_EXYNOS4210
|
||||||
select CPU_EXYNOS4210
|
select CPU_EXYNOS4210
|
||||||
select KEYBOARD_SAMSUNG if INPUT_KEYBOARD
|
select KEYBOARD_SAMSUNG if INPUT_KEYBOARD
|
||||||
select PINCTRL
|
select PINCTRL
|
||||||
|
|
|
@ -10,12 +10,14 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/bitops.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
#include <linux/irqchip.h>
|
#include <linux/irqchip.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
|
#include <clocksource/samsung_pwm.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/serial_core.h>
|
#include <linux/serial_core.h>
|
||||||
#include <linux/of.h>
|
#include <linux/of.h>
|
||||||
|
@ -302,6 +304,13 @@ static struct map_desc exynos5440_iodesc0[] __initdata = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct samsung_pwm_variant exynos4_pwm_variant = {
|
||||||
|
.bits = 32,
|
||||||
|
.div_base = 0,
|
||||||
|
.has_tint_cstat = true,
|
||||||
|
.tclk_mask = 0,
|
||||||
|
};
|
||||||
|
|
||||||
void exynos4_restart(char mode, const char *cmd)
|
void exynos4_restart(char mode, const char *cmd)
|
||||||
{
|
{
|
||||||
__raw_writel(0x1, S5P_SWRESET);
|
__raw_writel(0x1, S5P_SWRESET);
|
||||||
|
@ -317,9 +326,16 @@ void exynos5_restart(char mode, const char *cmd)
|
||||||
val = 0x1;
|
val = 0x1;
|
||||||
addr = EXYNOS_SWRESET;
|
addr = EXYNOS_SWRESET;
|
||||||
} else if (of_machine_is_compatible("samsung,exynos5440")) {
|
} else if (of_machine_is_compatible("samsung,exynos5440")) {
|
||||||
|
u32 status;
|
||||||
np = of_find_compatible_node(NULL, NULL, "samsung,exynos5440-clock");
|
np = of_find_compatible_node(NULL, NULL, "samsung,exynos5440-clock");
|
||||||
|
|
||||||
|
addr = of_iomap(np, 0) + 0xbc;
|
||||||
|
status = __raw_readl(addr);
|
||||||
|
|
||||||
addr = of_iomap(np, 0) + 0xcc;
|
addr = of_iomap(np, 0) + 0xcc;
|
||||||
val = (0xfff << 20) | (0x1 << 16);
|
val = __raw_readl(addr);
|
||||||
|
|
||||||
|
val = (val & 0xffff0000) | (status & 0xffff);
|
||||||
} else {
|
} else {
|
||||||
pr_err("%s: cannot support non-DT\n", __func__);
|
pr_err("%s: cannot support non-DT\n", __func__);
|
||||||
return;
|
return;
|
||||||
|
@ -370,6 +386,8 @@ int __init exynos_fdt_map_chipid(unsigned long node, const char *uname,
|
||||||
|
|
||||||
void __init exynos_init_io(struct map_desc *mach_desc, int size)
|
void __init exynos_init_io(struct map_desc *mach_desc, int size)
|
||||||
{
|
{
|
||||||
|
debug_ll_io_init();
|
||||||
|
|
||||||
#ifdef CONFIG_OF
|
#ifdef CONFIG_OF
|
||||||
if (initial_boot_params)
|
if (initial_boot_params)
|
||||||
of_scan_flat_dt(exynos_fdt_map_chipid, NULL);
|
of_scan_flat_dt(exynos_fdt_map_chipid, NULL);
|
||||||
|
@ -442,8 +460,20 @@ static void __init exynos5440_map_io(void)
|
||||||
iotable_init(exynos5440_iodesc0, ARRAY_SIZE(exynos5440_iodesc0));
|
iotable_init(exynos5440_iodesc0, ARRAY_SIZE(exynos5440_iodesc0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void __init exynos_set_timer_source(u8 channels)
|
||||||
|
{
|
||||||
|
exynos4_pwm_variant.output_mask = BIT(SAMSUNG_PWM_NUM) - 1;
|
||||||
|
exynos4_pwm_variant.output_mask &= ~channels;
|
||||||
|
}
|
||||||
|
|
||||||
void __init exynos_init_time(void)
|
void __init exynos_init_time(void)
|
||||||
{
|
{
|
||||||
|
unsigned int timer_irqs[SAMSUNG_PWM_NUM] = {
|
||||||
|
EXYNOS4_IRQ_TIMER0_VIC, EXYNOS4_IRQ_TIMER1_VIC,
|
||||||
|
EXYNOS4_IRQ_TIMER2_VIC, EXYNOS4_IRQ_TIMER3_VIC,
|
||||||
|
EXYNOS4_IRQ_TIMER4_VIC,
|
||||||
|
};
|
||||||
|
|
||||||
if (of_have_populated_dt()) {
|
if (of_have_populated_dt()) {
|
||||||
#ifdef CONFIG_OF
|
#ifdef CONFIG_OF
|
||||||
of_clk_init(NULL);
|
of_clk_init(NULL);
|
||||||
|
@ -455,7 +485,14 @@ void __init exynos_init_time(void)
|
||||||
exynos4_clk_init(NULL, !soc_is_exynos4210(), S5P_VA_CMU, readl(S5P_VA_CHIPID + 8) & 1);
|
exynos4_clk_init(NULL, !soc_is_exynos4210(), S5P_VA_CMU, readl(S5P_VA_CHIPID + 8) & 1);
|
||||||
exynos4_clk_register_fixed_ext(xxti_f, xusbxti_f);
|
exynos4_clk_register_fixed_ext(xxti_f, xusbxti_f);
|
||||||
#endif
|
#endif
|
||||||
mct_init(S5P_VA_SYSTIMER, EXYNOS4_IRQ_MCT_G0, EXYNOS4_IRQ_MCT_L0, EXYNOS4_IRQ_MCT_L1);
|
#ifdef CONFIG_CLKSRC_SAMSUNG_PWM
|
||||||
|
if (soc_is_exynos4210() && samsung_rev() == EXYNOS4210_REV_0)
|
||||||
|
samsung_pwm_clocksource_init(S3C_VA_TIMER,
|
||||||
|
timer_irqs, &exynos4_pwm_variant);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
mct_init(S5P_VA_SYSTIMER, EXYNOS4_IRQ_MCT_G0,
|
||||||
|
EXYNOS4_IRQ_MCT_L0, EXYNOS4_IRQ_MCT_L1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,8 @@ void exynos4_clk_register_fixed_ext(unsigned long, unsigned long);
|
||||||
|
|
||||||
void exynos_firmware_init(void);
|
void exynos_firmware_init(void);
|
||||||
|
|
||||||
|
void exynos_set_timer_source(u8 channels);
|
||||||
|
|
||||||
#ifdef CONFIG_PM_GENERIC_DOMAINS
|
#ifdef CONFIG_PM_GENERIC_DOMAINS
|
||||||
int exynos_pm_late_initcall(void);
|
int exynos_pm_late_initcall(void);
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -18,8 +18,15 @@
|
||||||
#ifndef __ASM_ARCH_PM_CORE_H
|
#ifndef __ASM_ARCH_PM_CORE_H
|
||||||
#define __ASM_ARCH_PM_CORE_H __FILE__
|
#define __ASM_ARCH_PM_CORE_H __FILE__
|
||||||
|
|
||||||
|
#include <linux/of.h>
|
||||||
#include <mach/regs-pmu.h>
|
#include <mach/regs-pmu.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_PINCTRL_EXYNOS
|
||||||
|
extern u32 exynos_get_eint_wake_mask(void);
|
||||||
|
#else
|
||||||
|
static inline u32 exynos_get_eint_wake_mask(void) { return 0xffffffff; }
|
||||||
|
#endif
|
||||||
|
|
||||||
static inline void s3c_pm_debug_init_uart(void)
|
static inline void s3c_pm_debug_init_uart(void)
|
||||||
{
|
{
|
||||||
/* nothing here yet */
|
/* nothing here yet */
|
||||||
|
@ -27,7 +34,12 @@ static inline void s3c_pm_debug_init_uart(void)
|
||||||
|
|
||||||
static inline void s3c_pm_arch_prepare_irqs(void)
|
static inline void s3c_pm_arch_prepare_irqs(void)
|
||||||
{
|
{
|
||||||
__raw_writel(s3c_irqwake_eintmask, S5P_EINT_WAKEUP_MASK);
|
u32 eintmask = s3c_irqwake_eintmask;
|
||||||
|
|
||||||
|
if (of_have_populated_dt())
|
||||||
|
eintmask = exynos_get_eint_wake_mask();
|
||||||
|
|
||||||
|
__raw_writel(eintmask, S5P_EINT_WAKEUP_MASK);
|
||||||
__raw_writel(s3c_irqwake_intmask & ~(1 << 31), S5P_WAKEUP_MASK);
|
__raw_writel(s3c_irqwake_intmask & ~(1 << 31), S5P_WAKEUP_MASK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,6 @@
|
||||||
#include <plat/mfc.h>
|
#include <plat/mfc.h>
|
||||||
#include <plat/sdhci.h>
|
#include <plat/sdhci.h>
|
||||||
#include <plat/fimc-core.h>
|
#include <plat/fimc-core.h>
|
||||||
#include <plat/samsung-time.h>
|
|
||||||
#include <plat/camport.h>
|
#include <plat/camport.h>
|
||||||
|
|
||||||
#include <mach/map.h>
|
#include <mach/map.h>
|
||||||
|
@ -1094,7 +1093,7 @@ static void __init universal_map_io(void)
|
||||||
{
|
{
|
||||||
exynos_init_io(NULL, 0);
|
exynos_init_io(NULL, 0);
|
||||||
s3c24xx_init_uarts(universal_uartcfgs, ARRAY_SIZE(universal_uartcfgs));
|
s3c24xx_init_uarts(universal_uartcfgs, ARRAY_SIZE(universal_uartcfgs));
|
||||||
samsung_set_timer_source(SAMSUNG_PWM2, SAMSUNG_PWM4);
|
exynos_set_timer_source(BIT(2) | BIT(4));
|
||||||
xxti_f = 0;
|
xxti_f = 0;
|
||||||
xusbxti_f = 24000000;
|
xusbxti_f = 24000000;
|
||||||
}
|
}
|
||||||
|
@ -1154,7 +1153,7 @@ MACHINE_START(UNIVERSAL_C210, "UNIVERSAL_C210")
|
||||||
.map_io = universal_map_io,
|
.map_io = universal_map_io,
|
||||||
.init_machine = universal_machine_init,
|
.init_machine = universal_machine_init,
|
||||||
.init_late = exynos_init_late,
|
.init_late = exynos_init_late,
|
||||||
.init_time = samsung_timer_init,
|
.init_time = exynos_init_time,
|
||||||
.reserve = &universal_reserve,
|
.reserve = &universal_reserve,
|
||||||
.restart = exynos4_restart,
|
.restart = exynos4_restart,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -177,17 +177,18 @@ int imx6q_set_lpm(enum mxc_cpu_pwr_mode mode)
|
||||||
static const char *step_sels[] = { "osc", "pll2_pfd2_396m", };
|
static const char *step_sels[] = { "osc", "pll2_pfd2_396m", };
|
||||||
static const char *pll1_sw_sels[] = { "pll1_sys", "step", };
|
static const char *pll1_sw_sels[] = { "pll1_sys", "step", };
|
||||||
static const char *periph_pre_sels[] = { "pll2_bus", "pll2_pfd2_396m", "pll2_pfd0_352m", "pll2_198m", };
|
static const char *periph_pre_sels[] = { "pll2_bus", "pll2_pfd2_396m", "pll2_pfd0_352m", "pll2_198m", };
|
||||||
static const char *periph_clk2_sels[] = { "pll3_usb_otg", "osc", };
|
static const char *periph_clk2_sels[] = { "pll3_usb_otg", "osc", "osc", "dummy", };
|
||||||
|
static const char *periph2_clk2_sels[] = { "pll3_usb_otg", "pll2_bus", };
|
||||||
static const char *periph_sels[] = { "periph_pre", "periph_clk2", };
|
static const char *periph_sels[] = { "periph_pre", "periph_clk2", };
|
||||||
static const char *periph2_sels[] = { "periph2_pre", "periph2_clk2", };
|
static const char *periph2_sels[] = { "periph2_pre", "periph2_clk2", };
|
||||||
static const char *axi_sels[] = { "periph", "pll2_pfd2_396m", "pll3_pfd1_540m", };
|
static const char *axi_sels[] = { "periph", "pll2_pfd2_396m", "periph", "pll3_pfd1_540m", };
|
||||||
static const char *audio_sels[] = { "pll4_post_div", "pll3_pfd2_508m", "pll3_pfd3_454m", "pll3_usb_otg", };
|
static const char *audio_sels[] = { "pll4_post_div", "pll3_pfd2_508m", "pll3_pfd3_454m", "pll3_usb_otg", };
|
||||||
static const char *gpu_axi_sels[] = { "axi", "ahb", };
|
static const char *gpu_axi_sels[] = { "axi", "ahb", };
|
||||||
static const char *gpu2d_core_sels[] = { "axi", "pll3_usb_otg", "pll2_pfd0_352m", "pll2_pfd2_396m", };
|
static const char *gpu2d_core_sels[] = { "axi", "pll3_usb_otg", "pll2_pfd0_352m", "pll2_pfd2_396m", };
|
||||||
static const char *gpu3d_core_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll2_pfd2_396m", };
|
static const char *gpu3d_core_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll2_pfd2_396m", };
|
||||||
static const char *gpu3d_shader_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll2_pfd9_720m", };
|
static const char *gpu3d_shader_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll2_pfd1_594m", "pll3_pfd0_720m", };
|
||||||
static const char *ipu_sels[] = { "mmdc_ch0_axi", "pll2_pfd2_396m", "pll3_120m", "pll3_pfd1_540m", };
|
static const char *ipu_sels[] = { "mmdc_ch0_axi", "pll2_pfd2_396m", "pll3_120m", "pll3_pfd1_540m", };
|
||||||
static const char *ldb_di_sels[] = { "pll5_video", "pll2_pfd0_352m", "pll2_pfd2_396m", "mmdc_ch1_axi", "pll3_usb_otg", };
|
static const char *ldb_di_sels[] = { "pll5_video_div", "pll2_pfd0_352m", "pll2_pfd2_396m", "mmdc_ch1_axi", "pll3_usb_otg", };
|
||||||
static const char *ipu_di_pre_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll5_video_div", "pll2_pfd0_352m", "pll2_pfd2_396m", "pll3_pfd1_540m", };
|
static const char *ipu_di_pre_sels[] = { "mmdc_ch0_axi", "pll3_usb_otg", "pll5_video_div", "pll2_pfd0_352m", "pll2_pfd2_396m", "pll3_pfd1_540m", };
|
||||||
static const char *ipu1_di0_sels[] = { "ipu1_di0_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", };
|
static const char *ipu1_di0_sels[] = { "ipu1_di0_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", };
|
||||||
static const char *ipu1_di1_sels[] = { "ipu1_di1_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", };
|
static const char *ipu1_di1_sels[] = { "ipu1_di1_pre", "dummy", "dummy", "ldb_di0", "ldb_di1", };
|
||||||
|
@ -369,8 +370,8 @@ int __init mx6q_clocks_init(void)
|
||||||
clk[pll1_sw] = imx_clk_mux("pll1_sw", base + 0xc, 2, 1, pll1_sw_sels, ARRAY_SIZE(pll1_sw_sels));
|
clk[pll1_sw] = imx_clk_mux("pll1_sw", base + 0xc, 2, 1, pll1_sw_sels, ARRAY_SIZE(pll1_sw_sels));
|
||||||
clk[periph_pre] = imx_clk_mux("periph_pre", base + 0x18, 18, 2, periph_pre_sels, ARRAY_SIZE(periph_pre_sels));
|
clk[periph_pre] = imx_clk_mux("periph_pre", base + 0x18, 18, 2, periph_pre_sels, ARRAY_SIZE(periph_pre_sels));
|
||||||
clk[periph2_pre] = imx_clk_mux("periph2_pre", base + 0x18, 21, 2, periph_pre_sels, ARRAY_SIZE(periph_pre_sels));
|
clk[periph2_pre] = imx_clk_mux("periph2_pre", base + 0x18, 21, 2, periph_pre_sels, ARRAY_SIZE(periph_pre_sels));
|
||||||
clk[periph_clk2_sel] = imx_clk_mux("periph_clk2_sel", base + 0x18, 12, 1, periph_clk2_sels, ARRAY_SIZE(periph_clk2_sels));
|
clk[periph_clk2_sel] = imx_clk_mux("periph_clk2_sel", base + 0x18, 12, 2, periph_clk2_sels, ARRAY_SIZE(periph_clk2_sels));
|
||||||
clk[periph2_clk2_sel] = imx_clk_mux("periph2_clk2_sel", base + 0x18, 20, 1, periph_clk2_sels, ARRAY_SIZE(periph_clk2_sels));
|
clk[periph2_clk2_sel] = imx_clk_mux("periph2_clk2_sel", base + 0x18, 20, 1, periph2_clk2_sels, ARRAY_SIZE(periph2_clk2_sels));
|
||||||
clk[axi_sel] = imx_clk_mux("axi_sel", base + 0x14, 6, 2, axi_sels, ARRAY_SIZE(axi_sels));
|
clk[axi_sel] = imx_clk_mux("axi_sel", base + 0x14, 6, 2, axi_sels, ARRAY_SIZE(axi_sels));
|
||||||
clk[esai_sel] = imx_clk_mux("esai_sel", base + 0x20, 19, 2, audio_sels, ARRAY_SIZE(audio_sels));
|
clk[esai_sel] = imx_clk_mux("esai_sel", base + 0x20, 19, 2, audio_sels, ARRAY_SIZE(audio_sels));
|
||||||
clk[asrc_sel] = imx_clk_mux("asrc_sel", base + 0x30, 7, 2, audio_sels, ARRAY_SIZE(audio_sels));
|
clk[asrc_sel] = imx_clk_mux("asrc_sel", base + 0x30, 7, 2, audio_sels, ARRAY_SIZE(audio_sels));
|
||||||
|
@ -498,7 +499,7 @@ int __init mx6q_clocks_init(void)
|
||||||
clk[ldb_di1] = imx_clk_gate2("ldb_di1", "ldb_di1_podf", base + 0x74, 14);
|
clk[ldb_di1] = imx_clk_gate2("ldb_di1", "ldb_di1_podf", base + 0x74, 14);
|
||||||
clk[ipu2_di1] = imx_clk_gate2("ipu2_di1", "ipu2_di1_sel", base + 0x74, 10);
|
clk[ipu2_di1] = imx_clk_gate2("ipu2_di1", "ipu2_di1_sel", base + 0x74, 10);
|
||||||
clk[hsi_tx] = imx_clk_gate2("hsi_tx", "hsi_tx_podf", base + 0x74, 16);
|
clk[hsi_tx] = imx_clk_gate2("hsi_tx", "hsi_tx_podf", base + 0x74, 16);
|
||||||
clk[mlb] = imx_clk_gate2("mlb", "pll8_mlb", base + 0x74, 18);
|
clk[mlb] = imx_clk_gate2("mlb", "axi", base + 0x74, 18);
|
||||||
clk[mmdc_ch0_axi] = imx_clk_gate2("mmdc_ch0_axi", "mmdc_ch0_axi_podf", base + 0x74, 20);
|
clk[mmdc_ch0_axi] = imx_clk_gate2("mmdc_ch0_axi", "mmdc_ch0_axi_podf", base + 0x74, 20);
|
||||||
clk[mmdc_ch1_axi] = imx_clk_gate2("mmdc_ch1_axi", "mmdc_ch1_axi_podf", base + 0x74, 22);
|
clk[mmdc_ch1_axi] = imx_clk_gate2("mmdc_ch1_axi", "mmdc_ch1_axi_podf", base + 0x74, 22);
|
||||||
clk[ocram] = imx_clk_gate2("ocram", "ahb", base + 0x74, 28);
|
clk[ocram] = imx_clk_gate2("ocram", "ahb", base + 0x74, 28);
|
||||||
|
|
|
@ -18,8 +18,20 @@
|
||||||
.section ".text.head", "ax"
|
.section ".text.head", "ax"
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
|
diag_reg_offset:
|
||||||
|
.word g_diag_reg - .
|
||||||
|
|
||||||
|
.macro set_diag_reg
|
||||||
|
adr r0, diag_reg_offset
|
||||||
|
ldr r1, [r0]
|
||||||
|
add r1, r1, r0 @ r1 = physical &g_diag_reg
|
||||||
|
ldr r0, [r1]
|
||||||
|
mcr p15, 0, r0, c15, c0, 1 @ write diagnostic register
|
||||||
|
.endm
|
||||||
|
|
||||||
ENTRY(v7_secondary_startup)
|
ENTRY(v7_secondary_startup)
|
||||||
bl v7_invalidate_l1
|
bl v7_invalidate_l1
|
||||||
|
set_diag_reg
|
||||||
b secondary_startup
|
b secondary_startup
|
||||||
ENDPROC(v7_secondary_startup)
|
ENDPROC(v7_secondary_startup)
|
||||||
#endif
|
#endif
|
||||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче