Merge tag 'v2.6.33' for its firewire changes since last branch point

Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
This commit is contained in:
Stefan Richter 2010-02-24 20:31:04 +01:00
commit 109d28152b
1866 changed files with 44588 additions and 18731 deletions

1
.gitignore vendored
View File

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

View File

@ -20,7 +20,7 @@ Description:
lsm: [[subj_user=] [subj_role=] [subj_type=] lsm: [[subj_user=] [subj_role=] [subj_type=]
[obj_user=] [obj_role=] [obj_type=]] [obj_user=] [obj_role=] [obj_type=]]
base: func:= [BPRM_CHECK][FILE_MMAP][INODE_PERMISSION] base: func:= [BPRM_CHECK][FILE_MMAP][FILE_CHECK]
mask:= [MAY_READ] [MAY_WRITE] [MAY_APPEND] [MAY_EXEC] mask:= [MAY_READ] [MAY_WRITE] [MAY_APPEND] [MAY_EXEC]
fsmagic:= hex value fsmagic:= hex value
uid:= decimal value uid:= decimal value
@ -40,11 +40,11 @@ Description:
measure func=BPRM_CHECK measure func=BPRM_CHECK
measure func=FILE_MMAP mask=MAY_EXEC measure func=FILE_MMAP mask=MAY_EXEC
measure func=INODE_PERM mask=MAY_READ uid=0 measure func=FILE_CHECK mask=MAY_READ uid=0
The default policy measures all executables in bprm_check, The default policy measures all executables in bprm_check,
all files mmapped executable in file_mmap, and all files all files mmapped executable in file_mmap, and all files
open for read by root in inode_permission. open for read by root in do_filp_open.
Examples of LSM specific definitions: Examples of LSM specific definitions:
@ -54,8 +54,8 @@ Description:
dont_measure obj_type=var_log_t dont_measure obj_type=var_log_t
dont_measure obj_type=auditd_log_t dont_measure obj_type=auditd_log_t
measure subj_user=system_u func=INODE_PERM mask=MAY_READ measure subj_user=system_u func=FILE_CHECK mask=MAY_READ
measure subj_role=system_r func=INODE_PERM mask=MAY_READ measure subj_role=system_r func=FILE_CHECK mask=MAY_READ
Smack: Smack:
measure subj_user=_ func=INODE_PERM mask=MAY_READ measure subj_user=_ func=FILE_CHECK mask=MAY_READ

View File

@ -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,7 +283,7 @@ 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;
@ -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);

View File

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

View File

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

View File

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

View File

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

View File

@ -145,8 +145,8 @@ show_sampling_rate_max: THIS INTERFACE IS DEPRECATED, DON'T USE IT.
up_threshold: defines what the average CPU usage between the samplings up_threshold: defines what the average CPU usage between the samplings
of 'sampling_rate' needs to be for the kernel to make a decision on of 'sampling_rate' needs to be for the kernel to make a decision on
whether it should increase the frequency. For example when it is set whether it should increase the frequency. For example when it is set
to its default value of '80' it means that between the checking to its default value of '95' it means that between the checking
intervals the CPU needs to be on average more than 80% in use to then intervals the CPU needs to be on average more than 95% in use to then
decide that the CPU frequency needs to be increased. decide that the CPU frequency needs to be increased.
ignore_nice_load: this parameter takes a value of '0' or '1'. When ignore_nice_load: this parameter takes a value of '0' or '1'. When

View File

@ -143,8 +143,8 @@ o provide a way to configure fault attributes
failslab, fail_page_alloc, and fail_make_request use this way. failslab, fail_page_alloc, and fail_make_request use this way.
Helper functions: Helper functions:
init_fault_attr_entries(entries, attr, name); init_fault_attr_dentries(entries, attr, name);
void cleanup_fault_attr_entries(entries); void cleanup_fault_attr_dentries(entries);
- module parameters - module parameters

View File

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

View File

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

View File

@ -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
======= =======

View File

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

View File

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

View File

@ -27,12 +27,30 @@ set of events/packets.
A set of ABS_MT events with the desired properties is defined. The events A set of ABS_MT events with the desired properties is defined. The events
are divided into categories, to allow for partial implementation. The are divided into categories, to allow for partial implementation. The
minimum set consists of ABS_MT_TOUCH_MAJOR, ABS_MT_POSITION_X and minimum set consists of ABS_MT_POSITION_X and ABS_MT_POSITION_Y, which
ABS_MT_POSITION_Y, which allows for multiple fingers to be tracked. If the allows for multiple fingers to be tracked. If the device supports it, the
device supports it, the ABS_MT_WIDTH_MAJOR may be used to provide the size ABS_MT_TOUCH_MAJOR and ABS_MT_WIDTH_MAJOR may be used to provide the size
of the approaching finger. Anisotropy and direction may be specified with of the contact area and approaching finger, respectively.
ABS_MT_TOUCH_MINOR, ABS_MT_WIDTH_MINOR and ABS_MT_ORIENTATION. The
ABS_MT_TOOL_TYPE may be used to specify whether the touching tool is a The TOUCH and WIDTH parameters have a geometrical interpretation; imagine
looking through a window at someone gently holding a finger against the
glass. You will see two regions, one inner region consisting of the part
of the finger actually touching the glass, and one outer region formed by
the perimeter of the finger. The diameter of the inner region is the
ABS_MT_TOUCH_MAJOR, the diameter of the outer region is
ABS_MT_WIDTH_MAJOR. Now imagine the person pressing the finger harder
against the glass. The inner region will increase, and in general, the
ratio ABS_MT_TOUCH_MAJOR / ABS_MT_WIDTH_MAJOR, which is always smaller than
unity, is related to the finger pressure. For pressure-based devices,
ABS_MT_PRESSURE may be used to provide the pressure on the contact area
instead.
In addition to the MAJOR parameters, the oval shape of the finger can be
described by adding the MINOR parameters, such that MAJOR and MINOR are the
major and minor axis of an ellipse. Finally, the orientation of the oval
shape can be describe with the ORIENTATION parameter.
The ABS_MT_TOOL_TYPE may be used to specify whether the touching tool is a
finger or a pen or something else. Devices with more granular information finger or a pen or something else. Devices with more granular information
may specify general shapes as blobs, i.e., as a sequence of rectangular may specify general shapes as blobs, i.e., as a sequence of rectangular
shapes grouped together by an ABS_MT_BLOB_ID. Finally, for the few devices shapes grouped together by an ABS_MT_BLOB_ID. Finally, for the few devices
@ -42,11 +60,9 @@ report finger tracking from hardware [5].
Here is what a minimal event sequence for a two-finger touch would look Here is what a minimal event sequence for a two-finger touch would look
like: like:
ABS_MT_TOUCH_MAJOR
ABS_MT_POSITION_X ABS_MT_POSITION_X
ABS_MT_POSITION_Y ABS_MT_POSITION_Y
SYN_MT_REPORT SYN_MT_REPORT
ABS_MT_TOUCH_MAJOR
ABS_MT_POSITION_X ABS_MT_POSITION_X
ABS_MT_POSITION_Y ABS_MT_POSITION_Y
SYN_MT_REPORT SYN_MT_REPORT
@ -87,6 +103,12 @@ the contact. The ratio ABS_MT_TOUCH_MAJOR / ABS_MT_WIDTH_MAJOR approximates
the notion of pressure. The fingers of the hand and the palm all have the notion of pressure. The fingers of the hand and the palm all have
different characteristic widths [1]. different characteristic widths [1].
ABS_MT_PRESSURE
The pressure, in arbitrary units, on the contact area. May be used instead
of TOUCH and WIDTH for pressure-based devices or any device with a spatial
signal intensity distribution.
ABS_MT_ORIENTATION ABS_MT_ORIENTATION
The orientation of the ellipse. The value should describe a signed quarter The orientation of the ellipse. The value should describe a signed quarter
@ -170,6 +192,16 @@ There are a few devices that support trackingID in hardware. User space can
make use of these native identifiers to reduce bandwidth and cpu usage. make use of these native identifiers to reduce bandwidth and cpu usage.
Gestures
--------
In the specific application of creating gesture events, the TOUCH and WIDTH
parameters can be used to, e.g., approximate finger pressure or distinguish
between index finger and thumb. With the addition of the MINOR parameters,
one can also distinguish between a sweeping finger and a pointing finger,
and with ORIENTATION, one can detect twisting of fingers.
Notes Notes
----- -----

