forked from Minki/linux
Merge remote branch 'origin/master' into merge
Manual merge of arch/powerpc/kernel/smp.c and add missing scheduler_ipi() call to arch/powerpc/platforms/cell/interrupt.c Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
commit
880102e785
@ -328,8 +328,6 @@ sysrq.txt
|
||||
- info on the magic SysRq key.
|
||||
telephony/
|
||||
- directory with info on telephony (e.g. voice over IP) support.
|
||||
uml/
|
||||
- directory with information about User Mode Linux.
|
||||
unicode.txt
|
||||
- info on the Unicode character/font mapping used in Linux.
|
||||
unshare.txt
|
||||
|
@ -183,21 +183,21 @@ Description: Discover and change clock speed of CPUs
|
||||
to learn how to control the knobs.
|
||||
|
||||
|
||||
What: /sys/devices/system/cpu/cpu*/cache/index*/cache_disable_X
|
||||
Date: August 2008
|
||||
What: /sys/devices/system/cpu/cpu*/cache/index3/cache_disable_{0,1}
|
||||
Date: August 2008
|
||||
KernelVersion: 2.6.27
|
||||
Contact: mark.langsdorf@amd.com
|
||||
Description: These files exist in every cpu's cache index directories.
|
||||
There are currently 2 cache_disable_# files in each
|
||||
directory. Reading from these files on a supported
|
||||
processor will return that cache disable index value
|
||||
for that processor and node. Writing to one of these
|
||||
files will cause the specificed cache index to be disabled.
|
||||
Contact: discuss@x86-64.org
|
||||
Description: Disable L3 cache indices
|
||||
|
||||
Currently, only AMD Family 10h Processors support cache index
|
||||
disable, and only for their L3 caches. See the BIOS and
|
||||
Kernel Developer's Guide at
|
||||
http://support.amd.com/us/Embedded_TechDocs/31116-Public-GH-BKDG_3-28_5-28-09.pdf
|
||||
for formatting information and other details on the
|
||||
cache index disable.
|
||||
Users: joachim.deguara@amd.com
|
||||
These files exist in every CPU's cache/index3 directory. Each
|
||||
cache_disable_{0,1} file corresponds to one disable slot which
|
||||
can be used to disable a cache index. Reading from these files
|
||||
on a processor with this functionality will return the currently
|
||||
disabled index for that node. There is one L3 structure per
|
||||
node, or per internal node on MCM machines. Writing a valid
|
||||
index to one of these files will cause the specificed cache
|
||||
index to be disabled.
|
||||
|
||||
All AMD processors with L3 caches provide this functionality.
|
||||
For details, see BKDGs at
|
||||
http://developer.amd.com/documentation/guides/Pages/default.aspx
|
||||
|
@ -14,14 +14,15 @@ Description:
|
||||
|
||||
DMI is structured as a large table of entries, where
|
||||
each entry has a common header indicating the type and
|
||||
length of the entry, as well as 'handle' that is
|
||||
supposed to be unique amongst all entries.
|
||||
length of the entry, as well as a firmware-provided
|
||||
'handle' that is supposed to be unique amongst all
|
||||
entries.
|
||||
|
||||
Some entries are required by the specification, but many
|
||||
others are optional. In general though, users should
|
||||
never expect to find a specific entry type on their
|
||||
system unless they know for certain what their firmware
|
||||
is doing. Machine to machine will vary.
|
||||
is doing. Machine to machine experiences will vary.
|
||||
|
||||
Multiple entries of the same type are allowed. In order
|
||||
to handle these duplicate entry types, each entry is
|
||||
@ -67,25 +68,24 @@ Description:
|
||||
and the two terminating nul characters.
|
||||
type : The type of the entry. This value is the same
|
||||
as found in the directory name. It indicates
|
||||
how the rest of the entry should be
|
||||
interpreted.
|
||||
how the rest of the entry should be interpreted.
|
||||
instance: The instance ordinal of the entry for the
|
||||
given type. This value is the same as found
|
||||
in the parent directory name.
|
||||
position: The position of the entry within the entirety
|
||||
of the entirety.
|
||||
position: The ordinal position (zero-based) of the entry
|
||||
within the entirety of the DMI entry table.
|
||||
|
||||
=== Entry Specialization ===
|
||||
|
||||
Some entry types may have other information available in
|
||||
sysfs.
|
||||
sysfs. Not all types are specialized.
|
||||
|
||||
--- Type 15 - System Event Log ---
|
||||
|
||||
This entry allows the firmware to export a log of
|
||||
events the system has taken. This information is
|
||||
typically backed by nvram, but the implementation
|
||||
details are abstracted by this table. This entries data
|
||||
details are abstracted by this table. This entry's data
|
||||
is exported in the directory:
|
||||
|
||||
/sys/firmware/dmi/entries/15-0/system_event_log
|
||||
|
58
Documentation/ABI/testing/sysfs-firmware-gsmi
Normal file
58
Documentation/ABI/testing/sysfs-firmware-gsmi
Normal file
@ -0,0 +1,58 @@
|
||||
What: /sys/firmware/gsmi
|
||||
Date: March 2011
|
||||
Contact: Mike Waychison <mikew@google.com>
|
||||
Description:
|
||||
Some servers used internally at Google have firmware
|
||||
that provides callback functionality via explicit SMI
|
||||
triggers. Some of the callbacks are similar to those
|
||||
provided by the EFI runtime services page, but due to
|
||||
historical reasons this different entry-point has been
|
||||
used.
|
||||
|
||||
The gsmi driver implements the kernel's abstraction for
|
||||
these firmware callbacks. Currently, this functionality
|
||||
is limited to handling the system event log and getting
|
||||
access to EFI-style variables stored in nvram.
|
||||
|
||||
Layout:
|
||||
|
||||
/sys/firmware/gsmi/vars:
|
||||
|
||||
This directory has the same layout (and
|
||||
underlying implementation as /sys/firmware/efi/vars.
|
||||
See Documentation/ABI/*/sysfs-firmware-efi-vars
|
||||
for more information on how to interact with
|
||||
this structure.
|
||||
|
||||
/sys/firmware/gsmi/append_to_eventlog - write-only:
|
||||
|
||||
This file takes a binary blob and passes it onto
|
||||
the firmware to be timestamped and appended to
|
||||
the system eventlog. The binary format is
|
||||
interpreted by the firmware and may change from
|
||||
platform to platform. The only kernel-enforced
|
||||
requirement is that the blob be prefixed with a
|
||||
32bit host-endian type used as part of the
|
||||
firmware call.
|
||||
|
||||
/sys/firmware/gsmi/clear_config - write-only:
|
||||
|
||||
Writing any value to this file will cause the
|
||||
entire firmware configuration to be reset to
|
||||
"factory defaults". Callers should assume that
|
||||
a reboot is required for the configuration to be
|
||||
cleared.
|
||||
|
||||
/sys/firmware/gsmi/clear_eventlog - write-only:
|
||||
|
||||
This file is used to clear out a portion/the
|
||||
whole of the system event log. Values written
|
||||
should be values between 1 and 100 inclusive (in
|
||||
ASCII) representing the fraction of the log to
|
||||
clear. Not all platforms support fractional
|
||||
clearing though, and this writes to this file
|
||||
will error out if the firmware doesn't like your
|
||||
submitted fraction.
|
||||
|
||||
Callers should assume that a reboot is needed
|
||||
for this operation to complete.
|
7
Documentation/ABI/testing/sysfs-firmware-log
Normal file
7
Documentation/ABI/testing/sysfs-firmware-log
Normal file
@ -0,0 +1,7 @@
|
||||
What: /sys/firmware/log
|
||||
Date: February 2011
|
||||
Contact: Mike Waychison <mikew@google.com>
|
||||
Description:
|
||||
The /sys/firmware/log is a binary file that represents a
|
||||
read-only copy of the firmware's log if one is
|
||||
available.
|
8
Documentation/ABI/testing/sysfs-kernel-fscaps
Normal file
8
Documentation/ABI/testing/sysfs-kernel-fscaps
Normal file
@ -0,0 +1,8 @@
|
||||
What: /sys/kernel/fscaps
|
||||
Date: February 2011
|
||||
KernelVersion: 2.6.38
|
||||
Contact: Ludwig Nussel <ludwig.nussel@suse.de>
|
||||
Description
|
||||
Shows whether file system capabilities are honored
|
||||
when executing a binary
|
||||
|
@ -158,3 +158,17 @@ Description:
|
||||
successful, will make the kernel abort a subsequent transition
|
||||
to a sleep state if any wakeup events are reported after the
|
||||
write has returned.
|
||||
|
||||
What: /sys/power/reserved_size
|
||||
Date: May 2011
|
||||
Contact: Rafael J. Wysocki <rjw@sisk.pl>
|
||||
Description:
|
||||
The /sys/power/reserved_size file allows user space to control
|
||||
the amount of memory reserved for allocations made by device
|
||||
drivers during the "device freeze" stage of hibernation. It can
|
||||
be written a string representing a non-negative integer that
|
||||
will be used as the amount of memory to reserve for allocations
|
||||
made by device drivers' "freeze" callbacks, in bytes.
|
||||
|
||||
Reading from this file will display the current value, which is
|
||||
set to 1 MB by default.
|
||||
|
@ -96,10 +96,10 @@ X!Iinclude/linux/kobject.h
|
||||
|
||||
<chapter id="devdrivers">
|
||||
<title>Device drivers infrastructure</title>
|
||||
<sect1><title>The Basic Device Driver-Model Structures </title>
|
||||
!Iinclude/linux/device.h
|
||||
</sect1>
|
||||
<sect1><title>Device Drivers Base</title>
|
||||
<!--
|
||||
X!Iinclude/linux/device.h
|
||||
-->
|
||||
!Edrivers/base/driver.c
|
||||
!Edrivers/base/core.c
|
||||
!Edrivers/base/class.c
|
||||
|
@ -191,8 +191,8 @@
|
||||
<para>
|
||||
Whenever an interrupt triggers, the lowlevel arch code calls into
|
||||
the generic interrupt code by calling desc->handle_irq().
|
||||
This highlevel IRQ handling function only uses desc->chip primitives
|
||||
referenced by the assigned chip descriptor structure.
|
||||
This highlevel IRQ handling function only uses desc->irq_data.chip
|
||||
primitives referenced by the assigned chip descriptor structure.
|
||||
</para>
|
||||
</sect1>
|
||||
<sect1 id="Highlevel_Driver_API">
|
||||
@ -206,11 +206,11 @@
|
||||
<listitem><para>enable_irq()</para></listitem>
|
||||
<listitem><para>disable_irq_nosync() (SMP only)</para></listitem>
|
||||
<listitem><para>synchronize_irq() (SMP only)</para></listitem>
|
||||
<listitem><para>set_irq_type()</para></listitem>
|
||||
<listitem><para>set_irq_wake()</para></listitem>
|
||||
<listitem><para>set_irq_data()</para></listitem>
|
||||
<listitem><para>set_irq_chip()</para></listitem>
|
||||
<listitem><para>set_irq_chip_data()</para></listitem>
|
||||
<listitem><para>irq_set_irq_type()</para></listitem>
|
||||
<listitem><para>irq_set_irq_wake()</para></listitem>
|
||||
<listitem><para>irq_set_handler_data()</para></listitem>
|
||||
<listitem><para>irq_set_chip()</para></listitem>
|
||||
<listitem><para>irq_set_chip_data()</para></listitem>
|
||||
</itemizedlist>
|
||||
See the autogenerated function documentation for details.
|
||||
</para>
|
||||
@ -225,6 +225,8 @@
|
||||
<listitem><para>handle_fasteoi_irq</para></listitem>
|
||||
<listitem><para>handle_simple_irq</para></listitem>
|
||||
<listitem><para>handle_percpu_irq</para></listitem>
|
||||
<listitem><para>handle_edge_eoi_irq</para></listitem>
|
||||
<listitem><para>handle_bad_irq</para></listitem>
|
||||
</itemizedlist>
|
||||
The interrupt flow handlers (either predefined or architecture
|
||||
specific) are assigned to specific interrupts by the architecture
|
||||
@ -241,13 +243,13 @@
|
||||
<programlisting>
|
||||
default_enable(struct irq_data *data)
|
||||
{
|
||||
desc->chip->irq_unmask(data);
|
||||
desc->irq_data.chip->irq_unmask(data);
|
||||
}
|
||||
|
||||
default_disable(struct irq_data *data)
|
||||
{
|
||||
if (!delay_disable(data))
|
||||
desc->chip->irq_mask(data);
|
||||
desc->irq_data.chip->irq_mask(data);
|
||||
}
|
||||
|
||||
default_ack(struct irq_data *data)
|
||||
@ -284,9 +286,9 @@ noop(struct irq_data *data))
|
||||
<para>
|
||||
The following control flow is implemented (simplified excerpt):
|
||||
<programlisting>
|
||||
desc->chip->irq_mask();
|
||||
handle_IRQ_event(desc->action);
|
||||
desc->chip->irq_unmask();
|
||||
desc->irq_data.chip->irq_mask_ack();
|
||||
handle_irq_event(desc->action);
|
||||
desc->irq_data.chip->irq_unmask();
|
||||
</programlisting>
|
||||
</para>
|
||||
</sect3>
|
||||
@ -300,8 +302,8 @@ desc->chip->irq_unmask();
|
||||
<para>
|
||||
The following control flow is implemented (simplified excerpt):
|
||||
<programlisting>
|
||||
handle_IRQ_event(desc->action);
|
||||
desc->chip->irq_eoi();
|
||||
handle_irq_event(desc->action);
|
||||
desc->irq_data.chip->irq_eoi();
|
||||
</programlisting>
|
||||
</para>
|
||||
</sect3>
|
||||
@ -315,17 +317,17 @@ desc->chip->irq_eoi();
|
||||
The following control flow is implemented (simplified excerpt):
|
||||
<programlisting>
|
||||
if (desc->status & running) {
|
||||
desc->chip->irq_mask();
|
||||
desc->irq_data.chip->irq_mask_ack();
|
||||
desc->status |= pending | masked;
|
||||
return;
|
||||
}
|
||||
desc->chip->irq_ack();
|
||||
desc->irq_data.chip->irq_ack();
|
||||
desc->status |= running;
|
||||
do {
|
||||
if (desc->status & masked)
|
||||
desc->chip->irq_unmask();
|
||||
desc->irq_data.chip->irq_unmask();
|
||||
desc->status &= ~pending;
|
||||
handle_IRQ_event(desc->action);
|
||||
handle_irq_event(desc->action);
|
||||
} while (status & pending);
|
||||
desc->status &= ~running;
|
||||
</programlisting>
|
||||
@ -344,7 +346,7 @@ desc->status &= ~running;
|
||||
<para>
|
||||
The following control flow is implemented (simplified excerpt):
|
||||
<programlisting>
|
||||
handle_IRQ_event(desc->action);
|
||||
handle_irq_event(desc->action);
|
||||
</programlisting>
|
||||
</para>
|
||||
</sect3>
|
||||
@ -362,12 +364,29 @@ handle_IRQ_event(desc->action);
|
||||
<para>
|
||||
The following control flow is implemented (simplified excerpt):
|
||||
<programlisting>
|
||||
handle_IRQ_event(desc->action);
|
||||
if (desc->chip->irq_eoi)
|
||||
desc->chip->irq_eoi();
|
||||
if (desc->irq_data.chip->irq_ack)
|
||||
desc->irq_data.chip->irq_ack();
|
||||
handle_irq_event(desc->action);
|
||||
if (desc->irq_data.chip->irq_eoi)
|
||||
desc->irq_data.chip->irq_eoi();
|
||||
</programlisting>
|
||||
</para>
|
||||
</sect3>
|
||||
<sect3 id="EOI_Edge_IRQ_flow_handler">
|
||||
<title>EOI Edge IRQ flow handler</title>
|
||||
<para>
|
||||
handle_edge_eoi_irq provides an abnomination of the edge
|
||||
handler which is solely used to tame a badly wreckaged
|
||||
irq controller on powerpc/cell.
|
||||
</para>
|
||||
</sect3>
|
||||
<sect3 id="BAD_IRQ_flow_handler">
|
||||
<title>Bad IRQ flow handler</title>
|
||||
<para>
|
||||
handle_bad_irq is used for spurious interrupts which
|
||||
have no real handler assigned..
|
||||
</para>
|
||||
</sect3>
|
||||
</sect2>
|
||||
<sect2 id="Quirks_and_optimizations">
|
||||
<title>Quirks and optimizations</title>
|
||||
@ -410,6 +429,7 @@ if (desc->chip->irq_eoi)
|
||||
<listitem><para>irq_mask_ack() - Optional, recommended for performance</para></listitem>
|
||||
<listitem><para>irq_mask()</para></listitem>
|
||||
<listitem><para>irq_unmask()</para></listitem>
|
||||
<listitem><para>irq_eoi() - Optional, required for eoi flow handlers</para></listitem>
|
||||
<listitem><para>irq_retrigger() - Optional</para></listitem>
|
||||
<listitem><para>irq_set_type() - Optional</para></listitem>
|
||||
<listitem><para>irq_set_wake() - Optional</para></listitem>
|
||||
@ -424,32 +444,24 @@ if (desc->chip->irq_eoi)
|
||||
<chapter id="doirq">
|
||||
<title>__do_IRQ entry point</title>
|
||||
<para>
|
||||
The original implementation __do_IRQ() is an alternative entry
|
||||
point for all types of interrupts.
|
||||
The original implementation __do_IRQ() was an alternative entry
|
||||
point for all types of interrupts. It not longer exists.
|
||||
</para>
|
||||
<para>
|
||||
This handler turned out to be not suitable for all
|
||||
interrupt hardware and was therefore reimplemented with split
|
||||
functionality for egde/level/simple/percpu interrupts. This is not
|
||||
functionality for edge/level/simple/percpu interrupts. This is not
|
||||
only a functional optimization. It also shortens code paths for
|
||||
interrupts.
|
||||
</para>
|
||||
<para>
|
||||
To make use of the split implementation, replace the call to
|
||||
__do_IRQ by a call to desc->handle_irq() and associate
|
||||
the appropriate handler function to desc->handle_irq().
|
||||
In most cases the generic handler implementations should
|
||||
be sufficient.
|
||||
</para>
|
||||
</chapter>
|
||||
|
||||
<chapter id="locking">
|
||||
<title>Locking on SMP</title>
|
||||
<para>
|
||||
The locking of chip registers is up to the architecture that
|
||||
defines the chip primitives. There is a chip->lock field that can be used
|
||||
for serialization, but the generic layer does not touch it. The per-irq
|
||||
structure is protected via desc->lock, by the generic layer.
|
||||
defines the chip primitives. The per-irq structure is
|
||||
protected via desc->lock, by the generic layer.
|
||||
</para>
|
||||
</chapter>
|
||||
<chapter id="structs">
|
||||
|
@ -21,7 +21,7 @@ rcu.txt
|
||||
RTFP.txt
|
||||
- List of RCU papers (bibliography) going back to 1980.
|
||||
stallwarn.txt
|
||||
- RCU CPU stall warnings (CONFIG_RCU_CPU_STALL_DETECTOR)
|
||||
- RCU CPU stall warnings (module parameter rcu_cpu_stall_suppress)
|
||||
torture.txt
|
||||
- RCU Torture Test Operation (CONFIG_RCU_TORTURE_TEST)
|
||||
trace.txt
|
||||
|
@ -1,22 +1,25 @@
|
||||
Using RCU's CPU Stall Detector
|
||||
|
||||
The CONFIG_RCU_CPU_STALL_DETECTOR kernel config parameter enables
|
||||
RCU's CPU stall detector, which detects conditions that unduly delay
|
||||
RCU grace periods. The stall detector's idea of what constitutes
|
||||
"unduly delayed" is controlled by a set of C preprocessor macros:
|
||||
The rcu_cpu_stall_suppress module parameter enables RCU's CPU stall
|
||||
detector, which detects conditions that unduly delay RCU grace periods.
|
||||
This module parameter enables CPU stall detection by default, but
|
||||
may be overridden via boot-time parameter or at runtime via sysfs.
|
||||
The stall detector's idea of what constitutes "unduly delayed" is
|
||||
controlled by a set of kernel configuration variables and cpp macros:
|
||||
|
||||
RCU_SECONDS_TILL_STALL_CHECK
|
||||
CONFIG_RCU_CPU_STALL_TIMEOUT
|
||||
|
||||
This macro defines the period of time that RCU will wait from
|
||||
the beginning of a grace period until it issues an RCU CPU
|
||||
stall warning. This time period is normally ten seconds.
|
||||
This kernel configuration parameter defines the period of time
|
||||
that RCU will wait from the beginning of a grace period until it
|
||||
issues an RCU CPU stall warning. This time period is normally
|
||||
ten seconds.
|
||||
|
||||
RCU_SECONDS_TILL_STALL_RECHECK
|
||||
|
||||
This macro defines the period of time that RCU will wait after
|
||||
issuing a stall warning until it issues another stall warning
|
||||
for the same stall. This time period is normally set to thirty
|
||||
seconds.
|
||||
for the same stall. This time period is normally set to three
|
||||
times the check interval plus thirty seconds.
|
||||
|
||||
RCU_STALL_RAT_DELAY
|
||||
|
||||
|
@ -10,34 +10,46 @@ for rcutree and next for rcutiny.
|
||||
|
||||
CONFIG_TREE_RCU and CONFIG_TREE_PREEMPT_RCU debugfs Files and Formats
|
||||
|
||||
These implementations of RCU provides five debugfs files under the
|
||||
top-level directory RCU: rcu/rcudata (which displays fields in struct
|
||||
rcu_data), rcu/rcudata.csv (which is a .csv spreadsheet version of
|
||||
rcu/rcudata), rcu/rcugp (which displays grace-period counters),
|
||||
rcu/rcuhier (which displays the struct rcu_node hierarchy), and
|
||||
rcu/rcu_pending (which displays counts of the reasons that the
|
||||
rcu_pending() function decided that there was core RCU work to do).
|
||||
These implementations of RCU provides several debugfs files under the
|
||||
top-level directory "rcu":
|
||||
|
||||
rcu/rcudata:
|
||||
Displays fields in struct rcu_data.
|
||||
rcu/rcudata.csv:
|
||||
Comma-separated values spreadsheet version of rcudata.
|
||||
rcu/rcugp:
|
||||
Displays grace-period counters.
|
||||
rcu/rcuhier:
|
||||
Displays the struct rcu_node hierarchy.
|
||||
rcu/rcu_pending:
|
||||
Displays counts of the reasons rcu_pending() decided that RCU had
|
||||
work to do.
|
||||
rcu/rcutorture:
|
||||
Displays rcutorture test progress.
|
||||
rcu/rcuboost:
|
||||
Displays RCU boosting statistics. Only present if
|
||||
CONFIG_RCU_BOOST=y.
|
||||
|
||||
The output of "cat rcu/rcudata" looks as follows:
|
||||
|
||||
rcu_sched:
|
||||
0 c=17829 g=17829 pq=1 pqc=17829 qp=0 dt=10951/1 dn=0 df=1101 of=0 ri=36 ql=0 b=10
|
||||
1 c=17829 g=17829 pq=1 pqc=17829 qp=0 dt=16117/1 dn=0 df=1015 of=0 ri=0 ql=0 b=10
|
||||
2 c=17829 g=17829 pq=1 pqc=17829 qp=0 dt=1445/1 dn=0 df=1839 of=0 ri=0 ql=0 b=10
|
||||
3 c=17829 g=17829 pq=1 pqc=17829 qp=0 dt=6681/1 dn=0 df=1545 of=0 ri=0 ql=0 b=10
|
||||
4 c=17829 g=17829 pq=1 pqc=17829 qp=0 dt=1003/1 dn=0 df=1992 of=0 ri=0 ql=0 b=10
|
||||
5 c=17829 g=17830 pq=1 pqc=17829 qp=1 dt=3887/1 dn=0 df=3331 of=0 ri=4 ql=2 b=10
|
||||
6 c=17829 g=17829 pq=1 pqc=17829 qp=0 dt=859/1 dn=0 df=3224 of=0 ri=0 ql=0 b=10
|
||||
7 c=17829 g=17830 pq=0 pqc=17829 qp=1 dt=3761/1 dn=0 df=1818 of=0 ri=0 ql=2 b=10
|
||||
0 c=20972 g=20973 pq=1 pqc=20972 qp=0 dt=545/1/0 df=50 of=0 ri=0 ql=163 qs=NRW. kt=0/W/0 ktl=ebc3 b=10 ci=153737 co=0 ca=0
|
||||
1 c=20972 g=20973 pq=1 pqc=20972 qp=0 dt=967/1/0 df=58 of=0 ri=0 ql=634 qs=NRW. kt=0/W/1 ktl=58c b=10 ci=191037 co=0 ca=0
|
||||
2 c=20972 g=20973 pq=1 pqc=20972 qp=0 dt=1081/1/0 df=175 of=0 ri=0 ql=74 qs=N.W. kt=0/W/2 ktl=da94 b=10 ci=75991 co=0 ca=0
|
||||
3 c=20942 g=20943 pq=1 pqc=20942 qp=1 dt=1846/0/0 df=404 of=0 ri=0 ql=0 qs=.... kt=0/W/3 ktl=d1cd b=10 ci=72261 co=0 ca=0
|
||||
4 c=20972 g=20973 pq=1 pqc=20972 qp=0 dt=369/1/0 df=83 of=0 ri=0 ql=48 qs=N.W. kt=0/W/4 ktl=e0e7 b=10 ci=128365 co=0 ca=0
|
||||
5 c=20972 g=20973 pq=1 pqc=20972 qp=0 dt=381/1/0 df=64 of=0 ri=0 ql=169 qs=NRW. kt=0/W/5 ktl=fb2f b=10 ci=164360 co=0 ca=0
|
||||
6 c=20972 g=20973 pq=1 pqc=20972 qp=0 dt=1037/1/0 df=183 of=0 ri=0 ql=62 qs=N.W. kt=0/W/6 ktl=d2ad b=10 ci=65663 co=0 ca=0
|
||||
7 c=20897 g=20897 pq=1 pqc=20896 qp=0 dt=1572/0/0 df=382 of=0 ri=0 ql=0 qs=.... kt=0/W/7 ktl=cf15 b=10 ci=75006 co=0 ca=0
|
||||
rcu_bh:
|
||||
0 c=-275 g=-275 pq=1 pqc=-275 qp=0 dt=10951/1 dn=0 df=0 of=0 ri=0 ql=0 b=10
|
||||
1 c=-275 g=-275 pq=1 pqc=-275 qp=0 dt=16117/1 dn=0 df=13 of=0 ri=0 ql=0 b=10
|
||||
2 c=-275 g=-275 pq=1 pqc=-275 qp=0 dt=1445/1 dn=0 df=15 of=0 ri=0 ql=0 b=10
|
||||
3 c=-275 g=-275 pq=1 pqc=-275 qp=0 dt=6681/1 dn=0 df=9 of=0 ri=0 ql=0 b=10
|
||||
4 c=-275 g=-275 pq=1 pqc=-275 qp=0 dt=1003/1 dn=0 df=15 of=0 ri=0 ql=0 b=10
|
||||
5 c=-275 g=-275 pq=1 pqc=-275 qp=0 dt=3887/1 dn=0 df=15 of=0 ri=0 ql=0 b=10
|
||||
6 c=-275 g=-275 pq=1 pqc=-275 qp=0 dt=859/1 dn=0 df=15 of=0 ri=0 ql=0 b=10
|
||||
7 c=-275 g=-275 pq=1 pqc=-275 qp=0 dt=3761/1 dn=0 df=15 of=0 ri=0 ql=0 b=10
|
||||
0 c=1480 g=1480 pq=1 pqc=1479 qp=0 dt=545/1/0 df=6 of=0 ri=1 ql=0 qs=.... kt=0/W/0 ktl=ebc3 b=10 ci=0 co=0 ca=0
|
||||
1 c=1480 g=1480 pq=1 pqc=1479 qp=0 dt=967/1/0 df=3 of=0 ri=1 ql=0 qs=.... kt=0/W/1 ktl=58c b=10 ci=151 co=0 ca=0
|
||||
2 c=1480 g=1480 pq=1 pqc=1479 qp=0 dt=1081/1/0 df=6 of=0 ri=1 ql=0 qs=.... kt=0/W/2 ktl=da94 b=10 ci=0 co=0 ca=0
|
||||
3 c=1480 g=1480 pq=1 pqc=1479 qp=0 dt=1846/0/0 df=8 of=0 ri=1 ql=0 qs=.... kt=0/W/3 ktl=d1cd b=10 ci=0 co=0 ca=0
|
||||
4 c=1480 g=1480 pq=1 pqc=1479 qp=0 dt=369/1/0 df=6 of=0 ri=1 ql=0 qs=.... kt=0/W/4 ktl=e0e7 b=10 ci=0 co=0 ca=0
|
||||
5 c=1480 g=1480 pq=1 pqc=1479 qp=0 dt=381/1/0 df=4 of=0 ri=1 ql=0 qs=.... kt=0/W/5 ktl=fb2f b=10 ci=0 co=0 ca=0
|
||||
6 c=1480 g=1480 pq=1 pqc=1479 qp=0 dt=1037/1/0 df=6 of=0 ri=1 ql=0 qs=.... kt=0/W/6 ktl=d2ad b=10 ci=0 co=0 ca=0
|
||||
7 c=1474 g=1474 pq=1 pqc=1473 qp=0 dt=1572/0/0 df=8 of=0 ri=1 ql=0 qs=.... kt=0/W/7 ktl=cf15 b=10 ci=0 co=0 ca=0
|
||||
|
||||
The first section lists the rcu_data structures for rcu_sched, the second
|
||||
for rcu_bh. Note that CONFIG_TREE_PREEMPT_RCU kernels will have an
|
||||
@ -52,17 +64,18 @@ o The number at the beginning of each line is the CPU number.
|
||||
substantially larger than the number of actual CPUs.
|
||||
|
||||
o "c" is the count of grace periods that this CPU believes have
|
||||
completed. CPUs in dynticks idle mode may lag quite a ways
|
||||
behind, for example, CPU 4 under "rcu_sched" above, which has
|
||||
slept through the past 25 RCU grace periods. It is not unusual
|
||||
to see CPUs lagging by thousands of grace periods.
|
||||
completed. Offlined CPUs and CPUs in dynticks idle mode may
|
||||
lag quite a ways behind, for example, CPU 6 under "rcu_sched"
|
||||
above, which has been offline through not quite 40,000 RCU grace
|
||||
periods. It is not unusual to see CPUs lagging by thousands of
|
||||
grace periods.
|
||||
|
||||
o "g" is the count of grace periods that this CPU believes have
|
||||
started. Again, CPUs in dynticks idle mode may lag behind.
|
||||
If the "c" and "g" values are equal, this CPU has already
|
||||
reported a quiescent state for the last RCU grace period that
|
||||
it is aware of, otherwise, the CPU believes that it owes RCU a
|
||||
quiescent state.
|
||||
started. Again, offlined CPUs and CPUs in dynticks idle mode
|
||||
may lag behind. If the "c" and "g" values are equal, this CPU
|
||||
has already reported a quiescent state for the last RCU grace
|
||||
period that it is aware of, otherwise, the CPU believes that it
|
||||
owes RCU a quiescent state.
|
||||
|
||||
o "pq" indicates that this CPU has passed through a quiescent state
|
||||
for the current grace period. It is possible for "pq" to be
|
||||
@ -81,7 +94,8 @@ o "pqc" indicates which grace period the last-observed quiescent
|
||||
the next grace period!
|
||||
|
||||
o "qp" indicates that RCU still expects a quiescent state from
|
||||
this CPU.
|
||||
this CPU. Offlined CPUs and CPUs in dyntick idle mode might
|
||||
well have qp=1, which is OK: RCU is still ignoring them.
|
||||
|
||||
o "dt" is the current value of the dyntick counter that is incremented
|
||||
when entering or leaving dynticks idle state, either by the
|
||||
@ -108,7 +122,7 @@ o "df" is the number of times that some other CPU has forced a
|
||||
|
||||
o "of" is the number of times that some other CPU has forced a
|
||||
quiescent state on behalf of this CPU due to this CPU being
|
||||
offline. In a perfect world, this might neve happen, but it
|
||||
offline. In a perfect world, this might never happen, but it
|
||||
turns out that offlining and onlining a CPU can take several grace
|
||||
periods, and so there is likely to be an extended period of time
|
||||
when RCU believes that the CPU is online when it really is not.
|
||||
@ -125,6 +139,62 @@ o "ql" is the number of RCU callbacks currently residing on
|
||||
of what state they are in (new, waiting for grace period to
|
||||
start, waiting for grace period to end, ready to invoke).
|
||||
|
||||
o "qs" gives an indication of the state of the callback queue
|
||||
with four characters:
|
||||
|
||||
"N" Indicates that there are callbacks queued that are not
|
||||
ready to be handled by the next grace period, and thus
|
||||
will be handled by the grace period following the next
|
||||
one.
|
||||
|
||||
"R" Indicates that there are callbacks queued that are
|
||||
ready to be handled by the next grace period.
|
||||
|
||||
"W" Indicates that there are callbacks queued that are
|
||||
waiting on the current grace period.
|
||||
|
||||
"D" Indicates that there are callbacks queued that have
|
||||
already been handled by a prior grace period, and are
|
||||
thus waiting to be invoked. Note that callbacks in
|
||||
the process of being invoked are not counted here.
|
||||
Callbacks in the process of being invoked are those
|
||||
that have been removed from the rcu_data structures
|
||||
queues by rcu_do_batch(), but which have not yet been
|
||||
invoked.
|
||||
|
||||
If there are no callbacks in a given one of the above states,
|
||||
the corresponding character is replaced by ".".
|
||||
|
||||
o "kt" is the per-CPU kernel-thread state. The digit preceding
|
||||
the first slash is zero if there is no work pending and 1
|
||||
otherwise. The character between the first pair of slashes is
|
||||
as follows:
|
||||
|
||||
"S" The kernel thread is stopped, in other words, all
|
||||
CPUs corresponding to this rcu_node structure are
|
||||
offline.
|
||||
|
||||
"R" The kernel thread is running.
|
||||
|
||||
"W" The kernel thread is waiting because there is no work
|
||||
for it to do.
|
||||
|
||||
"O" The kernel thread is waiting because it has been
|
||||
forced off of its designated CPU or because its
|
||||
->cpus_allowed mask permits it to run on other than
|
||||
its designated CPU.
|
||||
|
||||
"Y" The kernel thread is yielding to avoid hogging CPU.
|
||||
|
||||
"?" Unknown value, indicates a bug.
|
||||
|
||||
The number after the final slash is the CPU that the kthread
|
||||
is actually running on.
|
||||
|
||||
o "ktl" is the low-order 16 bits (in hexadecimal) of the count of
|
||||
the number of times that this CPU's per-CPU kthread has gone
|
||||
through its loop servicing invoke_rcu_cpu_kthread() requests.
|
||||
|
||||
o "b" is the batch limit for this CPU. If more than this number
|
||||
of RCU callbacks is ready to invoke, then the remainder will
|
||||
be deferred.
|
||||
@ -174,14 +244,14 @@ o "gpnum" is the number of grace periods that have started. It is
|
||||
The output of "cat rcu/rcuhier" looks as follows, with very long lines:
|
||||
|
||||
c=6902 g=6903 s=2 jfq=3 j=72c7 nfqs=13142/nfqsng=0(13142) fqlh=6
|
||||
1/1 .>. 0:127 ^0
|
||||
3/3 .>. 0:35 ^0 0/0 .>. 36:71 ^1 0/0 .>. 72:107 ^2 0/0 .>. 108:127 ^3
|
||||
3/3f .>. 0:5 ^0 2/3 .>. 6:11 ^1 0/0 .>. 12:17 ^2 0/0 .>. 18:23 ^3 0/0 .>. 24:29 ^4 0/0 .>. 30:35 ^5 0/0 .>. 36:41 ^0 0/0 .>. 42:47 ^1 0/0 .>. 48:53 ^2 0/0 .>. 54:59 ^3 0/0 .>. 60:65 ^4 0/0 .>. 66:71 ^5 0/0 .>. 72:77 ^0 0/0 .>. 78:83 ^1 0/0 .>. 84:89 ^2 0/0 .>. 90:95 ^3 0/0 .>. 96:101 ^4 0/0 .>. 102:107 ^5 0/0 .>. 108:113 ^0 0/0 .>. 114:119 ^1 0/0 .>. 120:125 ^2 0/0 .>. 126:127 ^3
|
||||
1/1 ..>. 0:127 ^0
|
||||
3/3 ..>. 0:35 ^0 0/0 ..>. 36:71 ^1 0/0 ..>. 72:107 ^2 0/0 ..>. 108:127 ^3
|
||||
3/3f ..>. 0:5 ^0 2/3 ..>. 6:11 ^1 0/0 ..>. 12:17 ^2 0/0 ..>. 18:23 ^3 0/0 ..>. 24:29 ^4 0/0 ..>. 30:35 ^5 0/0 ..>. 36:41 ^0 0/0 ..>. 42:47 ^1 0/0 ..>. 48:53 ^2 0/0 ..>. 54:59 ^3 0/0 ..>. 60:65 ^4 0/0 ..>. 66:71 ^5 0/0 ..>. 72:77 ^0 0/0 ..>. 78:83 ^1 0/0 ..>. 84:89 ^2 0/0 ..>. 90:95 ^3 0/0 ..>. 96:101 ^4 0/0 ..>. 102:107 ^5 0/0 ..>. 108:113 ^0 0/0 ..>. 114:119 ^1 0/0 ..>. 120:125 ^2 0/0 ..>. 126:127 ^3
|
||||
rcu_bh:
|
||||
c=-226 g=-226 s=1 jfq=-5701 j=72c7 nfqs=88/nfqsng=0(88) fqlh=0
|
||||
0/1 .>. 0:127 ^0
|
||||
0/3 .>. 0:35 ^0 0/0 .>. 36:71 ^1 0/0 .>. 72:107 ^2 0/0 .>. 108:127 ^3
|
||||
0/3f .>. 0:5 ^0 0/3 .>. 6:11 ^1 0/0 .>. 12:17 ^2 0/0 .>. 18:23 ^3 0/0 .>. 24:29 ^4 0/0 .>. 30:35 ^5 0/0 .>. 36:41 ^0 0/0 .>. 42:47 ^1 0/0 .>. 48:53 ^2 0/0 .>. 54:59 ^3 0/0 .>. 60:65 ^4 0/0 .>. 66:71 ^5 0/0 .>. 72:77 ^0 0/0 .>. 78:83 ^1 0/0 .>. 84:89 ^2 0/0 .>. 90:95 ^3 0/0 .>. 96:101 ^4 0/0 .>. 102:107 ^5 0/0 .>. 108:113 ^0 0/0 .>. 114:119 ^1 0/0 .>. 120:125 ^2 0/0 .>. 126:127 ^3
|
||||
0/1 ..>. 0:127 ^0
|
||||
0/3 ..>. 0:35 ^0 0/0 ..>. 36:71 ^1 0/0 ..>. 72:107 ^2 0/0 ..>. 108:127 ^3
|
||||
0/3f ..>. 0:5 ^0 0/3 ..>. 6:11 ^1 0/0 ..>. 12:17 ^2 0/0 ..>. 18:23 ^3 0/0 ..>. 24:29 ^4 0/0 ..>. 30:35 ^5 0/0 ..>. 36:41 ^0 0/0 ..>. 42:47 ^1 0/0 ..>. 48:53 ^2 0/0 ..>. 54:59 ^3 0/0 ..>. 60:65 ^4 0/0 ..>. 66:71 ^5 0/0 ..>. 72:77 ^0 0/0 ..>. 78:83 ^1 0/0 ..>. 84:89 ^2 0/0 ..>. 90:95 ^3 0/0 ..>. 96:101 ^4 0/0 ..>. 102:107 ^5 0/0 ..>. 108:113 ^0 0/0 ..>. 114:119 ^1 0/0 ..>. 120:125 ^2 0/0 ..>. 126:127 ^3
|
||||
|
||||
This is once again split into "rcu_sched" and "rcu_bh" portions,
|
||||
and CONFIG_TREE_PREEMPT_RCU kernels will again have an additional
|
||||
@ -240,13 +310,20 @@ o Each element of the form "1/1 0:127 ^0" represents one struct
|
||||
current grace period.
|
||||
|
||||
o The characters separated by the ">" indicate the state
|
||||
of the blocked-tasks lists. A "T" preceding the ">"
|
||||
of the blocked-tasks lists. A "G" preceding the ">"
|
||||
indicates that at least one task blocked in an RCU
|
||||
read-side critical section blocks the current grace
|
||||
period, while a "." preceding the ">" indicates otherwise.
|
||||
The character following the ">" indicates similarly for
|
||||
the next grace period. A "T" should appear in this
|
||||
field only for rcu-preempt.
|
||||
period, while a "E" preceding the ">" indicates that
|
||||
at least one task blocked in an RCU read-side critical
|
||||
section blocks the current expedited grace period.
|
||||
A "T" character following the ">" indicates that at
|
||||
least one task is blocked within an RCU read-side
|
||||
critical section, regardless of whether any current
|
||||
grace period (expedited or normal) is inconvenienced.
|
||||
A "." character appears if the corresponding condition
|
||||
does not hold, so that "..>." indicates that no tasks
|
||||
are blocked. In contrast, "GE>T" indicates maximal
|
||||
inconvenience from blocked tasks.
|
||||
|
||||
o The numbers separated by the ":" are the range of CPUs
|
||||
served by this struct rcu_node. This can be helpful
|
||||
@ -328,6 +405,113 @@ o "nn" is the number of times that this CPU needed nothing. Alert
|
||||
is due to short-circuit evaluation in rcu_pending().
|
||||
|
||||
|
||||
The output of "cat rcu/rcutorture" looks as follows:
|
||||
|
||||
rcutorture test sequence: 0 (test in progress)
|
||||
rcutorture update version number: 615
|
||||
|
||||
The first line shows the number of rcutorture tests that have completed
|
||||
since boot. If a test is currently running, the "(test in progress)"
|
||||
string will appear as shown above. The second line shows the number of
|
||||
update cycles that the current test has started, or zero if there is
|
||||
no test in progress.
|
||||
|
||||
|
||||
The output of "cat rcu/rcuboost" looks as follows:
|
||||
|
||||
0:5 tasks=.... kt=W ntb=0 neb=0 nnb=0 j=2f95 bt=300f
|
||||
balk: nt=0 egt=989 bt=0 nb=0 ny=0 nos=16
|
||||
6:7 tasks=.... kt=W ntb=0 neb=0 nnb=0 j=2f95 bt=300f
|
||||
balk: nt=0 egt=225 bt=0 nb=0 ny=0 nos=6
|
||||
|
||||
This information is output only for rcu_preempt. Each two-line entry
|
||||
corresponds to a leaf rcu_node strcuture. The fields are as follows:
|
||||
|
||||
o "n:m" is the CPU-number range for the corresponding two-line
|
||||
entry. In the sample output above, the first entry covers
|
||||
CPUs zero through five and the second entry covers CPUs 6
|
||||
and 7.
|
||||
|
||||
o "tasks=TNEB" gives the state of the various segments of the
|
||||
rnp->blocked_tasks list:
|
||||
|
||||
"T" This indicates that there are some tasks that blocked
|
||||
while running on one of the corresponding CPUs while
|
||||
in an RCU read-side critical section.
|
||||
|
||||
"N" This indicates that some of the blocked tasks are preventing
|
||||
the current normal (non-expedited) grace period from
|
||||
completing.
|
||||
|
||||
"E" This indicates that some of the blocked tasks are preventing
|
||||
the current expedited grace period from completing.
|
||||
|
||||
"B" This indicates that some of the blocked tasks are in
|
||||
need of RCU priority boosting.
|
||||
|
||||
Each character is replaced with "." if the corresponding
|
||||
condition does not hold.
|
||||
|
||||
o "kt" is the state of the RCU priority-boosting kernel
|
||||
thread associated with the corresponding rcu_node structure.
|
||||
The state can be one of the following:
|
||||
|
||||
"S" The kernel thread is stopped, in other words, all
|
||||
CPUs corresponding to this rcu_node structure are
|
||||
offline.
|
||||
|
||||
"R" The kernel thread is running.
|
||||
|
||||
"W" The kernel thread is waiting because there is no work
|
||||
for it to do.
|
||||
|
||||
"Y" The kernel thread is yielding to avoid hogging CPU.
|
||||
|
||||
"?" Unknown value, indicates a bug.
|
||||
|
||||
o "ntb" is the number of tasks boosted.
|
||||
|
||||
o "neb" is the number of tasks boosted in order to complete an
|
||||
expedited grace period.
|
||||
|
||||
o "nnb" is the number of tasks boosted in order to complete a
|
||||
normal (non-expedited) grace period. When boosting a task
|
||||
that was blocking both an expedited and a normal grace period,
|
||||
it is counted against the expedited total above.
|
||||
|
||||
o "j" is the low-order 16 bits of the jiffies counter in
|
||||
hexadecimal.
|
||||
|
||||
o "bt" is the low-order 16 bits of the value that the jiffies
|
||||
counter will have when we next start boosting, assuming that
|
||||
the current grace period does not end beforehand. This is
|
||||
also in hexadecimal.
|
||||
|
||||
o "balk: nt" counts the number of times we didn't boost (in
|
||||
other words, we balked) even though it was time to boost because
|
||||
there were no blocked tasks to boost. This situation occurs
|
||||
when there is one blocked task on one rcu_node structure and
|
||||
none on some other rcu_node structure.
|
||||
|
||||
o "egt" counts the number of times we balked because although
|
||||
there were blocked tasks, none of them were blocking the
|
||||
current grace period, whether expedited or otherwise.
|
||||
|
||||
o "bt" counts the number of times we balked because boosting
|
||||
had already been initiated for the current grace period.
|
||||
|
||||
o "nb" counts the number of times we balked because there
|
||||
was at least one task blocking the current non-expedited grace
|
||||
period that never had blocked. If it is already running, it
|
||||
just won't help to boost its priority!
|
||||
|
||||
o "ny" counts the number of times we balked because it was
|
||||
not yet time to start boosting.
|
||||
|
||||
o "nos" counts the number of times we balked for other
|
||||
reasons, e.g., the grace period ended first.
|
||||
|
||||
|
||||
CONFIG_TINY_RCU and CONFIG_TINY_PREEMPT_RCU debugfs Files and Formats
|
||||
|
||||
These implementations of RCU provides a single debugfs file under the
|
||||
@ -394,9 +578,9 @@ o "neb" is the number of expedited grace periods that have had
|
||||
o "nnb" is the number of normal grace periods that have had
|
||||
to resort to RCU priority boosting since boot.
|
||||
|
||||
o "j" is the low-order 12 bits of the jiffies counter in hexadecimal.
|
||||
o "j" is the low-order 16 bits of the jiffies counter in hexadecimal.
|
||||
|
||||
o "bt" is the low-order 12 bits of the value that the jiffies counter
|
||||
o "bt" is the low-order 16 bits of the value that the jiffies counter
|
||||
will have at the next time that boosting is scheduled to begin.
|
||||
|
||||
o In the line beginning with "normal balk", the fields are as follows:
|
||||
|
@ -3,24 +3,7 @@ Bus Types
|
||||
|
||||
Definition
|
||||
~~~~~~~~~~
|
||||
|
||||
struct bus_type {
|
||||
char * name;
|
||||
|
||||
struct subsystem subsys;
|
||||
struct kset drivers;
|
||||
struct kset devices;
|
||||
|
||||
struct bus_attribute * bus_attrs;
|
||||
struct device_attribute * dev_attrs;
|
||||
struct driver_attribute * drv_attrs;
|
||||
|
||||
int (*match)(struct device * dev, struct device_driver * drv);
|
||||
int (*hotplug) (struct device *dev, char **envp,
|
||||
int num_envp, char *buffer, int buffer_size);
|
||||
int (*suspend)(struct device * dev, pm_message_t state);
|
||||
int (*resume)(struct device * dev);
|
||||
};
|
||||
See the kerneldoc for the struct bus_type.
|
||||
|
||||
int bus_register(struct bus_type * bus);
|
||||
|
||||
|
@ -27,22 +27,7 @@ The device class structure looks like:
|
||||
typedef int (*devclass_add)(struct device *);
|
||||
typedef void (*devclass_remove)(struct device *);
|
||||
|
||||
struct device_class {
|
||||
char * name;
|
||||
rwlock_t lock;
|
||||
u32 devnum;
|
||||
struct list_head node;
|
||||
|
||||
struct list_head drivers;
|
||||
struct list_head intf_list;
|
||||
|
||||
struct driver_dir_entry dir;
|
||||
struct driver_dir_entry device_dir;
|
||||
struct driver_dir_entry driver_dir;
|
||||
|
||||
devclass_add add_device;
|
||||
devclass_remove remove_device;
|
||||
};
|
||||
See the kerneldoc for the struct class.
|
||||
|
||||
A typical device class definition would look like:
|
||||
|
||||
|
@ -2,96 +2,7 @@
|
||||
The Basic Device Structure
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
struct device {
|
||||
struct list_head g_list;
|
||||
struct list_head node;
|
||||
struct list_head bus_list;
|
||||
struct list_head driver_list;
|
||||
struct list_head intf_list;
|
||||
struct list_head children;
|
||||
struct device * parent;
|
||||
|
||||
char name[DEVICE_NAME_SIZE];
|
||||
char bus_id[BUS_ID_SIZE];
|
||||
|
||||
spinlock_t lock;
|
||||
atomic_t refcount;
|
||||
|
||||
struct bus_type * bus;
|
||||
struct driver_dir_entry dir;
|
||||
|
||||
u32 class_num;
|
||||
|
||||
struct device_driver *driver;
|
||||
void *driver_data;
|
||||
void *platform_data;
|
||||
|
||||
u32 current_state;
|
||||
unsigned char *saved_state;
|
||||
|
||||
void (*release)(struct device * dev);
|
||||
};
|
||||
|
||||
Fields
|
||||
~~~~~~
|
||||
g_list: Node in the global device list.
|
||||
|
||||
node: Node in device's parent's children list.
|
||||
|
||||
bus_list: Node in device's bus's devices list.
|
||||
|
||||
driver_list: Node in device's driver's devices list.
|
||||
|
||||
intf_list: List of intf_data. There is one structure allocated for
|
||||
each interface that the device supports.
|
||||
|
||||
children: List of child devices.
|
||||
|
||||
parent: *** FIXME ***
|
||||
|
||||
name: ASCII description of device.
|
||||
Example: " 3Com Corporation 3c905 100BaseTX [Boomerang]"
|
||||
|
||||
bus_id: ASCII representation of device's bus position. This
|
||||
field should be a name unique across all devices on the
|
||||
bus type the device belongs to.
|
||||
|
||||
Example: PCI bus_ids are in the form of
|
||||
<bus number>:<slot number>.<function number>
|
||||
This name is unique across all PCI devices in the system.
|
||||
|
||||
lock: Spinlock for the device.
|
||||
|
||||
refcount: Reference count on the device.
|
||||
|
||||
bus: Pointer to struct bus_type that device belongs to.
|
||||
|
||||
dir: Device's sysfs directory.
|
||||
|
||||
class_num: Class-enumerated value of the device.
|
||||
|
||||
driver: Pointer to struct device_driver that controls the device.
|
||||
|
||||
driver_data: Driver-specific data.
|
||||
|
||||
platform_data: Platform data specific to the device.
|
||||
|
||||
Example: for devices on custom boards, as typical of embedded
|
||||
and SOC based hardware, Linux often uses platform_data to point
|
||||
to board-specific structures describing devices and how they
|
||||
are wired. That can include what ports are available, chip
|
||||
variants, which GPIO pins act in what additional roles, and so
|
||||
on. This shrinks the "Board Support Packages" (BSPs) and
|
||||
minimizes board-specific #ifdefs in drivers.
|
||||
|
||||
current_state: Current power state of the device.
|
||||
|
||||
saved_state: Pointer to saved state of the device. This is usable by
|
||||
the device driver controlling the device.
|
||||
|
||||
release: Callback to free the device after all references have
|
||||
gone away. This should be set by the allocator of the
|
||||
device (i.e. the bus driver that discovered the device).
|
||||
See the kerneldoc for the struct device.
|
||||
|
||||
|
||||
Programming Interface
|
||||
|
@ -1,23 +1,7 @@
|
||||
|
||||
Device Drivers
|
||||
|
||||
struct device_driver {
|
||||
char * name;
|
||||
struct bus_type * bus;
|
||||
|
||||
struct completion unloaded;
|
||||
struct kobject kobj;
|
||||
list_t devices;
|
||||
|
||||
struct module *owner;
|
||||
|
||||
int (*probe) (struct device * dev);
|
||||
int (*remove) (struct device * dev);
|
||||
|
||||
int (*suspend) (struct device * dev, pm_message_t state);
|
||||
int (*resume) (struct device * dev);
|
||||
};
|
||||
|
||||
See the kerneldoc for the struct device_driver.
|
||||
|
||||
|
||||
Allocation
|
||||
|
@ -460,14 +460,6 @@ Who: Thomas Gleixner <tglx@linutronix.de>
|
||||
|
||||
----------------------------
|
||||
|
||||
What: The acpi_sleep=s4_nonvs command line option
|
||||
When: 2.6.37
|
||||
Files: arch/x86/kernel/acpi/sleep.c
|
||||
Why: superseded by acpi_sleep=nonvs
|
||||
Who: Rafael J. Wysocki <rjw@sisk.pl>
|
||||
|
||||
----------------------------
|
||||
|
||||
What: PCI DMA unmap state API
|
||||
When: August 2012
|
||||
Why: PCI DMA unmap state API (include/linux/pci-dma.h) was replaced
|
||||
|
@ -836,7 +836,6 @@ Provides counts of softirq handlers serviced since boot time, for each cpu.
|
||||
TASKLET: 0 0 0 290
|
||||
SCHED: 27035 26983 26971 26746
|
||||
HRTIMER: 0 0 0 0
|
||||
RCU: 1678 1769 2178 2250
|
||||
|
||||
|
||||
1.3 IDE devices in /proc/ide
|
||||
|
@ -11,14 +11,14 @@ for non English (read: Japanese) speakers and is not intended as a
|
||||
fork. So if you have any comments or updates for this file, please try
|
||||
to update the original English file first.
|
||||
|
||||
Last Updated: 2008/10/24
|
||||
Last Updated: 2011/03/31
|
||||
==================================
|
||||
これは、
|
||||
linux-2.6.28/Documentation/HOWTO
|
||||
linux-2.6.38/Documentation/HOWTO
|
||||
の和訳です。
|
||||
|
||||
翻訳団体: JF プロジェクト < http://www.linux.or.jp/JF/ >
|
||||
翻訳日: 2008/10/24
|
||||
翻訳日: 2011/3/28
|
||||
翻訳者: Tsugikazu Shibata <tshibata at ab dot jp dot nec dot com>
|
||||
校正者: 松倉さん <nbh--mats at nifty dot com>
|
||||
小林 雅典さん (Masanori Kobayasi) <zap03216 at nifty dot ne dot jp>
|
||||
@ -256,8 +256,8 @@ Linux カーネルの開発プロセスは現在幾つかの異なるメイン
|
||||
- メインの 2.6.x カーネルツリー
|
||||
- 2.6.x.y -stable カーネルツリー
|
||||
- 2.6.x -git カーネルパッチ
|
||||
- 2.6.x -mm カーネルパッチ
|
||||
- サブシステム毎のカーネルツリーとパッチ
|
||||
- 統合テストのための 2.6.x -next カーネルツリー
|
||||
|
||||
2.6.x カーネルツリー
|
||||
-----------------
|
||||
@ -268,9 +268,9 @@ Linux カーネルの開発プロセスは現在幾つかの異なるメイン
|
||||
|
||||
- 新しいカーネルがリリースされた直後に、2週間の特別期間が設けられ、
|
||||
この期間中に、メンテナ達は Linus に大きな差分を送ることができます。
|
||||
このような差分は通常 -mm カーネルに数週間含まれてきたパッチです。
|
||||
このような差分は通常 -next カーネルに数週間含まれてきたパッチです。
|
||||
大きな変更は git(カーネルのソース管理ツール、詳細は
|
||||
http://git.or.cz/ 参照) を使って送るのが好ましいやり方ですが、パッ
|
||||
http://git-scm.com/ 参照) を使って送るのが好ましいやり方ですが、パッ
|
||||
チファイルの形式のまま送るのでも十分です。
|
||||
|
||||
- 2週間後、-rc1 カーネルがリリースされ、この後にはカーネル全体の安定
|
||||
@ -333,86 +333,44 @@ git リポジトリで管理されているLinus のカーネルツリーの毎
|
||||
れは -rc カーネルと比べて、パッチが大丈夫かどうかも確認しないで自動的
|
||||
に生成されるので、より実験的です。
|
||||
|
||||
2.6.x -mm カーネルパッチ
|
||||
------------------------
|
||||
|
||||
Andrew Morton によってリリースされる実験的なカーネルパッチ群です。
|
||||
Andrew は個別のサブシステムカーネルツリーとパッチを全て集めてきて
|
||||
linux-kernel メーリングリストで収集された多数のパッチと同時に一つにま
|
||||
とめます。
|
||||
このツリーは新機能とパッチが検証される場となります。ある期間の間パッチ
|
||||
が -mm に入って価値を証明されたら、Andrew やサブシステムメンテナが、
|
||||
メインラインへ入れるように Linus にプッシュします。
|
||||
|
||||
メインカーネルツリーに含めるために Linus に送る前に、すべての新しいパッ
|
||||
チが -mm ツリーでテストされることが強く推奨されています。マージウィン
|
||||
ドウが開く前に -mm ツリーに現れなかったパッチはメインラインにマージさ
|
||||
れることは困難になります。
|
||||
|
||||
これらのカーネルは安定して動作すべきシステムとして使うのには適切ではあ
|
||||
りませんし、カーネルブランチの中でももっとも動作にリスクが高いものです。
|
||||
|
||||
もしあなたが、カーネル開発プロセスの支援をしたいと思っているのであれば、
|
||||
どうぞこれらのカーネルリリースをテストに使ってみて、そしてもし問題があ
|
||||
れば、またもし全てが正しく動作したとしても、linux-kernel メーリングリ
|
||||
ストにフィードバックを提供してください。
|
||||
|
||||
すべての他の実験的パッチに加えて、これらのカーネルは通常リリース時点で
|
||||
メインラインの -git カーネルに含まれる全ての変更も含んでいます。
|
||||
|
||||
-mm カーネルは決まったスケジュールではリリースされません、しかし通常幾
|
||||
つかの -mm カーネル (1 から 3 が普通)が各-rc カーネルの間にリリースさ
|
||||
れます。
|
||||
|
||||
サブシステム毎のカーネルツリーとパッチ
|
||||
-------------------------------------------
|
||||
|
||||
カーネルの様々な領域で何が起きているかを見られるようにするため、多くの
|
||||
カーネルサブシステム開発者は彼らの開発ツリーを公開しています。これらの
|
||||
ツリーは説明したように -mm カーネルリリースに入れ込まれます。
|
||||
それぞれのカーネルサブシステムのメンテナ達は --- そして多くのカーネル
|
||||
サブシステムの開発者達も --- 各自の最新の開発状況をソースリポジトリに
|
||||
公開しています。そのため、自分とは異なる領域のカーネルで何が起きている
|
||||
かを他の人が見られるようになっています。開発が早く進んでいる領域では、
|
||||
開発者は自身の投稿がどのサブシステムカーネルツリーを元にしているか質問
|
||||
されるので、その投稿とすでに進行中の他の作業との衝突が避けられます。
|
||||
|
||||
以下はさまざまなカーネルツリーの中のいくつかのリスト-
|
||||
大部分のこれらのリポジトリは git ツリーです。しかしその他の SCM や
|
||||
quilt シリーズとして公開されているパッチキューも使われています。これら
|
||||
のサブシステムリポジトリのアドレスは MAINTAINERS ファイルにリストされ
|
||||
ています。これらの多くは http://git.kernel.org/ で参照することができま
|
||||
す。
|
||||
|
||||
git ツリー-
|
||||
- Kbuild の開発ツリー、Sam Ravnborg <sam@ravnborg.org>
|
||||
git.kernel.org:/pub/scm/linux/kernel/git/sam/kbuild.git
|
||||
提案されたパッチがこのようなサブシステムツリーにコミットされる前に、メー
|
||||
リングリストで事前にレビューにかけられます(以下の対応するセクションを
|
||||
参照)。いくつかのカーネルサブシステムでは、このレビューは patchwork
|
||||
というツールによって追跡されます。Patchwork は web インターフェイスに
|
||||
よってパッチ投稿の表示、パッチへのコメント付けや改訂などができ、そして
|
||||
メンテナはパッチに対して、レビュー中、受付済み、拒否というようなマーク
|
||||
をつけることができます。大部分のこれらの patchwork のサイトは
|
||||
http://patchwork.kernel.org/ でリストされています。
|
||||
|
||||
- ACPI の開発ツリー、 Len Brown <len.brown@intel.com>
|
||||
git.kernel.org:/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git
|
||||
統合テストのための 2.6.x -next カーネルツリー
|
||||
---------------------------------------------
|
||||
|
||||
- Block の開発ツリー、Jens Axboe <axboe@suse.de>
|
||||
git.kernel.org:/pub/scm/linux/kernel/git/axboe/linux-2.6-block.git
|
||||
サブシステムツリーの更新内容がメインラインの 2.6.x ツリーにマージされ
|
||||
る前に、それらは統合テストされる必要があります。この目的のため、実質的
|
||||
に全サブシステムツリーからほぼ毎日プルされてできる特別なテスト用のリ
|
||||
ポジトリが存在します-
|
||||
http://git.kernel.org/?p=linux/kernel/git/sfr/linux-next.git
|
||||
http://linux.f-seidel.de/linux-next/pmwiki/
|
||||
|
||||
- DRM の開発ツリー、Dave Airlie <airlied@linux.ie>
|
||||
git.kernel.org:/pub/scm/linux/kernel/git/airlied/drm-2.6.git
|
||||
|
||||
- ia64 の開発ツリー、Tony Luck <tony.luck@intel.com>
|
||||
git.kernel.org:/pub/scm/linux/kernel/git/aegl/linux-2.6.git
|
||||
|
||||
- infiniband, Roland Dreier <rolandd@cisco.com>
|
||||
git.kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git
|
||||
|
||||
- libata, Jeff Garzik <jgarzik@pobox.com>
|
||||
git.kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev.git
|
||||
|
||||
- ネットワークドライバ, Jeff Garzik <jgarzik@pobox.com>
|
||||
git.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6.git
|
||||
|
||||
- pcmcia, Dominik Brodowski <linux@dominikbrodowski.net>
|
||||
git.kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git
|
||||
|
||||
- SCSI, James Bottomley <James.Bottomley@hansenpartnership.com>
|
||||
git.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git
|
||||
|
||||
- x86, Ingo Molnar <mingo@elte.hu>
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86.git
|
||||
|
||||
quilt ツリー-
|
||||
- USB, ドライバコアと I2C, Greg Kroah-Hartman <gregkh@suse.de>
|
||||
kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
|
||||
|
||||
その他のカーネルツリーは http://git.kernel.org/ と MAINTAINERS ファ
|
||||
イルに一覧表があります。
|
||||
このやり方によって、-next カーネルは次のマージ機会でどんなものがメイン
|
||||
ラインカーネルにマージされるか、おおまかなの展望を提供します。-next
|
||||
カーネルの実行テストを行う冒険好きなテスターは大いに歓迎されます
|
||||
|
||||
バグレポート
|
||||
-------------
|
||||
@ -673,10 +631,9 @@ Linux カーネルコミュニティは、一度に大量のコードの塊を
|
||||
じところからスタートしたのですから。
|
||||
|
||||
Paolo Ciarrocchi に感謝、彼は彼の書いた "Development Process"
|
||||
(http://linux.tar.bz/articles/2.6-development_process)セクショ
|
||||
ンをこのテキストの原型にすることを許可してくれました。
|
||||
Rundy Dunlap と Gerrit Huizenga はメーリングリストでやるべきこととやっ
|
||||
てはいけないことのリストを提供してくれました。
|
||||
(http://lwn.net/Articles/94386/) セクションをこのテキストの原型にする
|
||||
ことを許可してくれました。Rundy Dunlap と Gerrit Huizenga はメーリング
|
||||
リストでやるべきこととやってはいけないことのリストを提供してくれました。
|
||||
以下の人々のレビュー、コメント、貢献に感謝。
|
||||
Pat Mochel, Hanna Linder, Randy Dunlap, Kay Sievers,
|
||||
Vojtech Pavlik, Jan Kara, Josh Boyer, Kees Cook, Andrew Morton, Andi
|
||||
|
@ -245,7 +245,7 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
||||
|
||||
acpi_sleep= [HW,ACPI] Sleep options
|
||||
Format: { s3_bios, s3_mode, s3_beep, s4_nohwsig,
|
||||
old_ordering, s4_nonvs, sci_force_enable }
|
||||
old_ordering, nonvs, sci_force_enable }
|
||||
See Documentation/power/video.txt for information on
|
||||
s3_bios and s3_mode.
|
||||
s3_beep is for debugging; it makes the PC's speaker beep
|
||||
@ -1664,6 +1664,10 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
||||
noexec=on: enable non-executable mappings (default)
|
||||
noexec=off: disable non-executable mappings
|
||||
|
||||
nosmep [X86]
|
||||
Disable SMEP (Supervisor Mode Execution Protection)
|
||||
even if it is supported by processor.
|
||||
|
||||
noexec32 [X86-64]
|
||||
This affects only 32-bit executables.
|
||||
noexec32=on: enable non-executable mappings (default)
|
||||
|
@ -279,11 +279,15 @@ When the system goes into the standby or memory sleep state, the phases are:
|
||||
time.) Unlike the other suspend-related phases, during the prepare
|
||||
phase the device tree is traversed top-down.
|
||||
|
||||
The prepare phase uses only a bus callback. After the callback method
|
||||
returns, no new children may be registered below the device. The method
|
||||
may also prepare the device or driver in some way for the upcoming
|
||||
system power transition, but it should not put the device into a
|
||||
low-power state.
|
||||
In addition to that, if device drivers need to allocate additional
|
||||
memory to be able to hadle device suspend correctly, that should be
|
||||
done in the prepare phase.
|
||||
|
||||
After the prepare callback method returns, no new children may be
|
||||
registered below the device. The method may also prepare the device or
|
||||
driver in some way for the upcoming system power transition (for
|
||||
example, by allocating additional memory required for this purpose), but
|
||||
it should not put the device into a low-power state.
|
||||
|
||||
2. The suspend methods should quiesce the device to stop it from performing
|
||||
I/O. They also may save the device registers and put it into the
|
||||
|
@ -1,46 +1,41 @@
|
||||
Suspend notifiers
|
||||
(C) 2007 Rafael J. Wysocki <rjw@sisk.pl>, GPL
|
||||
(C) 2007-2011 Rafael J. Wysocki <rjw@sisk.pl>, GPL
|
||||
|
||||
There are some operations that device drivers may want to carry out in their
|
||||
.suspend() routines, but shouldn't, because they can cause the hibernation or
|
||||
suspend to fail. For example, a driver may want to allocate a substantial amount
|
||||
of memory (like 50 MB) in .suspend(), but that shouldn't be done after the
|
||||
swsusp's memory shrinker has run.
|
||||
There are some operations that subsystems or drivers may want to carry out
|
||||
before hibernation/suspend or after restore/resume, but they require the system
|
||||
to be fully functional, so the drivers' and subsystems' .suspend() and .resume()
|
||||
or even .prepare() and .complete() callbacks are not suitable for this purpose.
|
||||
For example, device drivers may want to upload firmware to their devices after
|
||||
resume/restore, but they cannot do it by calling request_firmware() from their
|
||||
.resume() or .complete() routines (user land processes are frozen at these
|
||||
points). The solution may be to load the firmware into memory before processes
|
||||
are frozen and upload it from there in the .resume() routine.
|
||||
A suspend/hibernation notifier may be used for this purpose.
|
||||
|
||||
Also, there may be some operations, that subsystems want to carry out before a
|
||||
hibernation/suspend or after a restore/resume, requiring the system to be fully
|
||||
functional, so the drivers' .suspend() and .resume() routines are not suitable
|
||||
for this purpose. For example, device drivers may want to upload firmware to
|
||||
their devices after a restore from a hibernation image, but they cannot do it by
|
||||
calling request_firmware() from their .resume() routines (user land processes
|
||||
are frozen at this point). The solution may be to load the firmware into
|
||||
memory before processes are frozen and upload it from there in the .resume()
|
||||
routine. Of course, a hibernation notifier may be used for this purpose.
|
||||
|
||||
The subsystems that have such needs can register suspend notifiers that will be
|
||||
called upon the following events by the suspend core:
|
||||
The subsystems or drivers having such needs can register suspend notifiers that
|
||||
will be called upon the following events by the PM core:
|
||||
|
||||
PM_HIBERNATION_PREPARE The system is going to hibernate or suspend, tasks will
|
||||
be frozen immediately.
|
||||
|
||||
PM_POST_HIBERNATION The system memory state has been restored from a
|
||||
hibernation image or an error occurred during the
|
||||
hibernation. Device drivers' .resume() callbacks have
|
||||
hibernation image or an error occurred during
|
||||
hibernation. Device drivers' restore callbacks have
|
||||
been executed and tasks have been thawed.
|
||||
|
||||
PM_RESTORE_PREPARE The system is going to restore a hibernation image.
|
||||
If all goes well the restored kernel will issue a
|
||||
If all goes well, the restored kernel will issue a
|
||||
PM_POST_HIBERNATION notification.
|
||||
|
||||
PM_POST_RESTORE An error occurred during the hibernation restore.
|
||||
Device drivers' .resume() callbacks have been executed
|
||||
PM_POST_RESTORE An error occurred during restore from hibernation.
|
||||
Device drivers' restore callbacks have been executed
|
||||
and tasks have been thawed.
|
||||
|
||||
PM_SUSPEND_PREPARE The system is preparing for a suspend.
|
||||
PM_SUSPEND_PREPARE The system is preparing for suspend.
|
||||
|
||||
PM_POST_SUSPEND The system has just resumed or an error occurred during
|
||||
the suspend. Device drivers' .resume() callbacks have
|
||||
been executed and tasks have been thawed.
|
||||
suspend. Device drivers' resume callbacks have been
|
||||
executed and tasks have been thawed.
|
||||
|
||||
It is generally assumed that whatever the notifiers do for
|
||||
PM_HIBERNATION_PREPARE, should be undone for PM_POST_HIBERNATION. Analogously,
|
||||
|
@ -120,7 +120,6 @@ format:
|
||||
field:unsigned char common_flags; offset:2; size:1; signed:0;
|
||||
field:unsigned char common_preempt_count; offset:3; size:1;signed:0;
|
||||
field:int common_pid; offset:4; size:4; signed:1;
|
||||
field:int common_lock_depth; offset:8; size:4; signed:1;
|
||||
|
||||
field:unsigned long __probe_ip; offset:12; size:4; signed:0;
|
||||
field:int __probe_nargs; offset:16; size:4; signed:1;
|
||||
|
10
Documentation/virtual/00-INDEX
Normal file
10
Documentation/virtual/00-INDEX
Normal file
@ -0,0 +1,10 @@
|
||||
Virtualization support in the Linux kernel.
|
||||
|
||||
00-INDEX
|
||||
- this file.
|
||||
kvm/
|
||||
- Kernel Virtual Machine. See also http://linux-kvm.org
|
||||
lguest/
|
||||
- Extremely simple hypervisor for experimental/educational use.
|
||||
uml/
|
||||
- User Mode Linux, builds/runs Linux kernel as a userspace program.
|
@ -7,7 +7,7 @@ Review checklist for kvm patches
|
||||
2. Patches should be against kvm.git master branch.
|
||||
|
||||
3. If the patch introduces or modifies a new userspace API:
|
||||
- the API must be documented in Documentation/kvm/api.txt
|
||||
- the API must be documented in Documentation/virtual/kvm/api.txt
|
||||
- the API must be discoverable using KVM_CHECK_EXTENSION
|
||||
|
||||
4. New state must include support for save/restore.
|
@ -74,7 +74,8 @@ Running Lguest:
|
||||
|
||||
- Run an lguest as root:
|
||||
|
||||
Documentation/lguest/lguest 64 vmlinux --tunnet=192.168.19.1 --block=rootfile root=/dev/vda
|
||||
Documentation/virtual/lguest/lguest 64 vmlinux --tunnet=192.168.19.1 \
|
||||
--block=rootfile root=/dev/vda
|
||||
|
||||
Explanation:
|
||||
64: the amount of memory to use, in MB.
|
@ -206,7 +206,7 @@ IOMMU (input/output memory management unit)
|
||||
(e.g. because you have < 3 GB memory).
|
||||
Kernel boot message: "PCI-DMA: Disabling IOMMU"
|
||||
|
||||
2. <arch/x86_64/kernel/pci-gart.c>: AMD GART based hardware IOMMU.
|
||||
2. <arch/x86/kernel/amd_gart_64.c>: AMD GART based hardware IOMMU.
|
||||
Kernel boot message: "PCI-DMA: using GART IOMMU"
|
||||
|
||||
3. <arch/x86_64/kernel/pci-swiotlb.c> : Software IOMMU implementation. Used
|
||||
|
210
Documentation/zh_CN/email-clients.txt
Normal file
210
Documentation/zh_CN/email-clients.txt
Normal file
@ -0,0 +1,210 @@
|
||||
锘?Chinese translated version of Documentation/email-clients.txt
|
||||
|
||||
If you have any comment or update to the content, please contact the
|
||||
original document maintainer directly. However, if you have a problem
|
||||
communicating in English you can also ask the Chinese maintainer for
|
||||
help. Contact the Chinese maintainer if this translation is outdated
|
||||
or if there is a problem with the translation.
|
||||
|
||||
Chinese maintainer: Harry Wei <harryxiyou@gmail.com>
|
||||
---------------------------------------------------------------------
|
||||
Documentation/email-clients.txt ???涓????缈昏??
|
||||
|
||||
濡??????宠??璁烘????存?版???????????瀹癸??璇风?存?ヨ??绯诲?????妗g??缁存?よ?????濡????浣?浣跨?ㄨ?辨??
|
||||
浜ゆ???????伴?剧??璇?锛?涔????浠ュ??涓???????缁存?よ??姹???┿??濡???????缈昏????存?颁???????舵?????缈?
|
||||
璇?瀛???ㄩ??棰?锛?璇疯??绯讳腑??????缁存?よ?????
|
||||
|
||||
涓???????缁存?よ??锛? 璐惧??濞? Harry Wei <harryxiyou@gmail.com>
|
||||
涓???????缈昏?????锛? 璐惧??濞? Harry Wei <harryxiyou@gmail.com>
|
||||
涓?????????¤?????锛? Yinglin Luan <synmyth@gmail.com>
|
||||
Xiaochen Wang <wangxiaochen0@gmail.com>
|
||||
yaxinsn <yaxinsn@163.com>
|
||||
|
||||
浠ヤ??涓烘?f??
|
||||
---------------------------------------------------------------------
|
||||
|
||||
Linux???浠跺?㈡?风?????缃?淇℃??
|
||||
======================================================================
|
||||
|
||||
?????????缃?
|
||||
----------------------------------------------------------------------
|
||||
Linux?????歌ˉ涓???????杩????浠惰?????浜ょ??锛????濂芥??琛ヤ??浣?涓洪??浠朵????????宓?????????????浜?缁存?よ??
|
||||
??ユ?堕??浠讹??浣???????浠剁?????瀹规?煎??搴?璇ユ??"text/plain"?????惰??锛????浠朵????????涓?璧???????锛?
|
||||
???涓鸿??浼?浣胯ˉ涓????寮???ㄩ?ㄥ????ㄨ??璁鸿??绋?涓???????寰???伴?俱??
|
||||
|
||||
??ㄦ?ュ?????Linux?????歌ˉ涓???????浠跺?㈡?风????ㄥ?????琛ヤ????跺??璇ュ??浜?????????????濮???舵?????渚?濡?锛?
|
||||
浠?浠?涓???芥?瑰?????????????ゅ?惰〃绗???????绌烘?硷???????虫????ㄦ??涓?琛????寮?澶存?????缁?灏俱??
|
||||
|
||||
涓?瑕????杩?"format=flowed"妯″????????琛ヤ?????杩???蜂??寮?璧蜂?????棰????浠ュ?????瀹崇?????琛????
|
||||
|
||||
涓?瑕?璁╀????????浠跺?㈡?风??杩?琛??????ㄦ?㈣?????杩???蜂??浼???村??浣????琛ヤ?????
|
||||
|
||||
???浠跺?㈡?风??涓???芥?瑰???????????瀛?绗????缂??????瑰?????瑕??????????琛ヤ???????芥??ASCII??????UTF-8缂??????瑰??锛?
|
||||
濡????浣?浣跨??UTF-8缂??????瑰???????????浠讹????d??浣?灏?浼???垮??涓?浜??????藉????????瀛?绗???????棰????
|
||||
|
||||
???浠跺?㈡?风??搴?璇ュ舰???骞朵??淇???? References: ?????? In-Reply-To: ???棰?锛???d??
|
||||
???浠惰??棰?灏变??浼?涓???????
|
||||
|
||||
澶???剁??甯?(?????????璐寸??甯?)???甯镐????界?ㄤ??琛ヤ??锛????涓哄?惰〃绗?浼?杞????涓虹┖??笺??浣跨??xclipboard, xclip
|
||||
??????xcutsel涔?璁稿??浠ワ??浣???????濂芥??璇?涓?涓?????????垮??浣跨?ㄥ????剁??甯????
|
||||
|
||||
涓?瑕???ㄤ娇???PGP/GPG缃插????????浠朵腑??????琛ヤ?????杩???蜂??浣垮??寰?澶???????涓???借?诲??????????ㄤ??浣????琛ヤ?????
|
||||
锛?杩?涓????棰?搴?璇ユ?????浠ヤ慨澶????锛?
|
||||
|
||||
??ㄧ???????搁??浠跺??琛ㄥ?????琛ヤ??涔????锛?缁????宸卞?????涓?涓?琛ヤ?????涓?涓???????涓绘??锛?淇?瀛???ユ?跺?扮??
|
||||
???浠讹??灏?琛ヤ?????'patch'??戒护???涓?锛?濡??????????浜?锛????缁??????搁??浠跺??琛ㄥ????????
|
||||
|
||||
|
||||
涓?浜????浠跺?㈡?风?????绀?
|
||||
----------------------------------------------------------------------
|
||||
杩????缁???轰??浜?璇?缁????MUA???缃????绀猴?????浠ョ?ㄤ??缁?Linux?????稿?????琛ヤ?????杩?浜?骞朵???????虫??
|
||||
?????????杞?浠跺?????缃???荤?????
|
||||
|
||||
璇存??锛?
|
||||
TUI = 浠ユ?????涓哄?虹???????ㄦ?锋?ュ??
|
||||
GUI = ??惧舰?????㈢?ㄦ?锋?ュ??
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Alpine (TUI)
|
||||
|
||||
???缃????椤癸??
|
||||
???"Sending Preferences"??ㄥ??锛?
|
||||
|
||||
- "Do Not Send Flowed Text"蹇?椤诲?????
|
||||
- "Strip Whitespace Before Sending"蹇?椤诲?抽??
|
||||
|
||||
褰???????浠舵?讹????????搴?璇ユ?惧?ㄨˉ涓?浼???虹?扮????版?癸????跺?????涓?CTRL-R缁???????锛?浣挎??瀹????
|
||||
琛ヤ?????浠跺????ュ?伴??浠朵腑???
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Evolution (GUI)
|
||||
|
||||
涓?浜?寮????????????????浣跨?ㄥ????????琛ヤ??
|
||||
|
||||
褰??????╅??浠堕??椤癸??Preformat
|
||||
浠?Format->Heading->Preformatted (Ctrl-7)??????宸ュ?锋??
|
||||
|
||||
??跺??浣跨??锛?
|
||||
Insert->Text File... (Alt-n x)?????ヨˉ涓????浠躲??
|
||||
|
||||
浣?杩????浠?"diff -Nru old.c new.c | xclip"锛???????Preformat锛???跺??浣跨?ㄤ腑??撮??杩?琛?绮?甯????
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Kmail (GUI)
|
||||
|
||||
涓?浜?寮????????????????浣跨?ㄥ????????琛ヤ?????
|
||||
|
||||
榛?璁よ?剧疆涓?涓?HTML??煎??????????????锛?涓?瑕??????ㄥ?????
|
||||
|
||||
褰?涔????涓?灏????浠剁????跺??锛???ㄩ??椤逛?????涓?瑕??????╄????ㄦ?㈣????????涓????缂虹?瑰氨???浣???ㄩ??浠朵腑杈???ョ??浠讳????????
|
||||
??戒??浼?琚??????ㄦ?㈣??锛????姝や??蹇?椤诲?ㄥ?????琛ヤ??涔?????????ㄦ?㈣????????绠?????????规??灏辨???????ㄨ????ㄦ?㈣????ヤ功??????浠讹??
|
||||
??跺?????瀹?淇?瀛?涓鸿??绋裤??涓????浣???ㄨ??绋夸腑???娆℃??寮?瀹?锛?瀹?宸茬????ㄩ?ㄨ????ㄦ?㈣??浜?锛???d??浣???????浠惰?界?舵病???
|
||||
?????╄????ㄦ?㈣??锛?浣????杩?涓?浼?澶卞?诲凡???????????ㄦ?㈣?????
|
||||
|
||||
??ㄩ??浠剁??搴????锛??????ヨˉ涓?涔????锛???句??甯哥?ㄧ??琛ヤ??瀹????绗?锛?涓?涓?杩?瀛????(---)???
|
||||
|
||||
??跺?????"Message"????????$??锛??????╂????ユ??浠讹????ョ????????浣????琛ヤ?????浠躲??杩????涓?涓?棰?澶???????椤癸??浣????浠?
|
||||
???杩?瀹????缃?浣???????浠跺缓绔?宸ュ?锋????????锛?杩????浠ュ甫涓?"insert file"??炬?????
|
||||
|
||||
浣????浠ュ????ㄥ?伴??杩?GPG???璁伴??浠讹??浣???????宓?琛ヤ?????濂戒??瑕?浣跨??GPG???璁板??浠????浣?涓哄??宓??????????绛惧??琛ヤ??锛?
|
||||
褰?浠?GPG涓???????7浣?缂??????朵??浣夸??浠?????????村??澶???????
|
||||
|
||||
濡????浣????瑕?浠ラ??浠剁??褰㈠????????琛ヤ??锛???d??灏卞?抽????瑰?婚??浠讹????跺?????涓?灞???э??绐????"Suggest automatic
|
||||
display"锛?杩???峰??宓????浠舵?村?规??璁╄?昏???????般??
|
||||
|
||||
褰?浣?瑕?淇?瀛?灏?瑕?????????????宓???????琛ヤ??锛?浣????浠ヤ??娑???????琛ㄧ????奸????╁?????琛ヤ????????浠讹????跺????冲?婚?????
|
||||
"save as"???浣????浠ヤ娇??ㄤ??涓?娌℃????存?圭????????琛ヤ????????浠讹??濡????瀹????浠ユ?g‘???褰㈠??缁???????褰?浣?姝g????ㄥ??
|
||||
???宸辩??绐???d??涓?瀵????锛???f?舵病??????椤瑰??浠ヤ??瀛????浠?--宸茬?????涓?涓?杩???风??bug琚?姹???ュ?颁??kmail???bugzilla
|
||||
骞朵??甯????杩?灏?浼?琚?澶??????????浠舵??浠ュ?????瀵规??涓???ㄦ?峰??璇诲???????????琚?淇?瀛????锛????浠ュ?????浣???虫?????浠跺????跺?板?朵????版?癸??
|
||||
浣?涓?寰?涓????浠?浠????????????逛负缁?????????翠?????璇汇??
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Lotus Notes (GUI)
|
||||
|
||||
涓?瑕?浣跨?ㄥ?????
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Mutt (TUI)
|
||||
|
||||
寰?澶?Linux寮????浜哄??浣跨??mutt瀹㈡?风??锛????浠ヨ?????瀹????瀹?宸ヤ????????甯告??浜????
|
||||
|
||||
Mutt涓????甯?缂?杈????锛????浠ヤ??绠′??浣跨?ㄤ??涔?缂?杈???ㄩ?戒??搴?璇ュ甫????????ㄦ??琛????澶у????扮??杈???ㄩ?藉甫???
|
||||
涓?涓?"insert file"???椤癸??瀹????浠ラ??杩?涓???瑰?????浠跺??瀹圭????瑰???????ユ??浠躲??
|
||||
|
||||
'vim'浣?涓?mutt???缂?杈????锛?
|
||||
set editor="vi"
|
||||
|
||||
濡????浣跨??xclip锛???插?ヤ互涓???戒护
|
||||
:set paste
|
||||
???涓????涔??????????shift-insert??????浣跨??
|
||||
:r filename
|
||||
|
||||
濡??????宠?????琛ヤ??浣?涓哄??宓??????????
|
||||
(a)ttach宸ヤ?????寰?濂斤??涓?甯????"set paste"???
|
||||
|
||||
???缃????椤癸??
|
||||
瀹?搴?璇ヤ互榛?璁よ?剧疆???褰㈠??宸ヤ?????
|
||||
??惰??锛????"send_charset"璁剧疆涓?"us-ascii::utf-8"涔????涓?涓?涓???????涓绘?????
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Pine (TUI)
|
||||
|
||||
Pine杩???绘??涓?浜?绌烘?煎????????棰?锛?浣????杩?浜???板?ㄥ??璇ラ?借??淇?澶?浜????
|
||||
|
||||
濡???????浠ワ??璇蜂娇???alpine(pine???缁ф?胯??)
|
||||
|
||||
???缃????椤癸??
|
||||
- ???杩?????????????瑕?娑???ゆ??绋???????
|
||||
- "no-strip-whitespace-before-send"???椤逛????????瑕???????
|
||||
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Sylpheed (GUI)
|
||||
|
||||
- ???宓??????????浠ュ??濂界??宸ヤ??锛???????浣跨?ㄩ??浠讹?????
|
||||
- ???璁镐娇??ㄥ????ㄧ??缂?杈???ㄣ??
|
||||
- 瀵逛?????褰?杈?澶???堕??甯告?????
|
||||
- 濡???????杩?non-SSL杩???ワ?????娉?浣跨??TLS SMTP?????????
|
||||
- ??ㄧ?????绐???d腑???涓?涓?寰??????ㄧ??ruler bar???
|
||||
- 缁???板?????涓?娣诲????板??灏变??浼?姝g‘???浜?瑙f?剧ず??????
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Thunderbird (GUI)
|
||||
|
||||
榛?璁ゆ????典??锛?thunderbird寰?瀹规??????????????锛?浣????杩????涓?浜???规?????浠ュ己??跺?????寰???村ソ???
|
||||
|
||||
- ??ㄧ?ㄦ?峰????疯?剧疆???锛?缁???????瀵诲??锛?涓?瑕???????"Compose messages in HTML format"???
|
||||
|
||||
- 缂?杈?浣????Thunderbird???缃?璁剧疆??ヤ娇瀹?涓?瑕????琛?浣跨??锛?user_pref("mailnews.wraplength", 0);
|
||||
|
||||
- 缂?杈?浣????Thunderbird???缃?璁剧疆锛?浣垮??涓?瑕?浣跨??"format=flowed"??煎??锛?user_pref("mailnews.
|
||||
send_plaintext_flowed", false);
|
||||
|
||||
- 浣????瑕?浣?Thunderbird???涓洪???????煎????瑰??锛?
|
||||
濡????榛?璁ゆ????典??浣?涔??????????HTML??煎??锛???d?????寰???俱??浠?浠?浠????棰???????涓????妗?涓???????"Preformat"??煎?????
|
||||
濡????榛?璁ゆ????典??浣?涔??????????????????煎??锛?浣?涓?寰????瀹???逛负HTML??煎??锛?浠?浠?浣?涓轰??娆℃?х??锛???ヤ功?????扮??娑????锛?
|
||||
??跺??寮哄?朵娇瀹??????版???????煎??锛???????瀹?灏变?????琛????瑕?瀹???板??锛???ㄥ??淇$????炬??涓?浣跨??shift?????ヤ娇瀹????涓?HTML
|
||||
??煎??锛???跺?????棰???????涓????妗?涓???????"Preformat"??煎?????
|
||||
|
||||
- ???璁镐娇??ㄥ????ㄧ??缂?杈????锛?
|
||||
???瀵?Thunderbird???琛ヤ?????绠?????????规??灏辨??浣跨?ㄤ??涓?"external editor"??╁??锛???跺??浣跨?ㄤ????????娆㈢??
|
||||
$EDITOR??ヨ?诲???????????骞惰ˉ涓???版?????涓????瑕?瀹???板??锛????浠ヤ??杞藉苟涓?瀹?瑁?杩?涓???╁??锛???跺??娣诲??涓?涓?浣跨?ㄥ?????
|
||||
??????View->Toolbars->Customize...??????褰?浣?涔????淇℃???????跺??浠?浠???瑰?诲??灏卞??浠ヤ?????
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
TkRat (GUI)
|
||||
|
||||
???浠ヤ娇??ㄥ?????浣跨??"Insert file..."??????澶???ㄧ??缂?杈???ㄣ??
|
||||
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
Gmail (Web GUI)
|
||||
|
||||
涓?瑕?浣跨?ㄥ????????琛ヤ?????
|
||||
|
||||
Gmail缃?椤靛?㈡?风???????ㄥ?版????惰〃绗?杞????涓虹┖??笺??
|
||||
|
||||
??界?跺?惰〃绗?杞????涓虹┖??奸??棰????浠ヨ??澶???ㄧ??杈???ㄨВ??筹???????跺??杩?浼?浣跨?ㄥ??杞???㈣?????姣?琛???????涓?78涓?瀛?绗????
|
||||
|
||||
???涓?涓????棰????Gmail杩?浼????浠讳??涓????ASCII???瀛?绗????淇℃????逛负base64缂???????瀹????涓?瑗垮????????娆ф床浜虹?????瀛????
|
||||
|
||||
###
|
13
MAINTAINERS
13
MAINTAINERS
@ -405,8 +405,8 @@ S: Maintained
|
||||
F: sound/oss/aedsp16.c
|
||||
|
||||
AFFS FILE SYSTEM
|
||||
M: Roman Zippel <zippel@linux-m68k.org>
|
||||
S: Maintained
|
||||
L: linux-fsdevel@vger.kernel.org
|
||||
S: Orphan
|
||||
F: Documentation/filesystems/affs.txt
|
||||
F: fs/affs/
|
||||
|
||||
@ -2946,8 +2946,8 @@ F: drivers/block/cciss*
|
||||
F: include/linux/cciss_ioctl.h
|
||||
|
||||
HFS FILESYSTEM
|
||||
M: Roman Zippel <zippel@linux-m68k.org>
|
||||
S: Maintained
|
||||
L: linux-fsdevel@vger.kernel.org
|
||||
S: Orphan
|
||||
F: Documentation/filesystems/hfs.txt
|
||||
F: fs/hfs/
|
||||
|
||||
@ -3814,7 +3814,7 @@ M: Rusty Russell <rusty@rustcorp.com.au>
|
||||
L: lguest@lists.ozlabs.org
|
||||
W: http://lguest.ozlabs.org/
|
||||
S: Odd Fixes
|
||||
F: Documentation/lguest/
|
||||
F: Documentation/virtual/lguest/
|
||||
F: arch/x86/lguest/
|
||||
F: drivers/lguest/
|
||||
F: include/linux/lguest*.h
|
||||
@ -4001,7 +4001,6 @@ F: arch/m32r/
|
||||
|
||||
M68K ARCHITECTURE
|
||||
M: Geert Uytterhoeven <geert@linux-m68k.org>
|
||||
M: Roman Zippel <zippel@linux-m68k.org>
|
||||
L: linux-m68k@lists.linux-m68k.org
|
||||
W: http://www.linux-m68k.org/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k.git
|
||||
@ -6632,7 +6631,7 @@ L: user-mode-linux-devel@lists.sourceforge.net
|
||||
L: user-mode-linux-user@lists.sourceforge.net
|
||||
W: http://user-mode-linux.sourceforge.net
|
||||
S: Maintained
|
||||
F: Documentation/uml/
|
||||
F: Documentation/virtual/uml/
|
||||
F: arch/um/
|
||||
F: fs/hostfs/
|
||||
F: fs/hppfs/
|
||||
|
3
Makefile
3
Makefile
@ -1,7 +1,7 @@
|
||||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 39
|
||||
EXTRAVERSION = -rc7
|
||||
EXTRAVERSION =
|
||||
NAME = Flesh-Eating Bats with Fangs
|
||||
|
||||
# *DOCUMENTATION*
|
||||
@ -1268,6 +1268,7 @@ help:
|
||||
@echo ' make C=1 [targets] Check all c source with $$CHECK (sparse by default)'
|
||||
@echo ' make C=2 [targets] Force check of all c source with $$CHECK'
|
||||
@echo ' make W=1 [targets] Enable extra gcc checks'
|
||||
@echo ' make RECORDMCOUNT_WARN=1 [targets] Warn about ignored mcount sections'
|
||||
@echo ''
|
||||
@echo 'Execute "make" or "make all" to build all targets marked with [*] '
|
||||
@echo 'For further info see the ./README file'
|
||||
|
@ -585,8 +585,7 @@ handle_ipi(struct pt_regs *regs)
|
||||
|
||||
switch (which) {
|
||||
case IPI_RESCHEDULE:
|
||||
/* Reschedule callback. Everything to be done
|
||||
is done by the interrupt return path. */
|
||||
scheduler_ipi();
|
||||
break;
|
||||
|
||||
case IPI_CALL_FUNC:
|
||||
|
@ -22,17 +22,16 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/amba/bus.h>
|
||||
|
||||
#include <asm/mach/irq.h>
|
||||
#include <asm/hardware/vic.h>
|
||||
|
||||
#if defined(CONFIG_PM)
|
||||
#ifdef CONFIG_PM
|
||||
/**
|
||||
* struct vic_device - VIC PM device
|
||||
* @sysdev: The system device which is registered.
|
||||
* @irq: The IRQ number for the base of the VIC.
|
||||
* @base: The register base for the VIC.
|
||||
* @resume_sources: A bitmask of interrupts for resume.
|
||||
@ -43,8 +42,6 @@
|
||||
* @protect: Save for VIC_PROTECT.
|
||||
*/
|
||||
struct vic_device {
|
||||
struct sys_device sysdev;
|
||||
|
||||
void __iomem *base;
|
||||
int irq;
|
||||
u32 resume_sources;
|
||||
@ -59,11 +56,6 @@ struct vic_device {
|
||||
static struct vic_device vic_devices[CONFIG_ARM_VIC_NR];
|
||||
|
||||
static int vic_id;
|
||||
|
||||
static inline struct vic_device *to_vic(struct sys_device *sys)
|
||||
{
|
||||
return container_of(sys, struct vic_device, sysdev);
|
||||
}
|
||||
#endif /* CONFIG_PM */
|
||||
|
||||
/**
|
||||
@ -85,10 +77,9 @@ static void vic_init2(void __iomem *base)
|
||||
writel(32, base + VIC_PL190_DEF_VECT_ADDR);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_PM)
|
||||
static int vic_class_resume(struct sys_device *dev)
|
||||
#ifdef CONFIG_PM
|
||||
static void resume_one_vic(struct vic_device *vic)
|
||||
{
|
||||
struct vic_device *vic = to_vic(dev);
|
||||
void __iomem *base = vic->base;
|
||||
|
||||
printk(KERN_DEBUG "%s: resuming vic at %p\n", __func__, base);
|
||||
@ -107,13 +98,18 @@ static int vic_class_resume(struct sys_device *dev)
|
||||
|
||||
writel(vic->soft_int, base + VIC_INT_SOFT);
|
||||
writel(~vic->soft_int, base + VIC_INT_SOFT_CLEAR);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vic_class_suspend(struct sys_device *dev, pm_message_t state)
|
||||
static void vic_resume(void)
|
||||
{
|
||||
int id;
|
||||
|
||||
for (id = vic_id - 1; id >= 0; id--)
|
||||
resume_one_vic(vic_devices + id);
|
||||
}
|
||||
|
||||
static void suspend_one_vic(struct vic_device *vic)
|
||||
{
|
||||
struct vic_device *vic = to_vic(dev);
|
||||
void __iomem *base = vic->base;
|
||||
|
||||
printk(KERN_DEBUG "%s: suspending vic at %p\n", __func__, base);
|
||||
@ -128,14 +124,21 @@ static int vic_class_suspend(struct sys_device *dev, pm_message_t state)
|
||||
|
||||
writel(vic->resume_irqs, base + VIC_INT_ENABLE);
|
||||
writel(~vic->resume_irqs, base + VIC_INT_ENABLE_CLEAR);
|
||||
}
|
||||
|
||||
static int vic_suspend(void)
|
||||
{
|
||||
int id;
|
||||
|
||||
for (id = 0; id < vic_id; id++)
|
||||
suspend_one_vic(vic_devices + id);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct sysdev_class vic_class = {
|
||||
.name = "vic",
|
||||
.suspend = vic_class_suspend,
|
||||
.resume = vic_class_resume,
|
||||
struct syscore_ops vic_syscore_ops = {
|
||||
.suspend = vic_suspend,
|
||||
.resume = vic_resume,
|
||||
};
|
||||
|
||||
/**
|
||||
@ -147,30 +150,8 @@ struct sysdev_class vic_class = {
|
||||
*/
|
||||
static int __init vic_pm_init(void)
|
||||
{
|
||||
struct vic_device *dev = vic_devices;
|
||||
int err;
|
||||
int id;
|
||||
|
||||
if (vic_id == 0)
|
||||
return 0;
|
||||
|
||||
err = sysdev_class_register(&vic_class);
|
||||
if (err) {
|
||||
printk(KERN_ERR "%s: cannot register class\n", __func__);
|
||||
return err;
|
||||
}
|
||||
|
||||
for (id = 0; id < vic_id; id++, dev++) {
|
||||
dev->sysdev.id = id;
|
||||
dev->sysdev.cls = &vic_class;
|
||||
|
||||
err = sysdev_register(&dev->sysdev);
|
||||
if (err) {
|
||||
printk(KERN_ERR "%s: failed to register device\n",
|
||||
__func__);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
if (vic_id > 0)
|
||||
register_syscore_ops(&vic_syscore_ops);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
15
arch/arm/include/asm/i8253.h
Normal file
15
arch/arm/include/asm/i8253.h
Normal file
@ -0,0 +1,15 @@
|
||||
#ifndef __ASMARM_I8253_H
|
||||
#define __ASMARM_I8253_H
|
||||
|
||||
/* i8253A PIT registers */
|
||||
#define PIT_MODE 0x43
|
||||
#define PIT_CH0 0x40
|
||||
|
||||
#define PIT_LATCH ((PIT_TICK_RATE + HZ / 2) / HZ)
|
||||
|
||||
extern raw_spinlock_t i8253_lock;
|
||||
|
||||
#define outb_pit outb_p
|
||||
#define inb_pit inb_p
|
||||
|
||||
#endif
|
@ -34,7 +34,6 @@
|
||||
* timer interrupt which may be pending.
|
||||
*/
|
||||
struct sys_timer {
|
||||
struct sys_device dev;
|
||||
void (*init)(void);
|
||||
void (*suspend)(void);
|
||||
void (*resume)(void);
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
|
||||
#include <asm/leds.h>
|
||||
|
||||
@ -69,29 +70,8 @@ static ssize_t leds_store(struct sys_device *dev,
|
||||
|
||||
static SYSDEV_ATTR(event, 0200, NULL, leds_store);
|
||||
|
||||
static int leds_suspend(struct sys_device *dev, pm_message_t state)
|
||||
{
|
||||
leds_event(led_stop);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int leds_resume(struct sys_device *dev)
|
||||
{
|
||||
leds_event(led_start);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int leds_shutdown(struct sys_device *dev)
|
||||
{
|
||||
leds_event(led_halted);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct sysdev_class leds_sysclass = {
|
||||
.name = "leds",
|
||||
.shutdown = leds_shutdown,
|
||||
.suspend = leds_suspend,
|
||||
.resume = leds_resume,
|
||||
};
|
||||
|
||||
static struct sys_device leds_device = {
|
||||
@ -99,6 +79,28 @@ static struct sys_device leds_device = {
|
||||
.cls = &leds_sysclass,
|
||||
};
|
||||
|
||||
static int leds_suspend(void)
|
||||
{
|
||||
leds_event(led_stop);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void leds_resume(void)
|
||||
{
|
||||
leds_event(led_start);
|
||||
}
|
||||
|
||||
static void leds_shutdown(void)
|
||||
{
|
||||
leds_event(led_halted);
|
||||
}
|
||||
|
||||
static struct syscore_ops leds_syscore_ops = {
|
||||
.shutdown = leds_shutdown,
|
||||
.suspend = leds_suspend,
|
||||
.resume = leds_resume,
|
||||
};
|
||||
|
||||
static int __init leds_init(void)
|
||||
{
|
||||
int ret;
|
||||
@ -107,6 +109,8 @@ static int __init leds_init(void)
|
||||
ret = sysdev_register(&leds_device);
|
||||
if (ret == 0)
|
||||
ret = sysdev_create_file(&leds_device, &attr_event);
|
||||
if (ret == 0)
|
||||
register_syscore_ops(&leds_syscore_ops);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -560,10 +560,7 @@ asmlinkage void __exception_irq_entry do_IPI(int ipinr, struct pt_regs *regs)
|
||||
break;
|
||||
|
||||
case IPI_RESCHEDULE:
|
||||
/*
|
||||
* nothing more to do - eveything is
|
||||
* done on the interrupt return path
|
||||
*/
|
||||
scheduler_ipi();
|
||||
break;
|
||||
|
||||
case IPI_CALL_FUNC:
|
||||
|
@ -21,7 +21,7 @@
|
||||
#include <linux/timex.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/profile.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/irq.h>
|
||||
|
||||
@ -115,48 +115,37 @@ void timer_tick(void)
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_PM) && !defined(CONFIG_GENERIC_CLOCKEVENTS)
|
||||
static int timer_suspend(struct sys_device *dev, pm_message_t state)
|
||||
static int timer_suspend(void)
|
||||
{
|
||||
struct sys_timer *timer = container_of(dev, struct sys_timer, dev);
|
||||
|
||||
if (timer->suspend != NULL)
|
||||
timer->suspend();
|
||||
if (system_timer->suspend)
|
||||
system_timer->suspend();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int timer_resume(struct sys_device *dev)
|
||||
static void timer_resume(void)
|
||||
{
|
||||
struct sys_timer *timer = container_of(dev, struct sys_timer, dev);
|
||||
|
||||
if (timer->resume != NULL)
|
||||
timer->resume();
|
||||
|
||||
return 0;
|
||||
if (system_timer->resume)
|
||||
system_timer->resume();
|
||||
}
|
||||
#else
|
||||
#define timer_suspend NULL
|
||||
#define timer_resume NULL
|
||||
#endif
|
||||
|
||||
static struct sysdev_class timer_sysclass = {
|
||||
.name = "timer",
|
||||
static struct syscore_ops timer_syscore_ops = {
|
||||
.suspend = timer_suspend,
|
||||
.resume = timer_resume,
|
||||
};
|
||||
|
||||
static int __init timer_init_sysfs(void)
|
||||
static int __init timer_init_syscore_ops(void)
|
||||
{
|
||||
int ret = sysdev_class_register(&timer_sysclass);
|
||||
if (ret == 0) {
|
||||
system_timer->dev.cls = &timer_sysclass;
|
||||
ret = sysdev_register(&system_timer->dev);
|
||||
}
|
||||
register_syscore_ops(&timer_syscore_ops);
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
device_initcall(timer_init_sysfs);
|
||||
device_initcall(timer_init_syscore_ops);
|
||||
|
||||
void __init time_init(void)
|
||||
{
|
||||
|
@ -234,7 +234,6 @@ static int __die(const char *str, int err, struct thread_info *thread, struct pt
|
||||
|
||||
printk(KERN_EMERG "Internal error: %s: %x [#%d]" S_PREEMPT S_SMP "\n",
|
||||
str, err, ++die_counter);
|
||||
sysfs_printk_last_file();
|
||||
|
||||
/* trap and error numbers are mostly meaningless on ARM */
|
||||
ret = notify_die(DIE_OOPS, str, regs, err, tsk->thread.trap_no, SIGSEGV);
|
||||
|
@ -94,9 +94,7 @@ static int davinci_target(struct cpufreq_policy *policy,
|
||||
if (freqs.old == freqs.new)
|
||||
return ret;
|
||||
|
||||
cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER,
|
||||
dev_driver_string(cpufreq.dev),
|
||||
"transition: %u --> %u\n", freqs.old, freqs.new);
|
||||
dev_dbg(&cpufreq.dev, "transition: %u --> %u\n", freqs.old, freqs.new);
|
||||
|
||||
ret = cpufreq_frequency_table_target(policy, pdata->freq_table,
|
||||
freqs.new, relation, &idx);
|
||||
|
@ -16,6 +16,7 @@
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/suspend.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <asm/cacheflush.h>
|
||||
@ -372,7 +373,27 @@ void exynos4_scu_enable(void __iomem *scu_base)
|
||||
flush_cache_all();
|
||||
}
|
||||
|
||||
static int exynos4_pm_resume(struct sys_device *dev)
|
||||
static struct sysdev_driver exynos4_pm_driver = {
|
||||
.add = exynos4_pm_add,
|
||||
};
|
||||
|
||||
static __init int exynos4_pm_drvinit(void)
|
||||
{
|
||||
unsigned int tmp;
|
||||
|
||||
s3c_pm_init();
|
||||
|
||||
/* All wakeup disable */
|
||||
|
||||
tmp = __raw_readl(S5P_WAKEUP_MASK);
|
||||
tmp |= ((0xFF << 8) | (0x1F << 1));
|
||||
__raw_writel(tmp, S5P_WAKEUP_MASK);
|
||||
|
||||
return sysdev_driver_register(&exynos4_sysclass, &exynos4_pm_driver);
|
||||
}
|
||||
arch_initcall(exynos4_pm_drvinit);
|
||||
|
||||
static void exynos4_pm_resume(void)
|
||||
{
|
||||
/* For release retention */
|
||||
|
||||
@ -394,27 +415,15 @@ static int exynos4_pm_resume(struct sys_device *dev)
|
||||
/* enable L2X0*/
|
||||
writel_relaxed(1, S5P_VA_L2CC + L2X0_CTRL);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct sysdev_driver exynos4_pm_driver = {
|
||||
.add = exynos4_pm_add,
|
||||
static struct syscore_ops exynos4_pm_syscore_ops = {
|
||||
.resume = exynos4_pm_resume,
|
||||
};
|
||||
|
||||
static __init int exynos4_pm_drvinit(void)
|
||||
static __init int exynos4_pm_syscore_init(void)
|
||||
{
|
||||
unsigned int tmp;
|
||||
|
||||
s3c_pm_init();
|
||||
|
||||
/* All wakeup disable */
|
||||
|
||||
tmp = __raw_readl(S5P_WAKEUP_MASK);
|
||||
tmp |= ((0xFF << 8) | (0x1F << 1));
|
||||
__raw_writel(tmp, S5P_WAKEUP_MASK);
|
||||
|
||||
return sysdev_driver_register(&exynos4_sysclass, &exynos4_pm_driver);
|
||||
register_syscore_ops(&exynos4_pm_syscore_ops);
|
||||
return 0;
|
||||
}
|
||||
arch_initcall(exynos4_pm_drvinit);
|
||||
arch_initcall(exynos4_pm_syscore_init);
|
||||
|
@ -4,6 +4,7 @@ menu "Footbridge Implementations"
|
||||
|
||||
config ARCH_CATS
|
||||
bool "CATS"
|
||||
select CLKSRC_I8253
|
||||
select FOOTBRIDGE_HOST
|
||||
select ISA
|
||||
select ISA_DMA
|
||||
@ -59,6 +60,7 @@ config ARCH_EBSA285_HOST
|
||||
|
||||
config ARCH_NETWINDER
|
||||
bool "NetWinder"
|
||||
select CLKSRC_I8253
|
||||
select FOOTBRIDGE_HOST
|
||||
select ISA
|
||||
select ISA_DMA
|
||||
|
@ -10,53 +10,16 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/timex.h>
|
||||
|
||||
#include <asm/irq.h>
|
||||
|
||||
#include <asm/i8253.h>
|
||||
#include <asm/mach/time.h>
|
||||
|
||||
#include "common.h"
|
||||
|
||||
#define PIT_MODE 0x43
|
||||
#define PIT_CH0 0x40
|
||||
|
||||
#define PIT_LATCH ((PIT_TICK_RATE + HZ / 2) / HZ)
|
||||
|
||||
static cycle_t pit_read(struct clocksource *cs)
|
||||
{
|
||||
unsigned long flags;
|
||||
static int old_count;
|
||||
static u32 old_jifs;
|
||||
int count;
|
||||
u32 jifs;
|
||||
|
||||
raw_local_irq_save(flags);
|
||||
|
||||
jifs = jiffies;
|
||||
outb_p(0x00, PIT_MODE); /* latch the count */
|
||||
count = inb_p(PIT_CH0); /* read the latched count */
|
||||
count |= inb_p(PIT_CH0) << 8;
|
||||
|
||||
if (count > old_count && jifs == old_jifs)
|
||||
count = old_count;
|
||||
|
||||
old_count = count;
|
||||
old_jifs = jifs;
|
||||
|
||||
raw_local_irq_restore(flags);
|
||||
|
||||
count = (PIT_LATCH - 1) - count;
|
||||
|
||||
return (cycle_t)(jifs * PIT_LATCH) + count;
|
||||
}
|
||||
|
||||
static struct clocksource pit_cs = {
|
||||
.name = "pit",
|
||||
.rating = 110,
|
||||
.read = pit_read,
|
||||
.mask = CLOCKSOURCE_MASK(32),
|
||||
};
|
||||
DEFINE_RAW_SPINLOCK(i8253_lock);
|
||||
|
||||
static void pit_set_mode(enum clock_event_mode mode,
|
||||
struct clock_event_device *evt)
|
||||
@ -121,7 +84,7 @@ static void __init isa_timer_init(void)
|
||||
pit_ce.max_delta_ns = clockevent_delta2ns(0x7fff, &pit_ce);
|
||||
pit_ce.min_delta_ns = clockevent_delta2ns(0x000f, &pit_ce);
|
||||
|
||||
clocksource_register_hz(&pit_cs, PIT_TICK_RATE);
|
||||
clocksource_i8253_init();
|
||||
|
||||
setup_irq(pit_ce.irq, &pit_timer_irq);
|
||||
clockevents_register_device(&pit_ce);
|
||||
|
@ -24,7 +24,7 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/amba/bus.h>
|
||||
#include <linux/amba/kmi.h>
|
||||
#include <linux/clocksource.h>
|
||||
@ -180,13 +180,13 @@ static void __init ap_init_irq(void)
|
||||
#ifdef CONFIG_PM
|
||||
static unsigned long ic_irq_enable;
|
||||
|
||||
static int irq_suspend(struct sys_device *dev, pm_message_t state)
|
||||
static int irq_suspend(void)
|
||||
{
|
||||
ic_irq_enable = readl(VA_IC_BASE + IRQ_ENABLE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int irq_resume(struct sys_device *dev)
|
||||
static void irq_resume(void)
|
||||
{
|
||||
/* disable all irq sources */
|
||||
writel(-1, VA_CMIC_BASE + IRQ_ENABLE_CLEAR);
|
||||
@ -194,33 +194,25 @@ static int irq_resume(struct sys_device *dev)
|
||||
writel(-1, VA_IC_BASE + FIQ_ENABLE_CLEAR);
|
||||
|
||||
writel(ic_irq_enable, VA_IC_BASE + IRQ_ENABLE_SET);
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
#define irq_suspend NULL
|
||||
#define irq_resume NULL
|
||||
#endif
|
||||
|
||||
static struct sysdev_class irq_class = {
|
||||
.name = "irq",
|
||||
static struct syscore_ops irq_syscore_ops = {
|
||||
.suspend = irq_suspend,
|
||||
.resume = irq_resume,
|
||||
};
|
||||
|
||||
static struct sys_device irq_device = {
|
||||
.id = 0,
|
||||
.cls = &irq_class,
|
||||
};
|
||||
|
||||
static int __init irq_init_sysfs(void)
|
||||
static int __init irq_syscore_init(void)
|
||||
{
|
||||
int ret = sysdev_class_register(&irq_class);
|
||||
if (ret == 0)
|
||||
ret = sysdev_register(&irq_device);
|
||||
return ret;
|
||||
register_syscore_ops(&irq_syscore_ops);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
device_initcall(irq_init_sysfs);
|
||||
device_initcall(irq_syscore_init);
|
||||
|
||||
/*
|
||||
* Flash handling.
|
||||
|
@ -24,75 +24,50 @@
|
||||
#ifdef CONFIG_PM_RUNTIME
|
||||
static int omap1_pm_runtime_suspend(struct device *dev)
|
||||
{
|
||||
struct clk *iclk, *fclk;
|
||||
int ret = 0;
|
||||
int ret;
|
||||
|
||||
dev_dbg(dev, "%s\n", __func__);
|
||||
|
||||
ret = pm_generic_runtime_suspend(dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
fclk = clk_get(dev, "fck");
|
||||
if (!IS_ERR(fclk)) {
|
||||
clk_disable(fclk);
|
||||
clk_put(fclk);
|
||||
}
|
||||
|
||||
iclk = clk_get(dev, "ick");
|
||||
if (!IS_ERR(iclk)) {
|
||||
clk_disable(iclk);
|
||||
clk_put(iclk);
|
||||
ret = pm_runtime_clk_suspend(dev);
|
||||
if (ret) {
|
||||
pm_generic_runtime_resume(dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
};
|
||||
}
|
||||
|
||||
static int omap1_pm_runtime_resume(struct device *dev)
|
||||
{
|
||||
struct clk *iclk, *fclk;
|
||||
|
||||
dev_dbg(dev, "%s\n", __func__);
|
||||
|
||||
iclk = clk_get(dev, "ick");
|
||||
if (!IS_ERR(iclk)) {
|
||||
clk_enable(iclk);
|
||||
clk_put(iclk);
|
||||
}
|
||||
|
||||
fclk = clk_get(dev, "fck");
|
||||
if (!IS_ERR(fclk)) {
|
||||
clk_enable(fclk);
|
||||
clk_put(fclk);
|
||||
}
|
||||
|
||||
pm_runtime_clk_resume(dev);
|
||||
return pm_generic_runtime_resume(dev);
|
||||
}
|
||||
|
||||
static struct dev_power_domain default_power_domain = {
|
||||
.ops = {
|
||||
.runtime_suspend = omap1_pm_runtime_suspend,
|
||||
.runtime_resume = omap1_pm_runtime_resume,
|
||||
USE_PLATFORM_PM_SLEEP_OPS
|
||||
},
|
||||
};
|
||||
|
||||
static struct pm_clk_notifier_block platform_bus_notifier = {
|
||||
.pwr_domain = &default_power_domain,
|
||||
.con_ids = { "ick", "fck", NULL, },
|
||||
};
|
||||
|
||||
static int __init omap1_pm_runtime_init(void)
|
||||
{
|
||||
const struct dev_pm_ops *pm;
|
||||
struct dev_pm_ops *omap_pm;
|
||||
|
||||
if (!cpu_class_is_omap1())
|
||||
return -ENODEV;
|
||||
|
||||
pm = platform_bus_get_pm_ops();
|
||||
if (!pm) {
|
||||
pr_err("%s: unable to get dev_pm_ops from platform_bus\n",
|
||||
__func__);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
omap_pm = kmemdup(pm, sizeof(struct dev_pm_ops), GFP_KERNEL);
|
||||
if (!omap_pm) {
|
||||
pr_err("%s: unable to alloc memory for new dev_pm_ops\n",
|
||||
__func__);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
omap_pm->runtime_suspend = omap1_pm_runtime_suspend;
|
||||
omap_pm->runtime_resume = omap1_pm_runtime_resume;
|
||||
|
||||
platform_bus_set_pm_ops(omap_pm);
|
||||
pm_runtime_clk_add_notifier(&platform_bus_type, &platform_bus_notifier);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -59,10 +59,10 @@ endif
|
||||
# Power Management
|
||||
ifeq ($(CONFIG_PM),y)
|
||||
obj-$(CONFIG_ARCH_OMAP2) += pm24xx.o
|
||||
obj-$(CONFIG_ARCH_OMAP2) += sleep24xx.o pm_bus.o
|
||||
obj-$(CONFIG_ARCH_OMAP2) += sleep24xx.o
|
||||
obj-$(CONFIG_ARCH_OMAP3) += pm34xx.o sleep34xx.o \
|
||||
cpuidle34xx.o pm_bus.o
|
||||
obj-$(CONFIG_ARCH_OMAP4) += pm44xx.o pm_bus.o
|
||||
cpuidle34xx.o
|
||||
obj-$(CONFIG_ARCH_OMAP4) += pm44xx.o
|
||||
obj-$(CONFIG_PM_DEBUG) += pm-debug.o
|
||||
obj-$(CONFIG_OMAP_SMARTREFLEX) += sr_device.o smartreflex.o
|
||||
obj-$(CONFIG_OMAP_SMARTREFLEX_CLASS3) += smartreflex-class3.o
|
||||
|
@ -1,85 +0,0 @@
|
||||
/*
|
||||
* Runtime PM support code for OMAP
|
||||
*
|
||||
* Author: Kevin Hilman, Deep Root Systems, LLC
|
||||
*
|
||||
* Copyright (C) 2010 Texas Instruments, Inc.
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
#include <plat/omap_device.h>
|
||||
#include <plat/omap-pm.h>
|
||||
|
||||
#ifdef CONFIG_PM_RUNTIME
|
||||
static int omap_pm_runtime_suspend(struct device *dev)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
int r, ret = 0;
|
||||
|
||||
dev_dbg(dev, "%s\n", __func__);
|
||||
|
||||
ret = pm_generic_runtime_suspend(dev);
|
||||
|
||||
if (!ret && dev->parent == &omap_device_parent) {
|
||||
r = omap_device_idle(pdev);
|
||||
WARN_ON(r);
|
||||
}
|
||||
|
||||
return ret;
|
||||
};
|
||||
|
||||
static int omap_pm_runtime_resume(struct device *dev)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
int r;
|
||||
|
||||
dev_dbg(dev, "%s\n", __func__);
|
||||
|
||||
if (dev->parent == &omap_device_parent) {
|
||||
r = omap_device_enable(pdev);
|
||||
WARN_ON(r);
|
||||
}
|
||||
|
||||
return pm_generic_runtime_resume(dev);
|
||||
};
|
||||
#else
|
||||
#define omap_pm_runtime_suspend NULL
|
||||
#define omap_pm_runtime_resume NULL
|
||||
#endif /* CONFIG_PM_RUNTIME */
|
||||
|
||||
static int __init omap_pm_runtime_init(void)
|
||||
{
|
||||
const struct dev_pm_ops *pm;
|
||||
struct dev_pm_ops *omap_pm;
|
||||
|
||||
pm = platform_bus_get_pm_ops();
|
||||
if (!pm) {
|
||||
pr_err("%s: unable to get dev_pm_ops from platform_bus\n",
|
||||
__func__);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
omap_pm = kmemdup(pm, sizeof(struct dev_pm_ops), GFP_KERNEL);
|
||||
if (!omap_pm) {
|
||||
pr_err("%s: unable to alloc memory for new dev_pm_ops\n",
|
||||
__func__);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
omap_pm->runtime_suspend = omap_pm_runtime_suspend;
|
||||
omap_pm->runtime_resume = omap_pm_runtime_resume;
|
||||
|
||||
platform_bus_set_pm_ops(omap_pm);
|
||||
|
||||
return 0;
|
||||
}
|
||||
core_initcall(omap_pm_runtime_init);
|
@ -15,7 +15,6 @@
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/bitops.h>
|
||||
|
@ -9,7 +9,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
|
||||
#include <mach/pxa2xx-regs.h>
|
||||
|
||||
@ -33,32 +33,22 @@ const struct clkops clk_pxa2xx_cken_ops = {
|
||||
#ifdef CONFIG_PM
|
||||
static uint32_t saved_cken;
|
||||
|
||||
static int pxa2xx_clock_suspend(struct sys_device *d, pm_message_t state)
|
||||
static int pxa2xx_clock_suspend(void)
|
||||
{
|
||||
saved_cken = CKEN;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pxa2xx_clock_resume(struct sys_device *d)
|
||||
static void pxa2xx_clock_resume(void)
|
||||
{
|
||||
CKEN = saved_cken;
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
#define pxa2xx_clock_suspend NULL
|
||||
#define pxa2xx_clock_resume NULL
|
||||
#endif
|
||||
|
||||
struct sysdev_class pxa2xx_clock_sysclass = {
|
||||
.name = "pxa2xx-clock",
|
||||
struct syscore_ops pxa2xx_clock_syscore_ops = {
|
||||
.suspend = pxa2xx_clock_suspend,
|
||||
.resume = pxa2xx_clock_resume,
|
||||
};
|
||||
|
||||
static int __init pxa2xx_clock_init(void)
|
||||
{
|
||||
if (cpu_is_pxa2xx())
|
||||
return sysdev_class_register(&pxa2xx_clock_sysclass);
|
||||
return 0;
|
||||
}
|
||||
postcore_initcall(pxa2xx_clock_init);
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
|
||||
#include <mach/smemc.h>
|
||||
#include <mach/pxa3xx-regs.h>
|
||||
@ -182,7 +183,7 @@ const struct clkops clk_pxa3xx_pout_ops = {
|
||||
static uint32_t cken[2];
|
||||
static uint32_t accr;
|
||||
|
||||
static int pxa3xx_clock_suspend(struct sys_device *d, pm_message_t state)
|
||||
static int pxa3xx_clock_suspend(void)
|
||||
{
|
||||
cken[0] = CKENA;
|
||||
cken[1] = CKENB;
|
||||
@ -190,28 +191,18 @@ static int pxa3xx_clock_suspend(struct sys_device *d, pm_message_t state)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pxa3xx_clock_resume(struct sys_device *d)
|
||||
static void pxa3xx_clock_resume(void)
|
||||
{
|
||||
ACCR = accr;
|
||||
CKENA = cken[0];
|
||||
CKENB = cken[1];
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
#define pxa3xx_clock_suspend NULL
|
||||
#define pxa3xx_clock_resume NULL
|
||||
#endif
|
||||
|
||||
struct sysdev_class pxa3xx_clock_sysclass = {
|
||||
.name = "pxa3xx-clock",
|
||||
struct syscore_ops pxa3xx_clock_syscore_ops = {
|
||||
.suspend = pxa3xx_clock_suspend,
|
||||
.resume = pxa3xx_clock_resume,
|
||||
};
|
||||
|
||||
static int __init pxa3xx_clock_init(void)
|
||||
{
|
||||
if (cpu_is_pxa3xx() || cpu_is_pxa95x())
|
||||
return sysdev_class_register(&pxa3xx_clock_sysclass);
|
||||
return 0;
|
||||
}
|
||||
postcore_initcall(pxa3xx_clock_init);
|
||||
|
@ -1,5 +1,5 @@
|
||||
#include <linux/clkdev.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
|
||||
struct clkops {
|
||||
void (*enable)(struct clk *);
|
||||
@ -54,7 +54,7 @@ extern const struct clkops clk_pxa2xx_cken_ops;
|
||||
void clk_pxa2xx_cken_enable(struct clk *clk);
|
||||
void clk_pxa2xx_cken_disable(struct clk *clk);
|
||||
|
||||
extern struct sysdev_class pxa2xx_clock_sysclass;
|
||||
extern struct syscore_ops pxa2xx_clock_syscore_ops;
|
||||
|
||||
#if defined(CONFIG_PXA3xx) || defined(CONFIG_PXA95x)
|
||||
#define DEFINE_PXA3_CKEN(_name, _cken, _rate, _delay) \
|
||||
@ -74,5 +74,6 @@ extern const struct clkops clk_pxa3xx_smemc_ops;
|
||||
extern void clk_pxa3xx_cken_enable(struct clk *);
|
||||
extern void clk_pxa3xx_cken_disable(struct clk *);
|
||||
|
||||
extern struct sysdev_class pxa3xx_clock_sysclass;
|
||||
extern struct syscore_ops pxa3xx_clock_syscore_ops;
|
||||
|
||||
#endif
|
||||
|
@ -10,7 +10,6 @@
|
||||
*/
|
||||
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/delay.h>
|
||||
|
@ -10,7 +10,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/gpio.h>
|
||||
|
||||
@ -388,7 +388,7 @@ static inline void cmx2xx_init_display(void) {}
|
||||
#ifdef CONFIG_PM
|
||||
static unsigned long sleep_save_msc[10];
|
||||
|
||||
static int cmx2xx_suspend(struct sys_device *dev, pm_message_t state)
|
||||
static int cmx2xx_suspend(void)
|
||||
{
|
||||
cmx2xx_pci_suspend();
|
||||
|
||||
@ -412,7 +412,7 @@ static int cmx2xx_suspend(struct sys_device *dev, pm_message_t state)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cmx2xx_resume(struct sys_device *dev)
|
||||
static void cmx2xx_resume(void)
|
||||
{
|
||||
cmx2xx_pci_resume();
|
||||
|
||||
@ -420,27 +420,18 @@ static int cmx2xx_resume(struct sys_device *dev)
|
||||
__raw_writel(sleep_save_msc[0], MSC0);
|
||||
__raw_writel(sleep_save_msc[1], MSC1);
|
||||
__raw_writel(sleep_save_msc[2], MSC2);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct sysdev_class cmx2xx_pm_sysclass = {
|
||||
.name = "pm",
|
||||
static struct syscore_ops cmx2xx_pm_syscore_ops = {
|
||||
.resume = cmx2xx_resume,
|
||||
.suspend = cmx2xx_suspend,
|
||||
};
|
||||
|
||||
static struct sys_device cmx2xx_pm_device = {
|
||||
.cls = &cmx2xx_pm_sysclass,
|
||||
};
|
||||
|
||||
static int __init cmx2xx_pm_init(void)
|
||||
{
|
||||
int error;
|
||||
error = sysdev_class_register(&cmx2xx_pm_sysclass);
|
||||
if (error == 0)
|
||||
error = sysdev_register(&cmx2xx_pm_device);
|
||||
return error;
|
||||
register_syscore_ops(&cmx2xx_pm_syscore_ops);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
static int __init cmx2xx_pm_init(void) { return 0; }
|
||||
|
@ -13,7 +13,6 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
@ -22,7 +22,6 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pwm_backlight.h>
|
||||
#include <linux/i2c/pxa-i2c.h>
|
||||
#include <linux/sysdev.h>
|
||||
|
||||
#include <asm/irq.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
@ -17,7 +17,6 @@
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/ucb1400.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
|
@ -61,10 +61,10 @@ extern unsigned pxa3xx_get_clk_frequency_khz(int);
|
||||
#define pxa3xx_get_clk_frequency_khz(x) (0)
|
||||
#endif
|
||||
|
||||
extern struct sysdev_class pxa_irq_sysclass;
|
||||
extern struct sysdev_class pxa_gpio_sysclass;
|
||||
extern struct sysdev_class pxa2xx_mfp_sysclass;
|
||||
extern struct sysdev_class pxa3xx_mfp_sysclass;
|
||||
extern struct syscore_ops pxa_irq_syscore_ops;
|
||||
extern struct syscore_ops pxa_gpio_syscore_ops;
|
||||
extern struct syscore_ops pxa2xx_mfp_syscore_ops;
|
||||
extern struct syscore_ops pxa3xx_mfp_syscore_ops;
|
||||
|
||||
void __init pxa_set_ffuart_info(void *info);
|
||||
void __init pxa_set_btuart_info(void *info);
|
||||
|
@ -15,7 +15,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/irq.h>
|
||||
|
||||
@ -183,7 +183,7 @@ void __init pxa_init_irq(int irq_nr, set_wake_t fn)
|
||||
static unsigned long saved_icmr[MAX_INTERNAL_IRQS/32];
|
||||
static unsigned long saved_ipr[MAX_INTERNAL_IRQS];
|
||||
|
||||
static int pxa_irq_suspend(struct sys_device *dev, pm_message_t state)
|
||||
static int pxa_irq_suspend(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -202,7 +202,7 @@ static int pxa_irq_suspend(struct sys_device *dev, pm_message_t state)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pxa_irq_resume(struct sys_device *dev)
|
||||
static void pxa_irq_resume(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -218,22 +218,13 @@ static int pxa_irq_resume(struct sys_device *dev)
|
||||
__raw_writel(saved_ipr[i], IRQ_BASE + IPR(i));
|
||||
|
||||
__raw_writel(1, IRQ_BASE + ICCR);
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
#define pxa_irq_suspend NULL
|
||||
#define pxa_irq_resume NULL
|
||||
#endif
|
||||
|
||||
struct sysdev_class pxa_irq_sysclass = {
|
||||
.name = "irq",
|
||||
struct syscore_ops pxa_irq_syscore_ops = {
|
||||
.suspend = pxa_irq_suspend,
|
||||
.resume = pxa_irq_resume,
|
||||
};
|
||||
|
||||
static int __init pxa_irq_init(void)
|
||||
{
|
||||
return sysdev_class_register(&pxa_irq_sysclass);
|
||||
}
|
||||
|
||||
core_initcall(pxa_irq_init);
|
||||
|
@ -15,7 +15,7 @@
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/bitops.h>
|
||||
@ -159,30 +159,22 @@ static void __init lpd270_init_irq(void)
|
||||
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int lpd270_irq_resume(struct sys_device *dev)
|
||||
static void lpd270_irq_resume(void)
|
||||
{
|
||||
__raw_writew(lpd270_irq_enabled, LPD270_INT_MASK);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct sysdev_class lpd270_irq_sysclass = {
|
||||
.name = "cpld_irq",
|
||||
static struct syscore_ops lpd270_irq_syscore_ops = {
|
||||
.resume = lpd270_irq_resume,
|
||||
};
|
||||
|
||||
static struct sys_device lpd270_irq_device = {
|
||||
.cls = &lpd270_irq_sysclass,
|
||||
};
|
||||
|
||||
static int __init lpd270_irq_device_init(void)
|
||||
{
|
||||
int ret = -ENODEV;
|
||||
if (machine_is_logicpd_pxa270()) {
|
||||
ret = sysdev_class_register(&lpd270_irq_sysclass);
|
||||
if (ret == 0)
|
||||
ret = sysdev_register(&lpd270_irq_device);
|
||||
register_syscore_ops(&lpd270_irq_syscore_ops);
|
||||
return 0;
|
||||
}
|
||||
return ret;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
device_initcall(lpd270_irq_device_init);
|
||||
|
@ -15,7 +15,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/major.h>
|
||||
#include <linux/fb.h>
|
||||
#include <linux/interrupt.h>
|
||||
@ -176,31 +176,22 @@ static void __init lubbock_init_irq(void)
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
static int lubbock_irq_resume(struct sys_device *dev)
|
||||
static void lubbock_irq_resume(void)
|
||||
{
|
||||
LUB_IRQ_MASK_EN = lubbock_irq_enabled;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct sysdev_class lubbock_irq_sysclass = {
|
||||
.name = "cpld_irq",
|
||||
static struct syscore_ops lubbock_irq_syscore_ops = {
|
||||
.resume = lubbock_irq_resume,
|
||||
};
|
||||
|
||||
static struct sys_device lubbock_irq_device = {
|
||||
.cls = &lubbock_irq_sysclass,
|
||||
};
|
||||
|
||||
static int __init lubbock_irq_device_init(void)
|
||||
{
|
||||
int ret = -ENODEV;
|
||||
|
||||
if (machine_is_lubbock()) {
|
||||
ret = sysdev_class_register(&lubbock_irq_sysclass);
|
||||
if (ret == 0)
|
||||
ret = sysdev_register(&lubbock_irq_device);
|
||||
register_syscore_ops(&lubbock_irq_syscore_ops);
|
||||
return 0;
|
||||
}
|
||||
return ret;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
device_initcall(lubbock_irq_device_init);
|
||||
|
@ -15,7 +15,7 @@
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/bitops.h>
|
||||
@ -185,31 +185,21 @@ static void __init mainstone_init_irq(void)
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
static int mainstone_irq_resume(struct sys_device *dev)
|
||||
static void mainstone_irq_resume(void)
|
||||
{
|
||||
MST_INTMSKENA = mainstone_irq_enabled;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct sysdev_class mainstone_irq_sysclass = {
|
||||
.name = "cpld_irq",
|
||||
static struct syscore_ops mainstone_irq_syscore_ops = {
|
||||
.resume = mainstone_irq_resume,
|
||||
};
|
||||
|
||||
static struct sys_device mainstone_irq_device = {
|
||||
.cls = &mainstone_irq_sysclass,
|
||||
};
|
||||
|
||||
static int __init mainstone_irq_device_init(void)
|
||||
{
|
||||
int ret = -ENODEV;
|
||||
if (machine_is_mainstone())
|
||||
register_syscore_ops(&mainstone_irq_syscore_ops);
|
||||
|
||||
if (machine_is_mainstone()) {
|
||||
ret = sysdev_class_register(&mainstone_irq_sysclass);
|
||||
if (ret == 0)
|
||||
ret = sysdev_register(&mainstone_irq_device);
|
||||
}
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
|
||||
device_initcall(mainstone_irq_device_init);
|
||||
|
@ -16,7 +16,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
|
||||
#include <mach/gpio.h>
|
||||
#include <mach/pxa2xx-regs.h>
|
||||
@ -338,7 +338,7 @@ static unsigned long saved_gafr[2][4];
|
||||
static unsigned long saved_gpdr[4];
|
||||
static unsigned long saved_pgsr[4];
|
||||
|
||||
static int pxa2xx_mfp_suspend(struct sys_device *d, pm_message_t state)
|
||||
static int pxa2xx_mfp_suspend(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -365,7 +365,7 @@ static int pxa2xx_mfp_suspend(struct sys_device *d, pm_message_t state)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pxa2xx_mfp_resume(struct sys_device *d)
|
||||
static void pxa2xx_mfp_resume(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -376,15 +376,13 @@ static int pxa2xx_mfp_resume(struct sys_device *d)
|
||||
PGSR(i) = saved_pgsr[i];
|
||||
}
|
||||
PSSR = PSSR_RDH | PSSR_PH;
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
#define pxa2xx_mfp_suspend NULL
|
||||
#define pxa2xx_mfp_resume NULL
|
||||
#endif
|
||||
|
||||
struct sysdev_class pxa2xx_mfp_sysclass = {
|
||||
.name = "mfp",
|
||||
struct syscore_ops pxa2xx_mfp_syscore_ops = {
|
||||
.suspend = pxa2xx_mfp_suspend,
|
||||
.resume = pxa2xx_mfp_resume,
|
||||
};
|
||||
@ -409,6 +407,6 @@ static int __init pxa2xx_mfp_init(void)
|
||||
for (i = 0; i <= gpio_to_bank(pxa_last_gpio); i++)
|
||||
gpdr_lpm[i] = GPDR(i * 32);
|
||||
|
||||
return sysdev_class_register(&pxa2xx_mfp_sysclass);
|
||||
return 0;
|
||||
}
|
||||
postcore_initcall(pxa2xx_mfp_init);
|
||||
|
@ -17,7 +17,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/mfp-pxa3xx.h>
|
||||
@ -31,13 +31,13 @@
|
||||
* a pull-down mode if they're an active low chip select, and we're
|
||||
* just entering standby.
|
||||
*/
|
||||
static int pxa3xx_mfp_suspend(struct sys_device *d, pm_message_t state)
|
||||
static int pxa3xx_mfp_suspend(void)
|
||||
{
|
||||
mfp_config_lpm();
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pxa3xx_mfp_resume(struct sys_device *d)
|
||||
static void pxa3xx_mfp_resume(void)
|
||||
{
|
||||
mfp_config_run();
|
||||
|
||||
@ -47,24 +47,13 @@ static int pxa3xx_mfp_resume(struct sys_device *d)
|
||||
* preserve them here in case they will be referenced later
|
||||
*/
|
||||
ASCR &= ~(ASCR_RDH | ASCR_D1S | ASCR_D2S | ASCR_D3S);
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
#define pxa3xx_mfp_suspend NULL
|
||||
#define pxa3xx_mfp_resume NULL
|
||||
#endif
|
||||
|
||||
struct sysdev_class pxa3xx_mfp_sysclass = {
|
||||
.name = "mfp",
|
||||
struct syscore_ops pxa3xx_mfp_syscore_ops = {
|
||||
.suspend = pxa3xx_mfp_suspend,
|
||||
.resume = pxa3xx_mfp_resume,
|
||||
.resume = pxa3xx_mfp_resume,
|
||||
};
|
||||
|
||||
static int __init mfp_init_devicefs(void)
|
||||
{
|
||||
if (cpu_is_pxa3xx())
|
||||
return sysdev_class_register(&pxa3xx_mfp_sysclass);
|
||||
|
||||
return 0;
|
||||
}
|
||||
postcore_initcall(mfp_init_devicefs);
|
||||
|
@ -22,7 +22,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/gpio_keys.h>
|
||||
@ -488,7 +488,7 @@ static void install_bootstrap(void)
|
||||
}
|
||||
|
||||
|
||||
static int mioa701_sys_suspend(struct sys_device *sysdev, pm_message_t state)
|
||||
static int mioa701_sys_suspend(void)
|
||||
{
|
||||
int i = 0, is_bt_on;
|
||||
u32 *mem_resume_vector = phys_to_virt(RESUME_VECTOR_ADDR);
|
||||
@ -514,7 +514,7 @@ static int mioa701_sys_suspend(struct sys_device *sysdev, pm_message_t state)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int mioa701_sys_resume(struct sys_device *sysdev)
|
||||
static void mioa701_sys_resume(void)
|
||||
{
|
||||
int i = 0;
|
||||
u32 *mem_resume_vector = phys_to_virt(RESUME_VECTOR_ADDR);
|
||||
@ -527,43 +527,18 @@ static int mioa701_sys_resume(struct sys_device *sysdev)
|
||||
*mem_resume_enabler = save_buffer[i++];
|
||||
*mem_resume_bt = save_buffer[i++];
|
||||
*mem_resume_unknown = save_buffer[i++];
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct sysdev_class mioa701_sysclass = {
|
||||
.name = "mioa701",
|
||||
};
|
||||
|
||||
static struct sys_device sysdev_bootstrap = {
|
||||
.cls = &mioa701_sysclass,
|
||||
};
|
||||
|
||||
static struct sysdev_driver driver_bootstrap = {
|
||||
.suspend = &mioa701_sys_suspend,
|
||||
.resume = &mioa701_sys_resume,
|
||||
static struct syscore_ops mioa701_syscore_ops = {
|
||||
.suspend = mioa701_sys_suspend,
|
||||
.resume = mioa701_sys_resume,
|
||||
};
|
||||
|
||||
static int __init bootstrap_init(void)
|
||||
{
|
||||
int rc;
|
||||
int save_size = mioa701_bootstrap_lg + (sizeof(u32) * 3);
|
||||
|
||||
rc = sysdev_class_register(&mioa701_sysclass);
|
||||
if (rc) {
|
||||
printk(KERN_ERR "Failed registering mioa701 sys class\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
rc = sysdev_register(&sysdev_bootstrap);
|
||||
if (rc) {
|
||||
printk(KERN_ERR "Failed registering mioa701 sys device\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
rc = sysdev_driver_register(&mioa701_sysclass, &driver_bootstrap);
|
||||
if (rc) {
|
||||
printk(KERN_ERR "Failed registering PMU sys driver\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
register_syscore_ops(&mioa701_syscore_ops);
|
||||
|
||||
save_buffer = kmalloc(save_size, GFP_KERNEL);
|
||||
if (!save_buffer)
|
||||
@ -576,9 +551,7 @@ static int __init bootstrap_init(void)
|
||||
static void bootstrap_exit(void)
|
||||
{
|
||||
kfree(save_buffer);
|
||||
sysdev_driver_unregister(&mioa701_sysclass, &driver_bootstrap);
|
||||
sysdev_unregister(&sysdev_bootstrap);
|
||||
sysdev_class_unregister(&mioa701_sysclass);
|
||||
unregister_syscore_ops(&mioa701_syscore_ops);
|
||||
|
||||
printk(KERN_CRIT "Unregistering mioa701 suspend will hang next"
|
||||
"resume !!!\n");
|
||||
|
@ -24,7 +24,6 @@
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/wm97xx.h>
|
||||
#include <linux/power_supply.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
|
@ -25,7 +25,6 @@
|
||||
#include <linux/pwm_backlight.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/power_supply.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/w1-gpio.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
|
@ -19,7 +19,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/gpio_keys.h>
|
||||
@ -233,9 +233,9 @@ static struct palmz72_resume_info palmz72_resume_info = {
|
||||
|
||||
static unsigned long store_ptr;
|
||||
|
||||
/* sys_device for Palm Zire 72 PM */
|
||||
/* syscore_ops for Palm Zire 72 PM */
|
||||
|
||||
static int palmz72_pm_suspend(struct sys_device *dev, pm_message_t msg)
|
||||
static int palmz72_pm_suspend(void)
|
||||
{
|
||||
/* setup the resume_info struct for the original bootloader */
|
||||
palmz72_resume_info.resume_addr = (u32) cpu_resume;
|
||||
@ -249,31 +249,23 @@ static int palmz72_pm_suspend(struct sys_device *dev, pm_message_t msg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int palmz72_pm_resume(struct sys_device *dev)
|
||||
static void palmz72_pm_resume(void)
|
||||
{
|
||||
*PALMZ72_SAVE_DWORD = store_ptr;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct sysdev_class palmz72_pm_sysclass = {
|
||||
.name = "palmz72_pm",
|
||||
static struct syscore_ops palmz72_pm_syscore_ops = {
|
||||
.suspend = palmz72_pm_suspend,
|
||||
.resume = palmz72_pm_resume,
|
||||
};
|
||||
|
||||
static struct sys_device palmz72_pm_device = {
|
||||
.cls = &palmz72_pm_sysclass,
|
||||
};
|
||||
|
||||
static int __init palmz72_pm_init(void)
|
||||
{
|
||||
int ret = -ENODEV;
|
||||
if (machine_is_palmz72()) {
|
||||
ret = sysdev_class_register(&palmz72_pm_sysclass);
|
||||
if (ret == 0)
|
||||
ret = sysdev_register(&palmz72_pm_device);
|
||||
register_syscore_ops(&palmz72_pm_syscore_ops);
|
||||
return 0;
|
||||
}
|
||||
return ret;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
device_initcall(palmz72_pm_init);
|
||||
|
@ -21,7 +21,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/suspend.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/irq.h>
|
||||
|
||||
#include <asm/mach/map.h>
|
||||
@ -350,21 +350,9 @@ static struct platform_device *pxa25x_devices[] __initdata = {
|
||||
&pxa_device_asoc_platform,
|
||||
};
|
||||
|
||||
static struct sys_device pxa25x_sysdev[] = {
|
||||
{
|
||||
.cls = &pxa_irq_sysclass,
|
||||
}, {
|
||||
.cls = &pxa2xx_mfp_sysclass,
|
||||
}, {
|
||||
.cls = &pxa_gpio_sysclass,
|
||||
}, {
|
||||
.cls = &pxa2xx_clock_sysclass,
|
||||
}
|
||||
};
|
||||
|
||||
static int __init pxa25x_init(void)
|
||||
{
|
||||
int i, ret = 0;
|
||||
int ret = 0;
|
||||
|
||||
if (cpu_is_pxa25x()) {
|
||||
|
||||
@ -377,11 +365,10 @@ static int __init pxa25x_init(void)
|
||||
|
||||
pxa25x_init_pm();
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(pxa25x_sysdev); i++) {
|
||||
ret = sysdev_register(&pxa25x_sysdev[i]);
|
||||
if (ret)
|
||||
pr_err("failed to register sysdev[%d]\n", i);
|
||||
}
|
||||
register_syscore_ops(&pxa_irq_syscore_ops);
|
||||
register_syscore_ops(&pxa2xx_mfp_syscore_ops);
|
||||
register_syscore_ops(&pxa_gpio_syscore_ops);
|
||||
register_syscore_ops(&pxa2xx_clock_syscore_ops);
|
||||
|
||||
ret = platform_add_devices(pxa25x_devices,
|
||||
ARRAY_SIZE(pxa25x_devices));
|
||||
|
@ -16,7 +16,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/suspend.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/i2c/pxa-i2c.h>
|
||||
@ -428,21 +428,9 @@ static struct platform_device *devices[] __initdata = {
|
||||
&pxa27x_device_pwm1,
|
||||
};
|
||||
|
||||
static struct sys_device pxa27x_sysdev[] = {
|
||||
{
|
||||
.cls = &pxa_irq_sysclass,
|
||||
}, {
|
||||
.cls = &pxa2xx_mfp_sysclass,
|
||||
}, {
|
||||
.cls = &pxa_gpio_sysclass,
|
||||
}, {
|
||||
.cls = &pxa2xx_clock_sysclass,
|
||||
}
|
||||
};
|
||||
|
||||
static int __init pxa27x_init(void)
|
||||
{
|
||||
int i, ret = 0;
|
||||
int ret = 0;
|
||||
|
||||
if (cpu_is_pxa27x()) {
|
||||
|
||||
@ -455,11 +443,10 @@ static int __init pxa27x_init(void)
|
||||
|
||||
pxa27x_init_pm();
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(pxa27x_sysdev); i++) {
|
||||
ret = sysdev_register(&pxa27x_sysdev[i]);
|
||||
if (ret)
|
||||
pr_err("failed to register sysdev[%d]\n", i);
|
||||
}
|
||||
register_syscore_ops(&pxa_irq_syscore_ops);
|
||||
register_syscore_ops(&pxa2xx_mfp_syscore_ops);
|
||||
register_syscore_ops(&pxa_gpio_syscore_ops);
|
||||
register_syscore_ops(&pxa2xx_clock_syscore_ops);
|
||||
|
||||
ret = platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
}
|
||||
|
@ -20,7 +20,7 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/i2c/pxa-i2c.h>
|
||||
|
||||
#include <asm/mach/map.h>
|
||||
@ -427,21 +427,9 @@ static struct platform_device *devices[] __initdata = {
|
||||
&pxa27x_device_pwm1,
|
||||
};
|
||||
|
||||
static struct sys_device pxa3xx_sysdev[] = {
|
||||
{
|
||||
.cls = &pxa_irq_sysclass,
|
||||
}, {
|
||||
.cls = &pxa3xx_mfp_sysclass,
|
||||
}, {
|
||||
.cls = &pxa_gpio_sysclass,
|
||||
}, {
|
||||
.cls = &pxa3xx_clock_sysclass,
|
||||
}
|
||||
};
|
||||
|
||||
static int __init pxa3xx_init(void)
|
||||
{
|
||||
int i, ret = 0;
|
||||
int ret = 0;
|
||||
|
||||
if (cpu_is_pxa3xx()) {
|
||||
|
||||
@ -462,11 +450,10 @@ static int __init pxa3xx_init(void)
|
||||
|
||||
pxa3xx_init_pm();
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(pxa3xx_sysdev); i++) {
|
||||
ret = sysdev_register(&pxa3xx_sysdev[i]);
|
||||
if (ret)
|
||||
pr_err("failed to register sysdev[%d]\n", i);
|
||||
}
|
||||
register_syscore_ops(&pxa_irq_syscore_ops);
|
||||
register_syscore_ops(&pxa3xx_mfp_syscore_ops);
|
||||
register_syscore_ops(&pxa_gpio_syscore_ops);
|
||||
register_syscore_ops(&pxa3xx_clock_syscore_ops);
|
||||
|
||||
ret = platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
}
|
||||
|
@ -18,7 +18,7 @@
|
||||
#include <linux/i2c/pxa-i2c.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/gpio.h>
|
||||
@ -260,16 +260,6 @@ static struct platform_device *devices[] __initdata = {
|
||||
&pxa27x_device_pwm1,
|
||||
};
|
||||
|
||||
static struct sys_device pxa95x_sysdev[] = {
|
||||
{
|
||||
.cls = &pxa_irq_sysclass,
|
||||
}, {
|
||||
.cls = &pxa_gpio_sysclass,
|
||||
}, {
|
||||
.cls = &pxa3xx_clock_sysclass,
|
||||
}
|
||||
};
|
||||
|
||||
static int __init pxa95x_init(void)
|
||||
{
|
||||
int ret = 0, i;
|
||||
@ -293,11 +283,9 @@ static int __init pxa95x_init(void)
|
||||
if ((ret = pxa_init_dma(IRQ_DMA, 32)))
|
||||
return ret;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(pxa95x_sysdev); i++) {
|
||||
ret = sysdev_register(&pxa95x_sysdev[i]);
|
||||
if (ret)
|
||||
pr_err("failed to register sysdev[%d]\n", i);
|
||||
}
|
||||
register_syscore_ops(&pxa_irq_syscore_ops);
|
||||
register_syscore_ops(&pxa_gpio_syscore_ops);
|
||||
register_syscore_ops(&pxa3xx_clock_syscore_ops);
|
||||
|
||||
ret = platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
}
|
||||
|
@ -18,7 +18,6 @@
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/gpio.h>
|
||||
|
@ -6,7 +6,7 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/smemc.h>
|
||||
@ -16,7 +16,7 @@ static unsigned long msc[2];
|
||||
static unsigned long sxcnfg, memclkcfg;
|
||||
static unsigned long csadrcfg[4];
|
||||
|
||||
static int pxa3xx_smemc_suspend(struct sys_device *dev, pm_message_t state)
|
||||
static int pxa3xx_smemc_suspend(void)
|
||||
{
|
||||
msc[0] = __raw_readl(MSC0);
|
||||
msc[1] = __raw_readl(MSC1);
|
||||
@ -30,7 +30,7 @@ static int pxa3xx_smemc_suspend(struct sys_device *dev, pm_message_t state)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pxa3xx_smemc_resume(struct sys_device *dev)
|
||||
static void pxa3xx_smemc_resume(void)
|
||||
{
|
||||
__raw_writel(msc[0], MSC0);
|
||||
__raw_writel(msc[1], MSC1);
|
||||
@ -40,34 +40,19 @@ static int pxa3xx_smemc_resume(struct sys_device *dev)
|
||||
__raw_writel(csadrcfg[1], CSADRCFG1);
|
||||
__raw_writel(csadrcfg[2], CSADRCFG2);
|
||||
__raw_writel(csadrcfg[3], CSADRCFG3);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct sysdev_class smemc_sysclass = {
|
||||
.name = "smemc",
|
||||
static struct syscore_ops smemc_syscore_ops = {
|
||||
.suspend = pxa3xx_smemc_suspend,
|
||||
.resume = pxa3xx_smemc_resume,
|
||||
};
|
||||
|
||||
static struct sys_device smemc_sysdev = {
|
||||
.id = 0,
|
||||
.cls = &smemc_sysclass,
|
||||
};
|
||||
|
||||
static int __init smemc_init(void)
|
||||
{
|
||||
int ret = 0;
|
||||
if (cpu_is_pxa3xx())
|
||||
register_syscore_ops(&smemc_syscore_ops);
|
||||
|
||||
if (cpu_is_pxa3xx()) {
|
||||
ret = sysdev_class_register(&smemc_sysclass);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = sysdev_register(&smemc_sysdev);
|
||||
}
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
subsys_initcall(smemc_init);
|
||||
#endif
|
||||
|
@ -15,7 +15,6 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/bitops.h>
|
||||
|
@ -44,6 +44,7 @@
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
|
||||
#include <mach/pxa25x.h>
|
||||
#include <mach/audio.h>
|
||||
@ -130,20 +131,19 @@ static u8 viper_hw_version(void)
|
||||
return v1;
|
||||
}
|
||||
|
||||
/* CPU sysdev */
|
||||
static int viper_cpu_suspend(struct sys_device *sysdev, pm_message_t state)
|
||||
/* CPU system core operations. */
|
||||
static int viper_cpu_suspend(void)
|
||||
{
|
||||
viper_icr_set_bit(VIPER_ICR_R_DIS);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int viper_cpu_resume(struct sys_device *sysdev)
|
||||
static void viper_cpu_resume(void)
|
||||
{
|
||||
viper_icr_clear_bit(VIPER_ICR_R_DIS);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct sysdev_driver viper_cpu_sysdev_driver = {
|
||||
static struct syscore_ops viper_cpu_syscore_ops = {
|
||||
.suspend = viper_cpu_suspend,
|
||||
.resume = viper_cpu_resume,
|
||||
};
|
||||
@ -945,7 +945,7 @@ static void __init viper_init(void)
|
||||
viper_init_vcore_gpios();
|
||||
viper_init_cpufreq();
|
||||
|
||||
sysdev_driver_register(&cpu_sysdev_class, &viper_cpu_sysdev_driver);
|
||||
register_syscore_ops(&viper_cpu_syscore_ops);
|
||||
|
||||
if (version) {
|
||||
pr_info("viper: hardware v%di%d detected. "
|
||||
|
@ -16,7 +16,6 @@
|
||||
#include <linux/gpio_keys.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/usb/gpio_vbus.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
|
@ -23,38 +23,12 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
|
||||
#include <plat/cpu.h>
|
||||
#include <plat/pm.h>
|
||||
|
||||
static int s3c2410_irq_add(struct sys_device *sysdev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct sysdev_driver s3c2410_irq_driver = {
|
||||
.add = s3c2410_irq_add,
|
||||
struct syscore_ops s3c24xx_irq_syscore_ops = {
|
||||
.suspend = s3c24xx_irq_suspend,
|
||||
.resume = s3c24xx_irq_resume,
|
||||
};
|
||||
|
||||
static int __init s3c2410_irq_init(void)
|
||||
{
|
||||
return sysdev_driver_register(&s3c2410_sysclass, &s3c2410_irq_driver);
|
||||
}
|
||||
|
||||
arch_initcall(s3c2410_irq_init);
|
||||
|
||||
static struct sysdev_driver s3c2410a_irq_driver = {
|
||||
.add = s3c2410_irq_add,
|
||||
.suspend = s3c24xx_irq_suspend,
|
||||
.resume = s3c24xx_irq_resume,
|
||||
};
|
||||
|
||||
static int __init s3c2410a_irq_init(void)
|
||||
{
|
||||
return sysdev_driver_register(&s3c2410a_sysclass, &s3c2410a_irq_driver);
|
||||
}
|
||||
|
||||
arch_initcall(s3c2410a_irq_init);
|
||||
|
@ -17,7 +17,7 @@
|
||||
#include <linux/timer.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/dm9000.h>
|
||||
@ -214,17 +214,16 @@ static struct s3c2410_uartcfg bast_uartcfgs[] __initdata = {
|
||||
/* NAND Flash on BAST board */
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int bast_pm_suspend(struct sys_device *sd, pm_message_t state)
|
||||
static int bast_pm_suspend(void)
|
||||
{
|
||||
/* ensure that an nRESET is not generated on resume. */
|
||||
gpio_direction_output(S3C2410_GPA(21), 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int bast_pm_resume(struct sys_device *sd)
|
||||
static void bast_pm_resume(void)
|
||||
{
|
||||
s3c_gpio_cfgpin(S3C2410_GPA(21), S3C2410_GPA21_nRSTOUT);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
@ -232,16 +231,11 @@ static int bast_pm_resume(struct sys_device *sd)
|
||||
#define bast_pm_resume NULL
|
||||
#endif
|
||||
|
||||
static struct sysdev_class bast_pm_sysclass = {
|
||||
.name = "mach-bast",
|
||||
static struct syscore_ops bast_pm_syscore_ops = {
|
||||
.suspend = bast_pm_suspend,
|
||||
.resume = bast_pm_resume,
|
||||
};
|
||||
|
||||
static struct sys_device bast_pm_sysdev = {
|
||||
.cls = &bast_pm_sysclass,
|
||||
};
|
||||
|
||||
static int smartmedia_map[] = { 0 };
|
||||
static int chip0_map[] = { 1 };
|
||||
static int chip1_map[] = { 2 };
|
||||
@ -642,8 +636,7 @@ static void __init bast_map_io(void)
|
||||
|
||||
static void __init bast_init(void)
|
||||
{
|
||||
sysdev_class_register(&bast_pm_sysclass);
|
||||
sysdev_register(&bast_pm_sysdev);
|
||||
register_syscore_ops(&bast_pm_syscore_ops);
|
||||
|
||||
s3c_i2c0_set_platdata(&bast_i2c_info);
|
||||
s3c_nand_set_platdata(&bast_nand_info);
|
||||
|
@ -25,6 +25,7 @@
|
||||
#include <linux/errno.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
@ -92,7 +93,7 @@ static void s3c2410_pm_prepare(void)
|
||||
}
|
||||
}
|
||||
|
||||
static int s3c2410_pm_resume(struct sys_device *dev)
|
||||
static void s3c2410_pm_resume(void)
|
||||
{
|
||||
unsigned long tmp;
|
||||
|
||||
@ -104,10 +105,12 @@ static int s3c2410_pm_resume(struct sys_device *dev)
|
||||
|
||||
if ( machine_is_aml_m5900() )
|
||||
s3c2410_gpio_setpin(S3C2410_GPF(2), 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct syscore_ops s3c2410_pm_syscore_ops = {
|
||||
.resume = s3c2410_pm_resume,
|
||||
};
|
||||
|
||||
static int s3c2410_pm_add(struct sys_device *dev)
|
||||
{
|
||||
pm_cpu_prep = s3c2410_pm_prepare;
|
||||
@ -119,7 +122,6 @@ static int s3c2410_pm_add(struct sys_device *dev)
|
||||
#if defined(CONFIG_CPU_S3C2410)
|
||||
static struct sysdev_driver s3c2410_pm_driver = {
|
||||
.add = s3c2410_pm_add,
|
||||
.resume = s3c2410_pm_resume,
|
||||
};
|
||||
|
||||
/* register ourselves */
|
||||
@ -133,7 +135,6 @@ arch_initcall(s3c2410_pm_drvinit);
|
||||
|
||||
static struct sysdev_driver s3c2410a_pm_driver = {
|
||||
.add = s3c2410_pm_add,
|
||||
.resume = s3c2410_pm_resume,
|
||||
};
|
||||
|
||||
static int __init s3c2410a_pm_drvinit(void)
|
||||
@ -147,7 +148,6 @@ arch_initcall(s3c2410a_pm_drvinit);
|
||||
#if defined(CONFIG_CPU_S3C2440)
|
||||
static struct sysdev_driver s3c2440_pm_driver = {
|
||||
.add = s3c2410_pm_add,
|
||||
.resume = s3c2410_pm_resume,
|
||||
};
|
||||
|
||||
static int __init s3c2440_pm_drvinit(void)
|
||||
@ -161,7 +161,6 @@ arch_initcall(s3c2440_pm_drvinit);
|
||||
#if defined(CONFIG_CPU_S3C2442)
|
||||
static struct sysdev_driver s3c2442_pm_driver = {
|
||||
.add = s3c2410_pm_add,
|
||||
.resume = s3c2410_pm_resume,
|
||||
};
|
||||
|
||||
static int __init s3c2442_pm_drvinit(void)
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/io.h>
|
||||
@ -40,6 +41,7 @@
|
||||
#include <plat/devs.h>
|
||||
#include <plat/clock.h>
|
||||
#include <plat/pll.h>
|
||||
#include <plat/pm.h>
|
||||
|
||||
#include <plat/gpio-core.h>
|
||||
#include <plat/gpio-cfg.h>
|
||||
@ -168,6 +170,9 @@ int __init s3c2410_init(void)
|
||||
{
|
||||
printk("S3C2410: Initialising architecture\n");
|
||||
|
||||
register_syscore_ops(&s3c2410_pm_syscore_ops);
|
||||
register_syscore_ops(&s3c24xx_irq_syscore_ops);
|
||||
|
||||
return sysdev_register(&s3c2410_sysdev);
|
||||
}
|
||||
|
||||
|
@ -202,8 +202,6 @@ static int s3c2412_irq_add(struct sys_device *sysdev)
|
||||
|
||||
static struct sysdev_driver s3c2412_irq_driver = {
|
||||
.add = s3c2412_irq_add,
|
||||
.suspend = s3c24xx_irq_suspend,
|
||||
.resume = s3c24xx_irq_resume,
|
||||
};
|
||||
|
||||
static int s3c2412_irq_init(void)
|
||||
|
@ -17,7 +17,7 @@
|
||||
#include <linux/timer.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/i2c.h>
|
||||
@ -486,7 +486,7 @@ static struct s3c2410_udc_mach_info jive_udc_cfg __initdata = {
|
||||
/* Jive power management device */
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int jive_pm_suspend(struct sys_device *sd, pm_message_t state)
|
||||
static int jive_pm_suspend(void)
|
||||
{
|
||||
/* Write the magic value u-boot uses to check for resume into
|
||||
* the INFORM0 register, and ensure INFORM1 is set to the
|
||||
@ -498,10 +498,9 @@ static int jive_pm_suspend(struct sys_device *sd, pm_message_t state)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int jive_pm_resume(struct sys_device *sd)
|
||||
static void jive_pm_resume(void)
|
||||
{
|
||||
__raw_writel(0x0, S3C2412_INFORM0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
@ -509,16 +508,11 @@ static int jive_pm_resume(struct sys_device *sd)
|
||||
#define jive_pm_resume NULL
|
||||
#endif
|
||||
|
||||
static struct sysdev_class jive_pm_sysclass = {
|
||||
.name = "jive-pm",
|
||||
static struct syscore_ops jive_pm_syscore_ops = {
|
||||
.suspend = jive_pm_suspend,
|
||||
.resume = jive_pm_resume,
|
||||
};
|
||||
|
||||
static struct sys_device jive_pm_sysdev = {
|
||||
.cls = &jive_pm_sysclass,
|
||||
};
|
||||
|
||||
static void __init jive_map_io(void)
|
||||
{
|
||||
s3c24xx_init_io(jive_iodesc, ARRAY_SIZE(jive_iodesc));
|
||||
@ -536,10 +530,9 @@ static void jive_power_off(void)
|
||||
|
||||
static void __init jive_machine_init(void)
|
||||
{
|
||||
/* register system devices for managing low level suspend */
|
||||
/* register system core operations for managing low level suspend */
|
||||
|
||||
sysdev_class_register(&jive_pm_sysclass);
|
||||
sysdev_register(&jive_pm_sysdev);
|
||||
register_syscore_ops(&jive_pm_syscore_ops);
|
||||
|
||||
/* write our sleep configurations for the IO. Pull down all unused
|
||||
* IO, ensure that we have turned off all peripherals we do not
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include <linux/timer.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
@ -86,13 +87,24 @@ static struct sleep_save s3c2412_sleep[] = {
|
||||
SAVE_ITEM(S3C2413_GPJSLPCON),
|
||||
};
|
||||
|
||||
static int s3c2412_pm_suspend(struct sys_device *dev, pm_message_t state)
|
||||
static struct sysdev_driver s3c2412_pm_driver = {
|
||||
.add = s3c2412_pm_add,
|
||||
};
|
||||
|
||||
static __init int s3c2412_pm_init(void)
|
||||
{
|
||||
return sysdev_driver_register(&s3c2412_sysclass, &s3c2412_pm_driver);
|
||||
}
|
||||
|
||||
arch_initcall(s3c2412_pm_init);
|
||||
|
||||
static int s3c2412_pm_suspend(void)
|
||||
{
|
||||
s3c_pm_do_save(s3c2412_sleep, ARRAY_SIZE(s3c2412_sleep));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int s3c2412_pm_resume(struct sys_device *dev)
|
||||
static void s3c2412_pm_resume(void)
|
||||
{
|
||||
unsigned long tmp;
|
||||
|
||||
@ -102,18 +114,9 @@ static int s3c2412_pm_resume(struct sys_device *dev)
|
||||
__raw_writel(tmp, S3C2412_PWRCFG);
|
||||
|
||||
s3c_pm_do_restore(s3c2412_sleep, ARRAY_SIZE(s3c2412_sleep));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct sysdev_driver s3c2412_pm_driver = {
|
||||
.add = s3c2412_pm_add,
|
||||
struct syscore_ops s3c2412_pm_syscore_ops = {
|
||||
.suspend = s3c2412_pm_suspend,
|
||||
.resume = s3c2412_pm_resume,
|
||||
};
|
||||
|
||||
static __init int s3c2412_pm_init(void)
|
||||
{
|
||||
return sysdev_driver_register(&s3c2412_sysclass, &s3c2412_pm_driver);
|
||||
}
|
||||
|
||||
arch_initcall(s3c2412_pm_init);
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include <linux/clk.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/io.h>
|
||||
@ -244,5 +245,8 @@ int __init s3c2412_init(void)
|
||||
{
|
||||
printk("S3C2412: Initialising architecture\n");
|
||||
|
||||
register_syscore_ops(&s3c2412_pm_syscore_ops);
|
||||
register_syscore_ops(&s3c24xx_irq_syscore_ops);
|
||||
|
||||
return sysdev_register(&s3c2412_sysdev);
|
||||
}
|
||||
|
@ -236,8 +236,6 @@ static int __init s3c2416_irq_add(struct sys_device *sysdev)
|
||||
|
||||
static struct sysdev_driver s3c2416_irq_driver = {
|
||||
.add = s3c2416_irq_add,
|
||||
.suspend = s3c24xx_irq_suspend,
|
||||
.resume = s3c24xx_irq_resume,
|
||||
};
|
||||
|
||||
static int __init s3c2416_irq_init(void)
|
||||
|
@ -11,6 +11,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <asm/cacheflush.h>
|
||||
@ -55,25 +56,8 @@ static int s3c2416_pm_add(struct sys_device *sysdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int s3c2416_pm_suspend(struct sys_device *dev, pm_message_t state)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int s3c2416_pm_resume(struct sys_device *dev)
|
||||
{
|
||||
/* unset the return-from-sleep amd inform flags */
|
||||
__raw_writel(0x0, S3C2443_PWRMODE);
|
||||
__raw_writel(0x0, S3C2412_INFORM0);
|
||||
__raw_writel(0x0, S3C2412_INFORM1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct sysdev_driver s3c2416_pm_driver = {
|
||||
.add = s3c2416_pm_add,
|
||||
.suspend = s3c2416_pm_suspend,
|
||||
.resume = s3c2416_pm_resume,
|
||||
};
|
||||
|
||||
static __init int s3c2416_pm_init(void)
|
||||
@ -82,3 +66,16 @@ static __init int s3c2416_pm_init(void)
|
||||
}
|
||||
|
||||
arch_initcall(s3c2416_pm_init);
|
||||
|
||||
|
||||
static void s3c2416_pm_resume(void)
|
||||
{
|
||||
/* unset the return-from-sleep amd inform flags */
|
||||
__raw_writel(0x0, S3C2443_PWRMODE);
|
||||
__raw_writel(0x0, S3C2412_INFORM0);
|
||||
__raw_writel(0x0, S3C2412_INFORM1);
|
||||
}
|
||||
|
||||
struct syscore_ops s3c2416_pm_syscore_ops = {
|
||||
.resume = s3c2416_pm_resume,
|
||||
};
|
||||
|
@ -32,6 +32,7 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
@ -54,6 +55,7 @@
|
||||
#include <plat/devs.h>
|
||||
#include <plat/cpu.h>
|
||||
#include <plat/sdhci.h>
|
||||
#include <plat/pm.h>
|
||||
|
||||
#include <plat/iic-core.h>
|
||||
#include <plat/fb-core.h>
|
||||
@ -95,6 +97,9 @@ int __init s3c2416_init(void)
|
||||
|
||||
s3c_fb_setname("s3c2443-fb");
|
||||
|
||||
register_syscore_ops(&s3c2416_pm_syscore_ops);
|
||||
register_syscore_ops(&s3c24xx_irq_syscore_ops);
|
||||
|
||||
return sysdev_register(&s3c2416_sysdev);
|
||||
}
|
||||
|
||||
|
@ -17,7 +17,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/i2c.h>
|
||||
@ -284,7 +284,7 @@ static struct platform_device osiris_pcmcia = {
|
||||
#ifdef CONFIG_PM
|
||||
static unsigned char pm_osiris_ctrl0;
|
||||
|
||||
static int osiris_pm_suspend(struct sys_device *sd, pm_message_t state)
|
||||
static int osiris_pm_suspend(void)
|
||||
{
|
||||
unsigned int tmp;
|
||||
|
||||
@ -304,7 +304,7 @@ static int osiris_pm_suspend(struct sys_device *sd, pm_message_t state)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int osiris_pm_resume(struct sys_device *sd)
|
||||
static void osiris_pm_resume(void)
|
||||
{
|
||||
if (pm_osiris_ctrl0 & OSIRIS_CTRL0_FIX8)
|
||||
__raw_writeb(OSIRIS_CTRL1_FIX8, OSIRIS_VA_CTRL1);
|
||||
@ -312,8 +312,6 @@ static int osiris_pm_resume(struct sys_device *sd)
|
||||
__raw_writeb(pm_osiris_ctrl0, OSIRIS_VA_CTRL0);
|
||||
|
||||
s3c_gpio_cfgpin(S3C2410_GPA(21), S3C2410_GPA21_nRSTOUT);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
@ -321,16 +319,11 @@ static int osiris_pm_resume(struct sys_device *sd)
|
||||
#define osiris_pm_resume NULL
|
||||
#endif
|
||||
|
||||
static struct sysdev_class osiris_pm_sysclass = {
|
||||
.name = "mach-osiris",
|
||||
static struct syscore_ops osiris_pm_syscore_ops = {
|
||||
.suspend = osiris_pm_suspend,
|
||||
.resume = osiris_pm_resume,
|
||||
};
|
||||
|
||||
static struct sys_device osiris_pm_sysdev = {
|
||||
.cls = &osiris_pm_sysclass,
|
||||
};
|
||||
|
||||
/* Link for DVS driver to TPS65011 */
|
||||
|
||||
static void osiris_tps_release(struct device *dev)
|
||||
@ -439,8 +432,7 @@ static void __init osiris_map_io(void)
|
||||
|
||||
static void __init osiris_init(void)
|
||||
{
|
||||
sysdev_class_register(&osiris_pm_sysclass);
|
||||
sysdev_register(&osiris_pm_sysdev);
|
||||
register_syscore_ops(&osiris_pm_syscore_ops);
|
||||
|
||||
s3c_i2c0_set_platdata(NULL);
|
||||
s3c_nand_set_platdata(&osiris_nand_info);
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/io.h>
|
||||
@ -33,6 +34,7 @@
|
||||
#include <plat/devs.h>
|
||||
#include <plat/cpu.h>
|
||||
#include <plat/s3c244x.h>
|
||||
#include <plat/pm.h>
|
||||
|
||||
#include <plat/gpio-core.h>
|
||||
#include <plat/gpio-cfg.h>
|
||||
@ -51,6 +53,12 @@ int __init s3c2440_init(void)
|
||||
s3c_device_wdt.resource[1].start = IRQ_S3C2440_WDT;
|
||||
s3c_device_wdt.resource[1].end = IRQ_S3C2440_WDT;
|
||||
|
||||
/* register suspend/resume handlers */
|
||||
|
||||
register_syscore_ops(&s3c2410_pm_syscore_ops);
|
||||
register_syscore_ops(&s3c244x_pm_syscore_ops);
|
||||
register_syscore_ops(&s3c24xx_irq_syscore_ops);
|
||||
|
||||
/* register our system device for everything else */
|
||||
|
||||
return sysdev_register(&s3c2440_sysdev);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user