提交 10a010f6 编写于 作者: I Ingo Molnar

Merge branch 'linus' into x86/x2apic

Conflicts:

	drivers/pci/dmar.c
Signed-off-by: NIngo Molnar <mingo@elte.hu>

要显示的变更太多。

To preserve performance only 1000 of 1000+ files are displayed.
...@@ -317,6 +317,14 @@ S: 2322 37th Ave SW ...@@ -317,6 +317,14 @@ S: 2322 37th Ave SW
S: Seattle, Washington 98126-2010 S: Seattle, Washington 98126-2010
S: USA S: USA
N: Muli Ben-Yehuda
E: mulix@mulix.org
E: muli@il.ibm.com
W: http://www.mulix.org
D: trident OSS sound driver, x86-64 dma-ops and Calgary IOMMU,
D: KVM and Xen bits and other misc. hackery.
S: Haifa, Israel
N: Johannes Berg N: Johannes Berg
E: johannes@sipsolutions.net E: johannes@sipsolutions.net
W: http://johannes.sipsolutions.net/ W: http://johannes.sipsolutions.net/
......
What: /sys/dev
Date: April 2008
KernelVersion: 2.6.26
Contact: Dan Williams <dan.j.williams@intel.com>
Description: The /sys/dev tree provides a method to look up the sysfs
path for a device using the information returned from
stat(2). There are two directories, 'block' and 'char',
beneath /sys/dev containing symbolic links with names of
the form "<major>:<minor>". These links point to the
corresponding sysfs path for the given device.
Example:
$ readlink /sys/dev/block/8:32
../../block/sdc
Entries in /sys/dev/char and /sys/dev/block will be
dynamically created and destroyed as devices enter and
leave the system.
Users: mdadm <linux-raid@vger.kernel.org>
What: /sys/devices/system/memory
Date: June 2008
Contact: Badari Pulavarty <pbadari@us.ibm.com>
Description:
The /sys/devices/system/memory contains a snapshot of the
internal state of the kernel memory blocks. Files could be
added or removed dynamically to represent hot-add/remove
operations.
Users: hotplug memory add/remove tools
https://w3.opensource.ibm.com/projects/powerpc-utils/
What: /sys/devices/system/memory/memoryX/removable
Date: June 2008
Contact: Badari Pulavarty <pbadari@us.ibm.com>
Description:
The file /sys/devices/system/memory/memoryX/removable
indicates whether this memory block is removable or not.
This is useful for a user-level agent to determine
identify removable sections of the memory before attempting
potentially expensive hot-remove memory operation
Users: hotplug memory remove tools
https://w3.opensource.ibm.com/projects/powerpc-utils/
What: /sys/kernel/mm
Date: July 2008
Contact: Nishanth Aravamudan <nacc@us.ibm.com>, VM maintainers
Description:
/sys/kernel/mm/ should contain any and all VM
related information in /sys/kernel/.
What: /sys/kernel/mm/hugepages/
Date: June 2008
Contact: Nishanth Aravamudan <nacc@us.ibm.com>, hugetlb maintainers
Description:
/sys/kernel/mm/hugepages/ contains a number of subdirectories
of the form hugepages-<size>kB, where <size> is the page size
of the hugepages supported by the kernel/CPU combination.
Under these directories are a number of files:
nr_hugepages
nr_overcommit_hugepages
free_hugepages
surplus_hugepages
resv_hugepages
See Documentation/vm/hugetlbpage.txt for details.
...@@ -22,3 +22,12 @@ ready and available in memory. The DMA of the "completion indication" ...@@ -22,3 +22,12 @@ ready and available in memory. The DMA of the "completion indication"
could race with data DMA. Mapping the memory used for completion could race with data DMA. Mapping the memory used for completion
indications with DMA_ATTR_WRITE_BARRIER would prevent the race. indications with DMA_ATTR_WRITE_BARRIER would prevent the race.
DMA_ATTR_WEAK_ORDERING
----------------------
DMA_ATTR_WEAK_ORDERING specifies that reads and writes to the mapping
may be weakly ordered, that is that reads and writes may pass each other.
Since it is optional for platforms to implement DMA_ATTR_WEAK_ORDERING,
those that do not will simply ignore the attribute and exhibit default
behavior.
...@@ -219,10 +219,10 @@ ...@@ -219,10 +219,10 @@
</para> </para>
<sect1 id="lock-intro"> <sect1 id="lock-intro">
<title>Three Main Types of Kernel Locks: Spinlocks, Mutexes and Semaphores</title> <title>Two Main Types of Kernel Locks: Spinlocks and Mutexes</title>
<para> <para>
There are three main types of kernel locks. The fundamental type There are two main types of kernel locks. The fundamental type
is the spinlock is the spinlock
(<filename class="headerfile">include/asm/spinlock.h</filename>), (<filename class="headerfile">include/asm/spinlock.h</filename>),
which is a very simple single-holder lock: if you can't get the which is a very simple single-holder lock: if you can't get the
...@@ -239,14 +239,6 @@ ...@@ -239,14 +239,6 @@
can't sleep (see <xref linkend="sleeping-things"/>), and so have to can't sleep (see <xref linkend="sleeping-things"/>), and so have to
use a spinlock instead. use a spinlock instead.
</para> </para>
<para>
The third type is a semaphore
(<filename class="headerfile">include/linux/semaphore.h</filename>): it
can have more than one holder at any time (the number decided at
initialization time), although it is most commonly used as a
single-holder lock (a mutex). If you can't get a semaphore, your
task will be suspended and later on woken up - just like for mutexes.
</para>
<para> <para>
Neither type of lock is recursive: see Neither type of lock is recursive: see
<xref linkend="deadlock"/>. <xref linkend="deadlock"/>.
...@@ -278,7 +270,7 @@ ...@@ -278,7 +270,7 @@
</para> </para>
<para> <para>
Semaphores still exist, because they are required for Mutexes still exist, because they are required for
synchronization between <firstterm linkend="gloss-usercontext">user synchronization between <firstterm linkend="gloss-usercontext">user
contexts</firstterm>, as we will see below. contexts</firstterm>, as we will see below.
</para> </para>
...@@ -289,18 +281,17 @@ ...@@ -289,18 +281,17 @@
<para> <para>
If you have a data structure which is only ever accessed from If you have a data structure which is only ever accessed from
user context, then you can use a simple semaphore user context, then you can use a simple mutex
(<filename>linux/linux/semaphore.h</filename>) to protect it. This (<filename>include/linux/mutex.h</filename>) to protect it. This
is the most trivial case: you initialize the semaphore to the number is the most trivial case: you initialize the mutex. Then you can
of resources available (usually 1), and call call <function>mutex_lock_interruptible()</function> to grab the mutex,
<function>down_interruptible()</function> to grab the semaphore, and and <function>mutex_unlock()</function> to release it. There is also a
<function>up()</function> to release it. There is also a <function>mutex_lock()</function>, which should be avoided, because it
<function>down()</function>, which should be avoided, because it
will not return if a signal is received. will not return if a signal is received.
</para> </para>
<para> <para>
Example: <filename>linux/net/core/netfilter.c</filename> allows Example: <filename>net/netfilter/nf_sockopt.c</filename> allows
registration of new <function>setsockopt()</function> and registration of new <function>setsockopt()</function> and
<function>getsockopt()</function> calls, with <function>getsockopt()</function> calls, with
<function>nf_register_sockopt()</function>. Registration and <function>nf_register_sockopt()</function>. Registration and
...@@ -515,7 +506,7 @@ ...@@ -515,7 +506,7 @@
<listitem> <listitem>
<para> <para>
If you are in a process context (any syscall) and want to If you are in a process context (any syscall) and want to
lock other process out, use a semaphore. You can take a semaphore lock other process out, use a mutex. You can take a mutex
and sleep (<function>copy_from_user*(</function> or and sleep (<function>copy_from_user*(</function> or
<function>kmalloc(x,GFP_KERNEL)</function>). <function>kmalloc(x,GFP_KERNEL)</function>).
</para> </para>
...@@ -662,7 +653,7 @@ ...@@ -662,7 +653,7 @@
<entry>SLBH</entry> <entry>SLBH</entry>
<entry>SLBH</entry> <entry>SLBH</entry>
<entry>SLBH</entry> <entry>SLBH</entry>
<entry>DI</entry> <entry>MLI</entry>
<entry>None</entry> <entry>None</entry>
</row> </row>
...@@ -692,8 +683,8 @@ ...@@ -692,8 +683,8 @@
<entry>spin_lock_bh</entry> <entry>spin_lock_bh</entry>
</row> </row>
<row> <row>
<entry>DI</entry> <entry>MLI</entry>
<entry>down_interruptible</entry> <entry>mutex_lock_interruptible</entry>
</row> </row>
</tbody> </tbody>
...@@ -1310,7 +1301,7 @@ as Alan Cox says, <quote>Lock data, not code</quote>. ...@@ -1310,7 +1301,7 @@ as Alan Cox says, <quote>Lock data, not code</quote>.
<para> <para>
There is a coding bug where a piece of code tries to grab a There is a coding bug where a piece of code tries to grab a
spinlock twice: it will spin forever, waiting for the lock to spinlock twice: it will spin forever, waiting for the lock to
be released (spinlocks, rwlocks and semaphores are not be released (spinlocks, rwlocks and mutexes are not
recursive in Linux). This is trivial to diagnose: not a recursive in Linux). This is trivial to diagnose: not a
stay-up-five-nights-talk-to-fluffy-code-bunnies kind of stay-up-five-nights-talk-to-fluffy-code-bunnies kind of
problem. problem.
...@@ -1335,7 +1326,7 @@ as Alan Cox says, <quote>Lock data, not code</quote>. ...@@ -1335,7 +1326,7 @@ as Alan Cox says, <quote>Lock data, not code</quote>.
<para> <para>
This complete lockup is easy to diagnose: on SMP boxes the This complete lockup is easy to diagnose: on SMP boxes the
watchdog timer or compiling with <symbol>DEBUG_SPINLOCKS</symbol> set watchdog timer or compiling with <symbol>DEBUG_SPINLOCK</symbol> set
(<filename>include/linux/spinlock.h</filename>) will show this up (<filename>include/linux/spinlock.h</filename>) will show this up
immediately when it happens. immediately when it happens.
</para> </para>
...@@ -1558,7 +1549,7 @@ the amount of locking which needs to be done. ...@@ -1558,7 +1549,7 @@ the amount of locking which needs to be done.
<title>Read/Write Lock Variants</title> <title>Read/Write Lock Variants</title>
<para> <para>
Both spinlocks and semaphores have read/write variants: Both spinlocks and mutexes have read/write variants:
<type>rwlock_t</type> and <structname>struct rw_semaphore</structname>. <type>rwlock_t</type> and <structname>struct rw_semaphore</structname>.
These divide users into two classes: the readers and the writers. If These divide users into two classes: the readers and the writers. If
you are only reading the data, you can get a read lock, but to write to you are only reading the data, you can get a read lock, but to write to
...@@ -1681,7 +1672,7 @@ the amount of locking which needs to be done. ...@@ -1681,7 +1672,7 @@ the amount of locking which needs to be done.
#include &lt;linux/slab.h&gt; #include &lt;linux/slab.h&gt;
#include &lt;linux/string.h&gt; #include &lt;linux/string.h&gt;
+#include &lt;linux/rcupdate.h&gt; +#include &lt;linux/rcupdate.h&gt;
#include &lt;linux/semaphore.h&gt; #include &lt;linux/mutex.h&gt;
#include &lt;asm/errno.h&gt; #include &lt;asm/errno.h&gt;
struct object struct object
...@@ -1913,7 +1904,7 @@ machines due to caching. ...@@ -1913,7 +1904,7 @@ machines due to caching.
</listitem> </listitem>
<listitem> <listitem>
<para> <para>
<function> put_user()</function> <function>put_user()</function>
</para> </para>
</listitem> </listitem>
</itemizedlist> </itemizedlist>
...@@ -1927,13 +1918,13 @@ machines due to caching. ...@@ -1927,13 +1918,13 @@ machines due to caching.
<listitem> <listitem>
<para> <para>
<function>down_interruptible()</function> and <function>mutex_lock_interruptible()</function> and
<function>down()</function> <function>mutex_lock()</function>
</para> </para>
<para> <para>
There is a <function>down_trylock()</function> which can be There is a <function>mutex_trylock()</function> which can be
used inside interrupt context, as it will not sleep. used inside interrupt context, as it will not sleep.
<function>up()</function> will also never sleep. <function>mutex_unlock()</function> will also never sleep.
</para> </para>
</listitem> </listitem>
</itemizedlist> </itemizedlist>
...@@ -2023,7 +2014,7 @@ machines due to caching. ...@@ -2023,7 +2014,7 @@ machines due to caching.
<para> <para>
Prior to 2.5, or when <symbol>CONFIG_PREEMPT</symbol> is Prior to 2.5, or when <symbol>CONFIG_PREEMPT</symbol> is
unset, processes in user context inside the kernel would not unset, processes in user context inside the kernel would not
preempt each other (ie. you had that CPU until you have it up, preempt each other (ie. you had that CPU until you gave it up,
except for interrupts). With the addition of except for interrupts). With the addition of
<symbol>CONFIG_PREEMPT</symbol> in 2.5.4, this changed: when <symbol>CONFIG_PREEMPT</symbol> in 2.5.4, this changed: when
in user context, higher priority tasks can "cut in": spinlocks in user context, higher priority tasks can "cut in": spinlocks
......
...@@ -21,6 +21,18 @@ ...@@ -21,6 +21,18 @@
</affiliation> </affiliation>
</author> </author>
<copyright>
<year>2006-2008</year>
<holder>Hans-Jürgen Koch.</holder>
</copyright>
<legalnotice>
<para>
This documentation is Free Software licensed under the terms of the
GPL version 2.
</para>
</legalnotice>
<pubdate>2006-12-11</pubdate> <pubdate>2006-12-11</pubdate>
<abstract> <abstract>
...@@ -29,6 +41,12 @@ ...@@ -29,6 +41,12 @@
</abstract> </abstract>
<revhistory> <revhistory>
<revision>
<revnumber>0.5</revnumber>
<date>2008-05-22</date>
<authorinitials>hjk</authorinitials>
<revremark>Added description of write() function.</revremark>
</revision>
<revision> <revision>
<revnumber>0.4</revnumber> <revnumber>0.4</revnumber>
<date>2007-11-26</date> <date>2007-11-26</date>
...@@ -57,20 +75,9 @@ ...@@ -57,20 +75,9 @@
</bookinfo> </bookinfo>
<chapter id="aboutthisdoc"> <chapter id="aboutthisdoc">
<?dbhtml filename="about.html"?> <?dbhtml filename="aboutthis.html"?>
<title>About this document</title> <title>About this document</title>
<sect1 id="copyright">
<?dbhtml filename="copyright.html"?>
<title>Copyright and License</title>
<para>
Copyright (c) 2006 by Hans-Jürgen Koch.</para>
<para>
This documentation is Free Software licensed under the terms of the
GPL version 2.
</para>
</sect1>
<sect1 id="translations"> <sect1 id="translations">
<?dbhtml filename="translations.html"?> <?dbhtml filename="translations.html"?>
<title>Translations</title> <title>Translations</title>
...@@ -189,6 +196,30 @@ interested in translating it, please email me ...@@ -189,6 +196,30 @@ interested in translating it, please email me
represents the total interrupt count. You can use this number represents the total interrupt count. You can use this number
to figure out if you missed some interrupts. to figure out if you missed some interrupts.
</para> </para>
<para>
For some hardware that has more than one interrupt source internally,
but not separate IRQ mask and status registers, there might be
situations where userspace cannot determine what the interrupt source
was if the kernel handler disables them by writing to the chip's IRQ
register. In such a case, the kernel has to disable the IRQ completely
to leave the chip's register untouched. Now the userspace part can
determine the cause of the interrupt, but it cannot re-enable
interrupts. Another cornercase is chips where re-enabling interrupts
is a read-modify-write operation to a combined IRQ status/acknowledge
register. This would be racy if a new interrupt occurred
simultaneously.
</para>
<para>
To address these problems, UIO also implements a write() function. It
is normally not used and can be ignored for hardware that has only a
single interrupt source or has separate IRQ mask and status registers.
If you need it, however, a write to <filename>/dev/uioX</filename>
will call the <function>irqcontrol()</function> function implemented
by the driver. You have to write a 32-bit value that is usually either
0 or 1 to disable or enable interrupts. If a driver does not implement
<function>irqcontrol()</function>, <function>write()</function> will
return with <varname>-ENOSYS</varname>.
</para>
<para> <para>
To handle interrupts properly, your custom kernel module can To handle interrupts properly, your custom kernel module can
...@@ -362,6 +393,14 @@ device is actually used. ...@@ -362,6 +393,14 @@ device is actually used.
<function>open()</function>, you will probably also want a custom <function>open()</function>, you will probably also want a custom
<function>release()</function> function. <function>release()</function> function.
</para></listitem> </para></listitem>
<listitem><para>
<varname>int (*irqcontrol)(struct uio_info *info, s32 irq_on)
</varname>: Optional. If you need to be able to enable or disable
interrupts from userspace by writing to <filename>/dev/uioX</filename>,
you can implement this function. The parameter <varname>irq_on</varname>
will be 0 to disable interrupts and 1 to enable them.
</para></listitem>
</itemizedlist> </itemizedlist>
<para> <para>
......
...@@ -358,7 +358,7 @@ Here is a list of some of the different kernel trees available: ...@@ -358,7 +358,7 @@ Here is a list of some of the different kernel trees available:
- pcmcia, Dominik Brodowski <linux@dominikbrodowski.net> - pcmcia, Dominik Brodowski <linux@dominikbrodowski.net>
git.kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git git.kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git
- SCSI, James Bottomley <James.Bottomley@SteelEye.com> - SCSI, James Bottomley <James.Bottomley@hansenpartnership.com>
git.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git git.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git
- x86, Ingo Molnar <mingo@elte.hu> - x86, Ingo Molnar <mingo@elte.hu>
......
SH7760/SH7763 integrated LCDC Framebuffer driver
================================================
0. Overwiew
-----------
The SH7760/SH7763 have an integrated LCD Display controller (LCDC) which
supports (in theory) resolutions ranging from 1x1 to 1024x1024,
with color depths ranging from 1 to 16 bits, on STN, DSTN and TFT Panels.
Caveats:
* Framebuffer memory must be a large chunk allocated at the top
of Area3 (HW requirement). Because of this requirement you should NOT
make the driver a module since at runtime it may become impossible to
get a large enough contiguous chunk of memory.
* The driver does not support changing resolution while loaded
(displays aren't hotpluggable anyway)
* Heavy flickering may be observed
a) if you're using 15/16bit color modes at >= 640x480 px resolutions,
b) during PCMCIA (or any other slow bus) activity.
* Rotation works only 90degress clockwise, and only if horizontal
resolution is <= 320 pixels.
files: drivers/video/sh7760fb.c
include/asm-sh/sh7760fb.h
Documentation/fb/sh7760fb.txt
1. Platform setup
-----------------
SH7760:
Video data is fetched via the DMABRG DMA engine, so you have to
configure the SH DMAC for DMABRG mode (write 0x94808080 to the
DMARSRA register somewhere at boot).
PFC registers PCCR and PCDR must be set to peripheral mode.
(write zeros to both).
The driver does NOT do the above for you since board setup is, well, job
of the board setup code.
2. Panel definitions
--------------------
The LCDC must explicitly be told about the type of LCD panel
attached. Data must be wrapped in a "struct sh7760fb_platdata" and
passed to the driver as platform_data.
Suggest you take a closer look at the SH7760 Manual, Section 30.
(http://documentation.renesas.com/eng/products/mpumcu/e602291_sh7760.pdf)
The following code illustrates what needs to be done to
get the framebuffer working on a 640x480 TFT:
====================== cut here ======================================
#include <linux/fb.h>
#include <asm/sh7760fb.h>
/*
* NEC NL6440bc26-01 640x480 TFT
* dotclock 25175 kHz
* Xres 640 Yres 480
* Htotal 800 Vtotal 525
* HsynStart 656 VsynStart 490
* HsynLenn 30 VsynLenn 2
*
* The linux framebuffer layer does not use the syncstart/synclen
* values but right/left/upper/lower margin values. The comments
* for the x_margin explain how to calculate those from given
* panel sync timings.
*/
static struct fb_videomode nl6448bc26 = {
.name = "NL6448BC26",
.refresh = 60,
.xres = 640,
.yres = 480,
.pixclock = 39683, /* in picoseconds! */
.hsync_len = 30,
.vsync_len = 2,
.left_margin = 114, /* HTOT - (HSYNSLEN + HSYNSTART) */
.right_margin = 16, /* HSYNSTART - XRES */
.upper_margin = 33, /* VTOT - (VSYNLEN + VSYNSTART) */
.lower_margin = 10, /* VSYNSTART - YRES */
.sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
.vmode = FB_VMODE_NONINTERLACED,
.flag = 0,
};
static struct sh7760fb_platdata sh7760fb_nl6448 = {
.def_mode = &nl6448bc26,
.ldmtr = LDMTR_TFT_COLOR_16, /* 16bit TFT panel */
.lddfr = LDDFR_8BPP, /* we want 8bit output */
.ldpmmr = 0x0070,
.ldpspr = 0x0500,
.ldaclnr = 0,
.ldickr = LDICKR_CLKSRC(LCDC_CLKSRC_EXTERNAL) |
LDICKR_CLKDIV(1),
.rotate = 0,
.novsync = 1,
.blank = NULL,
};
/* SH7760:
* 0xFE300800: 256 * 4byte xRGB palette ram
* 0xFE300C00: 42 bytes ctrl registers
*/
static struct resource sh7760_lcdc_res[] = {
[0] = {
.start = 0xFE300800,
.end = 0xFE300CFF,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = 65,
.end = 65,
.flags = IORESOURCE_IRQ,
},
};
static struct platform_device sh7760_lcdc_dev = {
.dev = {
.platform_data = &sh7760fb_nl6448,
},
.name = "sh7760-lcdc",
.id = -1,
.resource = sh7760_lcdc_res,
.num_resources = ARRAY_SIZE(sh7760_lcdc_res),
};
====================== cut here ======================================
...@@ -3,11 +3,25 @@ Tridentfb is a framebuffer driver for some Trident chip based cards. ...@@ -3,11 +3,25 @@ Tridentfb is a framebuffer driver for some Trident chip based cards.
The following list of chips is thought to be supported although not all are The following list of chips is thought to be supported although not all are
tested: tested:
those from the Image series with Cyber in their names - accelerated those from the TGUI series 9440/96XX and with Cyber in their names
those with Blade in their names (Blade3D,CyberBlade...) - accelerated those from the Image series and with Cyber in their names
the newer CyberBladeXP family - nonaccelerated those with Blade in their names (Blade3D,CyberBlade...)
the newer CyberBladeXP family
Only PCI/AGP based cards are supported, none of the older Tridents.
All families are accelerated. Only PCI/AGP based cards are supported,
none of the older Tridents.
The driver supports 8, 16 and 32 bits per pixel depths.
The TGUI family requires a line length to be power of 2 if acceleration
is enabled. This means that range of possible resolutions and bpp is
limited comparing to the range if acceleration is disabled (see list
of parameters below).
Known bugs:
1. The driver randomly locks up on 3DImage975 chip with acceleration
enabled. The same happens in X11 (Xorg).
2. The ramdac speeds require some more fine tuning. It is possible to
switch resolution which the chip does not support at some depths for
older chips.
How to use it? How to use it?
============== ==============
...@@ -17,12 +31,11 @@ video=tridentfb ...@@ -17,12 +31,11 @@ video=tridentfb
The parameters for tridentfb are concatenated with a ':' as in this example. The parameters for tridentfb are concatenated with a ':' as in this example.
video=tridentfb:800x600,bpp=16,noaccel video=tridentfb:800x600-16@75,noaccel
The second level parameters that tridentfb understands are: The second level parameters that tridentfb understands are:
noaccel - turns off acceleration (when it doesn't work for your card) noaccel - turns off acceleration (when it doesn't work for your card)
accel - force text acceleration (for boards which by default are noacceled)
fp - use flat panel related stuff fp - use flat panel related stuff
crt - assume monitor is present instead of fp crt - assume monitor is present instead of fp
...@@ -31,21 +44,24 @@ center - for flat panels and resolutions smaller than native size center the ...@@ -31,21 +44,24 @@ center - for flat panels and resolutions smaller than native size center the
image, otherwise use image, otherwise use
stretch stretch
memsize - integer value in Kb, use if your card's memory size is misdetected. memsize - integer value in KB, use if your card's memory size is misdetected.
look at the driver output to see what it says when initializing. look at the driver output to see what it says when initializing.
memdiff - integer value in Kb,should be nonzero if your card reports
more memory than it actually has.For instance mine is 192K less than memdiff - integer value in KB, should be nonzero if your card reports
more memory than it actually has. For instance mine is 192K less than
detection says in all three BIOS selectable situations 2M, 4M, 8M. detection says in all three BIOS selectable situations 2M, 4M, 8M.
Only use if your video memory is taken from main memory hence of Only use if your video memory is taken from main memory hence of
configurable size.Otherwise use memsize. configurable size. Otherwise use memsize.
If in some modes which barely fit the memory you see garbage at the bottom If in some modes which barely fit the memory you see garbage
this might help by not letting change to that mode anymore. at the bottom this might help by not letting change to that mode
anymore.
nativex - the width in pixels of the flat panel.If you know it (usually 1024 nativex - the width in pixels of the flat panel.If you know it (usually 1024
800 or 1280) and it is not what the driver seems to detect use it. 800 or 1280) and it is not what the driver seems to detect use it.
bpp - bits per pixel (8,16 or 32) bpp - bits per pixel (8,16 or 32)
mode - a mode name like 800x600 (as described in Documentation/fb/modedb.txt) mode - a mode name like 800x600-8@75 as described in
Documentation/fb/modedb.txt
Using insane values for the above parameters will probably result in driver Using insane values for the above parameters will probably result in driver
misbehaviour so take care(for instance memsize=12345678 or memdiff=23784 or misbehaviour so take care(for instance memsize=12345678 or memdiff=23784 or
......
...@@ -300,14 +300,6 @@ Who: ocfs2-devel@oss.oracle.com ...@@ -300,14 +300,6 @@ Who: ocfs2-devel@oss.oracle.com
--------------------------- ---------------------------
What: asm/semaphore.h
When: 2.6.26
Why: Implementation became generic; users should now include
linux/semaphore.h instead.
Who: Matthew Wilcox <willy@linux.intel.com>
---------------------------
What: SCTP_GET_PEER_ADDRS_NUM_OLD, SCTP_GET_PEER_ADDRS_OLD, What: SCTP_GET_PEER_ADDRS_NUM_OLD, SCTP_GET_PEER_ADDRS_OLD,
SCTP_GET_LOCAL_ADDRS_NUM_OLD, SCTP_GET_LOCAL_ADDRS_OLD SCTP_GET_LOCAL_ADDRS_NUM_OLD, SCTP_GET_LOCAL_ADDRS_OLD
When: June 2009 When: June 2009
......
...@@ -510,6 +510,7 @@ prototypes: ...@@ -510,6 +510,7 @@ prototypes:
void (*close)(struct vm_area_struct*); void (*close)(struct vm_area_struct*);
int (*fault)(struct vm_area_struct*, struct vm_fault *); int (*fault)(struct vm_area_struct*, struct vm_fault *);
int (*page_mkwrite)(struct vm_area_struct *, struct page *); int (*page_mkwrite)(struct vm_area_struct *, struct page *);
int (*access)(struct vm_area_struct *, unsigned long, void*, int, int);
locking rules: locking rules:
BKL mmap_sem PageLocked(page) BKL mmap_sem PageLocked(page)
...@@ -517,6 +518,7 @@ open: no yes ...@@ -517,6 +518,7 @@ open: no yes
close: no yes close: no yes
fault: no yes fault: no yes
page_mkwrite: no yes no page_mkwrite: no yes no
access: no yes
->page_mkwrite() is called when a previously read-only page is ->page_mkwrite() is called when a previously read-only page is
about to become writeable. The file system is responsible for about to become writeable. The file system is responsible for
...@@ -525,6 +527,11 @@ taking to lock out truncate, the page range should be verified to be ...@@ -525,6 +527,11 @@ taking to lock out truncate, the page range should be verified to be
within i_size. The page mapping should also be checked that it is not within i_size. The page mapping should also be checked that it is not
NULL. NULL.
->access() is called when get_user_pages() fails in
acces_process_vm(), typically used to debug a process through
/proc/pid/mem or ptrace. This function is needed only for
VM_IO | VM_PFNMAP VMAs.
================================================================================ ================================================================================
Dubious stuff Dubious stuff
......
...@@ -26,11 +26,11 @@ You can simplify mounting by just typing: ...@@ -26,11 +26,11 @@ You can simplify mounting by just typing:
this will allocate the first available loopback device (and load loop.o this will allocate the first available loopback device (and load loop.o
kernel module if necessary) automatically. If the loopback driver is not kernel module if necessary) automatically. If the loopback driver is not
loaded automatically, make sure that your kernel is compiled with kmod loaded automatically, make sure that you have compiled the module and
support (CONFIG_KMOD) enabled. Beware that umount will not that modprobe is functioning. Beware that umount will not deallocate
deallocate /dev/loopN device if /etc/mtab file on your system is a /dev/loopN device if /etc/mtab file on your system is a symbolic link to
symbolic link to /proc/mounts. You will need to do it manually using /proc/mounts. You will need to do it manually using "-d" switch of
"-d" switch of losetup(8). Read losetup(8) manpage for more info. losetup(8). Read losetup(8) manpage for more info.
To create the BFS image under UnixWare you need to find out first which To create the BFS image under UnixWare you need to find out first which
slice contains it. The command prtvtoc(1M) is your friend: slice contains it. The command prtvtoc(1M) is your friend:
......
...@@ -296,6 +296,7 @@ Table 1-4: Kernel info in /proc ...@@ -296,6 +296,7 @@ Table 1-4: Kernel info in /proc
uptime System uptime uptime System uptime
version Kernel version version Kernel version
video bttv info of video resources (2.4) video bttv info of video resources (2.4)
vmallocinfo Show vmalloced areas
.............................................................................. ..............................................................................
You can, for example, check which interrupts are currently in use and what You can, for example, check which interrupts are currently in use and what
...@@ -557,6 +558,49 @@ VmallocTotal: total size of vmalloc memory area ...@@ -557,6 +558,49 @@ VmallocTotal: total size of vmalloc memory area
VmallocUsed: amount of vmalloc area which is used VmallocUsed: amount of vmalloc area which is used
VmallocChunk: largest contigious block of vmalloc area which is free VmallocChunk: largest contigious block of vmalloc area which is free
..............................................................................
vmallocinfo:
Provides information about vmalloced/vmaped areas. One line per area,
containing the virtual address range of the area, size in bytes,
caller information of the creator, and optional information depending
on the kind of area :
pages=nr number of pages
phys=addr if a physical address was specified
ioremap I/O mapping (ioremap() and friends)
vmalloc vmalloc() area
vmap vmap()ed pages
user VM_USERMAP area
vpages buffer for pages pointers was vmalloced (huge area)
N<node>=nr (Only on NUMA kernels)
Number of pages allocated on memory node <node>
> cat /proc/vmallocinfo
0xffffc20000000000-0xffffc20000201000 2101248 alloc_large_system_hash+0x204 ...
/0x2c0 pages=512 vmalloc N0=128 N1=128 N2=128 N3=128
0xffffc20000201000-0xffffc20000302000 1052672 alloc_large_system_hash+0x204 ...
/0x2c0 pages=256 vmalloc N0=64 N1=64 N2=64 N3=64
0xffffc20000302000-0xffffc20000304000 8192 acpi_tb_verify_table+0x21/0x4f...
phys=7fee8000 ioremap
0xffffc20000304000-0xffffc20000307000 12288 acpi_tb_verify_table+0x21/0x4f...
phys=7fee7000 ioremap
0xffffc2000031d000-0xffffc2000031f000 8192 init_vdso_vars+0x112/0x210
0xffffc2000031f000-0xffffc2000032b000 49152 cramfs_uncompress_init+0x2e ...
/0x80 pages=11 vmalloc N0=3 N1=3 N2=2 N3=3
0xffffc2000033a000-0xffffc2000033d000 12288 sys_swapon+0x640/0xac0 ...
pages=2 vmalloc N1=2
0xffffc20000347000-0xffffc2000034c000 20480 xt_alloc_table_info+0xfe ...
/0x130 [x_tables] pages=4 vmalloc N0=4
0xffffffffa0000000-0xffffffffa000f000 61440 sys_init_module+0xc27/0x1d00 ...
pages=14 vmalloc N2=14
0xffffffffa000f000-0xffffffffa0014000 20480 sys_init_module+0xc27/0x1d00 ...
pages=4 vmalloc N1=4
0xffffffffa0014000-0xffffffffa0017000 12288 sys_init_module+0xc27/0x1d00 ...
pages=2 vmalloc N1=2
0xffffffffa0017000-0xffffffffa0022000 45056 sys_init_module+0xc27/0x1d00 ...
pages=10 vmalloc N0=10
1.3 IDE devices in /proc/ide 1.3 IDE devices in /proc/ide
---------------------------- ----------------------------
......
...@@ -248,6 +248,7 @@ The top level sysfs directory looks like: ...@@ -248,6 +248,7 @@ The top level sysfs directory looks like:
block/ block/
bus/ bus/
class/ class/
dev/
devices/ devices/
firmware/ firmware/
net/ net/
...@@ -274,6 +275,11 @@ fs/ contains a directory for some filesystems. Currently each ...@@ -274,6 +275,11 @@ fs/ contains a directory for some filesystems. Currently each
filesystem wanting to export attributes must create its own hierarchy filesystem wanting to export attributes must create its own hierarchy
below fs/ (see ./fuse.txt for an example). below fs/ (see ./fuse.txt for an example).
dev/ contains two directories char/ and block/. Inside these two
directories there are symlinks named <major>:<minor>. These symlinks
point to the sysfs directory for the given device. /sys/dev provides a
quick way to lookup the sysfs interface for a device from the result of
a stat(2) operation.
More information can driver-model specific features can be found in More information can driver-model specific features can be found in
Documentation/driver-model/. Documentation/driver-model/.
......
...@@ -87,7 +87,8 @@ parameter is applicable: ...@@ -87,7 +87,8 @@ parameter is applicable:
SH SuperH architecture is enabled. SH SuperH architecture is enabled.
SMP The kernel is an SMP kernel. SMP The kernel is an SMP kernel.
SPARC Sparc architecture is enabled. SPARC Sparc architecture is enabled.
SWSUSP Software suspend is enabled. SWSUSP Software suspend (hibernation) is enabled.
SUSPEND System suspend states are enabled.
TS Appropriate touchscreen support is enabled. TS Appropriate touchscreen support is enabled.
USB USB support is enabled. USB USB support is enabled.
USBHID USB Human Interface Device support is enabled. USBHID USB Human Interface Device support is enabled.
...@@ -147,10 +148,12 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -147,10 +148,12 @@ and is between 256 and 4096 characters. It is defined in the file
default: 0 default: 0
acpi_sleep= [HW,ACPI] Sleep options acpi_sleep= [HW,ACPI] Sleep options
Format: { s3_bios, s3_mode, s3_beep, old_ordering } Format: { s3_bios, s3_mode, s3_beep, s4_nohwsig, old_ordering }
See Documentation/power/video.txt for s3_bios and s3_mode. See Documentation/power/video.txt for 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
as soon as the kernel's real-mode entry point is called. as soon as the kernel's real-mode entry point is called.
s4_nohwsig prevents ACPI hardware signature from being
used during resume from hibernation.
old_ordering causes the ACPI 1.0 ordering of the _PTS old_ordering causes the ACPI 1.0 ordering of the _PTS
control method, wrt putting devices into low power control method, wrt putting devices into low power
states, to be enforced (the ACPI 2.0 ordering of _PTS is states, to be enforced (the ACPI 2.0 ordering of _PTS is
...@@ -774,8 +777,22 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -774,8 +777,22 @@ and is between 256 and 4096 characters. It is defined in the file
hisax= [HW,ISDN] hisax= [HW,ISDN]
See Documentation/isdn/README.HiSax. See Documentation/isdn/README.HiSax.
hugepages= [HW,X86-32,IA-64] Maximal number of HugeTLB pages. hugepages= [HW,X86-32,IA-64] HugeTLB pages to allocate at boot.
hugepagesz= [HW,IA-64,PPC] The size of the HugeTLB pages. hugepagesz= [HW,IA-64,PPC,X86-64] The size of the HugeTLB pages.
On x86-64 and powerpc, this option can be specified
multiple times interleaved with hugepages= to reserve
huge pages of different sizes. Valid pages sizes on
x86-64 are 2M (when the CPU supports "pse") and 1G
(when the CPU supports the "pdpe1gb" cpuinfo flag)
Note that 1GB pages can only be allocated at boot time
using hugepages= and not freed afterwards.
default_hugepagesz=
[same as hugepagesz=] The size of the default
HugeTLB page size. This is the size represented by
the legacy /proc/ hugepages APIs, used for SHM, and
default size when mounting hugetlbfs filesystems.
Defaults to the default architecture's huge page size
if not specified.
i8042.direct [HW] Put keyboard port into non-translated mode i8042.direct [HW] Put keyboard port into non-translated mode
i8042.dumbkbd [HW] Pretend that controller can only read data from i8042.dumbkbd [HW] Pretend that controller can only read data from
...@@ -1225,6 +1242,14 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -1225,6 +1242,14 @@ and is between 256 and 4096 characters. It is defined in the file
mga= [HW,DRM] mga= [HW,DRM]
mminit_loglevel=
[KNL] When CONFIG_DEBUG_MEMORY_INIT is set, this
parameter allows control of the logging verbosity for
the additional memory initialisation checks. A value
of 0 disables mminit logging and a level of 4 will
log everything. Information is printed at KERN_DEBUG
so loglevel=8 may also need to be specified.
mousedev.tap_time= mousedev.tap_time=
[MOUSE] Maximum time between finger touching and [MOUSE] Maximum time between finger touching and
leaving touchpad surface for touch to be considered leaving touchpad surface for touch to be considered
...@@ -2040,6 +2065,9 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -2040,6 +2065,9 @@ and is between 256 and 4096 characters. It is defined in the file
snd-ymfpci= [HW,ALSA] snd-ymfpci= [HW,ALSA]
softlockup_panic=
[KNL] Should the soft-lockup detector generate panics.
sonypi.*= [HW] Sony Programmable I/O Control Device driver sonypi.*= [HW] Sony Programmable I/O Control Device driver
See Documentation/sonypi.txt See Documentation/sonypi.txt
...@@ -2104,6 +2132,12 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -2104,6 +2132,12 @@ and is between 256 and 4096 characters. It is defined in the file
tdfx= [HW,DRM] tdfx= [HW,DRM]
test_suspend= [SUSPEND]
Specify "mem" (for Suspend-to-RAM) or "standby" (for
standby suspend) as the system sleep state to briefly
enter during system startup. The system is woken from
this state using a wakeup-capable RTC alarm.
thash_entries= [KNL,NET] thash_entries= [KNL,NET]
Set number of hash buckets for TCP connection Set number of hash buckets for TCP connection
......
ThinkPad ACPI Extras Driver ThinkPad ACPI Extras Driver
Version 0.20 Version 0.21
April 09th, 2008 May 29th, 2008
Borislav Deianov <borislav@users.sf.net> Borislav Deianov <borislav@users.sf.net>
Henrique de Moraes Holschuh <hmh@hmh.eng.br> Henrique de Moraes Holschuh <hmh@hmh.eng.br>
...@@ -621,7 +621,8 @@ Bluetooth ...@@ -621,7 +621,8 @@ Bluetooth
--------- ---------
procfs: /proc/acpi/ibm/bluetooth procfs: /proc/acpi/ibm/bluetooth
sysfs device attribute: bluetooth_enable sysfs device attribute: bluetooth_enable (deprecated)
sysfs rfkill class: switch "tpacpi_bluetooth_sw"
This feature shows the presence and current state of a ThinkPad This feature shows the presence and current state of a ThinkPad
Bluetooth device in the internal ThinkPad CDC slot. Bluetooth device in the internal ThinkPad CDC slot.
...@@ -643,8 +644,12 @@ Sysfs notes: ...@@ -643,8 +644,12 @@ Sysfs notes:
0: disables Bluetooth / Bluetooth is disabled 0: disables Bluetooth / Bluetooth is disabled
1: enables Bluetooth / Bluetooth is enabled. 1: enables Bluetooth / Bluetooth is enabled.
Note: this interface will be probably be superseded by the Note: this interface has been superseded by the generic rfkill
generic rfkill class, so it is NOT to be considered stable yet. class. It has been deprecated, and it will be removed in year
2010.
rfkill controller switch "tpacpi_bluetooth_sw": refer to
Documentation/rfkill.txt for details.
Video output control -- /proc/acpi/ibm/video Video output control -- /proc/acpi/ibm/video
-------------------------------------------- --------------------------------------------
...@@ -1374,7 +1379,8 @@ EXPERIMENTAL: WAN ...@@ -1374,7 +1379,8 @@ EXPERIMENTAL: WAN
----------------- -----------------
procfs: /proc/acpi/ibm/wan procfs: /proc/acpi/ibm/wan
sysfs device attribute: wwan_enable sysfs device attribute: wwan_enable (deprecated)
sysfs rfkill class: switch "tpacpi_wwan_sw"
This feature is marked EXPERIMENTAL because the implementation This feature is marked EXPERIMENTAL because the implementation
directly accesses hardware registers and may not work as expected. USE directly accesses hardware registers and may not work as expected. USE
...@@ -1404,8 +1410,12 @@ Sysfs notes: ...@@ -1404,8 +1410,12 @@ Sysfs notes:
0: disables WWAN card / WWAN card is disabled 0: disables WWAN card / WWAN card is disabled
1: enables WWAN card / WWAN card is enabled. 1: enables WWAN card / WWAN card is enabled.
Note: this interface will be probably be superseded by the Note: this interface has been superseded by the generic rfkill
generic rfkill class, so it is NOT to be considered stable yet. class. It has been deprecated, and it will be removed in year
2010.
rfkill controller switch "tpacpi_wwan_sw": refer to
Documentation/rfkill.txt for details.
Multiple Commands, Module Parameters Multiple Commands, Module Parameters
------------------------------------ ------------------------------------
......
...@@ -513,21 +513,11 @@ Additional Configurations ...@@ -513,21 +513,11 @@ Additional Configurations
Intel(R) PRO/1000 PT Dual Port Server Connection Intel(R) PRO/1000 PT Dual Port Server Connection
Intel(R) PRO/1000 PT Dual Port Server Adapter Intel(R) PRO/1000 PT Dual Port Server Adapter
Intel(R) PRO/1000 PF Dual Port Server Adapter Intel(R) PRO/1000 PF Dual Port Server Adapter
Intel(R) PRO/1000 PT Quad Port Server Adapter Intel(R) PRO/1000 PT Quad Port Server Adapter
NAPI NAPI
---- ----
NAPI (Rx polling mode) is supported in the e1000 driver. NAPI is enabled NAPI (Rx polling mode) is enabled in the e1000 driver.
or disabled based on the configuration of the kernel. To override
the default, use the following compile-time flags.
To enable NAPI, compile the driver module, passing in a configuration option:
make CFLAGS_EXTRA=-DE1000_NAPI install
To disable NAPI, compile the driver module, passing in a configuration option:
make CFLAGS_EXTRA=-DE1000_NO_NAPI install
See www.cyberus.ca/~hadi/usenix-paper.tgz for more information on NAPI. See www.cyberus.ca/~hadi/usenix-paper.tgz for more information on NAPI.
......
...@@ -148,7 +148,7 @@ ...@@ -148,7 +148,7 @@
getsockopt(sockfd, SOL_SOCKET, SO_NO_CHECK, &value, ...); getsockopt(sockfd, SOL_SOCKET, SO_NO_CHECK, &value, ...);
is meaningless (as in TCP). Packets with a zero checksum field are is meaningless (as in TCP). Packets with a zero checksum field are
illegal (cf. RFC 3828, sec. 3.1) will be silently discarded. illegal (cf. RFC 3828, sec. 3.1) and will be silently discarded.
4) Fragmentation 4) Fragmentation
......
00-INDEX 00-INDEX
- This file - This file
apm-acpi.txt
- basic info about the APM and ACPI support.
basic-pm-debugging.txt basic-pm-debugging.txt
- Debugging suspend and resume - Debugging suspend and resume
devices.txt devices.txt
...@@ -14,8 +16,6 @@ notifiers.txt ...@@ -14,8 +16,6 @@ notifiers.txt
- Registering suspend notifiers in device drivers - Registering suspend notifiers in device drivers
pci.txt pci.txt
- How the PCI Subsystem Does Power Management - How the PCI Subsystem Does Power Management
pm.txt
- info on Linux power management support.
pm_qos_interface.txt pm_qos_interface.txt
- info on Linux PM Quality of Service interface - info on Linux PM Quality of Service interface
power_supply_class.txt power_supply_class.txt
......
APM or ACPI?
------------
If you have a relatively recent x86 mobile, desktop, or server system,
odds are it supports either Advanced Power Management (APM) or
Advanced Configuration and Power Interface (ACPI). ACPI is the newer
of the two technologies and puts power management in the hands of the
operating system, allowing for more intelligent power management than
is possible with BIOS controlled APM.
The best way to determine which, if either, your system supports is to
build a kernel with both ACPI and APM enabled (as of 2.3.x ACPI is
enabled by default). If a working ACPI implementation is found, the
ACPI driver will override and disable APM, otherwise the APM driver
will be used.
No, sorry, you cannot have both ACPI and APM enabled and running at
once. Some people with broken ACPI or broken APM implementations
would like to use both to get a full set of working features, but you
simply cannot mix and match the two. Only one power management
interface can be in control of the machine at once. Think about it..
User-space Daemons
------------------
Both APM and ACPI rely on user-space daemons, apmd and acpid
respectively, to be completely functional. Obtain both of these
daemons from your Linux distribution or from the Internet (see below)
and be sure that they are started sometime in the system boot process.
Go ahead and start both. If ACPI or APM is not available on your
system the associated daemon will exit gracefully.
apmd: http://worldvisions.ca/~apenwarr/apmd/
acpid: http://acpid.sf.net/
Linux Power Management Support
This document briefly describes how to use power management with your
Linux system and how to add power management support to Linux drivers.
APM or ACPI?
------------
If you have a relatively recent x86 mobile, desktop, or server system,
odds are it supports either Advanced Power Management (APM) or
Advanced Configuration and Power Interface (ACPI). ACPI is the newer
of the two technologies and puts power management in the hands of the
operating system, allowing for more intelligent power management than
is possible with BIOS controlled APM.
The best way to determine which, if either, your system supports is to
build a kernel with both ACPI and APM enabled (as of 2.3.x ACPI is
enabled by default). If a working ACPI implementation is found, the
ACPI driver will override and disable APM, otherwise the APM driver
will be used.
No, sorry, you cannot have both ACPI and APM enabled and running at
once. Some people with broken ACPI or broken APM implementations
would like to use both to get a full set of working features, but you
simply cannot mix and match the two. Only one power management
interface can be in control of the machine at once. Think about it..
User-space Daemons
------------------
Both APM and ACPI rely on user-space daemons, apmd and acpid
respectively, to be completely functional. Obtain both of these
daemons from your Linux distribution or from the Internet (see below)
and be sure that they are started sometime in the system boot process.
Go ahead and start both. If ACPI or APM is not available on your
system the associated daemon will exit gracefully.
apmd: http://worldvisions.ca/~apenwarr/apmd/
acpid: http://acpid.sf.net/
Driver Interface -- OBSOLETE, DO NOT USE!
----------------*************************
Note: pm_register(), pm_access(), pm_dev_idle() and friends are
obsolete. Please do not use them. Instead you should properly hook
your driver into the driver model, and use its suspend()/resume()
callbacks to do this kind of stuff.
If you are writing a new driver or maintaining an old driver, it
should include power management support. Without power management
support, a single driver may prevent a system with power management
capabilities from ever being able to suspend (safely).
Overview:
1) Register each instance of a device with "pm_register"
2) Call "pm_access" before accessing the hardware.
(this will ensure that the hardware is awake and ready)
3) Your "pm_callback" is called before going into a
suspend state (ACPI D1-D3) or after resuming (ACPI D0)
from a suspend.
4) Call "pm_dev_idle" when the device is not being used
(optional but will improve device idle detection)
5) When unloaded, unregister the device with "pm_unregister"
/*
* Description: Register a device with the power-management subsystem
*
* Parameters:
* type - device type (PCI device, system device, ...)
* id - instance number or unique identifier
* cback - request handler callback (suspend, resume, ...)
*
* Returns: Registered PM device or NULL on error
*
* Examples:
* dev = pm_register(PM_SYS_DEV, PM_SYS_VGA, vga_callback);
*
* struct pci_dev *pci_dev = pci_find_dev(...);
* dev = pm_register(PM_PCI_DEV, PM_PCI_ID(pci_dev), callback);
*/
struct pm_dev *pm_register(pm_dev_t type, unsigned long id, pm_callback cback);
/*
* Description: Unregister a device with the power management subsystem
*
* Parameters:
* dev - PM device previously returned from pm_register
*/
void pm_unregister(struct pm_dev *dev);
/*
* Description: Unregister all devices with a matching callback function
*
* Parameters:
* cback - previously registered request callback
*
* Notes: Provided for easier porting from old APM interface
*/
void pm_unregister_all(pm_callback cback);
/*
* Power management request callback
*
* Parameters:
* dev - PM device previously returned from pm_register
* rqst - request type
* data - data, if any, associated with the request
*
* Returns: 0 if the request is successful
* EINVAL if the request is not supported
* EBUSY if the device is now busy and cannot handle the request
* ENOMEM if the device was unable to handle the request due to memory
*
* Details: The device request callback will be called before the
* device/system enters a suspend state (ACPI D1-D3) or
* or after the device/system resumes from suspend (ACPI D0).
* For PM_SUSPEND, the ACPI D-state being entered is passed
* as the "data" argument to the callback. The device
* driver should save (PM_SUSPEND) or restore (PM_RESUME)
* device context when the request callback is called.
*
* Once a driver returns 0 (success) from a suspend
* request, it should not process any further requests or
* access the device hardware until a call to "pm_access" is made.
*/
typedef int (*pm_callback)(struct pm_dev *dev, pm_request_t rqst, void *data);
Driver Details
--------------
This is just a quick Q&A as a stopgap until a real driver writers'
power management guide is available.
Q: When is a device suspended?
Devices can be suspended based on direct user request (eg. laptop lid
closes), system power policy (eg. sleep after 30 minutes of console
inactivity), or device power policy (eg. power down device after 5
minutes of inactivity)
Q: Must a driver honor a suspend request?
No, a driver can return -EBUSY from a suspend request and this
will stop the system from suspending. When a suspend request
fails, all suspended devices are resumed and the system continues
to run. Suspend can be retried at a later time.
Q: Can the driver block suspend/resume requests?
Yes, a driver can delay its return from a suspend or resume
request until the device is ready to handle requests. It
is advantageous to return as quickly as possible from a
request as suspend/resume are done serially.
Q: What context is a suspend/resume initiated from?
A suspend or resume is initiated from a kernel thread context.
It is safe to block, allocate memory, initiate requests
or anything else you can do within the kernel.
Q: Will requests continue to arrive after a suspend?
Possibly. It is the driver's responsibility to queue(*),
fail, or drop any requests that arrive after returning
success to a suspend request. It is important that the
driver not access its device until after it receives
a resume request as the device's bus may no longer
be active.
(*) If a driver queues requests for processing after
resume be aware that the device, network, etc.
might be in a different state than at suspend time.
It's probably better to drop requests unless
the driver is a storage device.
Q: Do I have to manage bus-specific power management registers
No. It is the responsibility of the bus driver to manage
PCI, USB, etc. power management registers. The bus driver
or the power management subsystem will also enable any
wake-on functionality that the device has.
Q: So, really, what do I need to do to support suspend/resume?
You need to save any device context that would
be lost if the device was powered off and then restore
it at resume time. When ACPI is active, there are
three levels of device suspend states; D1, D2, and D3.
(The suspend state is passed as the "data" argument
to the device callback.) With D3, the device is powered
off and loses all context, D1 and D2 are shallower power
states and require less device context to be saved. To
play it safe, just save everything at suspend and restore
everything at resume.
Q: Where do I store device context for suspend?
Anywhere in memory, kmalloc a buffer or store it
in the device descriptor. You are guaranteed that the
contents of memory will be restored and accessible
before resume, even when the system suspends to disk.
Q: What do I need to do for ACPI vs. APM vs. etc?
Drivers need not be aware of the specific power management
technology that is active. They just need to be aware
of when the overlying power management system requests
that they suspend or resume.
Q: What about device dependencies?
When a driver registers a device, the power management
subsystem uses the information provided to build a
tree of device dependencies (eg. USB device X is on
USB controller Y which is on PCI bus Z) When power
management wants to suspend a device, it first sends
a suspend request to its driver, then the bus driver,
and so on up to the system bus. Device resumes
proceed in the opposite direction.
Q: Who do I contact for additional information about
enabling power management for my specific driver/device?
ACPI Development mailing list: linux-acpi@vger.kernel.org
System Interface -- OBSOLETE, DO NOT USE!
----------------*************************
If you are providing new power management support to Linux (ie.
adding support for something like APM or ACPI), you should
communicate with drivers through the existing generic power
management interface.
/*
* Send a request to all devices
*
* Parameters:
* rqst - request type
* data - data, if any, associated with the request
*
* Returns: 0 if the request is successful
* See "pm_callback" return for errors
*
* Details: Walk list of registered devices and call pm_send
* for each until complete or an error is encountered.
* If an error is encountered for a suspend request,
* return all devices to the state they were in before
* the suspend request.
*/
int pm_send_all(pm_request_t rqst, void *data);
/*
* Find a matching device
*
* Parameters:
* type - device type (PCI device, system device, or 0 to match all devices)
* from - previous match or NULL to start from the beginning
*
* Returns: Matching device or NULL if none found
*/
struct pm_dev *pm_find(pm_dev_t type, struct pm_dev *from);
...@@ -89,10 +89,12 @@ Table of Contents ...@@ -89,10 +89,12 @@ Table of Contents
3) OpenPIC Interrupt Controllers 3) OpenPIC Interrupt Controllers
4) ISA Interrupt Controllers 4) ISA Interrupt Controllers
VIII - Specifying GPIO information for devices IX - Specifying GPIO information for devices
1) gpios property 1) gpios property
2) gpio-controller nodes 2) gpio-controller nodes
X - Specifying device power management information (sleep property)
Appendix A - Sample SOC node for MPC8540 Appendix A - Sample SOC node for MPC8540
...@@ -2488,8 +2490,8 @@ encodings listed below: ...@@ -2488,8 +2490,8 @@ encodings listed below:
2 = high to low edge sensitive type enabled 2 = high to low edge sensitive type enabled
3 = low to high edge sensitive type enabled 3 = low to high edge sensitive type enabled
VIII - Specifying GPIO information for devices IX - Specifying GPIO information for devices
============================================== ============================================
1) gpios property 1) gpios property
----------------- -----------------
...@@ -2537,116 +2539,151 @@ Example of two SOC GPIO banks defined as gpio-controller nodes: ...@@ -2537,116 +2539,151 @@ Example of two SOC GPIO banks defined as gpio-controller nodes:
gpio-controller; gpio-controller;
}; };
X - Specifying Device Power Management Information (sleep property)
===================================================================
Devices on SOCs often have mechanisms for placing devices into low-power
states that are decoupled from the devices' own register blocks. Sometimes,
this information is more complicated than a cell-index property can
reasonably describe. Thus, each device controlled in such a manner
may contain a "sleep" property which describes these connections.
The sleep property consists of one or more sleep resources, each of
which consists of a phandle to a sleep controller, followed by a
controller-specific sleep specifier of zero or more cells.
The semantics of what type of low power modes are possible are defined
by the sleep controller. Some examples of the types of low power modes
that may be supported are:
- Dynamic: The device may be disabled or enabled at any time.
- System Suspend: The device may request to be disabled or remain
awake during system suspend, but will not be disabled until then.
- Permanent: The device is disabled permanently (until the next hard
reset).
Some devices may share a clock domain with each other, such that they should
only be suspended when none of the devices are in use. Where reasonable,
such nodes should be placed on a virtual bus, where the bus has the sleep
property. If the clock domain is shared among devices that cannot be
reasonably grouped in this manner, then create a virtual sleep controller
(similar to an interrupt nexus, except that defining a standardized
sleep-map should wait until its necessity is demonstrated).
Appendix A - Sample SOC node for MPC8540 Appendix A - Sample SOC node for MPC8540
======================================== ========================================
Note that the #address-cells and #size-cells for the SoC node soc@e0000000 {
in this example have been explicitly listed; these are likely
not necessary as they are usually the same as the root node.
soc8540@e0000000 {
#address-cells = <1>; #address-cells = <1>;
#size-cells = <1>; #size-cells = <1>;
#interrupt-cells = <2>; compatible = "fsl,mpc8540-ccsr", "simple-bus";
device_type = "soc"; device_type = "soc";
ranges = <00000000 e0000000 00100000> ranges = <0x00000000 0xe0000000 0x00100000>
reg = <e0000000 00003000>;
bus-frequency = <0>; bus-frequency = <0>;
interrupt-parent = <&pic>;
mdio@24520 {
reg = <24520 20>;
device_type = "mdio";
compatible = "gianfar";
ethernet-phy@0 {
linux,phandle = <2452000>
interrupt-parent = <40000>;
interrupts = <35 1>;
reg = <0>;
device_type = "ethernet-phy";
};
ethernet-phy@1 {
linux,phandle = <2452001>
interrupt-parent = <40000>;
interrupts = <35 1>;
reg = <1>;
device_type = "ethernet-phy";
};
ethernet-phy@3 {
linux,phandle = <2452002>
interrupt-parent = <40000>;
interrupts = <35 1>;
reg = <3>;
device_type = "ethernet-phy";
};
};
ethernet@24000 { ethernet@24000 {
#size-cells = <0>; #address-cells = <1>;
#size-cells = <1>;
device_type = "network"; device_type = "network";
model = "TSEC"; model = "TSEC";
compatible = "gianfar"; compatible = "gianfar", "simple-bus";
reg = <24000 1000>; reg = <0x24000 0x1000>;
mac-address = [ 00 E0 0C 00 73 00 ]; local-mac-address = [ 00 E0 0C 00 73 00 ];
interrupts = <d 3 e 3 12 3>; interrupts = <29 2 30 2 34 2>;
interrupt-parent = <40000>; phy-handle = <&phy0>;
phy-handle = <2452000>; sleep = <&pmc 00000080>;
ranges;
mdio@24520 {
reg = <0x24520 0x20>;
compatible = "fsl,gianfar-mdio";
phy0: ethernet-phy@0 {
interrupts = <5 1>;
reg = <0>;
device_type = "ethernet-phy";
};
phy1: ethernet-phy@1 {
interrupts = <5 1>;
reg = <1>;
device_type = "ethernet-phy";
};
phy3: ethernet-phy@3 {
interrupts = <7 1>;
reg = <3>;
device_type = "ethernet-phy";
};
};
}; };
ethernet@25000 { ethernet@25000 {
#address-cells = <1>;
#size-cells = <0>;
device_type = "network"; device_type = "network";
model = "TSEC"; model = "TSEC";
compatible = "gianfar"; compatible = "gianfar";
reg = <25000 1000>; reg = <0x25000 0x1000>;
mac-address = [ 00 E0 0C 00 73 01 ]; local-mac-address = [ 00 E0 0C 00 73 01 ];
interrupts = <13 3 14 3 18 3>; interrupts = <13 2 14 2 18 2>;
interrupt-parent = <40000>; phy-handle = <&phy1>;
phy-handle = <2452001>; sleep = <&pmc 00000040>;
}; };
ethernet@26000 { ethernet@26000 {
#address-cells = <1>;
#size-cells = <0>;
device_type = "network"; device_type = "network";
model = "FEC"; model = "FEC";
compatible = "gianfar"; compatible = "gianfar";
reg = <26000 1000>; reg = <0x26000 0x1000>;
mac-address = [ 00 E0 0C 00 73 02 ]; local-mac-address = [ 00 E0 0C 00 73 02 ];
interrupts = <19 3>; interrupts = <41 2>;
interrupt-parent = <40000>; phy-handle = <&phy3>;
phy-handle = <2452002>; sleep = <&pmc 00000020>;
}; };
serial@4500 { serial@4500 {
device_type = "serial"; #address-cells = <1>;
compatible = "ns16550"; #size-cells = <1>;
reg = <4500 100>; compatible = "fsl,mpc8540-duart", "simple-bus";
clock-frequency = <0>; sleep = <&pmc 00000002>;
interrupts = <1a 3>; ranges;
interrupt-parent = <40000>;
serial@4500 {
device_type = "serial";
compatible = "ns16550";
reg = <0x4500 0x100>;
clock-frequency = <0>;
interrupts = <42 2>;
};
serial@4600 {
device_type = "serial";
compatible = "ns16550";
reg = <0x4600 0x100>;
clock-frequency = <0>;
interrupts = <42 2>;
};
}; };
pic@40000 { pic: pic@40000 {
linux,phandle = <40000>;
interrupt-controller; interrupt-controller;
#address-cells = <0>; #address-cells = <0>;
reg = <40000 40000>; #interrupt-cells = <2>;
reg = <0x40000 0x40000>;
compatible = "chrp,open-pic"; compatible = "chrp,open-pic";
device_type = "open-pic"; device_type = "open-pic";
}; };
i2c@3000 { i2c@3000 {
interrupt-parent = <40000>; interrupts = <43 2>;
interrupts = <1b 3>; reg = <0x3000 0x100>;
reg = <3000 18>;
device_type = "i2c";
compatible = "fsl-i2c"; compatible = "fsl-i2c";
dfsrr; dfsrr;
sleep = <&pmc 00000004>;
}; };
pmc: power@e0070 {
compatible = "fsl,mpc8540-pmc", "fsl,mpc8548-pmc";
reg = <0xe0070 0x20>;
};
}; };
Every GPIO controller node must have #gpio-cells property defined,
this information will be used to translate gpio-specifiers.
On CPM1 devices, all ports are using slightly different register layouts.
Ports A, C and D are 16bit ports and Ports B and E are 32bit ports.
On CPM2 devices, all ports are 32bit ports and use a common register layout.
Required properties:
- compatible : "fsl,cpm1-pario-bank-a", "fsl,cpm1-pario-bank-b",
"fsl,cpm1-pario-bank-c", "fsl,cpm1-pario-bank-d",
"fsl,cpm1-pario-bank-e", "fsl,cpm2-pario-bank"
- #gpio-cells : Should be two. The first cell is the pin number and the
second cell is used to specify optional paramters (currently unused).
- gpio-controller : Marks the port as GPIO controller.
Example of three SOC GPIO banks defined as gpio-controller nodes:
CPM1_PIO_A: gpio-controller@950 {
#gpio-cells = <2>;
compatible = "fsl,cpm1-pario-bank-a";
reg = <0x950 0x10>;
gpio-controller;
};
CPM1_PIO_B: gpio-controller@ab8 {
#gpio-cells = <2>;
compatible = "fsl,cpm1-pario-bank-b";
reg = <0xab8 0x10>;
gpio-controller;
};
CPM1_PIO_E: gpio-controller@ac8 {
#gpio-cells = <2>;
compatible = "fsl,cpm1-pario-bank-e";
reg = <0xac8 0x18>;
gpio-controller;
};
* USB (Universal Serial Bus Controller) Freescale QUICC Engine USB Controller
Required properties: Required properties:
- compatible : could be "qe_udc" or "fhci-hcd". - compatible : should be "fsl,<chip>-qe-usb", "fsl,mpc8323-qe-usb".
- mode : the could be "host" or "slave". - reg : the first two cells should contain usb registers location and
- reg : Offset and length of the register set for the device length, the next two two cells should contain PRAM location and
- interrupts : <a b> where a is the interrupt number and b is a length.
field that represents an encoding of the sense and level - interrupts : should contain USB interrupt.
information for the interrupt. This should be encoded based on - interrupt-parent : interrupt source phandle.
the information in section 2) depending on the type of interrupt - fsl,fullspeed-clock : specifies the full speed USB clock source:
controller you have. "none": clock source is disabled
- interrupt-parent : the phandle for the interrupt controller that "brg1" through "brg16": clock source is BRG1-BRG16, respectively
services interrupts for this device. "clk1" through "clk24": clock source is CLK1-CLK24, respectively
- fsl,lowspeed-clock : specifies the low speed USB clock source:
"none": clock source is disabled
"brg1" through "brg16": clock source is BRG1-BRG16, respectively
"clk1" through "clk24": clock source is CLK1-CLK24, respectively
- hub-power-budget : USB power budget for the root hub, in mA.
- gpios : should specify GPIOs in this order: USBOE, USBTP, USBTN, USBRP,
USBRN, SPEED (optional), and POWER (optional).
Example(slave): Example:
usb@6c0 {
compatible = "qe_udc"; usb@6c0 {
reg = <6c0 40>; compatible = "fsl,mpc8360-qe-usb", "fsl,mpc8323-qe-usb";
interrupts = <8b 0>; reg = <0x6c0 0x40 0x8b00 0x100>;
interrupt-parent = <700>; interrupts = <11>;
mode = "slave"; interrupt-parent = <&qeic>;
}; fsl,fullspeed-clock = "clk21";
gpios = <&qe_pio_b 2 0 /* USBOE */
&qe_pio_b 3 0 /* USBTP */
&qe_pio_b 8 0 /* USBTN */
&qe_pio_b 9 0 /* USBRP */
&qe_pio_b 11 0 /* USBRN */
&qe_pio_e 20 0 /* SPEED */
&qe_pio_e 21 0 /* POWER */>;
};
Freescale MPC8349E-mITX-compatible Power Management Micro Controller Unit (MCU)
Required properties:
- compatible : "fsl,<mcu-chip>-<board>", "fsl,mcu-mpc8349emitx".
- reg : should specify I2C address (0x0a).
- #gpio-cells : should be 2.
- gpio-controller : should be present.
Example:
mcu@0a {
#gpio-cells = <2>;
compatible = "fsl,mc9s08qg8-mpc8349emitx",
"fsl,mcu-mpc8349emitx";
reg = <0x0a>;
gpio-controller;
};
* Power Management Controller
Properties:
- compatible: "fsl,<chip>-pmc".
"fsl,mpc8349-pmc" should be listed for any chip whose PMC is
compatible. "fsl,mpc8313-pmc" should also be listed for any chip
whose PMC is compatible, and implies deep-sleep capability.
"fsl,mpc8548-pmc" should be listed for any chip whose PMC is
compatible. "fsl,mpc8536-pmc" should also be listed for any chip
whose PMC is compatible, and implies deep-sleep capability.
"fsl,mpc8641d-pmc" should be listed for any chip whose PMC is
compatible; all statements below that apply to "fsl,mpc8548-pmc" also
apply to "fsl,mpc8641d-pmc".
Compatibility does not include bit assigments in SCCR/PMCDR/DEVDISR; these
bit assigments are indicated via the sleep specifier in each device's
sleep property.
- reg: For devices compatible with "fsl,mpc8349-pmc", the first resource
is the PMC block, and the second resource is the Clock Configuration
block.
For devices compatible with "fsl,mpc8548-pmc", the first resource
is a 32-byte block beginning with DEVDISR.
- interrupts: For "fsl,mpc8349-pmc"-compatible devices, the first
resource is the PMC block interrupt.
- fsl,mpc8313-wakeup-timer: For "fsl,mpc8313-pmc"-compatible devices,
this is a phandle to an "fsl,gtm" node on which timer 4 can be used as
a wakeup source from deep sleep.
Sleep specifiers:
fsl,mpc8349-pmc: Sleep specifiers consist of one cell. For each bit
that is set in the cell, the corresponding bit in SCCR will be saved
and cleared on suspend, and restored on resume. This sleep controller
supports disabling and resuming devices at any time.
fsl,mpc8536-pmc: Sleep specifiers consist of three cells, the third of
which will be ORed into PMCDR upon suspend, and cleared from PMCDR
upon resume. The first two cells are as described for fsl,mpc8578-pmc.
This sleep controller only supports disabling devices during system
sleep, or permanently.
fsl,mpc8548-pmc: Sleep specifiers consist of one or two cells, the
first of which will be ORed into DEVDISR (and the second into
DEVDISR2, if present -- this cell should be zero or absent if the
hardware does not have DEVDISR2) upon a request for permanent device
disabling. This sleep controller does not support configuring devices
to disable during system sleep (unless supported by another compatible
match), or dynamically.
Example:
power@b00 {
compatible = "fsl,mpc8313-pmc", "fsl,mpc8349-pmc";
reg = <0xb00 0x100 0xa00 0x100>;
interrupts = <80 8>;
};
...@@ -24,46 +24,39 @@ Example: ...@@ -24,46 +24,39 @@ Example:
* Gianfar-compatible ethernet nodes * Gianfar-compatible ethernet nodes
Required properties: Properties:
- device_type : Should be "network" - device_type : Should be "network"
- model : Model of the device. Can be "TSEC", "eTSEC", or "FEC" - model : Model of the device. Can be "TSEC", "eTSEC", or "FEC"
- compatible : Should be "gianfar" - compatible : Should be "gianfar"
- reg : Offset and length of the register set for the device - reg : Offset and length of the register set for the device
- mac-address : List of bytes representing the ethernet address of - local-mac-address : List of bytes representing the ethernet address of
this controller this controller
- interrupts : <a b> where a is the interrupt number and b is a - interrupts : For FEC devices, the first interrupt is the device's
field that represents an encoding of the sense and level interrupt. For TSEC and eTSEC devices, the first interrupt is
information for the interrupt. This should be encoded based on transmit, the second is receive, and the third is error.
the information in section 2) depending on the type of interrupt
controller you have.
- interrupt-parent : the phandle for the interrupt controller that
services interrupts for this device.
- phy-handle : The phandle for the PHY connected to this ethernet - phy-handle : The phandle for the PHY connected to this ethernet
controller. controller.
- fixed-link : <a b c d e> where a is emulated phy id - choose any, - fixed-link : <a b c d e> where a is emulated phy id - choose any,
but unique to the all specified fixed-links, b is duplex - 0 half, but unique to the all specified fixed-links, b is duplex - 0 half,
1 full, c is link speed - d#10/d#100/d#1000, d is pause - 0 no 1 full, c is link speed - d#10/d#100/d#1000, d is pause - 0 no
pause, 1 pause, e is asym_pause - 0 no asym_pause, 1 asym_pause. pause, 1 pause, e is asym_pause - 0 no asym_pause, 1 asym_pause.
Recommended properties:
- phy-connection-type : a string naming the controller/PHY interface type, - phy-connection-type : a string naming the controller/PHY interface type,
i.e., "mii" (default), "rmii", "gmii", "rgmii", "rgmii-id", "sgmii", i.e., "mii" (default), "rmii", "gmii", "rgmii", "rgmii-id", "sgmii",
"tbi", or "rtbi". This property is only really needed if the connection "tbi", or "rtbi". This property is only really needed if the connection
is of type "rgmii-id", as all other connection types are detected by is of type "rgmii-id", as all other connection types are detected by
hardware. hardware.
- fsl,magic-packet : If present, indicates that the hardware supports
waking up via magic packet.
Example: Example:
ethernet@24000 { ethernet@24000 {
#size-cells = <0>;
device_type = "network"; device_type = "network";
model = "TSEC"; model = "TSEC";
compatible = "gianfar"; compatible = "gianfar";
reg = <24000 1000>; reg = <0x24000 0x1000>;
mac-address = [ 00 E0 0C 00 73 00 ]; local-mac-address = [ 00 E0 0C 00 73 00 ];
interrupts = <d 3 e 3 12 3>; interrupts = <29 2 30 2 34 2>;
interrupt-parent = <40000>; interrupt-parent = <&mpic>;
phy-handle = <2452000> phy-handle = <&phy0>
}; };
Freescale Localbus UPM programmed to work with NAND flash
Required properties:
- compatible : "fsl,upm-nand".
- reg : should specify localbus chip select and size used for the chip.
- fsl,upm-addr-offset : UPM pattern offset for the address latch.
- fsl,upm-cmd-offset : UPM pattern offset for the command latch.
- gpios : may specify optional GPIO connected to the Ready-Not-Busy pin.
Example:
upm@1,0 {
compatible = "fsl,upm-nand";
reg = <1 0 1>;
fsl,upm-addr-offset = <16>;
fsl,upm-cmd-offset = <8>;
gpios = <&qe_pio_e 18 0>;
flash {
#address-cells = <1>;
#size-cells = <1>;
compatible = "...";
partition@0 {
...
};
};
};
LED connected to GPIO
Required properties:
- compatible : should be "gpio-led".
- label : (optional) the label for this LED. If omitted, the label is
taken from the node name (excluding the unit address).
- gpios : should specify LED GPIO.
Example:
led@0 {
compatible = "gpio-led";
label = "hdd";
gpios = <&mcu_pio 0 1>;
};
...@@ -42,7 +42,7 @@ ...@@ -42,7 +42,7 @@
<sect1><title>Device Components</title> <sect1><title>Device Components</title>
!Esound/core/device.c !Esound/core/device.c
</sect1> </sect1>
<sect1><title>KMOD and Device File Entries</title> <sect1><title>Module requests and Device File Entries</title>
!Esound/core/sound.c !Esound/core/sound.c
</sect1> </sect1>
<sect1><title>Memory Management Helpers</title> <sect1><title>Memory Management Helpers</title>
......
...@@ -270,8 +270,8 @@ The pinout of the connectors on the IO8+ is: ...@@ -270,8 +270,8 @@ The pinout of the connectors on the IO8+ is:
Hardware handshaking issues. Hardware handshaking issues.
============================ ============================
The driver can be compiled in two different ways. The default The driver can be told to operate in two different ways. The default
("Specialix DTR/RTS pin is RTS" is off) the pin behaves as DTR when behaviour is specialix.sx_rtscts = 0 where the pin behaves as DTR when
hardware handshaking is off. It behaves as the RTS hardware hardware handshaking is off. It behaves as the RTS hardware
handshaking signal when hardware handshaking is selected. handshaking signal when hardware handshaking is selected.
...@@ -280,7 +280,7 @@ cable will either be compatible with hardware handshaking or with ...@@ -280,7 +280,7 @@ cable will either be compatible with hardware handshaking or with
software handshaking. So switching on the fly is not really an software handshaking. So switching on the fly is not really an
option. option.
I actually prefer to use the "Specialix DTR/RTS pin is RTS" option. I actually prefer to use the "specialix.sx_rtscts=1" option.
This makes the DTR/RTS pin always an RTS pin, and ioctls to This makes the DTR/RTS pin always an RTS pin, and ioctls to
change DTR are always ignored. I have a cable that is configured change DTR are always ignored. I have a cable that is configured
for this. for this.
...@@ -379,7 +379,5 @@ it doesn't fit in your computer, bring back the card. ...@@ -379,7 +379,5 @@ it doesn't fit in your computer, bring back the card.
You have to WRITE to the address register to even You have to WRITE to the address register to even
read-probe a CD186x register. Disable autodetection? read-probe a CD186x register. Disable autodetection?
-- Specialix: any suggestions? -- Specialix: any suggestions?
- Arbitrary baud rates are not implemented yet.
If you need this, bug me about it.
...@@ -3,9 +3,8 @@ Rules on how to access information in the Linux kernel sysfs ...@@ -3,9 +3,8 @@ Rules on how to access information in the Linux kernel sysfs
The kernel-exported sysfs exports internal kernel implementation details The kernel-exported sysfs exports internal kernel implementation details
and depends on internal kernel structures and layout. It is agreed upon and depends on internal kernel structures and layout. It is agreed upon
by the kernel developers that the Linux kernel does not provide a stable by the kernel developers that the Linux kernel does not provide a stable
internal API. As sysfs is a direct export of kernel internal internal API. Therefore, there are aspects of the sysfs interface that
structures, the sysfs interface cannot provide a stable interface either; may not be stable across kernel releases.
it may always change along with internal kernel changes.
To minimize the risk of breaking users of sysfs, which are in most cases To minimize the risk of breaking users of sysfs, which are in most cases
low-level userspace applications, with a new kernel release, the users low-level userspace applications, with a new kernel release, the users
......
...@@ -305,21 +305,14 @@ driver, like this: ...@@ -305,21 +305,14 @@ driver, like this:
which will result in the needed drivers getting loaded automatically. which will result in the needed drivers getting loaded automatically.
g. if you are planning on using kerneld to automatically load the g. if you are planning on having the kernel automatically request
module for you, then you need to edit /etc/conf.modules and add the the module for you, then you need to edit /etc/conf.modules and add the
following lines: following lines:
options ixj dspio=0x340 xio=0x330 ixjdebug=0 options ixj dspio=0x340 xio=0x330 ixjdebug=0
If you do this, then when you execute an application that uses the If you do this, then when you execute an application that uses the
module kerneld will load the module for you. Note that to do this, module the kernel will request that it is loaded.
you need to have your kernel set to support kerneld. You can check
for this by looking at /usr/src/linux/.config and you should see this:
# Loadable module support
#
<snip>
CONFIG_KMOD=y
h. if you want non-root users to be able to read and write to the h. if you want non-root users to be able to read and write to the
ixj devices (this is a good idea!) you should do the following: ixj devices (this is a good idea!) you should do the following:
......
...@@ -193,9 +193,6 @@ Description: Automatic 'ovcamchip' module loading: 0 disabled, 1 enabled. ...@@ -193,9 +193,6 @@ Description: Automatic 'ovcamchip' module loading: 0 disabled, 1 enabled.
loads that module automatically. This action is performed as loads that module automatically. This action is performed as
once soon as the 'w9968cf' module is loaded into memory. once soon as the 'w9968cf' module is loaded into memory.
Default: 1 Default: 1
Note: The kernel must be compiled with the CONFIG_KMOD option
enabled for the 'ovcamchip' module to be loaded and for
this parameter to be present.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Name: simcams Name: simcams
Type: int Type: int
......
...@@ -95,6 +95,29 @@ this condition holds, however, no more surplus huge pages will be ...@@ -95,6 +95,29 @@ this condition holds, however, no more surplus huge pages will be
allowed on the system until one of the two sysctls are increased allowed on the system until one of the two sysctls are increased
sufficiently, or the surplus huge pages go out of use and are freed. sufficiently, or the surplus huge pages go out of use and are freed.
With support for multiple hugepage pools at run-time available, much of
the hugepage userspace interface has been duplicated in sysfs. The above
information applies to the default hugepage size (which will be
controlled by the proc interfaces for backwards compatibility). The root
hugepage control directory is
/sys/kernel/mm/hugepages
For each hugepage size supported by the running kernel, a subdirectory
will exist, of the form
hugepages-${size}kB
Inside each of these directories, the same set of files will exist:
nr_hugepages
nr_overcommit_hugepages
free_hugepages
resv_hugepages
surplus_hugepages
which function as described above for the default hugepage-sized case.
If the user applications are going to request hugepages using mmap system If the user applications are going to request hugepages using mmap system
call, then it is required that system administrator mount a file system of call, then it is required that system administrator mount a file system of
type hugetlbfs: type hugetlbfs:
......
...@@ -441,10 +441,7 @@ M: spyro@f2s.com ...@@ -441,10 +441,7 @@ M: spyro@f2s.com
S: Maintained S: Maintained
ARM PRIMECELL MMCI PL180/1 DRIVER ARM PRIMECELL MMCI PL180/1 DRIVER
P: Russell King S: Orphan
M: rmk@arm.linux.org.uk
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
S: Maintained
ARM/ADI ROADRUNNER MACHINE SUPPORT ARM/ADI ROADRUNNER MACHINE SUPPORT
P: Lennert Buytenhek P: Lennert Buytenhek
...@@ -483,11 +480,28 @@ M: kernel@wantstofly.org ...@@ -483,11 +480,28 @@ M: kernel@wantstofly.org
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only) L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
S: Maintained S: Maintained
ARM/COMPULAB CM-X270/EM-X270 MACHINE SUPPORT
P: Mike Rapoport
M: mike@compulab.co.il
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
S: Maintained
ARM/CORGI MACHINE SUPPORT ARM/CORGI MACHINE SUPPORT
P: Richard Purdie P: Richard Purdie
M: rpurdie@rpsys.net M: rpurdie@rpsys.net
S: Maintained S: Maintained
ARM/EZX SMARTPHONES (A780, A910, A1200, E680, ROKR E2 and ROKR E6)
P: Daniel Ribeiro
M: drwyrm@gmail.com
P: Stefan Schmidt
M: stefan@openezx.org
P: Harald Welte
M: laforge@openezx.org
L: openezx-devel@lists.openezx.org (subscribers-only)
W: http://www.openezx.org/
S: Maintained
ARM/GLOMATION GESBC9312SX MACHINE SUPPORT ARM/GLOMATION GESBC9312SX MACHINE SUPPORT
P: Lennert Buytenhek P: Lennert Buytenhek
M: kernel@wantstofly.org M: kernel@wantstofly.org
...@@ -575,10 +589,18 @@ L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only) ...@@ -575,10 +589,18 @@ L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
S: Maintained S: Maintained
ARM/TOSA MACHINE SUPPORT ARM/TOSA MACHINE SUPPORT
P: Dmitry Baryshkov
M: dbaryshkov@gmail.com
P: Dirk Opfer P: Dirk Opfer
M: dirk@opfer-online.de M: dirk@opfer-online.de
S: Maintained S: Maintained
ARM/PALMTX SUPPORT
P: Marek Vasut
M: marek.vasut@gmail.com
W: http://hackndev.com
S: Maintained
ARM/PLEB SUPPORT ARM/PLEB SUPPORT
P: Peter Chubb P: Peter Chubb
M: pleb@gelato.unsw.edu.au M: pleb@gelato.unsw.edu.au
...@@ -1962,7 +1984,7 @@ P: Carlos Corbacho ...@@ -1962,7 +1984,7 @@ P: Carlos Corbacho
M: carlos@strangeworlds.co.uk M: carlos@strangeworlds.co.uk
S: Odd Fixes S: Odd Fixes
HPET: High Precision Event Timers driver (hpet.c) HPET: High Precision Event Timers driver (drivers/char/hpet.c)
P: Clemens Ladisch P: Clemens Ladisch
M: clemens@ladisch.de M: clemens@ladisch.de
S: Maintained S: Maintained
...@@ -2915,8 +2937,6 @@ P: Faisal Latif ...@@ -2915,8 +2937,6 @@ P: Faisal Latif
M: flatif@neteffect.com M: flatif@neteffect.com
P: Chien Tung P: Chien Tung
M: ctung@neteffect.com M: ctung@neteffect.com
P: Glenn Streiff
M: gstreiff@neteffect.com
L: general@lists.openfabrics.org L: general@lists.openfabrics.org
W: http://www.neteffect.com W: http://www.neteffect.com
S: Supported S: Supported
...@@ -3533,7 +3553,7 @@ S: Supported ...@@ -3533,7 +3553,7 @@ S: Supported
S390 NETWORK DRIVERS S390 NETWORK DRIVERS
P: Ursula Braun P: Ursula Braun
M: ubraun@linux.vnet.ibm.com M: ursula.braun@de.ibm.com
P: Frank Blaschka P: Frank Blaschka
M: blaschka@linux.vnet.ibm.com M: blaschka@linux.vnet.ibm.com
M: linux390@de.ibm.com M: linux390@de.ibm.com
...@@ -3553,7 +3573,7 @@ S: Supported ...@@ -3553,7 +3573,7 @@ S: Supported
S390 IUCV NETWORK LAYER S390 IUCV NETWORK LAYER
P: Ursula Braun P: Ursula Braun
M: ubraun@linux.vnet.ibm.com M: ursula.braun@de.ibm.com
M: linux390@de.ibm.com M: linux390@de.ibm.com
L: linux-s390@vger.kernel.org L: linux-s390@vger.kernel.org
W: http://www.ibm.com/developerworks/linux/linux390/ W: http://www.ibm.com/developerworks/linux/linux390/
...@@ -4047,9 +4067,10 @@ W: http://www.buzzard.org.uk/toshiba/ ...@@ -4047,9 +4067,10 @@ W: http://www.buzzard.org.uk/toshiba/
S: Maintained S: Maintained
TPM DEVICE DRIVER TPM DEVICE DRIVER
P: Debora Velarde P: Debora Velarde
P: Rajiv Andrade M: debora@linux.vnet.ibm.com
M: tpmdd-devel@lists.sourceforge.net P: Rajiv Andrade
M: srajiv@linux.vnet.ibm.com
W: http://tpmdd.sourceforge.net W: http://tpmdd.sourceforge.net
P: Marcel Selhorst P: Marcel Selhorst
M: tpm@selhorst.net M: tpm@selhorst.net
...@@ -4057,12 +4078,6 @@ W: http://www.prosec.rub.de/tpm/ ...@@ -4057,12 +4078,6 @@ W: http://www.prosec.rub.de/tpm/
L: tpmdd-devel@lists.sourceforge.net L: tpmdd-devel@lists.sourceforge.net
S: Maintained S: Maintained
TRIDENT 4DWAVE/SIS 7018 PCI AUDIO CORE
P: Muli Ben-Yehuda
M: mulix@mulix.org
L: linux-kernel@vger.kernel.org
S: Maintained
TRIVIAL PATCHES TRIVIAL PATCHES
P: Jesper Juhl P: Jesper Juhl
M: trivial@kernel.org M: trivial@kernel.org
...@@ -4108,9 +4123,6 @@ W: http://www.uclinux.org/ ...@@ -4108,9 +4123,6 @@ W: http://www.uclinux.org/
L: uclinux-dev@uclinux.org (subscribers-only) L: uclinux-dev@uclinux.org (subscribers-only)
S: Maintained S: Maintained
UCLINUX FOR NEC V850
P: Miles Bader
UCLINUX FOR RENESAS H8/300 UCLINUX FOR RENESAS H8/300
P: Yoshinori Sato P: Yoshinori Sato
M: ysato@users.sourceforge.jp M: ysato@users.sourceforge.jp
......
...@@ -1148,7 +1148,8 @@ clean: archclean $(clean-dirs) ...@@ -1148,7 +1148,8 @@ clean: archclean $(clean-dirs)
@find . $(RCS_FIND_IGNORE) \ @find . $(RCS_FIND_IGNORE) \
\( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \ \( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \
-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \ -o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
-o -name '*.symtypes' -o -name 'modules.order' \) \ -o -name '*.symtypes' -o -name 'modules.order' \
-o -name 'Module.markers' \) \
-type f -print | xargs rm -f -type f -print | xargs rm -f
# mrproper - Delete all generated files, including .config # mrproper - Delete all generated files, including .config
......
...@@ -31,6 +31,9 @@ config KRETPROBES ...@@ -31,6 +31,9 @@ config KRETPROBES
def_bool y def_bool y
depends on KPROBES && HAVE_KRETPROBES depends on KPROBES && HAVE_KRETPROBES
config HAVE_IOREMAP_PROT
def_bool n
config HAVE_KPROBES config HAVE_KPROBES
def_bool n def_bool n
...@@ -42,3 +45,10 @@ config HAVE_DMA_ATTRS ...@@ -42,3 +45,10 @@ config HAVE_DMA_ATTRS
config USE_GENERIC_SMP_HELPERS config USE_GENERIC_SMP_HELPERS
def_bool n def_bool n
config HAVE_CLK
def_bool n
help
The <linux/clk.h> calls support software clock gating and
thus are a key power management tool on many systems.
...@@ -333,11 +333,6 @@ config PCI_SYSCALL ...@@ -333,11 +333,6 @@ config PCI_SYSCALL
config IOMMU_HELPER config IOMMU_HELPER
def_bool PCI def_bool PCI
config ALPHA_CORE_AGP
bool
depends on ALPHA_GENERIC || ALPHA_TITAN || ALPHA_MARVEL
default y
config ALPHA_NONAME config ALPHA_NONAME
bool bool
depends on ALPHA_BOOK1 || ALPHA_NONAME_CH depends on ALPHA_BOOK1 || ALPHA_NONAME_CH
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
#include <asm/pgalloc.h> #include <asm/pgalloc.h>
pg_data_t node_data[MAX_NUMNODES]; pg_data_t node_data[MAX_NUMNODES];
bootmem_data_t node_bdata[MAX_NUMNODES];
EXPORT_SYMBOL(node_data); EXPORT_SYMBOL(node_data);
#undef DEBUG_DISCONTIG #undef DEBUG_DISCONTIG
...@@ -141,7 +140,7 @@ setup_memory_node(int nid, void *kernel_end) ...@@ -141,7 +140,7 @@ setup_memory_node(int nid, void *kernel_end)
printk(" not enough mem to reserve NODE_DATA"); printk(" not enough mem to reserve NODE_DATA");
return; return;
} }
NODE_DATA(nid)->bdata = &node_bdata[nid]; NODE_DATA(nid)->bdata = &bootmem_node_data[nid];
printk(" Detected node memory: start %8lu, end %8lu\n", printk(" Detected node memory: start %8lu, end %8lu\n",
node_min_pfn, node_max_pfn); node_min_pfn, node_max_pfn);
...@@ -304,8 +303,9 @@ void __init paging_init(void) ...@@ -304,8 +303,9 @@ void __init paging_init(void)
dma_local_pfn = virt_to_phys((char *)MAX_DMA_ADDRESS) >> PAGE_SHIFT; dma_local_pfn = virt_to_phys((char *)MAX_DMA_ADDRESS) >> PAGE_SHIFT;
for_each_online_node(nid) { for_each_online_node(nid) {
unsigned long start_pfn = node_bdata[nid].node_boot_start >> PAGE_SHIFT; bootmem_data_t *bdata = &bootmem_node_data[nid];
unsigned long end_pfn = node_bdata[nid].node_low_pfn; unsigned long start_pfn = bdata->node_min_pfn;
unsigned long end_pfn = bdata->node_low_pfn;
if (dma_local_pfn >= end_pfn - start_pfn) if (dma_local_pfn >= end_pfn - start_pfn)
zones_size[ZONE_DMA] = end_pfn - start_pfn; zones_size[ZONE_DMA] = end_pfn - start_pfn;
...@@ -313,7 +313,7 @@ void __init paging_init(void) ...@@ -313,7 +313,7 @@ void __init paging_init(void)
zones_size[ZONE_DMA] = dma_local_pfn; zones_size[ZONE_DMA] = dma_local_pfn;
zones_size[ZONE_NORMAL] = (end_pfn - start_pfn) - dma_local_pfn; zones_size[ZONE_NORMAL] = (end_pfn - start_pfn) - dma_local_pfn;
} }
free_area_init_node(nid, NODE_DATA(nid), zones_size, start_pfn, NULL); free_area_init_node(nid, zones_size, start_pfn, NULL);
} }
/* Initialize the kernel's ZERO_PGE. */ /* Initialize the kernel's ZERO_PGE. */
......
...@@ -12,6 +12,7 @@ config ARM ...@@ -12,6 +12,7 @@ config ARM
select RTC_LIB select RTC_LIB
select SYS_SUPPORTS_APM_EMULATION select SYS_SUPPORTS_APM_EMULATION
select HAVE_OPROFILE select HAVE_OPROFILE
select HAVE_ARCH_KGDB
select HAVE_KPROBES if (!XIP_KERNEL) select HAVE_KPROBES if (!XIP_KERNEL)
select HAVE_KRETPROBES if (HAVE_KPROBES) select HAVE_KRETPROBES if (HAVE_KPROBES)
select HAVE_FTRACE if (!XIP_KERNEL) select HAVE_FTRACE if (!XIP_KERNEL)
...@@ -197,12 +198,14 @@ choice ...@@ -197,12 +198,14 @@ choice
config ARCH_AAEC2000 config ARCH_AAEC2000
bool "Agilent AAEC-2000 based" bool "Agilent AAEC-2000 based"
select ARM_AMBA select ARM_AMBA
select HAVE_CLK
help help
This enables support for systems based on the Agilent AAEC-2000 This enables support for systems based on the Agilent AAEC-2000
config ARCH_INTEGRATOR config ARCH_INTEGRATOR
bool "ARM Ltd. Integrator family" bool "ARM Ltd. Integrator family"
select ARM_AMBA select ARM_AMBA
select HAVE_CLK
select ICST525 select ICST525
help help
Support for ARM's Integrator platform. Support for ARM's Integrator platform.
...@@ -210,6 +213,7 @@ config ARCH_INTEGRATOR ...@@ -210,6 +213,7 @@ config ARCH_INTEGRATOR
config ARCH_REALVIEW config ARCH_REALVIEW
bool "ARM Ltd. RealView family" bool "ARM Ltd. RealView family"
select ARM_AMBA select ARM_AMBA
select HAVE_CLK
select ICST307 select ICST307
select GENERIC_TIME select GENERIC_TIME
select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS
...@@ -220,6 +224,7 @@ config ARCH_VERSATILE ...@@ -220,6 +224,7 @@ config ARCH_VERSATILE
bool "ARM Ltd. Versatile family" bool "ARM Ltd. Versatile family"
select ARM_AMBA select ARM_AMBA
select ARM_VIC select ARM_VIC
select HAVE_CLK
select ICST307 select ICST307
select GENERIC_TIME select GENERIC_TIME
select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS
...@@ -261,6 +266,8 @@ config ARCH_EP93XX ...@@ -261,6 +266,8 @@ config ARCH_EP93XX
select ARM_AMBA select ARM_AMBA
select ARM_VIC select ARM_VIC
select GENERIC_GPIO select GENERIC_GPIO
select HAVE_CLK
select HAVE_CLK
select HAVE_GPIO_LIB select HAVE_GPIO_LIB
help help
This enables support for the Cirrus EP93xx series of CPUs. This enables support for the Cirrus EP93xx series of CPUs.
...@@ -380,6 +387,7 @@ config ARCH_NS9XXX ...@@ -380,6 +387,7 @@ config ARCH_NS9XXX
select GENERIC_GPIO select GENERIC_GPIO
select GENERIC_TIME select GENERIC_TIME
select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS
select HAVE_CLK
help help
Say Y here if you intend to run this kernel on a NetSilicon NS9xxx Say Y here if you intend to run this kernel on a NetSilicon NS9xxx
System. System.
...@@ -429,6 +437,7 @@ config ARCH_ORION5X ...@@ -429,6 +437,7 @@ config ARCH_ORION5X
config ARCH_PNX4008 config ARCH_PNX4008
bool "Philips Nexperia PNX4008 Mobile" bool "Philips Nexperia PNX4008 Mobile"
select HAVE_CLK
help help
This enables support for Philips PNX4008 mobile platform. This enables support for Philips PNX4008 mobile platform.
...@@ -437,6 +446,7 @@ config ARCH_PXA ...@@ -437,6 +446,7 @@ config ARCH_PXA
depends on MMU depends on MMU
select ARCH_MTD_XIP select ARCH_MTD_XIP
select GENERIC_GPIO select GENERIC_GPIO
select HAVE_CLK
select HAVE_GPIO_LIB select HAVE_GPIO_LIB
select GENERIC_TIME select GENERIC_TIME
select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS
...@@ -467,6 +477,7 @@ config ARCH_SA1100 ...@@ -467,6 +477,7 @@ config ARCH_SA1100
select GENERIC_GPIO select GENERIC_GPIO
select GENERIC_TIME select GENERIC_TIME
select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS
select HAVE_CLK
select TICK_ONESHOT select TICK_ONESHOT
select HAVE_GPIO_LIB select HAVE_GPIO_LIB
help help
...@@ -475,6 +486,7 @@ config ARCH_SA1100 ...@@ -475,6 +486,7 @@ config ARCH_SA1100
config ARCH_S3C2410 config ARCH_S3C2410
bool "Samsung S3C2410, S3C2412, S3C2413, S3C2440, S3C2442, S3C2443" bool "Samsung S3C2410, S3C2412, S3C2413, S3C2440, S3C2442, S3C2443"
select GENERIC_GPIO select GENERIC_GPIO
select HAVE_CLK
help help
Samsung S3C2410X CPU based systems, such as the Simtec Electronics Samsung S3C2410X CPU based systems, such as the Simtec Electronics
BAST (<http://www.simtec.co.uk/products/EB110ITX/>), the IPAQ 1940 or BAST (<http://www.simtec.co.uk/products/EB110ITX/>), the IPAQ 1940 or
...@@ -502,12 +514,14 @@ config ARCH_DAVINCI ...@@ -502,12 +514,14 @@ config ARCH_DAVINCI
select GENERIC_TIME select GENERIC_TIME
select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS
select GENERIC_GPIO select GENERIC_GPIO
select HAVE_CLK
help help
Support for TI's DaVinci platform. Support for TI's DaVinci platform.
config ARCH_OMAP config ARCH_OMAP
bool "TI OMAP" bool "TI OMAP"
select GENERIC_GPIO select GENERIC_GPIO
select HAVE_CLK
select HAVE_GPIO_LIB select HAVE_GPIO_LIB
select GENERIC_TIME select GENERIC_TIME
select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS
......
...@@ -554,9 +554,8 @@ dmabounce_register_dev(struct device *dev, unsigned long small_buffer_size, ...@@ -554,9 +554,8 @@ dmabounce_register_dev(struct device *dev, unsigned long small_buffer_size,
device_info = kmalloc(sizeof(struct dmabounce_device_info), GFP_ATOMIC); device_info = kmalloc(sizeof(struct dmabounce_device_info), GFP_ATOMIC);
if (!device_info) { if (!device_info) {
printk(KERN_ERR dev_err(dev,
"Could not allocated dmabounce_device_info for %s", "Could not allocated dmabounce_device_info\n");
dev->bus_id);
return -ENOMEM; return -ENOMEM;
} }
...@@ -594,8 +593,7 @@ dmabounce_register_dev(struct device *dev, unsigned long small_buffer_size, ...@@ -594,8 +593,7 @@ dmabounce_register_dev(struct device *dev, unsigned long small_buffer_size,
dev->archdata.dmabounce = device_info; dev->archdata.dmabounce = device_info;
printk(KERN_INFO "dmabounce: registered device %s on %s bus\n", dev_info(dev, "dmabounce: registered device\n");
dev->bus_id, dev->bus->name);
return 0; return 0;
...@@ -614,16 +612,15 @@ dmabounce_unregister_dev(struct device *dev) ...@@ -614,16 +612,15 @@ dmabounce_unregister_dev(struct device *dev)
dev->archdata.dmabounce = NULL; dev->archdata.dmabounce = NULL;
if (!device_info) { if (!device_info) {
printk(KERN_WARNING dev_warn(dev,
"%s: Never registered with dmabounce but attempting" \ "Never registered with dmabounce but attempting"
"to unregister!\n", dev->bus_id); "to unregister!\n");
return; return;
} }
if (!list_empty(&device_info->safe_buffers)) { if (!list_empty(&device_info->safe_buffers)) {
printk(KERN_ERR dev_err(dev,
"%s: Removing from dmabounce with pending buffers!\n", "Removing from dmabounce with pending buffers!\n");
dev->bus_id);
BUG(); BUG();
} }
...@@ -639,8 +636,7 @@ dmabounce_unregister_dev(struct device *dev) ...@@ -639,8 +636,7 @@ dmabounce_unregister_dev(struct device *dev)
kfree(device_info); kfree(device_info);
printk(KERN_INFO "dmabounce: device %s on %s bus unregistered\n", dev_info(dev, "dmabounce: device unregistered\n");
dev->bus_id, dev->bus->name);
} }
......
...@@ -543,7 +543,6 @@ locomo_init_one_child(struct locomo *lchip, struct locomo_dev_info *info) ...@@ -543,7 +543,6 @@ locomo_init_one_child(struct locomo *lchip, struct locomo_dev_info *info)
goto out; goto out;
} }
strncpy(dev->dev.bus_id, info->name, sizeof(dev->dev.bus_id));
/* /*
* If the parent device has a DMA mask associated with it, * If the parent device has a DMA mask associated with it,
* propagate it down to the children. * propagate it down to the children.
...@@ -553,6 +552,7 @@ locomo_init_one_child(struct locomo *lchip, struct locomo_dev_info *info) ...@@ -553,6 +552,7 @@ locomo_init_one_child(struct locomo *lchip, struct locomo_dev_info *info)
dev->dev.dma_mask = &dev->dma_mask; dev->dev.dma_mask = &dev->dma_mask;
} }
dev_set_name(&dev->dev, "%s", info->name);
dev->devid = info->devid; dev->devid = info->devid;
dev->dev.parent = lchip->dev; dev->dev.parent = lchip->dev;
dev->dev.bus = &locomo_bus_type; dev->dev.bus = &locomo_bus_type;
......
...@@ -550,9 +550,7 @@ sa1111_init_one_child(struct sa1111 *sachip, struct resource *parent, ...@@ -550,9 +550,7 @@ sa1111_init_one_child(struct sa1111 *sachip, struct resource *parent,
goto out; goto out;
} }
snprintf(dev->dev.bus_id, sizeof(dev->dev.bus_id), dev_set_name(&dev->dev, "%4.4lx", info->offset);
"%4.4lx", info->offset);
dev->devid = info->devid; dev->devid = info->devid;
dev->dev.parent = sachip->dev; dev->dev.parent = sachip->dev;
dev->dev.bus = &sa1111_bus_type; dev->dev.bus = &sa1111_bus_type;
...@@ -560,7 +558,7 @@ sa1111_init_one_child(struct sa1111 *sachip, struct resource *parent, ...@@ -560,7 +558,7 @@ sa1111_init_one_child(struct sa1111 *sachip, struct resource *parent,
dev->dev.coherent_dma_mask = sachip->dev->coherent_dma_mask; dev->dev.coherent_dma_mask = sachip->dev->coherent_dma_mask;
dev->res.start = sachip->phys + info->offset; dev->res.start = sachip->phys + info->offset;
dev->res.end = dev->res.start + 511; dev->res.end = dev->res.start + 511;
dev->res.name = dev->dev.bus_id; dev->res.name = dev_name(&dev->dev);
dev->res.flags = IORESOURCE_MEM; dev->res.flags = IORESOURCE_MEM;
dev->mapbase = sachip->base + info->offset; dev->mapbase = sachip->base + info->offset;
dev->skpcr_mask = info->skpcr_mask; dev->skpcr_mask = info->skpcr_mask;
...@@ -570,6 +568,7 @@ sa1111_init_one_child(struct sa1111 *sachip, struct resource *parent, ...@@ -570,6 +568,7 @@ sa1111_init_one_child(struct sa1111 *sachip, struct resource *parent,
if (ret) { if (ret) {
printk("SA1111: failed to allocate resource for %s\n", printk("SA1111: failed to allocate resource for %s\n",
dev->res.name); dev->res.name);
dev_set_name(&dev->dev, NULL);
kfree(dev); kfree(dev);
goto out; goto out;
} }
...@@ -593,7 +592,8 @@ sa1111_init_one_child(struct sa1111 *sachip, struct resource *parent, ...@@ -593,7 +592,8 @@ sa1111_init_one_child(struct sa1111 *sachip, struct resource *parent,
if (dev->dma_mask != 0xffffffffUL) { if (dev->dma_mask != 0xffffffffUL) {
ret = dmabounce_register_dev(&dev->dev, 1024, 4096); ret = dmabounce_register_dev(&dev->dev, 1024, 4096);
if (ret) { if (ret) {
printk("SA1111: Failed to register %s with dmabounce", dev->dev.bus_id); dev_err(&dev->dev, "SA1111: Failed to register"
" with dmabounce\n");
device_unregister(&dev->dev); device_unregister(&dev->dev);
} }
} }
...@@ -627,7 +627,7 @@ __sa1111_probe(struct device *me, struct resource *mem, int irq) ...@@ -627,7 +627,7 @@ __sa1111_probe(struct device *me, struct resource *mem, int irq)
if (!sachip) if (!sachip)
return -ENOMEM; return -ENOMEM;
sachip->clk = clk_get(me, "GPIO27_CLK"); sachip->clk = clk_get(me, "SA1111_CLK");
if (!sachip->clk) { if (!sachip->clk) {
ret = PTR_ERR(sachip->clk); ret = PTR_ERR(sachip->clk);
goto err_free; goto err_free;
......
...@@ -247,7 +247,7 @@ static int __devinit scoop_probe(struct platform_device *pdev) ...@@ -247,7 +247,7 @@ static int __devinit scoop_probe(struct platform_device *pdev)
devptr->gpio.base = -1; devptr->gpio.base = -1;
if (inf->gpio_base != 0) { if (inf->gpio_base != 0) {
devptr->gpio.label = pdev->dev.bus_id; devptr->gpio.label = dev_name(&pdev->dev);
devptr->gpio.base = inf->gpio_base; devptr->gpio.base = inf->gpio_base;
devptr->gpio.ngpio = 12; /* PA11 = 0, PA12 = 1, etc. up to PA22 = 11 */ devptr->gpio.ngpio = 12; /* PA11 = 0, PA12 = 1, etc. up to PA22 = 11 */
devptr->gpio.set = scoop_gpio_set; devptr->gpio.set = scoop_gpio_set;
......
此差异已折叠。
...@@ -28,6 +28,7 @@ obj-$(CONFIG_KPROBES) += kprobes.o kprobes-decode.o ...@@ -28,6 +28,7 @@ obj-$(CONFIG_KPROBES) += kprobes.o kprobes-decode.o
obj-$(CONFIG_ATAGS_PROC) += atags.o obj-$(CONFIG_ATAGS_PROC) += atags.o
obj-$(CONFIG_OABI_COMPAT) += sys_oabi-compat.o obj-$(CONFIG_OABI_COMPAT) += sys_oabi-compat.o
obj-$(CONFIG_ARM_THUMBEE) += thumbee.o obj-$(CONFIG_ARM_THUMBEE) += thumbee.o
obj-$(CONFIG_KGDB) += kgdb.o
obj-$(CONFIG_CRUNCH) += crunch.o crunch-bits.o obj-$(CONFIG_CRUNCH) += crunch.o crunch-bits.o
AFLAGS_crunch-bits.o := -Wa,-mcpu=ep9312 AFLAGS_crunch-bits.o := -Wa,-mcpu=ep9312
......
...@@ -783,7 +783,7 @@ static void ecard_proc_init(void) ...@@ -783,7 +783,7 @@ static void ecard_proc_init(void)
#define ec_set_resource(ec,nr,st,sz) \ #define ec_set_resource(ec,nr,st,sz) \
do { \ do { \
(ec)->resource[nr].name = ec->dev.bus_id; \ (ec)->resource[nr].name = dev_name(&ec->dev); \
(ec)->resource[nr].start = st; \ (ec)->resource[nr].start = st; \
(ec)->resource[nr].end = (st) + (sz) - 1; \ (ec)->resource[nr].end = (st) + (sz) - 1; \
(ec)->resource[nr].flags = IORESOURCE_MEM; \ (ec)->resource[nr].flags = IORESOURCE_MEM; \
...@@ -853,8 +853,7 @@ static struct expansion_card *__init ecard_alloc_card(int type, int slot) ...@@ -853,8 +853,7 @@ static struct expansion_card *__init ecard_alloc_card(int type, int slot)
for (i = 0; i < ECARD_NUM_RESOURCES; i++) { for (i = 0; i < ECARD_NUM_RESOURCES; i++) {
if (ec->resource[i].flags && if (ec->resource[i].flags &&
request_resource(&iomem_resource, &ec->resource[i])) { request_resource(&iomem_resource, &ec->resource[i])) {
printk(KERN_ERR "%s: resource(s) not available\n", dev_err(&ec->dev, "resource(s) not available\n");
ec->dev.bus_id);
ec->resource[i].end -= ec->resource[i].start; ec->resource[i].end -= ec->resource[i].start;
ec->resource[i].start = 0; ec->resource[i].start = 0;
ec->resource[i].flags = 0; ec->resource[i].flags = 0;
......
/*
* arch/arm/kernel/kgdb.c
*
* ARM KGDB support
*
* Copyright (c) 2002-2004 MontaVista Software, Inc
* Copyright (c) 2008 Wind River Systems, Inc.
*
* Authors: George Davis <davis_g@mvista.com>
* Deepak Saxena <dsaxena@plexity.net>
*/
#include <linux/kgdb.h>
#include <asm/traps.h>
/* Make a local copy of the registers passed into the handler (bletch) */
void pt_regs_to_gdb_regs(unsigned long *gdb_regs, struct pt_regs *kernel_regs)
{
int regno;
/* Initialize all to zero. */
for (regno = 0; regno < GDB_MAX_REGS; regno++)
gdb_regs[regno] = 0;
gdb_regs[_R0] = kernel_regs->ARM_r0;
gdb_regs[_R1] = kernel_regs->ARM_r1;
gdb_regs[_R2] = kernel_regs->ARM_r2;
gdb_regs[_R3] = kernel_regs->ARM_r3;
gdb_regs[_R4] = kernel_regs->ARM_r4;
gdb_regs[_R5] = kernel_regs->ARM_r5;
gdb_regs[_R6] = kernel_regs->ARM_r6;
gdb_regs[_R7] = kernel_regs->ARM_r7;
gdb_regs[_R8] = kernel_regs->ARM_r8;
gdb_regs[_R9] = kernel_regs->ARM_r9;
gdb_regs[_R10] = kernel_regs->ARM_r10;
gdb_regs[_FP] = kernel_regs->ARM_fp;
gdb_regs[_IP] = kernel_regs->ARM_ip;
gdb_regs[_SPT] = kernel_regs->ARM_sp;
gdb_regs[_LR] = kernel_regs->ARM_lr;
gdb_regs[_PC] = kernel_regs->ARM_pc;
gdb_regs[_CPSR] = kernel_regs->ARM_cpsr;
}
/* Copy local gdb registers back to kgdb regs, for later copy to kernel */
void gdb_regs_to_pt_regs(unsigned long *gdb_regs, struct pt_regs *kernel_regs)
{
kernel_regs->ARM_r0 = gdb_regs[_R0];
kernel_regs->ARM_r1 = gdb_regs[_R1];
kernel_regs->ARM_r2 = gdb_regs[_R2];
kernel_regs->ARM_r3 = gdb_regs[_R3];
kernel_regs->ARM_r4 = gdb_regs[_R4];
kernel_regs->ARM_r5 = gdb_regs[_R5];
kernel_regs->ARM_r6 = gdb_regs[_R6];
kernel_regs->ARM_r7 = gdb_regs[_R7];
kernel_regs->ARM_r8 = gdb_regs[_R8];
kernel_regs->ARM_r9 = gdb_regs[_R9];
kernel_regs->ARM_r10 = gdb_regs[_R10];
kernel_regs->ARM_fp = gdb_regs[_FP];
kernel_regs->ARM_ip = gdb_regs[_IP];
kernel_regs->ARM_sp = gdb_regs[_SPT];
kernel_regs->ARM_lr = gdb_regs[_LR];
kernel_regs->ARM_pc = gdb_regs[_PC];
kernel_regs->ARM_cpsr = gdb_regs[_CPSR];
}
void
sleeping_thread_to_gdb_regs(unsigned long *gdb_regs, struct task_struct *task)
{
struct pt_regs *thread_regs;
int regno;
/* Just making sure... */
if (task == NULL)
return;
/* Initialize to zero */
for (regno = 0; regno < GDB_MAX_REGS; regno++)
gdb_regs[regno] = 0;
/* Otherwise, we have only some registers from switch_to() */
thread_regs = task_pt_regs(task);
gdb_regs[_R0] = thread_regs->ARM_r0;
gdb_regs[_R1] = thread_regs->ARM_r1;
gdb_regs[_R2] = thread_regs->ARM_r2;
gdb_regs[_R3] = thread_regs->ARM_r3;
gdb_regs[_R4] = thread_regs->ARM_r4;
gdb_regs[_R5] = thread_regs->ARM_r5;
gdb_regs[_R6] = thread_regs->ARM_r6;
gdb_regs[_R7] = thread_regs->ARM_r7;
gdb_regs[_R8] = thread_regs->ARM_r8;
gdb_regs[_R9] = thread_regs->ARM_r9;
gdb_regs[_R10] = thread_regs->ARM_r10;
gdb_regs[_FP] = thread_regs->ARM_fp;
gdb_regs[_IP] = thread_regs->ARM_ip;
gdb_regs[_SPT] = thread_regs->ARM_sp;
gdb_regs[_LR] = thread_regs->ARM_lr;
gdb_regs[_PC] = thread_regs->ARM_pc;
gdb_regs[_CPSR] = thread_regs->ARM_cpsr;
}
static int compiled_break;
int kgdb_arch_handle_exception(int exception_vector, int signo,
int err_code, char *remcom_in_buffer,
char *remcom_out_buffer,
struct pt_regs *linux_regs)
{
unsigned long addr;
char *ptr;
switch (remcom_in_buffer[0]) {
case 'D':
case 'k':
case 'c':
kgdb_contthread = NULL;
/*
* Try to read optional parameter, pc unchanged if no parm.
* If this was a compiled breakpoint, we need to move
* to the next instruction or we will just breakpoint
* over and over again.
*/
ptr = &remcom_in_buffer[1];
if (kgdb_hex2long(&ptr, &addr))
linux_regs->ARM_pc = addr;
else if (compiled_break == 1)
linux_regs->ARM_pc += 4;
compiled_break = 0;
return 0;
}
return -1;
}
static int kgdb_brk_fn(struct pt_regs *regs, unsigned int instr)
{
kgdb_handle_exception(1, SIGTRAP, 0, regs);
return 0;
}
static int kgdb_compiled_brk_fn(struct pt_regs *regs, unsigned int instr)
{
compiled_break = 1;
kgdb_handle_exception(1, SIGTRAP, 0, regs);
return 0;
}
static struct undef_hook kgdb_brkpt_hook = {
.instr_mask = 0xffffffff,
.instr_val = KGDB_BREAKINST,
.fn = kgdb_brk_fn
};
static struct undef_hook kgdb_compiled_brkpt_hook = {
.instr_mask = 0xffffffff,
.instr_val = KGDB_COMPILED_BREAK,
.fn = kgdb_compiled_brk_fn
};
/**
* kgdb_arch_init - Perform any architecture specific initalization.
*
* This function will handle the initalization of any architecture
* specific callbacks.
*/
int kgdb_arch_init(void)
{
register_undef_hook(&kgdb_brkpt_hook);
register_undef_hook(&kgdb_compiled_brkpt_hook);
return 0;
}
/**
* kgdb_arch_exit - Perform any architecture specific uninitalization.
*
* This function will handle the uninitalization of any architecture
* specific callbacks, for dynamic registration and unregistration.
*/
void kgdb_arch_exit(void)
{
unregister_undef_hook(&kgdb_brkpt_hook);
unregister_undef_hook(&kgdb_compiled_brkpt_hook);
}
/*
* Register our undef instruction hooks with ARM undef core.
* We regsiter a hook specifically looking for the KGB break inst
* and we handle the normal undef case within the do_undefinstr
* handler.
*/
struct kgdb_arch arch_kgdb_ops = {
#ifndef __ARMEB__
.gdb_bpt_instr = {0xfe, 0xde, 0xff, 0xe7}
#else /* ! __ARMEB__ */
.gdb_bpt_instr = {0xe7, 0xff, 0xde, 0xfe}
#endif
};
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/moduleloader.h> #include <linux/moduleloader.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/elf.h> #include <linux/elf.h>
#include <linux/vmalloc.h> #include <linux/vmalloc.h>
#include <linux/slab.h> #include <linux/slab.h>
......
...@@ -162,7 +162,7 @@ void cpu_idle(void) ...@@ -162,7 +162,7 @@ void cpu_idle(void)
if (!idle) if (!idle)
idle = default_idle; idle = default_idle;
leds_event(led_idle_start); leds_event(led_idle_start);
tick_nohz_stop_sched_tick(); tick_nohz_stop_sched_tick(1);
while (!need_resched()) while (!need_resched())
idle(); idle();
leds_event(led_idle_end); leds_event(led_idle_end);
......
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
#include <asm/mach/irq.h> #include <asm/mach/irq.h>
#include <asm/mach/time.h> #include <asm/mach/time.h>
#include <asm/traps.h>
#include "compat.h" #include "compat.h"
#include "atags.h" #include "atags.h"
...@@ -853,6 +854,7 @@ void __init setup_arch(char **cmdline_p) ...@@ -853,6 +854,7 @@ void __init setup_arch(char **cmdline_p)
conswitchp = &dummy_con; conswitchp = &dummy_con;
#endif #endif
#endif #endif
early_trap_init();
} }
......
...@@ -130,7 +130,9 @@ static const struct leds_evt_name evt_names[] = { ...@@ -130,7 +130,9 @@ static const struct leds_evt_name evt_names[] = {
{ "red", led_red_on, led_red_off }, { "red", led_red_on, led_red_off },
}; };
static ssize_t leds_store(struct sys_device *dev, const char *buf, size_t size) static ssize_t leds_store(struct sys_device *dev,
struct sysdev_attribute *attr,
const char *buf, size_t size)
{ {
int ret = -EINVAL, len = strcspn(buf, " "); int ret = -EINVAL, len = strcspn(buf, " ");
......
...@@ -707,6 +707,11 @@ void abort(void) ...@@ -707,6 +707,11 @@ void abort(void)
EXPORT_SYMBOL(abort); EXPORT_SYMBOL(abort);
void __init trap_init(void) void __init trap_init(void)
{
return;
}
void __init early_trap_init(void)
{ {
unsigned long vectors = CONFIG_VECTORS_BASE; unsigned long vectors = CONFIG_VECTORS_BASE;
extern char __stubs_start[], __stubs_end[]; extern char __stubs_start[], __stubs_end[];
......
...@@ -393,9 +393,7 @@ static int impd1_probe(struct lm_device *dev) ...@@ -393,9 +393,7 @@ static int impd1_probe(struct lm_device *dev)
if (!d) if (!d)
continue; continue;
snprintf(d->dev.bus_id, sizeof(d->dev.bus_id), dev_set_name(&d->dev, "lm%x:%5.5lx", dev->id, idev->offset >> 12);
"lm%x:%5.5lx", dev->id, idev->offset >> 12);
d->dev.parent = &dev->dev; d->dev.parent = &dev->dev;
d->res.start = dev->resource.start + idev->offset; d->res.start = dev->resource.start + idev->offset;
d->res.end = d->res.start + SZ_4K - 1; d->res.end = d->res.start + SZ_4K - 1;
...@@ -407,8 +405,7 @@ static int impd1_probe(struct lm_device *dev) ...@@ -407,8 +405,7 @@ static int impd1_probe(struct lm_device *dev)
ret = amba_device_register(d, &dev->resource); ret = amba_device_register(d, &dev->resource);
if (ret) { if (ret) {
printk("unable to register device %s: %d\n", dev_err(&d->dev, "unable to register device: %d\n");
d->dev.bus_id, ret);
kfree(d); kfree(d);
} }
} }
......
...@@ -81,8 +81,10 @@ int lm_device_register(struct lm_device *dev) ...@@ -81,8 +81,10 @@ int lm_device_register(struct lm_device *dev)
dev->dev.release = lm_device_release; dev->dev.release = lm_device_release;
dev->dev.bus = &lm_bustype; dev->dev.bus = &lm_bustype;
snprintf(dev->dev.bus_id, sizeof(dev->dev.bus_id), "lm%d", dev->id); ret = dev_set_name(&dev->dev, "lm%d", dev->id);
dev->resource.name = dev->dev.bus_id; if (ret)
return ret;
dev->resource.name = dev_name(&dev->dev);
ret = request_resource(&iomem_resource, &dev->resource); ret = request_resource(&iomem_resource, &dev->resource);
if (ret == 0) { if (ret == 0) {
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/f75375s.h> #include <linux/f75375s.h>
#include <linux/leds-pca9532.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/pci.h> #include <linux/pci.h>
...@@ -206,6 +207,53 @@ static struct f75375s_platform_data n2100_f75375s = { ...@@ -206,6 +207,53 @@ static struct f75375s_platform_data n2100_f75375s = {
.pwm_enable = { 0, 0 }, .pwm_enable = { 0, 0 },
}; };
static struct pca9532_platform_data n2100_leds = {
.leds = {
{ .name = "n2100:red:satafail0",
.state = PCA9532_OFF,
.type = PCA9532_TYPE_LED,
},
{ .name = "n2100:red:satafail1",
.state = PCA9532_OFF,
.type = PCA9532_TYPE_LED,
},
{ .name = "n2100:blue:usb",
.state = PCA9532_OFF,
.type = PCA9532_TYPE_LED,
},
{ .type = PCA9532_TYPE_NONE },
{ .type = PCA9532_TYPE_NONE },
{ .type = PCA9532_TYPE_NONE },
{ .type = PCA9532_TYPE_NONE },
{ .name = "n2100:red:usb",
.state = PCA9532_OFF,
.type = PCA9532_TYPE_LED,
},
{ .type = PCA9532_TYPE_NONE }, /* power OFF gpio */
{ .type = PCA9532_TYPE_NONE }, /* reset gpio */
{ .type = PCA9532_TYPE_NONE },
{ .type = PCA9532_TYPE_NONE },
{ .type = PCA9532_TYPE_NONE },
{ .name = "n2100:orange:system",
.state = PCA9532_OFF,
.type = PCA9532_TYPE_LED,
},
{ .name = "n2100:red:system",
.state = PCA9532_OFF,
.type = PCA9532_TYPE_LED,
},
{ .name = "N2100 beeper" ,
.state = PCA9532_OFF,
.type = PCA9532_TYPE_N2100_BEEP,
},
},
.psc = { 0, 0 },
.pwm = { 0, 0 },
};
static struct i2c_board_info __initdata n2100_i2c_devices[] = { static struct i2c_board_info __initdata n2100_i2c_devices[] = {
{ {
I2C_BOARD_INFO("rs5c372b", 0x32), I2C_BOARD_INFO("rs5c372b", 0x32),
...@@ -214,6 +262,10 @@ static struct i2c_board_info __initdata n2100_i2c_devices[] = { ...@@ -214,6 +262,10 @@ static struct i2c_board_info __initdata n2100_i2c_devices[] = {
I2C_BOARD_INFO("f75375", 0x2e), I2C_BOARD_INFO("f75375", 0x2e),
.platform_data = &n2100_f75375s, .platform_data = &n2100_f75375s,
}, },
{
I2C_BOARD_INFO("pca9532", 0x60),
.platform_data = &n2100_leds,
},
}; };
/* /*
......
...@@ -14,8 +14,8 @@ ...@@ -14,8 +14,8 @@
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/string.h> #include <linux/string.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/semaphore.h>
#include <asm/semaphore.h>
#include "clock.h" #include "clock.h"
static LIST_HEAD(clocks); static LIST_HEAD(clocks);
......
...@@ -16,18 +16,24 @@ config CPU_PXA310 ...@@ -16,18 +16,24 @@ config CPU_PXA310
config CPU_PXA320 config CPU_PXA320
bool "PXA320 (codename Monahans-P)" bool "PXA320 (codename Monahans-P)"
config CPU_PXA930
bool "PXA930 (codename Tavor-P)"
endmenu endmenu
endif endif
menu "Select target boards"
config ARCH_GUMSTIX config ARCH_GUMSTIX
bool "Gumstix XScale boards" bool "Gumstix XScale boards"
help help
Say Y here if you intend to run this kernel on a Say Y here if you intend to run this kernel on a
Gumstix Full Function Minature Computer. Gumstix Full Function Minature Computer.
config MACH_GUMSTIX_F
bool "Basix, Connex, ws-200ax, ws-400ax systems"
depends on ARCH_GUMSTIX
select PXA25x
config ARCH_LUBBOCK config ARCH_LUBBOCK
bool "Intel DBPXA250 Development Platform" bool "Intel DBPXA250 Development Platform"
select PXA25x select PXA25x
...@@ -58,6 +64,57 @@ config PXA_SHARPSL ...@@ -58,6 +64,57 @@ config PXA_SHARPSL
SL-C3000 (Spitz), SL-C3100 (Borzoi) or SL-C6000x (Tosa) SL-C3000 (Spitz), SL-C3100 (Borzoi) or SL-C6000x (Tosa)
handheld computer. handheld computer.
config MACH_POODLE
bool "Enable Sharp SL-5600 (Poodle) Support"
depends on PXA_SHARPSL
select PXA25x
select SHARP_LOCOMO
select PXA_SSP
config MACH_CORGI
bool "Enable Sharp SL-C700 (Corgi) Support"
depends on PXA_SHARPSL
select PXA25x
select PXA_SHARP_C7xx
config MACH_SHEPHERD
bool "Enable Sharp SL-C750 (Shepherd) Support"
depends on PXA_SHARPSL
select PXA25x
select PXA_SHARP_C7xx
config MACH_HUSKY
bool "Enable Sharp SL-C760 (Husky) Support"
depends on PXA_SHARPSL
select PXA25x
select PXA_SHARP_C7xx
config MACH_AKITA
bool "Enable Sharp SL-1000 (Akita) Support"
depends on PXA_SHARPSL
select PXA27x
select PXA_SHARP_Cxx00
select MACH_SPITZ
select I2C
select I2C_PXA
config MACH_SPITZ
bool "Enable Sharp Zaurus SL-3000 (Spitz) Support"
depends on PXA_SHARPSL
select PXA27x
select PXA_SHARP_Cxx00
config MACH_BORZOI
bool "Enable Sharp Zaurus SL-3100 (Borzoi) Support"
depends on PXA_SHARPSL
select PXA27x
select PXA_SHARP_Cxx00
config MACH_TOSA
bool "Enable Sharp SL-6000x (Tosa) Support"
depends on PXA_SHARPSL
select PXA25x
config ARCH_PXA_ESERIES config ARCH_PXA_ESERIES
bool "PXA based Toshiba e-series PDAs" bool "PXA based Toshiba e-series PDAs"
select PXA25x select PXA25x
...@@ -70,10 +127,19 @@ config MACH_E330 ...@@ -70,10 +127,19 @@ config MACH_E330
Say Y here if you intend to run this kernel on a Toshiba Say Y here if you intend to run this kernel on a Toshiba
e330 family PDA. e330 family PDA.
config MACH_E350
bool "Toshiba e350"
default y
depends on ARCH_PXA_ESERIES
help
Say Y here if you intend to run this kernel on a Toshiba
e350 family PDA.
config MACH_E740 config MACH_E740
bool "Toshiba e740" bool "Toshiba e740"
default y default y
depends on ARCH_PXA_ESERIES depends on ARCH_PXA_ESERIES
select FB_W100
help help
Say Y here if you intend to run this kernel on a Toshiba Say Y here if you intend to run this kernel on a Toshiba
e740 family PDA. e740 family PDA.
...@@ -82,6 +148,7 @@ config MACH_E750 ...@@ -82,6 +148,7 @@ config MACH_E750
bool "Toshiba e750" bool "Toshiba e750"
default y default y
depends on ARCH_PXA_ESERIES depends on ARCH_PXA_ESERIES
select FB_W100
help help
Say Y here if you intend to run this kernel on a Toshiba Say Y here if you intend to run this kernel on a Toshiba
e750 family PDA. e750 family PDA.
...@@ -98,6 +165,7 @@ config MACH_E800 ...@@ -98,6 +165,7 @@ config MACH_E800
bool "Toshiba e800" bool "Toshiba e800"
default y default y
depends on ARCH_PXA_ESERIES depends on ARCH_PXA_ESERIES
select FB_W100
help help
Say Y here if you intend to run this kernel on a Toshiba Say Y here if you intend to run this kernel on a Toshiba
e800 family PDA. e800 family PDA.
...@@ -106,6 +174,10 @@ config MACH_TRIZEPS4 ...@@ -106,6 +174,10 @@ config MACH_TRIZEPS4
bool "Keith und Koep Trizeps4 DIMM-Module" bool "Keith und Koep Trizeps4 DIMM-Module"
select PXA27x select PXA27x
config MACH_TRIZEPS4_CONXS
bool "ConXS Eval Board"
depends on MACH_TRIZEPS4
config MACH_EM_X270 config MACH_EM_X270
bool "CompuLab EM-x270 platform" bool "CompuLab EM-x270 platform"
select PXA27x select PXA27x
...@@ -115,7 +187,7 @@ config MACH_COLIBRI ...@@ -115,7 +187,7 @@ config MACH_COLIBRI
select PXA27x select PXA27x
config MACH_ZYLONITE config MACH_ZYLONITE
bool "PXA3xx Development Platform" bool "PXA3xx Development Platform (aka Zylonite)"
select PXA3xx select PXA3xx
select HAVE_PWM select HAVE_PWM
...@@ -124,6 +196,16 @@ config MACH_LITTLETON ...@@ -124,6 +196,16 @@ config MACH_LITTLETON
select PXA3xx select PXA3xx
select PXA_SSP select PXA_SSP
config MACH_TAVOREVB
bool "PXA930 Evaluation Board (aka TavorEVB)"
select PXA3xx
select PXA930
config MACH_SAAR
bool "PXA930 Handheld Platform (aka SAAR)"
select PXA3xx
select PXA930
config MACH_ARMCORE config MACH_ARMCORE
bool "CompuLab CM-X270 modules" bool "CompuLab CM-X270 modules"
select PXA27x select PXA27x
...@@ -131,7 +213,6 @@ config MACH_ARMCORE ...@@ -131,7 +213,6 @@ config MACH_ARMCORE
config MACH_MAGICIAN config MACH_MAGICIAN
bool "Enable HTC Magician Support" bool "Enable HTC Magician Support"
depends on ARCH_PXA
select PXA27x select PXA27x
select IWMMXT select IWMMXT
...@@ -139,18 +220,26 @@ config MACH_PCM027 ...@@ -139,18 +220,26 @@ config MACH_PCM027
bool "Phytec phyCORE-PXA270 CPU module (PCM-027)" bool "Phytec phyCORE-PXA270 CPU module (PCM-027)"
select PXA27x select PXA27x
select IWMMXT select IWMMXT
select PXA_SSP
endmenu config ARCH_PXA_PALM
bool "PXA based Palm PDAs"
select HAVE_PWM
choice config MACH_PALMTX
prompt "Used baseboard" bool "Palm T|X"
depends on MACH_PCM027 default y
depends on ARCH_PXA_PALM
select PXA27x
select IWMMXT
help
Say Y here if you intend to run this kernel on a Palm T|X
handheld computer.
config MACH_PCM990_BASEBOARD config MACH_PCM990_BASEBOARD
bool "PHYTEC PCM-990 development board" bool "PHYTEC PCM-990 development board"
select HAVE_PWM select HAVE_PWM
depends on MACH_PCM027
endchoice
choice choice
prompt "display on pcm990" prompt "display on pcm990"
...@@ -167,88 +256,45 @@ config PCM990_DISPLAY_NONE ...@@ -167,88 +256,45 @@ config PCM990_DISPLAY_NONE
endchoice endchoice
if ARCH_GUMSTIX
choice
prompt "Select target Gumstix board"
config MACH_GUMSTIX_F
bool "Basix, Connex, ws-200ax, ws-400ax systems"
select PXA25x
endchoice
endif
config PXA_EZX
bool "Motorola EZX Platform"
select PXA27x
select IWMMXT
select HAVE_PWM
if MACH_TRIZEPS4 config MACH_EZX_A780
bool "Motorola EZX A780"
default y
depends on PXA_EZX
choice config MACH_EZX_E680
prompt "Select base board for Trizeps 4 module" bool "Motorola EZX E680"
default y
depends on PXA_EZX
config MACH_TRIZEPS4_CONXS config MACH_EZX_A1200
bool "ConXS Eval Board" bool "Motorola EZX A1200"
default y
depends on PXA_EZX
config MACH_TRIZEPS4_ANY config MACH_EZX_A910
bool "another Board" bool "Motorola EZX A910"
default y
depends on PXA_EZX
endchoice config MACH_EZX_E6
bool "Motorola EZX E6"
default y
depends on PXA_EZX
endif config MACH_EZX_E2
bool "Motorola EZX E2"
default y
depends on PXA_EZX
endmenu endmenu
config MACH_POODLE
bool "Enable Sharp SL-5600 (Poodle) Support"
depends on PXA_SHARPSL
select PXA25x
select SHARP_LOCOMO
select PXA_SSP
config MACH_CORGI
bool "Enable Sharp SL-C700 (Corgi) Support"
depends on PXA_SHARPSL
select PXA25x
select PXA_SHARP_C7xx
config MACH_SHEPHERD
bool "Enable Sharp SL-C750 (Shepherd) Support"
depends on PXA_SHARPSL
select PXA25x
select PXA_SHARP_C7xx
config MACH_HUSKY
bool "Enable Sharp SL-C760 (Husky) Support"
depends on PXA_SHARPSL
select PXA25x
select PXA_SHARP_C7xx
config MACH_AKITA
bool "Enable Sharp SL-1000 (Akita) Support"
depends on PXA_SHARPSL
select PXA27x
select PXA_SHARP_Cxx00
select MACH_SPITZ
select I2C
select I2C_PXA
config MACH_SPITZ
bool "Enable Sharp Zaurus SL-3000 (Spitz) Support"
depends on PXA_SHARPSL
select PXA27x
select PXA_SHARP_Cxx00
config MACH_BORZOI
bool "Enable Sharp Zaurus SL-3100 (Borzoi) Support"
depends on PXA_SHARPSL
select PXA27x
select PXA_SHARP_Cxx00
config MACH_TOSA
bool "Enable Sharp SL-6000x (Tosa) Support"
depends on PXA_SHARPSL
select PXA25x
config PXA25x config PXA25x
bool bool
help help
...@@ -288,4 +334,13 @@ config PXA_PWM ...@@ -288,4 +334,13 @@ config PXA_PWM
default BACKLIGHT_PWM default BACKLIGHT_PWM
help help
Enable support for PXA2xx/PXA3xx PWM controllers Enable support for PXA2xx/PXA3xx PWM controllers
config TOSA_BT
tristate "Control the state of built-in bluetooth chip on Sharp SL-6000"
depends on MACH_TOSA
select RFKILL
help
This is a simple driver that is able to control
the state of built in bluetooth chip on tosa.
endif endif
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
# Common support (must be linked before board specific support) # Common support (must be linked before board specific support)
obj-y += clock.o devices.o generic.o irq.o dma.o \ obj-y += clock.o devices.o generic.o irq.o dma.o \
time.o gpio.o time.o gpio.o reset.o
obj-$(CONFIG_PM) += pm.o sleep.o standby.o obj-$(CONFIG_PM) += pm.o sleep.o standby.o
obj-$(CONFIG_CPU_FREQ) += cpu-pxa.o obj-$(CONFIG_CPU_FREQ) += cpu-pxa.o
...@@ -18,6 +18,7 @@ obj-$(CONFIG_PXA27x) += mfp-pxa2xx.o pxa2xx.o pxa27x.o ...@@ -18,6 +18,7 @@ obj-$(CONFIG_PXA27x) += mfp-pxa2xx.o pxa2xx.o pxa27x.o
obj-$(CONFIG_PXA3xx) += mfp-pxa3xx.o pxa3xx.o smemc.o obj-$(CONFIG_PXA3xx) += mfp-pxa3xx.o pxa3xx.o smemc.o
obj-$(CONFIG_CPU_PXA300) += pxa300.o obj-$(CONFIG_CPU_PXA300) += pxa300.o
obj-$(CONFIG_CPU_PXA320) += pxa320.o obj-$(CONFIG_CPU_PXA320) += pxa320.o
obj-$(CONFIG_CPU_PXA930) += pxa930.o
# Specific board support # Specific board support
obj-$(CONFIG_ARCH_GUMSTIX) += gumstix.o obj-$(CONFIG_ARCH_GUMSTIX) += gumstix.o
...@@ -36,7 +37,12 @@ obj-$(CONFIG_MACH_PCM990_BASEBOARD) += pcm990-baseboard.o ...@@ -36,7 +37,12 @@ obj-$(CONFIG_MACH_PCM990_BASEBOARD) += pcm990-baseboard.o
obj-$(CONFIG_MACH_TOSA) += tosa.o obj-$(CONFIG_MACH_TOSA) += tosa.o
obj-$(CONFIG_MACH_EM_X270) += em-x270.o obj-$(CONFIG_MACH_EM_X270) += em-x270.o
obj-$(CONFIG_MACH_MAGICIAN) += magician.o obj-$(CONFIG_MACH_MAGICIAN) += magician.o
obj-$(CONFIG_ARCH_PXA_ESERIES) += eseries.o obj-$(CONFIG_ARCH_PXA_ESERIES) += eseries.o eseries_udc.o
obj-$(CONFIG_MACH_E740) += e740_lcd.o
obj-$(CONFIG_MACH_E750) += e750_lcd.o
obj-$(CONFIG_MACH_E400) += e400_lcd.o
obj-$(CONFIG_MACH_E800) += e800_lcd.o
obj-$(CONFIG_MACH_PALMTX) += palmtx.o
ifeq ($(CONFIG_MACH_ZYLONITE),y) ifeq ($(CONFIG_MACH_ZYLONITE),y)
obj-y += zylonite.o obj-y += zylonite.o
...@@ -44,8 +50,11 @@ ifeq ($(CONFIG_MACH_ZYLONITE),y) ...@@ -44,8 +50,11 @@ ifeq ($(CONFIG_MACH_ZYLONITE),y)
obj-$(CONFIG_CPU_PXA320) += zylonite_pxa320.o obj-$(CONFIG_CPU_PXA320) += zylonite_pxa320.o
endif endif
obj-$(CONFIG_MACH_LITTLETON) += littleton.o obj-$(CONFIG_MACH_LITTLETON) += littleton.o
obj-$(CONFIG_MACH_TAVOREVB) += tavorevb.o
obj-$(CONFIG_MACH_SAAR) += saar.o
obj-$(CONFIG_MACH_ARMCORE) += cm-x270.o obj-$(CONFIG_MACH_ARMCORE) += cm-x270.o
obj-$(CONFIG_PXA_EZX) += ezx.o
# Support for blinky lights # Support for blinky lights
led-y := leds.o led-y := leds.o
...@@ -59,3 +68,5 @@ obj-$(CONFIG_LEDS) += $(led-y) ...@@ -59,3 +68,5 @@ obj-$(CONFIG_LEDS) += $(led-y)
ifeq ($(CONFIG_PCI),y) ifeq ($(CONFIG_PCI),y)
obj-$(CONFIG_MACH_ARMCORE) += cm-x270-pci.o obj-$(CONFIG_MACH_ARMCORE) += cm-x270-pci.o
endif endif
obj-$(CONFIG_TOSA_BT) += tosa-bt.o
...@@ -101,21 +101,6 @@ unsigned long clk_get_rate(struct clk *clk) ...@@ -101,21 +101,6 @@ unsigned long clk_get_rate(struct clk *clk)
EXPORT_SYMBOL(clk_get_rate); EXPORT_SYMBOL(clk_get_rate);
static void clk_gpio27_enable(struct clk *clk)
{
pxa_gpio_mode(GPIO11_3_6MHz_MD);
}
static void clk_gpio27_disable(struct clk *clk)
{
}
static const struct clkops clk_gpio27_ops = {
.enable = clk_gpio27_enable,
.disable = clk_gpio27_disable,
};
void clk_cken_enable(struct clk *clk) void clk_cken_enable(struct clk *clk)
{ {
CKEN |= 1 << clk->cken; CKEN |= 1 << clk->cken;
...@@ -131,14 +116,6 @@ const struct clkops clk_cken_ops = { ...@@ -131,14 +116,6 @@ const struct clkops clk_cken_ops = {
.disable = clk_cken_disable, .disable = clk_cken_disable,
}; };
static struct clk common_clks[] = {
{
.name = "GPIO27_CLK",
.ops = &clk_gpio27_ops,
.rate = 3686400,
},
};
void clks_register(struct clk *clks, size_t num) void clks_register(struct clk *clks, size_t num)
{ {
int i; int i;
...@@ -148,10 +125,3 @@ void clks_register(struct clk *clks, size_t num) ...@@ -148,10 +125,3 @@ void clks_register(struct clk *clks, size_t num)
list_add(&clks[i].node, &clocks); list_add(&clks[i].node, &clocks);
mutex_unlock(&clocks_mutex); mutex_unlock(&clocks_mutex);
} }
static int __init clk_init(void)
{
clks_register(common_clks, ARRAY_SIZE(common_clks));
return 0;
}
arch_initcall(clk_init);
...@@ -47,9 +47,42 @@ struct clk { ...@@ -47,9 +47,42 @@ struct clk {
.other = _other, \ .other = _other, \
} }
#define INIT_CLK(_name, _ops, _rate, _delay, _dev) \
{ \
.name = _name, \
.dev = _dev, \
.ops = _ops, \
.rate = _rate, \
.delay = _delay, \
}
extern const struct clkops clk_cken_ops; extern const struct clkops clk_cken_ops;
void clk_cken_enable(struct clk *clk); void clk_cken_enable(struct clk *clk);
void clk_cken_disable(struct clk *clk); void clk_cken_disable(struct clk *clk);
#ifdef CONFIG_PXA3xx
#define PXA3xx_CKEN(_name, _cken, _rate, _delay, _dev) \
{ \
.name = _name, \
.dev = _dev, \
.ops = &clk_pxa3xx_cken_ops, \
.rate = _rate, \
.cken = CKEN_##_cken, \
.delay = _delay, \
}
#define PXA3xx_CK(_name, _cken, _ops, _dev) \
{ \
.name = _name, \
.dev = _dev, \
.ops = _ops, \
.cken = CKEN_##_cken, \
}
extern const struct clkops clk_pxa3xx_cken_ops;
extern void clk_pxa3xx_cken_enable(struct clk *);
extern void clk_pxa3xx_cken_disable(struct clk *);
#endif
void clks_register(struct clk *clks, size_t num); void clks_register(struct clk *clks, size_t num);
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
* *
* Bits taken from various places. * Bits taken from various places.
* *
* Copyright (C) 2007 Compulab, Ltd. * Copyright (C) 2007, 2008 Compulab, Ltd.
* Mike Rapoport <mike@compulab.co.il> * Mike Rapoport <mike@compulab.co.il>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
...@@ -19,16 +19,16 @@ ...@@ -19,16 +19,16 @@
#include <linux/device.h> #include <linux/device.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/gpio.h>
#include <asm/mach/pci.h> #include <asm/mach/pci.h>
#include <asm/arch/cm-x270.h>
#include <asm/arch/pxa-regs.h> #include <asm/arch/pxa-regs.h>
#include <asm/arch/pxa2xx-gpio.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <asm/hardware/it8152.h> #include <asm/hardware/it8152.h>
unsigned long it8152_base_address = CMX270_IT8152_VIRT; unsigned long it8152_base_address;
static int cmx270_it8152_irq_gpio;
/* /*
* Only first 64MB of memory can be accessed via PCI. * Only first 64MB of memory can be accessed via PCI.
...@@ -42,7 +42,7 @@ void __init cmx270_pci_adjust_zones(int node, unsigned long *zone_size, ...@@ -42,7 +42,7 @@ void __init cmx270_pci_adjust_zones(int node, unsigned long *zone_size,
unsigned int sz = SZ_64M >> PAGE_SHIFT; unsigned int sz = SZ_64M >> PAGE_SHIFT;
if (machine_is_armcore()) { if (machine_is_armcore()) {
pr_info("Adjusting zones for CM-x270\n"); pr_info("Adjusting zones for CM-X270\n");
/* /*
* Only adjust if > 64M on current system * Only adjust if > 64M on current system
...@@ -60,19 +60,20 @@ void __init cmx270_pci_adjust_zones(int node, unsigned long *zone_size, ...@@ -60,19 +60,20 @@ void __init cmx270_pci_adjust_zones(int node, unsigned long *zone_size,
static void cmx270_it8152_irq_demux(unsigned int irq, struct irq_desc *desc) static void cmx270_it8152_irq_demux(unsigned int irq, struct irq_desc *desc)
{ {
/* clear our parent irq */ /* clear our parent irq */
GEDR(GPIO_IT8152_IRQ) = GPIO_bit(GPIO_IT8152_IRQ); GEDR(cmx270_it8152_irq_gpio) = GPIO_bit(cmx270_it8152_irq_gpio);
it8152_irq_demux(irq, desc); it8152_irq_demux(irq, desc);
} }
void __cmx270_pci_init_irq(void) void __cmx270_pci_init_irq(int irq_gpio)
{ {
it8152_init_irq(); it8152_init_irq();
pxa_gpio_mode(IRQ_TO_GPIO(GPIO_IT8152_IRQ));
set_irq_type(IRQ_GPIO(GPIO_IT8152_IRQ), IRQT_RISING);
set_irq_chained_handler(IRQ_GPIO(GPIO_IT8152_IRQ), cmx270_it8152_irq_gpio = irq_gpio;
cmx270_it8152_irq_demux);
set_irq_type(gpio_to_irq(irq_gpio), IRQT_RISING);
set_irq_chained_handler(gpio_to_irq(irq_gpio), cmx270_it8152_irq_demux);
} }
#ifdef CONFIG_PM #ifdef CONFIG_PM
...@@ -115,8 +116,8 @@ static int __init cmx270_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin) ...@@ -115,8 +116,8 @@ static int __init cmx270_pci_map_irq(struct pci_dev *dev, u8 slot, u8 pin)
/* /*
Here comes the ugly part. The routing is baseboard specific, Here comes the ugly part. The routing is baseboard specific,
but defining a platform for each possible base of CM-x270 is but defining a platform for each possible base of CM-X270 is
unrealistic. Here we keep mapping for ATXBase and SB-x270. unrealistic. Here we keep mapping for ATXBase and SB-X270.
*/ */
/* ATXBASE PCI slot */ /* ATXBASE PCI slot */
if (slot == 7) if (slot == 7)
......
extern void __cmx270_pci_init_irq(void); extern void __cmx270_pci_init_irq(int irq_gpio);
extern void __cmx270_pci_suspend(void); extern void __cmx270_pci_suspend(void);
extern void __cmx270_pci_resume(void); extern void __cmx270_pci_resume(void);
#ifdef CONFIG_PCI #ifdef CONFIG_PCI
#define cmx270_pci_init_irq __cmx270_pci_init_irq #define cmx270_pci_init_irq(x) __cmx270_pci_init_irq(x)
#define cmx270_pci_suspend __cmx270_pci_suspend #define cmx270_pci_suspend(x) __cmx270_pci_suspend(x)
#define cmx270_pci_resume __cmx270_pci_resume #define cmx270_pci_resume(x) __cmx270_pci_resume(x)
#else #else
#define cmx270_pci_init_irq() do {} while (0) #define cmx270_pci_init_irq(x) do {} while (0)
#define cmx270_pci_suspend() do {} while (0) #define cmx270_pci_suspend(x) do {} while (0)
#define cmx270_pci_resume() do {} while (0) #define cmx270_pci_resume(x) do {} while (0)
#endif #endif
此差异已折叠。
...@@ -465,6 +465,7 @@ static void corgi_irda_transceiver_mode(struct device *dev, int mode) ...@@ -465,6 +465,7 @@ static void corgi_irda_transceiver_mode(struct device *dev, int mode)
GPSR(CORGI_GPIO_IR_ON) = GPIO_bit(CORGI_GPIO_IR_ON); GPSR(CORGI_GPIO_IR_ON) = GPIO_bit(CORGI_GPIO_IR_ON);
else else
GPCR(CORGI_GPIO_IR_ON) = GPIO_bit(CORGI_GPIO_IR_ON); GPCR(CORGI_GPIO_IR_ON) = GPIO_bit(CORGI_GPIO_IR_ON);
pxa2xx_transceiver_mode(dev, mode);
} }
static struct pxaficp_platform_data corgi_ficp_platform_data = { static struct pxaficp_platform_data corgi_ficp_platform_data = {
......
...@@ -13,8 +13,10 @@ ...@@ -13,8 +13,10 @@
#include <asm/arch/mfp-pxa27x.h> #include <asm/arch/mfp-pxa27x.h>
#include <asm/arch/ohci.h> #include <asm/arch/ohci.h>
#include <asm/arch/pxa27x_keypad.h> #include <asm/arch/pxa27x_keypad.h>
#include <asm/arch/pxa2xx_spi.h>
#include <asm/arch/camera.h> #include <asm/arch/camera.h>
#include <asm/arch/audio.h> #include <asm/arch/audio.h>
#include <asm/arch/pxa3xx_nand.h>
#include "devices.h" #include "devices.h"
#include "generic.h" #include "generic.h"
...@@ -830,4 +832,63 @@ void __init pxa3xx_set_mci3_info(struct pxamci_platform_data *info) ...@@ -830,4 +832,63 @@ void __init pxa3xx_set_mci3_info(struct pxamci_platform_data *info)
pxa_register_device(&pxa3xx_device_mci3, info); pxa_register_device(&pxa3xx_device_mci3, info);
} }
static struct resource pxa3xx_resources_nand[] = {
[0] = {
.start = 0x43100000,
.end = 0x43100053,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = IRQ_NAND,
.end = IRQ_NAND,
.flags = IORESOURCE_IRQ,
},
[2] = {
/* DRCMR for Data DMA */
.start = 97,
.end = 97,
.flags = IORESOURCE_DMA,
},
[3] = {
/* DRCMR for Command DMA */
.start = 99,
.end = 99,
.flags = IORESOURCE_DMA,
},
};
static u64 pxa3xx_nand_dma_mask = DMA_BIT_MASK(32);
struct platform_device pxa3xx_device_nand = {
.name = "pxa3xx-nand",
.id = -1,
.dev = {
.dma_mask = &pxa3xx_nand_dma_mask,
.coherent_dma_mask = DMA_BIT_MASK(32),
},
.num_resources = ARRAY_SIZE(pxa3xx_resources_nand),
.resource = pxa3xx_resources_nand,
};
void __init pxa3xx_set_nand_info(struct pxa3xx_nand_platform_data *info)
{
pxa_register_device(&pxa3xx_device_nand, info);
}
#endif /* CONFIG_PXA3xx */ #endif /* CONFIG_PXA3xx */
/* pxa2xx-spi platform-device ID equals respective SSP platform-device ID + 1.
* See comment in arch/arm/mach-pxa/ssp.c::ssp_probe() */
void __init pxa2xx_set_spi_info(unsigned id, struct pxa2xx_spi_master *info)
{
struct platform_device *pd;
pd = platform_device_alloc("pxa2xx-spi", id);
if (pd == NULL) {
printk(KERN_ERR "pxa2xx-spi: failed to allocate device id %d\n",
id);
return;
}
pd->dev.platform_data = info;
platform_device_add(pd);
}
...@@ -31,4 +31,6 @@ extern struct platform_device pxa25x_device_pwm1; ...@@ -31,4 +31,6 @@ extern struct platform_device pxa25x_device_pwm1;
extern struct platform_device pxa27x_device_pwm0; extern struct platform_device pxa27x_device_pwm0;
extern struct platform_device pxa27x_device_pwm1; extern struct platform_device pxa27x_device_pwm1;
extern struct platform_device pxa3xx_device_nand;
void __init pxa_register_device(struct platform_device *dev, void *data); void __init pxa_register_device(struct platform_device *dev, void *data);
/*
* e400_lcd.c
*
* (c) 2005 Ian Molton <spyro@f2s.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
*/
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <asm/mach-types.h>
#include <asm/arch/pxa-regs.h>
#include <asm/arch/pxafb.h>
static struct pxafb_mode_info e400_pxafb_mode_info = {
.pixclock = 140703,
.xres = 240,
.yres = 320,
.bpp = 16,
.hsync_len = 4,
.left_margin = 28,
.right_margin = 8,
.vsync_len = 3,
.upper_margin = 5,
.lower_margin = 6,
.sync = 0,
};
static struct pxafb_mach_info e400_pxafb_mach_info = {
.modes = &e400_pxafb_mode_info,
.num_modes = 1,
.lccr0 = LCCR0_Color | LCCR0_Sngl | LCCR0_Act,
.lccr3 = 0,
.pxafb_backlight_power = NULL,
};
static int __init e400_lcd_init(void)
{
if (!machine_is_e400())
return -ENODEV;
set_pxa_fb_info(&e400_pxafb_mach_info);
return 0;
}
module_init(e400_lcd_init);
MODULE_AUTHOR("Ian Molton <spyro@f2s.com>");
MODULE_DESCRIPTION("e400 lcd driver");
MODULE_LICENSE("GPLv2");
/* e740_lcd.c
*
* This file contains the definitions for the LCD timings and functions
* to control the LCD power / frontlighting via the w100fb driver.
*
* (c) 2005 Ian Molton <spyro@f2s.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
*/
#include <linux/module.h>
#include <linux/device.h>
#include <linux/fb.h>
#include <linux/err.h>
#include <linux/platform_device.h>
#include <asm/mach-types.h>
#include <video/w100fb.h>
/*
**potential** shutdown routine - to be investigated
devmem2 0x0c010528 w 0xff3fff00
devmem2 0x0c010190 w 0x7FFF8000
devmem2 0x0c0101b0 w 0x00FF0000
devmem2 0x0c01008c w 0x00000000
devmem2 0x0c010080 w 0x000000bf
devmem2 0x0c010098 w 0x00000015
devmem2 0x0c010088 w 0x4b000204
devmem2 0x0c010098 w 0x0000001d
*/
static struct w100_gen_regs e740_lcd_regs = {
.lcd_format = 0x00008023,
.lcdd_cntl1 = 0x0f000000,
.lcdd_cntl2 = 0x0003ffff,
.genlcd_cntl1 = 0x00ffff03,
.genlcd_cntl2 = 0x003c0f03,
.genlcd_cntl3 = 0x000143aa,
};
static struct w100_mode e740_lcd_mode = {
.xres = 240,
.yres = 320,
.left_margin = 20,
.right_margin = 28,
.upper_margin = 9,
.lower_margin = 8,
.crtc_ss = 0x80140013,
.crtc_ls = 0x81150110,
.crtc_gs = 0x80050005,
.crtc_vpos_gs = 0x000a0009,
.crtc_rev = 0x0040010a,
.crtc_dclk = 0xa906000a,
.crtc_gclk = 0x80050108,
.crtc_goe = 0x80050108,
.pll_freq = 57,
.pixclk_divider = 4,
.pixclk_divider_rotated = 4,
.pixclk_src = CLK_SRC_XTAL,
.sysclk_divider = 1,
.sysclk_src = CLK_SRC_PLL,
.crtc_ps1_active = 0x41060010,
};
static struct w100_gpio_regs e740_w100_gpio_info = {
.init_data1 = 0x21002103,
.gpio_dir1 = 0xffffdeff,
.gpio_oe1 = 0x03c00643,
.init_data2 = 0x003f003f,
.gpio_dir2 = 0xffffffff,
.gpio_oe2 = 0x000000ff,
};
static struct w100fb_mach_info e740_fb_info = {
.modelist = &e740_lcd_mode,
.num_modes = 1,
.regs = &e740_lcd_regs,
.gpio = &e740_w100_gpio_info,
.xtal_freq = 14318000,
.xtal_dbl = 1,
};
static struct resource e740_fb_resources[] = {
[0] = {
.start = 0x0c000000,
.end = 0x0cffffff,
.flags = IORESOURCE_MEM,
},
};
/* ----------------------- device declarations -------------------------- */
static struct platform_device e740_fb_device = {
.name = "w100fb",
.id = -1,
.dev = {
.platform_data = &e740_fb_info,
},
.num_resources = ARRAY_SIZE(e740_fb_resources),
.resource = e740_fb_resources,
};
static int e740_lcd_init(void)
{
int ret;
if (!machine_is_e740())
return -ENODEV;
return platform_device_register(&e740_fb_device);
}
module_init(e740_lcd_init);
MODULE_AUTHOR("Ian Molton <spyro@f2s.com>");
MODULE_DESCRIPTION("e740 lcd driver");
MODULE_LICENSE("GPLv2");
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
...@@ -267,6 +267,7 @@ static void poodle_irda_transceiver_mode(struct device *dev, int mode) ...@@ -267,6 +267,7 @@ static void poodle_irda_transceiver_mode(struct device *dev, int mode)
} else { } else {
GPCR(POODLE_GPIO_IR_ON) = GPIO_bit(POODLE_GPIO_IR_ON); GPCR(POODLE_GPIO_IR_ON) = GPIO_bit(POODLE_GPIO_IR_ON);
} }
pxa2xx_transceiver_mode(dev, mode);
} }
static struct pxaficp_platform_data poodle_ficp_platform_data = { static struct pxaficp_platform_data poodle_ficp_platform_data = {
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
...@@ -254,6 +254,7 @@ static void board_irda_mode(struct device *dev, int mode) ...@@ -254,6 +254,7 @@ static void board_irda_mode(struct device *dev, int mode)
/* Fast mode */ /* Fast mode */
trizeps_conxs_ircr |= ConXS_IRCR_MODE; trizeps_conxs_ircr |= ConXS_IRCR_MODE;
} }
pxa2xx_transceiver_mode(dev, mode);
if (mode & IR_OFF) { if (mode & IR_OFF) {
trizeps_conxs_ircr |= ConXS_IRCR_SD; trizeps_conxs_ircr |= ConXS_IRCR_SD;
} else { } else {
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册