View File

@ -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
@ -198,11 +308,16 @@ Code Seq# Include File Comments
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

View File

@ -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!

View File

@ -199,6 +199,10 @@ and is between 256 and 4096 characters. It is defined in the file
acpi_display_output=video acpi_display_output=video
See above. See above.
acpi_early_pdc_eval [HW,ACPI] Evaluate processor _PDC methods
early. Needed on some platforms to properly
initialize the EC.
acpi_irq_balance [HW,ACPI] acpi_irq_balance [HW,ACPI]
ACPI will balance active IRQs ACPI will balance active IRQs
default in APIC mode default in APIC mode
@ -240,7 +244,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 +257,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
@ -308,6 +315,11 @@ and is between 256 and 4096 characters. It is defined in the file
aic79xx= [HW,SCSI] aic79xx= [HW,SCSI]
See Documentation/scsi/aic79xx.txt. See Documentation/scsi/aic79xx.txt.
alignment= [KNL,ARM]
Allow the default userspace alignment fault handler
behaviour to be specified. Bit 0 enables warnings,
bit 1 enables fixups, and bit 2 sends a segfault.
amd_iommu= [HW,X86-84] amd_iommu= [HW,X86-84]
Pass parameters to the AMD IOMMU driver in the system. Pass parameters to the AMD IOMMU driver in the system.
Possible values are: Possible values are:

View File

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

View File

@ -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,

View File

@ -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
@ -78,6 +78,8 @@ 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
limited than that provide by more modern network interface cards. Although limited than that provide by more modern network interface cards. Although
@ -114,6 +116,8 @@ 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

View File

@ -1074,10 +1074,10 @@ regen_max_retry - INTEGER
Default: 5 Default: 5
max_addresses - INTEGER max_addresses - INTEGER
Number of maximum addresses per interface. 0 disables limitation. Maximum number of autoconfigured addresses per interface. Setting
It is recommended not set too large value (or 0) because it would to zero disables the limitation. It is not recommended to set this
be too easy way to crash kernel to allow to create too much of value too large (or to zero) because it would be an easy way to
autoconfigured addresses. crash the kernel by allowing too many addresses to be created.
Default: 16 Default: 16
disable_ipv6 - BOOLEAN disable_ipv6 - BOOLEAN

View File

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

View File

@ -1,5 +1,6 @@
function tracer guts function tracer guts
==================== ====================
By Mike Frysinger
Introduction Introduction
------------ ------------
@ -53,14 +54,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 +132,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 +145,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:
@ -173,14 +174,16 @@ void ftrace_graph_caller(void)
unsigned long *frompc = &...; unsigned long *frompc = &...;
unsigned long selfpc = <return address> - MCOUNT_INSN_SIZE; unsigned long selfpc = <return address> - MCOUNT_INSN_SIZE;
prepare_ftrace_return(frompc, selfpc); /* passing frame pointer up is optional -- see below */
prepare_ftrace_return(frompc, selfpc, frame_pointer);
/* restore all state needed by the ABI */ /* restore all state needed by the ABI */
} }
#endif #endif
For information on how to implement prepare_ftrace_return(), simply look at For information on how to implement prepare_ftrace_return(), simply look at the
the x86 version. The only architecture-specific piece in it is the setup of x86 version (the frame pointer passing is optional; see the next section for
more information). The only architecture-specific piece in it is the setup of
the fault recovery table (the asm(...) code). The rest should be the same the fault recovery table (the asm(...) code). The rest should be the same
across architectures. across architectures.
@ -205,6 +208,23 @@ void return_to_handler(void)
#endif #endif
HAVE_FUNCTION_GRAPH_FP_TEST
---------------------------
An arch may pass in a unique value (frame pointer) to both the entering and
exiting of a function. On exit, the value is compared and if it does not
match, then it will panic the kernel. This is largely a sanity check for bad
code generation with gcc. If gcc for your port sanely updates the frame
pointer under different opitmization levels, then ignore this option.
However, adding support for it isn't terribly difficult. In your assembly code
that calls prepare_ftrace_return(), pass the frame pointer as the 3rd argument.
Then in the C version of that function, do what the x86 port does and pass it
along to ftrace_push_return_trace() instead of a stub value of 0.
Similarly, when you call ftrace_return_to_handler(), pass it the frame pointer.
HAVE_FTRACE_NMI_ENTER HAVE_FTRACE_NMI_ENTER
--------------------- ---------------------

View File

@ -1625,7 +1625,7 @@ If I am only interested in sys_nanosleep and hrtimer_interrupt:
# echo sys_nanosleep hrtimer_interrupt \ # echo sys_nanosleep hrtimer_interrupt \
> set_ftrace_filter > set_ftrace_filter
# echo ftrace > current_tracer # echo function > current_tracer
# echo 1 > tracing_enabled # echo 1 > tracing_enabled
# usleep 1 # usleep 1
# echo 0 > tracing_enabled # echo 0 > tracing_enabled

View File

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

View File

@ -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
@ -88,7 +88,7 @@ A writer can preempt a reader, but a reader can not 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
@ -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
@ -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
@ -659,7 +659,7 @@ 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 cannot 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
@ -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
@ -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)

View File

@ -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
[ ... ] [ ... ]

View File

@ -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 */

View File

