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:
Benjamin Herrenschmidt 2011-05-20 15:36:52 +10:00
commit 880102e785
749 changed files with 24935 additions and 11312 deletions

View File

@ -328,8 +328,6 @@ sysrq.txt
- info on the magic SysRq key. - info on the magic SysRq key.
telephony/ telephony/
- directory with info on telephony (e.g. voice over IP) support. - directory with info on telephony (e.g. voice over IP) support.
uml/
- directory with information about User Mode Linux.
unicode.txt unicode.txt
- info on the Unicode character/font mapping used in Linux. - info on the Unicode character/font mapping used in Linux.
unshare.txt unshare.txt

View File

@ -183,21 +183,21 @@ Description: Discover and change clock speed of CPUs
to learn how to control the knobs. to learn how to control the knobs.
What: /sys/devices/system/cpu/cpu*/cache/index*/cache_disable_X What: /sys/devices/system/cpu/cpu*/cache/index3/cache_disable_{0,1}
Date: August 2008 Date: August 2008
KernelVersion: 2.6.27 KernelVersion: 2.6.27
Contact: mark.langsdorf@amd.com Contact: discuss@x86-64.org
Description: These files exist in every cpu's cache index directories. Description: Disable L3 cache indices
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.
Currently, only AMD Family 10h Processors support cache index These files exist in every CPU's cache/index3 directory. Each
disable, and only for their L3 caches. See the BIOS and cache_disable_{0,1} file corresponds to one disable slot which
Kernel Developer's Guide at can be used to disable a cache index. Reading from these files
http://support.amd.com/us/Embedded_TechDocs/31116-Public-GH-BKDG_3-28_5-28-09.pdf on a processor with this functionality will return the currently
for formatting information and other details on the disabled index for that node. There is one L3 structure per
cache index disable. node, or per internal node on MCM machines. Writing a valid
Users: joachim.deguara@amd.com 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

View File

@ -14,14 +14,15 @@ Description:
DMI is structured as a large table of entries, where DMI is structured as a large table of entries, where
each entry has a common header indicating the type and each entry has a common header indicating the type and
length of the entry, as well as 'handle' that is length of the entry, as well as a firmware-provided
supposed to be unique amongst all entries. 'handle' that is supposed to be unique amongst all
entries.
Some entries are required by the specification, but many Some entries are required by the specification, but many
others are optional. In general though, users should others are optional. In general though, users should
never expect to find a specific entry type on their never expect to find a specific entry type on their
system unless they know for certain what their firmware 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 Multiple entries of the same type are allowed. In order
to handle these duplicate entry types, each entry is to handle these duplicate entry types, each entry is
@ -67,25 +68,24 @@ Description:
and the two terminating nul characters. and the two terminating nul characters.
type : The type of the entry. This value is the same type : The type of the entry. This value is the same
as found in the directory name. It indicates as found in the directory name. It indicates
how the rest of the entry should be how the rest of the entry should be interpreted.
interpreted.
instance: The instance ordinal of the entry for the instance: The instance ordinal of the entry for the
given type. This value is the same as found given type. This value is the same as found
in the parent directory name. in the parent directory name.
position: The position of the entry within the entirety position: The ordinal position (zero-based) of the entry
of the entirety. within the entirety of the DMI entry table.
=== Entry Specialization === === Entry Specialization ===
Some entry types may have other information available in Some entry types may have other information available in
sysfs. sysfs. Not all types are specialized.
--- Type 15 - System Event Log --- --- Type 15 - System Event Log ---
This entry allows the firmware to export a log of This entry allows the firmware to export a log of
events the system has taken. This information is events the system has taken. This information is
typically backed by nvram, but the implementation 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: is exported in the directory:
/sys/firmware/dmi/entries/15-0/system_event_log /sys/firmware/dmi/entries/15-0/system_event_log

View 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.

View 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.

View 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

View File

@ -158,3 +158,17 @@ Description:
successful, will make the kernel abort a subsequent transition successful, will make the kernel abort a subsequent transition
to a sleep state if any wakeup events are reported after the to a sleep state if any wakeup events are reported after the
write has returned. 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.

View File

@ -96,10 +96,10 @@ X!Iinclude/linux/kobject.h
<chapter id="devdrivers"> <chapter id="devdrivers">
<title>Device drivers infrastructure</title> <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> <sect1><title>Device Drivers Base</title>
<!--
X!Iinclude/linux/device.h
-->
!Edrivers/base/driver.c !Edrivers/base/driver.c
!Edrivers/base/core.c !Edrivers/base/core.c
!Edrivers/base/class.c !Edrivers/base/class.c

View File

@ -191,8 +191,8 @@
<para> <para>
Whenever an interrupt triggers, the lowlevel arch code calls into Whenever an interrupt triggers, the lowlevel arch code calls into
the generic interrupt code by calling desc->handle_irq(). the generic interrupt code by calling desc->handle_irq().
This highlevel IRQ handling function only uses desc->chip primitives This highlevel IRQ handling function only uses desc->irq_data.chip
referenced by the assigned chip descriptor structure. primitives referenced by the assigned chip descriptor structure.
</para> </para>
</sect1> </sect1>
<sect1 id="Highlevel_Driver_API"> <sect1 id="Highlevel_Driver_API">
@ -206,11 +206,11 @@
<listitem><para>enable_irq()</para></listitem> <listitem><para>enable_irq()</para></listitem>
<listitem><para>disable_irq_nosync() (SMP only)</para></listitem> <listitem><para>disable_irq_nosync() (SMP only)</para></listitem>
<listitem><para>synchronize_irq() (SMP only)</para></listitem> <listitem><para>synchronize_irq() (SMP only)</para></listitem>
<listitem><para>set_irq_type()</para></listitem> <listitem><para>irq_set_irq_type()</para></listitem>
<listitem><para>set_irq_wake()</para></listitem> <listitem><para>irq_set_irq_wake()</para></listitem>
<listitem><para>set_irq_data()</para></listitem> <listitem><para>irq_set_handler_data()</para></listitem>
<listitem><para>set_irq_chip()</para></listitem> <listitem><para>irq_set_chip()</para></listitem>
<listitem><para>set_irq_chip_data()</para></listitem> <listitem><para>irq_set_chip_data()</para></listitem>
</itemizedlist> </itemizedlist>
See the autogenerated function documentation for details. See the autogenerated function documentation for details.
</para> </para>
@ -225,6 +225,8 @@
<listitem><para>handle_fasteoi_irq</para></listitem> <listitem><para>handle_fasteoi_irq</para></listitem>
<listitem><para>handle_simple_irq</para></listitem> <listitem><para>handle_simple_irq</para></listitem>
<listitem><para>handle_percpu_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> </itemizedlist>
The interrupt flow handlers (either predefined or architecture The interrupt flow handlers (either predefined or architecture
specific) are assigned to specific interrupts by the architecture specific) are assigned to specific interrupts by the architecture
@ -241,13 +243,13 @@
<programlisting> <programlisting>
default_enable(struct irq_data *data) default_enable(struct irq_data *data)
{ {
desc->chip->irq_unmask(data); desc->irq_data.chip->irq_unmask(data);
} }
default_disable(struct irq_data *data) default_disable(struct irq_data *data)
{ {
if (!delay_disable(data)) if (!delay_disable(data))
desc->chip->irq_mask(data); desc->irq_data.chip->irq_mask(data);
} }
default_ack(struct irq_data *data) default_ack(struct irq_data *data)
@ -284,9 +286,9 @@ noop(struct irq_data *data))
<para> <para>
The following control flow is implemented (simplified excerpt): The following control flow is implemented (simplified excerpt):
<programlisting> <programlisting>
desc->chip->irq_mask(); desc->irq_data.chip->irq_mask_ack();
handle_IRQ_event(desc->action); handle_irq_event(desc->action);
desc->chip->irq_unmask(); desc->irq_data.chip->irq_unmask();
</programlisting> </programlisting>
</para> </para>
</sect3> </sect3>
@ -300,8 +302,8 @@ desc->chip->irq_unmask();
<para> <para>
The following control flow is implemented (simplified excerpt): The following control flow is implemented (simplified excerpt):
<programlisting> <programlisting>
handle_IRQ_event(desc->action); handle_irq_event(desc->action);
desc->chip->irq_eoi(); desc->irq_data.chip->irq_eoi();
</programlisting> </programlisting>
</para> </para>
</sect3> </sect3>
@ -315,17 +317,17 @@ desc->chip->irq_eoi();
The following control flow is implemented (simplified excerpt): The following control flow is implemented (simplified excerpt):
<programlisting> <programlisting>
if (desc->status &amp; running) { if (desc->status &amp; running) {
desc->chip->irq_mask(); desc->irq_data.chip->irq_mask_ack();
desc->status |= pending | masked; desc->status |= pending | masked;
return; return;
} }
desc->chip->irq_ack(); desc->irq_data.chip->irq_ack();
desc->status |= running; desc->status |= running;
do { do {
if (desc->status &amp; masked) if (desc->status &amp; masked)
desc->chip->irq_unmask(); desc->irq_data.chip->irq_unmask();
desc->status &amp;= ~pending; desc->status &amp;= ~pending;
handle_IRQ_event(desc->action); handle_irq_event(desc->action);
} while (status &amp; pending); } while (status &amp; pending);
desc->status &amp;= ~running; desc->status &amp;= ~running;
</programlisting> </programlisting>
@ -344,7 +346,7 @@ desc->status &amp;= ~running;
<para> <para>
The following control flow is implemented (simplified excerpt): The following control flow is implemented (simplified excerpt):
<programlisting> <programlisting>
handle_IRQ_event(desc->action); handle_irq_event(desc->action);
</programlisting> </programlisting>
</para> </para>
</sect3> </sect3>
@ -362,12 +364,29 @@ handle_IRQ_event(desc->action);
<para> <para>
The following control flow is implemented (simplified excerpt): The following control flow is implemented (simplified excerpt):
<programlisting> <programlisting>
handle_IRQ_event(desc->action); if (desc->irq_data.chip->irq_ack)
if (desc->chip->irq_eoi) desc->irq_data.chip->irq_ack();
desc->chip->irq_eoi(); handle_irq_event(desc->action);
if (desc->irq_data.chip->irq_eoi)
desc->irq_data.chip->irq_eoi();
</programlisting> </programlisting>
</para> </para>
</sect3> </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>
<sect2 id="Quirks_and_optimizations"> <sect2 id="Quirks_and_optimizations">
<title>Quirks and optimizations</title> <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_ack() - Optional, recommended for performance</para></listitem>
<listitem><para>irq_mask()</para></listitem> <listitem><para>irq_mask()</para></listitem>
<listitem><para>irq_unmask()</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_retrigger() - Optional</para></listitem>
<listitem><para>irq_set_type() - Optional</para></listitem> <listitem><para>irq_set_type() - Optional</para></listitem>
<listitem><para>irq_set_wake() - Optional</para></listitem> <listitem><para>irq_set_wake() - Optional</para></listitem>
@ -424,32 +444,24 @@ if (desc->chip->irq_eoi)
<chapter id="doirq"> <chapter id="doirq">
<title>__do_IRQ entry point</title> <title>__do_IRQ entry point</title>
<para> <para>
The original implementation __do_IRQ() is an alternative entry The original implementation __do_IRQ() was an alternative entry
point for all types of interrupts. point for all types of interrupts. It not longer exists.
</para> </para>
<para> <para>
This handler turned out to be not suitable for all This handler turned out to be not suitable for all
interrupt hardware and was therefore reimplemented with split 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 only a functional optimization. It also shortens code paths for
interrupts. interrupts.
</para> </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>
<chapter id="locking"> <chapter id="locking">
<title>Locking on SMP</title> <title>Locking on SMP</title>
<para> <para>
The locking of chip registers is up to the architecture that 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 defines the chip primitives. The per-irq structure is
for serialization, but the generic layer does not touch it. The per-irq protected via desc->lock, by the generic layer.
structure is protected via desc->lock, by the generic layer.
</para> </para>
</chapter> </chapter>
<chapter id="structs"> <chapter id="structs">

View File

@ -21,7 +21,7 @@ rcu.txt
RTFP.txt RTFP.txt
- List of RCU papers (bibliography) going back to 1980. - List of RCU papers (bibliography) going back to 1980.
stallwarn.txt stallwarn.txt
- RCU CPU stall warnings (CONFIG_RCU_CPU_STALL_DETECTOR) - RCU CPU stall warnings (module parameter rcu_cpu_stall_suppress)
torture.txt torture.txt
- RCU Torture Test Operation (CONFIG_RCU_TORTURE_TEST) - RCU Torture Test Operation (CONFIG_RCU_TORTURE_TEST)
trace.txt trace.txt

View File

