Merge branch 'master' into for-next

Sync with Linus' tree to be able to apply pending patches that
are based on newer code already present upstream.
This commit is contained in:
Jiri Kosina 2011-07-11 14:15:48 +02:00
commit b7e9c223be
993 changed files with 34561 additions and 5907 deletions

View file

@ -518,7 +518,7 @@ N: Zach Brown
E: zab@zabbo.net E: zab@zabbo.net
D: maestro pci sound D: maestro pci sound
M: David Brownell N: David Brownell
D: Kernel engineer, mentor, and friend. Maintained USB EHCI and D: Kernel engineer, mentor, and friend. Maintained USB EHCI and
D: gadget layers, SPI subsystem, GPIO subsystem, and more than a few D: gadget layers, SPI subsystem, GPIO subsystem, and more than a few
D: device drivers. His encouragement also helped many engineers get D: device drivers. His encouragement also helped many engineers get

View file

@ -0,0 +1,56 @@
What: /sys/class/backlight/<backlight>/<ambient light zone>_max
What: /sys/class/backlight/<backlight>/l1_daylight_max
What: /sys/class/backlight/<backlight>/l2_bright_max
What: /sys/class/backlight/<backlight>/l3_office_max
What: /sys/class/backlight/<backlight>/l4_indoor_max
What: /sys/class/backlight/<backlight>/l5_dark_max
Date: Mai 2011
KernelVersion: 2.6.40
Contact: device-drivers-devel@blackfin.uclinux.org
Description:
Control the maximum brightness for <ambient light zone>
on this <backlight>. Values are between 0 and 127. This file
will also show the brightness level stored for this
<ambient light zone>.
What: /sys/class/backlight/<backlight>/<ambient light zone>_dim
What: /sys/class/backlight/<backlight>/l2_bright_dim
What: /sys/class/backlight/<backlight>/l3_office_dim
What: /sys/class/backlight/<backlight>/l4_indoor_dim
What: /sys/class/backlight/<backlight>/l5_dark_dim
Date: Mai 2011
KernelVersion: 2.6.40
Contact: device-drivers-devel@blackfin.uclinux.org
Description:
Control the dim brightness for <ambient light zone>
on this <backlight>. Values are between 0 and 127, typically
set to 0. Full off when the backlight is disabled.
This file will also show the dim brightness level stored for
this <ambient light zone>.
What: /sys/class/backlight/<backlight>/ambient_light_level
Date: Mai 2011
KernelVersion: 2.6.40
Contact: device-drivers-devel@blackfin.uclinux.org
Description:
Get conversion value of the light sensor.
This value is updated every 80 ms (when the light sensor
is enabled). Returns integer between 0 (dark) and
8000 (max ambient brightness)
What: /sys/class/backlight/<backlight>/ambient_light_zone
Date: Mai 2011
KernelVersion: 2.6.40
Contact: device-drivers-devel@blackfin.uclinux.org
Description:
Get/Set current ambient light zone. Reading returns
integer between 1..5 (1 = daylight, 2 = bright, ..., 5 = dark).
Writing a value between 1..5 forces the backlight controller
to enter the corresponding ambient light zone.
Writing 0 returns to normal/automatic ambient light level
operation. The ambient light sensing feature on these devices
is an extension to the API documented in
Documentation/ABI/stable/sysfs-class-backlight.
It can be enabled by writing the value stored in
/sys/class/backlight/<backlight>/max_brightness to
/sys/class/backlight/<backlight>/brightness.

View file

@ -680,8 +680,8 @@ ones already enabled by DEBUG.
Chapter 14: Allocating memory Chapter 14: Allocating memory
The kernel provides the following general purpose memory allocators: The kernel provides the following general purpose memory allocators:
kmalloc(), kzalloc(), kcalloc(), and vmalloc(). Please refer to the API kmalloc(), kzalloc(), kcalloc(), vmalloc(), and vzalloc(). Please refer to
documentation for further information about them. the API documentation for further information about them.
The preferred form for passing a size of a struct is the following: The preferred form for passing a size of a struct is the following:

View file

@ -21,7 +21,7 @@ information will not be available.
To extract cgroup statistics a utility very similar to getdelays.c To extract cgroup statistics a utility very similar to getdelays.c
has been developed, the sample output of the utility is shown below has been developed, the sample output of the utility is shown below
~/balbir/cgroupstats # ./getdelays -C "/cgroup/a" ~/balbir/cgroupstats # ./getdelays -C "/sys/fs/cgroup/a"
sleeping 1, blocked 0, running 1, stopped 0, uninterruptible 0 sleeping 1, blocked 0, running 1, stopped 0, uninterruptible 0
~/balbir/cgroupstats # ./getdelays -C "/cgroup" ~/balbir/cgroupstats # ./getdelays -C "/sys/fs/cgroup"
sleeping 155, blocked 0, running 1, stopped 0, uninterruptible 2 sleeping 155, blocked 0, running 1, stopped 0, uninterruptible 2

View file

@ -28,16 +28,19 @@ cgroups. Here is what you can do.
- Enable group scheduling in CFQ - Enable group scheduling in CFQ
CONFIG_CFQ_GROUP_IOSCHED=y CONFIG_CFQ_GROUP_IOSCHED=y
- Compile and boot into kernel and mount IO controller (blkio). - Compile and boot into kernel and mount IO controller (blkio); see
cgroups.txt, Why are cgroups needed?.
mount -t cgroup -o blkio none /cgroup mount -t tmpfs cgroup_root /sys/fs/cgroup
mkdir /sys/fs/cgroup/blkio
mount -t cgroup -o blkio none /sys/fs/cgroup/blkio
- Create two cgroups - Create two cgroups
mkdir -p /cgroup/test1/ /cgroup/test2 mkdir -p /sys/fs/cgroup/blkio/test1/ /sys/fs/cgroup/blkio/test2
- Set weights of group test1 and test2 - Set weights of group test1 and test2
echo 1000 > /cgroup/test1/blkio.weight echo 1000 > /sys/fs/cgroup/blkio/test1/blkio.weight
echo 500 > /cgroup/test2/blkio.weight echo 500 > /sys/fs/cgroup/blkio/test2/blkio.weight
- Create two same size files (say 512MB each) on same disk (file1, file2) and - Create two same size files (say 512MB each) on same disk (file1, file2) and
launch two dd threads in different cgroup to read those files. launch two dd threads in different cgroup to read those files.
@ -46,12 +49,12 @@ cgroups. Here is what you can do.
echo 3 > /proc/sys/vm/drop_caches echo 3 > /proc/sys/vm/drop_caches
dd if=/mnt/sdb/zerofile1 of=/dev/null & dd if=/mnt/sdb/zerofile1 of=/dev/null &
echo $! > /cgroup/test1/tasks echo $! > /sys/fs/cgroup/blkio/test1/tasks
cat /cgroup/test1/tasks cat /sys/fs/cgroup/blkio/test1/tasks
dd if=/mnt/sdb/zerofile2 of=/dev/null & dd if=/mnt/sdb/zerofile2 of=/dev/null &
echo $! > /cgroup/test2/tasks echo $! > /sys/fs/cgroup/blkio/test2/tasks
cat /cgroup/test2/tasks cat /sys/fs/cgroup/blkio/test2/tasks
- At macro level, first dd should finish first. To get more precise data, keep - At macro level, first dd should finish first. To get more precise data, keep
on looking at (with the help of script), at blkio.disk_time and on looking at (with the help of script), at blkio.disk_time and
@ -68,13 +71,13 @@ Throttling/Upper Limit policy
- Enable throttling in block layer - Enable throttling in block layer
CONFIG_BLK_DEV_THROTTLING=y CONFIG_BLK_DEV_THROTTLING=y
- Mount blkio controller - Mount blkio controller (see cgroups.txt, Why are cgroups needed?)
mount -t cgroup -o blkio none /cgroup/blkio mount -t cgroup -o blkio none /sys/fs/cgroup/blkio
- Specify a bandwidth rate on particular device for root group. The format - Specify a bandwidth rate on particular device for root group. The format
for policy is "<major>:<minor> <byes_per_second>". for policy is "<major>:<minor> <byes_per_second>".
echo "8:16 1048576" > /cgroup/blkio/blkio.read_bps_device echo "8:16 1048576" > /sys/fs/cgroup/blkio/blkio.throttle.read_bps_device
Above will put a limit of 1MB/second on reads happening for root group Above will put a limit of 1MB/second on reads happening for root group
on device having major/minor number 8:16. on device having major/minor number 8:16.
@ -87,7 +90,7 @@ Throttling/Upper Limit policy
1024+0 records out 1024+0 records out
4194304 bytes (4.2 MB) copied, 4.0001 s, 1.0 MB/s 4194304 bytes (4.2 MB) copied, 4.0001 s, 1.0 MB/s
Limits for writes can be put using blkio.write_bps_device file. Limits for writes can be put using blkio.throttle.write_bps_device file.
Hierarchical Cgroups Hierarchical Cgroups
==================== ====================
@ -108,7 +111,7 @@ Hierarchical Cgroups
CFQ and throttling will practically treat all groups at same level. CFQ and throttling will practically treat all groups at same level.
pivot pivot
/ | \ \ / / \ \
root test1 test2 test3 root test1 test2 test3
Down the line we can implement hierarchical accounting/control support Down the line we can implement hierarchical accounting/control support
@ -149,7 +152,7 @@ Proportional weight policy files
Following is the format. Following is the format.
#echo dev_maj:dev_minor weight > /path/to/cgroup/blkio.weight_device # echo dev_maj:dev_minor weight > blkio.weight_device
Configure weight=300 on /dev/sdb (8:16) in this cgroup Configure weight=300 on /dev/sdb (8:16) in this cgroup
# echo 8:16 300 > blkio.weight_device # echo 8:16 300 > blkio.weight_device
# cat blkio.weight_device # cat blkio.weight_device
@ -283,28 +286,28 @@ Throttling/Upper limit policy files
specified in bytes per second. Rules are per deivce. Following is specified in bytes per second. Rules are per deivce. Following is
the format. the format.
echo "<major>:<minor> <rate_bytes_per_second>" > /cgrp/blkio.read_bps_device echo "<major>:<minor> <rate_bytes_per_second>" > /cgrp/blkio.throttle.read_bps_device
- blkio.throttle.write_bps_device - blkio.throttle.write_bps_device
- Specifies upper limit on WRITE rate to the device. IO rate is - Specifies upper limit on WRITE rate to the device. IO rate is
specified in bytes per second. Rules are per deivce. Following is specified in bytes per second. Rules are per deivce. Following is
the format. the format.
echo "<major>:<minor> <rate_bytes_per_second>" > /cgrp/blkio.write_bps_device echo "<major>:<minor> <rate_bytes_per_second>" > /cgrp/blkio.throttle.write_bps_device
- blkio.throttle.read_iops_device - blkio.throttle.read_iops_device
- Specifies upper limit on READ rate from the device. IO rate is - Specifies upper limit on READ rate from the device. IO rate is
specified in IO per second. Rules are per deivce. Following is specified in IO per second. Rules are per deivce. Following is
the format. the format.
echo "<major>:<minor> <rate_io_per_second>" > /cgrp/blkio.read_iops_device echo "<major>:<minor> <rate_io_per_second>" > /cgrp/blkio.throttle.read_iops_device
- blkio.throttle.write_iops_device - blkio.throttle.write_iops_device
- Specifies upper limit on WRITE rate to the device. IO rate is - Specifies upper limit on WRITE rate to the device. IO rate is
specified in io per second. Rules are per deivce. Following is specified in io per second. Rules are per deivce. Following is
the format. the format.
echo "<major>:<minor> <rate_io_per_second>" > /cgrp/blkio.write_iops_device echo "<major>:<minor> <rate_io_per_second>" > /cgrp/blkio.throttle.write_iops_device
Note: If both BW and IOPS rules are specified for a device, then IO is Note: If both BW and IOPS rules are specified for a device, then IO is
subjectd to both the constraints. subjectd to both the constraints.

View file