@ -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/
@ -617,10 +616,10 @@ M: Richard Purdie <rpurdie@rpsys.net>
S: Maintained S: Maintained
ARM/CORTINA SYSTEMS GEMINI ARM ARCHITECTURE ARM/CORTINA SYSTEMS GEMINI ARM ARCHITECTURE
M: Paulius Zaleckas <paulius.zaleckas@teltonika.lt> M: Paulius Zaleckas <paulius.zaleckas@gmail.com>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
T: git git://gitorious.org/linux-gemini/mainline.git T: git git://gitorious.org/linux-gemini/mainline.git
S: Maintained S: Odd Fixes
F: arch/arm/mach-gemini/ F: arch/arm/mach-gemini/
ARM/EBSA110 MACHINE SUPPORT ARM/EBSA110 MACHINE SUPPORT
@ -642,9 +641,9 @@ T: topgit git://git.openezx.org/openezx.git
F: arch/arm/mach-pxa/ezx.c F: arch/arm/mach-pxa/ezx.c
ARM/FARADAY FA526 PORT ARM/FARADAY FA526 PORT
M: Paulius Zaleckas <paulius.zaleckas@teltonika.lt> M: Paulius Zaleckas <paulius.zaleckas@gmail.com>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
S: Maintained S: Odd Fixes
F: arch/arm/mm/*-fa* F: arch/arm/mm/*-fa*
ARM/FOOTBRIDGE ARCHITECTURE ARM/FOOTBRIDGE ARCHITECTURE
@ -988,7 +987,6 @@ F: drivers/platform/x86/asus-laptop.c
ASYNCHRONOUS TRANSFERS/TRANSFORMS (IOAT) API ASYNCHRONOUS TRANSFERS/TRANSFORMS (IOAT) API
M: Dan Williams <dan.j.williams@intel.com> M: Dan Williams <dan.j.williams@intel.com>
M: Maciej Sosnowski <maciej.sosnowski@intel.com>
W: http://sourceforge.net/projects/xscaleiop W: http://sourceforge.net/projects/xscaleiop
S: Supported S: Supported
F: Documentation/crypto/async-tx-api.txt F: Documentation/crypto/async-tx-api.txt
@ -1638,9 +1636,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
@ -1736,10 +1733,9 @@ F: include/linux/tfrc.h
F: net/dccp/ F: net/dccp/
DECnet NETWORK LAYER DECnet NETWORK LAYER
M: Christine Caulfield <christine.caulfield@googlemail.com>
W: http://linux-decnet.sourceforge.net W: http://linux-decnet.sourceforge.net
L: linux-decnet-user@lists.sourceforge.net L: linux-decnet-user@lists.sourceforge.net
S: Maintained S: Orphan
F: Documentation/networking/decnet.txt F: Documentation/networking/decnet.txt
F: net/decnet/ F: net/decnet/
@ -1825,7 +1821,6 @@ S: Supported
F: fs/dlm/ F: fs/dlm/
DMA GENERIC OFFLOAD ENGINE SUBSYSTEM DMA GENERIC OFFLOAD ENGINE SUBSYSTEM
M: Maciej Sosnowski <maciej.sosnowski@intel.com>
M: Dan Williams <dan.j.williams@intel.com> M: Dan Williams <dan.j.williams@intel.com>
S: Supported S: Supported
F: drivers/dma/ F: drivers/dma/
@ -2788,7 +2783,7 @@ F: arch/x86/kernel/microcode_core.c
F: arch/x86/kernel/microcode_intel.c F: arch/x86/kernel/microcode_intel.c
INTEL I/OAT DMA DRIVER INTEL I/OAT DMA DRIVER
M: Maciej Sosnowski <maciej.sosnowski@intel.com> M: Dan Williams <dan.j.williams@intel.com>
S: Supported S: Supported
F: drivers/dma/ioat* F: drivers/dma/ioat*
@ -2826,10 +2821,11 @@ L: netdev@vger.kernel.org
S: Maintained S: Maintained
F: drivers/net/ixp2000/ F: drivers/net/ixp2000/
INTEL ETHERNET DRIVERS (e100/e1000/e1000e/igb/ixgb/ixgbe) INTEL ETHERNET DRIVERS (e100/e1000/e1000e/igb/igbvf/ixgb/ixgbe)
M: Jeff Kirsher <jeffrey.t.kirsher@intel.com> M: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
M: Jesse Brandeburg <jesse.brandeburg@intel.com> M: Jesse Brandeburg <jesse.brandeburg@intel.com>
M: Bruce Allan <bruce.w.allan@intel.com> M: Bruce Allan <bruce.w.allan@intel.com>
M: Alex Duyck <alexander.h.duyck@intel.com>
M: PJ Waskiewicz <peter.p.waskiewicz.jr@intel.com> M: PJ Waskiewicz <peter.p.waskiewicz.jr@intel.com>
M: John Ronciak <john.ronciak@intel.com> M: John Ronciak <john.ronciak@intel.com>
L: e1000-devel@lists.sourceforge.net L: e1000-devel@lists.sourceforge.net
@ -2839,6 +2835,7 @@ F: drivers/net/e100.c
F: drivers/net/e1000/ F: drivers/net/e1000/
F: drivers/net/e1000e/ F: drivers/net/e1000e/
F: drivers/net/igb/ F: drivers/net/igb/
F: drivers/net/igbvf/
F: drivers/net/ixgb/ F: drivers/net/ixgb/
F: drivers/net/ixgbe/ F: drivers/net/ixgbe/
@ -3012,8 +3009,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
@ -3413,8 +3410,10 @@ S: Maintained
F: drivers/scsi/sym53c8xx_2/ F: drivers/scsi/sym53c8xx_2/
LTP (Linux Test Project) LTP (Linux Test Project)
M: Subrata Modak <subrata@linux.vnet.ibm.com> M: Rishikesh K Rajak <risrajak@linux.vnet.ibm.com>
M: Garrett Cooper <yanegomi@gmail.com>
M: Mike Frysinger <vapier@gentoo.org> M: Mike Frysinger <vapier@gentoo.org>
M: Subrata Modak <subrata@linux.vnet.ibm.com>
L: ltp-list@lists.sourceforge.net (subscribers-only) L: ltp-list@lists.sourceforge.net (subscribers-only)
W: http://ltp.sourceforge.net/ W: http://ltp.sourceforge.net/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/galak/ltp.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/galak/ltp.git
@ -3490,9 +3489,9 @@ S: Maintained
F: drivers/net/wireless/libertas/ F: drivers/net/wireless/libertas/
MARVELL MV643XX ETHERNET DRIVER MARVELL MV643XX ETHERNET DRIVER
M: Lennert Buytenhek <buytenh@marvell.com> M: Lennert Buytenhek <buytenh@wantstofly.org>
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
S: Supported S: Maintained
F: drivers/net/mv643xx_eth.* F: drivers/net/mv643xx_eth.*
F: include/linux/mv643xx.h F: include/linux/mv643xx.h
@ -3838,6 +3837,7 @@ NETWORKING DRIVERS
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
W: http://www.linuxfoundation.org/en/Net W: http://www.linuxfoundation.org/en/Net
T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6.git
T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6.git
S: Odd Fixes S: Odd Fixes
F: drivers/net/ F: drivers/net/
F: include/linux/if_* F: include/linux/if_*
@ -3873,7 +3873,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
@ -3940,29 +3940,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

View File

@ -1,7 +1,7 @@
VERSION = 2 VERSION = 2
PATCHLEVEL = 6 PATCHLEVEL = 6
SUBLEVEL = 33 SUBLEVEL = 33
EXTRAVERSION = -rc2 EXTRAVERSION =
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.

View File

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

View File

@ -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.
@ -699,6 +702,7 @@ config ARCH_OMAP
select ARCH_HAS_CPUFREQ select ARCH_HAS_CPUFREQ
select GENERIC_TIME select GENERIC_TIME
select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS
select ARCH_HAS_HOLES_MEMORYMODEL
help help
Support for TI's OMAP platform (OMAP1 and OMAP2). Support for TI's OMAP platform (OMAP1 and OMAP2).
@ -726,14 +730,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 +764,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 +793,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 +828,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

View File

@ -94,7 +94,7 @@ CFLAGS_ABI +=-funwind-tables
endif endif
ifeq ($(CONFIG_THUMB2_KERNEL),y) ifeq ($(CONFIG_THUMB2_KERNEL),y)
AFLAGS_AUTOIT :=$(call as-option,-Wa$(comma)-mimplicit-it=thumb,-Wa$(comma)-mauto-it) AFLAGS_AUTOIT :=$(call as-option,-Wa$(comma)-mimplicit-it=always,-Wa$(comma)-mauto-it)
AFLAGS_NOWARN :=$(call as-option,-Wa$(comma)-mno-warn-deprecated,-Wa$(comma)-W) AFLAGS_NOWARN :=$(call as-option,-Wa$(comma)-mno-warn-deprecated,-Wa$(comma)-W)
CFLAGS_THUMB2 :=-mthumb $(AFLAGS_AUTOIT) $(AFLAGS_NOWARN) CFLAGS_THUMB2 :=-mthumb $(AFLAGS_AUTOIT) $(AFLAGS_NOWARN)
AFLAGS_THUMB2 :=$(CFLAGS_THUMB2) -Wa$(comma)-mthumb AFLAGS_THUMB2 :=$(CFLAGS_THUMB2) -Wa$(comma)-mthumb
@ -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.

View File

@ -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=

View File

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

View File

@ -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,
unsigned long free_mem_ptr_end_p,
int arch_id) 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

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

View File

@ -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:

View File

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

View File

@ -42,7 +42,8 @@
#endif #endif
#if defined(CONFIG_CPU_ARM920T) || defined(CONFIG_CPU_ARM922T) || \ #if defined(CONFIG_CPU_ARM920T) || defined(CONFIG_CPU_ARM922T) || \
defined(CONFIG_CPU_ARM925T) || defined(CONFIG_CPU_ARM1020) defined(CONFIG_CPU_ARM925T) || defined(CONFIG_CPU_ARM1020) || \
defined(CONFIG_CPU_ARM1026)
# define MULTI_CACHE 1 # define MULTI_CACHE 1
#endif #endif
@ -154,16 +155,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 +180,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
* =================== * ===================
* *

View File

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

View File

@ -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 */

View File

@ -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]

View File

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

View File

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

View File

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

View File

@ -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]

View File

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

View File