@ -1,22 +1,25 @@
Using RCU's CPU Stall Detector Using RCU's CPU Stall Detector
The CONFIG_RCU_CPU_STALL_DETECTOR kernel config parameter enables The rcu_cpu_stall_suppress module parameter enables RCU's CPU stall
RCU's CPU stall detector, which detects conditions that unduly delay detector, which detects conditions that unduly delay RCU grace periods.
RCU grace periods. The stall detector's idea of what constitutes This module parameter enables CPU stall detection by default, but
"unduly delayed" is controlled by a set of C preprocessor macros: 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 This kernel configuration parameter defines the period of time
the beginning of a grace period until it issues an RCU CPU that RCU will wait from the beginning of a grace period until it
stall warning. This time period is normally ten seconds. issues an RCU CPU stall warning. This time period is normally
ten seconds.
RCU_SECONDS_TILL_STALL_RECHECK RCU_SECONDS_TILL_STALL_RECHECK
This macro defines the period of time that RCU will wait after This macro defines the period of time that RCU will wait after
issuing a stall warning until it issues another stall warning issuing a stall warning until it issues another stall warning
for the same stall. This time period is normally set to thirty for the same stall. This time period is normally set to three
seconds. times the check interval plus thirty seconds.
RCU_STALL_RAT_DELAY RCU_STALL_RAT_DELAY

View File

@ -10,34 +10,46 @@ for rcutree and next for rcutiny.
CONFIG_TREE_RCU and CONFIG_TREE_PREEMPT_RCU debugfs Files and Formats CONFIG_TREE_RCU and CONFIG_TREE_PREEMPT_RCU debugfs Files and Formats
These implementations of RCU provides five debugfs files under the These implementations of RCU provides several debugfs files under the
top-level directory RCU: rcu/rcudata (which displays fields in struct top-level directory "rcu":
rcu_data), rcu/rcudata.csv (which is a .csv spreadsheet version of
rcu/rcudata), rcu/rcugp (which displays grace-period counters), rcu/rcudata:
rcu/rcuhier (which displays the struct rcu_node hierarchy), and Displays fields in struct rcu_data.
rcu/rcu_pending (which displays counts of the reasons that the rcu/rcudata.csv:
rcu_pending() function decided that there was core RCU work to do). 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: The output of "cat rcu/rcudata" looks as follows:
rcu_sched: 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 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=17829 g=17829 pq=1 pqc=17829 qp=0 dt=16117/1 dn=0 df=1015 of=0 ri=0 ql=0 b=10 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=17829 g=17829 pq=1 pqc=17829 qp=0 dt=1445/1 dn=0 df=1839 of=0 ri=0 ql=0 b=10 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=17829 g=17829 pq=1 pqc=17829 qp=0 dt=6681/1 dn=0 df=1545 of=0 ri=0 ql=0 b=10 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=17829 g=17829 pq=1 pqc=17829 qp=0 dt=1003/1 dn=0 df=1992 of=0 ri=0 ql=0 b=10 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=17829 g=17830 pq=1 pqc=17829 qp=1 dt=3887/1 dn=0 df=3331 of=0 ri=4 ql=2 b=10 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=17829 g=17829 pq=1 pqc=17829 qp=0 dt=859/1 dn=0 df=3224 of=0 ri=0 ql=0 b=10 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=17829 g=17830 pq=0 pqc=17829 qp=1 dt=3761/1 dn=0 df=1818 of=0 ri=0 ql=2 b=10 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: 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 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=-275 g=-275 pq=1 pqc=-275 qp=0 dt=16117/1 dn=0 df=13 of=0 ri=0 ql=0 b=10 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=-275 g=-275 pq=1 pqc=-275 qp=0 dt=1445/1 dn=0 df=15 of=0 ri=0 ql=0 b=10 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=-275 g=-275 pq=1 pqc=-275 qp=0 dt=6681/1 dn=0 df=9 of=0 ri=0 ql=0 b=10 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=-275 g=-275 pq=1 pqc=-275 qp=0 dt=1003/1 dn=0 df=15 of=0 ri=0 ql=0 b=10 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=-275 g=-275 pq=1 pqc=-275 qp=0 dt=3887/1 dn=0 df=15 of=0 ri=0 ql=0 b=10 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=-275 g=-275 pq=1 pqc=-275 qp=0 dt=859/1 dn=0 df=15 of=0 ri=0 ql=0 b=10 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=-275 g=-275 pq=1 pqc=-275 qp=0 dt=3761/1 dn=0 df=15 of=0 ri=0 ql=0 b=10 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 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 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. substantially larger than the number of actual CPUs.
o "c" is the count of grace periods that this CPU believes have o "c" is the count of grace periods that this CPU believes have
completed. CPUs in dynticks idle mode may lag quite a ways completed. Offlined CPUs and CPUs in dynticks idle mode may
behind, for example, CPU 4 under "rcu_sched" above, which has lag quite a ways behind, for example, CPU 6 under "rcu_sched"
slept through the past 25 RCU grace periods. It is not unusual above, which has been offline through not quite 40,000 RCU grace
to see CPUs lagging by thousands of grace periods. 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 o "g" is the count of grace periods that this CPU believes have
started. Again, CPUs in dynticks idle mode may lag behind. started. Again, offlined CPUs and CPUs in dynticks idle mode
If the "c" and "g" values are equal, this CPU has already may lag behind. If the "c" and "g" values are equal, this CPU
reported a quiescent state for the last RCU grace period that has already reported a quiescent state for the last RCU grace
it is aware of, otherwise, the CPU believes that it owes RCU a period that it is aware of, otherwise, the CPU believes that it
quiescent state. owes RCU a quiescent state.
o "pq" indicates that this CPU has passed through 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 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! the next grace period!
o "qp" indicates that RCU still expects a quiescent state from 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 o "dt" is the current value of the dyntick counter that is incremented
when entering or leaving dynticks idle state, either by the 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 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 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 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 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. 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 of what state they are in (new, waiting for grace period to
start, waiting for grace period to end, ready to invoke). 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 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 of RCU callbacks is ready to invoke, then the remainder will
be deferred. 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: 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 c=6902 g=6903 s=2 jfq=3 j=72c7 nfqs=13142/nfqsng=0(13142) fqlh=6
1/1 .>. 0:127 ^0 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/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 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: rcu_bh:
c=-226 g=-226 s=1 jfq=-5701 j=72c7 nfqs=88/nfqsng=0(88) fqlh=0 c=-226 g=-226 s=1 jfq=-5701 j=72c7 nfqs=88/nfqsng=0(88) fqlh=0
0/1 .>. 0:127 ^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/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/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, This is once again split into "rcu_sched" and "rcu_bh" portions,
and CONFIG_TREE_PREEMPT_RCU kernels will again have an additional 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. current grace period.
o The characters separated by the ">" indicate the state 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 indicates that at least one task blocked in an RCU
read-side critical section blocks the current grace read-side critical section blocks the current grace
period, while a "." preceding the ">" indicates otherwise. period, while a "E" preceding the ">" indicates that
The character following the ">" indicates similarly for at least one task blocked in an RCU read-side critical
the next grace period. A "T" should appear in this section blocks the current expedited grace period.
field only for rcu-preempt. 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 o The numbers separated by the ":" are the range of CPUs
served by this struct rcu_node. This can be helpful 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(). 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 CONFIG_TINY_RCU and CONFIG_TINY_PREEMPT_RCU debugfs Files and Formats
These implementations of RCU provides a single debugfs file under the 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 o "nnb" is the number of normal grace periods that have had
to resort to RCU priority boosting since boot. 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. 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: o In the line beginning with "normal balk", the fields are as follows:

View File

@ -3,24 +3,7 @@ Bus Types
Definition Definition
~~~~~~~~~~ ~~~~~~~~~~
See the kerneldoc for the struct bus_type.
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);
};
int bus_register(struct bus_type * bus); int bus_register(struct bus_type * bus);

View File

@ -27,22 +27,7 @@ The device class structure looks like:
typedef int (*devclass_add)(struct device *); typedef int (*devclass_add)(struct device *);
typedef void (*devclass_remove)(struct device *); typedef void (*devclass_remove)(struct device *);
struct device_class { See the kerneldoc for the struct 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;
};
A typical device class definition would look like: A typical device class definition would look like:

View File

@ -2,96 +2,7 @@
The Basic Device Structure The Basic Device Structure
~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~
struct device { See the kerneldoc for the 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).
Programming Interface Programming Interface

View File

@ -1,23 +1,7 @@
Device Drivers Device Drivers
struct device_driver { See the kerneldoc for the 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);
};
Allocation Allocation

View File

@ -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 What: PCI DMA unmap state API
When: August 2012 When: August 2012
Why: PCI DMA unmap state API (include/linux/pci-dma.h) was replaced Why: PCI DMA unmap state API (include/linux/pci-dma.h) was replaced

View File

@ -836,7 +836,6 @@ Provides counts of softirq handlers serviced since boot time, for each cpu.
TASKLET: 0 0 0 290 TASKLET: 0 0 0 290
SCHED: 27035 26983 26971 26746 SCHED: 27035 26983 26971 26746
HRTIMER: 0 0 0 0 HRTIMER: 0 0 0 0
RCU: 1678 1769 2178 2250
1.3 IDE devices in /proc/ide 1.3 IDE devices in /proc/ide

View File