@ -138,11 +138,11 @@ With the ability to classify tasks differently for different resources
the admin can easily set up a script which receives exec notifications the admin can easily set up a script which receives exec notifications
and depending on who is launching the browser he can and depending on who is launching the browser he can
# echo browser_pid > /mnt/<restype>/<userclass>/tasks # echo browser_pid > /sys/fs/cgroup/<restype>/<userclass>/tasks
With only a single hierarchy, he now would potentially have to create With only a single hierarchy, he now would potentially have to create
a separate cgroup for every browser launched and associate it with a separate cgroup for every browser launched and associate it with
approp network and other resource class. This may lead to appropriate network and other resource class. This may lead to
proliferation of such cgroups. proliferation of such cgroups.
Also lets say that the administrator would like to give enhanced network Also lets say that the administrator would like to give enhanced network
@ -153,9 +153,9 @@ apps enhanced CPU power,
With ability to write pids directly to resource classes, it's just a With ability to write pids directly to resource classes, it's just a
matter of : matter of :
# echo pid > /mnt/network/<new_class>/tasks # echo pid > /sys/fs/cgroup/network/<new_class>/tasks
(after some time) (after some time)
# echo pid > /mnt/network/<orig_class>/tasks # echo pid > /sys/fs/cgroup/network/<orig_class>/tasks
Without this ability, he would have to split the cgroup into Without this ability, he would have to split the cgroup into
multiple separate ones and then associate the new cgroups with the multiple separate ones and then associate the new cgroups with the
@ -310,21 +310,24 @@ subsystem, this is the case for the cpuset.
To start a new job that is to be contained within a cgroup, using To start a new job that is to be contained within a cgroup, using
the "cpuset" cgroup subsystem, the steps are something like: the "cpuset" cgroup subsystem, the steps are something like:
1) mkdir /dev/cgroup 1) mount -t tmpfs cgroup_root /sys/fs/cgroup
2) mount -t cgroup -ocpuset cpuset /dev/cgroup 2) mkdir /sys/fs/cgroup/cpuset
3) Create the new cgroup by doing mkdir's and write's (or echo's) in 3) mount -t cgroup -ocpuset cpuset /sys/fs/cgroup/cpuset
the /dev/cgroup virtual file system. 4) Create the new cgroup by doing mkdir's and write's (or echo's) in
4) Start a task that will be the "founding father" of the new job. the /sys/fs/cgroup virtual file system.
5) Attach that task to the new cgroup by writing its pid to the 5) Start a task that will be the "founding father" of the new job.
/dev/cgroup tasks file for that cgroup. 6) Attach that task to the new cgroup by writing its pid to the
6) fork, exec or clone the job tasks from this founding father task. /sys/fs/cgroup/cpuset/tasks file for that cgroup.
7) fork, exec or clone the job tasks from this founding father task.
For example, the following sequence of commands will setup a cgroup For example, the following sequence of commands will setup a cgroup
named "Charlie", containing just CPUs 2 and 3, and Memory Node 1, named "Charlie", containing just CPUs 2 and 3, and Memory Node 1,
and then start a subshell 'sh' in that cgroup: and then start a subshell 'sh' in that cgroup:
mount -t cgroup cpuset -ocpuset /dev/cgroup mount -t tmpfs cgroup_root /sys/fs/cgroup
cd /dev/cgroup mkdir /sys/fs/cgroup/cpuset
mount -t cgroup cpuset -ocpuset /sys/fs/cgroup/cpuset
cd /sys/fs/cgroup/cpuset
mkdir Charlie mkdir Charlie
cd Charlie cd Charlie
/bin/echo 2-3 > cpuset.cpus /bin/echo 2-3 > cpuset.cpus
@ -345,7 +348,7 @@ Creating, modifying, using the cgroups can be done through the cgroup
virtual filesystem. virtual filesystem.
To mount a cgroup hierarchy with all available subsystems, type: To mount a cgroup hierarchy with all available subsystems, type:
# mount -t cgroup xxx /dev/cgroup # mount -t cgroup xxx /sys/fs/cgroup
The "xxx" is not interpreted by the cgroup code, but will appear in The "xxx" is not interpreted by the cgroup code, but will appear in
/proc/mounts so may be any useful identifying string that you like. /proc/mounts so may be any useful identifying string that you like.
@ -354,23 +357,32 @@ Note: Some subsystems do not work without some user input first. For instance,
if cpusets are enabled the user will have to populate the cpus and mems files if cpusets are enabled the user will have to populate the cpus and mems files
for each new cgroup created before that group can be used. for each new cgroup created before that group can be used.
As explained in section `1.2 Why are cgroups needed?' you should create
different hierarchies of cgroups for each single resource or group of
resources you want to control. Therefore, you should mount a tmpfs on
/sys/fs/cgroup and create directories for each cgroup resource or resource
group.
# mount -t tmpfs cgroup_root /sys/fs/cgroup
# mkdir /sys/fs/cgroup/rg1
To mount a cgroup hierarchy with just the cpuset and memory To mount a cgroup hierarchy with just the cpuset and memory
subsystems, type: subsystems, type:
# mount -t cgroup -o cpuset,memory hier1 /dev/cgroup # mount -t cgroup -o cpuset,memory hier1 /sys/fs/cgroup/rg1
To change the set of subsystems bound to a mounted hierarchy, just To change the set of subsystems bound to a mounted hierarchy, just
remount with different options: remount with different options:
# mount -o remount,cpuset,blkio hier1 /dev/cgroup # mount -o remount,cpuset,blkio hier1 /sys/fs/cgroup/rg1
Now memory is removed from the hierarchy and blkio is added. Now memory is removed from the hierarchy and blkio is added.
Note this will add blkio to the hierarchy but won't remove memory or Note this will add blkio to the hierarchy but won't remove memory or
cpuset, because the new options are appended to the old ones: cpuset, because the new options are appended to the old ones:
# mount -o remount,blkio /dev/cgroup # mount -o remount,blkio /sys/fs/cgroup/rg1
To Specify a hierarchy's release_agent: To Specify a hierarchy's release_agent:
# mount -t cgroup -o cpuset,release_agent="/sbin/cpuset_release_agent" \ # mount -t cgroup -o cpuset,release_agent="/sbin/cpuset_release_agent" \
xxx /dev/cgroup xxx /sys/fs/cgroup/rg1
Note that specifying 'release_agent' more than once will return failure. Note that specifying 'release_agent' more than once will return failure.
@ -379,17 +391,17 @@ when the hierarchy consists of a single (root) cgroup. Supporting
the ability to arbitrarily bind/unbind subsystems from an existing the ability to arbitrarily bind/unbind subsystems from an existing
cgroup hierarchy is intended to be implemented in the future. cgroup hierarchy is intended to be implemented in the future.
Then under /dev/cgroup you can find a tree that corresponds to the Then under /sys/fs/cgroup/rg1 you can find a tree that corresponds to the
tree of the cgroups in the system. For instance, /dev/cgroup tree of the cgroups in the system. For instance, /sys/fs/cgroup/rg1
is the cgroup that holds the whole system. is the cgroup that holds the whole system.
If you want to change the value of release_agent: If you want to change the value of release_agent:
# echo "/sbin/new_release_agent" > /dev/cgroup/release_agent # echo "/sbin/new_release_agent" > /sys/fs/cgroup/rg1/release_agent
It can also be changed via remount. It can also be changed via remount.
If you want to create a new cgroup under /dev/cgroup: If you want to create a new cgroup under /sys/fs/cgroup/rg1:
# cd /dev/cgroup # cd /sys/fs/cgroup/rg1
# mkdir my_cgroup # mkdir my_cgroup
Now you want to do something with this cgroup. Now you want to do something with this cgroup.

View file

@ -10,26 +10,25 @@ directly present in its group.
Accounting groups can be created by first mounting the cgroup filesystem. Accounting groups can be created by first mounting the cgroup filesystem.
# mkdir /cgroups # mount -t cgroup -ocpuacct none /sys/fs/cgroup
# mount -t cgroup -ocpuacct none /cgroups
With the above step, the initial or the parent accounting group With the above step, the initial or the parent accounting group becomes
becomes visible at /cgroups. At bootup, this group includes all the visible at /sys/fs/cgroup. At bootup, this group includes all the tasks in
tasks in the system. /cgroups/tasks lists the tasks in this cgroup. the system. /sys/fs/cgroup/tasks lists the tasks in this cgroup.
/cgroups/cpuacct.usage gives the CPU time (in nanoseconds) obtained by /sys/fs/cgroup/cpuacct.usage gives the CPU time (in nanoseconds) obtained
this group which is essentially the CPU time obtained by all the tasks by this group which is essentially the CPU time obtained by all the tasks
in the system. in the system.
New accounting groups can be created under the parent group /cgroups. New accounting groups can be created under the parent group /sys/fs/cgroup.
# cd /cgroups # cd /sys/fs/cgroup
# mkdir g1 # mkdir g1
# echo $$ > g1 # echo $$ > g1
The above steps create a new group g1 and move the current shell The above steps create a new group g1 and move the current shell
process (bash) into it. CPU time consumed by this bash and its children process (bash) into it. CPU time consumed by this bash and its children
can be obtained from g1/cpuacct.usage and the same is accumulated in can be obtained from g1/cpuacct.usage and the same is accumulated in
/cgroups/cpuacct.usage also. /sys/fs/cgroup/cpuacct.usage also.
cpuacct.stat file lists a few statistics which further divide the cpuacct.stat file lists a few statistics which further divide the
CPU time obtained by the cgroup into user and system times. Currently CPU time obtained by the cgroup into user and system times. Currently

View file

@ -661,21 +661,21 @@ than stress the kernel.
To start a new job that is to be contained within a cpuset, the steps are: To start a new job that is to be contained within a cpuset, the steps are:
1) mkdir /dev/cpuset 1) mkdir /sys/fs/cgroup/cpuset
2) mount -t cgroup -ocpuset cpuset /dev/cpuset 2) mount -t cgroup -ocpuset cpuset /sys/fs/cgroup/cpuset
3) Create the new cpuset by doing mkdir's and write's (or echo's) in 3) Create the new cpuset by doing mkdir's and write's (or echo's) in
the /dev/cpuset virtual file system. the /sys/fs/cgroup/cpuset virtual file system.
4) Start a task that will be the "founding father" of the new job. 4) Start a task that will be the "founding father" of the new job.
5) Attach that task to the new cpuset by writing its pid to the 5) Attach that task to the new cpuset by writing its pid to the
/dev/cpuset tasks file for that cpuset. /sys/fs/cgroup/cpuset tasks file for that cpuset.
6) fork, exec or clone the job tasks from this founding father task. 6) fork, exec or clone the job tasks from this founding father task.
For example, the following sequence of commands will setup a cpuset For example, the following sequence of commands will setup a cpuset
named "Charlie", containing just CPUs 2 and 3, and Memory Node 1, named "Charlie", containing just CPUs 2 and 3, and Memory Node 1,
and then start a subshell 'sh' in that cpuset: and then start a subshell 'sh' in that cpuset:
mount -t cgroup -ocpuset cpuset /dev/cpuset mount -t cgroup -ocpuset cpuset /sys/fs/cgroup/cpuset
cd /dev/cpuset cd /sys/fs/cgroup/cpuset
mkdir Charlie mkdir Charlie
cd Charlie cd Charlie
/bin/echo 2-3 > cpuset.cpus /bin/echo 2-3 > cpuset.cpus
@ -710,14 +710,14 @@ Creating, modifying, using the cpusets can be done through the cpuset
virtual filesystem. virtual filesystem.
To mount it, type: To mount it, type:
# mount -t cgroup -o cpuset cpuset /dev/cpuset # mount -t cgroup -o cpuset cpuset /sys/fs/cgroup/cpuset
Then under /dev/cpuset you can find a tree that corresponds to the Then under /sys/fs/cgroup/cpuset you can find a tree that corresponds to the
tree of the cpusets in the system. For instance, /dev/cpuset tree of the cpusets in the system. For instance, /sys/fs/cgroup/cpuset
is the cpuset that holds the whole system. is the cpuset that holds the whole system.
If you want to create a new cpuset under /dev/cpuset: If you want to create a new cpuset under /sys/fs/cgroup/cpuset:
# cd /dev/cpuset # cd /sys/fs/cgroup/cpuset
# mkdir my_cpuset # mkdir my_cpuset
Now you want to do something with this cpuset. Now you want to do something with this cpuset.
@ -765,12 +765,12 @@ wrapper around the cgroup filesystem.
The command The command
mount -t cpuset X /dev/cpuset mount -t cpuset X /sys/fs/cgroup/cpuset
is equivalent to is equivalent to
mount -t cgroup -ocpuset,noprefix X /dev/cpuset mount -t cgroup -ocpuset,noprefix X /sys/fs/cgroup/cpuset
echo "/sbin/cpuset_release_agent" > /dev/cpuset/release_agent echo "/sbin/cpuset_release_agent" > /sys/fs/cgroup/cpuset/release_agent
2.2 Adding/removing cpus 2.2 Adding/removing cpus
------------------------ ------------------------

View file

@ -22,16 +22,16 @@ removed from the child(ren).
An entry is added using devices.allow, and removed using An entry is added using devices.allow, and removed using
devices.deny. For instance devices.deny. For instance
echo 'c 1:3 mr' > /cgroups/1/devices.allow echo 'c 1:3 mr' > /sys/fs/cgroup/1/devices.allow
allows cgroup 1 to read and mknod the device usually known as allows cgroup 1 to read and mknod the device usually known as
/dev/null. Doing /dev/null. Doing
echo a > /cgroups/1/devices.deny echo a > /sys/fs/cgroup/1/devices.deny
will remove the default 'a *:* rwm' entry. Doing will remove the default 'a *:* rwm' entry. Doing
echo a > /cgroups/1/devices.allow echo a > /sys/fs/cgroup/1/devices.allow
will add the 'a *:* rwm' entry to the whitelist. will add the 'a *:* rwm' entry to the whitelist.

View file

@ -59,28 +59,28 @@ is non-freezable.
* Examples of usage : * Examples of usage :
# mkdir /containers # mkdir /sys/fs/cgroup/freezer
# mount -t cgroup -ofreezer freezer /containers # mount -t cgroup -ofreezer freezer /sys/fs/cgroup/freezer
# mkdir /containers/0 # mkdir /sys/fs/cgroup/freezer/0
# echo $some_pid > /containers/0/tasks # echo $some_pid > /sys/fs/cgroup/freezer/0/tasks
to get status of the freezer subsystem : to get status of the freezer subsystem :
# cat /containers/0/freezer.state # cat /sys/fs/cgroup/freezer/0/freezer.state
THAWED THAWED
to freeze all tasks in the container : to freeze all tasks in the container :
# echo FROZEN > /containers/0/freezer.state # echo FROZEN > /sys/fs/cgroup/freezer/0/freezer.state
# cat /containers/0/freezer.state # cat /sys/fs/cgroup/freezer/0/freezer.state
FREEZING FREEZING
# cat /containers/0/freezer.state # cat /sys/fs/cgroup/freezer/0/freezer.state
FROZEN FROZEN
to unfreeze all tasks in the container : to unfreeze all tasks in the container :
# echo THAWED > /containers/0/freezer.state # echo THAWED > /sys/fs/cgroup/freezer/0/freezer.state
# cat /containers/0/freezer.state # cat /sys/fs/cgroup/freezer/0/freezer.state
THAWED THAWED
This is the basic mechanism which should do the right thing for user space task This is the basic mechanism which should do the right thing for user space task

View file

@ -1,8 +1,8 @@
Memory Resource Controller Memory Resource Controller
NOTE: The Memory Resource Controller has been generically been referred NOTE: The Memory Resource Controller has generically been referred to as the
to as the memory controller in this document. Do not confuse memory memory controller in this document. Do not confuse memory controller
controller used here with the memory controller that is used in hardware. used here with the memory controller that is used in hardware.
(For editors) (For editors)
In this document: In this document:
@ -70,6 +70,7 @@ Brief summary of control files.
(See sysctl's vm.swappiness) (See sysctl's vm.swappiness)
memory.move_charge_at_immigrate # set/show controls of moving charges memory.move_charge_at_immigrate # set/show controls of moving charges
memory.oom_control # set/show oom controls. memory.oom_control # set/show oom controls.
memory.numa_stat # show the number of memory usage per numa node
1. History 1. History
@ -181,7 +182,7 @@ behind this approach is that a cgroup that aggressively uses a shared
page will eventually get charged for it (once it is uncharged from page will eventually get charged for it (once it is uncharged from
the cgroup that brought it in -- this will happen on memory pressure). the cgroup that brought it in -- this will happen on memory pressure).
Exception: If CONFIG_CGROUP_CGROUP_MEM_RES_CTLR_SWAP is not used.. Exception: If CONFIG_CGROUP_CGROUP_MEM_RES_CTLR_SWAP is not used.
When you do swapoff and make swapped-out pages of shmem(tmpfs) to When you do swapoff and make swapped-out pages of shmem(tmpfs) to
be backed into memory in force, charges for pages are accounted against the be backed into memory in force, charges for pages are accounted against the
caller of swapoff rather than the users of shmem. caller of swapoff rather than the users of shmem.
@ -213,7 +214,7 @@ affecting global LRU, memory+swap limit is better than just limiting swap from
OS point of view. OS point of view.
* What happens when a cgroup hits memory.memsw.limit_in_bytes * What happens when a cgroup hits memory.memsw.limit_in_bytes
When a cgroup his memory.memsw.limit_in_bytes, it's useless to do swap-out When a cgroup hits memory.memsw.limit_in_bytes, it's useless to do swap-out
in this cgroup. Then, swap-out will not be done by cgroup routine and file in this cgroup. Then, swap-out will not be done by cgroup routine and file
caches are dropped. But as mentioned above, global LRU can do swapout memory caches are dropped. But as mentioned above, global LRU can do swapout memory
from it for sanity of the system's memory management state. You can't forbid from it for sanity of the system's memory management state. You can't forbid
@ -263,16 +264,17 @@ b. Enable CONFIG_RESOURCE_COUNTERS
c. Enable CONFIG_CGROUP_MEM_RES_CTLR c. Enable CONFIG_CGROUP_MEM_RES_CTLR
d. Enable CONFIG_CGROUP_MEM_RES_CTLR_SWAP (to use swap extension) d. Enable CONFIG_CGROUP_MEM_RES_CTLR_SWAP (to use swap extension)
1. Prepare the cgroups 1. Prepare the cgroups (see cgroups.txt, Why are cgroups needed?)
# mkdir -p /cgroups # mount -t tmpfs none /sys/fs/cgroup
# mount -t cgroup none /cgroups -o memory # mkdir /sys/fs/cgroup/memory
# mount -t cgroup none /sys/fs/cgroup/memory -o memory
2. Make the new group and move bash into it 2. Make the new group and move bash into it
# mkdir /cgroups/0 # mkdir /sys/fs/cgroup/memory/0
# echo $$ > /cgroups/0/tasks # echo $$ > /sys/fs/cgroup/memory/0/tasks
Since now we're in the 0 cgroup, we can alter the memory limit: Since now we're in the 0 cgroup, we can alter the memory limit:
# echo 4M > /cgroups/0/memory.limit_in_bytes # echo 4M > /sys/fs/cgroup/memory/0/memory.limit_in_bytes
NOTE: We can use a suffix (k, K, m, M, g or G) to indicate values in kilo, NOTE: We can use a suffix (k, K, m, M, g or G) to indicate values in kilo,
mega or gigabytes. (Here, Kilo, Mega, Giga are Kibibytes, Mebibytes, Gibibytes.) mega or gigabytes. (Here, Kilo, Mega, Giga are Kibibytes, Mebibytes, Gibibytes.)
@ -280,11 +282,11 @@ mega or gigabytes. (Here, Kilo, Mega, Giga are Kibibytes, Mebibytes, Gibibytes.)
NOTE: We can write "-1" to reset the *.limit_in_bytes(unlimited). NOTE: We can write "-1" to reset the *.limit_in_bytes(unlimited).
NOTE: We cannot set limits on the root cgroup any more. NOTE: We cannot set limits on the root cgroup any more.
# cat /cgroups/0/memory.limit_in_bytes # cat /sys/fs/cgroup/memory/0/memory.limit_in_bytes
4194304 4194304
We can check the usage: We can check the usage:
# cat /cgroups/0/memory.usage_in_bytes # cat /sys/fs/cgroup/memory/0/memory.usage_in_bytes
1216512 1216512
A successful write to this file does not guarantee a successful set of A successful write to this file does not guarantee a successful set of
@ -464,6 +466,24 @@ value for efficient access. (Of course, when necessary, it's synchronized.)
If you want to know more exact memory usage, you should use RSS+CACHE(+SWAP) If you want to know more exact memory usage, you should use RSS+CACHE(+SWAP)
value in memory.stat(see 5.2). value in memory.stat(see 5.2).
5.6 numa_stat
This is similar to numa_maps but operates on a per-memcg basis. This is
useful for providing visibility into the numa locality information within
an memcg since the pages are allowed to be allocated from any physical
node. One of the usecases is evaluating application performance by
combining this information with the application's cpu allocation.
We export "total", "file", "anon" and "unevictable" pages per-node for
each memcg. The ouput format of memory.numa_stat is:
total=<total pages> N0=<node 0 pages> N1=<node 1 pages> ...
file=<total file pages> N0=<node 0 pages> N1=<node 1 pages> ...
anon=<total anon pages> N0=<node 0 pages> N1=<node 1 pages> ...
unevictable=<total anon pages> N0=<node 0 pages> N1=<node 1 pages> ...
And we have total = file + anon + unevictable.
6. Hierarchy support 6. Hierarchy support
The memory controller supports a deep hierarchy and hierarchical accounting. The memory controller supports a deep hierarchy and hierarchical accounting.
@ -471,13 +491,13 @@ The hierarchy is created by creating the appropriate cgroups in the
cgroup filesystem. Consider for example, the following cgroup filesystem cgroup filesystem. Consider for example, the following cgroup filesystem
hierarchy hierarchy
root root
/ | \ / | \
/ | \ / | \
a b c a b c
| \ | \
| \ | \
d e d e
In the diagram above, with hierarchical accounting enabled, all memory In the diagram above, with hierarchical accounting enabled, all memory
usage of e, is accounted to its ancestors up until the root (i.e, c and root), usage of e, is accounted to its ancestors up until the root (i.e, c and root),

View file

@ -481,23 +481,6 @@ Who: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
---------------------------- ----------------------------
What: namespace cgroup (ns_cgroup)
When: 2.6.38
Why: The ns_cgroup leads to some problems:
* cgroup creation is out-of-control
* cgroup name can conflict when pids are looping
* it is not possible to have a single process handling
a lot of namespaces without falling in a exponential creation time
* we may want to create a namespace without creating a cgroup
The ns_cgroup is replaced by a compatibility flag 'clone_children',
where a newly created cgroup will copy the parent cgroup values.
The userspace has to manually create a cgroup and add a task to
the 'tasks' file.
Who: Daniel Lezcano <daniel.lezcano@free.fr>
----------------------------
What: iwlwifi disable_hw_scan module parameters What: iwlwifi disable_hw_scan module parameters
When: 3.0 When: 3.0
Why: Hareware scan is the prefer method for iwlwifi devices for Why: Hareware scan is the prefer method for iwlwifi devices for

View file

@ -673,6 +673,22 @@ storage request to complete, or it may attempt to cancel the storage request -
in which case the page will not be stored in the cache this time. in which case the page will not be stored in the cache this time.
BULK INODE PAGE UNCACHE
-----------------------
A convenience routine is provided to perform an uncache on all the pages
attached to an inode. This assumes that the pages on the inode correspond on a
1:1 basis with the pages in the cache.
void fscache_uncache_all_inode_pages(struct fscache_cookie *cookie,
struct inode *inode);
This takes the netfs cookie that the pages were cached with and the inode that
the pages are attached to. This function will wait for pages to finish being
written to the cache and for the cache to finish with the page generally. No
error is returned.
========================== ==========================
INDEX AND DATA FILE UPDATE INDEX AND DATA FILE UPDATE
========================== ==========================

View file

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

View file

@ -22,6 +22,10 @@ Supported chips:
Prefix: 'f71869' Prefix: 'f71869'
Addresses scanned: none, address read from Super I/O config space Addresses scanned: none, address read from Super I/O config space
Datasheet: Available from the Fintek website Datasheet: Available from the Fintek website
* Fintek F71869A
Prefix: 'f71869a'
Addresses scanned: none, address read from Super I/O config space
Datasheet: Not public
* Fintek F71882FG and F71883FG * Fintek F71882FG and F71883FG
Prefix: 'f71882fg' Prefix: 'f71882fg'
Addresses scanned: none, address read from Super I/O config space Addresses scanned: none, address read from Super I/O config space

View file

@ -9,8 +9,8 @@ Supported chips:
Socket S1G3: Athlon II, Sempron, Turion II Socket S1G3: Athlon II, Sempron, Turion II
* AMD Family 11h processors: * AMD Family 11h processors:
Socket S1G2: Athlon (X2), Sempron (X2), Turion X2 (Ultra) Socket S1G2: Athlon (X2), Sempron (X2), Turion X2 (Ultra)
* AMD Family 12h processors: "Llano" * AMD Family 12h processors: "Llano" (E2/A4/A6/A8-Series)
* AMD Family 14h processors: "Brazos" (C/E/G-Series) * AMD Family 14h processors: "Brazos" (C/E/G/Z-Series)
* AMD Family 15h processors: "Bulldozer" * AMD Family 15h processors: "Bulldozer"
Prefix: 'k10temp' Prefix: 'k10temp'
@ -20,12 +20,16 @@ Supported chips:
http://support.amd.com/us/Processor_TechDocs/31116.pdf http://support.amd.com/us/Processor_TechDocs/31116.pdf
BIOS and Kernel Developer's Guide (BKDG) for AMD Family 11h Processors: BIOS and Kernel Developer's Guide (BKDG) for AMD Family 11h Processors:
http://support.amd.com/us/Processor_TechDocs/41256.pdf http://support.amd.com/us/Processor_TechDocs/41256.pdf
BIOS and Kernel Developer's Guide (BKDG) for AMD Family 12h Processors:
http://support.amd.com/us/Processor_TechDocs/41131.pdf
BIOS and Kernel Developer's Guide (BKDG) for AMD Family 14h Models 00h-0Fh Processors: BIOS and Kernel Developer's Guide (BKDG) for AMD Family 14h Models 00h-0Fh Processors:
http://support.amd.com/us/Processor_TechDocs/43170.pdf http://support.amd.com/us/Processor_TechDocs/43170.pdf
Revision Guide for AMD Family 10h Processors: Revision Guide for AMD Family 10h Processors:
http://support.amd.com/us/Processor_TechDocs/41322.pdf http://support.amd.com/us/Processor_TechDocs/41322.pdf
Revision Guide for AMD Family 11h Processors: Revision Guide for AMD Family 11h Processors:
http://support.amd.com/us/Processor_TechDocs/41788.pdf http://support.amd.com/us/Processor_TechDocs/41788.pdf
Revision Guide for AMD Family 12h Processors:
http://support.amd.com/us/Processor_TechDocs/44739.pdf
Revision Guide for AMD Family 14h Models 00h-0Fh Processors: Revision Guide for AMD Family 14h Models 00h-0Fh Processors:
http://support.amd.com/us/Processor_TechDocs/47534.pdf http://support.amd.com/us/Processor_TechDocs/47534.pdf
AMD Family 11h Processor Power and Thermal Data Sheet for Notebooks: AMD Family 11h Processor Power and Thermal Data Sheet for Notebooks:

View file

@ -2015,6 +2015,8 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
the default. the default.
off: Turn ECRC off off: Turn ECRC off
on: Turn ECRC on. on: Turn ECRC on.
realloc reallocate PCI resources if allocations done by BIOS
are erroneous.
pcie_aspm= [PCIE] Forcibly enable or disable PCIe Active State Power pcie_aspm= [PCIE] Forcibly enable or disable PCIe Active State Power
Management. Management.

View file

@ -11,7 +11,9 @@ with the difference that the orphan objects are not freed but only
reported via /sys/kernel/debug/kmemleak. A similar method is used by the reported via /sys/kernel/debug/kmemleak. A similar method is used by the
Valgrind tool (memcheck --leak-check) to detect the memory leaks in Valgrind tool (memcheck --leak-check) to detect the memory leaks in
user-space applications. user-space applications.
Kmemleak is supported on x86, arm, powerpc, sparc, sh, microblaze and tile.
Please check DEBUG_KMEMLEAK dependencies in lib/Kconfig.debug for supported
architectures.
Usage Usage
----- -----

View file

@ -555,7 +555,7 @@ also have
sync_min sync_min
sync_max sync_max
The two values, given as numbers of sectors, indicate a range The two values, given as numbers of sectors, indicate a range
withing the array where 'check'/'repair' will operate. Must be within the array where 'check'/'repair' will operate. Must be
a multiple of chunk_size. When it reaches "sync_max" it will a multiple of chunk_size. When it reaches "sync_max" it will
pause, rather than complete. pause, rather than complete.
You can use 'select' or 'poll' on "sync_completed" to wait for You can use 'select' or 'poll' on "sync_completed" to wait for

View file

@ -520,59 +520,20 @@ Support for power domains is provided through the pwr_domain field of struct
device. This field is a pointer to an object of type struct dev_power_domain, device. This field is a pointer to an object of type struct dev_power_domain,
defined in include/linux/pm.h, providing a set of power management callbacks defined in include/linux/pm.h, providing a set of power management callbacks
analogous to the subsystem-level and device driver callbacks that are executed analogous to the subsystem-level and device driver callbacks that are executed
for the given device during all power transitions, in addition to the respective for the given device during all power transitions, instead of the respective
subsystem-level callbacks. Specifically, the power domain "suspend" callbacks subsystem-level callbacks. Specifically, if a device's pm_domain pointer is
(i.e. ->runtime_suspend(), ->suspend(), ->freeze(), ->poweroff(), etc.) are not NULL, the ->suspend() callback from the object pointed to by it will be
executed after the analogous subsystem-level callbacks, while the power domain executed instead of its subsystem's (e.g. bus type's) ->suspend() callback and
"resume" callbacks (i.e. ->runtime_resume(), ->resume(), ->thaw(), ->restore, anlogously for all of the remaining callbacks. In other words, power management
etc.) are executed before the analogous subsystem-level callbacks. Error codes domain callbacks, if defined for the given device, always take precedence over
returned by the "suspend" and "resume" power domain callbacks are ignored. the callbacks provided by the device's subsystem (e.g. bus type).
Power domain ->runtime_idle() callback is executed before the subsystem-level The support for device power management domains is only relevant to platforms
->runtime_idle() callback and the result returned by it is not ignored. Namely, needing to use the same device driver power management callbacks in many
if it returns error code, the subsystem-level ->runtime_idle() callback will not different power domain configurations and wanting to avoid incorporating the
be called and the helper function rpm_idle() executing it will return error support for power domains into subsystem-level callbacks, for example by
code. This mechanism is intended to help platforms where saving device state modifying the platform bus type. Other platforms need not implement it or take
is a time consuming operation and should only be carried out if all devices it into account in any way.
in the power domain are idle, before turning off the shared power resource(s).
Namely, the power domain ->runtime_idle() callback may return error code until
the pm_runtime_idle() helper (or its asychronous version) has been called for
all devices in the power domain (it is recommended that the returned error code
be -EBUSY in those cases), preventing the subsystem-level ->runtime_idle()
callback from being run prematurely.
The support for device power domains is only relevant to platforms needing to
use the same subsystem-level (e.g. platform bus type) and device driver power
management callbacks in many different power domain configurations and wanting
to avoid incorporating the support for power domains into the subsystem-level
callbacks. The other platforms need not implement it or take it into account
in any way.
System Devices
--------------
System devices (sysdevs) follow a slightly different API, which can be found in
include/linux/sysdev.h
drivers/base/sys.c
System devices will be suspended with interrupts disabled, and after all other
devices have been suspended. On resume, they will be resumed before any other
devices, and also with interrupts disabled. These things occur in special
"sysdev_driver" phases, which affect only system devices.
Thus, after the suspend_noirq (or freeze_noirq or poweroff_noirq) phase, when
the non-boot CPUs are all offline and IRQs are disabled on the remaining online
CPU, then a sysdev_driver.suspend phase is carried out, and the system enters a
sleep state (or a system image is created). During resume (or after the image
has been created or loaded) a sysdev_driver.resume phase is carried out, IRQs
are enabled on the only online CPU, the non-boot CPUs are enabled, and the
resume_noirq (or thaw_noirq or restore_noirq) phase begins.
Code to actually enter and exit the system-wide low power state sometimes
involves hardware details that are only known to the boot firmware, and
may leave a CPU running software (from SRAM or flash memory) that monitors
the system and manages its wakeup sequence.
Device Low Power (suspend) States Device Low Power (suspend) States

View file

@ -501,13 +501,29 @@ helper functions described in Section 4. In that case, pm_runtime_resume()
should be used. Of course, for this purpose the device's run-time PM has to be should be used. Of course, for this purpose the device's run-time PM has to be
enabled earlier by calling pm_runtime_enable(). enabled earlier by calling pm_runtime_enable().
If the device bus type's or driver's ->probe() or ->remove() callback runs If the device bus type's or driver's ->probe() callback runs
pm_runtime_suspend() or pm_runtime_idle() or their asynchronous counterparts, pm_runtime_suspend() or pm_runtime_idle() or their asynchronous counterparts,
they will fail returning -EAGAIN, because the device's usage counter is they will fail returning -EAGAIN, because the device's usage counter is
incremented by the core before executing ->probe() and ->remove(). Still, it incremented by the driver core before executing ->probe(). Still, it may be
may be desirable to suspend the device as soon as ->probe() or ->remove() has desirable to suspend the device as soon as ->probe() has finished, so the driver
finished, so the PM core uses pm_runtime_idle_sync() to invoke the core uses pm_runtime_put_sync() to invoke the subsystem-level idle callback for
subsystem-level idle callback for the device at that time. the device at that time.
Moreover, the driver core prevents runtime PM callbacks from racing with the bus
notifier callback in __device_release_driver(), which is necessary, because the
notifier is used by some subsystems to carry out operations affecting the
runtime PM functionality. It does so by calling pm_runtime_get_sync() before
driver_sysfs_remove() and the BUS_NOTIFY_UNBIND_DRIVER notifications. This
resumes the device if it's in the suspended state and prevents it from
being suspended again while those routines are being executed.
To allow bus types and drivers to put devices into the suspended state by
calling pm_runtime_suspend() from their ->remove() routines, the driver core
executes pm_runtime_put_sync() after running the BUS_NOTIFY_UNBIND_DRIVER
notifications in __device_release_driver(). This requires bus types and
drivers to make their ->remove() callbacks avoid races with runtime PM directly,
but also it allows of more flexibility in the handling of devices during the
removal of their drivers.
The user space can effectively disallow the driver of the device to power manage The user space can effectively disallow the driver of the device to power manage
it at run time by changing the value of its /sys/devices/.../power/control it at run time by changing the value of its /sys/devices/.../power/control
@ -566,11 +582,6 @@ to do this is:
pm_runtime_set_active(dev); pm_runtime_set_active(dev);
pm_runtime_enable(dev); pm_runtime_enable(dev);
The PM core always increments the run-time usage counter before calling the
->prepare() callback and decrements it after calling the ->complete() callback.
Hence disabling run-time PM temporarily like this will not cause any run-time
suspend callbacks to be lost.
7. Generic subsystem callbacks 7. Generic subsystem callbacks
Subsystems may wish to conserve code space by using the set of generic power Subsystems may wish to conserve code space by using the set of generic power

View file

@ -9,7 +9,121 @@ If variable is of Type, use printk format specifier:
size_t %zu or %zx size_t %zu or %zx
ssize_t %zd or %zx ssize_t %zd or %zx
Raw pointer value SHOULD be printed with %p. Raw pointer value SHOULD be printed with %p. The kernel supports
the following extended format specifiers for pointer types:
Symbols/Function Pointers:
%pF versatile_init+0x0/0x110
%pf versatile_init
%pS versatile_init+0x0/0x110
%ps versatile_init
%pB prev_fn_of_versatile_init+0x88/0x88
For printing symbols and function pointers. The 'S' and 's' specifiers
result in the symbol name with ('S') or without ('s') offsets. Where
this is used on a kernel without KALLSYMS - the symbol address is
printed instead.
The 'B' specifier results in the symbol name with offsets and should be
used when printing stack backtraces. The specifier takes into
consideration the effect of compiler optimisations which may occur
when tail-call's are used and marked with the noreturn GCC attribute.
On ia64, ppc64 and parisc64 architectures function pointers are
actually function descriptors which must first be resolved. The 'F' and
'f' specifiers perform this resolution and then provide the same
functionality as the 'S' and 's' specifiers.
Kernel Pointers:
%pK 0x01234567 or 0x0123456789abcdef
For printing kernel pointers which should be hidden from unprivileged
users. The behaviour of %pK depends on the kptr_restrict sysctl - see
Documentation/sysctl/kernel.txt for more details.
Struct Resources:
%pr [mem 0x60000000-0x6fffffff flags 0x2200] or
[mem 0x0000000060000000-0x000000006fffffff flags 0x2200]
%pR [mem 0x60000000-0x6fffffff pref] or
[mem 0x0000000060000000-0x000000006fffffff pref]
For printing struct resources. The 'R' and 'r' specifiers result in a
printed resource with ('R') or without ('r') a decoded flags member.
MAC/FDDI addresses:
%pM 00:01:02:03:04:05
%pMF 00-01-02-03-04-05
%pm 000102030405
For printing 6-byte MAC/FDDI addresses in hex notation. The 'M' and 'm'
specifiers result in a printed address with ('M') or without ('m') byte
separators. The default byte separator is the colon (':').
Where FDDI addresses are concerned the 'F' specifier can be used after
the 'M' specifier to use dash ('-') separators instead of the default
separator.
IPv4 addresses:
%pI4 1.2.3.4
%pi4 001.002.003.004
%p[Ii][hnbl]
For printing IPv4 dot-separated decimal addresses. The 'I4' and 'i4'
specifiers result in a printed address with ('i4') or without ('I4')
leading zeros.
The additional 'h', 'n', 'b', and 'l' specifiers are used to specify
host, network, big or little endian order addresses respectively. Where
no specifier is provided the default network/big endian order is used.
IPv6 addresses:
%pI6 0001:0002:0003:0004:0005:0006:0007:0008
%pi6 00010002000300040005000600070008
%pI6c 1:2:3:4:5:6:7:8
For printing IPv6 network-order 16-bit hex addresses. The 'I6' and 'i6'
specifiers result in a printed address with ('I6') or without ('i6')
colon-separators. Leading zeros are always used.
The additional 'c' specifier can be used with the 'I' specifier to
print a compressed IPv6 address as described by
http://tools.ietf.org/html/rfc5952
UUID/GUID addresses:
%pUb 00010203-0405-0607-0809-0a0b0c0d0e0f
%pUB 00010203-0405-0607-0809-0A0B0C0D0E0F
%pUl 03020100-0504-0706-0809-0a0b0c0e0e0f
%pUL 03020100-0504-0706-0809-0A0B0C0E0E0F
For printing 16-byte UUID/GUIDs addresses. The additional 'l', 'L',
'b' and 'B' specifiers are used to specify a little endian order in
lower ('l') or upper case ('L') hex characters - and big endian order
in lower ('b') or upper case ('B') hex characters.
Where no additional specifiers are used the default little endian
order with lower case hex characters will be printed.
struct va_format:
%pV
For printing struct va_format structures. These contain a format string
and va_list as follows:
struct va_format {
const char *fmt;
va_list *va;
};
Do not use this feature without some mechanism to verify the
correctness of the format string and va_list arguments.
u64 SHOULD be printed with %llu/%llx, (unsigned long long): u64 SHOULD be printed with %llu/%llx, (unsigned long long):
@ -32,4 +146,5 @@ Reminder: sizeof() result is of type size_t.
Thank you for your cooperation and attention. Thank you for your cooperation and attention.
By Randy Dunlap <rdunlap@xenotime.net> By Randy Dunlap <rdunlap@xenotime.net> and
Andrew Murray <amurray@mpc-data.co.uk>

View file

@ -223,9 +223,10 @@ When CONFIG_FAIR_GROUP_SCHED is defined, a "cpu.shares" file is created for each
group created using the pseudo filesystem. See example steps below to create group created using the pseudo filesystem. See example steps below to create
task groups and modify their CPU share using the "cgroups" pseudo filesystem. task groups and modify their CPU share using the "cgroups" pseudo filesystem.
# mkdir /dev/cpuctl # mount -t tmpfs cgroup_root /sys/fs/cgroup
# mount -t cgroup -ocpu none /dev/cpuctl # mkdir /sys/fs/cgroup/cpu
# cd /dev/cpuctl # mount -t cgroup -ocpu none /sys/fs/cgroup/cpu
# cd /sys/fs/cgroup/cpu
# mkdir multimedia # create "multimedia" group of tasks # mkdir multimedia # create "multimedia" group of tasks
# mkdir browser # create "browser" group of tasks # mkdir browser # create "browser" group of tasks

View file

@ -129,9 +129,8 @@ priority!
Enabling CONFIG_RT_GROUP_SCHED lets you explicitly allocate real Enabling CONFIG_RT_GROUP_SCHED lets you explicitly allocate real
CPU bandwidth to task groups. CPU bandwidth to task groups.
This uses the /cgroup virtual file system and This uses the cgroup virtual file system and "<cgroup>/cpu.rt_runtime_us"
"/cgroup/<cgroup>/cpu.rt_runtime_us" to control the CPU time reserved for each to control the CPU time reserved for each control group.
control group.
For more information on working with control groups, you should read For more information on working with control groups, you should read
Documentation/cgroups/cgroups.txt as well. Documentation/cgroups/cgroups.txt as well.
@ -150,7 +149,7 @@ For now, this can be simplified to just the following (but see Future plans):
=============== ===============
There is work in progress to make the scheduling period for each group There is work in progress to make the scheduling period for each group
("/cgroup/<cgroup>/cpu.rt_period_us") configurable as well. ("<cgroup>/cpu.rt_period_us") configurable as well.
The constraint on the period is that a subgroup must have a smaller or The constraint on the period is that a subgroup must have a smaller or
equal period to its parent. But realistically its not very useful _yet_ equal period to its parent. But realistically its not very useful _yet_

View file

@ -76,6 +76,13 @@ A transfer's actual_length may be positive even when an error has been
reported. That's because transfers often involve several packets, so that reported. That's because transfers often involve several packets, so that
one or more packets could finish before an error stops further endpoint I/O. one or more packets could finish before an error stops further endpoint I/O.
For isochronous URBs, the urb status value is non-zero only if the URB is
unlinked, the device is removed, the host controller is disabled, or the total
transferred length is less than the requested length and the URB_SHORT_NOT_OK
flag is set. Completion handlers for isochronous URBs should only see
urb->status set to zero, -ENOENT, -ECONNRESET, -ESHUTDOWN, or -EREMOTEIO.
Individual frame descriptor status fields may report more status codes.
0 Transfer completed successfully 0 Transfer completed successfully
@ -132,7 +139,7 @@ one or more packets could finish before an error stops further endpoint I/O.
device removal events immediately. device removal events immediately.
-EXDEV ISO transfer only partially completed -EXDEV ISO transfer only partially completed
look at individual frame status for details (only set in iso_frame_desc[n].status, not urb->status)
-EINVAL ISO madness, if this happens: Log off and go home -EINVAL ISO madness, if this happens: Log off and go home

View file

@ -129,12 +129,12 @@ Limit injection to pages owned by memgroup. Specified by inode number
of the memcg. of the memcg.
Example: Example:
mkdir /cgroup/hwpoison mkdir /sys/fs/cgroup/mem/hwpoison
usemem -m 100 -s 1000 & usemem -m 100 -s 1000 &
echo `jobs -p` > /cgroup/hwpoison/tasks echo `jobs -p` > /sys/fs/cgroup/mem/hwpoison/tasks
memcg_ino=$(ls -id /cgroup/hwpoison | cut -f1 -d' ') memcg_ino=$(ls -id /sys/fs/cgroup/mem/hwpoison | cut -f1 -d' ')
echo $memcg_ino > /debug/hwpoison/corrupt-filter-memcg echo $memcg_ino > /debug/hwpoison/corrupt-filter-memcg
page-types -p `pidof init` --hwpoison # shall do nothing page-types -p `pidof init` --hwpoison # shall do nothing

View file

@ -594,6 +594,16 @@ S: Maintained
F: arch/arm/lib/floppydma.S F: arch/arm/lib/floppydma.S
F: arch/arm/include/asm/floppy.h F: arch/arm/include/asm/floppy.h
ARM PMU PROFILING AND DEBUGGING
M: Will Deacon <will.deacon@arm.com>
S: Maintained
F: arch/arm/kernel/perf_event*
F: arch/arm/oprofile/common.c
F: arch/arm/kernel/pmu.c
F: arch/arm/include/asm/pmu.h
F: arch/arm/kernel/hw_breakpoint.c
F: arch/arm/include/asm/hw_breakpoint.h
ARM PORT ARM PORT
M: Russell King <linux@arm.linux.org.uk> M: Russell King <linux@arm.linux.org.uk>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
@ -1345,16 +1355,18 @@ F: drivers/auxdisplay/
F: include/linux/cfag12864b.h F: include/linux/cfag12864b.h
AVR32 ARCHITECTURE AVR32 ARCHITECTURE
M: Hans-Christian Egtvedt <hans-christian.egtvedt@atmel.com> M: Haavard Skinnemoen <hskinnemoen@gmail.com>
M: Hans-Christian Egtvedt <egtvedt@samfundet.no>
W: http://www.atmel.com/products/AVR32/ W: http://www.atmel.com/products/AVR32/
W: http://avr32linux.org/ W: http://avr32linux.org/
W: http://avrfreaks.net/ W: http://avrfreaks.net/
S: Supported S: Maintained
F: arch/avr32/ F: arch/avr32/
AVR32/AT32AP MACHINE SUPPORT AVR32/AT32AP MACHINE SUPPORT
M: Hans-Christian Egtvedt <hans-christian.egtvedt@atmel.com> M: Haavard Skinnemoen <hskinnemoen@gmail.com>
S: Supported M: Hans-Christian Egtvedt <egtvedt@samfundet.no>
S: Maintained
F: arch/avr32/mach-at32ap/ F: arch/avr32/mach-at32ap/
AX.25 NETWORK LAYER AX.25 NETWORK LAYER
@ -1390,7 +1402,6 @@ F: include/linux/backlight.h
BATMAN ADVANCED BATMAN ADVANCED
M: Marek Lindner <lindner_marek@yahoo.de> M: Marek Lindner <lindner_marek@yahoo.de>
M: Simon Wunderlich <siwu@hrz.tu-chemnitz.de> M: Simon Wunderlich <siwu@hrz.tu-chemnitz.de>
M: Sven Eckelmann <sven@narfation.org>
L: b.a.t.m.a.n@lists.open-mesh.org L: b.a.t.m.a.n@lists.open-mesh.org
W: http://www.open-mesh.org/ W: http://www.open-mesh.org/
S: Maintained S: Maintained
@ -1423,7 +1434,6 @@ S: Supported
F: arch/blackfin/ F: arch/blackfin/
BLACKFIN EMAC DRIVER BLACKFIN EMAC DRIVER
M: Michael Hennerich <michael.hennerich@analog.com>
L: uclinux-dist-devel@blackfin.uclinux.org L: uclinux-dist-devel@blackfin.uclinux.org
W: http://blackfin.uclinux.org W: http://blackfin.uclinux.org
S: Supported S: Supported
@ -1639,7 +1649,7 @@ CAN NETWORK LAYER
M: Oliver Hartkopp <socketcan@hartkopp.net> M: Oliver Hartkopp <socketcan@hartkopp.net>
M: Oliver Hartkopp <oliver.hartkopp@volkswagen.de> M: Oliver Hartkopp <oliver.hartkopp@volkswagen.de>
M: Urs Thuermann <urs.thuermann@volkswagen.de> M: Urs Thuermann <urs.thuermann@volkswagen.de>
L: socketcan-core@lists.berlios.de L: socketcan-core@lists.berlios.de (subscribers-only)
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
W: http://developer.berlios.de/projects/socketcan/ W: http://developer.berlios.de/projects/socketcan/
S: Maintained S: Maintained
@ -1651,7 +1661,7 @@ F: include/linux/can/raw.h
CAN NETWORK DRIVERS CAN NETWORK DRIVERS
M: Wolfgang Grandegger <wg@grandegger.com> M: Wolfgang Grandegger <wg@grandegger.com>
L: socketcan-core@lists.berlios.de L: socketcan-core@lists.berlios.de (subscribers-only)
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
W: http://developer.berlios.de/projects/socketcan/ W: http://developer.berlios.de/projects/socketcan/
S: Maintained S: Maintained
@ -1739,7 +1749,7 @@ S: Supported
F: drivers/net/enic/ F: drivers/net/enic/
CIRRUS LOGIC EP93XX ETHERNET DRIVER CIRRUS LOGIC EP93XX ETHERNET DRIVER
M: Lennert Buytenhek <kernel@wantstofly.org> M: Hartley Sweeten <hsweeten@visionengravers.com>
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
S: Maintained S: Maintained
F: drivers/net/arm/ep93xx_eth.c F: drivers/net/arm/ep93xx_eth.c
@ -1889,7 +1899,6 @@ L: cpufreq@vger.kernel.org
W: http://www.codemonkey.org.uk/projects/cpufreq/ W: http://www.codemonkey.org.uk/projects/cpufreq/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/davej/cpufreq.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/davej/cpufreq.git
S: Maintained S: Maintained
F: arch/x86/kernel/cpu/cpufreq/
F: drivers/cpufreq/ F: drivers/cpufreq/
F: include/linux/cpufreq.h F: include/linux/cpufreq.h
@ -2198,7 +2207,7 @@ F: drivers/acpi/dock.c
DOCUMENTATION DOCUMENTATION
M: Randy Dunlap <rdunlap@xenotime.net> M: Randy Dunlap <rdunlap@xenotime.net>
L: linux-doc@vger.kernel.org L: linux-doc@vger.kernel.org
T: quilt oss.oracle.com/~rdunlap/kernel-doc-patches/current/ T: quilt http://userweb.kernel.org/~rdunlap/kernel-doc-patches/current/
S: Maintained S: Maintained
F: Documentation/ F: Documentation/
@ -2292,8 +2301,7 @@ F: drivers/scsi/eata_pio.*
EBTABLES EBTABLES
M: Bart De Schuymer <bart.de.schuymer@pandora.be> M: Bart De Schuymer <bart.de.schuymer@pandora.be>
L: ebtables-user@lists.sourceforge.net L: netfilter-devel@vger.kernel.org
L: ebtables-devel@lists.sourceforge.net
W: http://ebtables.sourceforge.net/ W: http://ebtables.sourceforge.net/
S: Maintained S: Maintained
F: include/linux/netfilter_bridge/ebt_*.h F: include/linux/netfilter_bridge/ebt_*.h
@ -3820,6 +3828,12 @@ S: Maintained
F: drivers/leds/ F: drivers/leds/
F: include/linux/leds.h F: include/linux/leds.h
LEGACY EEPROM DRIVER
M: Jean Delvare <khali@linux-fr.org>
S: Maintained
F: Documentation/misc-devices/eeprom
F: drivers/misc/eeprom/eeprom.c
LEGO USB Tower driver LEGO USB Tower driver
M: Juergen Stuber <starblue@users.sourceforge.net> M: Juergen Stuber <starblue@users.sourceforge.net>
L: legousb-devel@lists.sourceforge.net L: legousb-devel@lists.sourceforge.net
@ -4145,7 +4159,7 @@ F: include/linux/mm.h
F: mm/ F: mm/
MEMORY RESOURCE CONTROLLER MEMORY RESOURCE CONTROLLER
M: Balbir Singh <balbir@linux.vnet.ibm.com> M: Balbir Singh <bsingharora@gmail.com>
M: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> M: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp>
M: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> M: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
L: linux-mm@kvack.org L: linux-mm@kvack.org
@ -4890,7 +4904,7 @@ F: mm/percpu*.c
F: arch/*/include/asm/percpu.h F: arch/*/include/asm/percpu.h
PER-TASK DELAY ACCOUNTING PER-TASK DELAY ACCOUNTING
M: Balbir Singh <balbir@linux.vnet.ibm.com> M: Balbir Singh <bsingharora@gmail.com>
S: Maintained S: Maintained
F: include/linux/delayacct.h F: include/linux/delayacct.h
F: kernel/delayacct.c F: kernel/delayacct.c
@ -4978,7 +4992,7 @@ F: drivers/power/power_supply*
PNP SUPPORT PNP SUPPORT
M: Adam Belay <abelay@mit.edu> M: Adam Belay <abelay@mit.edu>
M: Bjorn Helgaas <bjorn.helgaas@hp.com> M: Bjorn Helgaas <bhelgaas@google.com>
S: Maintained S: Maintained
F: drivers/pnp/ F: drivers/pnp/
@ -5177,6 +5191,7 @@ S: Supported
F: drivers/net/qlcnic/ F: drivers/net/qlcnic/
QLOGIC QLGE 10Gb ETHERNET DRIVER QLOGIC QLGE 10Gb ETHERNET DRIVER
M: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
M: Ron Mercer <ron.mercer@qlogic.com> M: Ron Mercer <ron.mercer@qlogic.com>
M: linux-driver@qlogic.com M: linux-driver@qlogic.com
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
@ -6098,7 +6113,7 @@ F: include/target/
F: Documentation/target/ F: Documentation/target/
TASKSTATS STATISTICS INTERFACE TASKSTATS STATISTICS INTERFACE
M: Balbir Singh <balbir@linux.vnet.ibm.com> M: Balbir Singh <bsingharora@gmail.com>
S: Maintained S: Maintained
F: Documentation/accounting/taskstats* F: Documentation/accounting/taskstats*
F: include/linux/taskstats* F: include/linux/taskstats*
@ -6430,8 +6445,9 @@ S: Maintained
F: drivers/usb/misc/rio500* F: drivers/usb/misc/rio500*
USB EHCI DRIVER USB EHCI DRIVER
M: Alan Stern <stern@rowland.harvard.edu>
L: linux-usb@vger.kernel.org L: linux-usb@vger.kernel.org
S: Orphan S: Maintained
F: Documentation/usb/ehci.txt F: Documentation/usb/ehci.txt
F: drivers/usb/host/ehci* F: drivers/usb/host/ehci*
@ -6458,9 +6474,15 @@ M: Jiri Kosina <jkosina@suse.cz>
L: linux-usb@vger.kernel.org L: linux-usb@vger.kernel.org
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git
S: Maintained S: Maintained
F: Documentation/usb/hiddev.txt F: Documentation/hid/hiddev.txt
F: drivers/hid/usbhid/ F: drivers/hid/usbhid/
USB/IP DRIVERS
M: Matt Mooney <mfm@muteddisk.com>
L: linux-usb@vger.kernel.org
S: Maintained
F: drivers/staging/usbip/
USB ISP116X DRIVER USB ISP116X DRIVER
M: Olav Kongas <ok@artecdesign.ee> M: Olav Kongas <ok@artecdesign.ee>
L: linux-usb@vger.kernel.org L: linux-usb@vger.kernel.org
@ -6490,8 +6512,9 @@ S: Maintained
F: sound/usb/midi.* F: sound/usb/midi.*
USB OHCI DRIVER USB OHCI DRIVER
M: Alan Stern <stern@rowland.harvard.edu>
L: linux-usb@vger.kernel.org L: linux-usb@vger.kernel.org
S: Orphan S: Maintained
F: Documentation/usb/ohci.txt F: Documentation/usb/ohci.txt
F: drivers/usb/host/ohci* F: drivers/usb/host/ohci*
@ -6717,6 +6740,15 @@ S: Maintained
F: Documentation/filesystems/vfat.txt F: Documentation/filesystems/vfat.txt
F: fs/fat/ F: fs/fat/
VIDEOBUF2 FRAMEWORK
M: Pawel Osciak <pawel@osciak.com>
M: Marek Szyprowski <m.szyprowski@samsung.com>
M: Kyungmin Park <kyungmin.park@samsung.com>
L: linux-media@vger.kernel.org
S: Maintained
F: drivers/media/video/videobuf2-*
F: include/media/videobuf2-*
VIRTIO CONSOLE DRIVER VIRTIO CONSOLE DRIVER
M: Amit Shah <amit.shah@redhat.com> M: Amit Shah <amit.shah@redhat.com>
L: virtualization@lists.linux-foundation.org L: virtualization@lists.linux-foundation.org
@ -6994,6 +7026,13 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/mjg59/platform-drivers-x86.
S: Maintained S: Maintained
F: drivers/platform/x86 F: drivers/platform/x86
X86 MCE INFRASTRUCTURE
M: Tony Luck <tony.luck@intel.com>
M: Borislav Petkov <bp@amd64.org>
L: linux-edac@vger.kernel.org
S: Maintained
F: arch/x86/kernel/cpu/mcheck/*
XEN HYPERVISOR INTERFACE XEN HYPERVISOR INTERFACE
M: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> M: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>

View file

@ -1,7 +1,7 @@
VERSION = 3 VERSION = 3
PATCHLEVEL = 0 PATCHLEVEL = 0
SUBLEVEL = 0 SUBLEVEL = 0
EXTRAVERSION = -rc2 EXTRAVERSION = -rc6
NAME = Sneaky Weasel NAME = Sneaky Weasel
# *DOCUMENTATION* # *DOCUMENTATION*
@ -1526,7 +1526,8 @@ quiet_cmd_rmfiles = $(if $(wildcard $(rm-files)),CLEAN $(wildcard $(rm-files))
# Run depmod only if we have System.map and depmod is executable # Run depmod only if we have System.map and depmod is executable
quiet_cmd_depmod = DEPMOD $(KERNELRELEASE) quiet_cmd_depmod = DEPMOD $(KERNELRELEASE)
cmd_depmod = $(srctree)/scripts/depmod.sh $(DEPMOD) $(KERNELRELEASE) cmd_depmod = $(CONFIG_SHELL) $(srctree)/scripts/depmod.sh $(DEPMOD) \
$(KERNELRELEASE)
# Create temporary dir for module support files # Create temporary dir for module support files
# clean it up only when building all modules # clean it up only when building all modules

42
README
View file

@ -1,6 +1,6 @@
Linux kernel release 2.6.xx <http://kernel.org/> Linux kernel release 3.x <http://kernel.org/>
These are the release notes for Linux version 2.6. Read them carefully, These are the release notes for Linux version 3. Read them carefully,
as they tell you what this is all about, explain how to install the as they tell you what this is all about, explain how to install the
kernel, and what to do if something goes wrong. kernel, and what to do if something goes wrong.
@ -62,10 +62,10 @@ INSTALLING the kernel source:
directory where you have permissions (eg. your home directory) and directory where you have permissions (eg. your home directory) and
unpack it: unpack it:
gzip -cd linux-2.6.XX.tar.gz | tar xvf - gzip -cd linux-3.X.tar.gz | tar xvf -
or or
bzip2 -dc linux-2.6.XX.tar.bz2 | tar xvf - bzip2 -dc linux-3.X.tar.bz2 | tar xvf -
Replace "XX" with the version number of the latest kernel. Replace "XX" with the version number of the latest kernel.
@ -75,15 +75,15 @@ INSTALLING the kernel source:
files. They should match the library, and not get messed up by files. They should match the library, and not get messed up by
whatever the kernel-du-jour happens to be. whatever the kernel-du-jour happens to be.
- You can also upgrade between 2.6.xx releases by patching. Patches are - You can also upgrade between 3.x releases by patching. Patches are
distributed in the traditional gzip and the newer bzip2 format. To distributed in the traditional gzip and the newer bzip2 format. To
install by patching, get all the newer patch files, enter the install by patching, get all the newer patch files, enter the
top level directory of the kernel source (linux-2.6.xx) and execute: top level directory of the kernel source (linux-3.x) and execute:
gzip -cd ../patch-2.6.xx.gz | patch -p1 gzip -cd ../patch-3.x.gz | patch -p1
or or
bzip2 -dc ../patch-2.6.xx.bz2 | patch -p1 bzip2 -dc ../patch-3.x.bz2 | patch -p1
(repeat xx for all versions bigger than the version of your current (repeat xx for all versions bigger than the version of your current
source tree, _in_order_) and you should be ok. You may want to remove source tree, _in_order_) and you should be ok. You may want to remove
@ -91,9 +91,9 @@ INSTALLING the kernel source:
failed patches (xxx# or xxx.rej). If there are, either you or me has failed patches (xxx# or xxx.rej). If there are, either you or me has
made a mistake. made a mistake.
Unlike patches for the 2.6.x kernels, patches for the 2.6.x.y kernels Unlike patches for the 3.x kernels, patches for the 3.x.y kernels
(also known as the -stable kernels) are not incremental but instead apply (also known as the -stable kernels) are not incremental but instead apply
directly to the base 2.6.x kernel. Please read directly to the base 3.x kernel. Please read
Documentation/applying-patches.txt for more information. Documentation/applying-patches.txt for more information.
Alternatively, the script patch-kernel can be used to automate this Alternatively, the script patch-kernel can be used to automate this
@ -107,14 +107,14 @@ INSTALLING the kernel source:
an alternative directory can be specified as the second argument. an alternative directory can be specified as the second argument.
- If you are upgrading between releases using the stable series patches - If you are upgrading between releases using the stable series patches
(for example, patch-2.6.xx.y), note that these "dot-releases" are (for example, patch-3.x.y), note that these "dot-releases" are
not incremental and must be applied to the 2.6.xx base tree. For not incremental and must be applied to the 3.x base tree. For
example, if your base kernel is 2.6.12 and you want to apply the example, if your base kernel is 3.0 and you want to apply the
2.6.12.3 patch, you do not and indeed must not first apply the 3.0.3 patch, you do not and indeed must not first apply the
2.6.12.1 and 2.6.12.2 patches. Similarly, if you are running kernel 3.0.1 and 3.0.2 patches. Similarly, if you are running kernel
version 2.6.12.2 and want to jump to 2.6.12.3, you must first version 3.0.2 and want to jump to 3.0.3, you must first
reverse the 2.6.12.2 patch (that is, patch -R) _before_ applying reverse the 3.0.2 patch (that is, patch -R) _before_ applying
the 2.6.12.3 patch. the 3.0.3 patch.
You can read more on this in Documentation/applying-patches.txt You can read more on this in Documentation/applying-patches.txt
- Make sure you have no stale .o files and dependencies lying around: - Make sure you have no stale .o files and dependencies lying around:
@ -126,7 +126,7 @@ INSTALLING the kernel source:
SOFTWARE REQUIREMENTS SOFTWARE REQUIREMENTS
Compiling and running the 2.6.xx kernels requires up-to-date Compiling and running the 3.x kernels requires up-to-date
versions of various software packages. Consult versions of various software packages. Consult
Documentation/Changes for the minimum version numbers required Documentation/Changes for the minimum version numbers required
and how to get updates for these packages. Beware that using and how to get updates for these packages. Beware that using
@ -142,11 +142,11 @@ BUILD directory for the kernel:
Using the option "make O=output/dir" allow you to specify an alternate Using the option "make O=output/dir" allow you to specify an alternate
place for the output files (including .config). place for the output files (including .config).
Example: Example:
kernel source code: /usr/src/linux-2.6.N kernel source code: /usr/src/linux-3.N
build directory: /home/name/build/kernel build directory: /home/name/build/kernel
To configure and build the kernel use: To configure and build the kernel use:
cd /usr/src/linux-2.6.N cd /usr/src/linux-3.N
make O=/home/name/build/kernel menuconfig make O=/home/name/build/kernel menuconfig
make O=/home/name/build/kernel make O=/home/name/build/kernel
sudo make O=/home/name/build/kernel modules_install install sudo make O=/home/name/build/kernel modules_install install

View file

@ -56,7 +56,6 @@ PLAT_NODE_DATA_LOCALNR(unsigned long p, int n)
* Given a kernel address, find the home node of the underlying memory. * Given a kernel address, find the home node of the underlying memory.
*/ */
#define kvaddr_to_nid(kaddr) pa_to_nid(__pa(kaddr)) #define kvaddr_to_nid(kaddr) pa_to_nid(__pa(kaddr))
#define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
/* /*
* Given a kaddr, LOCAL_BASE_ADDR finds the owning node of the memory * Given a kaddr, LOCAL_BASE_ADDR finds the owning node of the memory

View file

@ -409,7 +409,7 @@ SYSCALL_DEFINE2(osf_getdomainname, char __user *, name, int, namelen)
return -EFAULT; return -EFAULT;
len = namelen; len = namelen;
if (namelen > 32) if (len > 32)
len = 32; len = 32;
down_read(&uts_sem); down_read(&uts_sem);
@ -594,7 +594,7 @@ SYSCALL_DEFINE3(osf_sysinfo, int, command, char __user *, buf, long, count)
down_read(&uts_sem); down_read(&uts_sem);
res = sysinfo_table[offset]; res = sysinfo_table[offset];
len = strlen(res)+1; len = strlen(res)+1;
if (len > count) if ((unsigned long)len > (unsigned long)count)
len = count; len = count;
if (copy_to_user(buf, res, len)) if (copy_to_user(buf, res, len))
err = -EFAULT; err = -EFAULT;
@ -649,7 +649,7 @@ SYSCALL_DEFINE5(osf_getsysinfo, unsigned long, op, void __user *, buffer,
return 1; return 1;
case GSI_GET_HWRPB: case GSI_GET_HWRPB:
if (nbytes < sizeof(*hwrpb)) if (nbytes > sizeof(*hwrpb))
return -EINVAL; return -EINVAL;
if (copy_to_user(buffer, hwrpb, nbytes) != 0) if (copy_to_user(buffer, hwrpb, nbytes) != 0)
return -EFAULT; return -EFAULT;
@ -1008,6 +1008,7 @@ SYSCALL_DEFINE4(osf_wait4, pid_t, pid, int __user *, ustatus, int, options,
{ {
struct rusage r; struct rusage r;
long ret, err; long ret, err;
unsigned int status = 0;
mm_segment_t old_fs; mm_segment_t old_fs;
if (!ur) if (!ur)
@ -1016,13 +1017,15 @@ SYSCALL_DEFINE4(osf_wait4, pid_t, pid, int __user *, ustatus, int, options,
old_fs = get_fs(); old_fs = get_fs();
set_fs (KERNEL_DS); set_fs (KERNEL_DS);
ret = sys_wait4(pid, ustatus, options, (struct rusage __user *) &r); ret = sys_wait4(pid, (unsigned int __user *) &status, options,
(struct rusage __user *) &r);
set_fs (old_fs); set_fs (old_fs);
if (!access_ok(VERIFY_WRITE, ur, sizeof(*ur))) if (!access_ok(VERIFY_WRITE, ur, sizeof(*ur)))
return -EFAULT; return -EFAULT;
err = 0; err = 0;
err |= put_user(status, ustatus);
err |= __put_user(r.ru_utime.tv_sec, &ur->ru_utime.tv_sec); err |= __put_user(r.ru_utime.tv_sec, &ur->ru_utime.tv_sec);
err |= __put_user(r.ru_utime.tv_usec, &ur->ru_utime.tv_usec); err |= __put_user(r.ru_utime.tv_usec, &ur->ru_utime.tv_usec);
err |= __put_user(r.ru_stime.tv_sec, &ur->ru_stime.tv_sec); err |= __put_user(r.ru_stime.tv_sec, &ur->ru_stime.tv_sec);

View file

@ -597,6 +597,8 @@ __common_mmu_cache_on:
sub pc, lr, r0, lsr #32 @ properly flush pipeline sub pc, lr, r0, lsr #32 @ properly flush pipeline
#endif #endif
#define PROC_ENTRY_SIZE (4*5)
/* /*
* Here follow the relocatable cache support functions for the * Here follow the relocatable cache support functions for the
* various processors. This is a generic hook for locating an * various processors. This is a generic hook for locating an
@ -624,7 +626,7 @@ call_cache_fn: adr r12, proc_types
ARM( addeq pc, r12, r3 ) @ call cache function ARM( addeq pc, r12, r3 ) @ call cache function
THUMB( addeq r12, r3 ) THUMB( addeq r12, r3 )
THUMB( moveq pc, r12 ) @ call cache function THUMB( moveq pc, r12 ) @ call cache function
add r12, r12, #4*5 add r12, r12, #PROC_ENTRY_SIZE
b 1b b 1b
/* /*
@ -691,9 +693,9 @@ proc_types:
.word 0x41069260 @ ARM926EJ-S (v5TEJ) .word 0x41069260 @ ARM926EJ-S (v5TEJ)
.word 0xff0ffff0 .word 0xff0ffff0
b __arm926ejs_mmu_cache_on W(b) __arm926ejs_mmu_cache_on
b __armv4_mmu_cache_off W(b) __armv4_mmu_cache_off
b __armv5tej_mmu_cache_flush W(b) __armv5tej_mmu_cache_flush
.word 0x00007000 @ ARM7 IDs .word 0x00007000 @ ARM7 IDs
.word 0x0000f000 .word 0x0000f000
@ -794,6 +796,16 @@ proc_types:
.size proc_types, . - proc_types .size proc_types, . - proc_types
/*
* If you get a "non-constant expression in ".if" statement"
* error from the assembler on this line, check that you have
* not accidentally written a "b" instruction where you should
* have written W(b).
*/
.if (. - proc_types) % PROC_ENTRY_SIZE != 0
.error "The size of one or more proc_types entries is wrong."
.endif
/* /*
* Turn off the Cache and MMU. ARMv3 does not support * Turn off the Cache and MMU. ARMv3 does not support
* reading the control register, but ARMv4 does. * reading the control register, but ARMv4 does.

View file

@ -255,7 +255,7 @@ static inline dma_addr_t map_single(struct device *dev, void *ptr, size_t size,
if (buf == 0) { if (buf == 0) {
dev_err(dev, "%s: unable to map unsafe buffer %p!\n", dev_err(dev, "%s: unable to map unsafe buffer %p!\n",
__func__, ptr); __func__, ptr);
return 0; return ~0;
} }
dev_dbg(dev, dev_dbg(dev,

View file

@ -157,7 +157,7 @@ CONFIG_LEDS_GPIO=m
CONFIG_LEDS_TRIGGERS=y CONFIG_LEDS_TRIGGERS=y
CONFIG_LEDS_TRIGGER_TIMER=m CONFIG_LEDS_TRIGGER_TIMER=m
CONFIG_LEDS_TRIGGER_HEARTBEAT=m CONFIG_LEDS_TRIGGER_HEARTBEAT=m
CONFIG_RTC_CLASS=m CONFIG_RTC_CLASS=y
CONFIG_EXT2_FS=y CONFIG_EXT2_FS=y
CONFIG_EXT3_FS=y CONFIG_EXT3_FS=y
CONFIG_XFS_FS=m CONFIG_XFS_FS=m

View file

@ -60,7 +60,7 @@ CONFIG_FB_ARMCLCD=y
# CONFIG_VGA_CONSOLE is not set # CONFIG_VGA_CONSOLE is not set
CONFIG_FRAMEBUFFER_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_LOGO=y CONFIG_LOGO=y
CONFIG_RTC_CLASS=m CONFIG_RTC_CLASS=y
CONFIG_INOTIFY=y CONFIG_INOTIFY=y
CONFIG_TMPFS=y CONFIG_TMPFS=y
CONFIG_JFFS2_FS=y CONFIG_JFFS2_FS=y

View file

@ -142,7 +142,7 @@ CONFIG_USB_GADGETFS=m
CONFIG_USB_FILE_STORAGE=m CONFIG_USB_FILE_STORAGE=m
CONFIG_USB_G_SERIAL=m CONFIG_USB_G_SERIAL=m
CONFIG_USB_G_PRINTER=m CONFIG_USB_G_PRINTER=m
CONFIG_RTC_CLASS=m CONFIG_RTC_CLASS=y
CONFIG_RTC_DRV_DS1307=m CONFIG_RTC_DRV_DS1307=m
CONFIG_RTC_DRV_SA1100=m CONFIG_RTC_DRV_SA1100=m
CONFIG_EXT2_FS=m CONFIG_EXT2_FS=m

View file

@ -73,7 +73,7 @@ CONFIG_SENSORS_MAX6650=m
# CONFIG_VGA_CONSOLE is not set # CONFIG_VGA_CONSOLE is not set
# CONFIG_HID_SUPPORT is not set # CONFIG_HID_SUPPORT is not set
# CONFIG_USB_SUPPORT is not set # CONFIG_USB_SUPPORT is not set
CONFIG_RTC_CLASS=m CONFIG_RTC_CLASS=y
CONFIG_RTC_DRV_SA1100=m CONFIG_RTC_DRV_SA1100=m
CONFIG_DMADEVICES=y CONFIG_DMADEVICES=y
# CONFIG_DNOTIFY is not set # CONFIG_DNOTIFY is not set

View file

@ -158,7 +158,7 @@ CONFIG_LEDS_TRIGGER_HEARTBEAT=m
CONFIG_LEDS_TRIGGER_BACKLIGHT=m CONFIG_LEDS_TRIGGER_BACKLIGHT=m
CONFIG_LEDS_TRIGGER_GPIO=m CONFIG_LEDS_TRIGGER_GPIO=m
CONFIG_LEDS_TRIGGER_DEFAULT_ON=m CONFIG_LEDS_TRIGGER_DEFAULT_ON=m
CONFIG_RTC_CLASS=m CONFIG_RTC_CLASS=y
CONFIG_RTC_DRV_ISL1208=m CONFIG_RTC_DRV_ISL1208=m
CONFIG_RTC_DRV_PXA=m CONFIG_RTC_DRV_PXA=m
CONFIG_EXT2_FS=y CONFIG_EXT2_FS=y

View file

@ -13,6 +13,9 @@
* Do not include any C declarations in this file - it is included by * Do not include any C declarations in this file - it is included by
* assembler source. * assembler source.
*/ */
#ifndef __ASM_ASSEMBLER_H__
#define __ASM_ASSEMBLER_H__
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
#error "Only include this from assembly code" #error "Only include this from assembly code"
#endif #endif
@ -290,3 +293,4 @@
.macro ldrusr, reg, ptr, inc, cond=al, rept=1, abort=9001f .macro ldrusr, reg, ptr, inc, cond=al, rept=1, abort=9001f
usracc ldr, \reg, \ptr, \inc, \cond, \rept, \abort usracc ldr, \reg, \ptr, \inc, \cond, \rept, \abort
.endm .endm
#endif /* __ASM_ASSEMBLER_H__ */

View file

@ -1,3 +1,5 @@
#include <asm/assembler.h>
/* /*
* Interrupt handling. Preserves r7, r8, r9 * Interrupt handling. Preserves r7, r8, r9
*/ */

View file

@ -76,6 +76,9 @@ struct machine_desc * __init setup_machine_fdt(unsigned int dt_phys)
unsigned long dt_root; unsigned long dt_root;
const char *model; const char *model;
if (!dt_phys)
return NULL;
devtree = phys_to_virt(dt_phys); devtree = phys_to_virt(dt_phys);
/* check device tree validity */ /* check device tree validity */

View file

@ -435,6 +435,10 @@ __irq_usr:
usr_entry usr_entry
kuser_cmpxchg_check kuser_cmpxchg_check
#ifdef CONFIG_IRQSOFF_TRACER
bl trace_hardirqs_off
#endif
get_thread_info tsk get_thread_info tsk
#ifdef CONFIG_PREEMPT #ifdef CONFIG_PREEMPT
ldr r8, [tsk, #TI_PREEMPT] @ get preempt count ldr r8, [tsk, #TI_PREEMPT] @ get preempt count
@ -453,7 +457,7 @@ __irq_usr:
#endif #endif
mov why, #0 mov why, #0
b ret_to_user b ret_to_user_from_irq
UNWIND(.fnend ) UNWIND(.fnend )
ENDPROC(__irq_usr) ENDPROC(__irq_usr)

View file

@ -64,6 +64,7 @@ work_resched:
ENTRY(ret_to_user) ENTRY(ret_to_user)
ret_slow_syscall: ret_slow_syscall:
disable_irq @ disable interrupts disable_irq @ disable interrupts
ENTRY(ret_to_user_from_irq)
ldr r1, [tsk, #TI_FLAGS] ldr r1, [tsk, #TI_FLAGS]
tst r1, #_TIF_WORK_MASK tst r1, #_TIF_WORK_MASK
bne work_pending bne work_pending
@ -75,6 +76,7 @@ no_work_pending:
arch_ret_to_user r1, lr arch_ret_to_user r1, lr
restore_user_regs fast = 0, offset = 0 restore_user_regs fast = 0, offset = 0
ENDPROC(ret_to_user_from_irq)
ENDPROC(ret_to_user) ENDPROC(ret_to_user)
/* /*

View file

@ -193,8 +193,17 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex,
offset -= 0x02000000; offset -= 0x02000000;
offset += sym->st_value - loc; offset += sym->st_value - loc;
/* only Thumb addresses allowed (no interworking) */ /*
if (!(offset & 1) || * For function symbols, only Thumb addresses are
* allowed (no interworking).
*
* For non-function symbols, the destination
* has no specific ARM/Thumb disposition, so
* the branch is resolved under the assumption
* that interworking is not required.
*/
if ((ELF32_ST_TYPE(sym->st_info) == STT_FUNC &&
!(offset & 1)) ||
offset <= (s32)0xff000000 || offset <= (s32)0xff000000 ||
offset >= (s32)0x01000000) { offset >= (s32)0x01000000) {
pr_err("%s: section %u reloc %u sym '%s': relocation %u out of range (%#lx -> %#x)\n", pr_err("%s: section %u reloc %u sym '%s': relocation %u out of range (%#lx -> %#x)\n",

View file

@ -583,7 +583,7 @@ static int armpmu_event_init(struct perf_event *event)
static void armpmu_enable(struct pmu *pmu) static void armpmu_enable(struct pmu *pmu)
{ {
/* Enable all of the perf events on hardware. */ /* Enable all of the perf events on hardware. */
int idx; int idx, enabled = 0;
struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events); struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events);
if (!armpmu) if (!armpmu)
@ -596,9 +596,11 @@ static void armpmu_enable(struct pmu *pmu)
continue; continue;
armpmu->enable(&event->hw, idx); armpmu->enable(&event->hw, idx);
enabled = 1;
} }
armpmu->start(); if (enabled)
armpmu->start();
} }
static void armpmu_disable(struct pmu *pmu) static void armpmu_disable(struct pmu *pmu)

View file

@ -73,6 +73,7 @@ __setup("fpe=", fpe_setup);
#endif #endif
extern void paging_init(struct machine_desc *desc); extern void paging_init(struct machine_desc *desc);
extern void sanity_check_meminfo(void);
extern void reboot_setup(char *str); extern void reboot_setup(char *str);
unsigned int processor_id; unsigned int processor_id;
@ -900,6 +901,7 @@ void __init setup_arch(char **cmdline_p)
parse_early_param(); parse_early_param();
sanity_check_meminfo();
arm_memblock_init(&meminfo, mdesc); arm_memblock_init(&meminfo, mdesc);
paging_init(mdesc); paging_init(mdesc);

View file

@ -318,9 +318,13 @@ asmlinkage void __cpuinit secondary_start_kernel(void)
smp_store_cpu_info(cpu); smp_store_cpu_info(cpu);
/* /*
* OK, now it's safe to let the boot CPU continue * OK, now it's safe to let the boot CPU continue. Wait for
* the CPU migration code to notice that the CPU is online
* before we continue.
*/ */
set_cpu_online(cpu, true); set_cpu_online(cpu, true);
while (!cpu_active(cpu))
cpu_relax();
/* /*
* OK, it's off to the idle thread for us * OK, it's off to the idle thread for us

View file

@ -115,7 +115,7 @@ static void __cpuinit twd_calibrate_rate(void)
twd_timer_rate = (0xFFFFFFFFU - count) * (HZ / 5); twd_timer_rate = (0xFFFFFFFFU - count) * (HZ / 5);
printk("%lu.%02luMHz.\n", twd_timer_rate / 1000000, printk("%lu.%02luMHz.\n", twd_timer_rate / 1000000,
(twd_timer_rate / 1000000) % 100); (twd_timer_rate / 10000) % 100);
} }
} }

View file

@ -139,7 +139,7 @@ static void dump_instr(const char *lvl, struct pt_regs *regs)
fs = get_fs(); fs = get_fs();
set_fs(KERNEL_DS); set_fs(KERNEL_DS);
for (i = -4; i < 1; i++) { for (i = -4; i < 1 + !!thumb; i++) {
unsigned int val, bad; unsigned int val, bad;
if (thumb) if (thumb)
@ -563,7 +563,7 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs)
if (!pmd_present(*pmd)) if (!pmd_present(*pmd))
goto bad_access; goto bad_access;
pte = pte_offset_map_lock(mm, pmd, addr, &ptl); pte = pte_offset_map_lock(mm, pmd, addr, &ptl);
if (!pte_present(*pte) || !pte_dirty(*pte)) { if (!pte_present(*pte) || !pte_write(*pte) || !pte_dirty(*pte)) {
pte_unmap_unlock(pte, ptl); pte_unmap_unlock(pte, ptl);
goto bad_access; goto bad_access;
} }

View file

@ -223,15 +223,15 @@ static struct clk *periph_clocks[] __initdata = {
}; };
static struct clk_lookup periph_clocks_lookups[] = { static struct clk_lookup periph_clocks_lookups[] = {
CLKDEV_CON_DEV_ID("hclk", "atmel_usba_udc.0", &utmi_clk), CLKDEV_CON_DEV_ID("hclk", "atmel_usba_udc", &utmi_clk),
CLKDEV_CON_DEV_ID("pclk", "atmel_usba_udc.0", &udphs_clk), CLKDEV_CON_DEV_ID("pclk", "atmel_usba_udc", &udphs_clk),
CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.0", &mmc0_clk), CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.0", &mmc0_clk),
CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.1", &mmc1_clk), CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.1", &mmc1_clk),
CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk), CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk),
CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk), CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk),
CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tcb_clk), CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tcb_clk),
CLKDEV_CON_DEV_ID("ssc", "ssc.0", &ssc0_clk), CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk),
CLKDEV_CON_DEV_ID("ssc", "ssc.1", &ssc1_clk), CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk),
}; };
static struct clk_lookup usart_clocks_lookups[] = { static struct clk_lookup usart_clocks_lookups[] = {

View file

@ -1220,7 +1220,7 @@ void __init at91_set_serial_console(unsigned portnr)
{ {
if (portnr < ATMEL_MAX_UART) { if (portnr < ATMEL_MAX_UART) {
atmel_default_console_device = at91_uarts[portnr]; atmel_default_console_device = at91_uarts[portnr];
at91cap9_set_console_clock(portnr); at91cap9_set_console_clock(at91_uarts[portnr]->id);
} }
} }

View file

@ -199,9 +199,9 @@ static struct clk_lookup periph_clocks_lookups[] = {
CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.1", &tc3_clk), CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.1", &tc3_clk),
CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.1", &tc4_clk), CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.1", &tc4_clk),
CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.1", &tc5_clk), CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.1", &tc5_clk),
CLKDEV_CON_DEV_ID("ssc", "ssc.0", &ssc0_clk), CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk),
CLKDEV_CON_DEV_ID("ssc", "ssc.1", &ssc1_clk), CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk),
CLKDEV_CON_DEV_ID("ssc", "ssc.2", &ssc2_clk), CLKDEV_CON_DEV_ID("pclk", "ssc.2", &ssc2_clk),
}; };
static struct clk_lookup usart_clocks_lookups[] = { static struct clk_lookup usart_clocks_lookups[] = {

View file

@ -1135,7 +1135,7 @@ void __init at91_set_serial_console(unsigned portnr)
{ {
if (portnr < ATMEL_MAX_UART) { if (portnr < ATMEL_MAX_UART) {
atmel_default_console_device = at91_uarts[portnr]; atmel_default_console_device = at91_uarts[portnr];
at91rm9200_set_console_clock(portnr); at91rm9200_set_console_clock(at91_uarts[portnr]->id);
} }
} }

View file

@ -1173,7 +1173,7 @@ void __init at91_set_serial_console(unsigned portnr)
{ {
if (portnr < ATMEL_MAX_UART) { if (portnr < ATMEL_MAX_UART) {
atmel_default_console_device = at91_uarts[portnr]; atmel_default_console_device = at91_uarts[portnr];
at91sam9260_set_console_clock(portnr); at91sam9260_set_console_clock(at91_uarts[portnr]->id);
} }
} }

View file

@ -1013,7 +1013,7 @@ void __init at91_set_serial_console(unsigned portnr)
{ {
if (portnr < ATMEL_MAX_UART) { if (portnr < ATMEL_MAX_UART) {
atmel_default_console_device = at91_uarts[portnr]; atmel_default_console_device = at91_uarts[portnr];
at91sam9261_set_console_clock(portnr); at91sam9261_set_console_clock(at91_uarts[portnr]->id);
} }
} }

View file

@ -1395,7 +1395,7 @@ void __init at91_set_serial_console(unsigned portnr)
{ {
if (portnr < ATMEL_MAX_UART) { if (portnr < ATMEL_MAX_UART) {
atmel_default_console_device = at91_uarts[portnr]; atmel_default_console_device = at91_uarts[portnr];
at91sam9263_set_console_clock(portnr); at91sam9263_set_console_clock(at91_uarts[portnr]->id);
} }
} }

View file

@ -217,11 +217,11 @@ static struct clk *periph_clocks[] __initdata = {
static struct clk_lookup periph_clocks_lookups[] = { static struct clk_lookup periph_clocks_lookups[] = {
/* One additional fake clock for ohci */ /* One additional fake clock for ohci */
CLKDEV_CON_ID("ohci_clk", &uhphs_clk), CLKDEV_CON_ID("ohci_clk", &uhphs_clk),
CLKDEV_CON_DEV_ID("ehci_clk", "atmel-ehci.0", &uhphs_clk), CLKDEV_CON_DEV_ID("ehci_clk", "atmel-ehci", &uhphs_clk),
CLKDEV_CON_DEV_ID("hclk", "atmel_usba_udc.0", &utmi_clk), CLKDEV_CON_DEV_ID("hclk", "atmel_usba_udc", &utmi_clk),
CLKDEV_CON_DEV_ID("pclk", "atmel_usba_udc.0", &udphs_clk), CLKDEV_CON_DEV_ID("pclk", "atmel_usba_udc", &udphs_clk),
CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.0", &mmc0_clk), CLKDEV_CON_DEV_ID("mci_clk", "atmel_mci.0", &mmc0_clk),
CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.1", &mmc1_clk), CLKDEV_CON_DEV_ID("mci_clk", "atmel_mci.1", &mmc1_clk),
CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk), CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk),
CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk), CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk),
CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tcb0_clk), CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tcb0_clk),

View file

@ -1550,7 +1550,7 @@ void __init at91_set_serial_console(unsigned portnr)
{ {
if (portnr < ATMEL_MAX_UART) { if (portnr < ATMEL_MAX_UART) {
atmel_default_console_device = at91_uarts[portnr]; atmel_default_console_device = at91_uarts[portnr];
at91sam9g45_set_console_clock(portnr); at91sam9g45_set_console_clock(at91_uarts[portnr]->id);
} }
} }

View file

@ -191,8 +191,8 @@ static struct clk *periph_clocks[] __initdata = {
}; };
static struct clk_lookup periph_clocks_lookups[] = { static struct clk_lookup periph_clocks_lookups[] = {
CLKDEV_CON_DEV_ID("hclk", "atmel_usba_udc.0", &utmi_clk), CLKDEV_CON_DEV_ID("hclk", "atmel_usba_udc", &utmi_clk),
CLKDEV_CON_DEV_ID("pclk", "atmel_usba_udc.0", &udphs_clk), CLKDEV_CON_DEV_ID("pclk", "atmel_usba_udc", &udphs_clk),
CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tc0_clk), CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tc0_clk),
CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.0", &tc1_clk), CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.0", &tc1_clk),
CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.0", &tc2_clk), CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.0", &tc2_clk),

View file

@ -1168,7 +1168,7 @@ void __init at91_set_serial_console(unsigned portnr)
{ {
if (portnr < ATMEL_MAX_UART) { if (portnr < ATMEL_MAX_UART) {
atmel_default_console_device = at91_uarts[portnr]; atmel_default_console_device = at91_uarts[portnr];
at91sam9rl_set_console_clock(portnr); at91sam9rl_set_console_clock(at91_uarts[portnr]->id);
} }
} }

View file

@ -215,7 +215,7 @@ static void __init cap9adk_add_device_nand(void)
csa = at91_sys_read(AT91_MATRIX_EBICSA); csa = at91_sys_read(AT91_MATRIX_EBICSA);
at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_EBI_VDDIOMSEL_3_3V); at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_EBI_VDDIOMSEL_3_3V);
cap9adk_nand_data.bus_width_16 = !board_have_nand_8bit(); cap9adk_nand_data.bus_width_16 = board_have_nand_16bit();
/* setup bus-width (8 or 16) */ /* setup bus-width (8 or 16) */
if (cap9adk_nand_data.bus_width_16) if (cap9adk_nand_data.bus_width_16)
cap9adk_nand_smc_config.mode |= AT91_SMC_DBW_16; cap9adk_nand_smc_config.mode |= AT91_SMC_DBW_16;

View file

@ -214,7 +214,7 @@ static struct sam9_smc_config __initdata ek_nand_smc_config = {
static void __init ek_add_device_nand(void) static void __init ek_add_device_nand(void)
{ {
ek_nand_data.bus_width_16 = !board_have_nand_8bit(); ek_nand_data.bus_width_16 = board_have_nand_16bit();
/* setup bus-width (8 or 16) */ /* setup bus-width (8 or 16) */
if (ek_nand_data.bus_width_16) if (ek_nand_data.bus_width_16)
ek_nand_smc_config.mode |= AT91_SMC_DBW_16; ek_nand_smc_config.mode |= AT91_SMC_DBW_16;

View file

@ -220,7 +220,7 @@ static struct sam9_smc_config __initdata ek_nand_smc_config = {
static void __init ek_add_device_nand(void) static void __init ek_add_device_nand(void)
{ {
ek_nand_data.bus_width_16 = !board_have_nand_8bit(); ek_nand_data.bus_width_16 = board_have_nand_16bit();
/* setup bus-width (8 or 16) */ /* setup bus-width (8 or 16) */
if (ek_nand_data.bus_width_16) if (ek_nand_data.bus_width_16)
ek_nand_smc_config.mode |= AT91_SMC_DBW_16; ek_nand_smc_config.mode |= AT91_SMC_DBW_16;

View file

@ -221,7 +221,7 @@ static struct sam9_smc_config __initdata ek_nand_smc_config = {
static void __init ek_add_device_nand(void) static void __init ek_add_device_nand(void)
{ {
ek_nand_data.bus_width_16 = !board_have_nand_8bit(); ek_nand_data.bus_width_16 = board_have_nand_16bit();
/* setup bus-width (8 or 16) */ /* setup bus-width (8 or 16) */
if (ek_nand_data.bus_width_16) if (ek_nand_data.bus_width_16)
ek_nand_smc_config.mode |= AT91_SMC_DBW_16; ek_nand_smc_config.mode |= AT91_SMC_DBW_16;

View file

@ -198,7 +198,7 @@ static struct sam9_smc_config __initdata ek_nand_smc_config = {
static void __init ek_add_device_nand(void) static void __init ek_add_device_nand(void)
{ {
ek_nand_data.bus_width_16 = !board_have_nand_8bit(); ek_nand_data.bus_width_16 = board_have_nand_16bit();
/* setup bus-width (8 or 16) */ /* setup bus-width (8 or 16) */
if (ek_nand_data.bus_width_16) if (ek_nand_data.bus_width_16)
ek_nand_smc_config.mode |= AT91_SMC_DBW_16; ek_nand_smc_config.mode |= AT91_SMC_DBW_16;

View file

@ -178,7 +178,7 @@ static struct sam9_smc_config __initdata ek_nand_smc_config = {
static void __init ek_add_device_nand(void) static void __init ek_add_device_nand(void)
{ {
ek_nand_data.bus_width_16 = !board_have_nand_8bit(); ek_nand_data.bus_width_16 = board_have_nand_16bit();
/* setup bus-width (8 or 16) */ /* setup bus-width (8 or 16) */
if (ek_nand_data.bus_width_16) if (ek_nand_data.bus_width_16)
ek_nand_smc_config.mode |= AT91_SMC_DBW_16; ek_nand_smc_config.mode |= AT91_SMC_DBW_16;

View file

@ -13,13 +13,13 @@
* the 16-31 bit are reserved for at91 generic information * the 16-31 bit are reserved for at91 generic information
* *
* bit 31: * bit 31:
* 0 => nand 16 bit * 0 => nand 8 bit
* 1 => nand 8 bit * 1 => nand 16 bit
*/ */
#define BOARD_HAVE_NAND_8BIT (1 << 31) #define BOARD_HAVE_NAND_16BIT (1 << 31)
static int inline board_have_nand_8bit(void) static inline int board_have_nand_16bit(void)
{ {
return system_rev & BOARD_HAVE_NAND_8BIT; return system_rev & BOARD_HAVE_NAND_16BIT;
} }
#endif /* __ARCH_SYSTEM_REV_H__ */ #endif /* __ARCH_SYSTEM_REV_H__ */

View file

@ -494,7 +494,7 @@ static struct platform_device da850_mcasp_device = {
.resource = da850_mcasp_resources, .resource = da850_mcasp_resources,
}; };
struct platform_device davinci_pcm_device = { static struct platform_device davinci_pcm_device = {
.name = "davinci-pcm-audio", .name = "davinci-pcm-audio",
.id = -1, .id = -1,
}; };

View file

@ -298,7 +298,7 @@ static void davinci_init_wdt(void)
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
struct platform_device davinci_pcm_device = { static struct platform_device davinci_pcm_device = {
.name = "davinci-pcm-audio", .name = "davinci-pcm-audio",
.id = -1, .id = -1,
}; };

View file

@ -252,9 +252,11 @@ static struct irq_chip gpio_irqchip = {
static void static void
gpio_irq_handler(unsigned irq, struct irq_desc *desc) gpio_irq_handler(unsigned irq, struct irq_desc *desc)
{ {
struct davinci_gpio_regs __iomem *g = irq2regs(irq); struct davinci_gpio_regs __iomem *g;
u32 mask = 0xffff; u32 mask = 0xffff;
g = (__force struct davinci_gpio_regs __iomem *) irq_desc_get_handler_data(desc);
/* we only care about one bank */ /* we only care about one bank */
if (irq & 1) if (irq & 1)
mask <<= 16; mask <<= 16;
@ -422,8 +424,7 @@ static int __init davinci_gpio_irq_setup(void)
/* set up all irqs in this bank */ /* set up all irqs in this bank */
irq_set_chained_handler(bank_irq, gpio_irq_handler); irq_set_chained_handler(bank_irq, gpio_irq_handler);
irq_set_chip_data(bank_irq, (__force void *)g); irq_set_handler_data(bank_irq, (__force void *)g);
irq_set_handler_data(bank_irq, (void *)irq);
for (i = 0; i < 16 && gpio < ngpio; i++, irq++, gpio++) { for (i = 0; i < 16 && gpio < ngpio; i++, irq++, gpio++) {
irq_set_chip(irq, &gpio_irqchip); irq_set_chip(irq, &gpio_irqchip);

View file

@ -251,9 +251,9 @@ static void ep93xx_uart_set_mctrl(struct amba_device *dev,
unsigned int mcr; unsigned int mcr;
mcr = 0; mcr = 0;
if (!(mctrl & TIOCM_RTS)) if (mctrl & TIOCM_RTS)
mcr |= 2; mcr |= 2;
if (!(mctrl & TIOCM_DTR)) if (mctrl & TIOCM_DTR)
mcr |= 1; mcr |= 1;
__raw_writel(mcr, base + EP93XX_UART_MCR_OFFSET); __raw_writel(mcr, base + EP93XX_UART_MCR_OFFSET);
@ -402,11 +402,15 @@ static struct resource ep93xx_eth_resource[] = {
} }
}; };
static u64 ep93xx_eth_dma_mask = DMA_BIT_MASK(32);
static struct platform_device ep93xx_eth_device = { static struct platform_device ep93xx_eth_device = {
.name = "ep93xx-eth", .name = "ep93xx-eth",
.id = -1, .id = -1,
.dev = { .dev = {
.platform_data = &ep93xx_eth_data, .platform_data = &ep93xx_eth_data,
.coherent_dma_mask = DMA_BIT_MASK(32),
.dma_mask = &ep93xx_eth_dma_mask,
}, },
.num_resources = ARRAY_SIZE(ep93xx_eth_resource), .num_resources = ARRAY_SIZE(ep93xx_eth_resource),
.resource = ep93xx_eth_resource, .resource = ep93xx_eth_resource,

View file

@ -91,6 +91,11 @@ config EXYNOS4_SETUP_FIMC
help help
Common setup code for the camera interfaces. Common setup code for the camera interfaces.
config EXYNOS4_SETUP_USB_PHY
bool
help
Common setup code for USB PHY controller
# machine support # machine support
menu "EXYNOS4 Machines" menu "EXYNOS4 Machines"
@ -176,6 +181,7 @@ config MACH_NURI
select EXYNOS4_SETUP_I2C3 select EXYNOS4_SETUP_I2C3
select EXYNOS4_SETUP_I2C5 select EXYNOS4_SETUP_I2C5
select EXYNOS4_SETUP_SDHCI select EXYNOS4_SETUP_SDHCI
select EXYNOS4_SETUP_USB_PHY
select SAMSUNG_DEV_PWM select SAMSUNG_DEV_PWM
help help
Machine support for Samsung Mobile NURI Board. Machine support for Samsung Mobile NURI Board.

View file

@ -56,4 +56,4 @@ obj-$(CONFIG_EXYNOS4_SETUP_KEYPAD) += setup-keypad.o
obj-$(CONFIG_EXYNOS4_SETUP_SDHCI) += setup-sdhci.o obj-$(CONFIG_EXYNOS4_SETUP_SDHCI) += setup-sdhci.o
obj-$(CONFIG_EXYNOS4_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o obj-$(CONFIG_EXYNOS4_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o
obj-$(CONFIG_USB_SUPPORT) += usb-phy.o obj-$(CONFIG_EXYNOS4_SETUP_USB_PHY) += setup-usb-phy.o

View file

@ -23,6 +23,7 @@
#include <plat/sdhci.h> #include <plat/sdhci.h>
#include <plat/devs.h> #include <plat/devs.h>
#include <plat/fimc-core.h> #include <plat/fimc-core.h>
#include <plat/iic-core.h>
#include <mach/regs-irq.h> #include <mach/regs-irq.h>
@ -98,7 +99,7 @@ static struct map_desc exynos4_iodesc[] __initdata = {
.length = SZ_4K, .length = SZ_4K,
.type = MT_DEVICE, .type = MT_DEVICE,
}, { }, {
.virtual = (unsigned long)S5P_VA_USB_HSPHY, .virtual = (unsigned long)S3C_VA_USB_HSPHY,
.pfn = __phys_to_pfn(EXYNOS4_PA_HSPHY), .pfn = __phys_to_pfn(EXYNOS4_PA_HSPHY),
.length = SZ_4K, .length = SZ_4K,
.type = MT_DEVICE, .type = MT_DEVICE,
@ -132,6 +133,11 @@ void __init exynos4_map_io(void)
s3c_fimc_setname(1, "exynos4-fimc"); s3c_fimc_setname(1, "exynos4-fimc");
s3c_fimc_setname(2, "exynos4-fimc"); s3c_fimc_setname(2, "exynos4-fimc");
s3c_fimc_setname(3, "exynos4-fimc"); s3c_fimc_setname(3, "exynos4-fimc");
/* The I2C bus controllers are directly compatible with s3c2440 */
s3c_i2c0_setname("s3c2440-i2c");
s3c_i2c1_setname("s3c2440-i2c");
s3c_i2c2_setname("s3c2440-i2c");
} }
void __init exynos4_init_clocks(int xtal) void __init exynos4_init_clocks(int xtal)

View file

@ -330,7 +330,7 @@ struct platform_device exynos4_device_ac97 = {
static int exynos4_spdif_cfg_gpio(struct platform_device *pdev) static int exynos4_spdif_cfg_gpio(struct platform_device *pdev)
{ {
s3c_gpio_cfgpin_range(EXYNOS4_GPC1(0), 2, S3C_GPIO_SFN(3)); s3c_gpio_cfgpin_range(EXYNOS4_GPC1(0), 2, S3C_GPIO_SFN(4));
return 0; return 0;
} }

View file

@ -13,7 +13,7 @@
#include <linux/linkage.h> #include <linux/linkage.h>
#include <linux/init.h> #include <linux/init.h>
__INIT __CPUINIT
/* /*
* exynos4 specific entry point for secondary CPUs. This provides * exynos4 specific entry point for secondary CPUs. This provides

View file

@ -11,7 +11,7 @@
#ifndef __PLAT_S5P_REGS_USB_PHY_H #ifndef __PLAT_S5P_REGS_USB_PHY_H
#define __PLAT_S5P_REGS_USB_PHY_H #define __PLAT_S5P_REGS_USB_PHY_H
#define EXYNOS4_HSOTG_PHYREG(x) ((x) + S5P_VA_USB_HSPHY) #define EXYNOS4_HSOTG_PHYREG(x) ((x) + S3C_VA_USB_HSPHY)
#define EXYNOS4_PHYPWR EXYNOS4_HSOTG_PHYREG(0x00) #define EXYNOS4_PHYPWR EXYNOS4_HSOTG_PHYREG(0x00)
#define PHY1_HSIC_NORMAL_MASK (0xf << 9) #define PHY1_HSIC_NORMAL_MASK (0xf << 9)

View file

@ -35,6 +35,7 @@ void __init exynos4_common_init_uarts(struct s3c2410_uartcfg *cfg, int no)
tcfg->clocks = exynos4_serial_clocks; tcfg->clocks = exynos4_serial_clocks;
tcfg->clocks_size = ARRAY_SIZE(exynos4_serial_clocks); tcfg->clocks_size = ARRAY_SIZE(exynos4_serial_clocks);
} }
tcfg->flags |= NO_NEED_CHECK_CLKSRC;
} }
s3c24xx_init_uartdevs("s5pv210-uart", s5p_uart_resources, cfg, no); s3c24xx_init_uartdevs("s5pv210-uart", s5p_uart_resources, cfg, no);

View file

@ -78,9 +78,7 @@ static struct s3c2410_uartcfg smdkv310_uartcfgs[] __initdata = {
}; };
static struct s3c_sdhci_platdata smdkv310_hsmmc0_pdata __initdata = { static struct s3c_sdhci_platdata smdkv310_hsmmc0_pdata __initdata = {
.cd_type = S3C_SDHCI_CD_GPIO, .cd_type = S3C_SDHCI_CD_INTERNAL,
.ext_cd_gpio = EXYNOS4_GPK0(2),
.ext_cd_gpio_invert = 1,
.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL, .clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
#ifdef CONFIG_EXYNOS4_SDHCI_CH0_8BIT #ifdef CONFIG_EXYNOS4_SDHCI_CH0_8BIT
.max_width = 8, .max_width = 8,
@ -96,9 +94,7 @@ static struct s3c_sdhci_platdata smdkv310_hsmmc1_pdata __initdata = {
}; };
static struct s3c_sdhci_platdata smdkv310_hsmmc2_pdata __initdata = { static struct s3c_sdhci_platdata smdkv310_hsmmc2_pdata __initdata = {
.cd_type = S3C_SDHCI_CD_GPIO, .cd_type = S3C_SDHCI_CD_INTERNAL,
.ext_cd_gpio = EXYNOS4_GPK2(2),
.ext_cd_gpio_invert = 1,
.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL, .clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
#ifdef CONFIG_EXYNOS4_SDHCI_CH2_8BIT #ifdef CONFIG_EXYNOS4_SDHCI_CH2_8BIT
.max_width = 8, .max_width = 8,

View file

@ -206,6 +206,7 @@ static cycle_t exynos4_pwm4_read(struct clocksource *cs)
return (cycle_t) ~__raw_readl(S3C_TIMERREG(0x40)); return (cycle_t) ~__raw_readl(S3C_TIMERREG(0x40));
} }
#ifdef CONFIG_PM
static void exynos4_pwm4_resume(struct clocksource *cs) static void exynos4_pwm4_resume(struct clocksource *cs)
{ {
unsigned long pclk; unsigned long pclk;
@ -218,6 +219,7 @@ static void exynos4_pwm4_resume(struct clocksource *cs)
exynos4_pwm_init(4, ~0); exynos4_pwm_init(4, ~0);
exynos4_pwm_start(4, 1); exynos4_pwm_start(4, 1);
} }
#endif
struct clocksource pwm_clocksource = { struct clocksource pwm_clocksource = {
.name = "pwm_timer4", .name = "pwm_timer4",

View file

@ -103,6 +103,7 @@ static void __init footbridge_timer_init(void)
clockevents_calc_mult_shift(ce, mem_fclk_21285, 5); clockevents_calc_mult_shift(ce, mem_fclk_21285, 5);
ce->max_delta_ns = clockevent_delta2ns(0xffffff, ce); ce->max_delta_ns = clockevent_delta2ns(0xffffff, ce);
ce->min_delta_ns = clockevent_delta2ns(0x000004, ce); ce->min_delta_ns = clockevent_delta2ns(0x000004, ce);
ce->cpumask = cpumask_of(smp_processor_id());
clockevents_register_device(ce); clockevents_register_device(ce);
} }

View file

@ -26,6 +26,7 @@
#include <asm/hardware/debug-8250.S> #include <asm/hardware/debug-8250.S>
#else #else
#include <mach/hardware.h>
/* For EBSA285 debugging */ /* For EBSA285 debugging */
.equ dc21285_high, ARMCSR_BASE & 0xff000000 .equ dc21285_high, ARMCSR_BASE & 0xff000000
.equ dc21285_low, ARMCSR_BASE & 0x00ffffff .equ dc21285_low, ARMCSR_BASE & 0x00ffffff
@ -36,8 +37,8 @@
.else .else
mov \rp, #0 mov \rp, #0
.endif .endif
orr \rv, \rp, #0x42000000 orr \rv, \rp, #dc21285_high
orr \rp, \rp, #dc21285_high orr \rp, \rp, #0x42000000
.endm .endm
.macro senduart,rd,rx .macro senduart,rd,rx

View file

@ -6,12 +6,14 @@ config ARCH_H7201
bool "gms30c7201" bool "gms30c7201"
depends on ARCH_H720X depends on ARCH_H720X
select CPU_H7201 select CPU_H7201
select ZONE_DMA
help help
Say Y here if you are using the Hynix GMS30C7201 Reference Board Say Y here if you are using the Hynix GMS30C7201 Reference Board
config ARCH_H7202 config ARCH_H7202
bool "hms30c7202" bool "hms30c7202"
select CPU_H7202 select CPU_H7202
select ZONE_DMA
depends on ARCH_H720X depends on ARCH_H720X
help help
Say Y here if you are using the Hynix HMS30C7202 Reference Board Say Y here if you are using the Hynix HMS30C7202 Reference Board

View file

@ -23,6 +23,8 @@
#include <linux/io.h> #include <linux/io.h>
#include <asm/mach/time.h> #include <asm/mach/time.h>
#include <asm/hardware/gic.h>
#include <mach/msm_iomap.h> #include <mach/msm_iomap.h>
#include <mach/cpu.h> #include <mach/cpu.h>
@ -55,10 +57,12 @@ enum timer_location {
#if defined(CONFIG_ARCH_QSD8X50) #if defined(CONFIG_ARCH_QSD8X50)
#define DGT_HZ (19200000 / 4) /* 19.2 MHz / 4 by default */ #define DGT_HZ (19200000 / 4) /* 19.2 MHz / 4 by default */
#define MSM_DGT_SHIFT (0) #define MSM_DGT_SHIFT (0)
#elif defined(CONFIG_ARCH_MSM7X30) || defined(CONFIG_ARCH_MSM8X60) || \ #elif defined(CONFIG_ARCH_MSM7X30)
defined(CONFIG_ARCH_MSM8960)
#define DGT_HZ (24576000 / 4) /* 24.576 MHz (LPXO) / 4 by default */ #define DGT_HZ (24576000 / 4) /* 24.576 MHz (LPXO) / 4 by default */
#define MSM_DGT_SHIFT (0) #define MSM_DGT_SHIFT (0)
#elif defined(CONFIG_ARCH_MSM8X60) || defined(CONFIG_ARCH_MSM8960)
#define DGT_HZ (27000000 / 4) /* 27 MHz (PXO) / 4 by default */
#define MSM_DGT_SHIFT (0)
#else #else
#define DGT_HZ 19200000 /* 19.2 MHz or 600 KHz after shift */ #define DGT_HZ 19200000 /* 19.2 MHz or 600 KHz after shift */
#define MSM_DGT_SHIFT (5) #define MSM_DGT_SHIFT (5)
@ -100,7 +104,11 @@ static cycle_t msm_read_timer_count(struct clocksource *cs)
{ {
struct msm_clock *clk = container_of(cs, struct msm_clock, clocksource); struct msm_clock *clk = container_of(cs, struct msm_clock, clocksource);
return readl(clk->global_counter); /*
* Shift timer count down by a constant due to unreliable lower bits
* on some targets.
*/
return readl(clk->global_counter) >> clk->shift;
} }
static struct msm_clock *clockevent_to_clock(struct clock_event_device *evt) static struct msm_clock *clockevent_to_clock(struct clock_event_device *evt)

View file

@ -16,6 +16,8 @@
#include <linux/err.h> #include <linux/err.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <asm/processor.h> /* for cpu_relax() */
#include <mach/mxs.h> #include <mach/mxs.h>
#define OCOTP_WORD_OFFSET 0x20 #define OCOTP_WORD_OFFSET 0x20

View file

@ -4,14 +4,14 @@
# Common support # Common support
obj-y := io.o id.o sram.o time.o irq.o mux.o flash.o serial.o devices.o dma.o obj-y := io.o id.o sram.o time.o irq.o mux.o flash.o serial.o devices.o dma.o
obj-y += clock.o clock_data.o opp_data.o reset.o obj-y += clock.o clock_data.o opp_data.o reset.o pm_bus.o
obj-$(CONFIG_OMAP_MCBSP) += mcbsp.o obj-$(CONFIG_OMAP_MCBSP) += mcbsp.o
obj-$(CONFIG_OMAP_32K_TIMER) += timer32k.o obj-$(CONFIG_OMAP_32K_TIMER) += timer32k.o
# Power Management # Power Management
obj-$(CONFIG_PM) += pm.o sleep.o pm_bus.o obj-$(CONFIG_PM) += pm.o sleep.o
# DSP # DSP
obj-$(CONFIG_OMAP_MBOX_FWK) += mailbox_mach.o obj-$(CONFIG_OMAP_MBOX_FWK) += mailbox_mach.o

View file

@ -215,7 +215,7 @@ static struct omap_kp_platform_data ams_delta_kp_data __initdata = {
.delay = 9, .delay = 9,
}; };
static struct platform_device ams_delta_kp_device __initdata = { static struct platform_device ams_delta_kp_device = {
.name = "omap-keypad", .name = "omap-keypad",
.id = -1, .id = -1,
.dev = { .dev = {
@ -225,12 +225,12 @@ static struct platform_device ams_delta_kp_device __initdata = {
.resource = ams_delta_kp_resources, .resource = ams_delta_kp_resources,
}; };
static struct platform_device ams_delta_lcd_device __initdata = { static struct platform_device ams_delta_lcd_device = {
.name = "lcd_ams_delta", .name = "lcd_ams_delta",
.id = -1, .id = -1,
}; };
static struct platform_device ams_delta_led_device __initdata = { static struct platform_device ams_delta_led_device = {
.name = "ams-delta-led", .name = "ams-delta-led",
.id = -1 .id = -1
}; };
@ -267,7 +267,7 @@ static struct soc_camera_link ams_delta_iclink = {
.power = ams_delta_camera_power, .power = ams_delta_camera_power,
}; };
static struct platform_device ams_delta_camera_device __initdata = { static struct platform_device ams_delta_camera_device = {
.name = "soc-camera-pdrv", .name = "soc-camera-pdrv",
.id = 0, .id = 0,
.dev = { .dev = {

View file

@ -41,7 +41,7 @@ static struct __initdata omap_gpio_platform_data omap15xx_mpu_gpio_config = {
.bank_stride = 1, .bank_stride = 1,
}; };
static struct __initdata platform_device omap15xx_mpu_gpio = { static struct platform_device omap15xx_mpu_gpio = {
.name = "omap_gpio", .name = "omap_gpio",
.id = 0, .id = 0,
.dev = { .dev = {
@ -70,7 +70,7 @@ static struct __initdata omap_gpio_platform_data omap15xx_gpio_config = {
.bank_width = 16, .bank_width = 16,
}; };
static struct __initdata platform_device omap15xx_gpio = { static struct platform_device omap15xx_gpio = {
.name = "omap_gpio", .name = "omap_gpio",
.id = 1, .id = 1,
.dev = { .dev = {

View file

@ -44,7 +44,7 @@ static struct __initdata omap_gpio_platform_data omap16xx_mpu_gpio_config = {
.bank_stride = 1, .bank_stride = 1,
}; };
static struct __initdata platform_device omap16xx_mpu_gpio = { static struct platform_device omap16xx_mpu_gpio = {
.name = "omap_gpio", .name = "omap_gpio",
.id = 0, .id = 0,
.dev = { .dev = {
@ -73,7 +73,7 @@ static struct __initdata omap_gpio_platform_data omap16xx_gpio1_config = {
.bank_width = 16, .bank_width = 16,
}; };
static struct __initdata platform_device omap16xx_gpio1 = { static struct platform_device omap16xx_gpio1 = {
.name = "omap_gpio", .name = "omap_gpio",
.id = 1, .id = 1,
.dev = { .dev = {
@ -102,7 +102,7 @@ static struct __initdata omap_gpio_platform_data omap16xx_gpio2_config = {
.bank_width = 16, .bank_width = 16,
}; };
static struct __initdata platform_device omap16xx_gpio2 = { static struct platform_device omap16xx_gpio2 = {
.name = "omap_gpio", .name = "omap_gpio",
.id = 2, .id = 2,
.dev = { .dev = {
@ -131,7 +131,7 @@ static struct __initdata omap_gpio_platform_data omap16xx_gpio3_config = {
.bank_width = 16, .bank_width = 16,
}; };
static struct __initdata platform_device omap16xx_gpio3 = { static struct platform_device omap16xx_gpio3 = {
.name = "omap_gpio", .name = "omap_gpio",
.id = 3, .id = 3,
.dev = { .dev = {
@ -160,7 +160,7 @@ static struct __initdata omap_gpio_platform_data omap16xx_gpio4_config = {
.bank_width = 16, .bank_width = 16,
}; };
static struct __initdata platform_device omap16xx_gpio4 = { static struct platform_device omap16xx_gpio4 = {
.name = "omap_gpio", .name = "omap_gpio",
.id = 4, .id = 4,
.dev = { .dev = {

View file

@ -46,7 +46,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_mpu_gpio_config = {
.bank_stride = 2, .bank_stride = 2,
}; };
static struct __initdata platform_device omap7xx_mpu_gpio = { static struct platform_device omap7xx_mpu_gpio = {
.name = "omap_gpio", .name = "omap_gpio",
.id = 0, .id = 0,
.dev = { .dev = {
@ -75,7 +75,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_gpio1_config = {
.bank_width = 32, .bank_width = 32,
}; };
static struct __initdata platform_device omap7xx_gpio1 = { static struct platform_device omap7xx_gpio1 = {
.name = "omap_gpio", .name = "omap_gpio",
.id = 1, .id = 1,
.dev = { .dev = {
@ -104,7 +104,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_gpio2_config = {
.bank_width = 32, .bank_width = 32,
}; };
static struct __initdata platform_device omap7xx_gpio2 = { static struct platform_device omap7xx_gpio2 = {
.name = "omap_gpio", .name = "omap_gpio",
.id = 2, .id = 2,
.dev = { .dev = {
@ -133,7 +133,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_gpio3_config = {
.bank_width = 32, .bank_width = 32,
}; };
static struct __initdata platform_device omap7xx_gpio3 = { static struct platform_device omap7xx_gpio3 = {
.name = "omap_gpio", .name = "omap_gpio",
.id = 3, .id = 3,
.dev = { .dev = {
@ -162,7 +162,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_gpio4_config = {
.bank_width = 32, .bank_width = 32,
}; };
static struct __initdata platform_device omap7xx_gpio4 = { static struct platform_device omap7xx_gpio4 = {
.name = "omap_gpio", .name = "omap_gpio",
.id = 4, .id = 4,
.dev = { .dev = {
@ -191,7 +191,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_gpio5_config = {
.bank_width = 32, .bank_width = 32,
}; };
static struct __initdata platform_device omap7xx_gpio5 = { static struct platform_device omap7xx_gpio5 = {
.name = "omap_gpio", .name = "omap_gpio",
.id = 5, .id = 5,
.dev = { .dev = {
@ -220,7 +220,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_gpio6_config = {
.bank_width = 32, .bank_width = 32,
}; };
static struct __initdata platform_device omap7xx_gpio6 = { static struct platform_device omap7xx_gpio6 = {
.name = "omap_gpio", .name = "omap_gpio",
.id = 6, .id = 6,
.dev = { .dev = {

View file

@ -56,9 +56,13 @@ static struct dev_power_domain default_power_domain = {
USE_PLATFORM_PM_SLEEP_OPS USE_PLATFORM_PM_SLEEP_OPS
}, },
}; };
#define OMAP1_PWR_DOMAIN (&default_power_domain)
#else
#define OMAP1_PWR_DOMAIN NULL
#endif /* CONFIG_PM_RUNTIME */
static struct pm_clk_notifier_block platform_bus_notifier = { static struct pm_clk_notifier_block platform_bus_notifier = {
.pwr_domain = &default_power_domain, .pwr_domain = OMAP1_PWR_DOMAIN,
.con_ids = { "ick", "fck", NULL, }, .con_ids = { "ick", "fck", NULL, },
}; };
@ -72,4 +76,4 @@ static int __init omap1_pm_runtime_init(void)
return 0; return 0;
} }
core_initcall(omap1_pm_runtime_init); core_initcall(omap1_pm_runtime_init);
#endif /* CONFIG_PM_RUNTIME */

View file

@ -84,7 +84,8 @@ static struct mtd_partition omap3pandora_nand_partitions[] = {
static struct omap_nand_platform_data pandora_nand_data = { static struct omap_nand_platform_data pandora_nand_data = {
.cs = 0, .cs = 0,
.devsize = 1, /* '0' for 8-bit, '1' for 16-bit device */ .devsize = NAND_BUSWIDTH_16,
.xfer_type = NAND_OMAP_PREFETCH_DMA,
.parts = omap3pandora_nand_partitions, .parts = omap3pandora_nand_partitions,
.nr_parts = ARRAY_SIZE(omap3pandora_nand_partitions), .nr_parts = ARRAY_SIZE(omap3pandora_nand_partitions),
}; };

View file

@ -558,7 +558,7 @@ static struct radio_si4713_platform_data rx51_si4713_data __initdata_or_module =
.subdev_board_info = &rx51_si4713_board_info, .subdev_board_info = &rx51_si4713_board_info,
}; };
static struct platform_device rx51_si4713_dev __initdata_or_module = { static struct platform_device rx51_si4713_dev = {
.name = "radio-si4713", .name = "radio-si4713",
.id = -1, .id = -1,
.dev = { .dev = {

View file

@ -189,7 +189,7 @@ static struct dentry *pm_dbg_dir;
static int pm_dbg_init_done; static int pm_dbg_init_done;
static int __init pm_dbg_init(void); static int pm_dbg_init(void);
enum { enum {
DEBUG_FILE_COUNTERS = 0, DEBUG_FILE_COUNTERS = 0,
@ -595,7 +595,7 @@ static int option_set(void *data, u64 val)
DEFINE_SIMPLE_ATTRIBUTE(pm_dbg_option_fops, option_get, option_set, "%llu\n"); DEFINE_SIMPLE_ATTRIBUTE(pm_dbg_option_fops, option_get, option_set, "%llu\n");
static int __init pm_dbg_init(void) static int pm_dbg_init(void)
{ {
int i; int i;
struct dentry *d; struct dentry *d;

View file

@ -14,6 +14,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/gpio.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/apm-emulation.h> #include <linux/apm-emulation.h>

View file

@ -10,7 +10,6 @@ obj-n :=
obj- := obj- :=
obj-$(CONFIG_CPU_S3C2410) += s3c2410.o obj-$(CONFIG_CPU_S3C2410) += s3c2410.o
obj-$(CONFIG_CPU_S3C2410) += irq.o
obj-$(CONFIG_CPU_S3C2410_DMA) += dma.o obj-$(CONFIG_CPU_S3C2410_DMA) += dma.o
obj-$(CONFIG_CPU_S3C2410_DMA) += dma.o obj-$(CONFIG_CPU_S3C2410_DMA) += dma.o
obj-$(CONFIG_S3C2410_PM) += pm.o sleep.o obj-$(CONFIG_S3C2410_PM) += pm.o sleep.o

View file

@ -1,34 +0,0 @@
/* linux/arch/arm/mach-s3c2410/irq.c
*
* Copyright (c) 2006 Simtec Electronics
* Ben Dooks <ben@simtec.co.uk>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#include <linux/init.h>
#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/ioport.h>
#include <linux/syscore_ops.h>
#include <plat/cpu.h>
#include <plat/pm.h>
struct syscore_ops s3c24xx_irq_syscore_ops = {
.suspend = s3c24xx_irq_suspend,
.resume = s3c24xx_irq_resume,
};

View file

@ -552,7 +552,7 @@ struct mini2440_features_t {
struct platform_device *optional[8]; struct platform_device *optional[8];
}; };
static void mini2440_parse_features( static void __init mini2440_parse_features(
struct mini2440_features_t * features, struct mini2440_features_t * features,
const char * features_str ) const char * features_str )
{ {

View file

@ -88,6 +88,7 @@ static struct s3c64xx_spi_info s3c64xx_spi0_pdata = {
.cfg_gpio = s3c64xx_spi_cfg_gpio, .cfg_gpio = s3c64xx_spi_cfg_gpio,
.fifo_lvl_mask = 0x7f, .fifo_lvl_mask = 0x7f,
.rx_lvl_offset = 13, .rx_lvl_offset = 13,
.tx_st_done = 21,
}; };
static u64 spi_dmamask = DMA_BIT_MASK(32); static u64 spi_dmamask = DMA_BIT_MASK(32);
@ -132,6 +133,7 @@ static struct s3c64xx_spi_info s3c64xx_spi1_pdata = {
.cfg_gpio = s3c64xx_spi_cfg_gpio, .cfg_gpio = s3c64xx_spi_cfg_gpio,
.fifo_lvl_mask = 0x7f, .fifo_lvl_mask = 0x7f,
.rx_lvl_offset = 13, .rx_lvl_offset = 13,
.tx_st_done = 21,
}; };
struct platform_device s3c64xx_device_spi1 = { struct platform_device s3c64xx_device_spi1 = {

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