@ -102,6 +102,7 @@ struct cpu_cache_fns cpu_cache;
#endif #endif
#ifdef CONFIG_OUTER_CACHE #ifdef CONFIG_OUTER_CACHE
struct outer_cache_fns outer_cache; struct outer_cache_fns outer_cache;
EXPORT_SYMBOL(outer_cache);
#endif #endif
struct stack { struct stack {

View File

@ -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",

View File

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

View File

@ -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",

View File

@ -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,

View File

@ -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[] = {

View File

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

View File

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

View File

@ -86,7 +86,7 @@ static int gpio_set_irq_type(unsigned int irq, unsigned int type)
unsigned int reg_both, reg_level, reg_type; unsigned int reg_both, reg_level, reg_type;
reg_type = __raw_readl(base + GPIO_INT_TYPE); reg_type = __raw_readl(base + GPIO_INT_TYPE);
reg_level = __raw_readl(base + GPIO_INT_BOTH_EDGE); reg_level = __raw_readl(base + GPIO_INT_LEVEL);
reg_both = __raw_readl(base + GPIO_INT_BOTH_EDGE); reg_both = __raw_readl(base + GPIO_INT_BOTH_EDGE);
switch (type) { switch (type) {
@ -117,7 +117,7 @@ static int gpio_set_irq_type(unsigned int irq, unsigned int type)
} }
__raw_writel(reg_type, base + GPIO_INT_TYPE); __raw_writel(reg_type, base + GPIO_INT_TYPE);
__raw_writel(reg_level, base + GPIO_INT_BOTH_EDGE); __raw_writel(reg_level, base + GPIO_INT_LEVEL);
__raw_writel(reg_both, base + GPIO_INT_BOTH_EDGE); __raw_writel(reg_both, base + GPIO_INT_BOTH_EDGE);
gpio_ack_irq(irq); gpio_ack_irq(irq);

View File

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

View File

@ -13,6 +13,7 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/ata_platform.h> #include <linux/ata_platform.h>
#include <linux/mv643xx_eth.h> #include <linux/mv643xx_eth.h>
#include <linux/gpio.h>
#include <linux/spi/flash.h> #include <linux/spi/flash.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <linux/spi/orion_spi.h> #include <linux/spi/orion_spi.h>
@ -53,6 +54,11 @@ static void __init rd88f6192_init(void)
*/ */
kirkwood_init(); kirkwood_init();
orion_gpio_set_valid(RD88F6192_GPIO_USB_VBUS, 1);
if (gpio_request(RD88F6192_GPIO_USB_VBUS, "USB VBUS") != 0 ||
gpio_direction_output(RD88F6192_GPIO_USB_VBUS, 1) != 0)
pr_err("RD-88F6192-NAS: failed to setup USB VBUS GPIO\n");
kirkwood_ehci_init(); kirkwood_ehci_init();
kirkwood_ge00_init(&rd88f6192_ge00_data); kirkwood_ge00_init(&rd88f6192_ge00_data);
kirkwood_sata_init(&rd88f6192_sata_data); kirkwood_sata_init(&rd88f6192_sata_data);

View File

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

View File

@ -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,

View File

@ -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,

View File

@ -119,6 +119,11 @@ static unsigned long get_rate_nfc(struct clk *clk)
return get_rate_per(8); return get_rate_per(8);
} }
static unsigned long get_rate_gpt(struct clk *clk)
{
return get_rate_per(5);
}
static unsigned long get_rate_otg(struct clk *clk) static unsigned long get_rate_otg(struct clk *clk)
{ {
return 48000000; /* FIXME */ return 48000000; /* FIXME */
@ -144,7 +149,7 @@ static void clk_cgcr_disable(struct clk *clk)
__raw_writel(reg, clk->enable_reg); __raw_writel(reg, clk->enable_reg);
} }
#define DEFINE_CLOCK(name, i, er, es, gr, sr) \ #define DEFINE_CLOCK(name, i, er, es, gr, sr, s) \
static struct clk name = { \ static struct clk name = { \
.id = i, \ .id = i, \
.enable_reg = CRM_BASE + er, \ .enable_reg = CRM_BASE + er, \
@ -153,26 +158,30 @@ static void clk_cgcr_disable(struct clk *clk)
.set_rate = sr, \ .set_rate = sr, \
.enable = clk_cgcr_enable, \ .enable = clk_cgcr_enable, \
.disable = clk_cgcr_disable, \ .disable = clk_cgcr_disable, \
.secondary = s, \
} }
DEFINE_CLOCK(gpt_clk, 0, CCM_CGCR0, 5, get_rate_ipg, NULL); DEFINE_CLOCK(gpt_clk, 0, CCM_CGCR0, 5, get_rate_gpt, NULL, NULL);
DEFINE_CLOCK(cspi1_clk, 0, CCM_CGCR1, 5, get_rate_ipg, NULL); DEFINE_CLOCK(uart_per_clk, 0, CCM_CGCR0, 15, get_rate_uart, NULL, NULL);
DEFINE_CLOCK(cspi2_clk, 0, CCM_CGCR1, 6, get_rate_ipg, NULL); DEFINE_CLOCK(cspi1_clk, 0, CCM_CGCR1, 5, get_rate_ipg, NULL, NULL);
DEFINE_CLOCK(cspi3_clk, 0, CCM_CGCR1, 7, get_rate_ipg, NULL); DEFINE_CLOCK(cspi2_clk, 0, CCM_CGCR1, 6, get_rate_ipg, NULL, NULL);
DEFINE_CLOCK(uart1_clk, 0, CCM_CGCR2, 14, get_rate_uart, NULL); DEFINE_CLOCK(cspi3_clk, 0, CCM_CGCR1, 7, get_rate_ipg, NULL, NULL);
DEFINE_CLOCK(uart2_clk, 0, CCM_CGCR2, 15, get_rate_uart, NULL); DEFINE_CLOCK(fec_ahb_clk, 0, CCM_CGCR0, 23, NULL, NULL, NULL);
DEFINE_CLOCK(uart3_clk, 0, CCM_CGCR2, 16, get_rate_uart, NULL); DEFINE_CLOCK(uart1_clk, 0, CCM_CGCR2, 14, get_rate_uart, NULL, &uart_per_clk);
DEFINE_CLOCK(uart4_clk, 0, CCM_CGCR2, 17, get_rate_uart, NULL); DEFINE_CLOCK(uart2_clk, 0, CCM_CGCR2, 15, get_rate_uart, NULL, &uart_per_clk);
DEFINE_CLOCK(uart5_clk, 0, CCM_CGCR2, 18, get_rate_uart, NULL); DEFINE_CLOCK(uart3_clk, 0, CCM_CGCR2, 16, get_rate_uart, NULL, &uart_per_clk);
DEFINE_CLOCK(nfc_clk, 0, CCM_CGCR0, 8, get_rate_nfc, NULL); DEFINE_CLOCK(uart4_clk, 0, CCM_CGCR2, 17, get_rate_uart, NULL, &uart_per_clk);
DEFINE_CLOCK(usbotg_clk, 0, CCM_CGCR0, 28, get_rate_otg, NULL); DEFINE_CLOCK(uart5_clk, 0, CCM_CGCR2, 18, get_rate_uart, NULL, &uart_per_clk);
DEFINE_CLOCK(pwm1_clk, 0, CCM_CGCR1, 31, get_rate_ipg, NULL); DEFINE_CLOCK(nfc_clk, 0, CCM_CGCR0, 8, get_rate_nfc, NULL, NULL);
DEFINE_CLOCK(pwm2_clk, 0, CCM_CGCR2, 0, get_rate_ipg, NULL); DEFINE_CLOCK(usbotg_clk, 0, CCM_CGCR0, 28, get_rate_otg, NULL, NULL);
DEFINE_CLOCK(pwm3_clk, 0, CCM_CGCR2, 1, get_rate_ipg, NULL); DEFINE_CLOCK(pwm1_clk, 0, CCM_CGCR1, 31, get_rate_ipg, NULL, NULL);
DEFINE_CLOCK(pwm4_clk, 0, CCM_CGCR2, 2, get_rate_ipg, NULL); DEFINE_CLOCK(pwm2_clk, 0, CCM_CGCR2, 0, get_rate_ipg, NULL, NULL);
DEFINE_CLOCK(kpp_clk, 0, CCM_CGCR1, 28, get_rate_ipg, NULL); DEFINE_CLOCK(pwm3_clk, 0, CCM_CGCR2, 1, get_rate_ipg, NULL, NULL);
DEFINE_CLOCK(tsc_clk, 0, CCM_CGCR2, 13, get_rate_ipg, NULL); DEFINE_CLOCK(pwm4_clk, 0, CCM_CGCR2, 2, get_rate_ipg, NULL, NULL);
DEFINE_CLOCK(i2c_clk, 0, CCM_CGCR0, 6, get_rate_i2c, NULL); DEFINE_CLOCK(kpp_clk, 0, CCM_CGCR1, 28, get_rate_ipg, NULL, NULL);
DEFINE_CLOCK(tsc_clk, 0, CCM_CGCR2, 13, get_rate_ipg, NULL, NULL);
DEFINE_CLOCK(i2c_clk, 0, CCM_CGCR0, 6, get_rate_i2c, NULL, NULL);
DEFINE_CLOCK(fec_clk, 0, CCM_CGCR1, 15, get_rate_ipg, NULL, &fec_ahb_clk);
#define _REGISTER_CLOCK(d, n, c) \ #define _REGISTER_CLOCK(d, n, c) \
{ \ { \
@ -204,15 +213,24 @@ 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(void)
{ {
int i; int i;
for (i = 0; i < ARRAY_SIZE(lookups); i++) for (i = 0; i < ARRAY_SIZE(lookups); i++)
clkdev_add(&lookups[i]); clkdev_add(&lookups[i]);
/* Turn off all clocks except the ones we need to survive, namely:
* EMI, GPIO1-3 (CCM_CGCR1[18:16]), GPT1, IOMUXC (CCM_CGCR1[27]), IIM,
* SCC
*/
__raw_writel((1 << 19), CRM_BASE + CCM_CGCR0);
__raw_writel((0xf << 16) | (3 << 26), CRM_BASE + CCM_CGCR1);
__raw_writel((1 << 5), CRM_BASE + CCM_CGCR2);
mxc_timer_init(&gpt_clk, MX25_IO_ADDRESS(MX25_GPT1_BASE_ADDR), 54); mxc_timer_init(&gpt_clk, MX25_IO_ADDRESS(MX25_GPT1_BASE_ADDR), 54);
return 0; return 0;

View File

@ -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,
};

View File

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

View File

@ -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,21 +36,62 @@
#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)
{ {
mx25_clocks_init(26000000); mx25_clocks_init();
} }
static struct sys_timer mx25pdk_timer = { static struct sys_timer mx25pdk_timer = {

View File

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

View File

@ -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
}, },
}; };

View File

@ -173,6 +173,7 @@ static void expio_unmask_irq(u32 irq)
} }
static struct irq_chip expio_irq_chip = { static struct irq_chip expio_irq_chip = {
.name = "EXPIO(CPLD)",
.ack = expio_ack_irq, .ack = expio_ack_irq,
.mask = expio_mask_irq, .mask = expio_mask_irq,
.unmask = expio_unmask_irq, .unmask = expio_unmask_irq,
@ -302,6 +303,7 @@ static struct regulator_init_data ldo1_data = {
.min_uV = 2800000, .min_uV = 2800000,
.max_uV = 2800000, .max_uV = 2800000,
.valid_modes_mask = REGULATOR_MODE_NORMAL, .valid_modes_mask = REGULATOR_MODE_NORMAL,
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
.apply_uV = 1, .apply_uV = 1,
}, },
}; };
@ -322,6 +324,7 @@ static struct regulator_init_data ldo2_data = {
.min_uV = 3300000, .min_uV = 3300000,
.max_uV = 3300000, .max_uV = 3300000,
.valid_modes_mask = REGULATOR_MODE_NORMAL, .valid_modes_mask = REGULATOR_MODE_NORMAL,
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
.apply_uV = 1, .apply_uV = 1,
}, },
.num_consumer_supplies = ARRAY_SIZE(ldo2_consumers), .num_consumer_supplies = ARRAY_SIZE(ldo2_consumers),
@ -459,6 +462,7 @@ static int mx31_wm8350_init(struct wm8350 *wm8350)
static struct wm8350_platform_data __initdata mx31_wm8350_pdata = { static struct wm8350_platform_data __initdata mx31_wm8350_pdata = {
.init = mx31_wm8350_init, .init = mx31_wm8350_init,
.irq_base = MXC_BOARD_IRQ_START + MXC_MAX_EXP_IO_LINES,
}; };
#endif #endif
@ -494,11 +498,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,