@ -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 fork. So if you have any comments or updates for this file, please try
to update the original English file first. 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/ > 翻訳団体: JF プロジェクト < http://www.linux.or.jp/JF/ >
翻訳日: 2008/10/24 翻訳日: 2011/3/28
翻訳者: Tsugikazu Shibata <tshibata at ab dot jp dot nec dot com> 翻訳者: Tsugikazu Shibata <tshibata at ab dot jp dot nec dot com>
校正者: 松倉さん <nbh--mats at nifty dot com> 校正者: 松倉さん <nbh--mats at nifty dot com>
小林 雅典さん (Masanori Kobayasi) <zap03216 at nifty dot ne dot jp> 小林 雅典さん (Masanori Kobayasi) <zap03216 at nifty dot ne dot jp>
@ -256,8 +256,8 @@ Linux カーネルの開発プロセスは現在幾つかの異なるメイン
- メインの 2.6.x カーネルツリー - メインの 2.6.x カーネルツリー
- 2.6.x.y -stable カーネルツリー - 2.6.x.y -stable カーネルツリー
- 2.6.x -git カーネルパッチ - 2.6.x -git カーネルパッチ
- 2.6.x -mm カーネルパッチ
- サブシステム毎のカーネルツリーとパッチ - サブシステム毎のカーネルツリーとパッチ
- 統合テストのための 2.6.x -next カーネルツリー
2.6.x カーネルツリー 2.6.x カーネルツリー
----------------- -----------------
@ -268,9 +268,9 @@ Linux カーネルの開発プロセスは現在幾つかの異なるメイン
- 新しいカーネルがリリースされた直後に、2週間の特別期間が設けられ、 - 新しいカーネルがリリースされた直後に、2週間の特別期間が設けられ、
この期間中に、メンテナ達は Linus に大きな差分を送ることができます。 この期間中に、メンテナ達は Linus に大きな差分を送ることができます。
このような差分は通常 -mm カーネルに数週間含まれてきたパッチです。 このような差分は通常 -next カーネルに数週間含まれてきたパッチです。
大きな変更は git(カーネルのソース管理ツール、詳細は 大きな変更は git(カーネルのソース管理ツール、詳細は
http://git.or.cz/ 参照) を使って送るのが好ましいやり方ですが、パッ http://git-scm.com/ 参照) を使って送るのが好ましいやり方ですが、パッ
チファイルの形式のまま送るのでも十分です。 チファイルの形式のまま送るのでも十分です。
- 2週間後、-rc1 カーネルがリリースされ、この後にはカーネル全体の安定 - 2週間後、-rc1 カーネルがリリースされ、この後にはカーネル全体の安定
@ -333,86 +333,44 @@ git リポジトリで管理されているLinus のカーネルツリーの毎
れは -rc カーネルと比べて、パッチが大丈夫かどうかも確認しないで自動的 れは -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> 統合テストのための 2.6.x -next カーネルツリー
git.kernel.org:/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git ---------------------------------------------
- Block の開発ツリー、Jens Axboe <axboe@suse.de> サブシステムツリーの更新内容がメインラインの 2.6.x ツリーにマージされ
git.kernel.org:/pub/scm/linux/kernel/git/axboe/linux-2.6-block.git る前に、それらは統合テストされる必要があります。この目的のため、実質的
に全サブシステムツリーからほぼ毎日プルされてできる特別なテスト用のリ
ポジトリが存在します-
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> このやり方によって、-next カーネルは次のマージ機会でどんなものがメイン
git.kernel.org:/pub/scm/linux/kernel/git/airlied/drm-2.6.git ラインカーネルにマージされるか、おおまかなの展望を提供します。-next
カーネルの実行テストを行う冒険好きなテスターは大いに歓迎されます
- 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 ファ
イルに一覧表があります。
バグレポート バグレポート
------------- -------------
@ -673,10 +631,9 @@ Linux カーネルコミュニティは、一度に大量のコードの塊を
じところからスタートしたのですから。 じところからスタートしたのですから。
Paolo Ciarrocchi に感謝、彼は彼の書いた "Development Process" Paolo Ciarrocchi に感謝、彼は彼の書いた "Development Process"
(http://linux.tar.bz/articles/2.6-development_process)セクショ (http://lwn.net/Articles/94386/) セクションをこのテキストの原型にする
ンをこのテキストの原型にすることを許可してくれました。 ことを許可してくれました。Rundy Dunlap と Gerrit Huizenga はメーリング
Rundy Dunlap と Gerrit Huizenga はメーリングリストでやるべきこととやっ リストでやるべきこととやってはいけないことのリストを提供してくれました。
てはいけないことのリストを提供してくれました。
以下の人々のレビュー、コメント、貢献に感謝。 以下の人々のレビュー、コメント、貢献に感謝。
Pat Mochel, Hanna Linder, Randy Dunlap, Kay Sievers, Pat Mochel, Hanna Linder, Randy Dunlap, Kay Sievers,
Vojtech Pavlik, Jan Kara, Josh Boyer, Kees Cook, Andrew Morton, Andi Vojtech Pavlik, Jan Kara, Josh Boyer, Kees Cook, Andrew Morton, Andi

View File

@ -245,7 +245,7 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
acpi_sleep= [HW,ACPI] Sleep options acpi_sleep= [HW,ACPI] Sleep options
Format: { s3_bios, s3_mode, s3_beep, s4_nohwsig, 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 See Documentation/power/video.txt for information on
s3_bios and s3_mode. s3_bios and s3_mode.
s3_beep is for debugging; it makes the PC's speaker beep 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=on: enable non-executable mappings (default)
noexec=off: disable non-executable mappings noexec=off: disable non-executable mappings
nosmep [X86]
Disable SMEP (Supervisor Mode Execution Protection)
even if it is supported by processor.
noexec32 [X86-64] noexec32 [X86-64]
This affects only 32-bit executables. This affects only 32-bit executables.
noexec32=on: enable non-executable mappings (default) noexec32=on: enable non-executable mappings (default)

View File

@ -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 time.) Unlike the other suspend-related phases, during the prepare
phase the device tree is traversed top-down. phase the device tree is traversed top-down.
The prepare phase uses only a bus callback. After the callback method In addition to that, if device drivers need to allocate additional
returns, no new children may be registered below the device. The method memory to be able to hadle device suspend correctly, that should be
may also prepare the device or driver in some way for the upcoming done in the prepare phase.
system power transition, but it should not put the device into a
low-power state. 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 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 I/O. They also may save the device registers and put it into the

View File

@ -1,46 +1,41 @@
Suspend notifiers 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 There are some operations that subsystems or drivers may want to carry out
.suspend() routines, but shouldn't, because they can cause the hibernation or before hibernation/suspend or after restore/resume, but they require the system
suspend to fail. For example, a driver may want to allocate a substantial amount to be fully functional, so the drivers' and subsystems' .suspend() and .resume()
of memory (like 50 MB) in .suspend(), but that shouldn't be done after the or even .prepare() and .complete() callbacks are not suitable for this purpose.
swsusp's memory shrinker has run. 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 The subsystems or drivers having such needs can register suspend notifiers that
hibernation/suspend or after a restore/resume, requiring the system to be fully will be called upon the following events by the PM core:
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:
PM_HIBERNATION_PREPARE The system is going to hibernate or suspend, tasks will PM_HIBERNATION_PREPARE The system is going to hibernate or suspend, tasks will
be frozen immediately. be frozen immediately.
PM_POST_HIBERNATION The system memory state has been restored from a PM_POST_HIBERNATION The system memory state has been restored from a
hibernation image or an error occurred during the hibernation image or an error occurred during
hibernation. Device drivers' .resume() callbacks have hibernation. Device drivers' restore callbacks have
been executed and tasks have been thawed. been executed and tasks have been thawed.
PM_RESTORE_PREPARE The system is going to restore a hibernation image. 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_HIBERNATION notification.
PM_POST_RESTORE An error occurred during the hibernation restore. PM_POST_RESTORE An error occurred during restore from hibernation.
Device drivers' .resume() callbacks have been executed Device drivers' restore callbacks have been executed
and tasks have been thawed. 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 PM_POST_SUSPEND The system has just resumed or an error occurred during
the suspend. Device drivers' .resume() callbacks have suspend. Device drivers' resume callbacks have been
been executed and tasks have been thawed. executed and tasks have been thawed.
It is generally assumed that whatever the notifiers do for It is generally assumed that whatever the notifiers do for
PM_HIBERNATION_PREPARE, should be undone for PM_POST_HIBERNATION. Analogously, PM_HIBERNATION_PREPARE, should be undone for PM_POST_HIBERNATION. Analogously,

View File

@ -120,7 +120,6 @@ format:
field:unsigned char common_flags; offset:2; size:1; signed:0; field:unsigned char common_flags; offset:2; size:1; signed:0;
field:unsigned char common_preempt_count; offset:3; 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_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:unsigned long __probe_ip; offset:12; size:4; signed:0;
field:int __probe_nargs; offset:16; size:4; signed:1; field:int __probe_nargs; offset:16; size:4; signed:1;

View 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.

View File

@ -7,7 +7,7 @@ Review checklist for kvm patches
2. Patches should be against kvm.git master branch. 2. Patches should be against kvm.git master branch.
3. If the patch introduces or modifies a new userspace API: 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 - the API must be discoverable using KVM_CHECK_EXTENSION
4. New state must include support for save/restore. 4. New state must include support for save/restore.

View File

@ -74,7 +74,8 @@ Running Lguest:
- Run an lguest as root: - 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: Explanation:
64: the amount of memory to use, in MB. 64: the amount of memory to use, in MB.

View File

@ -206,7 +206,7 @@ IOMMU (input/output memory management unit)
(e.g. because you have < 3 GB memory). (e.g. because you have < 3 GB memory).
Kernel boot message: "PCI-DMA: Disabling IOMMU" 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" Kernel boot message: "PCI-DMA: using GART IOMMU"
3. <arch/x86_64/kernel/pci-swiotlb.c> : Software IOMMU implementation. Used 3. <arch/x86_64/kernel/pci-swiotlb.c> : Software IOMMU implementation. Used

View 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>
浠ヤ??涓烘???
---------------------------------------------------------------------
Linux???浠跺?㈡?风?????缃?淇℃??
======================================================================
?????????缃?
----------------------------------------------------------------------
Linux?????歌ˉ涓???????杩????浠惰?????浜ょ??锛????濂芥??琛ヤ??浣?涓洪??浠朵????????宓?????????????浜?缁存?よ??
??ユ?堕??浠讹??浣???????浠剁?????瀹规?煎??搴?璇ユ??"text/plain"?????惰??锛????浠朵????????涓?璧???????锛?
???涓鸿??浼?浣胯ˉ涓????寮???ㄩ?ㄥ????ㄨ??璁鸿??绋?涓???????寰???伴?俱??
??ㄦ?ュ?????Linux?????歌ˉ涓???????浠跺?㈡?风????ㄥ?????琛ヤ????跺??璇ュ??浜?????????????濮???舵?????渚?濡?锛?
浠?浠?涓???芥?瑰?????????????ゅ?惰〃绗???????绌烘?硷???????虫????ㄦ??涓?琛????寮?澶存?????缁?灏俱??
涓?瑕????杩?"format=flowed"妯″????????琛ヤ?????杩???蜂??寮?璧蜂?????棰????浠ュ?????瀹崇?????琛????
涓?瑕?璁╀????????浠跺?㈡?风??杩?琛??????ㄦ?㈣?????杩???蜂??浼???村??浣????琛ヤ?????
???浠跺?㈡?风??涓???芥?瑰???????????瀛?绗????缂??????瑰?????瑕??????????琛ヤ???????芥??ASCII??????UTF-8缂??????瑰??锛?
濡????浣?浣跨??UTF-8缂??????瑰???????????浠讹??????浣?灏?浼???垮??涓?浜??????藉????????瀛?绗???????棰????
???浠跺?㈡?风??搴?璇ュ舰???骞朵??淇???? References: ?????? In-Reply-To: ???棰?锛?????
???浠惰??棰?灏变??浼?涓???????
澶???剁??甯?(?????????璐寸??甯?)???甯镐????界?ㄤ??琛ヤ??锛????涓哄?惰〃绗?浼?杞????涓虹┖??笺??浣跨??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??煎??????????????锛?涓?瑕??????ㄥ?????
褰?涔????涓?灏????浠剁????跺??锛???ㄩ??椤逛?????涓?瑕??????╄????ㄦ?㈣????????涓????缂虹?瑰氨???浣???ㄩ??浠朵腑杈???ョ??浠讳????????
??戒??浼?琚??????ㄦ?㈣??锛????姝や??蹇?椤诲?ㄥ?????琛ヤ??涔?????????ㄦ?㈣????????绠?????????规??灏辨???????ㄨ????ㄦ?㈣????ヤ功??????浠讹??
??跺?????瀹?淇?瀛?涓鸿??绋裤??涓????浣???ㄨ??绋夸腑???娆℃??寮?瀹?锛?瀹?宸茬????ㄩ?ㄨ????ㄦ?㈣??浜?锛?????浣???????浠惰?界?舵病???
?????╄????ㄦ?㈣??锛?浣????杩?涓?浼?澶卞?诲凡???????????ㄦ?㈣?????
??ㄩ??浠剁??搴????锛??????ヨˉ涓?涔????锛???句??甯哥?ㄧ??琛ヤ??瀹????绗?锛?涓?涓?杩?瀛????(---)???
??跺?????"Message"??????????锛??????╂????ユ??浠讹????ョ????????浣????琛ヤ?????浠躲??杩????涓?涓?棰?澶???????椤癸??浣????浠?
???杩?瀹????缃?浣???????浠跺缓绔?宸ュ?锋????????锛?杩????浠ュ甫涓?"insert file"??炬?????
浣????浠ュ????ㄥ?伴??杩?GPG???璁伴??浠讹??浣???????宓?琛ヤ?????濂戒??瑕?浣跨??GPG???璁板??浠????浣?涓哄??宓??????????绛惧??琛ヤ??锛?
褰?浠?GPG涓???????7浣?缂??????朵??浣夸??浠?????????村??澶???????
濡????浣????瑕?浠ラ??浠剁??褰㈠????????琛ヤ??锛?????灏卞?抽????瑰?婚??浠讹????跺?????涓?灞???э??绐????"Suggest automatic
display"锛?杩???峰??宓????浠舵?村?规??璁╄?昏???????般??
褰?浣?瑕?淇?瀛?灏?瑕?????????????宓???????琛ヤ??锛?浣????浠ヤ??娑???????琛ㄧ????奸????╁?????琛ヤ????????浠讹????跺????冲?婚?????
"save as"???浣????浠ヤ娇??ㄤ??涓?娌℃????存?圭????????琛ヤ????????浠讹??濡????瀹????浠ユ????褰㈠??缁???????褰?浣?姝g????ㄥ??
???宸辩??绐?????涓?瀵????锛????舵病??????椤瑰??浠ヤ??瀛????浠?--宸茬?????涓?涓?杩???风??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??煎??锛????????寰???俱??浠?浠?浠????棰???????涓????妗?涓???????"Preformat"??煎?????
濡????榛?璁ゆ????典??浣?涔??????????????????煎??锛?浣?涓?寰????瀹???逛负HTML??煎??锛?浠?浠?浣?涓轰??娆℃?х??锛???ヤ功?????扮??娑????锛?
??跺??寮哄?朵娇瀹??????版???????煎??锛???????瀹?灏变?????琛????瑕?瀹???板??锛???ㄥ??淇$????炬??涓?浣跨??shift?????ヤ娇瀹????涓?HTML
??煎??锛???跺?????棰???????涓????妗?涓???????"Preformat"??煎?????
- ???璁镐娇??ㄥ????ㄧ??缂?杈????锛?
???瀵?Thunderbird???琛ヤ?????绠?????????规??灏辨??浣跨?ㄤ??涓?"external editor"??╁??锛???跺??浣跨?ㄤ????????娆㈢??
$EDITOR??ヨ?诲???????????骞惰ˉ涓???版?????涓????瑕?瀹???板??锛????浠ヤ??杞藉苟涓?瀹?瑁?杩?涓???╁??锛???跺??娣诲??涓?涓?浣跨?ㄥ?????
??????View->Toolbars->Customize...??????褰?浣?涔????淇℃???????跺??浠?浠???瑰?诲??灏卞??浠ヤ?????
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TkRat (GUI)
???浠ヤ娇??ㄥ?????浣跨??"Insert file..."??????澶???ㄧ??缂?杈???ㄣ??
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Gmail (Web GUI)
涓?瑕?浣跨?ㄥ????????琛ヤ?????
Gmail缃?椤靛?㈡?风???????ㄥ?版????惰〃绗?杞????涓虹┖??笺??
??界?跺?惰〃绗?杞????涓虹┖??奸??棰????浠ヨ??澶???ㄧ??杈???ㄨВ??筹???????跺??杩?浼?浣跨?ㄥ??杞???㈣?????姣?琛???????涓?78涓?瀛?绗????
???涓?涓????棰????Gmail杩?浼????浠讳??涓????ASCII???瀛?绗????淇℃????逛负base64缂???????瀹????涓?瑗垮????????娆ф床浜虹?????瀛????
###

View File

@ -405,8 +405,8 @@ S: Maintained
F: sound/oss/aedsp16.c F: sound/oss/aedsp16.c
AFFS FILE SYSTEM AFFS FILE SYSTEM
M: Roman Zippel <zippel@linux-m68k.org> L: linux-fsdevel@vger.kernel.org
S: Maintained S: Orphan
F: Documentation/filesystems/affs.txt F: Documentation/filesystems/affs.txt
F: fs/affs/ F: fs/affs/
@ -2946,8 +2946,8 @@ F: drivers/block/cciss*
F: include/linux/cciss_ioctl.h F: include/linux/cciss_ioctl.h
HFS FILESYSTEM HFS FILESYSTEM
M: Roman Zippel <zippel@linux-m68k.org> L: linux-fsdevel@vger.kernel.org
S: Maintained S: Orphan
F: Documentation/filesystems/hfs.txt F: Documentation/filesystems/hfs.txt
F: fs/hfs/ F: fs/hfs/
@ -3814,7 +3814,7 @@ M: Rusty Russell <rusty@rustcorp.com.au>
L: lguest@lists.ozlabs.org L: lguest@lists.ozlabs.org
W: http://lguest.ozlabs.org/ W: http://lguest.ozlabs.org/
S: Odd Fixes S: Odd Fixes
F: Documentation/lguest/ F: Documentation/virtual/lguest/
F: arch/x86/lguest/ F: arch/x86/lguest/
F: drivers/lguest/ F: drivers/lguest/
F: include/linux/lguest*.h F: include/linux/lguest*.h
@ -4001,7 +4001,6 @@ F: arch/m32r/
M68K ARCHITECTURE M68K ARCHITECTURE
M: Geert Uytterhoeven <geert@linux-m68k.org> M: Geert Uytterhoeven <geert@linux-m68k.org>
M: Roman Zippel <zippel@linux-m68k.org>
L: linux-m68k@lists.linux-m68k.org L: linux-m68k@lists.linux-m68k.org
W: http://www.linux-m68k.org/ W: http://www.linux-m68k.org/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux-m68k.git 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 L: user-mode-linux-user@lists.sourceforge.net
W: http://user-mode-linux.sourceforge.net W: http://user-mode-linux.sourceforge.net
S: Maintained S: Maintained
F: Documentation/uml/ F: Documentation/virtual/uml/
F: arch/um/ F: arch/um/
F: fs/hostfs/ F: fs/hostfs/
F: fs/hppfs/ F: fs/hppfs/

View File

@ -1,7 +1,7 @@
VERSION = 2 VERSION = 2
PATCHLEVEL = 6 PATCHLEVEL = 6
SUBLEVEL = 39 SUBLEVEL = 39
EXTRAVERSION = -rc7 EXTRAVERSION =
NAME = Flesh-Eating Bats with Fangs NAME = Flesh-Eating Bats with Fangs
# *DOCUMENTATION* # *DOCUMENTATION*
@ -1268,6 +1268,7 @@ help:
@echo ' make C=1 [targets] Check all c source with $$CHECK (sparse by default)' @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 C=2 [targets] Force check of all c source with $$CHECK'
@echo ' make W=1 [targets] Enable extra gcc checks' @echo ' make W=1 [targets] Enable extra gcc checks'
@echo ' make RECORDMCOUNT_WARN=1 [targets] Warn about ignored mcount sections'
@echo '' @echo ''
@echo 'Execute "make" or "make all" to build all targets marked with [*] ' @echo 'Execute "make" or "make all" to build all targets marked with [*] '
@echo 'For further info see the ./README file' @echo 'For further info see the ./README file'

View File

@ -585,8 +585,7 @@ handle_ipi(struct pt_regs *regs)
switch (which) { switch (which) {
case IPI_RESCHEDULE: case IPI_RESCHEDULE:
/* Reschedule callback. Everything to be done scheduler_ipi();
is done by the interrupt return path. */
break; break;
case IPI_CALL_FUNC: case IPI_CALL_FUNC:

View File

@ -22,17 +22,16 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/list.h> #include <linux/list.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/sysdev.h> #include <linux/syscore_ops.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/amba/bus.h> #include <linux/amba/bus.h>
#include <asm/mach/irq.h> #include <asm/mach/irq.h>
#include <asm/hardware/vic.h> #include <asm/hardware/vic.h>
#if defined(CONFIG_PM) #ifdef CONFIG_PM
/** /**
* struct vic_device - VIC PM device * struct vic_device - VIC PM device
* @sysdev: The system device which is registered.
* @irq: The IRQ number for the base of the VIC. * @irq: The IRQ number for the base of the VIC.
* @base: The register base for the VIC. * @base: The register base for the VIC.
* @resume_sources: A bitmask of interrupts for resume. * @resume_sources: A bitmask of interrupts for resume.
@ -43,8 +42,6 @@
* @protect: Save for VIC_PROTECT. * @protect: Save for VIC_PROTECT.
*/ */
struct vic_device { struct vic_device {
struct sys_device sysdev;
void __iomem *base; void __iomem *base;
int irq; int irq;
u32 resume_sources; u32 resume_sources;
@ -59,11 +56,6 @@ struct vic_device {
static struct vic_device vic_devices[CONFIG_ARM_VIC_NR]; static struct vic_device vic_devices[CONFIG_ARM_VIC_NR];
static int vic_id; 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 */ #endif /* CONFIG_PM */
/** /**
@ -85,10 +77,9 @@ static void vic_init2(void __iomem *base)
writel(32, base + VIC_PL190_DEF_VECT_ADDR); writel(32, base + VIC_PL190_DEF_VECT_ADDR);
} }
#if defined(CONFIG_PM) #ifdef CONFIG_PM
static int vic_class_resume(struct sys_device *dev) static void resume_one_vic(struct vic_device *vic)
{ {
struct vic_device *vic = to_vic(dev);
void __iomem *base = vic->base; void __iomem *base = vic->base;
printk(KERN_DEBUG "%s: resuming vic at %p\n", __func__, 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);
writel(~vic->soft_int, base + VIC_INT_SOFT_CLEAR); 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; void __iomem *base = vic->base;
printk(KERN_DEBUG "%s: suspending vic at %p\n", __func__, 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);
writel(~vic->resume_irqs, base + VIC_INT_ENABLE_CLEAR); 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; return 0;
} }
struct sysdev_class vic_class = { struct syscore_ops vic_syscore_ops = {
.name = "vic", .suspend = vic_suspend,
.suspend = vic_class_suspend, .resume = vic_resume,
.resume = vic_class_resume,
}; };
/** /**
@ -147,30 +150,8 @@ struct sysdev_class vic_class = {
*/ */
static int __init vic_pm_init(void) static int __init vic_pm_init(void)
{ {
struct vic_device *dev = vic_devices; if (vic_id > 0)
int err; register_syscore_ops(&vic_syscore_ops);
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;
}
}
return 0; return 0;
} }

View 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

View File

@ -34,7 +34,6 @@
* timer interrupt which may be pending. * timer interrupt which may be pending.
*/ */
struct sys_timer { struct sys_timer {
struct sys_device dev;
void (*init)(void); void (*init)(void);
void (*suspend)(void); void (*suspend)(void);
void (*resume)(void); void (*resume)(void);

View File

@ -10,6 +10,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/sysdev.h> #include <linux/sysdev.h>
#include <linux/syscore_ops.h>
#include <asm/leds.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 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 = { static struct sysdev_class leds_sysclass = {
.name = "leds", .name = "leds",
.shutdown = leds_shutdown,
.suspend = leds_suspend,
.resume = leds_resume,
}; };
static struct sys_device leds_device = { static struct sys_device leds_device = {
@ -99,6 +79,28 @@ static struct sys_device leds_device = {
.cls = &leds_sysclass, .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) static int __init leds_init(void)
{ {
int ret; int ret;
@ -107,6 +109,8 @@ static int __init leds_init(void)
ret = sysdev_register(&leds_device); ret = sysdev_register(&leds_device);
if (ret == 0) if (ret == 0)
ret = sysdev_create_file(&leds_device, &attr_event); ret = sysdev_create_file(&leds_device, &attr_event);
if (ret == 0)
register_syscore_ops(&leds_syscore_ops);
return ret; return ret;
} }

View File

@ -560,10 +560,7 @@ asmlinkage void __exception_irq_entry do_IPI(int ipinr, struct pt_regs *regs)
break; break;
case IPI_RESCHEDULE: case IPI_RESCHEDULE:
/* scheduler_ipi();
* nothing more to do - eveything is
* done on the interrupt return path
*/
break; break;
case IPI_CALL_FUNC: case IPI_CALL_FUNC:

View File

@ -21,7 +21,7 @@
#include <linux/timex.h> #include <linux/timex.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/profile.h> #include <linux/profile.h>
#include <linux/sysdev.h> #include <linux/syscore_ops.h>
#include <linux/timer.h> #include <linux/timer.h>
#include <linux/irq.h> #include <linux/irq.h>
@ -115,48 +115,37 @@ void timer_tick(void)
#endif #endif
#if defined(CONFIG_PM) && !defined(CONFIG_GENERIC_CLOCKEVENTS) #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 (system_timer->suspend)
system_timer->suspend();
if (timer->suspend != NULL)
timer->suspend();
return 0; 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 (system_timer->resume)
system_timer->resume();
if (timer->resume != NULL)
timer->resume();
return 0;
} }
#else #else
#define timer_suspend NULL #define timer_suspend NULL
#define timer_resume NULL #define timer_resume NULL
#endif #endif
static struct sysdev_class timer_sysclass = { static struct syscore_ops timer_syscore_ops = {
.name = "timer",
.suspend = timer_suspend, .suspend = timer_suspend,
.resume = timer_resume, .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); register_syscore_ops(&timer_syscore_ops);
if (ret == 0) {
system_timer->dev.cls = &timer_sysclass;
ret = sysdev_register(&system_timer->dev);
}
return ret; return 0;
} }
device_initcall(timer_init_sysfs); device_initcall(timer_init_syscore_ops);
void __init time_init(void) void __init time_init(void)
{ {

View File

@ -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", printk(KERN_EMERG "Internal error: %s: %x [#%d]" S_PREEMPT S_SMP "\n",
str, err, ++die_counter); str, err, ++die_counter);
sysfs_printk_last_file();
/* trap and error numbers are mostly meaningless on ARM */ /* trap and error numbers are mostly meaningless on ARM */
ret = notify_die(DIE_OOPS, str, regs, err, tsk->thread.trap_no, SIGSEGV); ret = notify_die(DIE_OOPS, str, regs, err, tsk->thread.trap_no, SIGSEGV);

View File

@ -94,9 +94,7 @@ static int davinci_target(struct cpufreq_policy *policy,
if (freqs.old == freqs.new) if (freqs.old == freqs.new)
return ret; return ret;
cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, dev_dbg(&cpufreq.dev, "transition: %u --> %u\n", freqs.old, freqs.new);
dev_driver_string(cpufreq.dev),
"transition: %u --> %u\n", freqs.old, freqs.new);
ret = cpufreq_frequency_table_target(policy, pdata->freq_table, ret = cpufreq_frequency_table_target(policy, pdata->freq_table,
freqs.new, relation, &idx); freqs.new, relation, &idx);

View File

@ -16,6 +16,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/suspend.h> #include <linux/suspend.h>
#include <linux/syscore_ops.h>
#include <linux/io.h> #include <linux/io.h>
#include <asm/cacheflush.h> #include <asm/cacheflush.h>
@ -372,7 +373,27 @@ void exynos4_scu_enable(void __iomem *scu_base)
flush_cache_all(); 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 */ /* For release retention */
@ -394,27 +415,15 @@ static int exynos4_pm_resume(struct sys_device *dev)
/* enable L2X0*/ /* enable L2X0*/
writel_relaxed(1, S5P_VA_L2CC + L2X0_CTRL); writel_relaxed(1, S5P_VA_L2CC + L2X0_CTRL);
#endif #endif
return 0;
} }
static struct sysdev_driver exynos4_pm_driver = { static struct syscore_ops exynos4_pm_syscore_ops = {
.add = exynos4_pm_add,
.resume = exynos4_pm_resume, .resume = exynos4_pm_resume,
}; };
static __init int exynos4_pm_drvinit(void) static __init int exynos4_pm_syscore_init(void)
{ {
unsigned int tmp; register_syscore_ops(&exynos4_pm_syscore_ops);
return 0;
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); arch_initcall(exynos4_pm_syscore_init);

View File

@ -4,6 +4,7 @@ menu "Footbridge Implementations"
config ARCH_CATS config ARCH_CATS
bool "CATS" bool "CATS"
select CLKSRC_I8253
select FOOTBRIDGE_HOST select FOOTBRIDGE_HOST
select ISA select ISA
select ISA_DMA select ISA_DMA
@ -59,6 +60,7 @@ config ARCH_EBSA285_HOST
config ARCH_NETWINDER config ARCH_NETWINDER
bool "NetWinder" bool "NetWinder"
select CLKSRC_I8253
select FOOTBRIDGE_HOST select FOOTBRIDGE_HOST
select ISA select ISA
select ISA_DMA select ISA_DMA

View File

@ -10,53 +10,16 @@
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/spinlock.h>
#include <linux/timex.h> #include <linux/timex.h>
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/i8253.h>
#include <asm/mach/time.h> #include <asm/mach/time.h>
#include "common.h" #include "common.h"
#define PIT_MODE 0x43 DEFINE_RAW_SPINLOCK(i8253_lock);
#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),
};
static void pit_set_mode(enum clock_event_mode mode, static void pit_set_mode(enum clock_event_mode mode,
struct clock_event_device *evt) 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.max_delta_ns = clockevent_delta2ns(0x7fff, &pit_ce);
pit_ce.min_delta_ns = clockevent_delta2ns(0x000f, &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); setup_irq(pit_ce.irq, &pit_timer_irq);
clockevents_register_device(&pit_ce); clockevents_register_device(&pit_ce);

View File

@ -24,7 +24,7 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/string.h> #include <linux/string.h>
#include <linux/sysdev.h> #include <linux/syscore_ops.h>
#include <linux/amba/bus.h> #include <linux/amba/bus.h>
#include <linux/amba/kmi.h> #include <linux/amba/kmi.h>
#include <linux/clocksource.h> #include <linux/clocksource.h>
@ -180,13 +180,13 @@ static void __init ap_init_irq(void)
#ifdef CONFIG_PM #ifdef CONFIG_PM
static unsigned long ic_irq_enable; 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); ic_irq_enable = readl(VA_IC_BASE + IRQ_ENABLE);
return 0; return 0;
} }
static int irq_resume(struct sys_device *dev) static void irq_resume(void)
{ {
/* disable all irq sources */ /* disable all irq sources */
writel(-1, VA_CMIC_BASE + IRQ_ENABLE_CLEAR); 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(-1, VA_IC_BASE + FIQ_ENABLE_CLEAR);
writel(ic_irq_enable, VA_IC_BASE + IRQ_ENABLE_SET); writel(ic_irq_enable, VA_IC_BASE + IRQ_ENABLE_SET);
return 0;
} }
#else #else
#define irq_suspend NULL #define irq_suspend NULL
#define irq_resume NULL #define irq_resume NULL
#endif #endif
static struct sysdev_class irq_class = { static struct syscore_ops irq_syscore_ops = {
.name = "irq",
.suspend = irq_suspend, .suspend = irq_suspend,
.resume = irq_resume, .resume = irq_resume,
}; };
static struct sys_device irq_device = { static int __init irq_syscore_init(void)
.id = 0,
.cls = &irq_class,
};
static int __init irq_init_sysfs(void)
{ {
int ret = sysdev_class_register(&irq_class); register_syscore_ops(&irq_syscore_ops);
if (ret == 0)
ret = sysdev_register(&irq_device); return 0;
return ret;
} }
device_initcall(irq_init_sysfs); device_initcall(irq_syscore_init);
/* /*
* Flash handling. * Flash handling.

View File

@ -24,75 +24,50 @@
#ifdef CONFIG_PM_RUNTIME #ifdef CONFIG_PM_RUNTIME
static int omap1_pm_runtime_suspend(struct device *dev) static int omap1_pm_runtime_suspend(struct device *dev)
{ {
struct clk *iclk, *fclk; int ret;
int ret = 0;
dev_dbg(dev, "%s\n", __func__); dev_dbg(dev, "%s\n", __func__);
ret = pm_generic_runtime_suspend(dev); ret = pm_generic_runtime_suspend(dev);
if (ret)
return ret;
fclk = clk_get(dev, "fck"); ret = pm_runtime_clk_suspend(dev);
if (!IS_ERR(fclk)) { if (ret) {
clk_disable(fclk); pm_generic_runtime_resume(dev);
clk_put(fclk); return ret;
}
iclk = clk_get(dev, "ick");
if (!IS_ERR(iclk)) {
clk_disable(iclk);
clk_put(iclk);
} }
return 0; return 0;
}; }
static int omap1_pm_runtime_resume(struct device *dev) static int omap1_pm_runtime_resume(struct device *dev)
{ {
struct clk *iclk, *fclk;
dev_dbg(dev, "%s\n", __func__); dev_dbg(dev, "%s\n", __func__);
iclk = clk_get(dev, "ick"); pm_runtime_clk_resume(dev);
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);
}
return pm_generic_runtime_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) 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()) if (!cpu_class_is_omap1())
return -ENODEV; return -ENODEV;
pm = platform_bus_get_pm_ops(); pm_runtime_clk_add_notifier(&platform_bus_type, &platform_bus_notifier);
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);
return 0; return 0;
} }

View File

@ -59,10 +59,10 @@ endif
# Power Management # Power Management
ifeq ($(CONFIG_PM),y) ifeq ($(CONFIG_PM),y)
obj-$(CONFIG_ARCH_OMAP2) += pm24xx.o 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 \ obj-$(CONFIG_ARCH_OMAP3) += pm34xx.o sleep34xx.o \
cpuidle34xx.o pm_bus.o cpuidle34xx.o
obj-$(CONFIG_ARCH_OMAP4) += pm44xx.o pm_bus.o obj-$(CONFIG_ARCH_OMAP4) += pm44xx.o
obj-$(CONFIG_PM_DEBUG) += pm-debug.o obj-$(CONFIG_PM_DEBUG) += pm-debug.o
obj-$(CONFIG_OMAP_SMARTREFLEX) += sr_device.o smartreflex.o obj-$(CONFIG_OMAP_SMARTREFLEX) += sr_device.o smartreflex.o
obj-$(CONFIG_OMAP_SMARTREFLEX_CLASS3) += smartreflex-class3.o obj-$(CONFIG_OMAP_SMARTREFLEX_CLASS3) += smartreflex-class3.o

View File

@ -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);

View File

@ -15,7 +15,6 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/sysdev.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/bitops.h> #include <linux/bitops.h>

View File

@ -9,7 +9,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/sysdev.h> #include <linux/syscore_ops.h>
#include <mach/pxa2xx-regs.h> #include <mach/pxa2xx-regs.h>
@ -33,32 +33,22 @@ const struct clkops clk_pxa2xx_cken_ops = {
#ifdef CONFIG_PM #ifdef CONFIG_PM
static uint32_t saved_cken; 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; saved_cken = CKEN;
return 0; return 0;
} }
static int pxa2xx_clock_resume(struct sys_device *d) static void pxa2xx_clock_resume(void)
{ {
CKEN = saved_cken; CKEN = saved_cken;
return 0;
} }
#else #else
#define pxa2xx_clock_suspend NULL #define pxa2xx_clock_suspend NULL
#define pxa2xx_clock_resume NULL #define pxa2xx_clock_resume NULL
#endif #endif
struct sysdev_class pxa2xx_clock_sysclass = { struct syscore_ops pxa2xx_clock_syscore_ops = {
.name = "pxa2xx-clock",
.suspend = pxa2xx_clock_suspend, .suspend = pxa2xx_clock_suspend,
.resume = pxa2xx_clock_resume, .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);

View File

@ -10,6 +10,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/syscore_ops.h>
#include <mach/smemc.h> #include <mach/smemc.h>
#include <mach/pxa3xx-regs.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 cken[2];
static uint32_t accr; 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[0] = CKENA;
cken[1] = CKENB; cken[1] = CKENB;
@ -190,28 +191,18 @@ static int pxa3xx_clock_suspend(struct sys_device *d, pm_message_t state)
return 0; return 0;
} }
static int pxa3xx_clock_resume(struct sys_device *d) static void pxa3xx_clock_resume(void)
{ {
ACCR = accr; ACCR = accr;
CKENA = cken[0]; CKENA = cken[0];
CKENB = cken[1]; CKENB = cken[1];
return 0;
} }
#else #else
#define pxa3xx_clock_suspend NULL #define pxa3xx_clock_suspend NULL
#define pxa3xx_clock_resume NULL #define pxa3xx_clock_resume NULL
#endif #endif
struct sysdev_class pxa3xx_clock_sysclass = { struct syscore_ops pxa3xx_clock_syscore_ops = {
.name = "pxa3xx-clock",
.suspend = pxa3xx_clock_suspend, .suspend = pxa3xx_clock_suspend,
.resume = pxa3xx_clock_resume, .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);

View File

@ -1,5 +1,5 @@
#include <linux/clkdev.h> #include <linux/clkdev.h>
#include <linux/sysdev.h> #include <linux/syscore_ops.h>
struct clkops { struct clkops {
void (*enable)(struct clk *); 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_enable(struct clk *clk);
void clk_pxa2xx_cken_disable(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) #if defined(CONFIG_PXA3xx) || defined(CONFIG_PXA95x)
#define DEFINE_PXA3_CKEN(_name, _cken, _rate, _delay) \ #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_enable(struct clk *);
extern void clk_pxa3xx_cken_disable(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 #endif

View File

@ -10,7 +10,6 @@
*/ */
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/sysdev.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/delay.h> #include <linux/delay.h>

View File

@ -10,7 +10,7 @@
*/ */
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/sysdev.h> #include <linux/syscore_ops.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/gpio.h> #include <linux/gpio.h>
@ -388,7 +388,7 @@ static inline void cmx2xx_init_display(void) {}
#ifdef CONFIG_PM #ifdef CONFIG_PM
static unsigned long sleep_save_msc[10]; 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(); cmx2xx_pci_suspend();
@ -412,7 +412,7 @@ static int cmx2xx_suspend(struct sys_device *dev, pm_message_t state)
return 0; return 0;
} }
static int cmx2xx_resume(struct sys_device *dev) static void cmx2xx_resume(void)
{ {
cmx2xx_pci_resume(); 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[0], MSC0);
__raw_writel(sleep_save_msc[1], MSC1); __raw_writel(sleep_save_msc[1], MSC1);
__raw_writel(sleep_save_msc[2], MSC2); __raw_writel(sleep_save_msc[2], MSC2);
return 0;
} }
static struct sysdev_class cmx2xx_pm_sysclass = { static struct syscore_ops cmx2xx_pm_syscore_ops = {
.name = "pm",
.resume = cmx2xx_resume, .resume = cmx2xx_resume,
.suspend = cmx2xx_suspend, .suspend = cmx2xx_suspend,
}; };
static struct sys_device cmx2xx_pm_device = {
.cls = &cmx2xx_pm_sysclass,
};
static int __init cmx2xx_pm_init(void) static int __init cmx2xx_pm_init(void)
{ {
int error; register_syscore_ops(&cmx2xx_pm_syscore_ops);
error = sysdev_class_register(&cmx2xx_pm_sysclass);
if (error == 0) return 0;
error = sysdev_register(&cmx2xx_pm_device);
return error;
} }
#else #else
static int __init cmx2xx_pm_init(void) { return 0; } static int __init cmx2xx_pm_init(void) { return 0; }

