mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-09 06:04:05 +08:00
Merge branch 'for-2.6.33' into for-2.6.34
This commit is contained in:
commit
f1487fcbe4
1
.gitignore
vendored
1
.gitignore
vendored
@ -37,6 +37,7 @@ modules.builtin
|
|||||||
tags
|
tags
|
||||||
TAGS
|
TAGS
|
||||||
vmlinux
|
vmlinux
|
||||||
|
vmlinuz
|
||||||
System.map
|
System.map
|
||||||
Module.markers
|
Module.markers
|
||||||
Module.symvers
|
Module.symvers
|
||||||
|
@ -174,7 +174,7 @@
|
|||||||
</para>
|
</para>
|
||||||
<programlisting>
|
<programlisting>
|
||||||
static struct mtd_info *board_mtd;
|
static struct mtd_info *board_mtd;
|
||||||
static unsigned long baseaddr;
|
static void __iomem *baseaddr;
|
||||||
</programlisting>
|
</programlisting>
|
||||||
<para>
|
<para>
|
||||||
Static example
|
Static example
|
||||||
@ -182,7 +182,7 @@ static unsigned long baseaddr;
|
|||||||
<programlisting>
|
<programlisting>
|
||||||
static struct mtd_info board_mtd;
|
static struct mtd_info board_mtd;
|
||||||
static struct nand_chip board_chip;
|
static struct nand_chip board_chip;
|
||||||
static unsigned long baseaddr;
|
static void __iomem *baseaddr;
|
||||||
</programlisting>
|
</programlisting>
|
||||||
</sect1>
|
</sect1>
|
||||||
<sect1 id="Partition_defines">
|
<sect1 id="Partition_defines">
|
||||||
@ -283,8 +283,8 @@ int __init board_init (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* map physical address */
|
/* map physical address */
|
||||||
baseaddr = (unsigned long)ioremap(CHIP_PHYSICAL_ADDRESS, 1024);
|
baseaddr = ioremap(CHIP_PHYSICAL_ADDRESS, 1024);
|
||||||
if(!baseaddr){
|
if (!baseaddr) {
|
||||||
printk("Ioremap to access NAND chip failed\n");
|
printk("Ioremap to access NAND chip failed\n");
|
||||||
err = -EIO;
|
err = -EIO;
|
||||||
goto out_mtd;
|
goto out_mtd;
|
||||||
@ -316,7 +316,7 @@ int __init board_init (void)
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
out_ior:
|
out_ior:
|
||||||
iounmap((void *)baseaddr);
|
iounmap(baseaddr);
|
||||||
out_mtd:
|
out_mtd:
|
||||||
kfree (board_mtd);
|
kfree (board_mtd);
|
||||||
out:
|
out:
|
||||||
@ -341,7 +341,7 @@ static void __exit board_cleanup (void)
|
|||||||
nand_release (board_mtd);
|
nand_release (board_mtd);
|
||||||
|
|
||||||
/* unmap physical address */
|
/* unmap physical address */
|
||||||
iounmap((void *)baseaddr);
|
iounmap(baseaddr);
|
||||||
|
|
||||||
/* Free the MTD device structure */
|
/* Free the MTD device structure */
|
||||||
kfree (board_mtd);
|
kfree (board_mtd);
|
||||||
|
@ -157,7 +157,7 @@ For such memory, you can do things like
|
|||||||
* access only the 640k-1MB area, so anything else
|
* access only the 640k-1MB area, so anything else
|
||||||
* has to be remapped.
|
* has to be remapped.
|
||||||
*/
|
*/
|
||||||
char * baseptr = ioremap(0xFC000000, 1024*1024);
|
void __iomem *baseptr = ioremap(0xFC000000, 1024*1024);
|
||||||
|
|
||||||
/* write a 'A' to the offset 10 of the area */
|
/* write a 'A' to the offset 10 of the area */
|
||||||
writeb('A',baseptr+10);
|
writeb('A',baseptr+10);
|
||||||
|
@ -1,7 +1,5 @@
|
|||||||
00-INDEX
|
00-INDEX
|
||||||
- This file
|
- This file
|
||||||
as-iosched.txt
|
|
||||||
- Anticipatory IO scheduler
|
|
||||||
barrier.txt
|
barrier.txt
|
||||||
- I/O Barriers
|
- I/O Barriers
|
||||||
biodoc.txt
|
biodoc.txt
|
||||||
|
@ -1,172 +0,0 @@
|
|||||||
Anticipatory IO scheduler
|
|
||||||
-------------------------
|
|
||||||
Nick Piggin <piggin@cyberone.com.au> 13 Sep 2003
|
|
||||||
|
|
||||||
Attention! Database servers, especially those using "TCQ" disks should
|
|
||||||
investigate performance with the 'deadline' IO scheduler. Any system with high
|
|
||||||
disk performance requirements should do so, in fact.
|
|
||||||
|
|
||||||
If you see unusual performance characteristics of your disk systems, or you
|
|
||||||
see big performance regressions versus the deadline scheduler, please email
|
|
||||||
me. Database users don't bother unless you're willing to test a lot of patches
|
|
||||||
from me ;) its a known issue.
|
|
||||||
|
|
||||||
Also, users with hardware RAID controllers, doing striping, may find
|
|
||||||
highly variable performance results with using the as-iosched. The
|
|
||||||
as-iosched anticipatory implementation is based on the notion that a disk
|
|
||||||
device has only one physical seeking head. A striped RAID controller
|
|
||||||
actually has a head for each physical device in the logical RAID device.
|
|
||||||
|
|
||||||
However, setting the antic_expire (see tunable parameters below) produces
|
|
||||||
very similar behavior to the deadline IO scheduler.
|
|
||||||
|
|
||||||
Selecting IO schedulers
|
|
||||||
-----------------------
|
|
||||||
Refer to Documentation/block/switching-sched.txt for information on
|
|
||||||
selecting an io scheduler on a per-device basis.
|
|
||||||
|
|
||||||
Anticipatory IO scheduler Policies
|
|
||||||
----------------------------------
|
|
||||||
The as-iosched implementation implements several layers of policies
|
|
||||||
to determine when an IO request is dispatched to the disk controller.
|
|
||||||
Here are the policies outlined, in order of application.
|
|
||||||
|
|
||||||
1. one-way Elevator algorithm.
|
|
||||||
|
|
||||||
The elevator algorithm is similar to that used in deadline scheduler, with
|
|
||||||
the addition that it allows limited backward movement of the elevator
|
|
||||||
(i.e. seeks backwards). A seek backwards can occur when choosing between
|
|
||||||
two IO requests where one is behind the elevator's current position, and
|
|
||||||
the other is in front of the elevator's position. If the seek distance to
|
|
||||||
the request in back of the elevator is less than half the seek distance to
|
|
||||||
the request in front of the elevator, then the request in back can be chosen.
|
|
||||||
Backward seeks are also limited to a maximum of MAXBACK (1024*1024) sectors.
|
|
||||||
This favors forward movement of the elevator, while allowing opportunistic
|
|
||||||
"short" backward seeks.
|
|
||||||
|
|
||||||
2. FIFO expiration times for reads and for writes.
|
|
||||||
|
|
||||||
This is again very similar to the deadline IO scheduler. The expiration
|
|
||||||
times for requests on these lists is tunable using the parameters read_expire
|
|
||||||
and write_expire discussed below. When a read or a write expires in this way,
|
|
||||||
the IO scheduler will interrupt its current elevator sweep or read anticipation
|
|
||||||
to service the expired request.
|
|
||||||
|
|
||||||
3. Read and write request batching
|
|
||||||
|
|
||||||
A batch is a collection of read requests or a collection of write
|
|
||||||
requests. The as scheduler alternates dispatching read and write batches
|
|
||||||
to the driver. In the case a read batch, the scheduler submits read
|
|
||||||
requests to the driver as long as there are read requests to submit, and
|
|
||||||
the read batch time limit has not been exceeded (read_batch_expire).
|
|
||||||
The read batch time limit begins counting down only when there are
|
|
||||||
competing write requests pending.
|
|
||||||
|
|
||||||
In the case of a write batch, the scheduler submits write requests to
|
|
||||||
the driver as long as there are write requests available, and the
|
|
||||||
write batch time limit has not been exceeded (write_batch_expire).
|
|
||||||
However, the length of write batches will be gradually shortened
|
|
||||||
when read batches frequently exceed their time limit.
|
|
||||||
|
|
||||||
When changing between batch types, the scheduler waits for all requests
|
|
||||||
from the previous batch to complete before scheduling requests for the
|
|
||||||
next batch.
|
|
||||||
|
|
||||||
The read and write fifo expiration times described in policy 2 above
|
|
||||||
are checked only when in scheduling IO of a batch for the corresponding
|
|
||||||
(read/write) type. So for example, the read FIFO timeout values are
|
|
||||||
tested only during read batches. Likewise, the write FIFO timeout
|
|
||||||
values are tested only during write batches. For this reason,
|
|
||||||
it is generally not recommended for the read batch time
|
|
||||||
to be longer than the write expiration time, nor for the write batch
|
|
||||||
time to exceed the read expiration time (see tunable parameters below).
|
|
||||||
|
|
||||||
When the IO scheduler changes from a read to a write batch,
|
|
||||||
it begins the elevator from the request that is on the head of the
|
|
||||||
write expiration FIFO. Likewise, when changing from a write batch to
|
|
||||||
a read batch, scheduler begins the elevator from the first entry
|
|
||||||
on the read expiration FIFO.
|
|
||||||
|
|
||||||
4. Read anticipation.
|
|
||||||
|
|
||||||
Read anticipation occurs only when scheduling a read batch.
|
|
||||||
This implementation of read anticipation allows only one read request
|
|
||||||
to be dispatched to the disk controller at a time. In
|
|
||||||
contrast, many write requests may be dispatched to the disk controller
|
|
||||||
at a time during a write batch. It is this characteristic that can make
|
|
||||||
the anticipatory scheduler perform anomalously with controllers supporting
|
|
||||||
TCQ, or with hardware striped RAID devices. Setting the antic_expire
|
|
||||||
queue parameter (see below) to zero disables this behavior, and the
|
|
||||||
anticipatory scheduler behaves essentially like the deadline scheduler.
|
|
||||||
|
|
||||||
When read anticipation is enabled (antic_expire is not zero), reads
|
|
||||||
are dispatched to the disk controller one at a time.
|
|
||||||
At the end of each read request, the IO scheduler examines its next
|
|
||||||
candidate read request from its sorted read list. If that next request
|
|
||||||
is from the same process as the request that just completed,
|
|
||||||
or if the next request in the queue is "very close" to the
|
|
||||||
just completed request, it is dispatched immediately. Otherwise,
|
|
||||||
statistics (average think time, average seek distance) on the process
|
|
||||||
that submitted the just completed request are examined. If it seems
|
|
||||||
likely that that process will submit another request soon, and that
|
|
||||||
request is likely to be near the just completed request, then the IO
|
|
||||||
scheduler will stop dispatching more read requests for up to (antic_expire)
|
|
||||||
milliseconds, hoping that process will submit a new request near the one
|
|
||||||
that just completed. If such a request is made, then it is dispatched
|
|
||||||
immediately. If the antic_expire wait time expires, then the IO scheduler
|
|
||||||
will dispatch the next read request from the sorted read queue.
|
|
||||||
|
|
||||||
To decide whether an anticipatory wait is worthwhile, the scheduler
|
|
||||||
maintains statistics for each process that can be used to compute
|
|
||||||
mean "think time" (the time between read requests), and mean seek
|
|
||||||
distance for that process. One observation is that these statistics
|
|
||||||
are associated with each process, but those statistics are not associated
|
|
||||||
with a specific IO device. So for example, if a process is doing IO
|
|
||||||
on several file systems on separate devices, the statistics will be
|
|
||||||
a combination of IO behavior from all those devices.
|
|
||||||
|
|
||||||
|
|
||||||
Tuning the anticipatory IO scheduler
|
|
||||||
------------------------------------
|
|
||||||
When using 'as', the anticipatory IO scheduler there are 5 parameters under
|
|
||||||
/sys/block/*/queue/iosched/. All are units of milliseconds.
|
|
||||||
|
|
||||||
The parameters are:
|
|
||||||
* read_expire
|
|
||||||
Controls how long until a read request becomes "expired". It also controls the
|
|
||||||
interval between which expired requests are served, so set to 50, a request
|
|
||||||
might take anywhere < 100ms to be serviced _if_ it is the next on the
|
|
||||||
expired list. Obviously request expiration strategies won't make the disk
|
|
||||||
go faster. The result basically equates to the timeslice a single reader
|
|
||||||
gets in the presence of other IO. 100*((seek time / read_expire) + 1) is
|
|
||||||
very roughly the % streaming read efficiency your disk should get with
|
|
||||||
multiple readers.
|
|
||||||
|
|
||||||
* read_batch_expire
|
|
||||||
Controls how much time a batch of reads is given before pending writes are
|
|
||||||
served. A higher value is more efficient. This might be set below read_expire
|
|
||||||
if writes are to be given higher priority than reads, but reads are to be
|
|
||||||
as efficient as possible when there are no writes. Generally though, it
|
|
||||||
should be some multiple of read_expire.
|
|
||||||
|
|
||||||
* write_expire, and
|
|
||||||
* write_batch_expire are equivalent to the above, for writes.
|
|
||||||
|
|
||||||
* antic_expire
|
|
||||||
Controls the maximum amount of time we can anticipate a good read (one
|
|
||||||
with a short seek distance from the most recently completed request) before
|
|
||||||
giving up. Many other factors may cause anticipation to be stopped early,
|
|
||||||
or some processes will not be "anticipated" at all. Should be a bit higher
|
|
||||||
for big seek time devices though not a linear correspondence - most
|
|
||||||
processes have only a few ms thinktime.
|
|
||||||
|
|
||||||
In addition to the tunables above there is a read-only file named est_time
|
|
||||||
which, when read, will show:
|
|
||||||
|
|
||||||
- The probability of a task exiting without a cooperating task
|
|
||||||
submitting an anticipated IO.
|
|
||||||
|
|
||||||
- The current mean think time.
|
|
||||||
|
|
||||||
- The seek distance used to determine if an incoming IO is better.
|
|
||||||
|
|
@ -186,7 +186,7 @@ a virtual address mapping (unlike the earlier scheme of virtual address
|
|||||||
do not have a corresponding kernel virtual address space mapping) and
|
do not have a corresponding kernel virtual address space mapping) and
|
||||||
low-memory pages.
|
low-memory pages.
|
||||||
|
|
||||||
Note: Please refer to Documentation/DMA-mapping.txt for a discussion
|
Note: Please refer to Documentation/PCI/PCI-DMA-mapping.txt for a discussion
|
||||||
on PCI high mem DMA aspects and mapping of scatter gather lists, and support
|
on PCI high mem DMA aspects and mapping of scatter gather lists, and support
|
||||||
for 64 bit PCI.
|
for 64 bit PCI.
|
||||||
|
|
||||||
|
@ -493,3 +493,52 @@ Why: These two features use non-standard interfaces. There are the
|
|||||||
Who: Corentin Chary <corentin.chary@gmail.com>
|
Who: Corentin Chary <corentin.chary@gmail.com>
|
||||||
|
|
||||||
----------------------------
|
----------------------------
|
||||||
|
|
||||||
|
What: usbvideo quickcam_messenger driver
|
||||||
|
When: 2.6.35
|
||||||
|
Files: drivers/media/video/usbvideo/quickcam_messenger.[ch]
|
||||||
|
Why: obsolete v4l1 driver replaced by gspca_stv06xx
|
||||||
|
Who: Hans de Goede <hdegoede@redhat.com>
|
||||||
|
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
What: ov511 v4l1 driver
|
||||||
|
When: 2.6.35
|
||||||
|
Files: drivers/media/video/ov511.[ch]
|
||||||
|
Why: obsolete v4l1 driver replaced by gspca_ov519
|
||||||
|
Who: Hans de Goede <hdegoede@redhat.com>
|
||||||
|
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
What: w9968cf v4l1 driver
|
||||||
|
When: 2.6.35
|
||||||
|
Files: drivers/media/video/w9968cf*.[ch]
|
||||||
|
Why: obsolete v4l1 driver replaced by gspca_ov519
|
||||||
|
Who: Hans de Goede <hdegoede@redhat.com>
|
||||||
|
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
What: ovcamchip sensor framework
|
||||||
|
When: 2.6.35
|
||||||
|
Files: drivers/media/video/ovcamchip/*
|
||||||
|
Why: Only used by obsoleted v4l1 drivers
|
||||||
|
Who: Hans de Goede <hdegoede@redhat.com>
|
||||||
|
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
What: stv680 v4l1 driver
|
||||||
|
When: 2.6.35
|
||||||
|
Files: drivers/media/video/stv680.[ch]
|
||||||
|
Why: obsolete v4l1 driver replaced by gspca_stv0680
|
||||||
|
Who: Hans de Goede <hdegoede@redhat.com>
|
||||||
|
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
What: zc0301 v4l driver
|
||||||
|
When: 2.6.35
|
||||||
|
Files: drivers/media/video/zc0301/*
|
||||||
|
Why: Duplicate functionality with the gspca_zc3xx driver, zc0301 only
|
||||||
|
supports 2 USB-ID's (because it only supports a limited set of
|
||||||
|
sensors) wich are also supported by the gspca_zc3xx driver
|
||||||
|
(which supports 53 USB-ID's in total)
|
||||||
|
Who: Hans de Goede <hdegoede@redhat.com>
|
||||||
|
@ -196,7 +196,7 @@ nobarrier This also requires an IO stack which can support
|
|||||||
also be used to enable or disable barriers, for
|
also be used to enable or disable barriers, for
|
||||||
consistency with other ext4 mount options.
|
consistency with other ext4 mount options.
|
||||||
|
|
||||||
inode_readahead=n This tuning parameter controls the maximum
|
inode_readahead_blks=n This tuning parameter controls the maximum
|
||||||
number of inode table blocks that ext4's inode
|
number of inode table blocks that ext4's inode
|
||||||
table readahead algorithm will pre-read into
|
table readahead algorithm will pre-read into
|
||||||
the buffer cache. The default value is 32 blocks.
|
the buffer cache. The default value is 32 blocks.
|
||||||
|
@ -28,7 +28,7 @@ described in the man pages included in the package.
|
|||||||
Project web page: http://www.nilfs.org/en/
|
Project web page: http://www.nilfs.org/en/
|
||||||
Download page: http://www.nilfs.org/en/download.html
|
Download page: http://www.nilfs.org/en/download.html
|
||||||
Git tree web page: http://www.nilfs.org/git/
|
Git tree web page: http://www.nilfs.org/git/
|
||||||
NILFS mailing lists: http://www.nilfs.org/mailman/listinfo/users
|
List info: http://vger.kernel.org/vger-lists.html#linux-nilfs
|
||||||
|
|
||||||
Caveats
|
Caveats
|
||||||
=======
|
=======
|
||||||
|
@ -177,7 +177,6 @@ read the file /proc/PID/status:
|
|||||||
CapBnd: ffffffffffffffff
|
CapBnd: ffffffffffffffff
|
||||||
voluntary_ctxt_switches: 0
|
voluntary_ctxt_switches: 0
|
||||||
nonvoluntary_ctxt_switches: 1
|
nonvoluntary_ctxt_switches: 1
|
||||||
Stack usage: 12 kB
|
|
||||||
|
|
||||||
This shows you nearly the same information you would get if you viewed it with
|
This shows you nearly the same information you would get if you viewed it with
|
||||||
the ps command. In fact, ps uses the proc file system to obtain its
|
the ps command. In fact, ps uses the proc file system to obtain its
|
||||||
@ -231,7 +230,6 @@ Table 1-2: Contents of the statm files (as of 2.6.30-rc7)
|
|||||||
Mems_allowed_list Same as previous, but in "list format"
|
Mems_allowed_list Same as previous, but in "list format"
|
||||||
voluntary_ctxt_switches number of voluntary context switches
|
voluntary_ctxt_switches number of voluntary context switches
|
||||||
nonvoluntary_ctxt_switches number of non voluntary context switches
|
nonvoluntary_ctxt_switches number of non voluntary context switches
|
||||||
Stack usage: stack usage high water mark (round up to page size)
|
|
||||||
..............................................................................
|
..............................................................................
|
||||||
|
|
||||||
Table 1-3: Contents of the statm files (as of 2.6.8-rc3)
|
Table 1-3: Contents of the statm files (as of 2.6.8-rc3)
|
||||||
|
102
Documentation/hwmon/amc6821
Normal file
102
Documentation/hwmon/amc6821
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
Kernel driver amc6821
|
||||||
|
=====================
|
||||||
|
|
||||||
|
Supported chips:
|
||||||
|
Texas Instruments AMC6821
|
||||||
|
Prefix: 'amc6821'
|
||||||
|
Addresses scanned: 0x18, 0x19, 0x1a, 0x2c, 0x2d, 0x2e, 0x4c, 0x4d, 0x4e
|
||||||
|
Datasheet: http://focus.ti.com/docs/prod/folders/print/amc6821.html
|
||||||
|
|
||||||
|
Authors:
|
||||||
|
Tomaz Mertelj <tomaz.mertelj@guest.arnes.si>
|
||||||
|
|
||||||
|
|
||||||
|
Description
|
||||||
|
-----------
|
||||||
|
|
||||||
|
This driver implements support for the Texas Instruments amc6821 chip.
|
||||||
|
The chip has one on-chip and one remote temperature sensor and one pwm fan
|
||||||
|
regulator.
|
||||||
|
The pwm can be controlled either from software or automatically.
|
||||||
|
|
||||||
|
The driver provides the following sensor accesses in sysfs:
|
||||||
|
|
||||||
|
temp1_input ro on-chip temperature
|
||||||
|
temp1_min rw "
|
||||||
|
temp1_max rw "
|
||||||
|
temp1_crit rw "
|
||||||
|
temp1_min_alarm ro "
|
||||||
|
temp1_max_alarm ro "
|
||||||
|
temp1_crit_alarm ro "
|
||||||
|
|
||||||
|
temp2_input ro remote temperature
|
||||||
|
temp2_min rw "
|
||||||
|
temp2_max rw "
|
||||||
|
temp2_crit rw "
|
||||||
|
temp2_min_alarm ro "
|
||||||
|
temp2_max_alarm ro "
|
||||||
|
temp2_crit_alarm ro "
|
||||||
|
temp2_fault ro "
|
||||||
|
|
||||||
|
fan1_input ro tachometer speed
|
||||||
|
fan1_min rw "
|
||||||
|
fan1_max rw "
|
||||||
|
fan1_fault ro "
|
||||||
|
fan1_div rw Fan divisor can be either 2 or 4.
|
||||||
|
|
||||||
|
pwm1 rw pwm1
|
||||||
|
pwm1_enable rw regulator mode, 1=open loop, 2=fan controlled
|
||||||
|
by remote temperature, 3=fan controlled by
|
||||||
|
combination of the on-chip temperature and
|
||||||
|
remote-sensor temperature,
|
||||||
|
pwm1_auto_channels_temp ro 1 if pwm_enable==2, 3 if pwm_enable==3
|
||||||
|
pwm1_auto_point1_pwm ro Hardwired to 0, shared for both
|
||||||
|
temperature channels.
|
||||||
|
pwm1_auto_point2_pwm rw This value is shared for both temperature
|
||||||
|
channels.
|
||||||
|
pwm1_auto_point3_pwm rw Hardwired to 255, shared for both
|
||||||
|
temperature channels.
|
||||||
|
|
||||||
|
temp1_auto_point1_temp ro Hardwired to temp2_auto_point1_temp
|
||||||
|
which is rw. Below this temperature fan stops.
|
||||||
|
temp1_auto_point2_temp rw The low-temperature limit of the proportional
|
||||||
|
range. Below this temperature
|
||||||
|
pwm1 = pwm1_auto_point2_pwm. It can go from
|
||||||
|
0 degree C to 124 degree C in steps of
|
||||||
|
4 degree C. Read it out after writing to get
|
||||||
|
the actual value.
|
||||||
|
temp1_auto_point3_temp rw Above this temperature fan runs at maximum
|
||||||
|
speed. It can go from temp1_auto_point2_temp.
|
||||||
|
It can only have certain discrete values
|
||||||
|
which depend on temp1_auto_point2_temp and
|
||||||
|
pwm1_auto_point2_pwm. Read it out after
|
||||||
|
writing to get the actual value.
|
||||||
|
|
||||||
|
temp2_auto_point1_temp rw Must be between 0 degree C and 63 degree C and
|
||||||
|
it defines the passive cooling temperature.
|
||||||
|
Below this temperature the fan stops in
|
||||||
|
the closed loop mode.
|
||||||
|
temp2_auto_point2_temp rw The low-temperature limit of the proportional
|
||||||
|
range. Below this temperature
|
||||||
|
pwm1 = pwm1_auto_point2_pwm. It can go from
|
||||||
|
0 degree C to 124 degree C in steps
|
||||||
|
of 4 degree C.
|
||||||
|
|
||||||
|
temp2_auto_point3_temp rw Above this temperature fan runs at maximum
|
||||||
|
speed. It can only have certain discrete
|
||||||
|
values which depend on temp2_auto_point2_temp
|
||||||
|
and pwm1_auto_point2_pwm. Read it out after
|
||||||
|
writing to get actual value.
|
||||||
|
|
||||||
|
|
||||||
|
Module parameters
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
If your board has a BIOS that initializes the amc6821 correctly, you should
|
||||||
|
load the module with: init=0.
|
||||||
|
|
||||||
|
If your board BIOS doesn't initialize the chip, or you want
|
||||||
|
different settings, you can set the following parameters:
|
||||||
|
init=1,
|
||||||
|
pwminv: 0 default pwm output, 1 inverts pwm output.
|
||||||
|
|
@ -3,8 +3,8 @@ Kernel driver k10temp
|
|||||||
|
|
||||||
Supported chips:
|
Supported chips:
|
||||||
* AMD Family 10h processors:
|
* AMD Family 10h processors:
|
||||||
Socket F: Quad-Core/Six-Core/Embedded Opteron
|
Socket F: Quad-Core/Six-Core/Embedded Opteron (but see below)
|
||||||
Socket AM2+: Opteron, Phenom (II) X3/X4
|
Socket AM2+: Quad-Core Opteron, Phenom (II) X3/X4, Athlon X2 (but see below)
|
||||||
Socket AM3: Quad-Core Opteron, Athlon/Phenom II X2/X3/X4, Sempron II
|
Socket AM3: Quad-Core Opteron, Athlon/Phenom II X2/X3/X4, Sempron II
|
||||||
Socket S1G3: Athlon II, Sempron, Turion II
|
Socket S1G3: Athlon II, Sempron, Turion II
|
||||||
* AMD Family 11h processors:
|
* AMD Family 11h processors:
|
||||||
@ -36,10 +36,15 @@ Description
|
|||||||
This driver permits reading of the internal temperature sensor of AMD
|
This driver permits reading of the internal temperature sensor of AMD
|
||||||
Family 10h and 11h processors.
|
Family 10h and 11h processors.
|
||||||
|
|
||||||
All these processors have a sensor, but on older revisions of Family 10h
|
All these processors have a sensor, but on those for Socket F or AM2+,
|
||||||
processors, the sensor may return inconsistent values (erratum 319). The
|
the sensor may return inconsistent values (erratum 319). The driver
|
||||||
driver will refuse to load on these revisions unless you specify the
|
will refuse to load on these revisions unless you specify the "force=1"
|
||||||
"force=1" module parameter.
|
module parameter.
|
||||||
|
|
||||||
|
Due to technical reasons, the driver can detect only the mainboard's
|
||||||
|
socket type, not the processor's actual capabilities. Therefore, if you
|
||||||
|
are using an AM3 processor on an AM2+ mainboard, you can safely use the
|
||||||
|
"force=1" parameter.
|
||||||
|
|
||||||
There is one temperature measurement value, available as temp1_input in
|
There is one temperature measurement value, available as temp1_input in
|
||||||
sysfs. It is measured in degrees Celsius with a resolution of 1/8th degree.
|
sysfs. It is measured in degrees Celsius with a resolution of 1/8th degree.
|
||||||
|
@ -56,10 +56,11 @@ Following this convention is good because:
|
|||||||
(5) When following the convention, the driver code can use generic
|
(5) When following the convention, the driver code can use generic
|
||||||
code to copy the parameters between user and kernel space.
|
code to copy the parameters between user and kernel space.
|
||||||
|
|
||||||
This table lists ioctls visible from user land for Linux/i386. It contains
|
This table lists ioctls visible from user land for Linux/x86. It contains
|
||||||
most drivers up to 2.3.14, but I know I am missing some.
|
most drivers up to 2.6.31, but I know I am missing some. There has been
|
||||||
|
no attempt to list non-X86 architectures or ioctls from drivers/staging/.
|
||||||
|
|
||||||
Code Seq# Include File Comments
|
Code Seq#(hex) Include File Comments
|
||||||
========================================================
|
========================================================
|
||||||
0x00 00-1F linux/fs.h conflict!
|
0x00 00-1F linux/fs.h conflict!
|
||||||
0x00 00-1F scsi/scsi_ioctl.h conflict!
|
0x00 00-1F scsi/scsi_ioctl.h conflict!
|
||||||
@ -69,119 +70,228 @@ Code Seq# Include File Comments
|
|||||||
0x03 all linux/hdreg.h
|
0x03 all linux/hdreg.h
|
||||||
0x04 D2-DC linux/umsdos_fs.h Dead since 2.6.11, but don't reuse these.
|
0x04 D2-DC linux/umsdos_fs.h Dead since 2.6.11, but don't reuse these.
|
||||||
0x06 all linux/lp.h
|
0x06 all linux/lp.h
|
||||||
0x09 all linux/md.h
|
0x09 all linux/raid/md_u.h
|
||||||
|
0x10 00-0F drivers/char/s390/vmcp.h
|
||||||
0x12 all linux/fs.h
|
0x12 all linux/fs.h
|
||||||
linux/blkpg.h
|
linux/blkpg.h
|
||||||
0x1b all InfiniBand Subsystem <http://www.openib.org/>
|
0x1b all InfiniBand Subsystem <http://www.openib.org/>
|
||||||
0x20 all drivers/cdrom/cm206.h
|
0x20 all drivers/cdrom/cm206.h
|
||||||
0x22 all scsi/sg.h
|
0x22 all scsi/sg.h
|
||||||
'#' 00-3F IEEE 1394 Subsystem Block for the entire subsystem
|
'#' 00-3F IEEE 1394 Subsystem Block for the entire subsystem
|
||||||
|
'$' 00-0F linux/perf_counter.h, linux/perf_event.h
|
||||||
'1' 00-1F <linux/timepps.h> PPS kit from Ulrich Windl
|
'1' 00-1F <linux/timepps.h> PPS kit from Ulrich Windl
|
||||||
<ftp://ftp.de.kernel.org/pub/linux/daemons/ntp/PPS/>
|
<ftp://ftp.de.kernel.org/pub/linux/daemons/ntp/PPS/>
|
||||||
|
'2' 01-04 linux/i2o.h
|
||||||
|
'3' 00-0F drivers/s390/char/raw3270.h conflict!
|
||||||
|
'3' 00-1F linux/suspend_ioctls.h conflict!
|
||||||
|
and kernel/power/user.c
|
||||||
'8' all SNP8023 advanced NIC card
|
'8' all SNP8023 advanced NIC card
|
||||||
<mailto:mcr@solidum.com>
|
<mailto:mcr@solidum.com>
|
||||||
'A' 00-1F linux/apm_bios.h
|
'@' 00-0F linux/radeonfb.h conflict!
|
||||||
|
'@' 00-0F drivers/video/aty/aty128fb.c conflict!
|
||||||
|
'A' 00-1F linux/apm_bios.h conflict!
|
||||||
|
'A' 00-0F linux/agpgart.h conflict!
|
||||||
|
and drivers/char/agp/compat_ioctl.h
|
||||||
|
'A' 00-7F sound/asound.h conflict!
|
||||||
|
'B' 00-1F linux/cciss_ioctl.h conflict!
|
||||||
|
'B' 00-0F include/linux/pmu.h conflict!
|
||||||
'B' C0-FF advanced bbus
|
'B' C0-FF advanced bbus
|
||||||
<mailto:maassen@uni-freiburg.de>
|
<mailto:maassen@uni-freiburg.de>
|
||||||
'C' all linux/soundcard.h
|
'C' all linux/soundcard.h conflict!
|
||||||
|
'C' 01-2F linux/capi.h conflict!
|
||||||
|
'C' F0-FF drivers/net/wan/cosa.h conflict!
|
||||||
'D' all arch/s390/include/asm/dasd.h
|
'D' all arch/s390/include/asm/dasd.h
|
||||||
'E' all linux/input.h
|
'D' 40-5F drivers/scsi/dpt/dtpi_ioctl.h
|
||||||
'F' all linux/fb.h
|
'D' 05 drivers/scsi/pmcraid.h
|
||||||
'H' all linux/hiddev.h
|
'E' all linux/input.h conflict!
|
||||||
'I' all linux/isdn.h
|
'E' 00-0F xen/evtchn.h conflict!
|
||||||
|
'F' all linux/fb.h conflict!
|
||||||
|
'F' 01-02 drivers/scsi/pmcraid.h conflict!
|
||||||
|
'F' 20 drivers/video/fsl-diu-fb.h conflict!
|
||||||
|
'F' 20 drivers/video/intelfb/intelfb.h conflict!
|
||||||
|
'F' 20 linux/ivtvfb.h conflict!
|
||||||
|
'F' 20 linux/matroxfb.h conflict!
|
||||||
|
'F' 20 drivers/video/aty/atyfb_base.c conflict!
|
||||||
|
'F' 00-0F video/da8xx-fb.h conflict!
|
||||||
|
'F' 80-8F linux/arcfb.h conflict!
|
||||||
|
'F' DD video/sstfb.h conflict!
|
||||||
|
'G' 00-3F drivers/misc/sgi-gru/grulib.h conflict!
|
||||||
|
'G' 00-0F linux/gigaset_dev.h conflict!
|
||||||
|
'H' 00-7F linux/hiddev.h conflict!
|
||||||
|
'H' 00-0F linux/hidraw.h conflict!
|
||||||
|
'H' 00-0F sound/asound.h conflict!
|
||||||
|
'H' 20-40 sound/asound_fm.h conflict!
|
||||||
|
'H' 80-8F sound/sfnt_info.h conflict!
|
||||||
|
'H' 10-8F sound/emu10k1.h conflict!
|
||||||
|
'H' 10-1F sound/sb16_csp.h conflict!
|
||||||
|
'H' 10-1F sound/hda_hwdep.h conflict!
|
||||||
|
'H' 40-4F sound/hdspm.h conflict!
|
||||||
|
'H' 40-4F sound/hdsp.h conflict!
|
||||||
|
'H' 90 sound/usb/usx2y/usb_stream.h
|
||||||
|
'H' C0-F0 net/bluetooth/hci.h conflict!
|
||||||
|
'H' C0-DF net/bluetooth/hidp/hidp.h conflict!
|
||||||
|
'H' C0-DF net/bluetooth/cmtp/cmtp.h conflict!
|
||||||
|
'H' C0-DF net/bluetooth/bnep/bnep.h conflict!
|
||||||
|
'I' all linux/isdn.h conflict!
|
||||||
|
'I' 00-0F drivers/isdn/divert/isdn_divert.h conflict!
|
||||||
|
'I' 40-4F linux/mISDNif.h conflict!
|
||||||
'J' 00-1F drivers/scsi/gdth_ioctl.h
|
'J' 00-1F drivers/scsi/gdth_ioctl.h
|
||||||
'K' all linux/kd.h
|
'K' all linux/kd.h
|
||||||
'L' 00-1F linux/loop.h
|
'L' 00-1F linux/loop.h conflict!
|
||||||
'L' 20-2F driver/usb/misc/vstusb.h
|
'L' 10-1F drivers/scsi/mpt2sas/mpt2sas_ctl.h conflict!
|
||||||
|
'L' 20-2F linux/usb/vstusb.h
|
||||||
'L' E0-FF linux/ppdd.h encrypted disk device driver
|
'L' E0-FF linux/ppdd.h encrypted disk device driver
|
||||||
<http://linux01.gwdg.de/~alatham/ppdd.html>
|
<http://linux01.gwdg.de/~alatham/ppdd.html>
|
||||||
'M' all linux/soundcard.h
|
'M' all linux/soundcard.h conflict!
|
||||||
|
'M' 01-16 mtd/mtd-abi.h conflict!
|
||||||
|
and drivers/mtd/mtdchar.c
|
||||||
|
'M' 01-03 drivers/scsi/megaraid/megaraid_sas.h
|
||||||
|
'M' 00-0F drivers/video/fsl-diu-fb.h conflict!
|
||||||
'N' 00-1F drivers/usb/scanner.h
|
'N' 00-1F drivers/usb/scanner.h
|
||||||
'O' 00-02 include/mtd/ubi-user.h UBI
|
'O' 00-06 mtd/ubi-user.h UBI
|
||||||
'P' all linux/soundcard.h
|
'P' all linux/soundcard.h conflict!
|
||||||
|
'P' 60-6F sound/sscape_ioctl.h conflict!
|
||||||
|
'P' 00-0F drivers/usb/class/usblp.c conflict!
|
||||||
'Q' all linux/soundcard.h
|
'Q' all linux/soundcard.h
|
||||||
'R' 00-1F linux/random.h
|
'R' 00-1F linux/random.h conflict!
|
||||||
|
'R' 01 linux/rfkill.h conflict!
|
||||||
|
'R' 01-0F media/rds.h conflict!
|
||||||
|
'R' C0-DF net/bluetooth/rfcomm.h
|
||||||
'S' all linux/cdrom.h conflict!
|
'S' all linux/cdrom.h conflict!
|
||||||
'S' 80-81 scsi/scsi_ioctl.h conflict!
|
'S' 80-81 scsi/scsi_ioctl.h conflict!
|
||||||
'S' 82-FF scsi/scsi.h conflict!
|
'S' 82-FF scsi/scsi.h conflict!
|
||||||
|
'S' 00-7F sound/asequencer.h conflict!
|
||||||
'T' all linux/soundcard.h conflict!
|
'T' all linux/soundcard.h conflict!
|
||||||
|
'T' 00-AF sound/asound.h conflict!
|
||||||
'T' all arch/x86/include/asm/ioctls.h conflict!
|
'T' all arch/x86/include/asm/ioctls.h conflict!
|
||||||
'U' 00-EF linux/drivers/usb/usb.h
|
'T' C0-DF linux/if_tun.h conflict!
|
||||||
'V' all linux/vt.h
|
'U' all sound/asound.h conflict!
|
||||||
|
'U' 00-0F drivers/media/video/uvc/uvcvideo.h conflict!
|
||||||
|
'U' 00-CF linux/uinput.h conflict!
|
||||||
|
'U' 00-EF linux/usbdevice_fs.h
|
||||||
|
'U' C0-CF drivers/bluetooth/hci_uart.h
|
||||||
|
'V' all linux/vt.h conflict!
|
||||||
|
'V' all linux/videodev2.h conflict!
|
||||||
|
'V' C0 linux/ivtvfb.h conflict!
|
||||||
|
'V' C0 linux/ivtv.h conflict!
|
||||||
|
'V' C0 media/davinci/vpfe_capture.h conflict!
|
||||||
|
'V' C0 media/si4713.h conflict!
|
||||||
|
'V' C0-CF drivers/media/video/mxb.h conflict!
|
||||||
'W' 00-1F linux/watchdog.h conflict!
|
'W' 00-1F linux/watchdog.h conflict!
|
||||||
'W' 00-1F linux/wanrouter.h conflict!
|
'W' 00-1F linux/wanrouter.h conflict!
|
||||||
'X' all linux/xfs_fs.h
|
'W' 00-3F sound/asound.h conflict!
|
||||||
|
'X' all fs/xfs/xfs_fs.h conflict!
|
||||||
|
and fs/xfs/linux-2.6/xfs_ioctl32.h
|
||||||
|
and include/linux/falloc.h
|
||||||
|
and linux/fs.h
|
||||||
|
'X' all fs/ocfs2/ocfs_fs.h conflict!
|
||||||
|
'X' 01 linux/pktcdvd.h conflict!
|
||||||
'Y' all linux/cyclades.h
|
'Y' all linux/cyclades.h
|
||||||
'[' 00-07 linux/usb/usbtmc.h USB Test and Measurement Devices
|
'Z' 14-15 drivers/message/fusion/mptctl.h
|
||||||
|
'[' 00-07 linux/usb/tmc.h USB Test and Measurement Devices
|
||||||
<mailto:gregkh@suse.de>
|
<mailto:gregkh@suse.de>
|
||||||
'a' all ATM on linux
|
'a' all linux/atm*.h, linux/sonet.h ATM on linux
|
||||||
<http://lrcwww.epfl.ch/linux-atm/magic.html>
|
<http://lrcwww.epfl.ch/linux-atm/magic.html>
|
||||||
'b' 00-FF bit3 vme host bridge
|
'b' 00-FF conflict! bit3 vme host bridge
|
||||||
<mailto:natalia@nikhefk.nikhef.nl>
|
<mailto:natalia@nikhefk.nikhef.nl>
|
||||||
|
'b' 00-0F media/bt819.h conflict!
|
||||||
|
'c' all linux/cm4000_cs.h conflict!
|
||||||
'c' 00-7F linux/comstats.h conflict!
|
'c' 00-7F linux/comstats.h conflict!
|
||||||
'c' 00-7F linux/coda.h conflict!
|
'c' 00-7F linux/coda.h conflict!
|
||||||
'c' 80-9F arch/s390/include/asm/chsc.h
|
'c' 00-1F linux/chio.h conflict!
|
||||||
'c' A0-AF arch/x86/include/asm/msr.h
|
'c' 80-9F arch/s390/include/asm/chsc.h conflict!
|
||||||
|
'c' A0-AF arch/x86/include/asm/msr.h conflict!
|
||||||
'd' 00-FF linux/char/drm/drm/h conflict!
|
'd' 00-FF linux/char/drm/drm/h conflict!
|
||||||
|
'd' 02-40 pcmcia/ds.h conflict!
|
||||||
|
'd' 10-3F drivers/media/video/dabusb.h conflict!
|
||||||
|
'd' C0-CF drivers/media/video/saa7191.h conflict!
|
||||||
'd' F0-FF linux/digi1.h
|
'd' F0-FF linux/digi1.h
|
||||||
'e' all linux/digi1.h conflict!
|
'e' all linux/digi1.h conflict!
|
||||||
'e' 00-1F net/irda/irtty.h conflict!
|
'e' 00-1F drivers/net/irda/irtty-sir.h conflict!
|
||||||
'f' 00-1F linux/ext2_fs.h
|
'f' 00-1F linux/ext2_fs.h conflict!
|
||||||
'h' 00-7F Charon filesystem
|
'f' 00-1F linux/ext3_fs.h conflict!
|
||||||
|
'f' 00-0F fs/jfs/jfs_dinode.h conflict!
|
||||||
|
'f' 00-0F fs/ext4/ext4.h conflict!
|
||||||
|
'f' 00-0F linux/fs.h conflict!
|
||||||
|
'f' 00-0F fs/ocfs2/ocfs2_fs.h conflict!
|
||||||
|
'g' 00-0F linux/usb/gadgetfs.h
|
||||||
|
'g' 20-2F linux/usb/g_printer.h
|
||||||
|
'h' 00-7F conflict! Charon filesystem
|
||||||
<mailto:zapman@interlan.net>
|
<mailto:zapman@interlan.net>
|
||||||
'i' 00-3F linux/i2o.h
|
'h' 00-1F linux/hpet.h conflict!
|
||||||
|
'i' 00-3F linux/i2o-dev.h conflict!
|
||||||
|
'i' 0B-1F linux/ipmi.h conflict!
|
||||||
|
'i' 80-8F linux/i8k.h
|
||||||
'j' 00-3F linux/joystick.h
|
'j' 00-3F linux/joystick.h
|
||||||
|
'k' 00-0F linux/spi/spidev.h conflict!
|
||||||
|
'k' 00-05 video/kyro.h conflict!
|
||||||
'l' 00-3F linux/tcfs_fs.h transparent cryptographic file system
|
'l' 00-3F linux/tcfs_fs.h transparent cryptographic file system
|
||||||
<http://mikonos.dia.unisa.it/tcfs>
|
<http://mikonos.dia.unisa.it/tcfs>
|
||||||
'l' 40-7F linux/udf_fs_i.h in development:
|
'l' 40-7F linux/udf_fs_i.h in development:
|
||||||
<http://sourceforge.net/projects/linux-udf/>
|
<http://sourceforge.net/projects/linux-udf/>
|
||||||
'm' 00-09 linux/mmtimer.h
|
'm' 00-09 linux/mmtimer.h conflict!
|
||||||
'm' all linux/mtio.h conflict!
|
'm' all linux/mtio.h conflict!
|
||||||
'm' all linux/soundcard.h conflict!
|
'm' all linux/soundcard.h conflict!
|
||||||
'm' all linux/synclink.h conflict!
|
'm' all linux/synclink.h conflict!
|
||||||
|
'm' 00-19 drivers/message/fusion/mptctl.h conflict!
|
||||||
|
'm' 00 drivers/scsi/megaraid/megaraid_ioctl.h conflict!
|
||||||
'm' 00-1F net/irda/irmod.h conflict!
|
'm' 00-1F net/irda/irmod.h conflict!
|
||||||
'n' 00-7F linux/ncp_fs.h
|
'n' 00-7F linux/ncp_fs.h and fs/ncpfs/ioctl.c
|
||||||
'n' 80-8F linux/nilfs2_fs.h NILFS2
|
'n' 80-8F linux/nilfs2_fs.h NILFS2
|
||||||
'n' E0-FF video/matrox.h matroxfb
|
'n' E0-FF linux/matroxfb.h matroxfb
|
||||||
'o' 00-1F fs/ocfs2/ocfs2_fs.h OCFS2
|
'o' 00-1F fs/ocfs2/ocfs2_fs.h OCFS2
|
||||||
'o' 00-03 include/mtd/ubi-user.h conflict! (OCFS2 and UBI overlaps)
|
'o' 00-03 mtd/ubi-user.h conflict! (OCFS2 and UBI overlaps)
|
||||||
'o' 40-41 include/mtd/ubi-user.h UBI
|
'o' 40-41 mtd/ubi-user.h UBI
|
||||||
'o' 01-A1 include/linux/dvb/*.h DVB
|
'o' 01-A1 linux/dvb/*.h DVB
|
||||||
'p' 00-0F linux/phantom.h conflict! (OpenHaptics needs this)
|
'p' 00-0F linux/phantom.h conflict! (OpenHaptics needs this)
|
||||||
|
'p' 00-1F linux/rtc.h conflict!
|
||||||
'p' 00-3F linux/mc146818rtc.h conflict!
|
'p' 00-3F linux/mc146818rtc.h conflict!
|
||||||
'p' 40-7F linux/nvram.h
|
'p' 40-7F linux/nvram.h
|
||||||
'p' 80-9F user-space parport
|
'p' 80-9F linux/ppdev.h user-space parport
|
||||||
<mailto:tim@cyberelk.net>
|
<mailto:tim@cyberelk.net>
|
||||||
'p' a1-a4 linux/pps.h LinuxPPS
|
'p' A1-A4 linux/pps.h LinuxPPS
|
||||||
<mailto:giometti@linux.it>
|
<mailto:giometti@linux.it>
|
||||||
'q' 00-1F linux/serio.h
|
'q' 00-1F linux/serio.h
|
||||||
'q' 80-FF Internet PhoneJACK, Internet LineJACK
|
'q' 80-FF linux/telephony.h Internet PhoneJACK, Internet LineJACK
|
||||||
<http://www.quicknet.net>
|
linux/ixjuser.h <http://www.quicknet.net>
|
||||||
'r' 00-1F linux/msdos_fs.h
|
'r' 00-1F linux/msdos_fs.h and fs/fat/dir.c
|
||||||
's' all linux/cdk.h
|
's' all linux/cdk.h
|
||||||
't' 00-7F linux/if_ppp.h
|
't' 00-7F linux/if_ppp.h
|
||||||
't' 80-8F linux/isdn_ppp.h
|
't' 80-8F linux/isdn_ppp.h
|
||||||
|
't' 90 linux/toshiba.h
|
||||||
'u' 00-1F linux/smb_fs.h
|
'u' 00-1F linux/smb_fs.h
|
||||||
'v' 00-1F linux/ext2_fs.h conflict!
|
|
||||||
'v' all linux/videodev.h conflict!
|
'v' all linux/videodev.h conflict!
|
||||||
|
'v' 00-1F linux/ext2_fs.h conflict!
|
||||||
|
'v' 00-1F linux/fs.h conflict!
|
||||||
|
'v' 00-0F linux/sonypi.h conflict!
|
||||||
|
'v' C0-CF drivers/media/video/ov511.h conflict!
|
||||||
|
'v' C0-DF media/pwc-ioctl.h conflict!
|
||||||
|
'v' C0-FF linux/meye.h conflict!
|
||||||
|
'v' C0-CF drivers/media/video/zoran/zoran.h conflict!
|
||||||
|
'v' D0-DF drivers/media/video/cpia2/cpia2dev.h conflict!
|
||||||
'w' all CERN SCI driver
|
'w' all CERN SCI driver
|
||||||
'y' 00-1F packet based user level communications
|
'y' 00-1F packet based user level communications
|
||||||
<mailto:zapman@interlan.net>
|
<mailto:zapman@interlan.net>
|
||||||
'z' 00-3F CAN bus card
|
'z' 00-3F CAN bus card conflict!
|
||||||
<mailto:hdstich@connectu.ulm.circular.de>
|
<mailto:hdstich@connectu.ulm.circular.de>
|
||||||
'z' 40-7F CAN bus card
|
'z' 40-7F CAN bus card conflict!
|
||||||
<mailto:oe@port.de>
|
<mailto:oe@port.de>
|
||||||
|
'z' 10-4F drivers/s390/crypto/zcrypt_api.h conflict!
|
||||||
0x80 00-1F linux/fb.h
|
0x80 00-1F linux/fb.h
|
||||||
0x81 00-1F linux/videotext.h
|
0x81 00-1F linux/videotext.h
|
||||||
|
0x88 00-3F media/ovcamchip.h
|
||||||
0x89 00-06 arch/x86/include/asm/sockios.h
|
0x89 00-06 arch/x86/include/asm/sockios.h
|
||||||
0x89 0B-DF linux/sockios.h
|
0x89 0B-DF linux/sockios.h
|
||||||
0x89 E0-EF linux/sockios.h SIOCPROTOPRIVATE range
|
0x89 E0-EF linux/sockios.h SIOCPROTOPRIVATE range
|
||||||
|
0x89 E0-EF linux/dn.h PROTOPRIVATE range
|
||||||
0x89 F0-FF linux/sockios.h SIOCDEVPRIVATE range
|
0x89 F0-FF linux/sockios.h SIOCDEVPRIVATE range
|
||||||
0x8B all linux/wireless.h
|
0x8B all linux/wireless.h
|
||||||
0x8C 00-3F WiNRADiO driver
|
0x8C 00-3F WiNRADiO driver
|
||||||
<http://www.proximity.com.au/~brian/winradio/>
|
<http://www.proximity.com.au/~brian/winradio/>
|
||||||
0x90 00 drivers/cdrom/sbpcd.h
|
0x90 00 drivers/cdrom/sbpcd.h
|
||||||
|
0x92 00-0F drivers/usb/mon/mon_bin.c
|
||||||
0x93 60-7F linux/auto_fs.h
|
0x93 60-7F linux/auto_fs.h
|
||||||
|
0x94 all fs/btrfs/ioctl.h
|
||||||
0x99 00-0F 537-Addinboard driver
|
0x99 00-0F 537-Addinboard driver
|
||||||
<mailto:buk@buks.ipn.de>
|
<mailto:buk@buks.ipn.de>
|
||||||
0xA0 all linux/sdp/sdp.h Industrial Device Project
|
0xA0 all linux/sdp/sdp.h Industrial Device Project
|
||||||
@ -192,17 +302,22 @@ Code Seq# Include File Comments
|
|||||||
0xAB 00-1F linux/nbd.h
|
0xAB 00-1F linux/nbd.h
|
||||||
0xAC 00-1F linux/raw.h
|
0xAC 00-1F linux/raw.h
|
||||||
0xAD 00 Netfilter device in development:
|
0xAD 00 Netfilter device in development:
|
||||||
<mailto:rusty@rustcorp.com.au>
|
<mailto:rusty@rustcorp.com.au>
|
||||||
0xAE all linux/kvm.h Kernel-based Virtual Machine
|
0xAE all linux/kvm.h Kernel-based Virtual Machine
|
||||||
<mailto:kvm@vger.kernel.org>
|
<mailto:kvm@vger.kernel.org>
|
||||||
0xB0 all RATIO devices in development:
|
0xB0 all RATIO devices in development:
|
||||||
<mailto:vgo@ratio.de>
|
<mailto:vgo@ratio.de>
|
||||||
0xB1 00-1F PPPoX <mailto:mostrows@styx.uwaterloo.ca>
|
0xB1 00-1F PPPoX <mailto:mostrows@styx.uwaterloo.ca>
|
||||||
|
0xC0 00-0F linux/usb/iowarrior.h
|
||||||
0xCB 00-1F CBM serial IEC bus in development:
|
0xCB 00-1F CBM serial IEC bus in development:
|
||||||
<mailto:michael.klein@puffin.lb.shuttle.de>
|
<mailto:michael.klein@puffin.lb.shuttle.de>
|
||||||
|
0xCD 01 linux/reiserfs_fs.h
|
||||||
|
0xCF 02 fs/cifs/ioctl.c
|
||||||
|
0xDB 00-0F drivers/char/mwave/mwavepub.h
|
||||||
0xDD 00-3F ZFCP device driver see drivers/s390/scsi/
|
0xDD 00-3F ZFCP device driver see drivers/s390/scsi/
|
||||||
<mailto:aherrman@de.ibm.com>
|
<mailto:aherrman@de.ibm.com>
|
||||||
0xF3 00-3F video/sisfb.h sisfb (in development)
|
0xF3 00-3F drivers/usb/misc/sisusbvga/sisusb.h sisfb (in development)
|
||||||
<mailto:thomas@winischhofer.net>
|
<mailto:thomas@winischhofer.net>
|
||||||
0xF4 00-1F video/mbxfb.h mbxfb
|
0xF4 00-1F video/mbxfb.h mbxfb
|
||||||
<mailto:raph@8d.com>
|
<mailto:raph@8d.com>
|
||||||
|
0xFD all linux/dm-ioctl.h
|
||||||
|
@ -214,11 +214,13 @@ The format of the block comment is like this:
|
|||||||
* (section header: (section description)? )*
|
* (section header: (section description)? )*
|
||||||
(*)?*/
|
(*)?*/
|
||||||
|
|
||||||
The short function description ***cannot be multiline***, but the other
|
All "description" text can span multiple lines, although the
|
||||||
descriptions can be (and they can contain blank lines). If you continue
|
function_name & its short description are traditionally on a single line.
|
||||||
that initial short description onto a second line, that second line will
|
Description text may also contain blank lines (i.e., lines that contain
|
||||||
appear further down at the beginning of the description section, which is
|
only a "*").
|
||||||
almost certainly not what you had in mind.
|
|
||||||
|
"section header:" names must be unique per function (or struct,
|
||||||
|
union, typedef, enum).
|
||||||
|
|
||||||
Avoid putting a spurious blank line after the function name, or else the
|
Avoid putting a spurious blank line after the function name, or else the
|
||||||
description will be repeated!
|
description will be repeated!
|
||||||
|
@ -240,7 +240,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||||||
|
|
||||||
acpi_sleep= [HW,ACPI] Sleep options
|
acpi_sleep= [HW,ACPI] Sleep options
|
||||||
Format: { s3_bios, s3_mode, s3_beep, s4_nohwsig,
|
Format: { s3_bios, s3_mode, s3_beep, s4_nohwsig,
|
||||||
old_ordering, s4_nonvs }
|
old_ordering, s4_nonvs, sci_force_enable }
|
||||||
See Documentation/power/video.txt for information on
|
See Documentation/power/video.txt for information on
|
||||||
s3_bios and s3_mode.
|
s3_bios and s3_mode.
|
||||||
s3_beep is for debugging; it makes the PC's speaker beep
|
s3_beep is for debugging; it makes the PC's speaker beep
|
||||||
@ -253,6 +253,9 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||||||
of _PTS is used by default).
|
of _PTS is used by default).
|
||||||
s4_nonvs prevents the kernel from saving/restoring the
|
s4_nonvs prevents the kernel from saving/restoring the
|
||||||
ACPI NVS memory during hibernation.
|
ACPI NVS memory during hibernation.
|
||||||
|
sci_force_enable causes the kernel to set SCI_EN directly
|
||||||
|
on resume from S1/S3 (which is against the ACPI spec,
|
||||||
|
but some broken systems don't work without it).
|
||||||
|
|
||||||
acpi_use_timer_override [HW,ACPI]
|
acpi_use_timer_override [HW,ACPI]
|
||||||
Use timer override. For some broken Nvidia NF5 boards
|
Use timer override. For some broken Nvidia NF5 boards
|
||||||
|
@ -685,7 +685,7 @@ struct kvm_vcpu_events {
|
|||||||
__u8 pad;
|
__u8 pad;
|
||||||
} nmi;
|
} nmi;
|
||||||
__u32 sipi_vector;
|
__u32 sipi_vector;
|
||||||
__u32 flags; /* must be zero */
|
__u32 flags;
|
||||||
};
|
};
|
||||||
|
|
||||||
4.30 KVM_SET_VCPU_EVENTS
|
4.30 KVM_SET_VCPU_EVENTS
|
||||||
@ -701,6 +701,14 @@ vcpu.
|
|||||||
|
|
||||||
See KVM_GET_VCPU_EVENTS for the data structure.
|
See KVM_GET_VCPU_EVENTS for the data structure.
|
||||||
|
|
||||||
|
Fields that may be modified asynchronously by running VCPUs can be excluded
|
||||||
|
from the update. These fields are nmi.pending and sipi_vector. Keep the
|
||||||
|
corresponding bits in the flags field cleared to suppress overwriting the
|
||||||
|
current in-kernel state. The bits are:
|
||||||
|
|
||||||
|
KVM_VCPUEVENT_VALID_NMI_PENDING - transfer nmi.pending to the kernel
|
||||||
|
KVM_VCPUEVENT_VALID_SIPI_VECTOR - transfer sipi_vector
|
||||||
|
|
||||||
|
|
||||||
5. The kvm_run structure
|
5. The kvm_run structure
|
||||||
|
|
||||||
|
@ -1092,8 +1092,8 @@ WARNING:
|
|||||||
its level up and down at every change.
|
its level up and down at every change.
|
||||||
|
|
||||||
|
|
||||||
Volume control
|
Volume control (Console Audio control)
|
||||||
--------------
|
--------------------------------------
|
||||||
|
|
||||||
procfs: /proc/acpi/ibm/volume
|
procfs: /proc/acpi/ibm/volume
|
||||||
ALSA: "ThinkPad Console Audio Control", default ID: "ThinkPadEC"
|
ALSA: "ThinkPad Console Audio Control", default ID: "ThinkPadEC"
|
||||||
@ -1110,9 +1110,53 @@ the desktop environment to just provide on-screen-display feedback.
|
|||||||
Software volume control should be done only in the main AC97/HDA
|
Software volume control should be done only in the main AC97/HDA
|
||||||
mixer.
|
mixer.
|
||||||
|
|
||||||
This feature allows volume control on ThinkPad models with a digital
|
|
||||||
volume knob (when available, not all models have it), as well as
|
About the ThinkPad Console Audio control:
|
||||||
mute/unmute control. The available commands are:
|
|
||||||
|
ThinkPads have a built-in amplifier and muting circuit that drives the
|
||||||
|
console headphone and speakers. This circuit is after the main AC97
|
||||||
|
or HDA mixer in the audio path, and under exclusive control of the
|
||||||
|
firmware.
|
||||||
|
|
||||||
|
ThinkPads have three special hotkeys to interact with the console
|
||||||
|
audio control: volume up, volume down and mute.
|
||||||
|
|
||||||
|
It is worth noting that the normal way the mute function works (on
|
||||||
|
ThinkPads that do not have a "mute LED") is:
|
||||||
|
|
||||||
|
1. Press mute to mute. It will *always* mute, you can press it as
|
||||||
|
many times as you want, and the sound will remain mute.
|
||||||
|
|
||||||
|
2. Press either volume key to unmute the ThinkPad (it will _not_
|
||||||
|
change the volume, it will just unmute).
|
||||||
|
|
||||||
|
This is a very superior design when compared to the cheap software-only
|
||||||
|
mute-toggle solution found on normal consumer laptops: you can be
|
||||||
|
absolutely sure the ThinkPad will not make noise if you press the mute
|
||||||
|
button, no matter the previous state.
|
||||||
|
|
||||||
|
The IBM ThinkPads, and the earlier Lenovo ThinkPads have variable-gain
|
||||||
|
amplifiers driving the speakers and headphone output, and the firmware
|
||||||
|
also handles volume control for the headphone and speakers on these
|
||||||
|
ThinkPads without any help from the operating system (this volume
|
||||||
|
control stage exists after the main AC97 or HDA mixer in the audio
|
||||||
|
path).
|
||||||
|
|
||||||
|
The newer Lenovo models only have firmware mute control, and depend on
|
||||||
|
the main HDA mixer to do volume control (which is done by the operating
|
||||||
|
system). In this case, the volume keys are filtered out for unmute
|
||||||
|
key press (there are some firmware bugs in this area) and delivered as
|
||||||
|
normal key presses to the operating system (thinkpad-acpi is not
|
||||||
|
involved).
|
||||||
|
|
||||||
|
|
||||||
|
The ThinkPad-ACPI volume control:
|
||||||
|
|
||||||
|
The preferred way to interact with the Console Audio control is the
|
||||||
|
ALSA interface.
|
||||||
|
|
||||||
|
The legacy procfs interface allows one to read the current state,
|
||||||
|
and if volume control is enabled, accepts the following commands:
|
||||||
|
|
||||||
echo up >/proc/acpi/ibm/volume
|
echo up >/proc/acpi/ibm/volume
|
||||||
echo down >/proc/acpi/ibm/volume
|
echo down >/proc/acpi/ibm/volume
|
||||||
@ -1121,12 +1165,10 @@ mute/unmute control. The available commands are:
|
|||||||
echo 'level <level>' >/proc/acpi/ibm/volume
|
echo 'level <level>' >/proc/acpi/ibm/volume
|
||||||
|
|
||||||
The <level> number range is 0 to 14 although not all of them may be
|
The <level> number range is 0 to 14 although not all of them may be
|
||||||
distinct. The unmute the volume after the mute command, use either the
|
distinct. To unmute the volume after the mute command, use either the
|
||||||
up or down command (the level command will not unmute the volume), or
|
up or down command (the level command will not unmute the volume), or
|
||||||
the unmute command.
|
the unmute command.
|
||||||
|
|
||||||
The current volume level and mute state is shown in the file.
|
|
||||||
|
|
||||||
You can use the volume_capabilities parameter to tell the driver
|
You can use the volume_capabilities parameter to tell the driver
|
||||||
whether your thinkpad has volume control or mute-only control:
|
whether your thinkpad has volume control or mute-only control:
|
||||||
volume_capabilities=1 for mixers with mute and volume control,
|
volume_capabilities=1 for mixers with mute and volume control,
|
||||||
|
@ -48,11 +48,11 @@ for LILO parameters for doing this:
|
|||||||
This configures the first found 3c509 card for IRQ 10, base I/O 0x310, and
|
This configures the first found 3c509 card for IRQ 10, base I/O 0x310, and
|
||||||
transceiver type 3 (10base2). The flag "0x3c509" must be set to avoid conflicts
|
transceiver type 3 (10base2). The flag "0x3c509" must be set to avoid conflicts
|
||||||
with other card types when overriding the I/O address. When the driver is
|
with other card types when overriding the I/O address. When the driver is
|
||||||
loaded as a module, only the IRQ and transceiver setting may be overridden.
|
loaded as a module, only the IRQ may be overridden. For example,
|
||||||
For example, setting two cards to 10base2/IRQ10 and AUI/IRQ11 is done by using
|
setting two cards to IRQ10 and IRQ11 is done by using the irq module
|
||||||
the xcvr and irq module options:
|
option:
|
||||||
|
|
||||||
options 3c509 xcvr=3,1 irq=10,11
|
options 3c509 irq=10,11
|
||||||
|
|
||||||
|
|
||||||
(2) Full-duplex mode
|
(2) Full-duplex mode
|
||||||
@ -77,6 +77,8 @@ operation.
|
|||||||
itself full-duplex capable. This is almost certainly one of two things: a full-
|
itself full-duplex capable. This is almost certainly one of two things: a full-
|
||||||
duplex-capable Ethernet switch (*not* a hub), or a full-duplex-capable NIC on
|
duplex-capable Ethernet switch (*not* a hub), or a full-duplex-capable NIC on
|
||||||
another system that's connected directly to the 3c509B via a crossover cable.
|
another system that's connected directly to the 3c509B via a crossover cable.
|
||||||
|
|
||||||
|
Full-duplex mode can be enabled using 'ethtool'.
|
||||||
|
|
||||||
/////Extremely important caution concerning full-duplex mode/////
|
/////Extremely important caution concerning full-duplex mode/////
|
||||||
Understand that the 3c509B's hardware's full-duplex support is much more
|
Understand that the 3c509B's hardware's full-duplex support is much more
|
||||||
@ -113,6 +115,8 @@ This insured that merely upgrading the driver from an earlier version would
|
|||||||
never automatically enable full-duplex mode in an existing installation;
|
never automatically enable full-duplex mode in an existing installation;
|
||||||
it must always be explicitly enabled via one of these code in order to be
|
it must always be explicitly enabled via one of these code in order to be
|
||||||
activated.
|
activated.
|
||||||
|
|
||||||
|
The transceiver type can be changed using 'ethtool'.
|
||||||
|
|
||||||
|
|
||||||
(4a) Interpretation of error messages and common problems
|
(4a) Interpretation of error messages and common problems
|
||||||
|
@ -95,7 +95,7 @@ card*/pcm*/xrun_debug
|
|||||||
It takes an integer value, can be changed by writing to this
|
It takes an integer value, can be changed by writing to this
|
||||||
file, such as
|
file, such as
|
||||||
|
|
||||||
# cat 5 > /proc/asound/card0/pcm0p/xrun_debug
|
# echo 5 > /proc/asound/card0/pcm0p/xrun_debug
|
||||||
|
|
||||||
The value consists of the following bit flags:
|
The value consists of the following bit flags:
|
||||||
bit 0 = Enable XRUN/jiffies debug messages
|
bit 0 = Enable XRUN/jiffies debug messages
|
||||||
|
@ -53,14 +53,14 @@ size of the mcount call that is embedded in the function).
|
|||||||
For example, if the function foo() calls bar(), when the bar() function calls
|
For example, if the function foo() calls bar(), when the bar() function calls
|
||||||
mcount(), the arguments mcount() will pass to the tracer are:
|
mcount(), the arguments mcount() will pass to the tracer are:
|
||||||
"frompc" - the address bar() will use to return to foo()
|
"frompc" - the address bar() will use to return to foo()
|
||||||
"selfpc" - the address bar() (with _mcount() size adjustment)
|
"selfpc" - the address bar() (with mcount() size adjustment)
|
||||||
|
|
||||||
Also keep in mind that this mcount function will be called *a lot*, so
|
Also keep in mind that this mcount function will be called *a lot*, so
|
||||||
optimizing for the default case of no tracer will help the smooth running of
|
optimizing for the default case of no tracer will help the smooth running of
|
||||||
your system when tracing is disabled. So the start of the mcount function is
|
your system when tracing is disabled. So the start of the mcount function is
|
||||||
typically the bare min with checking things before returning. That also means
|
typically the bare minimum with checking things before returning. That also
|
||||||
the code flow should usually kept linear (i.e. no branching in the nop case).
|
means the code flow should usually be kept linear (i.e. no branching in the nop
|
||||||
This is of course an optimization and not a hard requirement.
|
case). This is of course an optimization and not a hard requirement.
|
||||||
|
|
||||||
Here is some pseudo code that should help (these functions should actually be
|
Here is some pseudo code that should help (these functions should actually be
|
||||||
implemented in assembly):
|
implemented in assembly):
|
||||||
@ -131,10 +131,10 @@ some functions to save (hijack) and restore the return address.
|
|||||||
|
|
||||||
The mcount function should check the function pointers ftrace_graph_return
|
The mcount function should check the function pointers ftrace_graph_return
|
||||||
(compare to ftrace_stub) and ftrace_graph_entry (compare to
|
(compare to ftrace_stub) and ftrace_graph_entry (compare to
|
||||||
ftrace_graph_entry_stub). If either of those are not set to the relevant stub
|
ftrace_graph_entry_stub). If either of those is not set to the relevant stub
|
||||||
function, call the arch-specific function ftrace_graph_caller which in turn
|
function, call the arch-specific function ftrace_graph_caller which in turn
|
||||||
calls the arch-specific function prepare_ftrace_return. Neither of these
|
calls the arch-specific function prepare_ftrace_return. Neither of these
|
||||||
function names are strictly required, but you should use them anyways to stay
|
function names is strictly required, but you should use them anyway to stay
|
||||||
consistent across the architecture ports -- easier to compare & contrast
|
consistent across the architecture ports -- easier to compare & contrast
|
||||||
things.
|
things.
|
||||||
|
|
||||||
@ -144,7 +144,7 @@ but the first argument should be a pointer to the "frompc". Typically this is
|
|||||||
located on the stack. This allows the function to hijack the return address
|
located on the stack. This allows the function to hijack the return address
|
||||||
temporarily to have it point to the arch-specific function return_to_handler.
|
temporarily to have it point to the arch-specific function return_to_handler.
|
||||||
That function will simply call the common ftrace_return_to_handler function and
|
That function will simply call the common ftrace_return_to_handler function and
|
||||||
that will return the original return address with which, you can return to the
|
that will return the original return address with which you can return to the
|
||||||
original call site.
|
original call site.
|
||||||
|
|
||||||
Here is the updated mcount pseudo code:
|
Here is the updated mcount pseudo code:
|
||||||
|
@ -44,7 +44,8 @@ Check for lost events.
|
|||||||
Usage
|
Usage
|
||||||
-----
|
-----
|
||||||
|
|
||||||
Make sure debugfs is mounted to /sys/kernel/debug. If not, (requires root privileges)
|
Make sure debugfs is mounted to /sys/kernel/debug.
|
||||||
|
If not (requires root privileges):
|
||||||
$ mount -t debugfs debugfs /sys/kernel/debug
|
$ mount -t debugfs debugfs /sys/kernel/debug
|
||||||
|
|
||||||
Check that the driver you are about to trace is not loaded.
|
Check that the driver you are about to trace is not loaded.
|
||||||
@ -91,7 +92,7 @@ $ dmesg > dmesg.txt
|
|||||||
$ tar zcf pciid-nick-mmiotrace.tar.gz mydump.txt lspci.txt dmesg.txt
|
$ tar zcf pciid-nick-mmiotrace.tar.gz mydump.txt lspci.txt dmesg.txt
|
||||||
and then send the .tar.gz file. The trace compresses considerably. Replace
|
and then send the .tar.gz file. The trace compresses considerably. Replace
|
||||||
"pciid" and "nick" with the PCI ID or model name of your piece of hardware
|
"pciid" and "nick" with the PCI ID or model name of your piece of hardware
|
||||||
under investigation and your nick name.
|
under investigation and your nickname.
|
||||||
|
|
||||||
|
|
||||||
How Mmiotrace Works
|
How Mmiotrace Works
|
||||||
@ -100,7 +101,7 @@ How Mmiotrace Works
|
|||||||
Access to hardware IO-memory is gained by mapping addresses from PCI bus by
|
Access to hardware IO-memory is gained by mapping addresses from PCI bus by
|
||||||
calling one of the ioremap_*() functions. Mmiotrace is hooked into the
|
calling one of the ioremap_*() functions. Mmiotrace is hooked into the
|
||||||
__ioremap() function and gets called whenever a mapping is created. Mapping is
|
__ioremap() function and gets called whenever a mapping is created. Mapping is
|
||||||
an event that is recorded into the trace log. Note, that ISA range mappings
|
an event that is recorded into the trace log. Note that ISA range mappings
|
||||||
are not caught, since the mapping always exists and is returned directly.
|
are not caught, since the mapping always exists and is returned directly.
|
||||||
|
|
||||||
MMIO accesses are recorded via page faults. Just before __ioremap() returns,
|
MMIO accesses are recorded via page faults. Just before __ioremap() returns,
|
||||||
@ -122,11 +123,11 @@ Trace Log Format
|
|||||||
----------------
|
----------------
|
||||||
|
|
||||||
The raw log is text and easily filtered with e.g. grep and awk. One record is
|
The raw log is text and easily filtered with e.g. grep and awk. One record is
|
||||||
one line in the log. A record starts with a keyword, followed by keyword
|
one line in the log. A record starts with a keyword, followed by keyword-
|
||||||
dependant arguments. Arguments are separated by a space, or continue until the
|
dependent arguments. Arguments are separated by a space, or continue until the
|
||||||
end of line. The format for version 20070824 is as follows:
|
end of line. The format for version 20070824 is as follows:
|
||||||
|
|
||||||
Explanation Keyword Space separated arguments
|
Explanation Keyword Space-separated arguments
|
||||||
---------------------------------------------------------------------------
|
---------------------------------------------------------------------------
|
||||||
|
|
||||||
read event R width, timestamp, map id, physical, value, PC, PID
|
read event R width, timestamp, map id, physical, value, PC, PID
|
||||||
@ -136,7 +137,7 @@ iounmap event UNMAP timestamp, map id, PC, PID
|
|||||||
marker MARK timestamp, text
|
marker MARK timestamp, text
|
||||||
version VERSION the string "20070824"
|
version VERSION the string "20070824"
|
||||||
info for reader LSPCI one line from lspci -v
|
info for reader LSPCI one line from lspci -v
|
||||||
PCI address map PCIDEV space separated /proc/bus/pci/devices data
|
PCI address map PCIDEV space-separated /proc/bus/pci/devices data
|
||||||
unk. opcode UNKNOWN timestamp, map id, physical, data, PC, PID
|
unk. opcode UNKNOWN timestamp, map id, physical, data, PC, PID
|
||||||
|
|
||||||
Timestamp is in seconds with decimals. Physical is a PCI bus address, virtual
|
Timestamp is in seconds with decimals. Physical is a PCI bus address, virtual
|
||||||
|
@ -33,9 +33,9 @@ head_page - a pointer to the page that the reader will use next
|
|||||||
|
|
||||||
tail_page - a pointer to the page that will be written to next
|
tail_page - a pointer to the page that will be written to next
|
||||||
|
|
||||||
commit_page - a pointer to the page with the last finished non nested write.
|
commit_page - a pointer to the page with the last finished non-nested write.
|
||||||
|
|
||||||
cmpxchg - hardware assisted atomic transaction that performs the following:
|
cmpxchg - hardware-assisted atomic transaction that performs the following:
|
||||||
|
|
||||||
A = B iff previous A == C
|
A = B iff previous A == C
|
||||||
|
|
||||||
@ -52,15 +52,15 @@ The Generic Ring Buffer
|
|||||||
The ring buffer can be used in either an overwrite mode or in
|
The ring buffer can be used in either an overwrite mode or in
|
||||||
producer/consumer mode.
|
producer/consumer mode.
|
||||||
|
|
||||||
Producer/consumer mode is where the producer were to fill up the
|
Producer/consumer mode is where if the producer were to fill up the
|
||||||
buffer before the consumer could free up anything, the producer
|
buffer before the consumer could free up anything, the producer
|
||||||
will stop writing to the buffer. This will lose most recent events.
|
will stop writing to the buffer. This will lose most recent events.
|
||||||
|
|
||||||
Overwrite mode is where the produce were to fill up the buffer
|
Overwrite mode is where if the producer were to fill up the buffer
|
||||||
before the consumer could free up anything, the producer will
|
before the consumer could free up anything, the producer will
|
||||||
overwrite the older data. This will lose the oldest events.
|
overwrite the older data. This will lose the oldest events.
|
||||||
|
|
||||||
No two writers can write at the same time (on the same per cpu buffer),
|
No two writers can write at the same time (on the same per-cpu buffer),
|
||||||
but a writer may interrupt another writer, but it must finish writing
|
but a writer may interrupt another writer, but it must finish writing
|
||||||
before the previous writer may continue. This is very important to the
|
before the previous writer may continue. This is very important to the
|
||||||
algorithm. The writers act like a "stack". The way interrupts works
|
algorithm. The writers act like a "stack". The way interrupts works
|
||||||
@ -79,16 +79,16 @@ the interrupt doing a write as well.
|
|||||||
|
|
||||||
Readers can happen at any time. But no two readers may run at the
|
Readers can happen at any time. But no two readers may run at the
|
||||||
same time, nor can a reader preempt/interrupt another reader. A reader
|
same time, nor can a reader preempt/interrupt another reader. A reader
|
||||||
can not preempt/interrupt a writer, but it may read/consume from the
|
cannot preempt/interrupt a writer, but it may read/consume from the
|
||||||
buffer at the same time as a writer is writing, but the reader must be
|
buffer at the same time as a writer is writing, but the reader must be
|
||||||
on another processor to do so. A reader may read on its own processor
|
on another processor to do so. A reader may read on its own processor
|
||||||
and can be preempted by a writer.
|
and can be preempted by a writer.
|
||||||
|
|
||||||
A writer can preempt a reader, but a reader can not preempt a writer.
|
A writer can preempt a reader, but a reader cannot preempt a writer.
|
||||||
But a reader can read the buffer at the same time (on another processor)
|
But a reader can read the buffer at the same time (on another processor)
|
||||||
as a writer.
|
as a writer.
|
||||||
|
|
||||||
The ring buffer is made up of a list of pages held together by a link list.
|
The ring buffer is made up of a list of pages held together by a linked list.
|
||||||
|
|
||||||
At initialization a reader page is allocated for the reader that is not
|
At initialization a reader page is allocated for the reader that is not
|
||||||
part of the ring buffer.
|
part of the ring buffer.
|
||||||
@ -102,7 +102,7 @@ the head page.
|
|||||||
|
|
||||||
The reader has its own page to use. At start up time, this page is
|
The reader has its own page to use. At start up time, this page is
|
||||||
allocated but is not attached to the list. When the reader wants
|
allocated but is not attached to the list. When the reader wants
|
||||||
to read from the buffer, if its page is empty (like it is on start up)
|
to read from the buffer, if its page is empty (like it is on start-up),
|
||||||
it will swap its page with the head_page. The old reader page will
|
it will swap its page with the head_page. The old reader page will
|
||||||
become part of the ring buffer and the head_page will be removed.
|
become part of the ring buffer and the head_page will be removed.
|
||||||
The page after the inserted page (old reader_page) will become the
|
The page after the inserted page (old reader_page) will become the
|
||||||
@ -206,7 +206,7 @@ The main pointers:
|
|||||||
|
|
||||||
commit page - the page that last finished a write.
|
commit page - the page that last finished a write.
|
||||||
|
|
||||||
The commit page only is updated by the outer most writer in the
|
The commit page only is updated by the outermost writer in the
|
||||||
writer stack. A writer that preempts another writer will not move the
|
writer stack. A writer that preempts another writer will not move the
|
||||||
commit page.
|
commit page.
|
||||||
|
|
||||||
@ -281,7 +281,7 @@ with the previous write.
|
|||||||
The commit pointer points to the last write location that was
|
The commit pointer points to the last write location that was
|
||||||
committed without preempting another write. When a write that
|
committed without preempting another write. When a write that
|
||||||
preempted another write is committed, it only becomes a pending commit
|
preempted another write is committed, it only becomes a pending commit
|
||||||
and will not be a full commit till all writes have been committed.
|
and will not be a full commit until all writes have been committed.
|
||||||
|
|
||||||
The commit page points to the page that has the last full commit.
|
The commit page points to the page that has the last full commit.
|
||||||
The tail page points to the page with the last write (before
|
The tail page points to the page with the last write (before
|
||||||
@ -292,7 +292,7 @@ be several pages ahead. If the tail page catches up to the commit
|
|||||||
page then no more writes may take place (regardless of the mode
|
page then no more writes may take place (regardless of the mode
|
||||||
of the ring buffer: overwrite and produce/consumer).
|
of the ring buffer: overwrite and produce/consumer).
|
||||||
|
|
||||||
The order of pages are:
|
The order of pages is:
|
||||||
|
|
||||||
head page
|
head page
|
||||||
commit page
|
commit page
|
||||||
@ -311,7 +311,7 @@ Possible scenario:
|
|||||||
There is a special case that the head page is after either the commit page
|
There is a special case that the head page is after either the commit page
|
||||||
and possibly the tail page. That is when the commit (and tail) page has been
|
and possibly the tail page. That is when the commit (and tail) page has been
|
||||||
swapped with the reader page. This is because the head page is always
|
swapped with the reader page. This is because the head page is always
|
||||||
part of the ring buffer, but the reader page is not. When ever there
|
part of the ring buffer, but the reader page is not. Whenever there
|
||||||
has been less than a full page that has been committed inside the ring buffer,
|
has been less than a full page that has been committed inside the ring buffer,
|
||||||
and a reader swaps out a page, it will be swapping out the commit page.
|
and a reader swaps out a page, it will be swapping out the commit page.
|
||||||
|
|
||||||
@ -338,7 +338,7 @@ and a reader swaps out a page, it will be swapping out the commit page.
|
|||||||
In this case, the head page will not move when the tail and commit
|
In this case, the head page will not move when the tail and commit
|
||||||
move back into the ring buffer.
|
move back into the ring buffer.
|
||||||
|
|
||||||
The reader can not swap a page into the ring buffer if the commit page
|
The reader cannot swap a page into the ring buffer if the commit page
|
||||||
is still on that page. If the read meets the last commit (real commit
|
is still on that page. If the read meets the last commit (real commit
|
||||||
not pending or reserved), then there is nothing more to read.
|
not pending or reserved), then there is nothing more to read.
|
||||||
The buffer is considered empty until another full commit finishes.
|
The buffer is considered empty until another full commit finishes.
|
||||||
@ -395,7 +395,7 @@ The main idea behind the lockless algorithm is to combine the moving
|
|||||||
of the head_page pointer with the swapping of pages with the reader.
|
of the head_page pointer with the swapping of pages with the reader.
|
||||||
State flags are placed inside the pointer to the page. To do this,
|
State flags are placed inside the pointer to the page. To do this,
|
||||||
each page must be aligned in memory by 4 bytes. This will allow the 2
|
each page must be aligned in memory by 4 bytes. This will allow the 2
|
||||||
least significant bits of the address to be used as flags. Since
|
least significant bits of the address to be used as flags, since
|
||||||
they will always be zero for the address. To get the address,
|
they will always be zero for the address. To get the address,
|
||||||
simply mask out the flags.
|
simply mask out the flags.
|
||||||
|
|
||||||
@ -460,7 +460,7 @@ When the reader tries to swap the page with the ring buffer, it
|
|||||||
will also use cmpxchg. If the flag bit in the pointer to the
|
will also use cmpxchg. If the flag bit in the pointer to the
|
||||||
head page does not have the HEADER flag set, the compare will fail
|
head page does not have the HEADER flag set, the compare will fail
|
||||||
and the reader will need to look for the new head page and try again.
|
and the reader will need to look for the new head page and try again.
|
||||||
Note, the flag UPDATE and HEADER are never set at the same time.
|
Note, the flags UPDATE and HEADER are never set at the same time.
|
||||||
|
|
||||||
The reader swaps the reader page as follows:
|
The reader swaps the reader page as follows:
|
||||||
|
|
||||||
@ -539,7 +539,7 @@ updated to the reader page.
|
|||||||
| +-----------------------------+ |
|
| +-----------------------------+ |
|
||||||
+------------------------------------+
|
+------------------------------------+
|
||||||
|
|
||||||
Another important point. The page that the reader page points back to
|
Another important point: The page that the reader page points back to
|
||||||
by its previous pointer (the one that now points to the new head page)
|
by its previous pointer (the one that now points to the new head page)
|
||||||
never points back to the reader page. That is because the reader page is
|
never points back to the reader page. That is because the reader page is
|
||||||
not part of the ring buffer. Traversing the ring buffer via the next pointers
|
not part of the ring buffer. Traversing the ring buffer via the next pointers
|
||||||
@ -572,7 +572,7 @@ not be able to swap the head page from the buffer, nor will it be able to
|
|||||||
move the head page, until the writer is finished with the move.
|
move the head page, until the writer is finished with the move.
|
||||||
|
|
||||||
This eliminates any races that the reader can have on the writer. The reader
|
This eliminates any races that the reader can have on the writer. The reader
|
||||||
must spin, and this is why the reader can not preempt the writer.
|
must spin, and this is why the reader cannot preempt the writer.
|
||||||
|
|
||||||
tail page
|
tail page
|
||||||
|
|
|
|
||||||
@ -659,9 +659,9 @@ before pushing the head page. If it is, then it can be assumed that the
|
|||||||
tail page wrapped the buffer, and we must drop new writes.
|
tail page wrapped the buffer, and we must drop new writes.
|
||||||
|
|
||||||
This is not a race condition, because the commit page can only be moved
|
This is not a race condition, because the commit page can only be moved
|
||||||
by the outter most writer (the writer that was preempted).
|
by the outermost writer (the writer that was preempted).
|
||||||
This means that the commit will not move while a writer is moving the
|
This means that the commit will not move while a writer is moving the
|
||||||
tail page. The reader can not swap the reader page if it is also being
|
tail page. The reader cannot swap the reader page if it is also being
|
||||||
used as the commit page. The reader can simply check that the commit
|
used as the commit page. The reader can simply check that the commit
|
||||||
is off the reader page. Once the commit page leaves the reader page
|
is off the reader page. Once the commit page leaves the reader page
|
||||||
it will never go back on it unless a reader does another swap with the
|
it will never go back on it unless a reader does another swap with the
|
||||||
@ -733,7 +733,7 @@ The write converts the head page pointer to UPDATE.
|
|||||||
--->| |<---| |<---| |<---| |<---
|
--->| |<---| |<---| |<---| |<---
|
||||||
+---+ +---+ +---+ +---+
|
+---+ +---+ +---+ +---+
|
||||||
|
|
||||||
But if a nested writer preempts here. It will see that the next
|
But if a nested writer preempts here, it will see that the next
|
||||||
page is a head page, but it is also nested. It will detect that
|
page is a head page, but it is also nested. It will detect that
|
||||||
it is nested and will save that information. The detection is the
|
it is nested and will save that information. The detection is the
|
||||||
fact that it sees the UPDATE flag instead of a HEADER or NORMAL
|
fact that it sees the UPDATE flag instead of a HEADER or NORMAL
|
||||||
@ -761,7 +761,7 @@ to NORMAL.
|
|||||||
--->| |<---| |<---| |<---| |<---
|
--->| |<---| |<---| |<---| |<---
|
||||||
+---+ +---+ +---+ +---+
|
+---+ +---+ +---+ +---+
|
||||||
|
|
||||||
After the nested writer finishes, the outer most writer will convert
|
After the nested writer finishes, the outermost writer will convert
|
||||||
the UPDATE pointer to NORMAL.
|
the UPDATE pointer to NORMAL.
|
||||||
|
|
||||||
|
|
||||||
@ -812,7 +812,7 @@ head page.
|
|||||||
+---+ +---+ +---+ +---+
|
+---+ +---+ +---+ +---+
|
||||||
|
|
||||||
The nested writer moves the tail page forward. But does not set the old
|
The nested writer moves the tail page forward. But does not set the old
|
||||||
update page to NORMAL because it is not the outer most writer.
|
update page to NORMAL because it is not the outermost writer.
|
||||||
|
|
||||||
tail page
|
tail page
|
||||||
|
|
|
|
||||||
@ -892,7 +892,7 @@ It will return to the first writer.
|
|||||||
--->| |<---| |<---| |<---| |<---
|
--->| |<---| |<---| |<---| |<---
|
||||||
+---+ +---+ +---+ +---+
|
+---+ +---+ +---+ +---+
|
||||||
|
|
||||||
The first writer can not know atomically test if the tail page moved
|
The first writer cannot know atomically if the tail page moved
|
||||||
while it updates the HEAD page. It will then update the head page to
|
while it updates the HEAD page. It will then update the head page to
|
||||||
what it thinks is the new head page.
|
what it thinks is the new head page.
|
||||||
|
|
||||||
@ -923,9 +923,9 @@ if the tail page is either where it use to be or on the next page:
|
|||||||
--->| |<---| |<---| |<---| |<---
|
--->| |<---| |<---| |<---| |<---
|
||||||
+---+ +---+ +---+ +---+
|
+---+ +---+ +---+ +---+
|
||||||
|
|
||||||
If tail page != A and tail page does not equal B, then it must reset the
|
If tail page != A and tail page != B, then it must reset the pointer
|
||||||
pointer back to NORMAL. The fact that it only needs to worry about
|
back to NORMAL. The fact that it only needs to worry about nested
|
||||||
nested writers, it only needs to check this after setting the HEAD page.
|
writers means that it only needs to check this after setting the HEAD page.
|
||||||
|
|
||||||
|
|
||||||
(first writer)
|
(first writer)
|
||||||
@ -939,7 +939,7 @@ nested writers, it only needs to check this after setting the HEAD page.
|
|||||||
+---+ +---+ +---+ +---+
|
+---+ +---+ +---+ +---+
|
||||||
|
|
||||||
Now the writer can update the head page. This is also why the head page must
|
Now the writer can update the head page. This is also why the head page must
|
||||||
remain in UPDATE and only reset by the outer most writer. This prevents
|
remain in UPDATE and only reset by the outermost writer. This prevents
|
||||||
the reader from seeing the incorrect head page.
|
the reader from seeing the incorrect head page.
|
||||||
|
|
||||||
|
|
||||||
|
@ -10,8 +10,8 @@ Tracepoints (see Documentation/trace/tracepoints.txt) can be used without
|
|||||||
creating custom kernel modules to register probe functions using the event
|
creating custom kernel modules to register probe functions using the event
|
||||||
tracing infrastructure.
|
tracing infrastructure.
|
||||||
|
|
||||||
Simplistically, tracepoints will represent an important event that when can
|
Simplistically, tracepoints represent important events that can be
|
||||||
be taken in conjunction with other tracepoints to build a "Big Picture" of
|
taken in conjunction with other tracepoints to build a "Big Picture" of
|
||||||
what is going on within the system. There are a large number of methods for
|
what is going on within the system. There are a large number of methods for
|
||||||
gathering and interpreting these events. Lacking any current Best Practises,
|
gathering and interpreting these events. Lacking any current Best Practises,
|
||||||
this document describes some of the methods that can be used.
|
this document describes some of the methods that can be used.
|
||||||
@ -33,12 +33,12 @@ calling
|
|||||||
|
|
||||||
will give a fair indication of the number of events available.
|
will give a fair indication of the number of events available.
|
||||||
|
|
||||||
2.2 PCL
|
2.2 PCL (Performance Counters for Linux)
|
||||||
-------
|
-------
|
||||||
|
|
||||||
Discovery and enumeration of all counters and events, including tracepoints
|
Discovery and enumeration of all counters and events, including tracepoints,
|
||||||
are available with the perf tool. Getting a list of available events is a
|
are available with the perf tool. Getting a list of available events is a
|
||||||
simple case of
|
simple case of:
|
||||||
|
|
||||||
$ perf list 2>&1 | grep Tracepoint
|
$ perf list 2>&1 | grep Tracepoint
|
||||||
ext4:ext4_free_inode [Tracepoint event]
|
ext4:ext4_free_inode [Tracepoint event]
|
||||||
@ -49,19 +49,19 @@ simple case of
|
|||||||
[ .... remaining output snipped .... ]
|
[ .... remaining output snipped .... ]
|
||||||
|
|
||||||
|
|
||||||
2. Enabling Events
|
3. Enabling Events
|
||||||
==================
|
==================
|
||||||
|
|
||||||
2.1 System-Wide Event Enabling
|
3.1 System-Wide Event Enabling
|
||||||
------------------------------
|
------------------------------
|
||||||
|
|
||||||
See Documentation/trace/events.txt for a proper description on how events
|
See Documentation/trace/events.txt for a proper description on how events
|
||||||
can be enabled system-wide. A short example of enabling all events related
|
can be enabled system-wide. A short example of enabling all events related
|
||||||
to page allocation would look something like
|
to page allocation would look something like:
|
||||||
|
|
||||||
$ for i in `find /sys/kernel/debug/tracing/events -name "enable" | grep mm_`; do echo 1 > $i; done
|
$ for i in `find /sys/kernel/debug/tracing/events -name "enable" | grep mm_`; do echo 1 > $i; done
|
||||||
|
|
||||||
2.2 System-Wide Event Enabling with SystemTap
|
3.2 System-Wide Event Enabling with SystemTap
|
||||||
---------------------------------------------
|
---------------------------------------------
|
||||||
|
|
||||||
In SystemTap, tracepoints are accessible using the kernel.trace() function
|
In SystemTap, tracepoints are accessible using the kernel.trace() function
|
||||||
@ -86,7 +86,7 @@ were allocating the pages.
|
|||||||
print_count()
|
print_count()
|
||||||
}
|
}
|
||||||
|
|
||||||
2.3 System-Wide Event Enabling with PCL
|
3.3 System-Wide Event Enabling with PCL
|
||||||
---------------------------------------
|
---------------------------------------
|
||||||
|
|
||||||
By specifying the -a switch and analysing sleep, the system-wide events
|
By specifying the -a switch and analysing sleep, the system-wide events
|
||||||
@ -107,16 +107,16 @@ for a duration of time can be examined.
|
|||||||
Similarly, one could execute a shell and exit it as desired to get a report
|
Similarly, one could execute a shell and exit it as desired to get a report
|
||||||
at that point.
|
at that point.
|
||||||
|
|
||||||
2.4 Local Event Enabling
|
3.4 Local Event Enabling
|
||||||
------------------------
|
------------------------
|
||||||
|
|
||||||
Documentation/trace/ftrace.txt describes how to enable events on a per-thread
|
Documentation/trace/ftrace.txt describes how to enable events on a per-thread
|
||||||
basis using set_ftrace_pid.
|
basis using set_ftrace_pid.
|
||||||
|
|
||||||
2.5 Local Event Enablement with PCL
|
3.5 Local Event Enablement with PCL
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
|
|
||||||
Events can be activate and tracked for the duration of a process on a local
|
Events can be activated and tracked for the duration of a process on a local
|
||||||
basis using PCL such as follows.
|
basis using PCL such as follows.
|
||||||
|
|
||||||
$ perf stat -e kmem:mm_page_alloc -e kmem:mm_page_free_direct \
|
$ perf stat -e kmem:mm_page_alloc -e kmem:mm_page_free_direct \
|
||||||
@ -131,18 +131,18 @@ basis using PCL such as follows.
|
|||||||
|
|
||||||
0.973913387 seconds time elapsed
|
0.973913387 seconds time elapsed
|
||||||
|
|
||||||
3. Event Filtering
|
4. Event Filtering
|
||||||
==================
|
==================
|
||||||
|
|
||||||
Documentation/trace/ftrace.txt covers in-depth how to filter events in
|
Documentation/trace/ftrace.txt covers in-depth how to filter events in
|
||||||
ftrace. Obviously using grep and awk of trace_pipe is an option as well
|
ftrace. Obviously using grep and awk of trace_pipe is an option as well
|
||||||
as any script reading trace_pipe.
|
as any script reading trace_pipe.
|
||||||
|
|
||||||
4. Analysing Event Variances with PCL
|
5. Analysing Event Variances with PCL
|
||||||
=====================================
|
=====================================
|
||||||
|
|
||||||
Any workload can exhibit variances between runs and it can be important
|
Any workload can exhibit variances between runs and it can be important
|
||||||
to know what the standard deviation in. By and large, this is left to the
|
to know what the standard deviation is. By and large, this is left to the
|
||||||
performance analyst to do it by hand. In the event that the discrete event
|
performance analyst to do it by hand. In the event that the discrete event
|
||||||
occurrences are useful to the performance analyst, then perf can be used.
|
occurrences are useful to the performance analyst, then perf can be used.
|
||||||
|
|
||||||
@ -166,7 +166,7 @@ In the event that some higher-level event is required that depends on some
|
|||||||
aggregation of discrete events, then a script would need to be developed.
|
aggregation of discrete events, then a script would need to be developed.
|
||||||
|
|
||||||
Using --repeat, it is also possible to view how events are fluctuating over
|
Using --repeat, it is also possible to view how events are fluctuating over
|
||||||
time on a system wide basis using -a and sleep.
|
time on a system-wide basis using -a and sleep.
|
||||||
|
|
||||||
$ perf stat -e kmem:mm_page_alloc -e kmem:mm_page_free_direct \
|
$ perf stat -e kmem:mm_page_alloc -e kmem:mm_page_free_direct \
|
||||||
-e kmem:mm_pagevec_free \
|
-e kmem:mm_pagevec_free \
|
||||||
@ -180,7 +180,7 @@ time on a system wide basis using -a and sleep.
|
|||||||
|
|
||||||
1.002251757 seconds time elapsed ( +- 0.005% )
|
1.002251757 seconds time elapsed ( +- 0.005% )
|
||||||
|
|
||||||
5. Higher-Level Analysis with Helper Scripts
|
6. Higher-Level Analysis with Helper Scripts
|
||||||
============================================
|
============================================
|
||||||
|
|
||||||
When events are enabled the events that are triggering can be read from
|
When events are enabled the events that are triggering can be read from
|
||||||
@ -190,11 +190,11 @@ be gathered on-line as appropriate. Examples of post-processing might include
|
|||||||
|
|
||||||
o Reading information from /proc for the PID that triggered the event
|
o Reading information from /proc for the PID that triggered the event
|
||||||
o Deriving a higher-level event from a series of lower-level events.
|
o Deriving a higher-level event from a series of lower-level events.
|
||||||
o Calculate latencies between two events
|
o Calculating latencies between two events
|
||||||
|
|
||||||
Documentation/trace/postprocess/trace-pagealloc-postprocess.pl is an example
|
Documentation/trace/postprocess/trace-pagealloc-postprocess.pl is an example
|
||||||
script that can read trace_pipe from STDIN or a copy of a trace. When used
|
script that can read trace_pipe from STDIN or a copy of a trace. When used
|
||||||
on-line, it can be interrupted once to generate a report without existing
|
on-line, it can be interrupted once to generate a report without exiting
|
||||||
and twice to exit.
|
and twice to exit.
|
||||||
|
|
||||||
Simplistically, the script just reads STDIN and counts up events but it
|
Simplistically, the script just reads STDIN and counts up events but it
|
||||||
@ -212,12 +212,12 @@ also can do more such as
|
|||||||
processes, the parent process responsible for creating all the helpers
|
processes, the parent process responsible for creating all the helpers
|
||||||
can be identified
|
can be identified
|
||||||
|
|
||||||
6. Lower-Level Analysis with PCL
|
7. Lower-Level Analysis with PCL
|
||||||
================================
|
================================
|
||||||
|
|
||||||
There may also be a requirement to identify what functions with a program
|
There may also be a requirement to identify what functions within a program
|
||||||
were generating events within the kernel. To begin this sort of analysis, the
|
were generating events within the kernel. To begin this sort of analysis, the
|
||||||
data must be recorded. At the time of writing, this required root
|
data must be recorded. At the time of writing, this required root:
|
||||||
|
|
||||||
$ perf record -c 1 \
|
$ perf record -c 1 \
|
||||||
-e kmem:mm_page_alloc -e kmem:mm_page_free_direct \
|
-e kmem:mm_page_alloc -e kmem:mm_page_free_direct \
|
||||||
@ -253,11 +253,11 @@ perf report.
|
|||||||
# (For more details, try: perf report --sort comm,dso,symbol)
|
# (For more details, try: perf report --sort comm,dso,symbol)
|
||||||
#
|
#
|
||||||
|
|
||||||
According to this, the vast majority of events occured triggered on events
|
According to this, the vast majority of events triggered on events
|
||||||
within the VDSO. With simple binaries, this will often be the case so lets
|
within the VDSO. With simple binaries, this will often be the case so let's
|
||||||
take a slightly different example. In the course of writing this, it was
|
take a slightly different example. In the course of writing this, it was
|
||||||
noticed that X was generating an insane amount of page allocations so lets look
|
noticed that X was generating an insane amount of page allocations so let's look
|
||||||
at it
|
at it:
|
||||||
|
|
||||||
$ perf record -c 1 -f \
|
$ perf record -c 1 -f \
|
||||||
-e kmem:mm_page_alloc -e kmem:mm_page_free_direct \
|
-e kmem:mm_page_alloc -e kmem:mm_page_free_direct \
|
||||||
@ -280,8 +280,8 @@ This was interrupted after a few seconds and
|
|||||||
# (For more details, try: perf report --sort comm,dso,symbol)
|
# (For more details, try: perf report --sort comm,dso,symbol)
|
||||||
#
|
#
|
||||||
|
|
||||||
So, almost half of the events are occuring in a library. To get an idea which
|
So, almost half of the events are occurring in a library. To get an idea which
|
||||||
symbol.
|
symbol:
|
||||||
|
|
||||||
$ perf report --sort comm,dso,symbol
|
$ perf report --sort comm,dso,symbol
|
||||||
# Samples: 27666
|
# Samples: 27666
|
||||||
@ -297,7 +297,7 @@ symbol.
|
|||||||
0.01% Xorg /opt/gfx-test/lib/libpixman-1.so.0.13.1 [.] get_fast_path
|
0.01% Xorg /opt/gfx-test/lib/libpixman-1.so.0.13.1 [.] get_fast_path
|
||||||
0.00% Xorg [kernel] [k] ftrace_trace_userstack
|
0.00% Xorg [kernel] [k] ftrace_trace_userstack
|
||||||
|
|
||||||
To see where within the function pixmanFillsse2 things are going wrong
|
To see where within the function pixmanFillsse2 things are going wrong:
|
||||||
|
|
||||||
$ perf annotate pixmanFillsse2
|
$ perf annotate pixmanFillsse2
|
||||||
[ ... ]
|
[ ... ]
|
||||||
|
@ -103,7 +103,7 @@ I.2 libpciaccess
|
|||||||
----------------
|
----------------
|
||||||
|
|
||||||
To use the vga arbiter char device it was implemented an API inside the
|
To use the vga arbiter char device it was implemented an API inside the
|
||||||
libpciaccess library. One fieldd was added to struct pci_device (each device
|
libpciaccess library. One field was added to struct pci_device (each device
|
||||||
on the system):
|
on the system):
|
||||||
|
|
||||||
/* the type of resource decoded by the device */
|
/* the type of resource decoded by the device */
|
||||||
|
44
MAINTAINERS
44
MAINTAINERS
@ -410,9 +410,8 @@ F: drivers/i2c/busses/i2c-ali1563.c
|
|||||||
|
|
||||||
ALPHA PORT
|
ALPHA PORT
|
||||||
M: Richard Henderson <rth@twiddle.net>
|
M: Richard Henderson <rth@twiddle.net>
|
||||||
S: Odd Fixes for 2.4; Maintained for 2.6.
|
|
||||||
M: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
|
M: Ivan Kokshaysky <ink@jurassic.park.msu.ru>
|
||||||
S: Maintained for 2.4; PCI support for 2.6.
|
M: Matt Turner <mattst88@gmail.com>
|
||||||
L: linux-alpha@vger.kernel.org
|
L: linux-alpha@vger.kernel.org
|
||||||
F: arch/alpha/
|
F: arch/alpha/
|
||||||
|
|
||||||
@ -1638,9 +1637,8 @@ S: Maintained
|
|||||||
F: sound/pci/cs5535audio/
|
F: sound/pci/cs5535audio/
|
||||||
|
|
||||||
CX18 VIDEO4LINUX DRIVER
|
CX18 VIDEO4LINUX DRIVER
|
||||||
M: Hans Verkuil <hverkuil@xs4all.nl>
|
|
||||||
M: Andy Walls <awalls@radix.net>
|
M: Andy Walls <awalls@radix.net>
|
||||||
L: ivtv-devel@ivtvdriver.org
|
L: ivtv-devel@ivtvdriver.org (moderated for non-subscribers)
|
||||||
L: linux-media@vger.kernel.org
|
L: linux-media@vger.kernel.org
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git
|
||||||
W: http://linuxtv.org
|
W: http://linuxtv.org
|
||||||
@ -2169,10 +2167,9 @@ F: drivers/hwmon/f75375s.c
|
|||||||
F: include/linux/f75375s.h
|
F: include/linux/f75375s.h
|
||||||
|
|
||||||
FIREWIRE SUBSYSTEM
|
FIREWIRE SUBSYSTEM
|
||||||
M: Kristian Hoegsberg <krh@redhat.com>
|
|
||||||
M: Stefan Richter <stefanr@s5r6.in-berlin.de>
|
M: Stefan Richter <stefanr@s5r6.in-berlin.de>
|
||||||
L: linux1394-devel@lists.sourceforge.net
|
L: linux1394-devel@lists.sourceforge.net
|
||||||
W: http://www.linux1394.org/
|
W: http://ieee1394.wiki.kernel.org/
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/firewire/
|
F: drivers/firewire/
|
||||||
@ -2705,22 +2702,14 @@ S: Supported
|
|||||||
F: drivers/idle/i7300_idle.c
|
F: drivers/idle/i7300_idle.c
|
||||||
|
|
||||||
IEEE 1394 SUBSYSTEM
|
IEEE 1394 SUBSYSTEM
|
||||||
M: Ben Collins <ben.collins@ubuntu.com>
|
|
||||||
M: Stefan Richter <stefanr@s5r6.in-berlin.de>
|
M: Stefan Richter <stefanr@s5r6.in-berlin.de>
|
||||||
L: linux1394-devel@lists.sourceforge.net
|
L: linux1394-devel@lists.sourceforge.net
|
||||||
W: http://www.linux1394.org/
|
W: http://ieee1394.wiki.kernel.org/
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6.git
|
||||||
S: Maintained
|
S: Obsolete
|
||||||
F: Documentation/debugging-via-ohci1394.txt
|
F: Documentation/debugging-via-ohci1394.txt
|
||||||
F: drivers/ieee1394/
|
F: drivers/ieee1394/
|
||||||
|
|
||||||
IEEE 1394 RAW I/O DRIVER
|
|
||||||
M: Dan Dennedy <dan@dennedy.org>
|
|
||||||
M: Stefan Richter <stefanr@s5r6.in-berlin.de>
|
|
||||||
L: linux1394-devel@lists.sourceforge.net
|
|
||||||
S: Maintained
|
|
||||||
F: drivers/ieee1394/raw1394*
|
|
||||||
|
|
||||||
IEEE 802.15.4 SUBSYSTEM
|
IEEE 802.15.4 SUBSYSTEM
|
||||||
M: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
|
M: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
|
||||||
M: Sergey Lapin <slapin@ossfans.org>
|
M: Sergey Lapin <slapin@ossfans.org>
|
||||||
@ -3021,8 +3010,8 @@ S: Maintained
|
|||||||
F: drivers/isdn/hardware/eicon/
|
F: drivers/isdn/hardware/eicon/
|
||||||
|
|
||||||
IVTV VIDEO4LINUX DRIVER
|
IVTV VIDEO4LINUX DRIVER
|
||||||
M: Hans Verkuil <hverkuil@xs4all.nl>
|
M: Andy Walls <awalls@radix.net>
|
||||||
L: ivtv-devel@ivtvdriver.org
|
L: ivtv-devel@ivtvdriver.org (moderated for non-subscribers)
|
||||||
L: linux-media@vger.kernel.org
|
L: linux-media@vger.kernel.org
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6.git
|
||||||
W: http://www.ivtvdriver.org
|
W: http://www.ivtvdriver.org
|
||||||
@ -3882,7 +3871,7 @@ F: drivers/net/ni5010.*
|
|||||||
|
|
||||||
NILFS2 FILESYSTEM
|
NILFS2 FILESYSTEM
|
||||||
M: KONISHI Ryusuke <konishi.ryusuke@lab.ntt.co.jp>
|
M: KONISHI Ryusuke <konishi.ryusuke@lab.ntt.co.jp>
|
||||||
L: users@nilfs.org
|
L: linux-nilfs@vger.kernel.org
|
||||||
W: http://www.nilfs.org/en/
|
W: http://www.nilfs.org/en/
|
||||||
S: Supported
|
S: Supported
|
||||||
F: Documentation/filesystems/nilfs2.txt
|
F: Documentation/filesystems/nilfs2.txt
|
||||||
@ -3949,29 +3938,20 @@ S: Maintained
|
|||||||
F: sound/soc/omap/
|
F: sound/soc/omap/
|
||||||
|
|
||||||
OMAP FRAMEBUFFER SUPPORT
|
OMAP FRAMEBUFFER SUPPORT
|
||||||
M: Imre Deak <imre.deak@nokia.com>
|
M: Tomi Valkeinen <tomi.valkeinen@nokia.com>
|
||||||
L: linux-fbdev@vger.kernel.org
|
L: linux-fbdev@vger.kernel.org
|
||||||
L: linux-omap@vger.kernel.org
|
L: linux-omap@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/video/omap/
|
F: drivers/video/omap/
|
||||||
|
|
||||||
OMAP DISPLAY SUBSYSTEM SUPPORT (DSS2)
|
OMAP DISPLAY SUBSYSTEM and FRAMEBUFFER SUPPORT (DSS2)
|
||||||
M: Tomi Valkeinen <tomi.valkeinen@nokia.com>
|
M: Tomi Valkeinen <tomi.valkeinen@nokia.com>
|
||||||
L: linux-omap@vger.kernel.org
|
L: linux-omap@vger.kernel.org
|
||||||
L: linux-fbdev@vger.kernel.org (moderated for non-subscribers)
|
L: linux-fbdev@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/video/omap2/dss/
|
F: drivers/video/omap2/
|
||||||
F: drivers/video/omap2/vrfb.c
|
|
||||||
F: drivers/video/omap2/vram.c
|
|
||||||
F: Documentation/arm/OMAP/DSS
|
F: Documentation/arm/OMAP/DSS
|
||||||
|
|
||||||
OMAP FRAMEBUFFER SUPPORT (FOR DSS2)
|
|
||||||
M: Tomi Valkeinen <tomi.valkeinen@nokia.com>
|
|
||||||
L: linux-omap@vger.kernel.org
|
|
||||||
L: linux-fbdev@vger.kernel.org (moderated for non-subscribers)
|
|
||||||
S: Maintained
|
|
||||||
F: drivers/video/omap2/omapfb/
|
|
||||||
|
|
||||||
OMAP MMC SUPPORT
|
OMAP MMC SUPPORT
|
||||||
M: Jarkko Lavinen <jarkko.lavinen@nokia.com>
|
M: Jarkko Lavinen <jarkko.lavinen@nokia.com>
|
||||||
L: linux-omap@vger.kernel.org
|
L: linux-omap@vger.kernel.org
|
||||||
|
5
Makefile
5
Makefile
@ -1,7 +1,7 @@
|
|||||||
VERSION = 2
|
VERSION = 2
|
||||||
PATCHLEVEL = 6
|
PATCHLEVEL = 6
|
||||||
SUBLEVEL = 33
|
SUBLEVEL = 33
|
||||||
EXTRAVERSION = -rc2
|
EXTRAVERSION = -rc5
|
||||||
NAME = Man-Eating Seals of Antiquity
|
NAME = Man-Eating Seals of Antiquity
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
@ -18,10 +18,9 @@ MAKEFLAGS += -rR --no-print-directory
|
|||||||
|
|
||||||
# Avoid funny character set dependencies
|
# Avoid funny character set dependencies
|
||||||
unexport LC_ALL
|
unexport LC_ALL
|
||||||
LC_CTYPE=C
|
|
||||||
LC_COLLATE=C
|
LC_COLLATE=C
|
||||||
LC_NUMERIC=C
|
LC_NUMERIC=C
|
||||||
export LC_CTYPE LC_COLLATE LC_NUMERIC
|
export LC_COLLATE LC_NUMERIC
|
||||||
|
|
||||||
# We are using a recursive build, so we need to do a little thinking
|
# We are using a recursive build, so we need to do a little thinking
|
||||||
# to get the ordering right.
|
# to get the ordering right.
|
||||||
|
@ -28,6 +28,9 @@ static const struct cpumask *cpumask_of_node(int node)
|
|||||||
{
|
{
|
||||||
int cpu;
|
int cpu;
|
||||||
|
|
||||||
|
if (node == -1)
|
||||||
|
return cpu_all_mask;
|
||||||
|
|
||||||
cpumask_clear(&node_to_cpumask_map[node]);
|
cpumask_clear(&node_to_cpumask_map[node]);
|
||||||
|
|
||||||
for_each_online_cpu(cpu) {
|
for_each_online_cpu(cpu) {
|
||||||
|
@ -18,6 +18,8 @@ config ARM
|
|||||||
select HAVE_KRETPROBES if (HAVE_KPROBES)
|
select HAVE_KRETPROBES if (HAVE_KPROBES)
|
||||||
select HAVE_FUNCTION_TRACER if (!XIP_KERNEL)
|
select HAVE_FUNCTION_TRACER if (!XIP_KERNEL)
|
||||||
select HAVE_GENERIC_DMA_COHERENT
|
select HAVE_GENERIC_DMA_COHERENT
|
||||||
|
select HAVE_KERNEL_GZIP
|
||||||
|
select HAVE_KERNEL_LZO
|
||||||
help
|
help
|
||||||
The ARM series is a line of low-power-consumption RISC chip designs
|
The ARM series is a line of low-power-consumption RISC chip designs
|
||||||
licensed by ARM Ltd and targeted at embedded applications and
|
licensed by ARM Ltd and targeted at embedded applications and
|
||||||
@ -688,6 +690,7 @@ config ARCH_DAVINCI
|
|||||||
select HAVE_IDE
|
select HAVE_IDE
|
||||||
select COMMON_CLKDEV
|
select COMMON_CLKDEV
|
||||||
select GENERIC_ALLOCATOR
|
select GENERIC_ALLOCATOR
|
||||||
|
select ARCH_HAS_HOLES_MEMORYMODEL
|
||||||
help
|
help
|
||||||
Support for TI's DaVinci platform.
|
Support for TI's DaVinci platform.
|
||||||
|
|
||||||
@ -726,14 +729,26 @@ config ARCH_U8500
|
|||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
|
source "arch/arm/mach-aaec2000/Kconfig"
|
||||||
|
|
||||||
|
source "arch/arm/mach-at91/Kconfig"
|
||||||
|
|
||||||
|
source "arch/arm/mach-bcmring/Kconfig"
|
||||||
|
|
||||||
source "arch/arm/mach-clps711x/Kconfig"
|
source "arch/arm/mach-clps711x/Kconfig"
|
||||||
|
|
||||||
|
source "arch/arm/mach-davinci/Kconfig"
|
||||||
|
|
||||||
|
source "arch/arm/mach-dove/Kconfig"
|
||||||
|
|
||||||
source "arch/arm/mach-ep93xx/Kconfig"
|
source "arch/arm/mach-ep93xx/Kconfig"
|
||||||
|
|
||||||
source "arch/arm/mach-footbridge/Kconfig"
|
source "arch/arm/mach-footbridge/Kconfig"
|
||||||
|
|
||||||
source "arch/arm/mach-gemini/Kconfig"
|
source "arch/arm/mach-gemini/Kconfig"
|
||||||
|
|
||||||
|
source "arch/arm/mach-h720x/Kconfig"
|
||||||
|
|
||||||
source "arch/arm/mach-integrator/Kconfig"
|
source "arch/arm/mach-integrator/Kconfig"
|
||||||
|
|
||||||
source "arch/arm/mach-iop32x/Kconfig"
|
source "arch/arm/mach-iop32x/Kconfig"
|
||||||
@ -748,16 +763,26 @@ source "arch/arm/mach-ixp2000/Kconfig"
|
|||||||
|
|
||||||
source "arch/arm/mach-ixp23xx/Kconfig"
|
source "arch/arm/mach-ixp23xx/Kconfig"
|
||||||
|
|
||||||
|
source "arch/arm/mach-kirkwood/Kconfig"
|
||||||
|
|
||||||
|
source "arch/arm/mach-ks8695/Kconfig"
|
||||||
|
|
||||||
|
source "arch/arm/mach-lh7a40x/Kconfig"
|
||||||
|
|
||||||
source "arch/arm/mach-loki/Kconfig"
|
source "arch/arm/mach-loki/Kconfig"
|
||||||
|
|
||||||
|
source "arch/arm/mach-msm/Kconfig"
|
||||||
|
|
||||||
source "arch/arm/mach-mv78xx0/Kconfig"
|
source "arch/arm/mach-mv78xx0/Kconfig"
|
||||||
|
|
||||||
source "arch/arm/mach-pxa/Kconfig"
|
source "arch/arm/plat-mxc/Kconfig"
|
||||||
source "arch/arm/plat-pxa/Kconfig"
|
|
||||||
|
|
||||||
source "arch/arm/mach-mmp/Kconfig"
|
source "arch/arm/mach-netx/Kconfig"
|
||||||
|
|
||||||
source "arch/arm/mach-sa1100/Kconfig"
|
source "arch/arm/mach-nomadik/Kconfig"
|
||||||
|
source "arch/arm/plat-nomadik/Kconfig"
|
||||||
|
|
||||||
|
source "arch/arm/mach-ns9xxx/Kconfig"
|
||||||
|
|
||||||
source "arch/arm/plat-omap/Kconfig"
|
source "arch/arm/plat-omap/Kconfig"
|
||||||
|
|
||||||
@ -767,9 +792,14 @@ source "arch/arm/mach-omap2/Kconfig"
|
|||||||
|
|
||||||
source "arch/arm/mach-orion5x/Kconfig"
|
source "arch/arm/mach-orion5x/Kconfig"
|
||||||
|
|
||||||
source "arch/arm/mach-kirkwood/Kconfig"
|
source "arch/arm/mach-pxa/Kconfig"
|
||||||
|
source "arch/arm/plat-pxa/Kconfig"
|
||||||
|
|
||||||
source "arch/arm/mach-dove/Kconfig"
|
source "arch/arm/mach-mmp/Kconfig"
|
||||||
|
|
||||||
|
source "arch/arm/mach-realview/Kconfig"
|
||||||
|
|
||||||
|
source "arch/arm/mach-sa1100/Kconfig"
|
||||||
|
|
||||||
source "arch/arm/plat-samsung/Kconfig"
|
source "arch/arm/plat-samsung/Kconfig"
|
||||||
source "arch/arm/plat-s3c24xx/Kconfig"
|
source "arch/arm/plat-s3c24xx/Kconfig"
|
||||||
@ -797,41 +827,14 @@ if ARCH_S5PC1XX
|
|||||||
source "arch/arm/mach-s5pc100/Kconfig"
|
source "arch/arm/mach-s5pc100/Kconfig"
|
||||||
endif
|
endif
|
||||||
|
|
||||||
source "arch/arm/mach-lh7a40x/Kconfig"
|
source "arch/arm/mach-u300/Kconfig"
|
||||||
|
|
||||||
source "arch/arm/mach-h720x/Kconfig"
|
source "arch/arm/mach-ux500/Kconfig"
|
||||||
|
|
||||||
source "arch/arm/mach-versatile/Kconfig"
|
source "arch/arm/mach-versatile/Kconfig"
|
||||||
|
|
||||||
source "arch/arm/mach-aaec2000/Kconfig"
|
|
||||||
|
|
||||||
source "arch/arm/mach-realview/Kconfig"
|
|
||||||
|
|
||||||
source "arch/arm/mach-at91/Kconfig"
|
|
||||||
|
|
||||||
source "arch/arm/plat-mxc/Kconfig"
|
|
||||||
|
|
||||||
source "arch/arm/mach-nomadik/Kconfig"
|
|
||||||
source "arch/arm/plat-nomadik/Kconfig"
|
|
||||||
|
|
||||||
source "arch/arm/mach-netx/Kconfig"
|
|
||||||
|
|
||||||
source "arch/arm/mach-ns9xxx/Kconfig"
|
|
||||||
|
|
||||||
source "arch/arm/mach-davinci/Kconfig"
|
|
||||||
|
|
||||||
source "arch/arm/mach-ks8695/Kconfig"
|
|
||||||
|
|
||||||
source "arch/arm/mach-msm/Kconfig"
|
|
||||||
|
|
||||||
source "arch/arm/mach-u300/Kconfig"
|
|
||||||
|
|
||||||
source "arch/arm/mach-w90x900/Kconfig"
|
source "arch/arm/mach-w90x900/Kconfig"
|
||||||
|
|
||||||
source "arch/arm/mach-bcmring/Kconfig"
|
|
||||||
|
|
||||||
source "arch/arm/mach-ux500/Kconfig"
|
|
||||||
|
|
||||||
# Definitions to make life easier
|
# Definitions to make life easier
|
||||||
config ARCH_ACORN
|
config ARCH_ACORN
|
||||||
bool
|
bool
|
||||||
|
@ -146,6 +146,7 @@ machine-$(CONFIG_ARCH_MX1) := mx1
|
|||||||
machine-$(CONFIG_ARCH_MX2) := mx2
|
machine-$(CONFIG_ARCH_MX2) := mx2
|
||||||
machine-$(CONFIG_ARCH_MX25) := mx25
|
machine-$(CONFIG_ARCH_MX25) := mx25
|
||||||
machine-$(CONFIG_ARCH_MX3) := mx3
|
machine-$(CONFIG_ARCH_MX3) := mx3
|
||||||
|
machine-$(CONFIG_ARCH_MXC91231) := mxc91231
|
||||||
machine-$(CONFIG_ARCH_NETX) := netx
|
machine-$(CONFIG_ARCH_NETX) := netx
|
||||||
machine-$(CONFIG_ARCH_NOMADIK) := nomadik
|
machine-$(CONFIG_ARCH_NOMADIK) := nomadik
|
||||||
machine-$(CONFIG_ARCH_NS9XXX) := ns9xxx
|
machine-$(CONFIG_ARCH_NS9XXX) := ns9xxx
|
||||||
@ -171,12 +172,12 @@ machine-$(CONFIG_ARCH_U8500) := ux500
|
|||||||
machine-$(CONFIG_ARCH_VERSATILE) := versatile
|
machine-$(CONFIG_ARCH_VERSATILE) := versatile
|
||||||
machine-$(CONFIG_ARCH_W90X900) := w90x900
|
machine-$(CONFIG_ARCH_W90X900) := w90x900
|
||||||
machine-$(CONFIG_FOOTBRIDGE) := footbridge
|
machine-$(CONFIG_FOOTBRIDGE) := footbridge
|
||||||
machine-$(CONFIG_ARCH_MXC91231) := mxc91231
|
|
||||||
|
|
||||||
# Platform directory name. This list is sorted alphanumerically
|
# Platform directory name. This list is sorted alphanumerically
|
||||||
# by CONFIG_* macro name.
|
# by CONFIG_* macro name.
|
||||||
plat-$(CONFIG_ARCH_MXC) := mxc
|
plat-$(CONFIG_ARCH_MXC) := mxc
|
||||||
plat-$(CONFIG_ARCH_OMAP) := omap
|
plat-$(CONFIG_ARCH_OMAP) := omap
|
||||||
|
plat-$(CONFIG_ARCH_STMP3XXX) := stmp3xxx
|
||||||
plat-$(CONFIG_PLAT_IOP) := iop
|
plat-$(CONFIG_PLAT_IOP) := iop
|
||||||
plat-$(CONFIG_PLAT_NOMADIK) := nomadik
|
plat-$(CONFIG_PLAT_NOMADIK) := nomadik
|
||||||
plat-$(CONFIG_PLAT_ORION) := orion
|
plat-$(CONFIG_PLAT_ORION) := orion
|
||||||
@ -184,7 +185,6 @@ plat-$(CONFIG_PLAT_PXA) := pxa
|
|||||||
plat-$(CONFIG_PLAT_S3C24XX) := s3c24xx s3c samsung
|
plat-$(CONFIG_PLAT_S3C24XX) := s3c24xx s3c samsung
|
||||||
plat-$(CONFIG_PLAT_S3C64XX) := s3c64xx s3c samsung
|
plat-$(CONFIG_PLAT_S3C64XX) := s3c64xx s3c samsung
|
||||||
plat-$(CONFIG_PLAT_S5PC1XX) := s5pc1xx s3c samsung
|
plat-$(CONFIG_PLAT_S5PC1XX) := s5pc1xx s3c samsung
|
||||||
plat-$(CONFIG_ARCH_STMP3XXX) := stmp3xxx
|
|
||||||
|
|
||||||
ifeq ($(CONFIG_ARCH_EBSA110),y)
|
ifeq ($(CONFIG_ARCH_EBSA110),y)
|
||||||
# This is what happens if you forget the IOCS16 line.
|
# This is what happens if you forget the IOCS16 line.
|
||||||
|
@ -63,8 +63,12 @@ endif
|
|||||||
|
|
||||||
SEDFLAGS = s/TEXT_START/$(ZTEXTADDR)/;s/BSS_START/$(ZBSSADDR)/
|
SEDFLAGS = s/TEXT_START/$(ZTEXTADDR)/;s/BSS_START/$(ZBSSADDR)/
|
||||||
|
|
||||||
targets := vmlinux vmlinux.lds piggy.gz piggy.o font.o font.c \
|
suffix_$(CONFIG_KERNEL_GZIP) = gzip
|
||||||
head.o misc.o $(OBJS)
|
suffix_$(CONFIG_KERNEL_LZO) = lzo
|
||||||
|
|
||||||
|
targets := vmlinux vmlinux.lds \
|
||||||
|
piggy.$(suffix_y) piggy.$(suffix_y).o \
|
||||||
|
font.o font.c head.o misc.o $(OBJS)
|
||||||
|
|
||||||
ifeq ($(CONFIG_FUNCTION_TRACER),y)
|
ifeq ($(CONFIG_FUNCTION_TRACER),y)
|
||||||
ORIG_CFLAGS := $(KBUILD_CFLAGS)
|
ORIG_CFLAGS := $(KBUILD_CFLAGS)
|
||||||
@ -87,22 +91,34 @@ endif
|
|||||||
ifneq ($(PARAMS_PHYS),)
|
ifneq ($(PARAMS_PHYS),)
|
||||||
LDFLAGS_vmlinux += --defsym params_phys=$(PARAMS_PHYS)
|
LDFLAGS_vmlinux += --defsym params_phys=$(PARAMS_PHYS)
|
||||||
endif
|
endif
|
||||||
LDFLAGS_vmlinux += -p --no-undefined -X \
|
# ?
|
||||||
$(shell $(CC) $(KBUILD_CFLAGS) --print-libgcc-file-name) -T
|
LDFLAGS_vmlinux += -p
|
||||||
|
# Report unresolved symbol references
|
||||||
|
LDFLAGS_vmlinux += --no-undefined
|
||||||
|
# Delete all temporary local symbols
|
||||||
|
LDFLAGS_vmlinux += -X
|
||||||
|
# Next argument is a linker script
|
||||||
|
LDFLAGS_vmlinux += -T
|
||||||
|
|
||||||
|
# For __aeabi_uidivmod
|
||||||
|
lib1funcs = $(obj)/lib1funcs.o
|
||||||
|
|
||||||
|
$(obj)/lib1funcs.S: $(srctree)/arch/$(SRCARCH)/lib/lib1funcs.S FORCE
|
||||||
|
$(call cmd,shipped)
|
||||||
|
|
||||||
# Don't allow any static data in misc.o, which
|
# Don't allow any static data in misc.o, which
|
||||||
# would otherwise mess up our GOT table
|
# would otherwise mess up our GOT table
|
||||||
CFLAGS_misc.o := -Dstatic=
|
CFLAGS_misc.o := -Dstatic=
|
||||||
|
|
||||||
$(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.o \
|
$(obj)/vmlinux: $(obj)/vmlinux.lds $(obj)/$(HEAD) $(obj)/piggy.$(suffix_y).o \
|
||||||
$(addprefix $(obj)/, $(OBJS)) FORCE
|
$(addprefix $(obj)/, $(OBJS)) $(lib1funcs) FORCE
|
||||||
$(call if_changed,ld)
|
$(call if_changed,ld)
|
||||||
@:
|
@:
|
||||||
|
|
||||||
$(obj)/piggy.gz: $(obj)/../Image FORCE
|
$(obj)/piggy.$(suffix_y): $(obj)/../Image FORCE
|
||||||
$(call if_changed,gzip)
|
$(call if_changed,$(suffix_y))
|
||||||
|
|
||||||
$(obj)/piggy.o: $(obj)/piggy.gz FORCE
|
$(obj)/piggy.$(suffix_y).o: $(obj)/piggy.$(suffix_y) FORCE
|
||||||
|
|
||||||
CFLAGS_font.o := -Dstatic=
|
CFLAGS_font.o := -Dstatic=
|
||||||
|
|
||||||
|
@ -27,6 +27,14 @@
|
|||||||
.macro writeb, ch, rb
|
.macro writeb, ch, rb
|
||||||
mcr p14, 0, \ch, c0, c5, 0
|
mcr p14, 0, \ch, c0, c5, 0
|
||||||
.endm
|
.endm
|
||||||
|
#elif defined(CONFIG_CPU_V7)
|
||||||
|
.macro loadsp, rb
|
||||||
|
.endm
|
||||||
|
.macro writeb, ch, rb
|
||||||
|
wait: mrc p14, 0, pc, c0, c1, 0
|
||||||
|
bcs wait
|
||||||
|
mcr p14, 0, \ch, c0, c5, 0
|
||||||
|
.endm
|
||||||
#elif defined(CONFIG_CPU_XSCALE)
|
#elif defined(CONFIG_CPU_XSCALE)
|
||||||
.macro loadsp, rb
|
.macro loadsp, rb
|
||||||
.endm
|
.endm
|
||||||
|
@ -18,10 +18,15 @@
|
|||||||
|
|
||||||
unsigned int __machine_arch_type;
|
unsigned int __machine_arch_type;
|
||||||
|
|
||||||
|
#define _LINUX_STRING_H_
|
||||||
|
|
||||||
#include <linux/compiler.h> /* for inline */
|
#include <linux/compiler.h> /* for inline */
|
||||||
#include <linux/types.h> /* for size_t */
|
#include <linux/types.h> /* for size_t */
|
||||||
#include <linux/stddef.h> /* for NULL */
|
#include <linux/stddef.h> /* for NULL */
|
||||||
#include <asm/string.h>
|
#include <asm/string.h>
|
||||||
|
#include <linux/linkage.h>
|
||||||
|
|
||||||
|
#include <asm/unaligned.h>
|
||||||
|
|
||||||
#ifdef STANDALONE_DEBUG
|
#ifdef STANDALONE_DEBUG
|
||||||
#define putstr printf
|
#define putstr printf
|
||||||
@ -48,6 +53,18 @@ static void icedcc_putc(int ch)
|
|||||||
|
|
||||||
asm("mcr p14, 0, %0, c0, c5, 0" : : "r" (ch));
|
asm("mcr p14, 0, %0, c0, c5, 0" : : "r" (ch));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#elif defined(CONFIG_CPU_V7)
|
||||||
|
|
||||||
|
static void icedcc_putc(int ch)
|
||||||
|
{
|
||||||
|
asm(
|
||||||
|
"wait: mrc p14, 0, pc, c0, c1, 0 \n\
|
||||||
|
bcs wait \n\
|
||||||
|
mcr p14, 0, %0, c0, c5, 0 "
|
||||||
|
: : "r" (ch));
|
||||||
|
}
|
||||||
|
|
||||||
#elif defined(CONFIG_CPU_XSCALE)
|
#elif defined(CONFIG_CPU_XSCALE)
|
||||||
|
|
||||||
static void icedcc_putc(int ch)
|
static void icedcc_putc(int ch)
|
||||||
@ -83,7 +100,6 @@ static void icedcc_putc(int ch)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define putc(ch) icedcc_putc(ch)
|
#define putc(ch) icedcc_putc(ch)
|
||||||
#define flush() do { } while (0)
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void putstr(const char *ptr)
|
static void putstr(const char *ptr)
|
||||||
@ -188,34 +204,8 @@ static inline __ptr_t memcpy(__ptr_t __dest, __const __ptr_t __src,
|
|||||||
/*
|
/*
|
||||||
* gzip delarations
|
* gzip delarations
|
||||||
*/
|
*/
|
||||||
#define OF(args) args
|
|
||||||
#define STATIC static
|
#define STATIC static
|
||||||
|
|
||||||
typedef unsigned char uch;
|
|
||||||
typedef unsigned short ush;
|
|
||||||
typedef unsigned long ulg;
|
|
||||||
|
|
||||||
#define WSIZE 0x8000 /* Window size must be at least 32k, */
|
|
||||||
/* and a power of two */
|
|
||||||
|
|
||||||
static uch *inbuf; /* input buffer */
|
|
||||||
static uch window[WSIZE]; /* Sliding window buffer */
|
|
||||||
|
|
||||||
static unsigned insize; /* valid bytes in inbuf */
|
|
||||||
static unsigned inptr; /* index of next byte to be processed in inbuf */
|
|
||||||
static unsigned outcnt; /* bytes in output buffer */
|
|
||||||
|
|
||||||
/* gzip flag byte */
|
|
||||||
#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */
|
|
||||||
#define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */
|
|
||||||
#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */
|
|
||||||
#define ORIG_NAME 0x08 /* bit 3 set: original file name present */
|
|
||||||
#define COMMENT 0x10 /* bit 4 set: file comment present */
|
|
||||||
#define ENCRYPTED 0x20 /* bit 5 set: file is encrypted */
|
|
||||||
#define RESERVED 0xC0 /* bit 6,7: reserved */
|
|
||||||
|
|
||||||
#define get_byte() (inptr < insize ? inbuf[inptr++] : fill_inbuf())
|
|
||||||
|
|
||||||
/* Diagnostic functions */
|
/* Diagnostic functions */
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
# define Assert(cond,msg) {if(!(cond)) error(msg);}
|
# define Assert(cond,msg) {if(!(cond)) error(msg);}
|
||||||
@ -233,24 +223,20 @@ static unsigned outcnt; /* bytes in output buffer */
|
|||||||
# define Tracecv(c,x)
|
# define Tracecv(c,x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int fill_inbuf(void);
|
|
||||||
static void flush_window(void);
|
|
||||||
static void error(char *m);
|
static void error(char *m);
|
||||||
|
|
||||||
extern char input_data[];
|
extern char input_data[];
|
||||||
extern char input_data_end[];
|
extern char input_data_end[];
|
||||||
|
|
||||||
static uch *output_data;
|
static unsigned char *output_data;
|
||||||
static ulg output_ptr;
|
static unsigned long output_ptr;
|
||||||
static ulg bytes_out;
|
|
||||||
|
|
||||||
static void error(char *m);
|
static void error(char *m);
|
||||||
|
|
||||||
static void putstr(const char *);
|
static void putstr(const char *);
|
||||||
|
|
||||||
extern int end;
|
static unsigned long free_mem_ptr;
|
||||||
static ulg free_mem_ptr;
|
static unsigned long free_mem_end_ptr;
|
||||||
static ulg free_mem_end_ptr;
|
|
||||||
|
|
||||||
#ifdef STANDALONE_DEBUG
|
#ifdef STANDALONE_DEBUG
|
||||||
#define NO_INFLATE_MALLOC
|
#define NO_INFLATE_MALLOC
|
||||||
@ -258,46 +244,13 @@ static ulg free_mem_end_ptr;
|
|||||||
|
|
||||||
#define ARCH_HAS_DECOMP_WDOG
|
#define ARCH_HAS_DECOMP_WDOG
|
||||||
|
|
||||||
#include "../../../../lib/inflate.c"
|
#ifdef CONFIG_KERNEL_GZIP
|
||||||
|
#include "../../../../lib/decompress_inflate.c"
|
||||||
|
#endif
|
||||||
|
|
||||||
/* ===========================================================================
|
#ifdef CONFIG_KERNEL_LZO
|
||||||
* Fill the input buffer. This is called only when the buffer is empty
|
#include "../../../../lib/decompress_unlzo.c"
|
||||||
* and at least one byte is really needed.
|
#endif
|
||||||
*/
|
|
||||||
int fill_inbuf(void)
|
|
||||||
{
|
|
||||||
if (insize != 0)
|
|
||||||
error("ran out of input data");
|
|
||||||
|
|
||||||
inbuf = input_data;
|
|
||||||
insize = &input_data_end[0] - &input_data[0];
|
|
||||||
|
|
||||||
inptr = 1;
|
|
||||||
return inbuf[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ===========================================================================
|
|
||||||
* Write the output window window[0..outcnt-1] and update crc and bytes_out.
|
|
||||||
* (Used for the decompressed data only.)
|
|
||||||
*/
|
|
||||||
void flush_window(void)
|
|
||||||
{
|
|
||||||
ulg c = crc;
|
|
||||||
unsigned n;
|
|
||||||
uch *in, *out, ch;
|
|
||||||
|
|
||||||
in = window;
|
|
||||||
out = &output_data[output_ptr];
|
|
||||||
for (n = 0; n < outcnt; n++) {
|
|
||||||
ch = *out++ = *in++;
|
|
||||||
c = crc_32_tab[((int)c ^ ch) & 0xff] ^ (c >> 8);
|
|
||||||
}
|
|
||||||
crc = c;
|
|
||||||
bytes_out += (ulg)outcnt;
|
|
||||||
output_ptr += (ulg)outcnt;
|
|
||||||
outcnt = 0;
|
|
||||||
putstr(".");
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef arch_error
|
#ifndef arch_error
|
||||||
#define arch_error(x)
|
#define arch_error(x)
|
||||||
@ -314,22 +267,33 @@ static void error(char *x)
|
|||||||
while(1); /* Halt */
|
while(1); /* Halt */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
asmlinkage void __div0(void)
|
||||||
|
{
|
||||||
|
error("Attempting division by 0!");
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef STANDALONE_DEBUG
|
#ifndef STANDALONE_DEBUG
|
||||||
|
|
||||||
ulg
|
unsigned long
|
||||||
decompress_kernel(ulg output_start, ulg free_mem_ptr_p, ulg free_mem_ptr_end_p,
|
decompress_kernel(unsigned long output_start, unsigned long free_mem_ptr_p,
|
||||||
int arch_id)
|
unsigned long free_mem_ptr_end_p,
|
||||||
|
int arch_id)
|
||||||
{
|
{
|
||||||
output_data = (uch *)output_start; /* Points to kernel start */
|
unsigned char *tmp;
|
||||||
|
|
||||||
|
output_data = (unsigned char *)output_start;
|
||||||
free_mem_ptr = free_mem_ptr_p;
|
free_mem_ptr = free_mem_ptr_p;
|
||||||
free_mem_end_ptr = free_mem_ptr_end_p;
|
free_mem_end_ptr = free_mem_ptr_end_p;
|
||||||
__machine_arch_type = arch_id;
|
__machine_arch_type = arch_id;
|
||||||
|
|
||||||
arch_decomp_setup();
|
arch_decomp_setup();
|
||||||
|
|
||||||
makecrc();
|
tmp = (unsigned char *) (((unsigned long)input_data_end) - 4);
|
||||||
|
output_ptr = get_unaligned_le32(tmp);
|
||||||
|
|
||||||
putstr("Uncompressing Linux...");
|
putstr("Uncompressing Linux...");
|
||||||
gunzip();
|
decompress(input_data, input_data_end - input_data,
|
||||||
|
NULL, NULL, output_data, NULL, error);
|
||||||
putstr(" done, booting the kernel.\n");
|
putstr(" done, booting the kernel.\n");
|
||||||
return output_ptr;
|
return output_ptr;
|
||||||
}
|
}
|
||||||
@ -341,11 +305,10 @@ int main()
|
|||||||
{
|
{
|
||||||
output_data = output_buffer;
|
output_data = output_buffer;
|
||||||
|
|
||||||
makecrc();
|
|
||||||
putstr("Uncompressing Linux...");
|
putstr("Uncompressing Linux...");
|
||||||
gunzip();
|
decompress(input_data, input_data_end - input_data,
|
||||||
|
NULL, NULL, output_data, NULL, error);
|
||||||
putstr("done.\n");
|
putstr("done.\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
6
arch/arm/boot/compressed/piggy.gzip.S
Normal file
6
arch/arm/boot/compressed/piggy.gzip.S
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
.section .piggydata,#alloc
|
||||||
|
.globl input_data
|
||||||
|
input_data:
|
||||||
|
.incbin "arch/arm/boot/compressed/piggy.gzip"
|
||||||
|
.globl input_data_end
|
||||||
|
input_data_end:
|
@ -1,6 +1,6 @@
|
|||||||
.section .piggydata,#alloc
|
.section .piggydata,#alloc
|
||||||
.globl input_data
|
.globl input_data
|
||||||
input_data:
|
input_data:
|
||||||
.incbin "arch/arm/boot/compressed/piggy.gz"
|
.incbin "arch/arm/boot/compressed/piggy.lzo"
|
||||||
.globl input_data_end
|
.globl input_data_end
|
||||||
input_data_end:
|
input_data_end:
|
@ -1,7 +1,7 @@
|
|||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.32-rc5
|
# Linux kernel version: 2.6.33-rc2
|
||||||
# Sat Oct 17 23:32:24 2009
|
# Wed Jan 6 00:01:36 2010
|
||||||
#
|
#
|
||||||
CONFIG_ARM=y
|
CONFIG_ARM=y
|
||||||
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
|
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
|
||||||
@ -46,6 +46,7 @@ CONFIG_SYSVIPC_SYSCTL=y
|
|||||||
#
|
#
|
||||||
CONFIG_TREE_RCU=y
|
CONFIG_TREE_RCU=y
|
||||||
# CONFIG_TREE_PREEMPT_RCU is not set
|
# CONFIG_TREE_PREEMPT_RCU is not set
|
||||||
|
# CONFIG_TINY_RCU is not set
|
||||||
# CONFIG_RCU_TRACE is not set
|
# CONFIG_RCU_TRACE is not set
|
||||||
CONFIG_RCU_FANOUT=32
|
CONFIG_RCU_FANOUT=32
|
||||||
# CONFIG_RCU_FANOUT_EXACT is not set
|
# CONFIG_RCU_FANOUT_EXACT is not set
|
||||||
@ -119,14 +120,41 @@ CONFIG_BLOCK=y
|
|||||||
# IO Schedulers
|
# IO Schedulers
|
||||||
#
|
#
|
||||||
CONFIG_IOSCHED_NOOP=y
|
CONFIG_IOSCHED_NOOP=y
|
||||||
# CONFIG_IOSCHED_AS is not set
|
|
||||||
CONFIG_IOSCHED_DEADLINE=y
|
CONFIG_IOSCHED_DEADLINE=y
|
||||||
# CONFIG_IOSCHED_CFQ is not set
|
# CONFIG_IOSCHED_CFQ is not set
|
||||||
# CONFIG_DEFAULT_AS is not set
|
|
||||||
CONFIG_DEFAULT_DEADLINE=y
|
CONFIG_DEFAULT_DEADLINE=y
|
||||||
# CONFIG_DEFAULT_CFQ is not set
|
# CONFIG_DEFAULT_CFQ is not set
|
||||||
# CONFIG_DEFAULT_NOOP is not set
|
# CONFIG_DEFAULT_NOOP is not set
|
||||||
CONFIG_DEFAULT_IOSCHED="deadline"
|
CONFIG_DEFAULT_IOSCHED="deadline"
|
||||||
|
# CONFIG_INLINE_SPIN_TRYLOCK is not set
|
||||||
|
# CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
|
||||||
|
# CONFIG_INLINE_SPIN_LOCK is not set
|
||||||
|
# CONFIG_INLINE_SPIN_LOCK_BH is not set
|
||||||
|
# CONFIG_INLINE_SPIN_LOCK_IRQ is not set
|
||||||
|
# CONFIG_INLINE_SPIN_LOCK_IRQSAVE is not set
|
||||||
|
# CONFIG_INLINE_SPIN_UNLOCK is not set
|
||||||
|
# CONFIG_INLINE_SPIN_UNLOCK_BH is not set
|
||||||
|
# CONFIG_INLINE_SPIN_UNLOCK_IRQ is not set
|
||||||
|
# CONFIG_INLINE_SPIN_UNLOCK_IRQRESTORE is not set
|
||||||
|
# CONFIG_INLINE_READ_TRYLOCK is not set
|
||||||
|
# CONFIG_INLINE_READ_LOCK is not set
|
||||||
|
# CONFIG_INLINE_READ_LOCK_BH is not set
|
||||||
|
# CONFIG_INLINE_READ_LOCK_IRQ is not set
|
||||||
|
# CONFIG_INLINE_READ_LOCK_IRQSAVE is not set
|
||||||
|
# CONFIG_INLINE_READ_UNLOCK is not set
|
||||||
|
# CONFIG_INLINE_READ_UNLOCK_BH is not set
|
||||||
|
# CONFIG_INLINE_READ_UNLOCK_IRQ is not set
|
||||||
|
# CONFIG_INLINE_READ_UNLOCK_IRQRESTORE is not set
|
||||||
|
# CONFIG_INLINE_WRITE_TRYLOCK is not set
|
||||||
|
# CONFIG_INLINE_WRITE_LOCK is not set
|
||||||
|
# CONFIG_INLINE_WRITE_LOCK_BH is not set
|
||||||
|
# CONFIG_INLINE_WRITE_LOCK_IRQ is not set
|
||||||
|
# CONFIG_INLINE_WRITE_LOCK_IRQSAVE is not set
|
||||||
|
# CONFIG_INLINE_WRITE_UNLOCK is not set
|
||||||
|
# CONFIG_INLINE_WRITE_UNLOCK_BH is not set
|
||||||
|
# CONFIG_INLINE_WRITE_UNLOCK_IRQ is not set
|
||||||
|
# CONFIG_INLINE_WRITE_UNLOCK_IRQRESTORE is not set
|
||||||
|
# CONFIG_MUTEX_SPIN_ON_OWNER is not set
|
||||||
# CONFIG_FREEZER is not set
|
# CONFIG_FREEZER is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -155,6 +183,7 @@ CONFIG_MMU=y
|
|||||||
# CONFIG_ARCH_IXP2000 is not set
|
# CONFIG_ARCH_IXP2000 is not set
|
||||||
# CONFIG_ARCH_IXP4XX is not set
|
# CONFIG_ARCH_IXP4XX is not set
|
||||||
# CONFIG_ARCH_L7200 is not set
|
# CONFIG_ARCH_L7200 is not set
|
||||||
|
# CONFIG_ARCH_DOVE is not set
|
||||||
# CONFIG_ARCH_KIRKWOOD is not set
|
# CONFIG_ARCH_KIRKWOOD is not set
|
||||||
# CONFIG_ARCH_LOKI is not set
|
# CONFIG_ARCH_LOKI is not set
|
||||||
# CONFIG_ARCH_MV78XX0 is not set
|
# CONFIG_ARCH_MV78XX0 is not set
|
||||||
@ -177,6 +206,7 @@ CONFIG_ARCH_U300=y
|
|||||||
# CONFIG_ARCH_DAVINCI is not set
|
# CONFIG_ARCH_DAVINCI is not set
|
||||||
# CONFIG_ARCH_OMAP is not set
|
# CONFIG_ARCH_OMAP is not set
|
||||||
# CONFIG_ARCH_BCMRING is not set
|
# CONFIG_ARCH_BCMRING is not set
|
||||||
|
# CONFIG_ARCH_U8500 is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# ST-Ericsson AB U300/U330/U335/U365 Platform
|
# ST-Ericsson AB U300/U330/U335/U365 Platform
|
||||||
@ -265,12 +295,10 @@ CONFIG_FLATMEM_MANUAL=y
|
|||||||
CONFIG_FLATMEM=y
|
CONFIG_FLATMEM=y
|
||||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||||
CONFIG_PAGEFLAGS_EXTENDED=y
|
CONFIG_PAGEFLAGS_EXTENDED=y
|
||||||
CONFIG_SPLIT_PTLOCK_CPUS=4096
|
CONFIG_SPLIT_PTLOCK_CPUS=999999
|
||||||
# CONFIG_PHYS_ADDR_T_64BIT is not set
|
# CONFIG_PHYS_ADDR_T_64BIT is not set
|
||||||
CONFIG_ZONE_DMA_FLAG=0
|
CONFIG_ZONE_DMA_FLAG=0
|
||||||
CONFIG_VIRT_TO_BUS=y
|
CONFIG_VIRT_TO_BUS=y
|
||||||
CONFIG_HAVE_MLOCK=y
|
|
||||||
CONFIG_HAVE_MLOCKED_PAGE_BIT=y
|
|
||||||
# CONFIG_KSM is not set
|
# CONFIG_KSM is not set
|
||||||
CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
|
CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
|
||||||
CONFIG_ALIGNMENT_TRAP=y
|
CONFIG_ALIGNMENT_TRAP=y
|
||||||
@ -499,14 +527,21 @@ CONFIG_MTD_NAND_IDS=y
|
|||||||
CONFIG_BLK_DEV=y
|
CONFIG_BLK_DEV=y
|
||||||
# CONFIG_BLK_DEV_COW_COMMON is not set
|
# CONFIG_BLK_DEV_COW_COMMON is not set
|
||||||
# CONFIG_BLK_DEV_LOOP is not set
|
# CONFIG_BLK_DEV_LOOP is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# DRBD disabled because PROC_FS, INET or CONNECTOR not selected
|
||||||
|
#
|
||||||
# CONFIG_BLK_DEV_NBD is not set
|
# CONFIG_BLK_DEV_NBD is not set
|
||||||
# CONFIG_BLK_DEV_RAM is not set
|
# CONFIG_BLK_DEV_RAM is not set
|
||||||
# CONFIG_CDROM_PKTCDVD is not set
|
# CONFIG_CDROM_PKTCDVD is not set
|
||||||
# CONFIG_ATA_OVER_ETH is not set
|
# CONFIG_ATA_OVER_ETH is not set
|
||||||
CONFIG_MISC_DEVICES=y
|
CONFIG_MISC_DEVICES=y
|
||||||
|
# CONFIG_AD525X_DPOT is not set
|
||||||
# CONFIG_ICS932S401 is not set
|
# CONFIG_ICS932S401 is not set
|
||||||
# CONFIG_ENCLOSURE_SERVICES is not set
|
# CONFIG_ENCLOSURE_SERVICES is not set
|
||||||
# CONFIG_ISL29003 is not set
|
# CONFIG_ISL29003 is not set
|
||||||
|
# CONFIG_DS1682 is not set
|
||||||
|
# CONFIG_TI_DAC7512 is not set
|
||||||
# CONFIG_C2PORT is not set
|
# CONFIG_C2PORT is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -517,6 +552,7 @@ CONFIG_MISC_DEVICES=y
|
|||||||
# CONFIG_EEPROM_LEGACY is not set
|
# CONFIG_EEPROM_LEGACY is not set
|
||||||
# CONFIG_EEPROM_MAX6875 is not set
|
# CONFIG_EEPROM_MAX6875 is not set
|
||||||
# CONFIG_EEPROM_93CX6 is not set
|
# CONFIG_EEPROM_93CX6 is not set
|
||||||
|
# CONFIG_IWMC3200TOP is not set
|
||||||
CONFIG_HAVE_IDE=y
|
CONFIG_HAVE_IDE=y
|
||||||
# CONFIG_IDE is not set
|
# CONFIG_IDE is not set
|
||||||
|
|
||||||
@ -539,6 +575,7 @@ CONFIG_HAVE_IDE=y
|
|||||||
CONFIG_INPUT=y
|
CONFIG_INPUT=y
|
||||||
# CONFIG_INPUT_FF_MEMLESS is not set
|
# CONFIG_INPUT_FF_MEMLESS is not set
|
||||||
# CONFIG_INPUT_POLLDEV is not set
|
# CONFIG_INPUT_POLLDEV is not set
|
||||||
|
# CONFIG_INPUT_SPARSEKMAP is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Userland interfaces
|
# Userland interfaces
|
||||||
@ -645,7 +682,6 @@ CONFIG_I2C_STU300=y
|
|||||||
#
|
#
|
||||||
# Miscellaneous I2C Chip support
|
# Miscellaneous I2C Chip support
|
||||||
#
|
#
|
||||||
# CONFIG_DS1682 is not set
|
|
||||||
# CONFIG_SENSORS_TSL2550 is not set
|
# CONFIG_SENSORS_TSL2550 is not set
|
||||||
# CONFIG_I2C_DEBUG_CORE is not set
|
# CONFIG_I2C_DEBUG_CORE is not set
|
||||||
# CONFIG_I2C_DEBUG_ALGO is not set
|
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||||
@ -661,6 +697,8 @@ CONFIG_SPI_MASTER=y
|
|||||||
# CONFIG_SPI_BITBANG is not set
|
# CONFIG_SPI_BITBANG is not set
|
||||||
# CONFIG_SPI_GPIO is not set
|
# CONFIG_SPI_GPIO is not set
|
||||||
CONFIG_SPI_PL022=y
|
CONFIG_SPI_PL022=y
|
||||||
|
# CONFIG_SPI_XILINX is not set
|
||||||
|
# CONFIG_SPI_DESIGNWARE is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# SPI Protocol Masters
|
# SPI Protocol Masters
|
||||||
@ -708,6 +746,7 @@ CONFIG_SSB_POSSIBLE=y
|
|||||||
# CONFIG_MFD_T7L66XB is not set
|
# CONFIG_MFD_T7L66XB is not set
|
||||||
# CONFIG_MFD_TC6387XB is not set
|
# CONFIG_MFD_TC6387XB is not set
|
||||||
# CONFIG_PMIC_DA903X is not set
|
# CONFIG_PMIC_DA903X is not set
|
||||||
|
# CONFIG_PMIC_ADP5520 is not set
|
||||||
# CONFIG_MFD_WM8400 is not set
|
# CONFIG_MFD_WM8400 is not set
|
||||||
# CONFIG_MFD_WM831X is not set
|
# CONFIG_MFD_WM831X is not set
|
||||||
# CONFIG_MFD_WM8350_I2C is not set
|
# CONFIG_MFD_WM8350_I2C is not set
|
||||||
@ -716,6 +755,8 @@ CONFIG_SSB_POSSIBLE=y
|
|||||||
CONFIG_AB3100_CORE=y
|
CONFIG_AB3100_CORE=y
|
||||||
CONFIG_AB3100_OTP=y
|
CONFIG_AB3100_OTP=y
|
||||||
# CONFIG_EZX_PCAP is not set
|
# CONFIG_EZX_PCAP is not set
|
||||||
|
# CONFIG_MFD_88PM8607 is not set
|
||||||
|
# CONFIG_AB4500_CORE is not set
|
||||||
CONFIG_REGULATOR=y
|
CONFIG_REGULATOR=y
|
||||||
# CONFIG_REGULATOR_DEBUG is not set
|
# CONFIG_REGULATOR_DEBUG is not set
|
||||||
# CONFIG_REGULATOR_FIXED_VOLTAGE is not set
|
# CONFIG_REGULATOR_FIXED_VOLTAGE is not set
|
||||||
@ -723,6 +764,7 @@ CONFIG_REGULATOR=y
|
|||||||
# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set
|
# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set
|
||||||
# CONFIG_REGULATOR_BQ24022 is not set
|
# CONFIG_REGULATOR_BQ24022 is not set
|
||||||
# CONFIG_REGULATOR_MAX1586 is not set
|
# CONFIG_REGULATOR_MAX1586 is not set
|
||||||
|
# CONFIG_REGULATOR_MAX8660 is not set
|
||||||
# CONFIG_REGULATOR_LP3971 is not set
|
# CONFIG_REGULATOR_LP3971 is not set
|
||||||
CONFIG_REGULATOR_AB3100=y
|
CONFIG_REGULATOR_AB3100=y
|
||||||
# CONFIG_REGULATOR_TPS65023 is not set
|
# CONFIG_REGULATOR_TPS65023 is not set
|
||||||
@ -840,7 +882,9 @@ CONFIG_LEDS_CLASS=y
|
|||||||
# CONFIG_LEDS_LP3944 is not set
|
# CONFIG_LEDS_LP3944 is not set
|
||||||
# CONFIG_LEDS_PCA955X is not set
|
# CONFIG_LEDS_PCA955X is not set
|
||||||
# CONFIG_LEDS_DAC124S085 is not set
|
# CONFIG_LEDS_DAC124S085 is not set
|
||||||
|
# CONFIG_LEDS_REGULATOR is not set
|
||||||
# CONFIG_LEDS_BD2802 is not set
|
# CONFIG_LEDS_BD2802 is not set
|
||||||
|
# CONFIG_LEDS_LT3593 is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# LED Triggers
|
# LED Triggers
|
||||||
@ -882,6 +926,7 @@ CONFIG_RTC_INTF_DEV=y
|
|||||||
# CONFIG_RTC_DRV_PCF8563 is not set
|
# CONFIG_RTC_DRV_PCF8563 is not set
|
||||||
# CONFIG_RTC_DRV_PCF8583 is not set
|
# CONFIG_RTC_DRV_PCF8583 is not set
|
||||||
# CONFIG_RTC_DRV_M41T80 is not set
|
# CONFIG_RTC_DRV_M41T80 is not set
|
||||||
|
# CONFIG_RTC_DRV_BQ32K is not set
|
||||||
# CONFIG_RTC_DRV_S35390A is not set
|
# CONFIG_RTC_DRV_S35390A is not set
|
||||||
# CONFIG_RTC_DRV_FM3130 is not set
|
# CONFIG_RTC_DRV_FM3130 is not set
|
||||||
# CONFIG_RTC_DRV_RX8581 is not set
|
# CONFIG_RTC_DRV_RX8581 is not set
|
||||||
@ -911,7 +956,9 @@ CONFIG_RTC_INTF_DEV=y
|
|||||||
# CONFIG_RTC_DRV_M48T86 is not set
|
# CONFIG_RTC_DRV_M48T86 is not set
|
||||||
# CONFIG_RTC_DRV_M48T35 is not set
|
# CONFIG_RTC_DRV_M48T35 is not set
|
||||||
# CONFIG_RTC_DRV_M48T59 is not set
|
# CONFIG_RTC_DRV_M48T59 is not set
|
||||||
|
# CONFIG_RTC_DRV_MSM6242 is not set
|
||||||
# CONFIG_RTC_DRV_BQ4802 is not set
|
# CONFIG_RTC_DRV_BQ4802 is not set
|
||||||
|
# CONFIG_RTC_DRV_RP5C01 is not set
|
||||||
# CONFIG_RTC_DRV_V3020 is not set
|
# CONFIG_RTC_DRV_V3020 is not set
|
||||||
CONFIG_RTC_DRV_AB3100=y
|
CONFIG_RTC_DRV_AB3100=y
|
||||||
|
|
||||||
@ -926,6 +973,15 @@ CONFIG_DMADEVICES=y
|
|||||||
#
|
#
|
||||||
# DMA Devices
|
# DMA Devices
|
||||||
#
|
#
|
||||||
|
CONFIG_COH901318=y
|
||||||
|
CONFIG_DMA_ENGINE=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# DMA Clients
|
||||||
|
#
|
||||||
|
# CONFIG_NET_DMA is not set
|
||||||
|
# CONFIG_ASYNC_TX_DMA is not set
|
||||||
|
# CONFIG_DMATEST is not set
|
||||||
# CONFIG_AUXDISPLAY is not set
|
# CONFIG_AUXDISPLAY is not set
|
||||||
# CONFIG_UIO is not set
|
# CONFIG_UIO is not set
|
||||||
|
|
||||||
@ -1018,7 +1074,7 @@ CONFIG_MISC_FILESYSTEMS=y
|
|||||||
CONFIG_MSDOS_PARTITION=y
|
CONFIG_MSDOS_PARTITION=y
|
||||||
CONFIG_NLS=y
|
CONFIG_NLS=y
|
||||||
CONFIG_NLS_DEFAULT="iso8859-1"
|
CONFIG_NLS_DEFAULT="iso8859-1"
|
||||||
# CONFIG_NLS_CODEPAGE_437 is not set
|
CONFIG_NLS_CODEPAGE_437=y
|
||||||
# CONFIG_NLS_CODEPAGE_737 is not set
|
# CONFIG_NLS_CODEPAGE_737 is not set
|
||||||
# CONFIG_NLS_CODEPAGE_775 is not set
|
# CONFIG_NLS_CODEPAGE_775 is not set
|
||||||
# CONFIG_NLS_CODEPAGE_850 is not set
|
# CONFIG_NLS_CODEPAGE_850 is not set
|
||||||
@ -1135,6 +1191,7 @@ CONFIG_ARM_UNWIND=y
|
|||||||
# CONFIG_DEBUG_ERRORS is not set
|
# CONFIG_DEBUG_ERRORS is not set
|
||||||
# CONFIG_DEBUG_STACK_USAGE is not set
|
# CONFIG_DEBUG_STACK_USAGE is not set
|
||||||
# CONFIG_DEBUG_LL is not set
|
# CONFIG_DEBUG_LL is not set
|
||||||
|
# CONFIG_OC_ETM is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Security options
|
# Security options
|
||||||
@ -1142,7 +1199,11 @@ CONFIG_ARM_UNWIND=y
|
|||||||
# CONFIG_KEYS is not set
|
# CONFIG_KEYS is not set
|
||||||
# CONFIG_SECURITY is not set
|
# CONFIG_SECURITY is not set
|
||||||
# CONFIG_SECURITYFS is not set
|
# CONFIG_SECURITYFS is not set
|
||||||
# CONFIG_SECURITY_FILE_CAPABILITIES is not set
|
# CONFIG_DEFAULT_SECURITY_SELINUX is not set
|
||||||
|
# CONFIG_DEFAULT_SECURITY_SMACK is not set
|
||||||
|
# CONFIG_DEFAULT_SECURITY_TOMOYO is not set
|
||||||
|
CONFIG_DEFAULT_SECURITY_DAC=y
|
||||||
|
CONFIG_DEFAULT_SECURITY=""
|
||||||
# CONFIG_CRYPTO is not set
|
# CONFIG_CRYPTO is not set
|
||||||
# CONFIG_BINARY_PRINTF is not set
|
# CONFIG_BINARY_PRINTF is not set
|
||||||
|
|
||||||
|
@ -154,16 +154,16 @@
|
|||||||
* Please note that the implementation of these, and the required
|
* Please note that the implementation of these, and the required
|
||||||
* effects are cache-type (VIVT/VIPT/PIPT) specific.
|
* effects are cache-type (VIVT/VIPT/PIPT) specific.
|
||||||
*
|
*
|
||||||
* flush_cache_kern_all()
|
* flush_kern_all()
|
||||||
*
|
*
|
||||||
* Unconditionally clean and invalidate the entire cache.
|
* Unconditionally clean and invalidate the entire cache.
|
||||||
*
|
*
|
||||||
* flush_cache_user_mm(mm)
|
* flush_user_all()
|
||||||
*
|
*
|
||||||
* Clean and invalidate all user space cache entries
|
* Clean and invalidate all user space cache entries
|
||||||
* before a change of page tables.
|
* before a change of page tables.
|
||||||
*
|
*
|
||||||
* flush_cache_user_range(start, end, flags)
|
* flush_user_range(start, end, flags)
|
||||||
*
|
*
|
||||||
* Clean and invalidate a range of cache entries in the
|
* Clean and invalidate a range of cache entries in the
|
||||||
* specified address space before a change of page tables.
|
* specified address space before a change of page tables.
|
||||||
@ -179,6 +179,20 @@
|
|||||||
* - start - virtual start address
|
* - start - virtual start address
|
||||||
* - end - virtual end address
|
* - end - virtual end address
|
||||||
*
|
*
|
||||||
|
* coherent_user_range(start, end)
|
||||||
|
*
|
||||||
|
* Ensure coherency between the Icache and the Dcache in the
|
||||||
|
* region described by start, end. If you have non-snooping
|
||||||
|
* Harvard caches, you need to implement this function.
|
||||||
|
* - start - virtual start address
|
||||||
|
* - end - virtual end address
|
||||||
|
*
|
||||||
|
* flush_kern_dcache_area(kaddr, size)
|
||||||
|
*
|
||||||
|
* Ensure that the data held in page is written back.
|
||||||
|
* - kaddr - page address
|
||||||
|
* - size - region size
|
||||||
|
*
|
||||||
* DMA Cache Coherency
|
* DMA Cache Coherency
|
||||||
* ===================
|
* ===================
|
||||||
*
|
*
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
#define __ASM_ARM_CPU_H
|
#define __ASM_ARM_CPU_H
|
||||||
|
|
||||||
#include <linux/percpu.h>
|
#include <linux/percpu.h>
|
||||||
|
#include <linux/cpu.h>
|
||||||
|
|
||||||
struct cpuinfo_arm {
|
struct cpuinfo_arm {
|
||||||
struct cpu cpu;
|
struct cpu cpu;
|
||||||
|
@ -138,12 +138,12 @@ extern int get_dma_residue(unsigned int chan);
|
|||||||
#define NO_DMA 255
|
#define NO_DMA 255
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#endif /* CONFIG_ISA_DMA_API */
|
||||||
|
|
||||||
#ifdef CONFIG_PCI
|
#ifdef CONFIG_PCI
|
||||||
extern int isa_dma_bridge_buggy;
|
extern int isa_dma_bridge_buggy;
|
||||||
#else
|
#else
|
||||||
#define isa_dma_bridge_buggy (0)
|
#define isa_dma_bridge_buggy (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* CONFIG_ISA_DMA_API */
|
|
||||||
|
|
||||||
#endif /* __ASM_ARM_DMA_H */
|
#endif /* __ASM_ARM_DMA_H */
|
||||||
|
@ -97,9 +97,15 @@
|
|||||||
* stack during a system call. Note that sizeof(struct pt_regs)
|
* stack during a system call. Note that sizeof(struct pt_regs)
|
||||||
* has to be a multiple of 8.
|
* has to be a multiple of 8.
|
||||||
*/
|
*/
|
||||||
|
#ifndef __KERNEL__
|
||||||
struct pt_regs {
|
struct pt_regs {
|
||||||
long uregs[18];
|
long uregs[18];
|
||||||
};
|
};
|
||||||
|
#else /* __KERNEL__ */
|
||||||
|
struct pt_regs {
|
||||||
|
unsigned long uregs[18];
|
||||||
|
};
|
||||||
|
#endif /* __KERNEL__ */
|
||||||
|
|
||||||
#define ARM_cpsr uregs[16]
|
#define ARM_cpsr uregs[16]
|
||||||
#define ARM_pc uregs[15]
|
#define ARM_pc uregs[15]
|
||||||
|
@ -391,6 +391,7 @@
|
|||||||
#define __NR_pwritev (__NR_SYSCALL_BASE+362)
|
#define __NR_pwritev (__NR_SYSCALL_BASE+362)
|
||||||
#define __NR_rt_tgsigqueueinfo (__NR_SYSCALL_BASE+363)
|
#define __NR_rt_tgsigqueueinfo (__NR_SYSCALL_BASE+363)
|
||||||
#define __NR_perf_event_open (__NR_SYSCALL_BASE+364)
|
#define __NR_perf_event_open (__NR_SYSCALL_BASE+364)
|
||||||
|
#define __NR_recvmmsg (__NR_SYSCALL_BASE+365)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The following SWIs are ARM private.
|
* The following SWIs are ARM private.
|
||||||
|
@ -49,6 +49,26 @@
|
|||||||
1002:
|
1002:
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
#elif defined(CONFIG_CPU_V7)
|
||||||
|
|
||||||
|
.macro addruart, rx
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro senduart, rd, rx
|
||||||
|
mcr p14, 0, \rd, c0, c5, 0
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro busyuart, rd, rx
|
||||||
|
busy: mrc p14, 0, pc, c0, c1, 0
|
||||||
|
bcs busy
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro waituart, rd, rx
|
||||||
|
wait: mrc p14, 0, pc, c0, c1, 0
|
||||||
|
bcs wait
|
||||||
|
|
||||||
|
.endm
|
||||||
|
|
||||||
#elif defined(CONFIG_CPU_XSCALE)
|
#elif defined(CONFIG_CPU_XSCALE)
|
||||||
|
|
||||||
.macro addruart, rx
|
.macro addruart, rx
|
||||||
|
@ -78,15 +78,6 @@ int arm_elf_read_implies_exec(const struct elf32_hdr *x, int executable_stack)
|
|||||||
return 1;
|
return 1;
|
||||||
if (cpu_architecture() < CPU_ARCH_ARMv6)
|
if (cpu_architecture() < CPU_ARCH_ARMv6)
|
||||||
return 1;
|
return 1;
|
||||||
#if !defined(CONFIG_AEABI) || defined(CONFIG_OABI_COMPAT)
|
|
||||||
/*
|
|
||||||
* If we have support for OABI programs, we can never allow NX
|
|
||||||
* support - our signal syscall restart mechanism relies upon
|
|
||||||
* being able to execute code placed on the user stack.
|
|
||||||
*/
|
|
||||||
return 1;
|
|
||||||
#else
|
|
||||||
return 0;
|
return 0;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(arm_elf_read_implies_exec);
|
EXPORT_SYMBOL(arm_elf_read_implies_exec);
|
||||||
|
@ -957,9 +957,7 @@ kuser_cmpxchg_fixup:
|
|||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
smp_dmb
|
||||||
mcr p15, 0, r0, c7, c10, 5 @ dmb
|
|
||||||
#endif
|
|
||||||
1: ldrex r3, [r2]
|
1: ldrex r3, [r2]
|
||||||
subs r3, r3, r0
|
subs r3, r3, r0
|
||||||
strexeq r3, r1, [r2]
|
strexeq r3, r1, [r2]
|
||||||
|
@ -212,7 +212,8 @@ void __show_regs(struct pt_regs *regs)
|
|||||||
char buf[64];
|
char buf[64];
|
||||||
|
|
||||||
printk("CPU: %d %s (%s %.*s)\n",
|
printk("CPU: %d %s (%s %.*s)\n",
|
||||||
smp_processor_id(), print_tainted(), init_utsname()->release,
|
raw_smp_processor_id(), print_tainted(),
|
||||||
|
init_utsname()->release,
|
||||||
(int)strcspn(init_utsname()->version, " "),
|
(int)strcspn(init_utsname()->version, " "),
|
||||||
init_utsname()->version);
|
init_utsname()->version);
|
||||||
print_symbol("PC is at %s\n", instruction_pointer(regs));
|
print_symbol("PC is at %s\n", instruction_pointer(regs));
|
||||||
|
@ -236,6 +236,7 @@ static struct vpfe_subdev_info vpfe_sub_devs[] = {
|
|||||||
|
|
||||||
static struct vpfe_config vpfe_cfg = {
|
static struct vpfe_config vpfe_cfg = {
|
||||||
.num_subdevs = ARRAY_SIZE(vpfe_sub_devs),
|
.num_subdevs = ARRAY_SIZE(vpfe_sub_devs),
|
||||||
|
.i2c_adapter_id = 1,
|
||||||
.sub_devs = vpfe_sub_devs,
|
.sub_devs = vpfe_sub_devs,
|
||||||
.card_name = "DM355 EVM",
|
.card_name = "DM355 EVM",
|
||||||
.ccdc = "DM355 CCDC",
|
.ccdc = "DM355 CCDC",
|
||||||
|
@ -192,7 +192,11 @@ static struct davinci_i2c_platform_data i2c_pdata = {
|
|||||||
.bus_delay = 0 /* usec */,
|
.bus_delay = 0 /* usec */,
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_KEYBOARD_DAVINCI
|
static int dm365evm_keyscan_enable(struct device *dev)
|
||||||
|
{
|
||||||
|
return davinci_cfg_reg(DM365_KEYSCAN);
|
||||||
|
}
|
||||||
|
|
||||||
static unsigned short dm365evm_keymap[] = {
|
static unsigned short dm365evm_keymap[] = {
|
||||||
KEY_KP2,
|
KEY_KP2,
|
||||||
KEY_LEFT,
|
KEY_LEFT,
|
||||||
@ -214,6 +218,7 @@ static unsigned short dm365evm_keymap[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct davinci_ks_platform_data dm365evm_ks_data = {
|
static struct davinci_ks_platform_data dm365evm_ks_data = {
|
||||||
|
.device_enable = dm365evm_keyscan_enable,
|
||||||
.keymap = dm365evm_keymap,
|
.keymap = dm365evm_keymap,
|
||||||
.keymapsize = ARRAY_SIZE(dm365evm_keymap),
|
.keymapsize = ARRAY_SIZE(dm365evm_keymap),
|
||||||
.rep = 1,
|
.rep = 1,
|
||||||
@ -222,7 +227,6 @@ static struct davinci_ks_platform_data dm365evm_ks_data = {
|
|||||||
.interval = 0x2,
|
.interval = 0x2,
|
||||||
.matrix_type = DAVINCI_KEYSCAN_MATRIX_4X4,
|
.matrix_type = DAVINCI_KEYSCAN_MATRIX_4X4,
|
||||||
};
|
};
|
||||||
#endif
|
|
||||||
|
|
||||||
static int cpld_mmc_get_cd(int module)
|
static int cpld_mmc_get_cd(int module)
|
||||||
{
|
{
|
||||||
@ -511,10 +515,7 @@ static __init void dm365_evm_init(void)
|
|||||||
|
|
||||||
dm365_init_asp(&dm365_evm_snd_data);
|
dm365_init_asp(&dm365_evm_snd_data);
|
||||||
dm365_init_rtc();
|
dm365_init_rtc();
|
||||||
|
|
||||||
#ifdef CONFIG_KEYBOARD_DAVINCI
|
|
||||||
dm365_init_ks(&dm365evm_ks_data);
|
dm365_init_ks(&dm365evm_ks_data);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static __init void dm365_evm_irq_init(void)
|
static __init void dm365_evm_irq_init(void)
|
||||||
|
@ -247,6 +247,7 @@ static struct vpfe_subdev_info vpfe_sub_devs[] = {
|
|||||||
|
|
||||||
static struct vpfe_config vpfe_cfg = {
|
static struct vpfe_config vpfe_cfg = {
|
||||||
.num_subdevs = ARRAY_SIZE(vpfe_sub_devs),
|
.num_subdevs = ARRAY_SIZE(vpfe_sub_devs),
|
||||||
|
.i2c_adapter_id = 1,
|
||||||
.sub_devs = vpfe_sub_devs,
|
.sub_devs = vpfe_sub_devs,
|
||||||
.card_name = "DM6446 EVM",
|
.card_name = "DM6446 EVM",
|
||||||
.ccdc = "DM6446 CCDC",
|
.ccdc = "DM6446 CCDC",
|
||||||
|
@ -81,12 +81,23 @@ static int cp_intc_set_irq_type(unsigned int irq, unsigned int flow_type)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Faking this allows us to to work with suspend functions of
|
||||||
|
* generic drivers which call {enable|disable}_irq_wake for
|
||||||
|
* wake up interrupt sources (eg RTC on DA850).
|
||||||
|
*/
|
||||||
|
static int cp_intc_set_wake(unsigned int irq, unsigned int on)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static struct irq_chip cp_intc_irq_chip = {
|
static struct irq_chip cp_intc_irq_chip = {
|
||||||
.name = "cp_intc",
|
.name = "cp_intc",
|
||||||
.ack = cp_intc_ack_irq,
|
.ack = cp_intc_ack_irq,
|
||||||
.mask = cp_intc_mask_irq,
|
.mask = cp_intc_mask_irq,
|
||||||
.unmask = cp_intc_unmask_irq,
|
.unmask = cp_intc_unmask_irq,
|
||||||
.set_type = cp_intc_set_irq_type,
|
.set_type = cp_intc_set_irq_type,
|
||||||
|
.set_wake = cp_intc_set_wake,
|
||||||
};
|
};
|
||||||
|
|
||||||
void __init cp_intc_init(void __iomem *base, unsigned short num_irq,
|
void __init cp_intc_init(void __iomem *base, unsigned short num_irq,
|
||||||
|
@ -481,11 +481,18 @@ static struct platform_device da8xx_rtc_device = {
|
|||||||
|
|
||||||
int da8xx_register_rtc(void)
|
int da8xx_register_rtc(void)
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
/* Unlock the rtc's registers */
|
/* Unlock the rtc's registers */
|
||||||
__raw_writel(0x83e70b13, IO_ADDRESS(DA8XX_RTC_BASE + 0x6c));
|
__raw_writel(0x83e70b13, IO_ADDRESS(DA8XX_RTC_BASE + 0x6c));
|
||||||
__raw_writel(0x95a4f1e0, IO_ADDRESS(DA8XX_RTC_BASE + 0x70));
|
__raw_writel(0x95a4f1e0, IO_ADDRESS(DA8XX_RTC_BASE + 0x70));
|
||||||
|
|
||||||
return platform_device_register(&da8xx_rtc_device);
|
ret = platform_device_register(&da8xx_rtc_device);
|
||||||
|
if (!ret)
|
||||||
|
/* Atleast on DA850, RTC is a wakeup source */
|
||||||
|
device_init_wakeup(&da8xx_rtc_device.dev, true);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct resource da8xx_cpuidle_resources[] = {
|
static struct resource da8xx_cpuidle_resources[] = {
|
||||||
|
@ -993,7 +993,6 @@ void __init dm365_init_asp(struct snd_platform_data *pdata)
|
|||||||
|
|
||||||
void __init dm365_init_ks(struct davinci_ks_platform_data *pdata)
|
void __init dm365_init_ks(struct davinci_ks_platform_data *pdata)
|
||||||
{
|
{
|
||||||
davinci_cfg_reg(DM365_KEYSCAN);
|
|
||||||
dm365_ks_device.dev.platform_data = pdata;
|
dm365_ks_device.dev.platform_data = pdata;
|
||||||
platform_device_register(&dm365_ks_device);
|
platform_device_register(&dm365_ks_device);
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,7 @@ enum davinci_matrix_types {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct davinci_ks_platform_data {
|
struct davinci_ks_platform_data {
|
||||||
|
int (*device_enable)(struct device *dev);
|
||||||
unsigned short *keymap;
|
unsigned short *keymap;
|
||||||
u32 keymapsize;
|
u32 keymapsize;
|
||||||
u8 rep:1;
|
u8 rep:1;
|
||||||
|
@ -30,7 +30,9 @@ static inline void putc(char c)
|
|||||||
UART[UART_TX] = c;
|
UART[UART_TX] = c;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define flush() do { } while (0)
|
static inline void flush(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* nothing to do
|
* nothing to do
|
||||||
|
@ -10,6 +10,8 @@
|
|||||||
#include <mach/hardware.h>
|
#include <mach/hardware.h>
|
||||||
#include <mach/clocks.h>
|
#include <mach/clocks.h>
|
||||||
#include <linux/err.h>
|
#include <linux/err.h>
|
||||||
|
#include <linux/device.h>
|
||||||
|
#include <linux/string.h>
|
||||||
|
|
||||||
struct module;
|
struct module;
|
||||||
|
|
||||||
|
@ -24,8 +24,6 @@
|
|||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
#define ARRAY_AND_SIZE(x) (x), ARRAY_SIZE(x)
|
|
||||||
|
|
||||||
static unsigned long ttc_dkb_pin_config[] __initdata = {
|
static unsigned long ttc_dkb_pin_config[] __initdata = {
|
||||||
/* UART2 */
|
/* UART2 */
|
||||||
GPIO47_UART2_RXD,
|
GPIO47_UART2_RXD,
|
||||||
|
@ -58,21 +58,6 @@ static unsigned int mxt_td60_pins[] __initdata = {
|
|||||||
PE9_PF_UART3_RXD,
|
PE9_PF_UART3_RXD,
|
||||||
PE10_PF_UART3_CTS,
|
PE10_PF_UART3_CTS,
|
||||||
PE11_PF_UART3_RTS,
|
PE11_PF_UART3_RTS,
|
||||||
/* UART3 */
|
|
||||||
PB26_AF_UART4_RTS,
|
|
||||||
PB28_AF_UART4_TXD,
|
|
||||||
PB29_AF_UART4_CTS,
|
|
||||||
PB31_AF_UART4_RXD,
|
|
||||||
/* UART4 */
|
|
||||||
PB18_AF_UART5_TXD,
|
|
||||||
PB19_AF_UART5_RXD,
|
|
||||||
PB20_AF_UART5_CTS,
|
|
||||||
PB21_AF_UART5_RTS,
|
|
||||||
/* UART5 */
|
|
||||||
PB10_AF_UART6_TXD,
|
|
||||||
PB12_AF_UART6_CTS,
|
|
||||||
PB11_AF_UART6_RXD,
|
|
||||||
PB13_AF_UART6_RTS,
|
|
||||||
/* FEC */
|
/* FEC */
|
||||||
PD0_AIN_FEC_TXD0,
|
PD0_AIN_FEC_TXD0,
|
||||||
PD1_AIN_FEC_TXD1,
|
PD1_AIN_FEC_TXD1,
|
||||||
@ -261,12 +246,6 @@ static struct imxuart_platform_data uart_pdata[] = {
|
|||||||
.flags = IMXUART_HAVE_RTSCTS,
|
.flags = IMXUART_HAVE_RTSCTS,
|
||||||
}, {
|
}, {
|
||||||
.flags = IMXUART_HAVE_RTSCTS,
|
.flags = IMXUART_HAVE_RTSCTS,
|
||||||
}, {
|
|
||||||
.flags = IMXUART_HAVE_RTSCTS,
|
|
||||||
}, {
|
|
||||||
.flags = IMXUART_HAVE_RTSCTS,
|
|
||||||
}, {
|
|
||||||
.flags = IMXUART_HAVE_RTSCTS,
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -278,9 +257,6 @@ static void __init mxt_td60_board_init(void)
|
|||||||
mxc_register_device(&mxc_uart_device0, &uart_pdata[0]);
|
mxc_register_device(&mxc_uart_device0, &uart_pdata[0]);
|
||||||
mxc_register_device(&mxc_uart_device1, &uart_pdata[1]);
|
mxc_register_device(&mxc_uart_device1, &uart_pdata[1]);
|
||||||
mxc_register_device(&mxc_uart_device2, &uart_pdata[2]);
|
mxc_register_device(&mxc_uart_device2, &uart_pdata[2]);
|
||||||
mxc_register_device(&mxc_uart_device3, &uart_pdata[3]);
|
|
||||||
mxc_register_device(&mxc_uart_device4, &uart_pdata[4]);
|
|
||||||
mxc_register_device(&mxc_uart_device5, &uart_pdata[5]);
|
|
||||||
mxc_register_device(&mxc_nand_device, &mxt_td60_nand_board_info);
|
mxc_register_device(&mxc_nand_device, &mxt_td60_nand_board_info);
|
||||||
|
|
||||||
i2c_register_board_info(0, mxt_td60_i2c_devices,
|
i2c_register_board_info(0, mxt_td60_i2c_devices,
|
||||||
|
@ -173,6 +173,7 @@ DEFINE_CLOCK(pwm4_clk, 0, CCM_CGCR2, 2, get_rate_ipg, NULL);
|
|||||||
DEFINE_CLOCK(kpp_clk, 0, CCM_CGCR1, 28, get_rate_ipg, NULL);
|
DEFINE_CLOCK(kpp_clk, 0, CCM_CGCR1, 28, get_rate_ipg, NULL);
|
||||||
DEFINE_CLOCK(tsc_clk, 0, CCM_CGCR2, 13, get_rate_ipg, NULL);
|
DEFINE_CLOCK(tsc_clk, 0, CCM_CGCR2, 13, get_rate_ipg, NULL);
|
||||||
DEFINE_CLOCK(i2c_clk, 0, CCM_CGCR0, 6, get_rate_i2c, NULL);
|
DEFINE_CLOCK(i2c_clk, 0, CCM_CGCR0, 6, get_rate_i2c, NULL);
|
||||||
|
DEFINE_CLOCK(fec_clk, 0, CCM_CGCR0, 23, get_rate_ipg, NULL);
|
||||||
|
|
||||||
#define _REGISTER_CLOCK(d, n, c) \
|
#define _REGISTER_CLOCK(d, n, c) \
|
||||||
{ \
|
{ \
|
||||||
@ -204,6 +205,7 @@ static struct clk_lookup lookups[] = {
|
|||||||
_REGISTER_CLOCK("imx-i2c.0", NULL, i2c_clk)
|
_REGISTER_CLOCK("imx-i2c.0", NULL, i2c_clk)
|
||||||
_REGISTER_CLOCK("imx-i2c.1", NULL, i2c_clk)
|
_REGISTER_CLOCK("imx-i2c.1", NULL, i2c_clk)
|
||||||
_REGISTER_CLOCK("imx-i2c.2", NULL, i2c_clk)
|
_REGISTER_CLOCK("imx-i2c.2", NULL, i2c_clk)
|
||||||
|
_REGISTER_CLOCK("fec.0", NULL, fec_clk)
|
||||||
};
|
};
|
||||||
|
|
||||||
int __init mx25_clocks_init(unsigned long fref)
|
int __init mx25_clocks_init(unsigned long fref)
|
||||||
|
@ -419,3 +419,22 @@ int __init mxc_register_gpios(void)
|
|||||||
return mxc_gpio_init(imx_gpio_ports, ARRAY_SIZE(imx_gpio_ports));
|
return mxc_gpio_init(imx_gpio_ports, ARRAY_SIZE(imx_gpio_ports));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct resource mx25_fec_resources[] = {
|
||||||
|
{
|
||||||
|
.start = MX25_FEC_BASE_ADDR,
|
||||||
|
.end = MX25_FEC_BASE_ADDR + 0xfff,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = MX25_INT_FEC,
|
||||||
|
.end = MX25_INT_FEC,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
struct platform_device mx25_fec_device = {
|
||||||
|
.name = "fec",
|
||||||
|
.id = 0,
|
||||||
|
.num_resources = ARRAY_SIZE(mx25_fec_resources),
|
||||||
|
.resource = mx25_fec_resources,
|
||||||
|
};
|
||||||
|
@ -17,3 +17,4 @@ extern struct platform_device mxc_keypad_device;
|
|||||||
extern struct platform_device mxc_i2c_device0;
|
extern struct platform_device mxc_i2c_device0;
|
||||||
extern struct platform_device mxc_i2c_device1;
|
extern struct platform_device mxc_i2c_device1;
|
||||||
extern struct platform_device mxc_i2c_device2;
|
extern struct platform_device mxc_i2c_device2;
|
||||||
|
extern struct platform_device mx25_fec_device;
|
||||||
|
@ -18,10 +18,11 @@
|
|||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
#include <linux/delay.h>
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
#include <linux/smsc911x.h>
|
#include <linux/fec.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
|
||||||
#include <mach/hardware.h>
|
#include <mach/hardware.h>
|
||||||
@ -35,16 +36,57 @@
|
|||||||
#include <mach/mx25.h>
|
#include <mach/mx25.h>
|
||||||
#include <mach/mxc_nand.h>
|
#include <mach/mxc_nand.h>
|
||||||
#include "devices.h"
|
#include "devices.h"
|
||||||
#include <mach/iomux-v3.h>
|
#include <mach/iomux.h>
|
||||||
|
|
||||||
static struct imxuart_platform_data uart_pdata = {
|
static struct imxuart_platform_data uart_pdata = {
|
||||||
.flags = IMXUART_HAVE_RTSCTS,
|
.flags = IMXUART_HAVE_RTSCTS,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct pad_desc mx25pdk_pads[] = {
|
||||||
|
MX25_PAD_FEC_MDC__FEC_MDC,
|
||||||
|
MX25_PAD_FEC_MDIO__FEC_MDIO,
|
||||||
|
MX25_PAD_FEC_TDATA0__FEC_TDATA0,
|
||||||
|
MX25_PAD_FEC_TDATA1__FEC_TDATA1,
|
||||||
|
MX25_PAD_FEC_TX_EN__FEC_TX_EN,
|
||||||
|
MX25_PAD_FEC_RDATA0__FEC_RDATA0,
|
||||||
|
MX25_PAD_FEC_RDATA1__FEC_RDATA1,
|
||||||
|
MX25_PAD_FEC_RX_DV__FEC_RX_DV,
|
||||||
|
MX25_PAD_FEC_TX_CLK__FEC_TX_CLK,
|
||||||
|
MX25_PAD_A17__GPIO_2_3, /* FEC_EN, GPIO 35 */
|
||||||
|
MX25_PAD_D12__GPIO_4_8, /* FEC_RESET_B, GPIO 104 */
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct fec_platform_data mx25_fec_pdata = {
|
||||||
|
.phy = PHY_INTERFACE_MODE_RMII,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define FEC_ENABLE_GPIO 35
|
||||||
|
#define FEC_RESET_B_GPIO 104
|
||||||
|
|
||||||
|
static void __init mx25pdk_fec_reset(void)
|
||||||
|
{
|
||||||
|
gpio_request(FEC_ENABLE_GPIO, "FEC PHY enable");
|
||||||
|
gpio_request(FEC_RESET_B_GPIO, "FEC PHY reset");
|
||||||
|
|
||||||
|
gpio_direction_output(FEC_ENABLE_GPIO, 0); /* drop PHY power */
|
||||||
|
gpio_direction_output(FEC_RESET_B_GPIO, 0); /* assert reset */
|
||||||
|
udelay(2);
|
||||||
|
|
||||||
|
/* turn on PHY power and lift reset */
|
||||||
|
gpio_set_value(FEC_ENABLE_GPIO, 1);
|
||||||
|
gpio_set_value(FEC_RESET_B_GPIO, 1);
|
||||||
|
}
|
||||||
|
|
||||||
static void __init mx25pdk_init(void)
|
static void __init mx25pdk_init(void)
|
||||||
{
|
{
|
||||||
|
mxc_iomux_v3_setup_multiple_pads(mx25pdk_pads,
|
||||||
|
ARRAY_SIZE(mx25pdk_pads));
|
||||||
|
|
||||||
mxc_register_device(&mxc_uart_device0, &uart_pdata);
|
mxc_register_device(&mxc_uart_device0, &uart_pdata);
|
||||||
mxc_register_device(&mxc_usbh2, NULL);
|
mxc_register_device(&mxc_usbh2, NULL);
|
||||||
|
|
||||||
|
mx25pdk_fec_reset();
|
||||||
|
mxc_register_device(&mx25_fec_device, &mx25_fec_pdata);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init mx25pdk_timer_init(void)
|
static void __init mx25pdk_timer_init(void)
|
||||||
|
@ -49,6 +49,7 @@ config MACH_PCM037_EET
|
|||||||
config MACH_MX31LITE
|
config MACH_MX31LITE
|
||||||
bool "Support MX31 LITEKIT (LogicPD)"
|
bool "Support MX31 LITEKIT (LogicPD)"
|
||||||
select ARCH_MX31
|
select ARCH_MX31
|
||||||
|
select MXC_ULPI if USB_ULPI
|
||||||
help
|
help
|
||||||
Include support for MX31 LITEKIT platform. This includes specific
|
Include support for MX31 LITEKIT platform. This includes specific
|
||||||
configurations for the board and its peripherals.
|
configurations for the board and its peripherals.
|
||||||
@ -63,7 +64,7 @@ config MACH_MX31_3DS
|
|||||||
config MACH_MX31MOBOARD
|
config MACH_MX31MOBOARD
|
||||||
bool "Support mx31moboard platforms (EPFL Mobots group)"
|
bool "Support mx31moboard platforms (EPFL Mobots group)"
|
||||||
select ARCH_MX31
|
select ARCH_MX31
|
||||||
select MXC_ULPI
|
select MXC_ULPI if USB_ULPI
|
||||||
help
|
help
|
||||||
Include support for mx31moboard platform. This includes specific
|
Include support for mx31moboard platform. This includes specific
|
||||||
configurations for the board and its peripherals.
|
configurations for the board and its peripherals.
|
||||||
|
@ -65,6 +65,11 @@ static struct map_desc mxc_io_desc[] __initdata = {
|
|||||||
.pfn = __phys_to_pfn(AIPS2_BASE_ADDR),
|
.pfn = __phys_to_pfn(AIPS2_BASE_ADDR),
|
||||||
.length = AIPS2_SIZE,
|
.length = AIPS2_SIZE,
|
||||||
.type = MT_DEVICE_NONSHARED
|
.type = MT_DEVICE_NONSHARED
|
||||||
|
}, {
|
||||||
|
.virtual = SPBA0_BASE_ADDR_VIRT,
|
||||||
|
.pfn = __phys_to_pfn(SPBA0_BASE_ADDR),
|
||||||
|
.length = SPBA0_SIZE,
|
||||||
|
.type = MT_DEVICE_NONSHARED
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -494,11 +494,6 @@ static void mxc_init_i2c(void)
|
|||||||
*/
|
*/
|
||||||
static struct map_desc mx31ads_io_desc[] __initdata = {
|
static struct map_desc mx31ads_io_desc[] __initdata = {
|
||||||
{
|
{
|
||||||
.virtual = SPBA0_BASE_ADDR_VIRT,
|
|
||||||
.pfn = __phys_to_pfn(SPBA0_BASE_ADDR),
|
|
||||||
.length = SPBA0_SIZE,
|
|
||||||
.type = MT_DEVICE_NONSHARED
|
|
||||||
}, {
|
|
||||||
.virtual = CS4_BASE_ADDR_VIRT,
|
.virtual = CS4_BASE_ADDR_VIRT,
|
||||||
.pfn = __phys_to_pfn(CS4_BASE_ADDR),
|
.pfn = __phys_to_pfn(CS4_BASE_ADDR),
|
||||||
.length = CS4_SIZE / 2,
|
.length = CS4_SIZE / 2,
|
||||||
|
@ -135,6 +135,7 @@ static struct spi_board_info mc13783_spi_dev __initdata = {
|
|||||||
* USB
|
* USB
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#if defined(CONFIG_USB_ULPI)
|
||||||
#define USB_PAD_CFG (PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST | PAD_CTL_HYS_CMOS | \
|
#define USB_PAD_CFG (PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST | PAD_CTL_HYS_CMOS | \
|
||||||
PAD_CTL_ODE_CMOS | PAD_CTL_100K_PU)
|
PAD_CTL_ODE_CMOS | PAD_CTL_100K_PU)
|
||||||
|
|
||||||
@ -180,6 +181,7 @@ static struct mxc_usbh_platform_data usbh2_pdata = {
|
|||||||
.portsc = MXC_EHCI_MODE_ULPI | MXC_EHCI_UTMI_8BIT,
|
.portsc = MXC_EHCI_MODE_ULPI | MXC_EHCI_UTMI_8BIT,
|
||||||
.flags = MXC_EHCI_POWER_PINS_ENABLED,
|
.flags = MXC_EHCI_POWER_PINS_ENABLED,
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* NOR flash
|
* NOR flash
|
||||||
@ -212,11 +214,6 @@ static struct platform_device physmap_flash_device = {
|
|||||||
*/
|
*/
|
||||||
static struct map_desc mx31lite_io_desc[] __initdata = {
|
static struct map_desc mx31lite_io_desc[] __initdata = {
|
||||||
{
|
{
|
||||||
.virtual = SPBA0_BASE_ADDR_VIRT,
|
|
||||||
.pfn = __phys_to_pfn(SPBA0_BASE_ADDR),
|
|
||||||
.length = SPBA0_SIZE,
|
|
||||||
.type = MT_DEVICE_NONSHARED
|
|
||||||
}, {
|
|
||||||
.virtual = CS4_BASE_ADDR_VIRT,
|
.virtual = CS4_BASE_ADDR_VIRT,
|
||||||
.pfn = __phys_to_pfn(CS4_BASE_ADDR),
|
.pfn = __phys_to_pfn(CS4_BASE_ADDR),
|
||||||
.length = CS4_SIZE,
|
.length = CS4_SIZE,
|
||||||
@ -261,11 +258,13 @@ static void __init mxc_board_init(void)
|
|||||||
mxc_register_device(&mxc_spi_device1, &spi1_pdata);
|
mxc_register_device(&mxc_spi_device1, &spi1_pdata);
|
||||||
spi_register_board_info(&mc13783_spi_dev, 1);
|
spi_register_board_info(&mc13783_spi_dev, 1);
|
||||||
|
|
||||||
|
#if defined(CONFIG_USB_ULPI)
|
||||||
/* USB */
|
/* USB */
|
||||||
usbh2_pdata.otg = otg_ulpi_create(&mxc_ulpi_access_ops,
|
usbh2_pdata.otg = otg_ulpi_create(&mxc_ulpi_access_ops,
|
||||||
USB_OTG_DRV_VBUS | USB_OTG_DRV_VBUS_EXT);
|
USB_OTG_DRV_VBUS | USB_OTG_DRV_VBUS_EXT);
|
||||||
|
|
||||||
mxc_register_device(&mxc_usbh2, &usbh2_pdata);
|
mxc_register_device(&mxc_usbh2, &usbh2_pdata);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* SMSC9117 IRQ pin */
|
/* SMSC9117 IRQ pin */
|
||||||
ret = gpio_request(IOMUX_TO_GPIO(MX31_PIN_SFS6), "sms9117-irq");
|
ret = gpio_request(IOMUX_TO_GPIO(MX31_PIN_SFS6), "sms9117-irq");
|
||||||
|
@ -179,7 +179,7 @@ static int __init devboard_usbh1_init(void)
|
|||||||
|
|
||||||
usbh1_pdata.otg = otg;
|
usbh1_pdata.otg = otg;
|
||||||
|
|
||||||
return mxc_register_device(&mx31_usbh1, &usbh1_pdata);
|
return mxc_register_device(&mxc_usbh1, &usbh1_pdata);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -294,7 +294,7 @@ static int __init marxbot_usbh1_init(void)
|
|||||||
|
|
||||||
usbh1_pdata.otg = otg;
|
usbh1_pdata.otg = otg;
|
||||||
|
|
||||||
return mxc_register_device(&mx31_usbh1, &usbh1_pdata);
|
return mxc_register_device(&mxc_usbh1, &usbh1_pdata);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -346,6 +346,8 @@ static struct fsl_usb2_platform_data usb_pdata = {
|
|||||||
.phy_mode = FSL_USB2_PHY_ULPI,
|
.phy_mode = FSL_USB2_PHY_ULPI,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if defined(CONFIG_USB_ULPI)
|
||||||
|
|
||||||
#define USBH2_EN_B IOMUX_TO_GPIO(MX31_PIN_SCK6)
|
#define USBH2_EN_B IOMUX_TO_GPIO(MX31_PIN_SCK6)
|
||||||
|
|
||||||
static int moboard_usbh2_hw_init(struct platform_device *pdev)
|
static int moboard_usbh2_hw_init(struct platform_device *pdev)
|
||||||
@ -392,8 +394,11 @@ static int __init moboard_usbh2_init(void)
|
|||||||
usbh2_pdata.otg = otg_ulpi_create(&mxc_ulpi_access_ops,
|
usbh2_pdata.otg = otg_ulpi_create(&mxc_ulpi_access_ops,
|
||||||
USB_OTG_DRV_VBUS | USB_OTG_DRV_VBUS_EXT);
|
USB_OTG_DRV_VBUS | USB_OTG_DRV_VBUS_EXT);
|
||||||
|
|
||||||
return mxc_register_device(&mx31_usbh2, &usbh2_pdata);
|
return mxc_register_device(&mxc_usbh2, &usbh2_pdata);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
static inline int moboard_usbh2_init(void) { return 0; }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static struct gpio_led mx31moboard_leds[] = {
|
static struct gpio_led mx31moboard_leds[] = {
|
||||||
|
@ -211,11 +211,6 @@ static int __init mx31pdk_init_expio(void)
|
|||||||
*/
|
*/
|
||||||
static struct map_desc mx31pdk_io_desc[] __initdata = {
|
static struct map_desc mx31pdk_io_desc[] __initdata = {
|
||||||
{
|
{
|
||||||
.virtual = SPBA0_BASE_ADDR_VIRT,
|
|
||||||
.pfn = __phys_to_pfn(SPBA0_BASE_ADDR),
|
|
||||||
.length = SPBA0_SIZE,
|
|
||||||
.type = MT_DEVICE_NONSHARED,
|
|
||||||
}, {
|
|
||||||
.virtual = CS5_BASE_ADDR_VIRT,
|
.virtual = CS5_BASE_ADDR_VIRT,
|
||||||
.pfn = __phys_to_pfn(CS5_BASE_ADDR),
|
.pfn = __phys_to_pfn(CS5_BASE_ADDR),
|
||||||
.length = CS5_SIZE,
|
.length = CS5_SIZE,
|
||||||
|
@ -322,16 +322,25 @@ static int pcm037_camera_power(struct device *dev, int on)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct i2c_board_info pcm037_i2c_2_devices[] = {
|
static struct i2c_board_info pcm037_i2c_camera[] = {
|
||||||
{
|
{
|
||||||
I2C_BOARD_INFO("mt9t031", 0x5d),
|
I2C_BOARD_INFO("mt9t031", 0x5d),
|
||||||
|
}, {
|
||||||
|
I2C_BOARD_INFO("mt9v022", 0x48),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct soc_camera_link iclink = {
|
static struct soc_camera_link iclink_mt9v022 = {
|
||||||
|
.bus_id = 0, /* Must match with the camera ID */
|
||||||
|
.board_info = &pcm037_i2c_camera[1],
|
||||||
|
.i2c_adapter_id = 2,
|
||||||
|
.module_name = "mt9v022",
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct soc_camera_link iclink_mt9t031 = {
|
||||||
.bus_id = 0, /* Must match with the camera ID */
|
.bus_id = 0, /* Must match with the camera ID */
|
||||||
.power = pcm037_camera_power,
|
.power = pcm037_camera_power,
|
||||||
.board_info = &pcm037_i2c_2_devices[0],
|
.board_info = &pcm037_i2c_camera[0],
|
||||||
.i2c_adapter_id = 2,
|
.i2c_adapter_id = 2,
|
||||||
.module_name = "mt9t031",
|
.module_name = "mt9t031",
|
||||||
};
|
};
|
||||||
@ -345,11 +354,19 @@ static struct i2c_board_info pcm037_i2c_devices[] = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device pcm037_camera = {
|
static struct platform_device pcm037_mt9t031 = {
|
||||||
.name = "soc-camera-pdrv",
|
.name = "soc-camera-pdrv",
|
||||||
.id = 0,
|
.id = 0,
|
||||||
.dev = {
|
.dev = {
|
||||||
.platform_data = &iclink,
|
.platform_data = &iclink_mt9t031,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device pcm037_mt9v022 = {
|
||||||
|
.name = "soc-camera-pdrv",
|
||||||
|
.id = 1,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &iclink_mt9v022,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -449,7 +466,8 @@ static int __init pcm037_camera_alloc_dma(const size_t buf_size)
|
|||||||
static struct platform_device *devices[] __initdata = {
|
static struct platform_device *devices[] __initdata = {
|
||||||
&pcm037_flash,
|
&pcm037_flash,
|
||||||
&pcm037_sram_device,
|
&pcm037_sram_device,
|
||||||
&pcm037_camera,
|
&pcm037_mt9t031,
|
||||||
|
&pcm037_mt9v022,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct ipu_platform_data mx3_ipu_data = {
|
static struct ipu_platform_data mx3_ipu_data = {
|
||||||
@ -599,7 +617,7 @@ static void __init mxc_board_init(void)
|
|||||||
if (!ret)
|
if (!ret)
|
||||||
gpio_direction_output(IOMUX_TO_GPIO(MX31_PIN_CSI_D5), 1);
|
gpio_direction_output(IOMUX_TO_GPIO(MX31_PIN_CSI_D5), 1);
|
||||||
else
|
else
|
||||||
iclink.power = NULL;
|
iclink_mt9t031.power = NULL;
|
||||||
|
|
||||||
if (!pcm037_camera_alloc_dma(4 * 1024 * 1024))
|
if (!pcm037_camera_alloc_dma(4 * 1024 * 1024))
|
||||||
mxc_register_device(&mx3_camera, &camera_pdata);
|
mxc_register_device(&mx3_camera, &camera_pdata);
|
||||||
|
@ -599,7 +599,7 @@ static struct clk i2c_ick = {
|
|||||||
static struct omap_clk omap_clks[] = {
|
static struct omap_clk omap_clks[] = {
|
||||||
/* non-ULPD clocks */
|
/* non-ULPD clocks */
|
||||||
CLK(NULL, "ck_ref", &ck_ref, CK_16XX | CK_1510 | CK_310 | CK_7XX),
|
CLK(NULL, "ck_ref", &ck_ref, CK_16XX | CK_1510 | CK_310 | CK_7XX),
|
||||||
CLK(NULL, "ck_dpll1", &ck_dpll1, CK_16XX | CK_1510 | CK_310),
|
CLK(NULL, "ck_dpll1", &ck_dpll1, CK_16XX | CK_1510 | CK_310 | CK_7XX),
|
||||||
/* CK_GEN1 clocks */
|
/* CK_GEN1 clocks */
|
||||||
CLK(NULL, "ck_dpll1out", &ck_dpll1out.clk, CK_16XX),
|
CLK(NULL, "ck_dpll1out", &ck_dpll1out.clk, CK_16XX),
|
||||||
CLK(NULL, "ck_sossi", &sossi_ck, CK_16XX),
|
CLK(NULL, "ck_sossi", &sossi_ck, CK_16XX),
|
||||||
@ -627,7 +627,7 @@ static struct omap_clk omap_clks[] = {
|
|||||||
CLK(NULL, "tc2_ck", &tc2_ck, CK_16XX),
|
CLK(NULL, "tc2_ck", &tc2_ck, CK_16XX),
|
||||||
CLK(NULL, "dma_ck", &dma_ck, CK_16XX | CK_1510 | CK_310),
|
CLK(NULL, "dma_ck", &dma_ck, CK_16XX | CK_1510 | CK_310),
|
||||||
CLK(NULL, "dma_lcdfree_ck", &dma_lcdfree_ck, CK_16XX),
|
CLK(NULL, "dma_lcdfree_ck", &dma_lcdfree_ck, CK_16XX),
|
||||||
CLK(NULL, "api_ck", &api_ck.clk, CK_16XX | CK_1510 | CK_310),
|
CLK(NULL, "api_ck", &api_ck.clk, CK_16XX | CK_1510 | CK_310 | CK_7XX),
|
||||||
CLK(NULL, "lb_ck", &lb_ck.clk, CK_1510 | CK_310),
|
CLK(NULL, "lb_ck", &lb_ck.clk, CK_1510 | CK_310),
|
||||||
CLK(NULL, "rhea1_ck", &rhea1_ck, CK_16XX),
|
CLK(NULL, "rhea1_ck", &rhea1_ck, CK_16XX),
|
||||||
CLK(NULL, "rhea2_ck", &rhea2_ck, CK_16XX),
|
CLK(NULL, "rhea2_ck", &rhea2_ck, CK_16XX),
|
||||||
@ -658,6 +658,10 @@ static struct omap_clk omap_clks[] = {
|
|||||||
CLK("i2c_omap.1", "fck", &i2c_fck, CK_16XX | CK_1510 | CK_310 | CK_7XX),
|
CLK("i2c_omap.1", "fck", &i2c_fck, CK_16XX | CK_1510 | CK_310 | CK_7XX),
|
||||||
CLK("i2c_omap.1", "ick", &i2c_ick, CK_16XX),
|
CLK("i2c_omap.1", "ick", &i2c_ick, CK_16XX),
|
||||||
CLK("i2c_omap.1", "ick", &dummy_ck, CK_1510 | CK_310 | CK_7XX),
|
CLK("i2c_omap.1", "ick", &dummy_ck, CK_1510 | CK_310 | CK_7XX),
|
||||||
|
CLK("omap1_spi100k.1", "fck", &dummy_ck, CK_7XX),
|
||||||
|
CLK("omap1_spi100k.1", "ick", &dummy_ck, CK_7XX),
|
||||||
|
CLK("omap1_spi100k.2", "fck", &dummy_ck, CK_7XX),
|
||||||
|
CLK("omap1_spi100k.2", "ick", &dummy_ck, CK_7XX),
|
||||||
CLK("omap_uwire", "fck", &armxor_ck.clk, CK_16XX | CK_1510 | CK_310),
|
CLK("omap_uwire", "fck", &armxor_ck.clk, CK_16XX | CK_1510 | CK_310),
|
||||||
CLK("omap-mcbsp.1", "ick", &dspper_ck, CK_16XX),
|
CLK("omap-mcbsp.1", "ick", &dspper_ck, CK_16XX),
|
||||||
CLK("omap-mcbsp.1", "ick", &dummy_ck, CK_1510 | CK_310),
|
CLK("omap-mcbsp.1", "ick", &dummy_ck, CK_1510 | CK_310),
|
||||||
@ -674,7 +678,7 @@ static struct omap_clk omap_clks[] = {
|
|||||||
* init
|
* init
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static struct clk_functions omap1_clk_functions __initdata = {
|
static struct clk_functions omap1_clk_functions = {
|
||||||
.clk_enable = omap1_clk_enable,
|
.clk_enable = omap1_clk_enable,
|
||||||
.clk_disable = omap1_clk_disable,
|
.clk_disable = omap1_clk_disable,
|
||||||
.clk_round_rate = omap1_clk_round_rate,
|
.clk_round_rate = omap1_clk_round_rate,
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
#include <linux/spi/spi.h>
|
||||||
|
|
||||||
#include <mach/hardware.h>
|
#include <mach/hardware.h>
|
||||||
#include <asm/mach/map.h>
|
#include <asm/mach/map.h>
|
||||||
@ -23,6 +24,7 @@
|
|||||||
#include <plat/mux.h>
|
#include <plat/mux.h>
|
||||||
#include <mach/gpio.h>
|
#include <mach/gpio.h>
|
||||||
#include <plat/mmc.h>
|
#include <plat/mmc.h>
|
||||||
|
#include <plat/omap7xx.h>
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
|
|
||||||
@ -196,6 +198,38 @@ void __init omap1_init_mmc(struct omap_mmc_platform_data **mmc_data,
|
|||||||
|
|
||||||
/*-------------------------------------------------------------------------*/
|
/*-------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
/* OMAP7xx SPI support */
|
||||||
|
#if defined(CONFIG_SPI_OMAP_100K) || defined(CONFIG_SPI_OMAP_100K_MODULE)
|
||||||
|
|
||||||
|
struct platform_device omap_spi1 = {
|
||||||
|
.name = "omap1_spi100k",
|
||||||
|
.id = 1,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct platform_device omap_spi2 = {
|
||||||
|
.name = "omap1_spi100k",
|
||||||
|
.id = 2,
|
||||||
|
};
|
||||||
|
|
||||||
|
static void omap_init_spi100k(void)
|
||||||
|
{
|
||||||
|
omap_spi1.dev.platform_data = ioremap(OMAP7XX_SPI1_BASE, 0x7ff);
|
||||||
|
if (omap_spi1.dev.platform_data)
|
||||||
|
platform_device_register(&omap_spi1);
|
||||||
|
|
||||||
|
omap_spi2.dev.platform_data = ioremap(OMAP7XX_SPI2_BASE, 0x7ff);
|
||||||
|
if (omap_spi2.dev.platform_data)
|
||||||
|
platform_device_register(&omap_spi2);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
static inline void omap_init_spi100k(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*-------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#if defined(CONFIG_OMAP_STI)
|
#if defined(CONFIG_OMAP_STI)
|
||||||
|
|
||||||
#define OMAP1_STI_BASE 0xfffea000
|
#define OMAP1_STI_BASE 0xfffea000
|
||||||
@ -263,6 +297,7 @@ static int __init omap1_init_devices(void)
|
|||||||
|
|
||||||
omap_init_mbox();
|
omap_init_mbox();
|
||||||
omap_init_rtc();
|
omap_init_rtc();
|
||||||
|
omap_init_spi100k();
|
||||||
omap_init_sti();
|
omap_init_sti();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -62,6 +62,14 @@ MUX_CFG_7XX("MMC_7XX_DAT0", 2, 17, 0, 16, 1, 0)
|
|||||||
/* I2C interface */
|
/* I2C interface */
|
||||||
MUX_CFG_7XX("I2C_7XX_SCL", 5, 1, 0, 0, 1, 0)
|
MUX_CFG_7XX("I2C_7XX_SCL", 5, 1, 0, 0, 1, 0)
|
||||||
MUX_CFG_7XX("I2C_7XX_SDA", 5, 5, 0, 0, 1, 0)
|
MUX_CFG_7XX("I2C_7XX_SDA", 5, 5, 0, 0, 1, 0)
|
||||||
|
|
||||||
|
/* SPI pins */
|
||||||
|
MUX_CFG_7XX("SPI_7XX_1", 6, 5, 4, 4, 1, 0)
|
||||||
|
MUX_CFG_7XX("SPI_7XX_2", 6, 9, 4, 8, 1, 0)
|
||||||
|
MUX_CFG_7XX("SPI_7XX_3", 6, 13, 4, 12, 1, 0)
|
||||||
|
MUX_CFG_7XX("SPI_7XX_4", 6, 17, 4, 16, 1, 0)
|
||||||
|
MUX_CFG_7XX("SPI_7XX_5", 8, 25, 0, 24, 0, 0)
|
||||||
|
MUX_CFG_7XX("SPI_7XX_6", 9, 5, 0, 4, 0, 0)
|
||||||
};
|
};
|
||||||
#define OMAP7XX_PINS_SZ ARRAY_SIZE(omap7xx_pins)
|
#define OMAP7XX_PINS_SZ ARRAY_SIZE(omap7xx_pins)
|
||||||
#else
|
#else
|
||||||
|
@ -80,6 +80,7 @@ config MACH_OVERO
|
|||||||
config MACH_OMAP3EVM
|
config MACH_OMAP3EVM
|
||||||
bool "OMAP 3530 EVM board"
|
bool "OMAP 3530 EVM board"
|
||||||
depends on ARCH_OMAP3 && ARCH_OMAP34XX
|
depends on ARCH_OMAP3 && ARCH_OMAP34XX
|
||||||
|
select OMAP_PACKAGE_CBB
|
||||||
|
|
||||||
config MACH_OMAP3517EVM
|
config MACH_OMAP3517EVM
|
||||||
bool "OMAP3517/ AM3517 EVM board"
|
bool "OMAP3517/ AM3517 EVM board"
|
||||||
|
@ -63,21 +63,21 @@ static int board_keymap[] = {
|
|||||||
KEY(5, 1, KEY_H),
|
KEY(5, 1, KEY_H),
|
||||||
KEY(5, 2, KEY_J),
|
KEY(5, 2, KEY_J),
|
||||||
KEY(5, 3, KEY_F3),
|
KEY(5, 3, KEY_F3),
|
||||||
|
KEY(5, 4, KEY_UNKNOWN),
|
||||||
KEY(5, 5, KEY_VOLUMEDOWN),
|
KEY(5, 5, KEY_VOLUMEDOWN),
|
||||||
KEY(5, 6, KEY_M),
|
KEY(5, 6, KEY_M),
|
||||||
KEY(5, 7, KEY_ENTER),
|
KEY(5, 7, KEY_RIGHT),
|
||||||
KEY(6, 0, KEY_Q),
|
KEY(6, 0, KEY_Q),
|
||||||
KEY(6, 1, KEY_A),
|
KEY(6, 1, KEY_A),
|
||||||
KEY(6, 2, KEY_N),
|
KEY(6, 2, KEY_N),
|
||||||
KEY(6, 3, KEY_BACKSPACE),
|
KEY(6, 3, KEY_BACKSPACE),
|
||||||
KEY(6, 6, KEY_P),
|
KEY(6, 6, KEY_P),
|
||||||
KEY(6, 7, KEY_SELECT),
|
KEY(6, 7, KEY_UP),
|
||||||
KEY(7, 0, KEY_PROG1), /*MACRO 1 <User defined> */
|
KEY(7, 0, KEY_PROG1), /*MACRO 1 <User defined> */
|
||||||
KEY(7, 1, KEY_PROG2), /*MACRO 2 <User defined> */
|
KEY(7, 1, KEY_PROG2), /*MACRO 2 <User defined> */
|
||||||
KEY(7, 2, KEY_PROG3), /*MACRO 3 <User defined> */
|
KEY(7, 2, KEY_PROG3), /*MACRO 3 <User defined> */
|
||||||
KEY(7, 3, KEY_PROG4), /*MACRO 4 <User defined> */
|
KEY(7, 3, KEY_PROG4), /*MACRO 4 <User defined> */
|
||||||
KEY(7, 5, KEY_RIGHT),
|
KEY(7, 6, KEY_SELECT),
|
||||||
KEY(7, 6, KEY_UP),
|
|
||||||
KEY(7, 7, KEY_DOWN)
|
KEY(7, 7, KEY_DOWN)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -449,18 +449,56 @@ int omap2_select_table_rate(struct clk *clk, unsigned long rate)
|
|||||||
#ifdef CONFIG_CPU_FREQ
|
#ifdef CONFIG_CPU_FREQ
|
||||||
/*
|
/*
|
||||||
* Walk PRCM rate table and fillout cpufreq freq_table
|
* Walk PRCM rate table and fillout cpufreq freq_table
|
||||||
|
* XXX This should be replaced by an OPP layer in the near future
|
||||||
*/
|
*/
|
||||||
static struct cpufreq_frequency_table freq_table[ARRAY_SIZE(rate_table)];
|
static struct cpufreq_frequency_table *freq_table;
|
||||||
|
|
||||||
void omap2_clk_init_cpufreq_table(struct cpufreq_frequency_table **table)
|
void omap2_clk_init_cpufreq_table(struct cpufreq_frequency_table **table)
|
||||||
{
|
{
|
||||||
struct prcm_config *prcm;
|
const struct prcm_config *prcm;
|
||||||
|
long sys_ck_rate;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
int tbl_sz = 0;
|
||||||
|
|
||||||
|
sys_ck_rate = clk_get_rate(sclk);
|
||||||
|
|
||||||
for (prcm = rate_table; prcm->mpu_speed; prcm++) {
|
for (prcm = rate_table; prcm->mpu_speed; prcm++) {
|
||||||
if (!(prcm->flags & cpu_mask))
|
if (!(prcm->flags & cpu_mask))
|
||||||
continue;
|
continue;
|
||||||
if (prcm->xtal_speed != sys_ck.rate)
|
if (prcm->xtal_speed != sys_ck_rate)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* don't put bypass rates in table */
|
||||||
|
if (prcm->dpll_speed == prcm->xtal_speed)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
tbl_sz++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* XXX Ensure that we're doing what CPUFreq expects for this error
|
||||||
|
* case and the following one
|
||||||
|
*/
|
||||||
|
if (tbl_sz == 0) {
|
||||||
|
pr_warning("%s: no matching entries in rate_table\n",
|
||||||
|
__func__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Include the CPUFREQ_TABLE_END terminator entry */
|
||||||
|
tbl_sz++;
|
||||||
|
|
||||||
|
freq_table = kzalloc(sizeof(struct cpufreq_frequency_table) * tbl_sz,
|
||||||
|
GFP_ATOMIC);
|
||||||
|
if (!freq_table) {
|
||||||
|
pr_err("%s: could not kzalloc frequency table\n", __func__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (prcm = rate_table; prcm->mpu_speed; prcm++) {
|
||||||
|
if (!(prcm->flags & cpu_mask))
|
||||||
|
continue;
|
||||||
|
if (prcm->xtal_speed != sys_ck_rate)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* don't put bypass rates in table */
|
/* don't put bypass rates in table */
|
||||||
@ -472,17 +510,17 @@ void omap2_clk_init_cpufreq_table(struct cpufreq_frequency_table **table)
|
|||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i == 0) {
|
|
||||||
printk(KERN_WARNING "%s: failed to initialize frequency "
|
|
||||||
"table\n", __func__);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
freq_table[i].index = i;
|
freq_table[i].index = i;
|
||||||
freq_table[i].frequency = CPUFREQ_TABLE_END;
|
freq_table[i].frequency = CPUFREQ_TABLE_END;
|
||||||
|
|
||||||
*table = &freq_table[0];
|
*table = &freq_table[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void omap2_clk_exit_cpufreq_table(struct cpufreq_frequency_table **table)
|
||||||
|
{
|
||||||
|
kfree(freq_table);
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct clk_functions omap2_clk_functions = {
|
struct clk_functions omap2_clk_functions = {
|
||||||
@ -494,6 +532,7 @@ struct clk_functions omap2_clk_functions = {
|
|||||||
.clk_disable_unused = omap2_clk_disable_unused,
|
.clk_disable_unused = omap2_clk_disable_unused,
|
||||||
#ifdef CONFIG_CPU_FREQ
|
#ifdef CONFIG_CPU_FREQ
|
||||||
.clk_init_cpufreq_table = omap2_clk_init_cpufreq_table,
|
.clk_init_cpufreq_table = omap2_clk_init_cpufreq_table,
|
||||||
|
.clk_exit_cpufreq_table = omap2_clk_exit_cpufreq_table,
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -34,7 +34,6 @@
|
|||||||
#include <asm/div64.h>
|
#include <asm/div64.h>
|
||||||
#include <asm/clkdev.h>
|
#include <asm/clkdev.h>
|
||||||
|
|
||||||
#include <plat/sdrc.h>
|
|
||||||
#include "clock.h"
|
#include "clock.h"
|
||||||
#include "clock34xx.h"
|
#include "clock34xx.h"
|
||||||
#include "sdrc.h"
|
#include "sdrc.h"
|
||||||
|
@ -776,6 +776,8 @@ static struct clk dpll4_m5_ck = {
|
|||||||
.clksel_mask = OMAP3430_CLKSEL_CAM_MASK,
|
.clksel_mask = OMAP3430_CLKSEL_CAM_MASK,
|
||||||
.clksel = div16_dpll4_clksel,
|
.clksel = div16_dpll4_clksel,
|
||||||
.clkdm_name = "dpll4_clkdm",
|
.clkdm_name = "dpll4_clkdm",
|
||||||
|
.set_rate = &omap2_clksel_set_rate,
|
||||||
|
.round_rate = &omap2_clksel_round_rate,
|
||||||
.recalc = &omap2_clksel_recalc,
|
.recalc = &omap2_clksel_recalc,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1500,6 +1502,7 @@ static struct clk uart2_fck = {
|
|||||||
.parent = &core_48m_fck,
|
.parent = &core_48m_fck,
|
||||||
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
|
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
|
||||||
.enable_bit = OMAP3430_EN_UART2_SHIFT,
|
.enable_bit = OMAP3430_EN_UART2_SHIFT,
|
||||||
|
.clkdm_name = "core_l4_clkdm",
|
||||||
.recalc = &followparent_recalc,
|
.recalc = &followparent_recalc,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1509,6 +1512,7 @@ static struct clk uart1_fck = {
|
|||||||
.parent = &core_48m_fck,
|
.parent = &core_48m_fck,
|
||||||
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
|
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
|
||||||
.enable_bit = OMAP3430_EN_UART1_SHIFT,
|
.enable_bit = OMAP3430_EN_UART1_SHIFT,
|
||||||
|
.clkdm_name = "core_l4_clkdm",
|
||||||
.recalc = &followparent_recalc,
|
.recalc = &followparent_recalc,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -2745,7 +2749,7 @@ static struct clk mcbsp4_ick = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const struct clksel mcbsp_234_clksel[] = {
|
static const struct clksel mcbsp_234_clksel[] = {
|
||||||
{ .parent = &core_96m_fck, .rates = common_mcbsp_96m_rates },
|
{ .parent = &per_96m_fck, .rates = common_mcbsp_96m_rates },
|
||||||
{ .parent = &mcbsp_clks, .rates = common_mcbsp_mcbsp_rates },
|
{ .parent = &mcbsp_clks, .rates = common_mcbsp_mcbsp_rates },
|
||||||
{ .parent = NULL }
|
{ .parent = NULL }
|
||||||
};
|
};
|
||||||
|
@ -559,7 +559,7 @@ int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk)
|
|||||||
* downstream clocks for debugging purposes?
|
* downstream clocks for debugging purposes?
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!clkdm || !clk)
|
if (!clkdm || !clk || !clkdm->clktrctrl_mask)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (atomic_inc_return(&clkdm->usecount) > 1)
|
if (atomic_inc_return(&clkdm->usecount) > 1)
|
||||||
@ -610,7 +610,7 @@ int omap2_clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk)
|
|||||||
* downstream clocks for debugging purposes?
|
* downstream clocks for debugging purposes?
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!clkdm || !clk)
|
if (!clkdm || !clk || !clkdm->clktrctrl_mask)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
@ -33,7 +33,6 @@
|
|||||||
#include <plat/sdrc.h>
|
#include <plat/sdrc.h>
|
||||||
#include <plat/gpmc.h>
|
#include <plat/gpmc.h>
|
||||||
#include <plat/serial.h>
|
#include <plat/serial.h>
|
||||||
#include <plat/mux.h>
|
|
||||||
#include <plat/vram.h>
|
#include <plat/vram.h>
|
||||||
|
|
||||||
#include "clock.h"
|
#include "clock.h"
|
||||||
@ -73,21 +72,21 @@ static struct map_desc omap24xx_io_desc[] __initdata = {
|
|||||||
#ifdef CONFIG_ARCH_OMAP2420
|
#ifdef CONFIG_ARCH_OMAP2420
|
||||||
static struct map_desc omap242x_io_desc[] __initdata = {
|
static struct map_desc omap242x_io_desc[] __initdata = {
|
||||||
{
|
{
|
||||||
.virtual = DSP_MEM_24XX_VIRT,
|
.virtual = DSP_MEM_2420_VIRT,
|
||||||
.pfn = __phys_to_pfn(DSP_MEM_24XX_PHYS),
|
.pfn = __phys_to_pfn(DSP_MEM_2420_PHYS),
|
||||||
.length = DSP_MEM_24XX_SIZE,
|
.length = DSP_MEM_2420_SIZE,
|
||||||
.type = MT_DEVICE
|
.type = MT_DEVICE
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.virtual = DSP_IPI_24XX_VIRT,
|
.virtual = DSP_IPI_2420_VIRT,
|
||||||
.pfn = __phys_to_pfn(DSP_IPI_24XX_PHYS),
|
.pfn = __phys_to_pfn(DSP_IPI_2420_PHYS),
|
||||||
.length = DSP_IPI_24XX_SIZE,
|
.length = DSP_IPI_2420_SIZE,
|
||||||
.type = MT_DEVICE
|
.type = MT_DEVICE
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.virtual = DSP_MMU_24XX_VIRT,
|
.virtual = DSP_MMU_2420_VIRT,
|
||||||
.pfn = __phys_to_pfn(DSP_MMU_24XX_PHYS),
|
.pfn = __phys_to_pfn(DSP_MMU_2420_PHYS),
|
||||||
.length = DSP_MMU_24XX_SIZE,
|
.length = DSP_MMU_2420_SIZE,
|
||||||
.type = MT_DEVICE
|
.type = MT_DEVICE
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
@ -994,8 +994,10 @@ int __init omap_mux_init(u32 mux_pbase, u32 mux_size,
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_OMAP_MUX
|
#ifdef CONFIG_OMAP_MUX
|
||||||
omap_mux_package_fixup(package_subset, superset);
|
if (package_subset)
|
||||||
omap_mux_package_init_balls(package_balls, superset);
|
omap_mux_package_fixup(package_subset, superset);
|
||||||
|
if (package_balls)
|
||||||
|
omap_mux_package_init_balls(package_balls, superset);
|
||||||
omap_mux_set_cmdline_signals();
|
omap_mux_set_cmdline_signals();
|
||||||
omap_mux_set_board_signals(board_mux);
|
omap_mux_set_board_signals(board_mux);
|
||||||
#endif
|
#endif
|
||||||
|
@ -9,45 +9,47 @@
|
|||||||
* The OMAP2 processor can be run at several discrete 'PRCM configurations'.
|
* The OMAP2 processor can be run at several discrete 'PRCM configurations'.
|
||||||
* These configurations are characterized by voltage and speed for clocks.
|
* These configurations are characterized by voltage and speed for clocks.
|
||||||
* The device is only validated for certain combinations. One way to express
|
* The device is only validated for certain combinations. One way to express
|
||||||
* these combinations is via the 'ratio's' which the clocks operate with
|
* these combinations is via the 'ratios' which the clocks operate with
|
||||||
* respect to each other. These ratio sets are for a given voltage/DPLL
|
* respect to each other. These ratio sets are for a given voltage/DPLL
|
||||||
* setting. All configurations can be described by a DPLL setting and a ratio
|
* setting. All configurations can be described by a DPLL setting and a ratio.
|
||||||
* There are 3 ratio sets for the 2430 and X ratio sets for 2420.
|
|
||||||
*
|
|
||||||
* 2430 differs from 2420 in that there are no more phase synchronizers used.
|
|
||||||
* They both have a slightly different clock domain setup. 2420(iva1,dsp) vs
|
|
||||||
* 2430 (iva2.1, NOdsp, mdm)
|
|
||||||
*
|
*
|
||||||
* XXX Missing voltage data.
|
* XXX Missing voltage data.
|
||||||
|
* XXX Missing 19.2MHz sys_clk rate sets (needed for N800/N810)
|
||||||
*
|
*
|
||||||
* THe format described in this file is deprecated. Once a reasonable
|
* THe format described in this file is deprecated. Once a reasonable
|
||||||
* OPP API exists, the data in this file should be converted to use it.
|
* OPP API exists, the data in this file should be converted to use it.
|
||||||
*
|
*
|
||||||
* This is technically part of the OMAP2xxx clock code.
|
* This is technically part of the OMAP2xxx clock code.
|
||||||
|
*
|
||||||
|
* Considerable work is still needed to fully support dynamic frequency
|
||||||
|
* changes on OMAP2xxx-series chips. Readers interested in such a
|
||||||
|
* project are encouraged to review the Maemo Diablo RX-34 and RX-44
|
||||||
|
* kernel source at:
|
||||||
|
* http://repository.maemo.org/pool/diablo/free/k/kernel-source-diablo/
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "opp2xxx.h"
|
#include "opp2xxx.h"
|
||||||
#include "sdrc.h"
|
#include "sdrc.h"
|
||||||
#include "clock.h"
|
#include "clock.h"
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------
|
/*
|
||||||
* Key dividers which make up a PRCM set. Ratio's for a PRCM are mandated.
|
* Key dividers which make up a PRCM set. Ratios for a PRCM are mandated.
|
||||||
* xtal_speed, dpll_speed, mpu_speed, CM_CLKSEL_MPU,
|
* xtal_speed, dpll_speed, mpu_speed, CM_CLKSEL_MPU,
|
||||||
* CM_CLKSEL_DSP, CM_CLKSEL_GFX, CM_CLKSEL1_CORE, CM_CLKSEL1_PLL,
|
* CM_CLKSEL_DSP, CM_CLKSEL_GFX, CM_CLKSEL1_CORE, CM_CLKSEL1_PLL,
|
||||||
* CM_CLKSEL2_PLL, CM_CLKSEL_MDM
|
* CM_CLKSEL2_PLL, CM_CLKSEL_MDM
|
||||||
*
|
*
|
||||||
* Filling in table based on H4 boards and 2430-SDPs variants available.
|
* Filling in table based on H4 boards available. There are quite a
|
||||||
* There are quite a few more rates combinations which could be defined.
|
* few more rate combinations which could be defined.
|
||||||
*
|
*
|
||||||
* When multiple values are defined the start up will try and choose the
|
* When multiple values are defined the start up will try and choose
|
||||||
* fastest one. If a 'fast' value is defined, then automatically, the /2
|
* the fastest one. If a 'fast' value is defined, then automatically,
|
||||||
* one should be included as it can be used. Generally having more that
|
* the /2 one should be included as it can be used. Generally having
|
||||||
* one fast set does not make sense, as static timings need to be changed
|
* more than one fast set does not make sense, as static timings need
|
||||||
* to change the set. The exception is the bypass setting which is
|
* to be changed to change the set. The exception is the bypass
|
||||||
* availble for low power bypass.
|
* setting which is available for low power bypass.
|
||||||
*
|
*
|
||||||
* Note: This table needs to be sorted, fastest to slowest.
|
* Note: This table needs to be sorted, fastest to slowest.
|
||||||
*-------------------------------------------------------------------------*/
|
**/
|
||||||
const struct prcm_config omap2420_rate_table[] = {
|
const struct prcm_config omap2420_rate_table[] = {
|
||||||
/* PRCM I - FAST */
|
/* PRCM I - FAST */
|
||||||
{S12M, S660M, S330M, RI_CM_CLKSEL_MPU_VAL, /* 330MHz ARM */
|
{S12M, S660M, S330M, RI_CM_CLKSEL_MPU_VAL, /* 330MHz ARM */
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* opp2420_data.c - old-style "OPP" table for OMAP2420
|
* opp2430_data.c - old-style "OPP" table for OMAP2430
|
||||||
*
|
*
|
||||||
* Copyright (C) 2005-2009 Texas Instruments, Inc.
|
* Copyright (C) 2005-2009 Texas Instruments, Inc.
|
||||||
* Copyright (C) 2004-2009 Nokia Corporation
|
* Copyright (C) 2004-2009 Nokia Corporation
|
||||||
@ -9,16 +9,16 @@
|
|||||||
* The OMAP2 processor can be run at several discrete 'PRCM configurations'.
|
* The OMAP2 processor can be run at several discrete 'PRCM configurations'.
|
||||||
* These configurations are characterized by voltage and speed for clocks.
|
* These configurations are characterized by voltage and speed for clocks.
|
||||||
* The device is only validated for certain combinations. One way to express
|
* The device is only validated for certain combinations. One way to express
|
||||||
* these combinations is via the 'ratio's' which the clocks operate with
|
* these combinations is via the 'ratios' which the clocks operate with
|
||||||
* respect to each other. These ratio sets are for a given voltage/DPLL
|
* respect to each other. These ratio sets are for a given voltage/DPLL
|
||||||
* setting. All configurations can be described by a DPLL setting and a ratio
|
* setting. All configurations can be described by a DPLL setting and a ratio.
|
||||||
* There are 3 ratio sets for the 2430 and X ratio sets for 2420.
|
|
||||||
*
|
*
|
||||||
* 2430 differs from 2420 in that there are no more phase synchronizers used.
|
* 2430 differs from 2420 in that there are no more phase synchronizers used.
|
||||||
* They both have a slightly different clock domain setup. 2420(iva1,dsp) vs
|
* They both have a slightly different clock domain setup. 2420(iva1,dsp) vs
|
||||||
* 2430 (iva2.1, NOdsp, mdm)
|
* 2430 (iva2.1, NOdsp, mdm)
|
||||||
*
|
*
|
||||||
* XXX Missing voltage data.
|
* XXX Missing voltage data.
|
||||||
|
* XXX Missing 19.2MHz sys_clk rate sets.
|
||||||
*
|
*
|
||||||
* THe format described in this file is deprecated. Once a reasonable
|
* THe format described in this file is deprecated. Once a reasonable
|
||||||
* OPP API exists, the data in this file should be converted to use it.
|
* OPP API exists, the data in this file should be converted to use it.
|
||||||
@ -30,24 +30,24 @@
|
|||||||
#include "sdrc.h"
|
#include "sdrc.h"
|
||||||
#include "clock.h"
|
#include "clock.h"
|
||||||
|
|
||||||
/*-------------------------------------------------------------------------
|
/*
|
||||||
* Key dividers which make up a PRCM set. Ratio's for a PRCM are mandated.
|
* Key dividers which make up a PRCM set. Ratios for a PRCM are mandated.
|
||||||
* xtal_speed, dpll_speed, mpu_speed, CM_CLKSEL_MPU,
|
* xtal_speed, dpll_speed, mpu_speed, CM_CLKSEL_MPU,
|
||||||
* CM_CLKSEL_DSP, CM_CLKSEL_GFX, CM_CLKSEL1_CORE, CM_CLKSEL1_PLL,
|
* CM_CLKSEL_DSP, CM_CLKSEL_GFX, CM_CLKSEL1_CORE, CM_CLKSEL1_PLL,
|
||||||
* CM_CLKSEL2_PLL, CM_CLKSEL_MDM
|
* CM_CLKSEL2_PLL, CM_CLKSEL_MDM
|
||||||
*
|
*
|
||||||
* Filling in table based on H4 boards and 2430-SDPs variants available.
|
* Filling in table based on 2430-SDPs variants available. There are
|
||||||
* There are quite a few more rates combinations which could be defined.
|
* quite a few more rate combinations which could be defined.
|
||||||
*
|
*
|
||||||
* When multiple values are defined the start up will try and choose the
|
* When multiple values are defined the start up will try and choose
|
||||||
* fastest one. If a 'fast' value is defined, then automatically, the /2
|
* the fastest one. If a 'fast' value is defined, then automatically,
|
||||||
* one should be included as it can be used. Generally having more that
|
* the /2 one should be included as it can be used. Generally having
|
||||||
* one fast set does not make sense, as static timings need to be changed
|
* more than one fast set does not make sense, as static timings need
|
||||||
* to change the set. The exception is the bypass setting which is
|
* to be changed to change the set. The exception is the bypass
|
||||||
* availble for low power bypass.
|
* setting which is available for low power bypass.
|
||||||
*
|
*
|
||||||
* Note: This table needs to be sorted, fastest to slowest.
|
* Note: This table needs to be sorted, fastest to slowest.
|
||||||
*-------------------------------------------------------------------------*/
|
*/
|
||||||
const struct prcm_config omap2430_rate_table[] = {
|
const struct prcm_config omap2430_rate_table[] = {
|
||||||
/* PRCM #4 - ratio2 (ES2.1) - FAST */
|
/* PRCM #4 - ratio2 (ES2.1) - FAST */
|
||||||
{S13M, S798M, S399M, R2_CM_CLKSEL_MPU_VAL, /* 399MHz ARM */
|
{S13M, S798M, S399M, R2_CM_CLKSEL_MPU_VAL, /* 399MHz ARM */
|
||||||
|
@ -124,8 +124,8 @@ static void omap3_core_save_context(void)
|
|||||||
control_padconf_off |= START_PADCONF_SAVE;
|
control_padconf_off |= START_PADCONF_SAVE;
|
||||||
omap_ctrl_writel(control_padconf_off, OMAP343X_CONTROL_PADCONF_OFF);
|
omap_ctrl_writel(control_padconf_off, OMAP343X_CONTROL_PADCONF_OFF);
|
||||||
/* wait for the save to complete */
|
/* wait for the save to complete */
|
||||||
while (!omap_ctrl_readl(OMAP343X_CONTROL_GENERAL_PURPOSE_STATUS)
|
while (!(omap_ctrl_readl(OMAP343X_CONTROL_GENERAL_PURPOSE_STATUS)
|
||||||
& PADCONF_SAVE_DONE)
|
& PADCONF_SAVE_DONE))
|
||||||
;
|
;
|
||||||
/* Save the Interrupt controller context */
|
/* Save the Interrupt controller context */
|
||||||
omap_intc_save_context();
|
omap_intc_save_context();
|
||||||
|
@ -125,6 +125,13 @@ static struct plat_serial8250_port serial_platform_data3[] = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
static inline unsigned int __serial_read_reg(struct uart_port *up,
|
||||||
|
int offset)
|
||||||
|
{
|
||||||
|
offset <<= up->regshift;
|
||||||
|
return (unsigned int)__raw_readb(up->membase + offset);
|
||||||
|
}
|
||||||
|
|
||||||
static inline unsigned int serial_read_reg(struct plat_serial8250_port *up,
|
static inline unsigned int serial_read_reg(struct plat_serial8250_port *up,
|
||||||
int offset)
|
int offset)
|
||||||
{
|
{
|
||||||
@ -583,11 +590,12 @@ static unsigned int serial_in_override(struct uart_port *up, int offset)
|
|||||||
{
|
{
|
||||||
if (UART_RX == offset) {
|
if (UART_RX == offset) {
|
||||||
unsigned int lsr;
|
unsigned int lsr;
|
||||||
lsr = serial_read_reg(omap_uart[up->line].p, UART_LSR);
|
lsr = __serial_read_reg(up, UART_LSR);
|
||||||
if (!(lsr & UART_LSR_DR))
|
if (!(lsr & UART_LSR_DR))
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
}
|
}
|
||||||
return serial_read_reg(omap_uart[up->line].p, offset);
|
|
||||||
|
return __serial_read_reg(up, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init omap_serial_early_init(void)
|
void __init omap_serial_early_init(void)
|
||||||
|
@ -37,6 +37,8 @@ config MACH_ZYLONITE320
|
|||||||
config MACH_LITTLETON
|
config MACH_LITTLETON
|
||||||
bool "PXA3xx Form Factor Platform (aka Littleton)"
|
bool "PXA3xx Form Factor Platform (aka Littleton)"
|
||||||
select PXA3xx
|
select PXA3xx
|
||||||
|
select CPU_PXA300
|
||||||
|
select CPU_PXA310
|
||||||
select PXA_SSP
|
select PXA_SSP
|
||||||
|
|
||||||
config MACH_TAVOREVB
|
config MACH_TAVOREVB
|
||||||
|
@ -250,20 +250,17 @@
|
|||||||
|
|
||||||
#define cpu_is_pxa930() \
|
#define cpu_is_pxa930() \
|
||||||
({ \
|
({ \
|
||||||
unsigned int id = read_cpuid(CPUID_ID); \
|
__cpu_is_pxa930(read_cpuid_id()); \
|
||||||
__cpu_is_pxa930(id); \
|
|
||||||
})
|
})
|
||||||
|
|
||||||
#define cpu_is_pxa935() \
|
#define cpu_is_pxa935() \
|
||||||
({ \
|
({ \
|
||||||
unsigned int id = read_cpuid(CPUID_ID); \
|
__cpu_is_pxa935(read_cpuid_id()); \
|
||||||
__cpu_is_pxa935(id); \
|
|
||||||
})
|
})
|
||||||
|
|
||||||
#define cpu_is_pxa950() \
|
#define cpu_is_pxa950() \
|
||||||
({ \
|
({ \
|
||||||
unsigned int id = read_cpuid(CPUID_ID); \
|
__cpu_is_pxa950(read_cpuid_id()); \
|
||||||
__cpu_is_pxa950(id); \
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
@ -8,13 +8,6 @@
|
|||||||
/* the following variables are processor specific and initialized
|
/* the following variables are processor specific and initialized
|
||||||
* by the corresponding zylonite_pxa3xx_init()
|
* by the corresponding zylonite_pxa3xx_init()
|
||||||
*/
|
*/
|
||||||
struct platform_mmc_slot {
|
|
||||||
int gpio_cd;
|
|
||||||
int gpio_wp;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern struct platform_mmc_slot zylonite_mmc_slot[];
|
|
||||||
|
|
||||||
extern int gpio_eth_irq;
|
extern int gpio_eth_irq;
|
||||||
extern int gpio_debug_led1;
|
extern int gpio_debug_led1;
|
||||||
extern int gpio_debug_led2;
|
extern int gpio_debug_led2;
|
||||||
|
@ -110,6 +110,12 @@ static mfp_cfg_t littleton_mfp_cfg[] __initdata = {
|
|||||||
GPIO7_MMC1_CLK,
|
GPIO7_MMC1_CLK,
|
||||||
GPIO8_MMC1_CMD,
|
GPIO8_MMC1_CMD,
|
||||||
GPIO15_GPIO, /* card detect */
|
GPIO15_GPIO, /* card detect */
|
||||||
|
|
||||||
|
/* UART3 */
|
||||||
|
GPIO107_UART3_CTS,
|
||||||
|
GPIO108_UART3_RTS,
|
||||||
|
GPIO109_UART3_TXD,
|
||||||
|
GPIO110_UART3_RXD,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct resource smc91x_resources[] = {
|
static struct resource smc91x_resources[] = {
|
||||||
|
@ -381,7 +381,7 @@ err:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int magician_backlight_notify(int brightness)
|
static int magician_backlight_notify(struct device *dev, int brightness)
|
||||||
{
|
{
|
||||||
gpio_set_value(EGPIO_MAGICIAN_BL_POWER, brightness);
|
gpio_set_value(EGPIO_MAGICIAN_BL_POWER, brightness);
|
||||||
if (brightness >= 200) {
|
if (brightness >= 200) {
|
||||||
|
@ -270,7 +270,7 @@ err:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int palmld_backlight_notify(int brightness)
|
static int palmld_backlight_notify(struct device *dev, int brightness)
|
||||||
{
|
{
|
||||||
gpio_set_value(GPIO_NR_PALMLD_BL_POWER, brightness);
|
gpio_set_value(GPIO_NR_PALMLD_BL_POWER, brightness);
|
||||||
gpio_set_value(GPIO_NR_PALMLD_LCD_POWER, brightness);
|
gpio_set_value(GPIO_NR_PALMLD_LCD_POWER, brightness);
|
||||||
|
@ -209,7 +209,7 @@ err:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int palmt5_backlight_notify(int brightness)
|
static int palmt5_backlight_notify(struct device *dev, int brightness)
|
||||||
{
|
{
|
||||||
gpio_set_value(GPIO_NR_PALMT5_BL_POWER, brightness);
|
gpio_set_value(GPIO_NR_PALMT5_BL_POWER, brightness);
|
||||||
gpio_set_value(GPIO_NR_PALMT5_LCD_POWER, brightness);
|
gpio_set_value(GPIO_NR_PALMT5_LCD_POWER, brightness);
|
||||||
|
@ -185,7 +185,7 @@ err:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int palmtc_backlight_notify(int brightness)
|
static int palmtc_backlight_notify(struct device *dev, int brightness)
|
||||||
{
|
{
|
||||||
/* backlight is on when GPIO16 AF0 is high */
|
/* backlight is on when GPIO16 AF0 is high */
|
||||||
gpio_set_value(GPIO_NR_PALMTC_BL_POWER, brightness);
|
gpio_set_value(GPIO_NR_PALMTC_BL_POWER, brightness);
|
||||||
|
@ -181,7 +181,7 @@ err:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int palmte2_backlight_notify(int brightness)
|
static int palmte2_backlight_notify(struct device *dev, int brightness)
|
||||||
{
|
{
|
||||||
gpio_set_value(GPIO_NR_PALMTE2_BL_POWER, brightness);
|
gpio_set_value(GPIO_NR_PALMTE2_BL_POWER, brightness);
|
||||||
gpio_set_value(GPIO_NR_PALMTE2_LCD_POWER, brightness);
|
gpio_set_value(GPIO_NR_PALMTE2_LCD_POWER, brightness);
|
||||||
|
@ -375,7 +375,7 @@ err:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int treo_backlight_notify(int brightness)
|
static int treo_backlight_notify(struct device *dev, int brightness)
|
||||||
{
|
{
|
||||||
gpio_set_value(GPIO_NR_TREO_BL_POWER, brightness);
|
gpio_set_value(GPIO_NR_TREO_BL_POWER, brightness);
|
||||||
return TREO_MAX_INTENSITY - brightness;
|
return TREO_MAX_INTENSITY - brightness;
|
||||||
|
@ -269,7 +269,7 @@ err:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int palmtx_backlight_notify(int brightness)
|
static int palmtx_backlight_notify(struct device *dev, int brightness)
|
||||||
{
|
{
|
||||||
gpio_set_value(GPIO_NR_PALMTX_BL_POWER, brightness);
|
gpio_set_value(GPIO_NR_PALMTX_BL_POWER, brightness);
|
||||||
gpio_set_value(GPIO_NR_PALMTX_LCD_POWER, brightness);
|
gpio_set_value(GPIO_NR_PALMTX_LCD_POWER, brightness);
|
||||||
|
@ -196,7 +196,7 @@ err:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int palmz72_backlight_notify(int brightness)
|
static int palmz72_backlight_notify(struct device *dev, int brightness)
|
||||||
{
|
{
|
||||||
gpio_set_value(GPIO_NR_PALMZ72_BL_POWER, brightness);
|
gpio_set_value(GPIO_NR_PALMZ72_BL_POWER, brightness);
|
||||||
gpio_set_value(GPIO_NR_PALMZ72_LCD_POWER, brightness);
|
gpio_set_value(GPIO_NR_PALMZ72_LCD_POWER, brightness);
|
||||||
|
@ -293,7 +293,7 @@ static struct pxamci_platform_data poodle_mci_platform_data = {
|
|||||||
.init = poodle_mci_init,
|
.init = poodle_mci_init,
|
||||||
.setpower = poodle_mci_setpower,
|
.setpower = poodle_mci_setpower,
|
||||||
.exit = poodle_mci_exit,
|
.exit = poodle_mci_exit,
|
||||||
.gpio_card_detect = POODLE_IRQ_GPIO_nSD_DETECT,
|
.gpio_card_detect = POODLE_GPIO_nSD_DETECT,
|
||||||
.gpio_card_ro = POODLE_GPIO_nSD_WP,
|
.gpio_card_ro = POODLE_GPIO_nSD_WP,
|
||||||
.gpio_power = -1,
|
.gpio_power = -1,
|
||||||
};
|
};
|
||||||
|
@ -389,13 +389,13 @@ static struct gpio_keys_button spitz_gpio_keys[] = {
|
|||||||
.type = EV_SW,
|
.type = EV_SW,
|
||||||
.code = 0,
|
.code = 0,
|
||||||
.gpio = SPITZ_GPIO_SWA,
|
.gpio = SPITZ_GPIO_SWA,
|
||||||
.desc = "Display Down",
|
.desc = "Display Down",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.type = EV_SW,
|
.type = EV_SW,
|
||||||
.code = 1,
|
.code = 1,
|
||||||
.gpio = SPITZ_GPIO_SWB,
|
.gpio = SPITZ_GPIO_SWB,
|
||||||
.desc = "Lid Closed",
|
.desc = "Lid Closed",
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -379,7 +379,7 @@ err_request_bckl:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int viper_backlight_notify(int brightness)
|
static int viper_backlight_notify(struct device *dev, int brightness)
|
||||||
{
|
{
|
||||||
gpio_set_value(VIPER_LCD_EN_GPIO, !!brightness);
|
gpio_set_value(VIPER_LCD_EN_GPIO, !!brightness);
|
||||||
gpio_set_value(VIPER_BCKLIGHT_EN_GPIO, !!brightness);
|
gpio_set_value(VIPER_BCKLIGHT_EN_GPIO, !!brightness);
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
#include <linux/mtd/physmap.h>
|
#include <linux/mtd/physmap.h>
|
||||||
#include <linux/i2c.h>
|
#include <linux/i2c.h>
|
||||||
#include <linux/i2c/pca953x.h>
|
#include <linux/i2c/pca953x.h>
|
||||||
|
#include <linux/apm-emulation.h>
|
||||||
|
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/mach/arch.h>
|
#include <asm/mach/arch.h>
|
||||||
@ -626,8 +627,27 @@ static void zeus_power_off(void)
|
|||||||
pxa27x_cpu_suspend(PWRMODE_DEEPSLEEP);
|
pxa27x_cpu_suspend(PWRMODE_DEEPSLEEP);
|
||||||
}
|
}
|
||||||
|
|
||||||
int zeus_get_pcb_info(struct i2c_client *client, unsigned gpio,
|
#ifdef CONFIG_APM_EMULATION
|
||||||
unsigned ngpio, void *context)
|
static void zeus_get_power_status(struct apm_power_info *info)
|
||||||
|
{
|
||||||
|
/* Power supply is always present */
|
||||||
|
info->ac_line_status = APM_AC_ONLINE;
|
||||||
|
info->battery_status = APM_BATTERY_STATUS_NOT_PRESENT;
|
||||||
|
info->battery_flag = APM_BATTERY_FLAG_NOT_PRESENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void zeus_setup_apm(void)
|
||||||
|
{
|
||||||
|
apm_get_power_status = zeus_get_power_status;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline void zeus_setup_apm(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static int zeus_get_pcb_info(struct i2c_client *client, unsigned gpio,
|
||||||
|
unsigned ngpio, void *context)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
u8 pcb_info = 0;
|
u8 pcb_info = 0;
|
||||||
@ -726,9 +746,18 @@ static mfp_cfg_t zeus_pin_config[] __initdata = {
|
|||||||
GPIO99_GPIO, /* CF RDY */
|
GPIO99_GPIO, /* CF RDY */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* DM9k MSCx settings: SRAM, 16 bits
|
||||||
|
* 17 cycles delay first access
|
||||||
|
* 5 cycles delay next access
|
||||||
|
* 13 cycles recovery time
|
||||||
|
* faster device
|
||||||
|
*/
|
||||||
|
#define DM9K_MSC_VALUE 0xe4c9
|
||||||
|
|
||||||
static void __init zeus_init(void)
|
static void __init zeus_init(void)
|
||||||
{
|
{
|
||||||
u16 dm9000_msc = 0xe279;
|
u16 dm9000_msc = DM9K_MSC_VALUE;
|
||||||
|
|
||||||
system_rev = __raw_readw(ZEUS_CPLD_VERSION);
|
system_rev = __raw_readw(ZEUS_CPLD_VERSION);
|
||||||
pr_info("Zeus CPLD V%dI%d\n", (system_rev & 0xf0) >> 4, (system_rev & 0x0f));
|
pr_info("Zeus CPLD V%dI%d\n", (system_rev & 0xf0) >> 4, (system_rev & 0x0f));
|
||||||
@ -738,6 +767,7 @@ static void __init zeus_init(void)
|
|||||||
MSC1 = (MSC1 & 0xffff0000) | dm9000_msc;
|
MSC1 = (MSC1 & 0xffff0000) | dm9000_msc;
|
||||||
|
|
||||||
pm_power_off = zeus_power_off;
|
pm_power_off = zeus_power_off;
|
||||||
|
zeus_setup_apm();
|
||||||
|
|
||||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(zeus_pin_config));
|
pxa2xx_mfp_config(ARRAY_AND_SIZE(zeus_pin_config));
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user