View File

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

View File

@ -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);
} }
/* /*

View File

@ -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);
} }
/* /*

View File

@ -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[] = {

View File

@ -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,

View File

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

View File

@ -214,8 +214,8 @@ int omap1_select_table_rate(struct clk *clk, unsigned long rate)
struct mpu_rate * ptr; struct mpu_rate * ptr;
unsigned long dpll1_rate, ref_rate; unsigned long dpll1_rate, ref_rate;
dpll1_rate = clk_get_rate(ck_dpll1_p); dpll1_rate = ck_dpll1_p->rate;
ref_rate = clk_get_rate(ck_ref_p); ref_rate = ck_ref_p->rate;
for (ptr = omap1_rate_table; ptr->rate; ptr++) { for (ptr = omap1_rate_table; ptr->rate; ptr++) {
if (ptr->xtal != ref_rate) if (ptr->xtal != ref_rate)
@ -306,7 +306,7 @@ long omap1_round_to_table_rate(struct clk *clk, unsigned long rate)
long highest_rate; long highest_rate;
unsigned long ref_rate; unsigned long ref_rate;
ref_rate = clk_get_rate(ck_ref_p); ref_rate = ck_ref_p->rate;
highest_rate = -EINVAL; highest_rate = -EINVAL;

View File

@ -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,

View File

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

View File

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

View File

@ -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"

View File

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

View File

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

View File

@ -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"

View File

@ -671,7 +671,6 @@ static struct clk dpll4_m3x2_ck = {
.name = "dpll4_m3x2_ck", .name = "dpll4_m3x2_ck",
.ops = &clkops_omap2_dflt_wait, .ops = &clkops_omap2_dflt_wait,
.parent = &dpll4_m3_ck, .parent = &dpll4_m3_ck,
.init = &omap2_init_clksel_parent,
.enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
.enable_bit = OMAP3430_PWRDN_TV_SHIFT, .enable_bit = OMAP3430_PWRDN_TV_SHIFT,
.flags = INVERT_ENABLE, .flags = INVERT_ENABLE,
@ -776,6 +775,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,
}; };
@ -809,7 +810,6 @@ static struct clk dpll4_m6x2_ck = {
.name = "dpll4_m6x2_ck", .name = "dpll4_m6x2_ck",
.ops = &clkops_omap2_dflt_wait, .ops = &clkops_omap2_dflt_wait,
.parent = &dpll4_m6_ck, .parent = &dpll4_m6_ck,
.init = &omap2_init_clksel_parent,
.enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN), .enable_reg = OMAP_CM_REGADDR(PLL_MOD, CM_CLKEN),
.enable_bit = OMAP3430_PWRDN_EMU_PERIPH_SHIFT, .enable_bit = OMAP3430_PWRDN_EMU_PERIPH_SHIFT,
.flags = INVERT_ENABLE, .flags = INVERT_ENABLE,
@ -1045,7 +1045,6 @@ static struct clk iva2_ck = {
.name = "iva2_ck", .name = "iva2_ck",
.ops = &clkops_omap2_dflt_wait, .ops = &clkops_omap2_dflt_wait,
.parent = &dpll2_m2_ck, .parent = &dpll2_m2_ck,
.init = &omap2_init_clksel_parent,
.enable_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, CM_FCLKEN), .enable_reg = OMAP_CM_REGADDR(OMAP3430_IVA2_MOD, CM_FCLKEN),
.enable_bit = OMAP3430_CM_FCLKEN_IVA2_EN_IVA2_SHIFT, .enable_bit = OMAP3430_CM_FCLKEN_IVA2_EN_IVA2_SHIFT,
.clkdm_name = "iva2_clkdm", .clkdm_name = "iva2_clkdm",
@ -1119,7 +1118,6 @@ static struct clk gfx_l3_ck = {
.name = "gfx_l3_ck", .name = "gfx_l3_ck",
.ops = &clkops_omap2_dflt_wait, .ops = &clkops_omap2_dflt_wait,
.parent = &l3_ick, .parent = &l3_ick,
.init = &omap2_init_clksel_parent,
.enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_ICLKEN), .enable_reg = OMAP_CM_REGADDR(GFX_MOD, CM_ICLKEN),
.enable_bit = OMAP_EN_GFX_SHIFT, .enable_bit = OMAP_EN_GFX_SHIFT,
.recalc = &followparent_recalc, .recalc = &followparent_recalc,
@ -1500,6 +1498,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 +1508,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 +2745,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 }
}; };

View File

@ -346,37 +346,37 @@ static struct clk aess_fclk = {
}; };
static const struct clksel_rate div31_1to31_rates[] = { static const struct clksel_rate div31_1to31_rates[] = {
{ .div = 1, .val = 0, .flags = RATE_IN_4430 }, { .div = 1, .val = 1, .flags = RATE_IN_4430 },
{ .div = 2, .val = 1, .flags = RATE_IN_4430 }, { .div = 2, .val = 2, .flags = RATE_IN_4430 },
{ .div = 3, .val = 2, .flags = RATE_IN_4430 }, { .div = 3, .val = 3, .flags = RATE_IN_4430 },
{ .div = 4, .val = 3, .flags = RATE_IN_4430 }, { .div = 4, .val = 4, .flags = RATE_IN_4430 },
{ .div = 5, .val = 4, .flags = RATE_IN_4430 }, { .div = 5, .val = 5, .flags = RATE_IN_4430 },
{ .div = 6, .val = 5, .flags = RATE_IN_4430 }, { .div = 6, .val = 6, .flags = RATE_IN_4430 },
{ .div = 7, .val = 6, .flags = RATE_IN_4430 }, { .div = 7, .val = 7, .flags = RATE_IN_4430 },
{ .div = 8, .val = 7, .flags = RATE_IN_4430 }, { .div = 8, .val = 8, .flags = RATE_IN_4430 },
{ .div = 9, .val = 8, .flags = RATE_IN_4430 }, { .div = 9, .val = 9, .flags = RATE_IN_4430 },
{ .div = 10, .val = 9, .flags = RATE_IN_4430 }, { .div = 10, .val = 10, .flags = RATE_IN_4430 },
{ .div = 11, .val = 10, .flags = RATE_IN_4430 }, { .div = 11, .val = 11, .flags = RATE_IN_4430 },
{ .div = 12, .val = 11, .flags = RATE_IN_4430 }, { .div = 12, .val = 12, .flags = RATE_IN_4430 },
{ .div = 13, .val = 12, .flags = RATE_IN_4430 }, { .div = 13, .val = 13, .flags = RATE_IN_4430 },
{ .div = 14, .val = 13, .flags = RATE_IN_4430 }, { .div = 14, .val = 14, .flags = RATE_IN_4430 },
{ .div = 15, .val = 14, .flags = RATE_IN_4430 }, { .div = 15, .val = 15, .flags = RATE_IN_4430 },
{ .div = 16, .val = 15, .flags = RATE_IN_4430 }, { .div = 16, .val = 16, .flags = RATE_IN_4430 },
{ .div = 17, .val = 16, .flags = RATE_IN_4430 }, { .div = 17, .val = 17, .flags = RATE_IN_4430 },
{ .div = 18, .val = 17, .flags = RATE_IN_4430 }, { .div = 18, .val = 18, .flags = RATE_IN_4430 },
{ .div = 19, .val = 18, .flags = RATE_IN_4430 }, { .div = 19, .val = 19, .flags = RATE_IN_4430 },
{ .div = 20, .val = 19, .flags = RATE_IN_4430 }, { .div = 20, .val = 20, .flags = RATE_IN_4430 },
{ .div = 21, .val = 20, .flags = RATE_IN_4430 }, { .div = 21, .val = 21, .flags = RATE_IN_4430 },
{ .div = 22, .val = 21, .flags = RATE_IN_4430 }, { .div = 22, .val = 22, .flags = RATE_IN_4430 },
{ .div = 23, .val = 22, .flags = RATE_IN_4430 }, { .div = 23, .val = 23, .flags = RATE_IN_4430 },
{ .div = 24, .val = 23, .flags = RATE_IN_4430 }, { .div = 24, .val = 24, .flags = RATE_IN_4430 },
{ .div = 25, .val = 24, .flags = RATE_IN_4430 }, { .div = 25, .val = 25, .flags = RATE_IN_4430 },
{ .div = 26, .val = 25, .flags = RATE_IN_4430 }, { .div = 26, .val = 26, .flags = RATE_IN_4430 },
{ .div = 27, .val = 26, .flags = RATE_IN_4430 }, { .div = 27, .val = 27, .flags = RATE_IN_4430 },
{ .div = 28, .val = 27, .flags = RATE_IN_4430 }, { .div = 28, .val = 28, .flags = RATE_IN_4430 },
{ .div = 29, .val = 28, .flags = RATE_IN_4430 }, { .div = 29, .val = 29, .flags = RATE_IN_4430 },
{ .div = 30, .val = 29, .flags = RATE_IN_4430 }, { .div = 30, .val = 30, .flags = RATE_IN_4430 },
{ .div = 31, .val = 30, .flags = RATE_IN_4430 }, { .div = 31, .val = 31, .flags = RATE_IN_4430 },
{ .div = 0 }, { .div = 0 },
}; };

View File

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

View File

@ -137,7 +137,7 @@ return_sleep_time:
local_irq_enable(); local_irq_enable();
local_fiq_enable(); local_fiq_enable();
return (u32)timespec_to_ns(&ts_idle)/1000; return ts_idle.tv_nsec / NSEC_PER_USEC + ts_idle.tv_sec * USEC_PER_SEC;
} }
/** /**

View File

@ -505,7 +505,7 @@ static void __init gpmc_mem_init(void)
void __init gpmc_init(void) void __init gpmc_init(void)
{ {
u32 l; u32 l;
char *ck; char *ck = NULL;
if (cpu_is_omap24xx()) { if (cpu_is_omap24xx()) {
ck = "core_l3_ck"; ck = "core_l3_ck";
@ -521,6 +521,9 @@ void __init gpmc_init(void)
l = OMAP44XX_GPMC_BASE; l = OMAP44XX_GPMC_BASE;
} }
if (WARN_ON(!ck))
return;
gpmc_l3_clk = clk_get(NULL, ck); gpmc_l3_clk = clk_get(NULL, ck);
if (IS_ERR(gpmc_l3_clk)) { if (IS_ERR(gpmc_l3_clk)) {
printk(KERN_ERR "Could not get GPMC clock %s\n", ck); printk(KERN_ERR "Could not get GPMC clock %s\n", ck);
@ -534,6 +537,8 @@ void __init gpmc_init(void)
BUG(); BUG();
} }
clk_enable(gpmc_l3_clk);
l = gpmc_read_reg(GPMC_REVISION); l = gpmc_read_reg(GPMC_REVISION);
printk(KERN_INFO "GPMC revision %d.%d\n", (l >> 4) & 0x0f, l & 0x0f); printk(KERN_INFO "GPMC revision %d.%d\n", (l >> 4) & 0x0f, l & 0x0f);
/* Set smart idle mode and automatic L3 clock gating */ /* Set smart idle mode and automatic L3 clock gating */