View File

@ -13,7 +13,6 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/sysdev.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>

View File

@ -22,7 +22,6 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/pwm_backlight.h> #include <linux/pwm_backlight.h>
#include <linux/i2c/pxa-i2c.h> #include <linux/i2c/pxa-i2c.h>
#include <linux/sysdev.h>
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>

View File

@ -17,7 +17,6 @@
#include <linux/mtd/partitions.h> #include <linux/mtd/partitions.h>
#include <linux/mtd/physmap.h> #include <linux/mtd/physmap.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/sysdev.h>
#include <linux/ucb1400.h> #include <linux/ucb1400.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>

View File

@ -61,10 +61,10 @@ extern unsigned pxa3xx_get_clk_frequency_khz(int);
#define pxa3xx_get_clk_frequency_khz(x) (0) #define pxa3xx_get_clk_frequency_khz(x) (0)
#endif #endif
extern struct sysdev_class pxa_irq_sysclass; extern struct syscore_ops pxa_irq_syscore_ops;
extern struct sysdev_class pxa_gpio_sysclass; extern struct syscore_ops pxa_gpio_syscore_ops;
extern struct sysdev_class pxa2xx_mfp_sysclass; extern struct syscore_ops pxa2xx_mfp_syscore_ops;
extern struct sysdev_class pxa3xx_mfp_sysclass; extern struct syscore_ops pxa3xx_mfp_syscore_ops;
void __init pxa_set_ffuart_info(void *info); void __init pxa_set_ffuart_info(void *info);
void __init pxa_set_btuart_info(void *info); void __init pxa_set_btuart_info(void *info);