View File

@ -188,6 +188,8 @@ void __init omap3_check_revision(void)
u16 hawkeye; u16 hawkeye;
u8 rev; u8 rev;
omap_chip.oc = CHIP_IS_OMAP3430;
/* /*
* We cannot access revision registers on ES1.0. * We cannot access revision registers on ES1.0.
* If the processor type is Cortex-A8 and the revision is 0x0 * If the processor type is Cortex-A8 and the revision is 0x0
@ -196,6 +198,7 @@ void __init omap3_check_revision(void)
cpuid = read_cpuid(CPUID_ID); cpuid = read_cpuid(CPUID_ID);
if ((((cpuid >> 4) & 0xfff) == 0xc08) && ((cpuid & 0xf) == 0x0)) { if ((((cpuid >> 4) & 0xfff) == 0xc08) && ((cpuid & 0xf) == 0x0)) {
omap_revision = OMAP3430_REV_ES1_0; omap_revision = OMAP3430_REV_ES1_0;
omap_chip.oc |= CHIP_IS_OMAP3430ES1;
return; return;
} }
@ -216,18 +219,28 @@ void __init omap3_check_revision(void)
case 0: /* Take care of early samples */ case 0: /* Take care of early samples */
case 1: case 1:
omap_revision = OMAP3430_REV_ES2_0; omap_revision = OMAP3430_REV_ES2_0;
omap_chip.oc |= CHIP_IS_OMAP3430ES2;
break; break;
case 2: case 2:
omap_revision = OMAP3430_REV_ES2_1; omap_revision = OMAP3430_REV_ES2_1;
omap_chip.oc |= CHIP_IS_OMAP3430ES2;
break; break;
case 3: case 3:
omap_revision = OMAP3430_REV_ES3_0; omap_revision = OMAP3430_REV_ES3_0;
omap_chip.oc |= CHIP_IS_OMAP3430ES3_0;
break; break;
case 4: case 4:
omap_revision = OMAP3430_REV_ES3_1;
omap_chip.oc |= CHIP_IS_OMAP3430ES3_1;
break;
case 7:
/* FALLTHROUGH */ /* FALLTHROUGH */
default: default:
/* Use the latest known revision as default */ /* Use the latest known revision as default */
omap_revision = OMAP3430_REV_ES3_1; omap_revision = OMAP3430_REV_ES3_1_2;
/* REVISIT: Add CHIP_IS_OMAP3430ES3_1_2? */
omap_chip.oc |= CHIP_IS_OMAP3430ES3_1;
} }
break; break;
case 0xb868: case 0xb868:
@ -235,14 +248,18 @@ void __init omap3_check_revision(void)
* *
* Set the device to be OMAP3505 here. Actual device * Set the device to be OMAP3505 here. Actual device
* is identified later based on the features. * is identified later based on the features.
*
* REVISIT: AM3505/AM3517 should have their own CHIP_IS
*/ */
omap_revision = OMAP3505_REV(rev); omap_revision = OMAP3505_REV(rev);
omap_chip.oc |= CHIP_IS_OMAP3430ES3_1;
break; break;
case 0xb891: case 0xb891:
/* FALLTHROUGH */ /* FALLTHROUGH */
default: default:
/* Unknown default to latest silicon rev as default*/ /* Unknown default to latest silicon rev as default*/
omap_revision = OMAP3630_REV_ES1_0; omap_revision = OMAP3630_REV_ES1_0;
omap_chip.oc |= CHIP_IS_OMAP3630ES1;
} }
} }
@ -360,6 +377,7 @@ void __init omap2_check_revision(void)
omap3_check_revision(); omap3_check_revision();
omap3_check_features(); omap3_check_features();
omap3_cpuinfo(); omap3_cpuinfo();
return;
} else if (cpu_is_omap44xx()) { } else if (cpu_is_omap44xx()) {
omap4_check_revision(); omap4_check_revision();
return; return;
@ -374,27 +392,14 @@ void __init omap2_check_revision(void)
if (cpu_is_omap243x()) { if (cpu_is_omap243x()) {
/* Currently only supports 2430ES2.1 and 2430-all */ /* Currently only supports 2430ES2.1 and 2430-all */
omap_chip.oc |= CHIP_IS_OMAP2430; omap_chip.oc |= CHIP_IS_OMAP2430;
return;
} else if (cpu_is_omap242x()) { } else if (cpu_is_omap242x()) {
/* Currently only supports 2420ES2.1.1 and 2420-all */ /* Currently only supports 2420ES2.1.1 and 2420-all */
omap_chip.oc |= CHIP_IS_OMAP2420; omap_chip.oc |= CHIP_IS_OMAP2420;
} else if (cpu_is_omap3505() || cpu_is_omap3517()) { return;
omap_chip.oc = CHIP_IS_OMAP3430 | CHIP_IS_OMAP3430ES3_1;
} else if (cpu_is_omap343x()) {
omap_chip.oc = CHIP_IS_OMAP3430;
if (omap_rev() == OMAP3430_REV_ES1_0)
omap_chip.oc |= CHIP_IS_OMAP3430ES1;
else if (omap_rev() >= OMAP3430_REV_ES2_0 &&
omap_rev() <= OMAP3430_REV_ES2_1)
omap_chip.oc |= CHIP_IS_OMAP3430ES2;
else if (omap_rev() == OMAP3430_REV_ES3_0)
omap_chip.oc |= CHIP_IS_OMAP3430ES3_0;
else if (omap_rev() == OMAP3430_REV_ES3_1)
omap_chip.oc |= CHIP_IS_OMAP3430ES3_1;
else if (omap_rev() == OMAP3630_REV_ES1_0)
omap_chip.oc |= CHIP_IS_OMAP3630ES1;
} else {
pr_err("Uninitialized omap_chip, please fix!\n");
} }
pr_err("Uninitialized omap_chip, please fix!\n");
} }
/* /*

View File

@ -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
}, },
}; };

View File

@ -194,7 +194,7 @@ void __init omap_init_irq(void)
int i; int i;
for (i = 0; i < ARRAY_SIZE(irq_banks); i++) { for (i = 0; i < ARRAY_SIZE(irq_banks); i++) {
unsigned long base; unsigned long base = 0;
struct omap_irq_bank *bank = irq_banks + i; struct omap_irq_bank *bank = irq_banks + i;
if (cpu_is_omap24xx()) if (cpu_is_omap24xx())
@ -202,6 +202,8 @@ void __init omap_init_irq(void)
else if (cpu_is_omap34xx()) else if (cpu_is_omap34xx())
base = OMAP34XX_IC_BASE; base = OMAP34XX_IC_BASE;
BUG_ON(!base);
/* Static mapping, never released */ /* Static mapping, never released */
bank->base_reg = ioremap(base, SZ_4K); bank->base_reg = ioremap(base, SZ_4K);
if (!bank->base_reg) { if (!bank->base_reg) {
@ -274,4 +276,22 @@ void omap_intc_restore_context(void)
} }
/* MIRs are saved and restore with other PRCM registers */ /* MIRs are saved and restore with other PRCM registers */
} }
void omap3_intc_suspend(void)
{
/* A pending interrupt would prevent OMAP from entering suspend */
omap_ack_irq(0);
}
void omap3_intc_prepare_idle(void)
{
/* Disable autoidle as it can stall interrupt controller */
intc_bank_write_reg(0, &irq_banks[0], INTC_SYSCONFIG);
}
void omap3_intc_resume_idle(void)
{
/* Re-enable autoidle */
intc_bank_write_reg(1, &irq_banks[0], INTC_SYSCONFIG);
}
#endif /* CONFIG_ARCH_OMAP3 */ #endif /* CONFIG_ARCH_OMAP3 */