View File

@ -15,7 +15,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/sysdev.h> #include <linux/syscore_ops.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/irq.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_icmr[MAX_INTERNAL_IRQS/32];
static unsigned long saved_ipr[MAX_INTERNAL_IRQS]; 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; int i;
@ -202,7 +202,7 @@ static int pxa_irq_suspend(struct sys_device *dev, pm_message_t state)
return 0; return 0;
} }
static int pxa_irq_resume(struct sys_device *dev) static void pxa_irq_resume(void)
{ {
int i; 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(saved_ipr[i], IRQ_BASE + IPR(i));
__raw_writel(1, IRQ_BASE + ICCR); __raw_writel(1, IRQ_BASE + ICCR);
return 0;
} }
#else #else
#define pxa_irq_suspend NULL #define pxa_irq_suspend NULL
#define pxa_irq_resume NULL #define pxa_irq_resume NULL
#endif #endif
struct sysdev_class pxa_irq_sysclass = { struct syscore_ops pxa_irq_syscore_ops = {
.name = "irq",
.suspend = pxa_irq_suspend, .suspend = pxa_irq_suspend,
.resume = pxa_irq_resume, .resume = pxa_irq_resume,
}; };
static int __init pxa_irq_init(void)
{
return sysdev_class_register(&pxa_irq_sysclass);
}
core_initcall(pxa_irq_init);