View File

@ -408,6 +408,7 @@ void __init twl4030_mmc_init(struct twl4030_hsmmc_info *controllers)
{ {
struct twl4030_hsmmc_info *c; struct twl4030_hsmmc_info *c;
int nr_hsmmc = ARRAY_SIZE(hsmmc_data); int nr_hsmmc = ARRAY_SIZE(hsmmc_data);
int i;
if (cpu_is_omap2430()) { if (cpu_is_omap2430()) {
control_pbias_offset = OMAP243X_CONTROL_PBIAS_LITE; control_pbias_offset = OMAP243X_CONTROL_PBIAS_LITE;
@ -434,7 +435,7 @@ void __init twl4030_mmc_init(struct twl4030_hsmmc_info *controllers)
mmc = kzalloc(sizeof(struct omap_mmc_platform_data), GFP_KERNEL); mmc = kzalloc(sizeof(struct omap_mmc_platform_data), GFP_KERNEL);
if (!mmc) { if (!mmc) {
pr_err("Cannot allocate memory for mmc device!\n"); pr_err("Cannot allocate memory for mmc device!\n");
return; goto done;
} }
if (c->name) if (c->name)
@ -532,6 +533,10 @@ void __init twl4030_mmc_init(struct twl4030_hsmmc_info *controllers)
continue; continue;
c->dev = mmc->dev; c->dev = mmc->dev;
} }
done:
for (i = 0; i < nr_hsmmc; i++)
kfree(hsmmc_data[i]);
} }
#endif #endif

View File

@ -51,7 +51,7 @@ struct omap_mux_entry {
static unsigned long mux_phys; static unsigned long mux_phys;
static void __iomem *mux_base; static void __iomem *mux_base;
static inline u16 omap_mux_read(u16 reg) u16 omap_mux_read(u16 reg)
{ {
if (cpu_is_omap24xx()) if (cpu_is_omap24xx())
return __raw_readb(mux_base + reg); return __raw_readb(mux_base + reg);
@ -59,7 +59,7 @@ static inline u16 omap_mux_read(u16 reg)
return __raw_readw(mux_base + reg); return __raw_readw(mux_base + reg);
} }
static inline void omap_mux_write(u16 val, u16 reg) void omap_mux_write(u16 val, u16 reg)
{ {
if (cpu_is_omap24xx()) if (cpu_is_omap24xx())
__raw_writeb(val, mux_base + reg); __raw_writeb(val, mux_base + reg);
@ -67,6 +67,14 @@ static inline void omap_mux_write(u16 val, u16 reg)
__raw_writew(val, mux_base + reg); __raw_writew(val, mux_base + reg);
} }
void omap_mux_write_array(struct omap_board_mux *board_mux)
{
while (board_mux->reg_offset != OMAP_MUX_TERMINATOR) {
omap_mux_write(board_mux->value, board_mux->reg_offset);
board_mux++;
}
}
#if defined(CONFIG_ARCH_OMAP24XX) && defined(CONFIG_OMAP_MUX) #if defined(CONFIG_ARCH_OMAP24XX) && defined(CONFIG_OMAP_MUX)
static struct omap_mux_cfg arch_mux_cfg; static struct omap_mux_cfg arch_mux_cfg;
@ -478,7 +486,7 @@ int __init omap_mux_init_signal(char *muxname, int val)
static inline void omap_mux_decode(struct seq_file *s, u16 val) static inline void omap_mux_decode(struct seq_file *s, u16 val)
{ {
char *flags[OMAP_MUX_MAX_NR_FLAGS]; char *flags[OMAP_MUX_MAX_NR_FLAGS];
char mode[14]; char mode[sizeof("OMAP_MUX_MODE") + 1];
int i = -1; int i = -1;
sprintf(mode, "OMAP_MUX_MODE%d", val & 0x7); sprintf(mode, "OMAP_MUX_MODE%d", val & 0x7);
@ -545,6 +553,7 @@ static int omap_mux_dbg_board_show(struct seq_file *s, void *unused)
if (!m0_name) if (!m0_name)
continue; continue;
/* REVISIT: Needs to be updated if mode0 names get longer */
for (i = 0; i < OMAP_MUX_DEFNAME_LEN; i++) { for (i = 0; i < OMAP_MUX_DEFNAME_LEN; i++) {
if (m0_name[i] == '\0') { if (m0_name[i] == '\0') {
m0_def[i] = m0_name[i]; m0_def[i] = m0_name[i];
@ -833,14 +842,6 @@ static void __init omap_mux_set_cmdline_signals(void)
kfree(options); kfree(options);
} }
static void __init omap_mux_set_board_signals(struct omap_board_mux *board_mux)
{
while (board_mux->reg_offset != OMAP_MUX_TERMINATOR) {
omap_mux_write(board_mux->value, board_mux->reg_offset);
board_mux++;
}
}
static int __init omap_mux_copy_names(struct omap_mux *src, static int __init omap_mux_copy_names(struct omap_mux *src,
struct omap_mux *dst) struct omap_mux *dst)
{ {
@ -960,7 +961,12 @@ static void __init omap_mux_init_list(struct omap_mux *superset)
while (superset->reg_offset != OMAP_MUX_TERMINATOR) { while (superset->reg_offset != OMAP_MUX_TERMINATOR) {
struct omap_mux *entry; struct omap_mux *entry;
#ifndef CONFIG_OMAP_MUX #ifdef CONFIG_OMAP_MUX
if (!superset->muxnames || !superset->muxnames[0]) {
superset++;
continue;
}
#else
/* Skip pins that are not muxed as GPIO by bootloader */ /* Skip pins that are not muxed as GPIO by bootloader */
if (!OMAP_MODE_GPIO(omap_mux_read(superset->reg_offset))) { if (!OMAP_MODE_GPIO(omap_mux_read(superset->reg_offset))) {
superset++; superset++;
@ -994,14 +1000,19 @@ int __init omap_mux_init(u32 mux_pbase, u32 mux_size,
} }
#ifdef CONFIG_OMAP_MUX #ifdef CONFIG_OMAP_MUX
if (package_subset)
omap_mux_package_fixup(package_subset, superset); omap_mux_package_fixup(package_subset, superset);
if (package_balls)
omap_mux_package_init_balls(package_balls, superset); omap_mux_package_init_balls(package_balls, superset);
omap_mux_set_cmdline_signals();
omap_mux_set_board_signals(board_mux);
#endif #endif
omap_mux_init_list(superset); omap_mux_init_list(superset);
#ifdef CONFIG_OMAP_MUX
omap_mux_set_cmdline_signals();
omap_mux_write_array(board_mux);
#endif
return 0; return 0;
} }

View File

@ -146,6 +146,30 @@ u16 omap_mux_get_gpio(int gpio);
*/ */
void omap_mux_set_gpio(u16 val, int gpio); void omap_mux_set_gpio(u16 val, int gpio);
/**
* omap_mux_read() - read mux register
* @mux_offset: Offset of the mux register
*
*/
u16 omap_mux_read(u16 mux_offset);
/**
* omap_mux_write() - write mux register
* @val: New mux register value
* @mux_offset: Offset of the mux register
*
* This should be only needed for dynamic remuxing of non-gpio signals.
*/
void omap_mux_write(u16 val, u16 mux_offset);
/**
* omap_mux_write_array() - write an array of mux registers
* @board_mux: Array of mux registers terminated by MAP_MUX_TERMINATOR
*
* This should be only needed for dynamic remuxing of non-gpio signals.
*/
void omap_mux_write_array(struct omap_board_mux *board_mux);
/** /**
* omap3_mux_init() - initialize mux system with board specific set * omap3_mux_init() - initialize mux system with board specific set
* @board_mux: Board specific mux table * @board_mux: Board specific mux table

View File

@ -649,6 +649,53 @@ static struct omap_mux __initdata omap3_muxmodes[] = {
_OMAP3_MUXENTRY(UART3_TX_IRTX, 166, _OMAP3_MUXENTRY(UART3_TX_IRTX, 166,
"uart3_tx_irtx", NULL, NULL, NULL, "uart3_tx_irtx", NULL, NULL, NULL,
"gpio_166", NULL, NULL, "safe_mode"), "gpio_166", NULL, NULL, "safe_mode"),
/* Only on 3630, see omap36xx_cbp_subset for the signals */
_OMAP3_MUXENTRY(GPMC_A11, 0,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL),
_OMAP3_MUXENTRY(SAD2D_MBUSFLAG, 0,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL),
_OMAP3_MUXENTRY(SAD2D_MREAD, 0,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL),
_OMAP3_MUXENTRY(SAD2D_MWRITE, 0,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL),
_OMAP3_MUXENTRY(SAD2D_SBUSFLAG, 0,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL),
_OMAP3_MUXENTRY(SAD2D_SREAD, 0,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL),
_OMAP3_MUXENTRY(SAD2D_SWRITE, 0,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL),
_OMAP3_MUXENTRY(GPMC_A11, 0,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL),
_OMAP3_MUXENTRY(SAD2D_MCAD28, 0,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL),
_OMAP3_MUXENTRY(SAD2D_MCAD29, 0,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL),
_OMAP3_MUXENTRY(SAD2D_MCAD32, 0,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL),
_OMAP3_MUXENTRY(SAD2D_MCAD33, 0,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL),
_OMAP3_MUXENTRY(SAD2D_MCAD34, 0,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL),
_OMAP3_MUXENTRY(SAD2D_MCAD35, 0,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL),
_OMAP3_MUXENTRY(SAD2D_MCAD36, 0,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL),
{ .reg_offset = OMAP_MUX_TERMINATOR }, { .reg_offset = OMAP_MUX_TERMINATOR },
}; };

View File

@ -94,6 +94,7 @@ static int _update_sysc_cache(struct omap_hwmod *oh)
oh->_sysc_cache = omap_hwmod_readl(oh, oh->sysconfig->sysc_offs); oh->_sysc_cache = omap_hwmod_readl(oh, oh->sysconfig->sysc_offs);
if (!(oh->sysconfig->sysc_flags & SYSC_NO_CACHE))
oh->_int_flags |= _HWMOD_SYSCONFIG_LOADED; oh->_int_flags |= _HWMOD_SYSCONFIG_LOADED;
return 0; return 0;

View File

@ -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 */

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