View File

@ -15,7 +15,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/sysdev.h> #include <linux/syscore_ops.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/bitops.h> #include <linux/bitops.h>
@ -159,30 +159,22 @@ static void __init lpd270_init_irq(void)
#ifdef CONFIG_PM #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); __raw_writew(lpd270_irq_enabled, LPD270_INT_MASK);
return 0;
} }
static struct sysdev_class lpd270_irq_sysclass = { static struct syscore_ops lpd270_irq_syscore_ops = {
.name = "cpld_irq",
.resume = lpd270_irq_resume, .resume = lpd270_irq_resume,
}; };
static struct sys_device lpd270_irq_device = {
.cls = &lpd270_irq_sysclass,
};
static int __init lpd270_irq_device_init(void) static int __init lpd270_irq_device_init(void)
{ {
int ret = -ENODEV;
if (machine_is_logicpd_pxa270()) { if (machine_is_logicpd_pxa270()) {
ret = sysdev_class_register(&lpd270_irq_sysclass); register_syscore_ops(&lpd270_irq_syscore_ops);
if (ret == 0) return 0;
ret = sysdev_register(&lpd270_irq_device);
} }
return ret; return -ENODEV;
} }
device_initcall(lpd270_irq_device_init); device_initcall(lpd270_irq_device_init);

View File

@ -15,7 +15,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/sysdev.h> #include <linux/syscore_ops.h>
#include <linux/major.h> #include <linux/major.h>
#include <linux/fb.h> #include <linux/fb.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
@ -176,31 +176,22 @@ static void __init lubbock_init_irq(void)
#ifdef CONFIG_PM #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; LUB_IRQ_MASK_EN = lubbock_irq_enabled;
return 0;
} }
static struct sysdev_class lubbock_irq_sysclass = { static struct syscore_ops lubbock_irq_syscore_ops = {
.name = "cpld_irq",
.resume = lubbock_irq_resume, .resume = lubbock_irq_resume,
}; };
static struct sys_device lubbock_irq_device = {
.cls = &lubbock_irq_sysclass,
};
static int __init lubbock_irq_device_init(void) static int __init lubbock_irq_device_init(void)
{ {
int ret = -ENODEV;
if (machine_is_lubbock()) { if (machine_is_lubbock()) {
ret = sysdev_class_register(&lubbock_irq_sysclass); register_syscore_ops(&lubbock_irq_syscore_ops);
if (ret == 0) return 0;
ret = sysdev_register(&lubbock_irq_device);
} }
return ret; return -ENODEV;
} }
device_initcall(lubbock_irq_device_init); device_initcall(lubbock_irq_device_init);

View File

@ -15,7 +15,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/sysdev.h> #include <linux/syscore_ops.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/bitops.h> #include <linux/bitops.h>
@ -185,31 +185,21 @@ static void __init mainstone_init_irq(void)
#ifdef CONFIG_PM #ifdef CONFIG_PM
static int mainstone_irq_resume(struct sys_device *dev) static void mainstone_irq_resume(void)
{ {
MST_INTMSKENA = mainstone_irq_enabled; MST_INTMSKENA = mainstone_irq_enabled;
return 0;
} }
static struct sysdev_class mainstone_irq_sysclass = { static struct syscore_ops mainstone_irq_syscore_ops = {
.name = "cpld_irq",
.resume = mainstone_irq_resume, .resume = mainstone_irq_resume,
}; };
static struct sys_device mainstone_irq_device = {
.cls = &mainstone_irq_sysclass,
};
static int __init mainstone_irq_device_init(void) 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()) { return 0;
ret = sysdev_class_register(&mainstone_irq_sysclass);
if (ret == 0)
ret = sysdev_register(&mainstone_irq_device);
}
return ret;
} }
device_initcall(mainstone_irq_device_init); device_initcall(mainstone_irq_device_init);

View File

@ -16,7 +16,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/sysdev.h> #include <linux/syscore_ops.h>
#include <mach/gpio.h> #include <mach/gpio.h>
#include <mach/pxa2xx-regs.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_gpdr[4];
static unsigned long saved_pgsr[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; int i;
@ -365,7 +365,7 @@ static int pxa2xx_mfp_suspend(struct sys_device *d, pm_message_t state)
return 0; return 0;
} }
static int pxa2xx_mfp_resume(struct sys_device *d) static void pxa2xx_mfp_resume(void)
{ {
int i; int i;
@ -376,15 +376,13 @@ static int pxa2xx_mfp_resume(struct sys_device *d)
PGSR(i) = saved_pgsr[i]; PGSR(i) = saved_pgsr[i];
} }
PSSR = PSSR_RDH | PSSR_PH; PSSR = PSSR_RDH | PSSR_PH;
return 0;
} }
#else #else
#define pxa2xx_mfp_suspend NULL #define pxa2xx_mfp_suspend NULL
#define pxa2xx_mfp_resume NULL #define pxa2xx_mfp_resume NULL
#endif #endif
struct sysdev_class pxa2xx_mfp_sysclass = { struct syscore_ops pxa2xx_mfp_syscore_ops = {
.name = "mfp",
.suspend = pxa2xx_mfp_suspend, .suspend = pxa2xx_mfp_suspend,
.resume = pxa2xx_mfp_resume, .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++) for (i = 0; i <= gpio_to_bank(pxa_last_gpio); i++)
gpdr_lpm[i] = GPDR(i * 32); gpdr_lpm[i] = GPDR(i * 32);
return sysdev_class_register(&pxa2xx_mfp_sysclass); return 0;
} }
postcore_initcall(pxa2xx_mfp_init); postcore_initcall(pxa2xx_mfp_init);

View File

@ -17,7 +17,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/sysdev.h> #include <linux/syscore_ops.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <mach/mfp-pxa3xx.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 * a pull-down mode if they're an active low chip select, and we're
* just entering standby. * 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(); mfp_config_lpm();
return 0; return 0;
} }
static int pxa3xx_mfp_resume(struct sys_device *d) static void pxa3xx_mfp_resume(void)
{ {
mfp_config_run(); 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 * preserve them here in case they will be referenced later
*/ */
ASCR &= ~(ASCR_RDH | ASCR_D1S | ASCR_D2S | ASCR_D3S); ASCR &= ~(ASCR_RDH | ASCR_D1S | ASCR_D2S | ASCR_D3S);
return 0;
} }
#else #else
#define pxa3xx_mfp_suspend NULL #define pxa3xx_mfp_suspend NULL
#define pxa3xx_mfp_resume NULL #define pxa3xx_mfp_resume NULL
#endif #endif
struct sysdev_class pxa3xx_mfp_sysclass = { struct syscore_ops pxa3xx_mfp_syscore_ops = {
.name = "mfp",
.suspend = pxa3xx_mfp_suspend, .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);

View File

@ -22,7 +22,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/sysdev.h> #include <linux/syscore_ops.h>
#include <linux/input.h> #include <linux/input.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/gpio_keys.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; int i = 0, is_bt_on;
u32 *mem_resume_vector = phys_to_virt(RESUME_VECTOR_ADDR); 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; return 0;
} }
static int mioa701_sys_resume(struct sys_device *sysdev) static void mioa701_sys_resume(void)
{ {
int i = 0; int i = 0;
u32 *mem_resume_vector = phys_to_virt(RESUME_VECTOR_ADDR); 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_enabler = save_buffer[i++];
*mem_resume_bt = save_buffer[i++]; *mem_resume_bt = save_buffer[i++];
*mem_resume_unknown = save_buffer[i++]; *mem_resume_unknown = save_buffer[i++];
return 0;
} }
static struct sysdev_class mioa701_sysclass = { static struct syscore_ops mioa701_syscore_ops = {
.name = "mioa701", .suspend = mioa701_sys_suspend,
}; .resume = mioa701_sys_resume,
static struct sys_device sysdev_bootstrap = {
.cls = &mioa701_sysclass,
};
static struct sysdev_driver driver_bootstrap = {
.suspend = &mioa701_sys_suspend,
.resume = &mioa701_sys_resume,
}; };
static int __init bootstrap_init(void) static int __init bootstrap_init(void)
{ {
int rc;
int save_size = mioa701_bootstrap_lg + (sizeof(u32) * 3); int save_size = mioa701_bootstrap_lg + (sizeof(u32) * 3);
rc = sysdev_class_register(&mioa701_sysclass); register_syscore_ops(&mioa701_syscore_ops);
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;
}
save_buffer = kmalloc(save_size, GFP_KERNEL); save_buffer = kmalloc(save_size, GFP_KERNEL);
if (!save_buffer) if (!save_buffer)
@ -576,9 +551,7 @@ static int __init bootstrap_init(void)
static void bootstrap_exit(void) static void bootstrap_exit(void)
{ {
kfree(save_buffer); kfree(save_buffer);
sysdev_driver_unregister(&mioa701_sysclass, &driver_bootstrap); unregister_syscore_ops(&mioa701_syscore_ops);
sysdev_unregister(&sysdev_bootstrap);
sysdev_class_unregister(&mioa701_sysclass);
printk(KERN_CRIT "Unregistering mioa701 suspend will hang next" printk(KERN_CRIT "Unregistering mioa701 suspend will hang next"
"resume !!!\n"); "resume !!!\n");

View File

@ -24,7 +24,6 @@
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/wm97xx.h> #include <linux/wm97xx.h>
#include <linux/power_supply.h> #include <linux/power_supply.h>
#include <linux/sysdev.h>
#include <linux/mtd/mtd.h> #include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h> #include <linux/mtd/partitions.h>
#include <linux/mtd/physmap.h> #include <linux/mtd/physmap.h>

View File

@ -25,7 +25,6 @@
#include <linux/pwm_backlight.h> #include <linux/pwm_backlight.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/power_supply.h> #include <linux/power_supply.h>
#include <linux/sysdev.h>
#include <linux/w1-gpio.h> #include <linux/w1-gpio.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>

View File

@ -19,7 +19,7 @@
*/ */
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/sysdev.h> #include <linux/syscore_ops.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/gpio_keys.h> #include <linux/gpio_keys.h>
@ -233,9 +233,9 @@ static struct palmz72_resume_info palmz72_resume_info = {
static unsigned long store_ptr; 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 */ /* setup the resume_info struct for the original bootloader */
palmz72_resume_info.resume_addr = (u32) cpu_resume; 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; return 0;
} }
static int palmz72_pm_resume(struct sys_device *dev) static void palmz72_pm_resume(void)
{ {
*PALMZ72_SAVE_DWORD = store_ptr; *PALMZ72_SAVE_DWORD = store_ptr;
return 0;
} }
static struct sysdev_class palmz72_pm_sysclass = { static struct syscore_ops palmz72_pm_syscore_ops = {
.name = "palmz72_pm",
.suspend = palmz72_pm_suspend, .suspend = palmz72_pm_suspend,
.resume = palmz72_pm_resume, .resume = palmz72_pm_resume,
}; };
static struct sys_device palmz72_pm_device = {
.cls = &palmz72_pm_sysclass,
};
static int __init palmz72_pm_init(void) static int __init palmz72_pm_init(void)
{ {
int ret = -ENODEV;
if (machine_is_palmz72()) { if (machine_is_palmz72()) {
ret = sysdev_class_register(&palmz72_pm_sysclass); register_syscore_ops(&palmz72_pm_syscore_ops);
if (ret == 0) return 0;
ret = sysdev_register(&palmz72_pm_device);
} }
return ret; return -ENODEV;
} }
device_initcall(palmz72_pm_init); device_initcall(palmz72_pm_init);

View File

@ -21,7 +21,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/suspend.h> #include <linux/suspend.h>
#include <linux/sysdev.h> #include <linux/syscore_ops.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <asm/mach/map.h> #include <asm/mach/map.h>
@ -350,21 +350,9 @@ static struct platform_device *pxa25x_devices[] __initdata = {
&pxa_device_asoc_platform, &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) static int __init pxa25x_init(void)
{ {
int i, ret = 0; int ret = 0;
if (cpu_is_pxa25x()) { if (cpu_is_pxa25x()) {
@ -377,11 +365,10 @@ static int __init pxa25x_init(void)
pxa25x_init_pm(); pxa25x_init_pm();
for (i = 0; i < ARRAY_SIZE(pxa25x_sysdev); i++) { register_syscore_ops(&pxa_irq_syscore_ops);
ret = sysdev_register(&pxa25x_sysdev[i]); register_syscore_ops(&pxa2xx_mfp_syscore_ops);
if (ret) register_syscore_ops(&pxa_gpio_syscore_ops);
pr_err("failed to register sysdev[%d]\n", i); register_syscore_ops(&pxa2xx_clock_syscore_ops);
}
ret = platform_add_devices(pxa25x_devices, ret = platform_add_devices(pxa25x_devices,
ARRAY_SIZE(pxa25x_devices)); ARRAY_SIZE(pxa25x_devices));

View File

@ -16,7 +16,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/suspend.h> #include <linux/suspend.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/sysdev.h> #include <linux/syscore_ops.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/i2c/pxa-i2c.h> #include <linux/i2c/pxa-i2c.h>
@ -428,21 +428,9 @@ static struct platform_device *devices[] __initdata = {
&pxa27x_device_pwm1, &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) static int __init pxa27x_init(void)
{ {
int i, ret = 0; int ret = 0;
if (cpu_is_pxa27x()) { if (cpu_is_pxa27x()) {
@ -455,11 +443,10 @@ static int __init pxa27x_init(void)
pxa27x_init_pm(); pxa27x_init_pm();
for (i = 0; i < ARRAY_SIZE(pxa27x_sysdev); i++) { register_syscore_ops(&pxa_irq_syscore_ops);
ret = sysdev_register(&pxa27x_sysdev[i]); register_syscore_ops(&pxa2xx_mfp_syscore_ops);
if (ret) register_syscore_ops(&pxa_gpio_syscore_ops);
pr_err("failed to register sysdev[%d]\n", i); register_syscore_ops(&pxa2xx_clock_syscore_ops);
}
ret = platform_add_devices(devices, ARRAY_SIZE(devices)); ret = platform_add_devices(devices, ARRAY_SIZE(devices));
} }

View File

@ -20,7 +20,7 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/sysdev.h> #include <linux/syscore_ops.h>
#include <linux/i2c/pxa-i2c.h> #include <linux/i2c/pxa-i2c.h>
#include <asm/mach/map.h> #include <asm/mach/map.h>
@ -427,21 +427,9 @@ static struct platform_device *devices[] __initdata = {
&pxa27x_device_pwm1, &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) static int __init pxa3xx_init(void)
{ {
int i, ret = 0; int ret = 0;
if (cpu_is_pxa3xx()) { if (cpu_is_pxa3xx()) {
@ -462,11 +450,10 @@ static int __init pxa3xx_init(void)
pxa3xx_init_pm(); pxa3xx_init_pm();
for (i = 0; i < ARRAY_SIZE(pxa3xx_sysdev); i++) { register_syscore_ops(&pxa_irq_syscore_ops);
ret = sysdev_register(&pxa3xx_sysdev[i]); register_syscore_ops(&pxa3xx_mfp_syscore_ops);
if (ret) register_syscore_ops(&pxa_gpio_syscore_ops);
pr_err("failed to register sysdev[%d]\n", i); register_syscore_ops(&pxa3xx_clock_syscore_ops);
}
ret = platform_add_devices(devices, ARRAY_SIZE(devices)); ret = platform_add_devices(devices, ARRAY_SIZE(devices));
} }

View File

@ -18,7 +18,7 @@
#include <linux/i2c/pxa-i2c.h> #include <linux/i2c/pxa-i2c.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/sysdev.h> #include <linux/syscore_ops.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <mach/gpio.h> #include <mach/gpio.h>
@ -260,16 +260,6 @@ static struct platform_device *devices[] __initdata = {
&pxa27x_device_pwm1, &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) static int __init pxa95x_init(void)
{ {
int ret = 0, i; int ret = 0, i;
@ -293,11 +283,9 @@ static int __init pxa95x_init(void)
if ((ret = pxa_init_dma(IRQ_DMA, 32))) if ((ret = pxa_init_dma(IRQ_DMA, 32)))
return ret; return ret;
for (i = 0; i < ARRAY_SIZE(pxa95x_sysdev); i++) { register_syscore_ops(&pxa_irq_syscore_ops);
ret = sysdev_register(&pxa95x_sysdev[i]); register_syscore_ops(&pxa_gpio_syscore_ops);
if (ret) register_syscore_ops(&pxa3xx_clock_syscore_ops);
pr_err("failed to register sysdev[%d]\n", i);
}
ret = platform_add_devices(devices, ARRAY_SIZE(devices)); ret = platform_add_devices(devices, ARRAY_SIZE(devices));
} }

View File

@ -18,7 +18,6 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sysdev.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/gpio.h> #include <linux/gpio.h>

View File

@ -6,7 +6,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/sysdev.h> #include <linux/syscore_ops.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <mach/smemc.h> #include <mach/smemc.h>
@ -16,7 +16,7 @@ static unsigned long msc[2];
static unsigned long sxcnfg, memclkcfg; static unsigned long sxcnfg, memclkcfg;
static unsigned long csadrcfg[4]; 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[0] = __raw_readl(MSC0);
msc[1] = __raw_readl(MSC1); msc[1] = __raw_readl(MSC1);
@ -30,7 +30,7 @@ static int pxa3xx_smemc_suspend(struct sys_device *dev, pm_message_t state)
return 0; 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[0], MSC0);
__raw_writel(msc[1], MSC1); __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[1], CSADRCFG1);
__raw_writel(csadrcfg[2], CSADRCFG2); __raw_writel(csadrcfg[2], CSADRCFG2);
__raw_writel(csadrcfg[3], CSADRCFG3); __raw_writel(csadrcfg[3], CSADRCFG3);
return 0;
} }
static struct sysdev_class smemc_sysclass = { static struct syscore_ops smemc_syscore_ops = {
.name = "smemc",
.suspend = pxa3xx_smemc_suspend, .suspend = pxa3xx_smemc_suspend,
.resume = pxa3xx_smemc_resume, .resume = pxa3xx_smemc_resume,
}; };
static struct sys_device smemc_sysdev = {
.id = 0,
.cls = &smemc_sysclass,
};
static int __init smemc_init(void) static int __init smemc_init(void)
{ {
int ret = 0; if (cpu_is_pxa3xx())
register_syscore_ops(&smemc_syscore_ops);
if (cpu_is_pxa3xx()) { return 0;
ret = sysdev_class_register(&smemc_sysclass);
if (ret)
return ret;
ret = sysdev_register(&smemc_sysdev);
}
return ret;
} }
subsys_initcall(smemc_init); subsys_initcall(smemc_init);
#endif #endif

View File

@ -15,7 +15,6 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/sysdev.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/bitops.h> #include <linux/bitops.h>

View File

@ -44,6 +44,7 @@
#include <linux/mtd/mtd.h> #include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h> #include <linux/mtd/partitions.h>
#include <linux/mtd/physmap.h> #include <linux/mtd/physmap.h>
#include <linux/syscore_ops.h>
#include <mach/pxa25x.h> #include <mach/pxa25x.h>
#include <mach/audio.h> #include <mach/audio.h>
@ -130,20 +131,19 @@ static u8 viper_hw_version(void)
return v1; return v1;
} }
/* CPU sysdev */ /* CPU system core operations. */
static int viper_cpu_suspend(struct sys_device *sysdev, pm_message_t state) static int viper_cpu_suspend(void)
{ {
viper_icr_set_bit(VIPER_ICR_R_DIS); viper_icr_set_bit(VIPER_ICR_R_DIS);
return 0; 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); 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, .suspend = viper_cpu_suspend,
.resume = viper_cpu_resume, .resume = viper_cpu_resume,
}; };
@ -945,7 +945,7 @@ static void __init viper_init(void)
viper_init_vcore_gpios(); viper_init_vcore_gpios();
viper_init_cpufreq(); viper_init_cpufreq();
sysdev_driver_register(&cpu_sysdev_class, &viper_cpu_sysdev_driver); register_syscore_ops(&viper_cpu_syscore_ops);
if (version) { if (version) {
pr_info("viper: hardware v%di%d detected. " pr_info("viper: hardware v%di%d detected. "

View File

@ -16,7 +16,6 @@
#include <linux/gpio_keys.h> #include <linux/gpio_keys.h>
#include <linux/input.h> #include <linux/input.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/sysdev.h>
#include <linux/usb/gpio_vbus.h> #include <linux/usb/gpio_vbus.h>
#include <linux/mtd/mtd.h> #include <linux/mtd/mtd.h>
#include <linux/mtd/partitions.h> #include <linux/mtd/partitions.h>

View File

@ -23,38 +23,12 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/sysdev.h> #include <linux/syscore_ops.h>
#include <plat/cpu.h> #include <plat/cpu.h>
#include <plat/pm.h> #include <plat/pm.h>
static int s3c2410_irq_add(struct sys_device *sysdev) struct syscore_ops s3c24xx_irq_syscore_ops = {
{
return 0;
}
static struct sysdev_driver s3c2410_irq_driver = {
.add = s3c2410_irq_add,
.suspend = s3c24xx_irq_suspend, .suspend = s3c24xx_irq_suspend,
.resume = s3c24xx_irq_resume, .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);

View File

@ -17,7 +17,7 @@
#include <linux/timer.h> #include <linux/timer.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/sysdev.h> #include <linux/syscore_ops.h>
#include <linux/serial_core.h> #include <linux/serial_core.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/dm9000.h> #include <linux/dm9000.h>
@ -214,17 +214,16 @@ static struct s3c2410_uartcfg bast_uartcfgs[] __initdata = {
/* NAND Flash on BAST board */ /* NAND Flash on BAST board */
#ifdef CONFIG_PM #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. */ /* ensure that an nRESET is not generated on resume. */
gpio_direction_output(S3C2410_GPA(21), 1); gpio_direction_output(S3C2410_GPA(21), 1);
return 0; 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); s3c_gpio_cfgpin(S3C2410_GPA(21), S3C2410_GPA21_nRSTOUT);
return 0;
} }
#else #else
@ -232,16 +231,11 @@ static int bast_pm_resume(struct sys_device *sd)
#define bast_pm_resume NULL #define bast_pm_resume NULL
#endif #endif
static struct sysdev_class bast_pm_sysclass = { static struct syscore_ops bast_pm_syscore_ops = {
.name = "mach-bast",
.suspend = bast_pm_suspend, .suspend = bast_pm_suspend,
.resume = bast_pm_resume, .resume = bast_pm_resume,
}; };
static struct sys_device bast_pm_sysdev = {
.cls = &bast_pm_sysclass,
};
static int smartmedia_map[] = { 0 }; static int smartmedia_map[] = { 0 };
static int chip0_map[] = { 1 }; static int chip0_map[] = { 1 };
static int chip1_map[] = { 2 }; static int chip1_map[] = { 2 };
@ -642,8 +636,7 @@ static void __init bast_map_io(void)
static void __init bast_init(void) static void __init bast_init(void)
{ {
sysdev_class_register(&bast_pm_sysclass); register_syscore_ops(&bast_pm_syscore_ops);
sysdev_register(&bast_pm_sysdev);
s3c_i2c0_set_platdata(&bast_i2c_info); s3c_i2c0_set_platdata(&bast_i2c_info);
s3c_nand_set_platdata(&bast_nand_info); s3c_nand_set_platdata(&bast_nand_info);

View File

@ -25,6 +25,7 @@
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/time.h> #include <linux/time.h>
#include <linux/sysdev.h> #include <linux/sysdev.h>
#include <linux/syscore_ops.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/io.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; unsigned long tmp;
@ -104,10 +105,12 @@ static int s3c2410_pm_resume(struct sys_device *dev)
if ( machine_is_aml_m5900() ) if ( machine_is_aml_m5900() )
s3c2410_gpio_setpin(S3C2410_GPF(2), 0); 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) static int s3c2410_pm_add(struct sys_device *dev)
{ {
pm_cpu_prep = s3c2410_pm_prepare; pm_cpu_prep = s3c2410_pm_prepare;
@ -119,7 +122,6 @@ static int s3c2410_pm_add(struct sys_device *dev)
#if defined(CONFIG_CPU_S3C2410) #if defined(CONFIG_CPU_S3C2410)
static struct sysdev_driver s3c2410_pm_driver = { static struct sysdev_driver s3c2410_pm_driver = {
.add = s3c2410_pm_add, .add = s3c2410_pm_add,
.resume = s3c2410_pm_resume,
}; };
/* register ourselves */ /* register ourselves */
@ -133,7 +135,6 @@ arch_initcall(s3c2410_pm_drvinit);
static struct sysdev_driver s3c2410a_pm_driver = { static struct sysdev_driver s3c2410a_pm_driver = {
.add = s3c2410_pm_add, .add = s3c2410_pm_add,
.resume = s3c2410_pm_resume,
}; };
static int __init s3c2410a_pm_drvinit(void) static int __init s3c2410a_pm_drvinit(void)
@ -147,7 +148,6 @@ arch_initcall(s3c2410a_pm_drvinit);
#if defined(CONFIG_CPU_S3C2440) #if defined(CONFIG_CPU_S3C2440)
static struct sysdev_driver s3c2440_pm_driver = { static struct sysdev_driver s3c2440_pm_driver = {
.add = s3c2410_pm_add, .add = s3c2410_pm_add,
.resume = s3c2410_pm_resume,
}; };
static int __init s3c2440_pm_drvinit(void) static int __init s3c2440_pm_drvinit(void)
@ -161,7 +161,6 @@ arch_initcall(s3c2440_pm_drvinit);
#if defined(CONFIG_CPU_S3C2442) #if defined(CONFIG_CPU_S3C2442)
static struct sysdev_driver s3c2442_pm_driver = { static struct sysdev_driver s3c2442_pm_driver = {
.add = s3c2410_pm_add, .add = s3c2410_pm_add,
.resume = s3c2410_pm_resume,
}; };
static int __init s3c2442_pm_drvinit(void) static int __init s3c2442_pm_drvinit(void)

View File

@ -19,6 +19,7 @@
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/sysdev.h> #include <linux/sysdev.h>
#include <linux/syscore_ops.h>
#include <linux/serial_core.h> #include <linux/serial_core.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/io.h> #include <linux/io.h>
@ -40,6 +41,7 @@
#include <plat/devs.h> #include <plat/devs.h>
#include <plat/clock.h> #include <plat/clock.h>
#include <plat/pll.h> #include <plat/pll.h>
#include <plat/pm.h>
#include <plat/gpio-core.h> #include <plat/gpio-core.h>
#include <plat/gpio-cfg.h> #include <plat/gpio-cfg.h>
@ -168,6 +170,9 @@ int __init s3c2410_init(void)
{ {
printk("S3C2410: Initialising architecture\n"); printk("S3C2410: Initialising architecture\n");
register_syscore_ops(&s3c2410_pm_syscore_ops);
register_syscore_ops(&s3c24xx_irq_syscore_ops);
return sysdev_register(&s3c2410_sysdev); return sysdev_register(&s3c2410_sysdev);
} }

View File

@ -202,8 +202,6 @@ static int s3c2412_irq_add(struct sys_device *sysdev)
static struct sysdev_driver s3c2412_irq_driver = { static struct sysdev_driver s3c2412_irq_driver = {
.add = s3c2412_irq_add, .add = s3c2412_irq_add,
.suspend = s3c24xx_irq_suspend,
.resume = s3c24xx_irq_resume,
}; };
static int s3c2412_irq_init(void) static int s3c2412_irq_init(void)

View File

@ -17,7 +17,7 @@
#include <linux/timer.h> #include <linux/timer.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/sysdev.h> #include <linux/syscore_ops.h>
#include <linux/serial_core.h> #include <linux/serial_core.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/i2c.h> #include <linux/i2c.h>
@ -486,7 +486,7 @@ static struct s3c2410_udc_mach_info jive_udc_cfg __initdata = {
/* Jive power management device */ /* Jive power management device */
#ifdef CONFIG_PM #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 /* Write the magic value u-boot uses to check for resume into
* the INFORM0 register, and ensure INFORM1 is set to the * 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; return 0;
} }
static int jive_pm_resume(struct sys_device *sd) static void jive_pm_resume(void)
{ {
__raw_writel(0x0, S3C2412_INFORM0); __raw_writel(0x0, S3C2412_INFORM0);
return 0;
} }
#else #else
@ -509,16 +508,11 @@ static int jive_pm_resume(struct sys_device *sd)
#define jive_pm_resume NULL #define jive_pm_resume NULL
#endif #endif
static struct sysdev_class jive_pm_sysclass = { static struct syscore_ops jive_pm_syscore_ops = {
.name = "jive-pm",
.suspend = jive_pm_suspend, .suspend = jive_pm_suspend,
.resume = jive_pm_resume, .resume = jive_pm_resume,
}; };
static struct sys_device jive_pm_sysdev = {
.cls = &jive_pm_sysclass,
};
static void __init jive_map_io(void) static void __init jive_map_io(void)
{ {
s3c24xx_init_io(jive_iodesc, ARRAY_SIZE(jive_iodesc)); 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) 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); register_syscore_ops(&jive_pm_syscore_ops);
sysdev_register(&jive_pm_sysdev);
/* write our sleep configurations for the IO. Pull down all unused /* write our sleep configurations for the IO. Pull down all unused
* IO, ensure that we have turned off all peripherals we do not * IO, ensure that we have turned off all peripherals we do not

View File

@ -17,6 +17,7 @@
#include <linux/timer.h> #include <linux/timer.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/sysdev.h> #include <linux/sysdev.h>
#include <linux/syscore_ops.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/io.h> #include <linux/io.h>
@ -86,13 +87,24 @@ static struct sleep_save s3c2412_sleep[] = {
SAVE_ITEM(S3C2413_GPJSLPCON), 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)); s3c_pm_do_save(s3c2412_sleep, ARRAY_SIZE(s3c2412_sleep));
return 0; return 0;
} }
static int s3c2412_pm_resume(struct sys_device *dev) static void s3c2412_pm_resume(void)
{ {
unsigned long tmp; unsigned long tmp;
@ -102,18 +114,9 @@ static int s3c2412_pm_resume(struct sys_device *dev)
__raw_writel(tmp, S3C2412_PWRCFG); __raw_writel(tmp, S3C2412_PWRCFG);
s3c_pm_do_restore(s3c2412_sleep, ARRAY_SIZE(s3c2412_sleep)); s3c_pm_do_restore(s3c2412_sleep, ARRAY_SIZE(s3c2412_sleep));
return 0;
} }
static struct sysdev_driver s3c2412_pm_driver = { struct syscore_ops s3c2412_pm_syscore_ops = {
.add = s3c2412_pm_add,
.suspend = s3c2412_pm_suspend, .suspend = s3c2412_pm_suspend,
.resume = s3c2412_pm_resume, .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);

View File

@ -19,6 +19,7 @@
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/sysdev.h> #include <linux/sysdev.h>
#include <linux/syscore_ops.h>
#include <linux/serial_core.h> #include <linux/serial_core.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/io.h> #include <linux/io.h>
@ -244,5 +245,8 @@ int __init s3c2412_init(void)
{ {
printk("S3C2412: Initialising architecture\n"); printk("S3C2412: Initialising architecture\n");
register_syscore_ops(&s3c2412_pm_syscore_ops);
register_syscore_ops(&s3c24xx_irq_syscore_ops);
return sysdev_register(&s3c2412_sysdev); return sysdev_register(&s3c2412_sysdev);
} }

View File

@ -236,8 +236,6 @@ static int __init s3c2416_irq_add(struct sys_device *sysdev)
static struct sysdev_driver s3c2416_irq_driver = { static struct sysdev_driver s3c2416_irq_driver = {
.add = s3c2416_irq_add, .add = s3c2416_irq_add,
.suspend = s3c24xx_irq_suspend,
.resume = s3c24xx_irq_resume,
}; };
static int __init s3c2416_irq_init(void) static int __init s3c2416_irq_init(void)

View File

@ -11,6 +11,7 @@
*/ */
#include <linux/sysdev.h> #include <linux/sysdev.h>
#include <linux/syscore_ops.h>
#include <linux/io.h> #include <linux/io.h>
#include <asm/cacheflush.h> #include <asm/cacheflush.h>
@ -55,25 +56,8 @@ static int s3c2416_pm_add(struct sys_device *sysdev)
return 0; 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 = { static struct sysdev_driver s3c2416_pm_driver = {
.add = s3c2416_pm_add, .add = s3c2416_pm_add,
.suspend = s3c2416_pm_suspend,
.resume = s3c2416_pm_resume,
}; };
static __init int s3c2416_pm_init(void) static __init int s3c2416_pm_init(void)
@ -82,3 +66,16 @@ static __init int s3c2416_pm_init(void)
} }
arch_initcall(s3c2416_pm_init); 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,
};

View File

@ -32,6 +32,7 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/serial_core.h> #include <linux/serial_core.h>
#include <linux/sysdev.h> #include <linux/sysdev.h>
#include <linux/syscore_ops.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/io.h> #include <linux/io.h>
@ -54,6 +55,7 @@
#include <plat/devs.h> #include <plat/devs.h>
#include <plat/cpu.h> #include <plat/cpu.h>
#include <plat/sdhci.h> #include <plat/sdhci.h>
#include <plat/pm.h>
#include <plat/iic-core.h> #include <plat/iic-core.h>
#include <plat/fb-core.h> #include <plat/fb-core.h>
@ -95,6 +97,9 @@ int __init s3c2416_init(void)
s3c_fb_setname("s3c2443-fb"); s3c_fb_setname("s3c2443-fb");
register_syscore_ops(&s3c2416_pm_syscore_ops);
register_syscore_ops(&s3c24xx_irq_syscore_ops);
return sysdev_register(&s3c2416_sysdev); return sysdev_register(&s3c2416_sysdev);
} }

View File

@ -17,7 +17,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/sysdev.h> #include <linux/syscore_ops.h>
#include <linux/serial_core.h> #include <linux/serial_core.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/i2c.h> #include <linux/i2c.h>
@ -284,7 +284,7 @@ static struct platform_device osiris_pcmcia = {
#ifdef CONFIG_PM #ifdef CONFIG_PM
static unsigned char pm_osiris_ctrl0; 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; unsigned int tmp;
@ -304,7 +304,7 @@ static int osiris_pm_suspend(struct sys_device *sd, pm_message_t state)
return 0; return 0;
} }
static int osiris_pm_resume(struct sys_device *sd) static void osiris_pm_resume(void)
{ {
if (pm_osiris_ctrl0 & OSIRIS_CTRL0_FIX8) if (pm_osiris_ctrl0 & OSIRIS_CTRL0_FIX8)
__raw_writeb(OSIRIS_CTRL1_FIX8, OSIRIS_VA_CTRL1); __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); __raw_writeb(pm_osiris_ctrl0, OSIRIS_VA_CTRL0);
s3c_gpio_cfgpin(S3C2410_GPA(21), S3C2410_GPA21_nRSTOUT); s3c_gpio_cfgpin(S3C2410_GPA(21), S3C2410_GPA21_nRSTOUT);
return 0;
} }
#else #else
@ -321,16 +319,11 @@ static int osiris_pm_resume(struct sys_device *sd)
#define osiris_pm_resume NULL #define osiris_pm_resume NULL
#endif #endif
static struct sysdev_class osiris_pm_sysclass = { static struct syscore_ops osiris_pm_syscore_ops = {
.name = "mach-osiris",
.suspend = osiris_pm_suspend, .suspend = osiris_pm_suspend,
.resume = osiris_pm_resume, .resume = osiris_pm_resume,
}; };
static struct sys_device osiris_pm_sysdev = {
.cls = &osiris_pm_sysclass,
};
/* Link for DVS driver to TPS65011 */ /* Link for DVS driver to TPS65011 */
static void osiris_tps_release(struct device *dev) 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) static void __init osiris_init(void)
{ {
sysdev_class_register(&osiris_pm_sysclass); register_syscore_ops(&osiris_pm_syscore_ops);
sysdev_register(&osiris_pm_sysdev);
s3c_i2c0_set_platdata(NULL); s3c_i2c0_set_platdata(NULL);
s3c_nand_set_platdata(&osiris_nand_info); s3c_nand_set_platdata(&osiris_nand_info);

View File

@ -19,6 +19,7 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/serial_core.h> #include <linux/serial_core.h>
#include <linux/sysdev.h> #include <linux/sysdev.h>
#include <linux/syscore_ops.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/io.h> #include <linux/io.h>
@ -33,6 +34,7 @@
#include <plat/devs.h> #include <plat/devs.h>
#include <plat/cpu.h> #include <plat/cpu.h>
#include <plat/s3c244x.h> #include <plat/s3c244x.h>
#include <plat/pm.h>
#include <plat/gpio-core.h> #include <plat/gpio-core.h>
#include <plat/gpio-cfg.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].start = IRQ_S3C2440_WDT;
s3c_device_wdt.resource[1].end = 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 */ /* register our system device for everything else */
return sysdev_register(&s3c2440_sysdev); return sysdev_register(&s3c2440_sysdev);

Some files were not shown because too many files have changed in this diff Show More