Merge branch 'fbdev/stable-updates'

This commit is contained in:
Paul Mundt 2011-06-24 17:16:40 +09:00
commit 20733d59d5
363 changed files with 5148 additions and 2311 deletions

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

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

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: 2.6.40 When: 2.6.40
Why: Hareware scan is the prefer method for iwlwifi devices for Why: Hareware scan is the prefer method for iwlwifi devices for

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

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

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

@ -566,11 +566,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

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

@ -2291,8 +2291,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
@ -3819,6 +3818,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
@ -4144,7 +4149,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
@ -4889,7 +4894,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
@ -6097,7 +6102,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*
@ -6457,7 +6462,7 @@ 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 ISP116X DRIVER USB ISP116X DRIVER
@ -6716,6 +6721,14 @@ 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>
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
@ -6993,6 +7006,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 = -rc3 EXTRAVERSION = -rc4
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

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

@ -691,9 +691,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

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

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

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

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

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

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

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

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

@ -382,10 +382,8 @@ void ag5evm_sdhi1_set_pwr(struct platform_device *pdev, int state)
} }
static struct sh_mobile_sdhi_info sh_sdhi1_platdata = { static struct sh_mobile_sdhi_info sh_sdhi1_platdata = {
.dma_slave_tx = SHDMA_SLAVE_SDHI1_TX,
.dma_slave_rx = SHDMA_SLAVE_SDHI1_RX,
.tmio_flags = TMIO_MMC_WRPROTECT_DISABLE, .tmio_flags = TMIO_MMC_WRPROTECT_DISABLE,
.tmio_caps = MMC_CAP_NONREMOVABLE, .tmio_caps = MMC_CAP_NONREMOVABLE | MMC_CAP_SDIO_IRQ,
.tmio_ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, .tmio_ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
.set_pwr = ag5evm_sdhi1_set_pwr, .set_pwr = ag5evm_sdhi1_set_pwr,
}; };

View File

@ -126,7 +126,7 @@
* ------+--------------------+--------------------+------- * ------+--------------------+--------------------+-------
* IRQ0 | ICR1A.IRQ0SA=0010 | SDHI2 card detect | Low * IRQ0 | ICR1A.IRQ0SA=0010 | SDHI2 card detect | Low
* IRQ6 | ICR1A.IRQ6SA=0011 | Ether(LAN9220) | High * IRQ6 | ICR1A.IRQ6SA=0011 | Ether(LAN9220) | High
* IRQ7 | ICR1A.IRQ7SA=0010 | LCD Tuch Panel | Low * IRQ7 | ICR1A.IRQ7SA=0010 | LCD Touch Panel | Low
* IRQ8 | ICR2A.IRQ8SA=0010 | MMC/SD card detect | Low * IRQ8 | ICR2A.IRQ8SA=0010 | MMC/SD card detect | Low
* IRQ9 | ICR2A.IRQ9SA=0010 | KEY(TCA6408) | Low * IRQ9 | ICR2A.IRQ9SA=0010 | KEY(TCA6408) | Low
* IRQ21 | ICR4A.IRQ21SA=0011 | Sensor(ADXL345) | High * IRQ21 | ICR4A.IRQ21SA=0011 | Sensor(ADXL345) | High
@ -165,10 +165,10 @@
* USB1 can become Host by r8a66597, and become Function by renesas_usbhs. * USB1 can become Host by r8a66597, and become Function by renesas_usbhs.
* But don't select both drivers in same time. * But don't select both drivers in same time.
* These uses same IRQ number for request_irq(), and aren't supporting * These uses same IRQ number for request_irq(), and aren't supporting
* IRQF_SHARD / IORESOURCE_IRQ_SHAREABLE. * IRQF_SHARED / IORESOURCE_IRQ_SHAREABLE.
* *
* Actually these are old/new version of USB driver. * Actually these are old/new version of USB driver.
* This mean its register will be broken if it supports SHARD IRQ, * This mean its register will be broken if it supports shared IRQ,
*/ */
/* /*
@ -562,7 +562,121 @@ out:
clk_put(hdmi_ick); clk_put(hdmi_ick);
} }
/* USB1 (Host) */ /* USBHS0 is connected to CN22 which takes a USB Mini-B plug
*
* The sh7372 SoC has IRQ7 set aside for USBHS0 hotplug,
* but on this particular board IRQ7 is already used by
* the touch screen. This leaves us with software polling.
*/
#define USBHS0_POLL_INTERVAL (HZ * 5)
struct usbhs_private {
unsigned int usbphyaddr;
unsigned int usbcrcaddr;
struct renesas_usbhs_platform_info info;
struct delayed_work work;
struct platform_device *pdev;
};
#define usbhs_get_priv(pdev) \
container_of(renesas_usbhs_get_info(pdev), \
struct usbhs_private, info)
#define usbhs_is_connected(priv) \
(!((1 << 7) & __raw_readw(priv->usbcrcaddr)))
static int usbhs_get_vbus(struct platform_device *pdev)
{
return usbhs_is_connected(usbhs_get_priv(pdev));
}
static void usbhs_phy_reset(struct platform_device *pdev)
{
struct usbhs_private *priv = usbhs_get_priv(pdev);
/* init phy */
__raw_writew(0x8a0a, priv->usbcrcaddr);
}
static int usbhs0_get_id(struct platform_device *pdev)
{
return USBHS_GADGET;
}
static void usbhs0_work_function(struct work_struct *work)
{
struct usbhs_private *priv = container_of(work, struct usbhs_private,
work.work);
renesas_usbhs_call_notify_hotplug(priv->pdev);
schedule_delayed_work(&priv->work, USBHS0_POLL_INTERVAL);
}
static int usbhs0_hardware_init(struct platform_device *pdev)
{
struct usbhs_private *priv = usbhs_get_priv(pdev);
priv->pdev = pdev;
INIT_DELAYED_WORK(&priv->work, usbhs0_work_function);
schedule_delayed_work(&priv->work, USBHS0_POLL_INTERVAL);
return 0;
}
static void usbhs0_hardware_exit(struct platform_device *pdev)
{
struct usbhs_private *priv = usbhs_get_priv(pdev);
cancel_delayed_work_sync(&priv->work);
}
static struct usbhs_private usbhs0_private = {
.usbcrcaddr = 0xe605810c, /* USBCR2 */
.info = {
.platform_callback = {
.hardware_init = usbhs0_hardware_init,
.hardware_exit = usbhs0_hardware_exit,
.phy_reset = usbhs_phy_reset,
.get_id = usbhs0_get_id,
.get_vbus = usbhs_get_vbus,
},
.driver_param = {
.buswait_bwait = 4,
},
},
};
static struct resource usbhs0_resources[] = {
[0] = {
.name = "USBHS0",
.start = 0xe6890000,
.end = 0xe68900e6 - 1,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = evt2irq(0x1ca0) /* USB0_USB0I0 */,
.flags = IORESOURCE_IRQ,
},
};
static struct platform_device usbhs0_device = {
.name = "renesas_usbhs",
.id = 0,
.dev = {
.platform_data = &usbhs0_private.info,
},
.num_resources = ARRAY_SIZE(usbhs0_resources),
.resource = usbhs0_resources,
};
/* USBHS1 is connected to CN31 which takes a USB Mini-AB plug
*
* Use J30 to select between Host and Function. This setting
* can however not be detected by software. Hotplug of USBHS1
* is provided via IRQ8.
*/
#define IRQ8 evt2irq(0x0300)
/* USBHS1 USB Host support via r8a66597_hcd */
static void usb1_host_port_power(int port, int power) static void usb1_host_port_power(int port, int power)
{ {
if (!power) /* only power-on is supported for now */ if (!power) /* only power-on is supported for now */
@ -579,9 +693,9 @@ static struct r8a66597_platdata usb1_host_data = {
static struct resource usb1_host_resources[] = { static struct resource usb1_host_resources[] = {
[0] = { [0] = {
.name = "USBHS", .name = "USBHS1",
.start = 0xE68B0000, .start = 0xe68b0000,
.end = 0xE68B00E6 - 1, .end = 0xe68b00e6 - 1,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
[1] = { [1] = {
@ -602,37 +716,14 @@ static struct platform_device usb1_host_device = {
.resource = usb1_host_resources, .resource = usb1_host_resources,
}; };
/* USB1 (Function) */ /* USBHS1 USB Function support via renesas_usbhs */
#define USB_PHY_MODE (1 << 4) #define USB_PHY_MODE (1 << 4)
#define USB_PHY_INT_EN ((1 << 3) | (1 << 2)) #define USB_PHY_INT_EN ((1 << 3) | (1 << 2))
#define USB_PHY_ON (1 << 1) #define USB_PHY_ON (1 << 1)
#define USB_PHY_OFF (1 << 0) #define USB_PHY_OFF (1 << 0)
#define USB_PHY_INT_CLR (USB_PHY_ON | USB_PHY_OFF) #define USB_PHY_INT_CLR (USB_PHY_ON | USB_PHY_OFF)
struct usbhs_private {
unsigned int irq;
unsigned int usbphyaddr;
unsigned int usbcrcaddr;
struct renesas_usbhs_platform_info info;
};
#define usbhs_get_priv(pdev) \
container_of(renesas_usbhs_get_info(pdev), \
struct usbhs_private, info)
#define usbhs_is_connected(priv) \
(!((1 << 7) & __raw_readw(priv->usbcrcaddr)))
static int usbhs1_get_id(struct platform_device *pdev)
{
return USBHS_GADGET;
}
static int usbhs1_get_vbus(struct platform_device *pdev)
{
return usbhs_is_connected(usbhs_get_priv(pdev));
}
static irqreturn_t usbhs1_interrupt(int irq, void *data) static irqreturn_t usbhs1_interrupt(int irq, void *data)
{ {
struct platform_device *pdev = data; struct platform_device *pdev = data;
@ -654,12 +745,10 @@ static int usbhs1_hardware_init(struct platform_device *pdev)
struct usbhs_private *priv = usbhs_get_priv(pdev); struct usbhs_private *priv = usbhs_get_priv(pdev);
int ret; int ret;
irq_set_irq_type(priv->irq, IRQ_TYPE_LEVEL_HIGH);
/* clear interrupt status */ /* clear interrupt status */
__raw_writew(USB_PHY_MODE | USB_PHY_INT_CLR, priv->usbphyaddr); __raw_writew(USB_PHY_MODE | USB_PHY_INT_CLR, priv->usbphyaddr);
ret = request_irq(priv->irq, usbhs1_interrupt, 0, ret = request_irq(IRQ8, usbhs1_interrupt, IRQF_TRIGGER_HIGH,
dev_name(&pdev->dev), pdev); dev_name(&pdev->dev), pdev);
if (ret) { if (ret) {
dev_err(&pdev->dev, "request_irq err\n"); dev_err(&pdev->dev, "request_irq err\n");
@ -679,15 +768,12 @@ static void usbhs1_hardware_exit(struct platform_device *pdev)
/* clear interrupt status */ /* clear interrupt status */
__raw_writew(USB_PHY_MODE | USB_PHY_INT_CLR, priv->usbphyaddr); __raw_writew(USB_PHY_MODE | USB_PHY_INT_CLR, priv->usbphyaddr);
free_irq(priv->irq, pdev); free_irq(IRQ8, pdev);
} }
static void usbhs1_phy_reset(struct platform_device *pdev) static int usbhs1_get_id(struct platform_device *pdev)
{ {
struct usbhs_private *priv = usbhs_get_priv(pdev); return USBHS_GADGET;
/* init phy */
__raw_writew(0x8a0a, priv->usbcrcaddr);
} }
static u32 usbhs1_pipe_cfg[] = { static u32 usbhs1_pipe_cfg[] = {
@ -710,16 +796,15 @@ static u32 usbhs1_pipe_cfg[] = {
}; };
static struct usbhs_private usbhs1_private = { static struct usbhs_private usbhs1_private = {
.irq = evt2irq(0x0300), /* IRQ8 */ .usbphyaddr = 0xe60581e2, /* USBPHY1INTAP */
.usbphyaddr = 0xE60581E2, /* USBPHY1INTAP */ .usbcrcaddr = 0xe6058130, /* USBCR4 */
.usbcrcaddr = 0xE6058130, /* USBCR4 */
.info = { .info = {
.platform_callback = { .platform_callback = {
.hardware_init = usbhs1_hardware_init, .hardware_init = usbhs1_hardware_init,
.hardware_exit = usbhs1_hardware_exit, .hardware_exit = usbhs1_hardware_exit,
.phy_reset = usbhs1_phy_reset,
.get_id = usbhs1_get_id, .get_id = usbhs1_get_id,
.get_vbus = usbhs1_get_vbus, .phy_reset = usbhs_phy_reset,
.get_vbus = usbhs_get_vbus,
}, },
.driver_param = { .driver_param = {
.buswait_bwait = 4, .buswait_bwait = 4,
@ -731,9 +816,9 @@ static struct usbhs_private usbhs1_private = {
static struct resource usbhs1_resources[] = { static struct resource usbhs1_resources[] = {
[0] = { [0] = {
.name = "USBHS", .name = "USBHS1",
.start = 0xE68B0000, .start = 0xe68b0000,
.end = 0xE68B00E6 - 1, .end = 0xe68b00e6 - 1,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
[1] = { [1] = {
@ -752,7 +837,6 @@ static struct platform_device usbhs1_device = {
.resource = usbhs1_resources, .resource = usbhs1_resources,
}; };
/* LED */ /* LED */
static struct gpio_led mackerel_leds[] = { static struct gpio_led mackerel_leds[] = {
{ {
@ -1203,6 +1287,7 @@ static struct platform_device *mackerel_devices[] __initdata = {
&nor_flash_device, &nor_flash_device,
&smc911x_device, &smc911x_device,
&lcdc_device, &lcdc_device,
&usbhs0_device,
&usb1_host_device, &usb1_host_device,
&usbhs1_device, &usbhs1_device,
&leds_device, &leds_device,
@ -1301,6 +1386,7 @@ static void __init mackerel_map_io(void)
#define GPIO_PORT9CR 0xE6051009 #define GPIO_PORT9CR 0xE6051009
#define GPIO_PORT10CR 0xE605100A #define GPIO_PORT10CR 0xE605100A
#define GPIO_PORT167CR 0xE60520A7
#define GPIO_PORT168CR 0xE60520A8 #define GPIO_PORT168CR 0xE60520A8
#define SRCR4 0xe61580bc #define SRCR4 0xe61580bc
#define USCCR1 0xE6058144 #define USCCR1 0xE6058144
@ -1354,17 +1440,17 @@ static void __init mackerel_init(void)
gpio_request(GPIO_PORT151, NULL); /* LCDDON */ gpio_request(GPIO_PORT151, NULL); /* LCDDON */
gpio_direction_output(GPIO_PORT151, 1); gpio_direction_output(GPIO_PORT151, 1);
/* USB enable */ /* USBHS0 */
gpio_request(GPIO_FN_VBUS0_1, NULL); gpio_request(GPIO_FN_VBUS0_0, NULL);
gpio_request(GPIO_FN_IDIN_1_18, NULL); gpio_pull_down(GPIO_PORT168CR); /* VBUS0_0 pull down */
gpio_request(GPIO_FN_PWEN_1_115, NULL);
gpio_request(GPIO_FN_OVCN_1_114, NULL);
gpio_request(GPIO_FN_EXTLP_1, NULL);
gpio_request(GPIO_FN_OVCN2_1, NULL);
gpio_pull_down(GPIO_PORT168CR);
/* setup USB phy */ /* USBHS1 */
__raw_writew(0x8a0a, 0xE6058130); /* USBCR4 */ gpio_request(GPIO_FN_VBUS0_1, NULL);
gpio_pull_down(GPIO_PORT167CR); /* VBUS0_1 pull down */
gpio_request(GPIO_FN_IDIN_1_113, NULL);
/* USB phy tweak to make the r8a66597_hcd host driver work */
__raw_writew(0x8a0a, 0xe6058130); /* USBCR4 */
/* enable FSI2 port A (ak4643) */ /* enable FSI2 port A (ak4643) */
gpio_request(GPIO_FN_FSIAIBT, NULL); gpio_request(GPIO_FN_FSIAIBT, NULL);

View File

@ -250,6 +250,11 @@ static irqreturn_t sh73a0_intcs_demux(int irq, void *dev_id)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static int sh73a0_set_wake(struct irq_data *data, unsigned int on)
{
return 0; /* always allow wakeup */
}
void __init sh73a0_init_irq(void) void __init sh73a0_init_irq(void)
{ {
void __iomem *gic_dist_base = __io(0xf0001000); void __iomem *gic_dist_base = __io(0xf0001000);
@ -257,6 +262,7 @@ void __init sh73a0_init_irq(void)
void __iomem *intevtsa = ioremap_nocache(0xffd20100, PAGE_SIZE); void __iomem *intevtsa = ioremap_nocache(0xffd20100, PAGE_SIZE);
gic_init(0, 29, gic_dist_base, gic_cpu_base); gic_init(0, 29, gic_dist_base, gic_cpu_base);
gic_arch_extn.irq_set_wake = sh73a0_set_wake;
register_intc_controller(&intcs_desc); register_intc_controller(&intcs_desc);

View File

@ -38,7 +38,7 @@ static struct plat_sci_port scif0_platform_data = {
.flags = UPF_BOOT_AUTOCONF, .flags = UPF_BOOT_AUTOCONF,
.scscr = SCSCR_RE | SCSCR_TE, .scscr = SCSCR_RE | SCSCR_TE,
.scbrr_algo_id = SCBRR_ALGO_4, .scbrr_algo_id = SCBRR_ALGO_4,
.type = PORT_SCIF, .type = PORT_SCIFA,
.irqs = { evt2irq(0xc00), evt2irq(0xc00), .irqs = { evt2irq(0xc00), evt2irq(0xc00),
evt2irq(0xc00), evt2irq(0xc00) }, evt2irq(0xc00), evt2irq(0xc00) },
}; };
@ -57,7 +57,7 @@ static struct plat_sci_port scif1_platform_data = {
.flags = UPF_BOOT_AUTOCONF, .flags = UPF_BOOT_AUTOCONF,
.scscr = SCSCR_RE | SCSCR_TE, .scscr = SCSCR_RE | SCSCR_TE,
.scbrr_algo_id = SCBRR_ALGO_4, .scbrr_algo_id = SCBRR_ALGO_4,
.type = PORT_SCIF, .type = PORT_SCIFA,
.irqs = { evt2irq(0xc20), evt2irq(0xc20), .irqs = { evt2irq(0xc20), evt2irq(0xc20),
evt2irq(0xc20), evt2irq(0xc20) }, evt2irq(0xc20), evt2irq(0xc20) },
}; };
@ -76,7 +76,7 @@ static struct plat_sci_port scif2_platform_data = {
.flags = UPF_BOOT_AUTOCONF, .flags = UPF_BOOT_AUTOCONF,
.scscr = SCSCR_RE | SCSCR_TE, .scscr = SCSCR_RE | SCSCR_TE,
.scbrr_algo_id = SCBRR_ALGO_4, .scbrr_algo_id = SCBRR_ALGO_4,
.type = PORT_SCIF, .type = PORT_SCIFA,
.irqs = { evt2irq(0xc40), evt2irq(0xc40), .irqs = { evt2irq(0xc40), evt2irq(0xc40),
evt2irq(0xc40), evt2irq(0xc40) }, evt2irq(0xc40), evt2irq(0xc40) },
}; };
@ -95,7 +95,7 @@ static struct plat_sci_port scif3_platform_data = {
.flags = UPF_BOOT_AUTOCONF, .flags = UPF_BOOT_AUTOCONF,
.scscr = SCSCR_RE | SCSCR_TE, .scscr = SCSCR_RE | SCSCR_TE,
.scbrr_algo_id = SCBRR_ALGO_4, .scbrr_algo_id = SCBRR_ALGO_4,
.type = PORT_SCIF, .type = PORT_SCIFA,
.irqs = { evt2irq(0xc60), evt2irq(0xc60), .irqs = { evt2irq(0xc60), evt2irq(0xc60),
evt2irq(0xc60), evt2irq(0xc60) }, evt2irq(0xc60), evt2irq(0xc60) },
}; };
@ -114,7 +114,7 @@ static struct plat_sci_port scif4_platform_data = {
.flags = UPF_BOOT_AUTOCONF, .flags = UPF_BOOT_AUTOCONF,
.scscr = SCSCR_RE | SCSCR_TE, .scscr = SCSCR_RE | SCSCR_TE,
.scbrr_algo_id = SCBRR_ALGO_4, .scbrr_algo_id = SCBRR_ALGO_4,
.type = PORT_SCIF, .type = PORT_SCIFA,
.irqs = { evt2irq(0xd20), evt2irq(0xd20), .irqs = { evt2irq(0xd20), evt2irq(0xd20),
evt2irq(0xd20), evt2irq(0xd20) }, evt2irq(0xd20), evt2irq(0xd20) },
}; };
@ -133,7 +133,7 @@ static struct plat_sci_port scif5_platform_data = {
.flags = UPF_BOOT_AUTOCONF, .flags = UPF_BOOT_AUTOCONF,
.scscr = SCSCR_RE | SCSCR_TE, .scscr = SCSCR_RE | SCSCR_TE,
.scbrr_algo_id = SCBRR_ALGO_4, .scbrr_algo_id = SCBRR_ALGO_4,
.type = PORT_SCIF, .type = PORT_SCIFA,
.irqs = { evt2irq(0xd40), evt2irq(0xd40), .irqs = { evt2irq(0xd40), evt2irq(0xd40),
evt2irq(0xd40), evt2irq(0xd40) }, evt2irq(0xd40), evt2irq(0xd40) },
}; };
@ -152,7 +152,7 @@ static struct plat_sci_port scif6_platform_data = {
.flags = UPF_BOOT_AUTOCONF, .flags = UPF_BOOT_AUTOCONF,
.scscr = SCSCR_RE | SCSCR_TE, .scscr = SCSCR_RE | SCSCR_TE,
.scbrr_algo_id = SCBRR_ALGO_4, .scbrr_algo_id = SCBRR_ALGO_4,
.type = PORT_SCIF, .type = PORT_SCIFB,
.irqs = { evt2irq(0xd60), evt2irq(0xd60), .irqs = { evt2irq(0xd60), evt2irq(0xd60),
evt2irq(0xd60), evt2irq(0xd60) }, evt2irq(0xd60), evt2irq(0xd60) },
}; };

View File

@ -31,7 +31,7 @@ struct clk {
bool reset; bool reset;
__u16 clk_val; __u16 clk_val;
__s8 usecount; __s8 usecount;
__u32 res_reg; void __iomem * res_reg;
__u16 res_mask; __u16 res_mask;
bool hw_ctrld; bool hw_ctrld;

View File

@ -18,6 +18,12 @@
* the defines are used for setting up the I/O memory mapping. * the defines are used for setting up the I/O memory mapping.
*/ */
#ifdef __ASSEMBLER__
#define IOMEM(a) (a)
#else
#define IOMEM(a) (void __iomem *) a
#endif
/* NAND Flash CS0 */ /* NAND Flash CS0 */
#define U300_NAND_CS0_PHYS_BASE 0x80000000 #define U300_NAND_CS0_PHYS_BASE 0x80000000
@ -47,13 +53,6 @@
#define U300_SEMI_CONFIG_BASE 0x30000000 #define U300_SEMI_CONFIG_BASE 0x30000000
#endif #endif
/*
* All the following peripherals are specified at their PHYSICAL address,
* so if you need to access them (in the kernel), you MUST use the macros
* defined in <asm/io.h> to map to the IO_ADDRESS_AHB() IO_ADDRESS_FAST()
* etc.
*/
/* /*
* AHB peripherals * AHB peripherals
*/ */
@ -63,11 +62,11 @@
/* Vectored Interrupt Controller 0, servicing 32 interrupts */ /* Vectored Interrupt Controller 0, servicing 32 interrupts */
#define U300_INTCON0_BASE (U300_AHB_PER_PHYS_BASE+0x1000) #define U300_INTCON0_BASE (U300_AHB_PER_PHYS_BASE+0x1000)
#define U300_INTCON0_VBASE (U300_AHB_PER_VIRT_BASE+0x1000) #define U300_INTCON0_VBASE IOMEM(U300_AHB_PER_VIRT_BASE+0x1000)
/* Vectored Interrupt Controller 1, servicing 32 interrupts */ /* Vectored Interrupt Controller 1, servicing 32 interrupts */
#define U300_INTCON1_BASE (U300_AHB_PER_PHYS_BASE+0x2000) #define U300_INTCON1_BASE (U300_AHB_PER_PHYS_BASE+0x2000)
#define U300_INTCON1_VBASE (U300_AHB_PER_VIRT_BASE+0x2000) #define U300_INTCON1_VBASE IOMEM(U300_AHB_PER_VIRT_BASE+0x2000)
/* Memory Stick Pro (MSPRO) controller */ /* Memory Stick Pro (MSPRO) controller */
#define U300_MSPRO_BASE (U300_AHB_PER_PHYS_BASE+0x3000) #define U300_MSPRO_BASE (U300_AHB_PER_PHYS_BASE+0x3000)
@ -115,7 +114,7 @@
/* SYSCON */ /* SYSCON */
#define U300_SYSCON_BASE (U300_SLOW_PER_PHYS_BASE+0x1000) #define U300_SYSCON_BASE (U300_SLOW_PER_PHYS_BASE+0x1000)
#define U300_SYSCON_VBASE (U300_SLOW_PER_VIRT_BASE+0x1000) #define U300_SYSCON_VBASE IOMEM(U300_SLOW_PER_VIRT_BASE+0x1000)
/* Watchdog */ /* Watchdog */
#define U300_WDOG_BASE (U300_SLOW_PER_PHYS_BASE+0x2000) #define U300_WDOG_BASE (U300_SLOW_PER_PHYS_BASE+0x2000)
@ -125,7 +124,7 @@
/* APP side special timer */ /* APP side special timer */
#define U300_TIMER_APP_BASE (U300_SLOW_PER_PHYS_BASE+0x4000) #define U300_TIMER_APP_BASE (U300_SLOW_PER_PHYS_BASE+0x4000)
#define U300_TIMER_APP_VBASE (U300_SLOW_PER_VIRT_BASE+0x4000) #define U300_TIMER_APP_VBASE IOMEM(U300_SLOW_PER_VIRT_BASE+0x4000)
/* Keypad */ /* Keypad */
#define U300_KEYPAD_BASE (U300_SLOW_PER_PHYS_BASE+0x5000) #define U300_KEYPAD_BASE (U300_SLOW_PER_PHYS_BASE+0x5000)
@ -181,5 +180,4 @@
* Virtual accessor macros for static devices * Virtual accessor macros for static devices
*/ */
#endif #endif

View File

@ -411,8 +411,7 @@ static void __init u300_timer_init(void)
/* Use general purpose timer 2 as clock source */ /* Use general purpose timer 2 as clock source */
if (clocksource_mmio_init(U300_TIMER_APP_VBASE + U300_TIMER_APP_GPT2CC, if (clocksource_mmio_init(U300_TIMER_APP_VBASE + U300_TIMER_APP_GPT2CC,
"GPT2", rate, 300, 32, clocksource_mmio_readl_up)) "GPT2", rate, 300, 32, clocksource_mmio_readl_up))
printk(KERN_ERR "timer: failed to initialize clock " pr_err("timer: failed to initialize U300 clock source\n");
"source %s\n", clocksource_u300_1mhz.name);
clockevents_calc_mult_shift(&clockevent_u300_1mhz, clockevents_calc_mult_shift(&clockevent_u300_1mhz,
rate, APPTIMER_MIN_RANGE); rate, APPTIMER_MIN_RANGE);

View File

@ -46,12 +46,6 @@ static struct map_desc v2m_io_desc[] __initdata = {
}, },
}; };
static void __init v2m_init_early(void)
{
ct_desc->init_early();
versatile_sched_clock_init(MMIO_P2V(V2M_SYS_24MHZ), 24000000);
}
static void __init v2m_timer_init(void) static void __init v2m_timer_init(void)
{ {
u32 scctrl; u32 scctrl;
@ -365,6 +359,13 @@ static struct clk_lookup v2m_lookups[] = {
}, },
}; };
static void __init v2m_init_early(void)
{
ct_desc->init_early();
clkdev_add_table(v2m_lookups, ARRAY_SIZE(v2m_lookups));
versatile_sched_clock_init(MMIO_P2V(V2M_SYS_24MHZ), 24000000);
}
static void v2m_power_off(void) static void v2m_power_off(void)
{ {
if (v2m_cfg_write(SYS_CFG_SHUTDOWN | SYS_CFG_SITE_MB, 0)) if (v2m_cfg_write(SYS_CFG_SHUTDOWN | SYS_CFG_SITE_MB, 0))
@ -418,8 +419,6 @@ static void __init v2m_init(void)
{ {
int i; int i;
clkdev_add_table(v2m_lookups, ARRAY_SIZE(v2m_lookups));
platform_device_register(&v2m_pcie_i2c_device); platform_device_register(&v2m_pcie_i2c_device);
platform_device_register(&v2m_ddc_i2c_device); platform_device_register(&v2m_ddc_i2c_device);
platform_device_register(&v2m_flash_device); platform_device_register(&v2m_flash_device);

View File

@ -24,7 +24,9 @@ DEFINE_PER_CPU(struct mm_struct *, current_mm);
/* /*
* We fork()ed a process, and we need a new context for the child * We fork()ed a process, and we need a new context for the child
* to run in. * to run in. We reserve version 0 for initial tasks so we will
* always allocate an ASID. The ASID 0 is reserved for the TTBR
* register changing sequence.
*/ */
void __init_new_context(struct task_struct *tsk, struct mm_struct *mm) void __init_new_context(struct task_struct *tsk, struct mm_struct *mm)
{ {
@ -34,11 +36,8 @@ void __init_new_context(struct task_struct *tsk, struct mm_struct *mm)
static void flush_context(void) static void flush_context(void)
{ {
u32 ttb; /* set the reserved ASID before flushing the TLB */
/* Copy TTBR1 into TTBR0 */ asm("mcr p15, 0, %0, c13, c0, 1\n" : : "r" (0));
asm volatile("mrc p15, 0, %0, c2, c0, 1\n"
"mcr p15, 0, %0, c2, c0, 0"
: "=r" (ttb));
isb(); isb();
local_flush_tlb_all(); local_flush_tlb_all();
if (icache_is_vivt_asid_tagged()) { if (icache_is_vivt_asid_tagged()) {
@ -94,7 +93,7 @@ static void reset_context(void *info)
return; return;
smp_rmb(); smp_rmb();
asid = cpu_last_asid + cpu; asid = cpu_last_asid + cpu + 1;
flush_context(); flush_context();
set_mm_context(mm, asid); set_mm_context(mm, asid);
@ -144,13 +143,13 @@ void __new_context(struct mm_struct *mm)
* to start a new version and flush the TLB. * to start a new version and flush the TLB.
*/ */
if (unlikely((asid & ~ASID_MASK) == 0)) { if (unlikely((asid & ~ASID_MASK) == 0)) {
asid = cpu_last_asid + smp_processor_id(); asid = cpu_last_asid + smp_processor_id() + 1;
flush_context(); flush_context();
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
smp_wmb(); smp_wmb();
smp_call_function(reset_context, NULL, 1); smp_call_function(reset_context, NULL, 1);
#endif #endif
cpu_last_asid += NR_CPUS - 1; cpu_last_asid += NR_CPUS;
} }
set_mm_context(mm, asid); set_mm_context(mm, asid);

View File

@ -330,6 +330,12 @@ void __init arm_memblock_init(struct meminfo *mi, struct machine_desc *mdesc)
memblock_reserve(__pa(_stext), _end - _stext); memblock_reserve(__pa(_stext), _end - _stext);
#endif #endif
#ifdef CONFIG_BLK_DEV_INITRD #ifdef CONFIG_BLK_DEV_INITRD
if (phys_initrd_size &&
!memblock_is_region_memory(phys_initrd_start, phys_initrd_size)) {
pr_err("INITRD: 0x%08lx+0x%08lx is not a memory region - disabling initrd\n",
phys_initrd_start, phys_initrd_size);
phys_initrd_start = phys_initrd_size = 0;
}
if (phys_initrd_size && if (phys_initrd_size &&
memblock_is_region_reserved(phys_initrd_start, phys_initrd_size)) { memblock_is_region_reserved(phys_initrd_start, phys_initrd_size)) {
pr_err("INITRD: 0x%08lx+0x%08lx overlaps in-use memory region - disabling initrd\n", pr_err("INITRD: 0x%08lx+0x%08lx overlaps in-use memory region - disabling initrd\n",
@ -635,7 +641,8 @@ void __init mem_init(void)
" modules : 0x%08lx - 0x%08lx (%4ld MB)\n" " modules : 0x%08lx - 0x%08lx (%4ld MB)\n"
" .init : 0x%p" " - 0x%p" " (%4d kB)\n" " .init : 0x%p" " - 0x%p" " (%4d kB)\n"
" .text : 0x%p" " - 0x%p" " (%4d kB)\n" " .text : 0x%p" " - 0x%p" " (%4d kB)\n"
" .data : 0x%p" " - 0x%p" " (%4d kB)\n", " .data : 0x%p" " - 0x%p" " (%4d kB)\n"
" .bss : 0x%p" " - 0x%p" " (%4d kB)\n",
MLK(UL(CONFIG_VECTORS_BASE), UL(CONFIG_VECTORS_BASE) + MLK(UL(CONFIG_VECTORS_BASE), UL(CONFIG_VECTORS_BASE) +
(PAGE_SIZE)), (PAGE_SIZE)),
@ -657,7 +664,8 @@ void __init mem_init(void)
MLK_ROUNDUP(__init_begin, __init_end), MLK_ROUNDUP(__init_begin, __init_end),
MLK_ROUNDUP(_text, _etext), MLK_ROUNDUP(_text, _etext),
MLK_ROUNDUP(_sdata, _edata)); MLK_ROUNDUP(_sdata, _edata),
MLK_ROUNDUP(__bss_start, __bss_stop));
#undef MLK #undef MLK
#undef MLM #undef MLM

View File

@ -146,7 +146,7 @@ __arm7tdmi_proc_info:
.long 0 .long 0
.long 0 .long 0
.long v4_cache_fns .long v4_cache_fns
.size __arm7tdmi_proc_info, . - __arm7dmi_proc_info .size __arm7tdmi_proc_info, . - __arm7tdmi_proc_info
.type __triscenda7_proc_info, #object .type __triscenda7_proc_info, #object
__triscenda7_proc_info: __triscenda7_proc_info:

View File

@ -116,7 +116,7 @@ __arm9tdmi_proc_info:
.long 0 .long 0
.long 0 .long 0
.long v4_cache_fns .long v4_cache_fns
.size __arm9tdmi_proc_info, . - __arm9dmi_proc_info .size __arm9tdmi_proc_info, . - __arm9tdmi_proc_info
.type __p2001_proc_info, #object .type __p2001_proc_info, #object
__p2001_proc_info: __p2001_proc_info:

View File

@ -108,16 +108,18 @@ ENTRY(cpu_v7_switch_mm)
#ifdef CONFIG_ARM_ERRATA_430973 #ifdef CONFIG_ARM_ERRATA_430973
mcr p15, 0, r2, c7, c5, 6 @ flush BTAC/BTB mcr p15, 0, r2, c7, c5, 6 @ flush BTAC/BTB
#endif #endif
mrc p15, 0, r2, c2, c0, 1 @ load TTB 1 #ifdef CONFIG_ARM_ERRATA_754322
mcr p15, 0, r2, c2, c0, 0 @ into TTB 0 dsb
#endif
mcr p15, 0, r2, c13, c0, 1 @ set reserved context ID
isb
1: mcr p15, 0, r0, c2, c0, 0 @ set TTB 0
isb isb
#ifdef CONFIG_ARM_ERRATA_754322 #ifdef CONFIG_ARM_ERRATA_754322
dsb dsb
#endif #endif
mcr p15, 0, r1, c13, c0, 1 @ set context ID mcr p15, 0, r1, c13, c0, 1 @ set context ID
isb isb
mcr p15, 0, r0, c2, c0, 0 @ set TTB 0
isb
#endif #endif
mov pc, lr mov pc, lr
ENDPROC(cpu_v7_switch_mm) ENDPROC(cpu_v7_switch_mm)

View File

@ -139,7 +139,7 @@ static struct sdma_script_start_addrs addr_imx35_to2 = {
#endif #endif
#ifdef CONFIG_SOC_IMX51 #ifdef CONFIG_SOC_IMX51
static struct sdma_script_start_addrs addr_imx51_to1 = { static struct sdma_script_start_addrs addr_imx51 = {
.ap_2_ap_addr = 642, .ap_2_ap_addr = 642,
.uart_2_mcu_addr = 817, .uart_2_mcu_addr = 817,
.mcu_2_app_addr = 747, .mcu_2_app_addr = 747,
@ -196,7 +196,9 @@ static int __init imxXX_add_imx_dma(void)
#if defined(CONFIG_SOC_IMX51) #if defined(CONFIG_SOC_IMX51)
if (cpu_is_mx51()) { if (cpu_is_mx51()) {
imx51_imx_sdma_data.pdata.script_addrs = &addr_imx51_to1; int to_version = mx51_revision() >> 4;
imx51_imx_sdma_data.pdata.to_version = to_version;
imx51_imx_sdma_data.pdata.script_addrs = &addr_imx51;
ret = imx_add_imx_sdma(&imx51_imx_sdma_data); ret = imx_add_imx_sdma(&imx51_imx_sdma_data);
} else } else
#endif #endif

View File

@ -84,6 +84,7 @@
#include <linux/io.h> #include <linux/io.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/clkdev.h> #include <linux/clkdev.h>
#include <linux/pm_runtime.h>
#include <plat/omap_device.h> #include <plat/omap_device.h>
#include <plat/omap_hwmod.h> #include <plat/omap_hwmod.h>
@ -539,20 +540,34 @@ int omap_early_device_register(struct omap_device *od)
static int _od_runtime_suspend(struct device *dev) static int _od_runtime_suspend(struct device *dev)
{ {
struct platform_device *pdev = to_platform_device(dev); struct platform_device *pdev = to_platform_device(dev);
int ret;
return omap_device_idle(pdev); ret = pm_generic_runtime_suspend(dev);
if (!ret)
omap_device_idle(pdev);
return ret;
}
static int _od_runtime_idle(struct device *dev)
{
return pm_generic_runtime_idle(dev);
} }
static int _od_runtime_resume(struct device *dev) static int _od_runtime_resume(struct device *dev)
{ {
struct platform_device *pdev = to_platform_device(dev); struct platform_device *pdev = to_platform_device(dev);
return omap_device_enable(pdev); omap_device_enable(pdev);
return pm_generic_runtime_resume(dev);
} }
static struct dev_power_domain omap_device_power_domain = { static struct dev_power_domain omap_device_power_domain = {
.ops = { .ops = {
.runtime_suspend = _od_runtime_suspend, .runtime_suspend = _od_runtime_suspend,
.runtime_idle = _od_runtime_idle,
.runtime_resume = _od_runtime_resume, .runtime_resume = _od_runtime_resume,
USE_PLATFORM_PM_SLEEP_OPS USE_PLATFORM_PM_SLEEP_OPS
} }

View File

@ -110,7 +110,7 @@ CONFIG_LEDS_GPIO=y
CONFIG_LEDS_TRIGGERS=y CONFIG_LEDS_TRIGGERS=y
CONFIG_LEDS_TRIGGER_TIMER=y CONFIG_LEDS_TRIGGER_TIMER=y
CONFIG_LEDS_TRIGGER_HEARTBEAT=y CONFIG_LEDS_TRIGGER_HEARTBEAT=y
CONFIG_RTC_CLASS=m CONFIG_RTC_CLASS=y
CONFIG_RTC_DRV_S35390A=m CONFIG_RTC_DRV_S35390A=m
CONFIG_RTC_DRV_AT32AP700X=m CONFIG_RTC_DRV_AT32AP700X=m
CONFIG_DMADEVICES=y CONFIG_DMADEVICES=y

View File

@ -112,7 +112,7 @@ CONFIG_USB_G_SERIAL=m
CONFIG_USB_G_PRINTER=m CONFIG_USB_G_PRINTER=m
CONFIG_MMC=m CONFIG_MMC=m
CONFIG_SDH_BFIN=m CONFIG_SDH_BFIN=m
CONFIG_RTC_CLASS=m CONFIG_RTC_CLASS=y
CONFIG_RTC_DRV_BFIN=m CONFIG_RTC_DRV_BFIN=m
CONFIG_EXT2_FS=m CONFIG_EXT2_FS=m
# CONFIG_DNOTIFY is not set # CONFIG_DNOTIFY is not set

View File

@ -678,7 +678,7 @@ CONFIG_LEDS_TRIGGERS=y
CONFIG_LEDS_TRIGGER_TIMER=y CONFIG_LEDS_TRIGGER_TIMER=y
CONFIG_LEDS_TRIGGER_HEARTBEAT=y CONFIG_LEDS_TRIGGER_HEARTBEAT=y
CONFIG_LEDS_TRIGGER_DEFAULT_ON=y CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
CONFIG_RTC_CLASS=m CONFIG_RTC_CLASS=y
CONFIG_RTC_INTF_DEV_UIE_EMUL=y CONFIG_RTC_INTF_DEV_UIE_EMUL=y
CONFIG_RTC_DRV_TEST=m CONFIG_RTC_DRV_TEST=m
CONFIG_RTC_DRV_DS1307=m CONFIG_RTC_DRV_DS1307=m

View File

@ -15,6 +15,7 @@
* User space memory access functions * User space memory access functions
*/ */
#include <linux/thread_info.h> #include <linux/thread_info.h>
#include <linux/kernel.h>
#include <asm/page.h> #include <asm/page.h>
#include <asm/errno.h> #include <asm/errno.h>

View File

@ -85,7 +85,7 @@ CONFIG_USB_OHCI_HCD=m
CONFIG_USB_OHCI_HCD_PPC_OF_BE=y CONFIG_USB_OHCI_HCD_PPC_OF_BE=y
# CONFIG_USB_OHCI_HCD_PCI is not set # CONFIG_USB_OHCI_HCD_PCI is not set
CONFIG_USB_STORAGE=m CONFIG_USB_STORAGE=m
CONFIG_RTC_CLASS=m CONFIG_RTC_CLASS=y
CONFIG_RTC_DRV_PCF8563=m CONFIG_RTC_DRV_PCF8563=m
CONFIG_EXT2_FS=m CONFIG_EXT2_FS=m
CONFIG_EXT3_FS=m CONFIG_EXT3_FS=m

View File

@ -141,7 +141,7 @@ CONFIG_USB_EHCI_TT_NEWSCHED=y
# CONFIG_USB_EHCI_HCD_PPC_OF is not set # CONFIG_USB_EHCI_HCD_PPC_OF is not set
CONFIG_USB_OHCI_HCD=m CONFIG_USB_OHCI_HCD=m
CONFIG_USB_STORAGE=m CONFIG_USB_STORAGE=m
CONFIG_RTC_CLASS=m CONFIG_RTC_CLASS=y
CONFIG_RTC_DRV_PS3=m CONFIG_RTC_DRV_PS3=m
CONFIG_EXT2_FS=m CONFIG_EXT2_FS=m
CONFIG_EXT3_FS=m CONFIG_EXT3_FS=m

View File

@ -20,6 +20,7 @@
#include <linux/io.h> #include <linux/io.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/usb/r8a66597.h> #include <linux/usb/r8a66597.h>
#include <linux/usb/renesas_usbhs.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/i2c/tsc2007.h> #include <linux/i2c/tsc2007.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
@ -232,6 +233,52 @@ static struct platform_device usb1_common_device = {
.resource = usb1_common_resources, .resource = usb1_common_resources,
}; };
/*
* USBHS
*/
static int usbhs_get_id(struct platform_device *pdev)
{
return gpio_get_value(GPIO_PTB3);
}
static struct renesas_usbhs_platform_info usbhs_info = {
.platform_callback = {
.get_id = usbhs_get_id,
},
.driver_param = {
.buswait_bwait = 4,
.detection_delay = 5,
},
};
static struct resource usbhs_resources[] = {
[0] = {
.start = 0xa4d90000,
.end = 0xa4d90124 - 1,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = 66,
.end = 66,
.flags = IORESOURCE_IRQ,
},
};
static struct platform_device usbhs_device = {
.name = "renesas_usbhs",
.id = 1,
.dev = {
.dma_mask = NULL, /* not use dma */
.coherent_dma_mask = 0xffffffff,
.platform_data = &usbhs_info,
},
.num_resources = ARRAY_SIZE(usbhs_resources),
.resource = usbhs_resources,
.archdata = {
.hwblk_id = HWBLK_USB1,
},
};
/* LCDC */ /* LCDC */
const static struct fb_videomode ecovec_lcd_modes[] = { const static struct fb_videomode ecovec_lcd_modes[] = {
{ {
@ -897,6 +944,7 @@ static struct platform_device *ecovec_devices[] __initdata = {
&sh_eth_device, &sh_eth_device,
&usb0_host_device, &usb0_host_device,
&usb1_common_device, &usb1_common_device,
&usbhs_device,
&lcdc_device, &lcdc_device,
&ceu0_device, &ceu0_device,
&ceu1_device, &ceu1_device,

View File

@ -27,8 +27,6 @@ IMAGE_OFFSET := $(shell /bin/bash -c 'printf "0x%08x" \
$(CONFIG_BOOT_LINK_OFFSET)]') $(CONFIG_BOOT_LINK_OFFSET)]')
endif endif
LIBGCC := $(shell $(CC) $(KBUILD_CFLAGS) -print-libgcc-file-name)
ifeq ($(CONFIG_MCOUNT),y) ifeq ($(CONFIG_MCOUNT),y)
ORIG_CFLAGS := $(KBUILD_CFLAGS) ORIG_CFLAGS := $(KBUILD_CFLAGS)
KBUILD_CFLAGS = $(subst -pg, , $(ORIG_CFLAGS)) KBUILD_CFLAGS = $(subst -pg, , $(ORIG_CFLAGS))
@ -37,7 +35,25 @@ endif
LDFLAGS_vmlinux := --oformat $(ld-bfd) -Ttext $(IMAGE_OFFSET) -e startup \ LDFLAGS_vmlinux := --oformat $(ld-bfd) -Ttext $(IMAGE_OFFSET) -e startup \
-T $(obj)/../../kernel/vmlinux.lds -T $(obj)/../../kernel/vmlinux.lds
$(obj)/vmlinux: $(OBJECTS) $(obj)/piggy.o $(LIBGCC) FORCE #
# Pull in the necessary libgcc bits from the in-kernel implementation.
#
lib1funcs-$(CONFIG_SUPERH32) := ashiftrt.S ashldi3.c ashrsi3.S ashlsi3.S \
lshrsi3.S
lib1funcs-obj := \
$(addsuffix .o, $(basename $(addprefix $(obj)/, $(lib1funcs-y))))
lib1funcs-dir := $(srctree)/arch/$(SRCARCH)/lib
ifeq ($(BITS),64)
lib1funcs-dir := $(addsuffix $(BITS), $(lib1funcs-dir))
endif
KBUILD_CFLAGS += -I$(lib1funcs-dir)
$(addprefix $(obj)/,$(lib1funcs-y)): $(obj)/%: $(lib1funcs-dir)/% FORCE
$(call cmd,shipped)
$(obj)/vmlinux: $(OBJECTS) $(obj)/piggy.o $(lib1funcs-obj) FORCE
$(call if_changed,ld) $(call if_changed,ld)
@: @:

View File

@ -227,7 +227,7 @@ CONFIG_USB_SERIAL=m
CONFIG_USB_SERIAL_GENERIC=y CONFIG_USB_SERIAL_GENERIC=y
CONFIG_USB_SERIAL_ARK3116=m CONFIG_USB_SERIAL_ARK3116=m
CONFIG_USB_SERIAL_PL2303=m CONFIG_USB_SERIAL_PL2303=m
CONFIG_RTC_CLASS=m CONFIG_RTC_CLASS=y
CONFIG_RTC_DRV_SH=m CONFIG_RTC_DRV_SH=m
CONFIG_EXT2_FS=y CONFIG_EXT2_FS=y
CONFIG_EXT3_FS=y CONFIG_EXT3_FS=y

View File

@ -15,8 +15,9 @@ static inline unsigned long xchg_u32(volatile u32 *m, unsigned long val)
" mov.l %2, @%1 \n\t" /* store new value */ " mov.l %2, @%1 \n\t" /* store new value */
"1: mov r1, r15 \n\t" /* LOGOUT */ "1: mov r1, r15 \n\t" /* LOGOUT */
: "=&r" (retval), : "=&r" (retval),
"+r" (m) "+r" (m),
: "r" (val) "+r" (val) /* inhibit r15 overloading */
:
: "memory", "r0", "r1"); : "memory", "r0", "r1");
return retval; return retval;
@ -36,8 +37,9 @@ static inline unsigned long xchg_u8(volatile u8 *m, unsigned long val)
" mov.b %2, @%1 \n\t" /* store new value */ " mov.b %2, @%1 \n\t" /* store new value */
"1: mov r1, r15 \n\t" /* LOGOUT */ "1: mov r1, r15 \n\t" /* LOGOUT */
: "=&r" (retval), : "=&r" (retval),
"+r" (m) "+r" (m),
: "r" (val) "+r" (val) /* inhibit r15 overloading */
:
: "memory" , "r0", "r1"); : "memory" , "r0", "r1");
return retval; return retval;
@ -54,13 +56,14 @@ static inline unsigned long __cmpxchg_u32(volatile int *m, unsigned long old,
" nop \n\t" " nop \n\t"
" mov r15, r1 \n\t" /* r1 = saved sp */ " mov r15, r1 \n\t" /* r1 = saved sp */
" mov #-8, r15 \n\t" /* LOGIN */ " mov #-8, r15 \n\t" /* LOGIN */
" mov.l @%1, %0 \n\t" /* load old value */ " mov.l @%3, %0 \n\t" /* load old value */
" cmp/eq %0, %2 \n\t" " cmp/eq %0, %1 \n\t"
" bf 1f \n\t" /* if not equal */ " bf 1f \n\t" /* if not equal */
" mov.l %3, @%1 \n\t" /* store new value */ " mov.l %2, @%3 \n\t" /* store new value */
"1: mov r1, r15 \n\t" /* LOGOUT */ "1: mov r1, r15 \n\t" /* LOGOUT */
: "=&r" (retval) : "=&r" (retval),
: "r" (m), "r" (old), "r" (new) "+r" (old), "+r" (new) /* old or new can be r15 */
: "r" (m)
: "memory" , "r0", "r1", "t"); : "memory" , "r0", "r1", "t");
return retval; return retval;

View File

@ -150,7 +150,6 @@ struct thread_struct {
#define SR_USER (SR_MMU | SR_FD) #define SR_USER (SR_MMU | SR_FD)
#define start_thread(_regs, new_pc, new_sp) \ #define start_thread(_regs, new_pc, new_sp) \
set_fs(USER_DS); \
_regs->sr = SR_USER; /* User mode. */ \ _regs->sr = SR_USER; /* User mode. */ \
_regs->pc = new_pc - 4; /* Compensate syscall exit */ \ _regs->pc = new_pc - 4; /* Compensate syscall exit */ \
_regs->pc |= 1; /* Set SHmedia ! */ \ _regs->pc |= 1; /* Set SHmedia ! */ \

View File

@ -298,6 +298,14 @@ enum {
SHDMA_SLAVE_SCIF4_RX, SHDMA_SLAVE_SCIF4_RX,
SHDMA_SLAVE_SCIF5_TX, SHDMA_SLAVE_SCIF5_TX,
SHDMA_SLAVE_SCIF5_RX, SHDMA_SLAVE_SCIF5_RX,
SHDMA_SLAVE_USB0D0_TX,
SHDMA_SLAVE_USB0D0_RX,
SHDMA_SLAVE_USB0D1_TX,
SHDMA_SLAVE_USB0D1_RX,
SHDMA_SLAVE_USB1D0_TX,
SHDMA_SLAVE_USB1D0_RX,
SHDMA_SLAVE_USB1D1_TX,
SHDMA_SLAVE_USB1D1_RX,
SHDMA_SLAVE_SDHI0_TX, SHDMA_SLAVE_SDHI0_TX,
SHDMA_SLAVE_SDHI0_RX, SHDMA_SLAVE_SDHI0_RX,
SHDMA_SLAVE_SDHI1_TX, SHDMA_SLAVE_SDHI1_TX,

View File

@ -92,6 +92,46 @@ static const struct sh_dmae_slave_config sh7724_dmae_slaves[] = {
.addr = 0xa4e50024, .addr = 0xa4e50024,
.chcr = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT), .chcr = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_8BIT),
.mid_rid = 0x36, .mid_rid = 0x36,
}, {
.slave_id = SHDMA_SLAVE_USB0D0_TX,
.addr = 0xA4D80100,
.chcr = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_32BIT),
.mid_rid = 0x73,
}, {
.slave_id = SHDMA_SLAVE_USB0D0_RX,
.addr = 0xA4D80100,
.chcr = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_32BIT),
.mid_rid = 0x73,
}, {
.slave_id = SHDMA_SLAVE_USB0D1_TX,
.addr = 0xA4D80120,
.chcr = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_32BIT),
.mid_rid = 0x77,
}, {
.slave_id = SHDMA_SLAVE_USB0D1_RX,
.addr = 0xA4D80120,
.chcr = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_32BIT),
.mid_rid = 0x77,
}, {
.slave_id = SHDMA_SLAVE_USB1D0_TX,
.addr = 0xA4D90100,
.chcr = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_32BIT),
.mid_rid = 0xab,
}, {
.slave_id = SHDMA_SLAVE_USB1D0_RX,
.addr = 0xA4D90100,
.chcr = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_32BIT),
.mid_rid = 0xab,
}, {
.slave_id = SHDMA_SLAVE_USB1D1_TX,
.addr = 0xA4D90120,
.chcr = DM_FIX | SM_INC | 0x800 | TS_INDEX2VAL(XMIT_SZ_32BIT),
.mid_rid = 0xaf,
}, {
.slave_id = SHDMA_SLAVE_USB1D1_RX,
.addr = 0xA4D90120,
.chcr = DM_INC | SM_FIX | 0x800 | TS_INDEX2VAL(XMIT_SZ_32BIT),
.mid_rid = 0xaf,
}, { }, {
.slave_id = SHDMA_SLAVE_SDHI0_TX, .slave_id = SHDMA_SLAVE_SDHI0_TX,
.addr = 0x04ce0030, .addr = 0x04ce0030,

View File

@ -102,8 +102,6 @@ EXPORT_SYMBOL(kernel_thread);
void start_thread(struct pt_regs *regs, unsigned long new_pc, void start_thread(struct pt_regs *regs, unsigned long new_pc,
unsigned long new_sp) unsigned long new_sp)
{ {
set_fs(USER_DS);
regs->pr = 0; regs->pr = 0;
regs->sr = SR_FD; regs->sr = SR_FD;
regs->pc = new_pc; regs->pc = new_pc;

View File

@ -26,9 +26,9 @@ static int cache_seq_show(struct seq_file *file, void *iter)
{ {
unsigned int cache_type = (unsigned int)file->private; unsigned int cache_type = (unsigned int)file->private;
struct cache_info *cache; struct cache_info *cache;
unsigned int waysize, way, cache_size; unsigned int waysize, way;
unsigned long ccr, base; unsigned long ccr;
static unsigned long addrstart = 0; unsigned long addrstart = 0;
/* /*
* Go uncached immediately so we don't skew the results any * Go uncached immediately so we don't skew the results any
@ -45,28 +45,13 @@ static int cache_seq_show(struct seq_file *file, void *iter)
} }
if (cache_type == CACHE_TYPE_DCACHE) { if (cache_type == CACHE_TYPE_DCACHE) {
base = CACHE_OC_ADDRESS_ARRAY; addrstart = CACHE_OC_ADDRESS_ARRAY;
cache = &current_cpu_data.dcache; cache = &current_cpu_data.dcache;
} else { } else {
base = CACHE_IC_ADDRESS_ARRAY; addrstart = CACHE_IC_ADDRESS_ARRAY;
cache = &current_cpu_data.icache; cache = &current_cpu_data.icache;
} }
/*
* Due to the amount of data written out (depending on the cache size),
* we may be iterated over multiple times. In this case, keep track of
* the entry position in addrstart, and rewind it when we've hit the
* end of the cache.
*
* Likewise, the same code is used for multiple caches, so care must
* be taken for bouncing addrstart back and forth so the appropriate
* cache is hit.
*/
cache_size = cache->ways * cache->sets * cache->linesz;
if (((addrstart & 0xff000000) != base) ||
(addrstart & 0x00ffffff) > cache_size)
addrstart = base;
waysize = cache->sets; waysize = cache->sets;
/* /*

View File

@ -4,7 +4,6 @@
#define ARCH_DISCARD_MEMBLOCK #define ARCH_DISCARD_MEMBLOCK
u64 memblock_x86_find_in_range_size(u64 start, u64 *sizep, u64 align); u64 memblock_x86_find_in_range_size(u64 start, u64 *sizep, u64 align);
void memblock_x86_to_bootmem(u64 start, u64 end);
void memblock_x86_reserve_range(u64 start, u64 end, char *name); void memblock_x86_reserve_range(u64 start, u64 end, char *name);
void memblock_x86_free_range(u64 start, u64 end); void memblock_x86_free_range(u64 start, u64 end);
@ -19,5 +18,6 @@ u64 memblock_x86_hole_size(u64 start, u64 end);
u64 memblock_x86_find_in_range_node(int nid, u64 start, u64 end, u64 size, u64 align); u64 memblock_x86_find_in_range_node(int nid, u64 start, u64 end, u64 size, u64 align);
u64 memblock_x86_free_memory_in_range(u64 addr, u64 limit); u64 memblock_x86_free_memory_in_range(u64 addr, u64 limit);
u64 memblock_x86_memory_in_range(u64 addr, u64 limit); u64 memblock_x86_memory_in_range(u64 addr, u64 limit);
bool memblock_x86_check_reserved_size(u64 *addrp, u64 *sizep, u64 align);
#endif #endif

View File

@ -22,6 +22,8 @@ static inline u64 pvclock_scale_delta(u64 delta, u32 mul_frac, int shift)
u64 product; u64 product;
#ifdef __i386__ #ifdef __i386__
u32 tmp1, tmp2; u32 tmp1, tmp2;
#else
ulong tmp;
#endif #endif
if (shift < 0) if (shift < 0)
@ -42,8 +44,11 @@ static inline u64 pvclock_scale_delta(u64 delta, u32 mul_frac, int shift)
: "a" ((u32)delta), "1" ((u32)(delta >> 32)), "2" (mul_frac) ); : "a" ((u32)delta), "1" ((u32)(delta >> 32)), "2" (mul_frac) );
#elif defined(__x86_64__) #elif defined(__x86_64__)
__asm__ ( __asm__ (
"mul %%rdx ; shrd $32,%%rdx,%%rax" "mul %[mul_frac] ; shrd $32, %[hi], %[lo]"
: "=a" (product) : "0" (delta), "d" ((u64)mul_frac) ); : [lo]"=a"(product),
[hi]"=d"(tmp)
: "0"(delta),
[mul_frac]"rm"((u64)mul_frac));
#else #else
#error implement me! #error implement me!
#endif #endif

View File

@ -565,7 +565,7 @@ gfn_to_memslot_dirty_bitmap(struct kvm_vcpu *vcpu, gfn_t gfn,
static bool mapping_level_dirty_bitmap(struct kvm_vcpu *vcpu, gfn_t large_gfn) static bool mapping_level_dirty_bitmap(struct kvm_vcpu *vcpu, gfn_t large_gfn)
{ {
return gfn_to_memslot_dirty_bitmap(vcpu, large_gfn, true); return !gfn_to_memslot_dirty_bitmap(vcpu, large_gfn, true);
} }
static int mapping_level(struct kvm_vcpu *vcpu, gfn_t large_gfn) static int mapping_level(struct kvm_vcpu *vcpu, gfn_t large_gfn)

View File

@ -121,7 +121,7 @@ static int FNAME(walk_addr_generic)(struct guest_walker *walker,
gva_t addr, u32 access) gva_t addr, u32 access)
{ {
pt_element_t pte; pt_element_t pte;
pt_element_t __user *ptep_user; pt_element_t __user *uninitialized_var(ptep_user);
gfn_t table_gfn; gfn_t table_gfn;
unsigned index, pt_access, uninitialized_var(pte_access); unsigned index, pt_access, uninitialized_var(pte_access);
gpa_t pte_gpa; gpa_t pte_gpa;

View File

@ -2047,7 +2047,8 @@ static void ept_update_paging_mode_cr0(unsigned long *hw_cr0,
unsigned long cr0, unsigned long cr0,
struct kvm_vcpu *vcpu) struct kvm_vcpu *vcpu)
{ {
vmx_decache_cr3(vcpu); if (!test_bit(VCPU_EXREG_CR3, (ulong *)&vcpu->arch.regs_avail))
vmx_decache_cr3(vcpu);
if (!(cr0 & X86_CR0_PG)) { if (!(cr0 & X86_CR0_PG)) {
/* From paging/starting to nonpaging */ /* From paging/starting to nonpaging */
vmcs_write32(CPU_BASED_VM_EXEC_CONTROL, vmcs_write32(CPU_BASED_VM_EXEC_CONTROL,

View File

@ -8,7 +8,7 @@
#include <linux/range.h> #include <linux/range.h>
/* Check for already reserved areas */ /* Check for already reserved areas */
static bool __init check_with_memblock_reserved_size(u64 *addrp, u64 *sizep, u64 align) bool __init memblock_x86_check_reserved_size(u64 *addrp, u64 *sizep, u64 align)
{ {
struct memblock_region *r; struct memblock_region *r;
u64 addr = *addrp, last; u64 addr = *addrp, last;
@ -59,7 +59,7 @@ u64 __init memblock_x86_find_in_range_size(u64 start, u64 *sizep, u64 align)
if (addr >= ei_last) if (addr >= ei_last)
continue; continue;
*sizep = ei_last - addr; *sizep = ei_last - addr;
while (check_with_memblock_reserved_size(&addr, sizep, align)) while (memblock_x86_check_reserved_size(&addr, sizep, align))
; ;
if (*sizep) if (*sizep)

View File

@ -310,14 +310,31 @@ void __init efi_reserve_boot_services(void)
for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) { for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
efi_memory_desc_t *md = p; efi_memory_desc_t *md = p;
unsigned long long start = md->phys_addr; u64 start = md->phys_addr;
unsigned long long size = md->num_pages << EFI_PAGE_SHIFT; u64 size = md->num_pages << EFI_PAGE_SHIFT;
if (md->type != EFI_BOOT_SERVICES_CODE && if (md->type != EFI_BOOT_SERVICES_CODE &&
md->type != EFI_BOOT_SERVICES_DATA) md->type != EFI_BOOT_SERVICES_DATA)
continue; continue;
/* Only reserve where possible:
memblock_x86_reserve_range(start, start + size, "EFI Boot"); * - Not within any already allocated areas
* - Not over any memory area (really needed, if above?)
* - Not within any part of the kernel
* - Not the bios reserved area
*/
if ((start+size >= virt_to_phys(_text)
&& start <= virt_to_phys(_end)) ||
!e820_all_mapped(start, start+size, E820_RAM) ||
memblock_x86_check_reserved_size(&start, &size,
1<<EFI_PAGE_SHIFT)) {
/* Could not reserve, skip it */
md->num_pages = 0;
memblock_dbg(PFX "Could not reserve boot range "
"[0x%010llx-0x%010llx]\n",
start, start+size-1);
} else
memblock_x86_reserve_range(start, start+size,
"EFI Boot");
} }
} }
@ -334,6 +351,10 @@ static void __init efi_free_boot_services(void)
md->type != EFI_BOOT_SERVICES_DATA) md->type != EFI_BOOT_SERVICES_DATA)
continue; continue;
/* Could not reserve boot area */
if (!size)
continue;
free_bootmem_late(start, size); free_bootmem_late(start, size);
} }
} }

View File

@ -1033,6 +1033,13 @@ static void xen_machine_halt(void)
xen_reboot(SHUTDOWN_poweroff); xen_reboot(SHUTDOWN_poweroff);
} }
static void xen_machine_power_off(void)
{
if (pm_power_off)
pm_power_off();
xen_reboot(SHUTDOWN_poweroff);
}
static void xen_crash_shutdown(struct pt_regs *regs) static void xen_crash_shutdown(struct pt_regs *regs)
{ {
xen_reboot(SHUTDOWN_crash); xen_reboot(SHUTDOWN_crash);
@ -1058,7 +1065,7 @@ int xen_panic_handler_init(void)
static const struct machine_ops xen_machine_ops __initconst = { static const struct machine_ops xen_machine_ops __initconst = {
.restart = xen_restart, .restart = xen_restart,
.halt = xen_machine_halt, .halt = xen_machine_halt,
.power_off = xen_machine_halt, .power_off = xen_machine_power_off,
.shutdown = xen_machine_halt, .shutdown = xen_machine_halt,
.crash_shutdown = xen_crash_shutdown, .crash_shutdown = xen_crash_shutdown,
.emergency_restart = xen_emergency_restart, .emergency_restart = xen_emergency_restart,

View File

@ -59,6 +59,7 @@
#include <asm/page.h> #include <asm/page.h>
#include <asm/init.h> #include <asm/init.h>
#include <asm/pat.h> #include <asm/pat.h>
#include <asm/smp.h>
#include <asm/xen/hypercall.h> #include <asm/xen/hypercall.h>
#include <asm/xen/hypervisor.h> #include <asm/xen/hypervisor.h>
@ -1231,7 +1232,7 @@ static void xen_flush_tlb_others(const struct cpumask *cpus,
{ {
struct { struct {
struct mmuext_op op; struct mmuext_op op;
DECLARE_BITMAP(mask, NR_CPUS); DECLARE_BITMAP(mask, num_processors);
} *args; } *args;
struct multicall_space mcs; struct multicall_space mcs;
@ -1599,6 +1600,11 @@ static void __init xen_map_identity_early(pmd_t *pmd, unsigned long max_pfn)
for (pteidx = 0; pteidx < PTRS_PER_PTE; pteidx++, pfn++) { for (pteidx = 0; pteidx < PTRS_PER_PTE; pteidx++, pfn++) {
pte_t pte; pte_t pte;
#ifdef CONFIG_X86_32
if (pfn > max_pfn_mapped)
max_pfn_mapped = pfn;
#endif
if (!pte_none(pte_page[pteidx])) if (!pte_none(pte_page[pteidx]))
continue; continue;
@ -1766,7 +1772,9 @@ pgd_t * __init xen_setup_kernel_pagetable(pgd_t *pgd,
initial_kernel_pmd = initial_kernel_pmd =
extend_brk(sizeof(pmd_t) * PTRS_PER_PMD, PAGE_SIZE); extend_brk(sizeof(pmd_t) * PTRS_PER_PMD, PAGE_SIZE);
max_pfn_mapped = PFN_DOWN(__pa(xen_start_info->mfn_list)); max_pfn_mapped = PFN_DOWN(__pa(xen_start_info->pt_base) +
xen_start_info->nr_pt_frames * PAGE_SIZE +
512*1024);
kernel_pmd = m2v(pgd[KERNEL_PGD_BOUNDARY].pgd); kernel_pmd = m2v(pgd[KERNEL_PGD_BOUNDARY].pgd);
memcpy(initial_kernel_pmd, kernel_pmd, sizeof(pmd_t) * PTRS_PER_PMD); memcpy(initial_kernel_pmd, kernel_pmd, sizeof(pmd_t) * PTRS_PER_PMD);

View File

@ -227,11 +227,7 @@ char * __init xen_memory_setup(void)
memcpy(map_raw, map, sizeof(map)); memcpy(map_raw, map, sizeof(map));
e820.nr_map = 0; e820.nr_map = 0;
#ifdef CONFIG_X86_32
xen_extra_mem_start = mem_end; xen_extra_mem_start = mem_end;
#else
xen_extra_mem_start = max((1ULL << 32), mem_end);
#endif
for (i = 0; i < memmap.nr_entries; i++) { for (i = 0; i < memmap.nr_entries; i++) {
unsigned long long end; unsigned long long end;
@ -266,6 +262,12 @@ char * __init xen_memory_setup(void)
if (map[i].size > 0) if (map[i].size > 0)
e820_add_region(map[i].addr, map[i].size, map[i].type); e820_add_region(map[i].addr, map[i].size, map[i].type);
} }
/* Align the balloon area so that max_low_pfn does not get set
* to be at the _end_ of the PCI gap at the far end (fee01000).
* Note that xen_extra_mem_start gets set in the loop above to be
* past the last E820 region. */
if (xen_initial_domain() && (xen_extra_mem_start < (1ULL<<32)))
xen_extra_mem_start = (1ULL<<32);
/* /*
* In domU, the ISA region is normal, usable memory, but we * In domU, the ISA region is normal, usable memory, but we

View File

@ -205,11 +205,18 @@ static void __init xen_smp_prepare_boot_cpu(void)
static void __init xen_smp_prepare_cpus(unsigned int max_cpus) static void __init xen_smp_prepare_cpus(unsigned int max_cpus)
{ {
unsigned cpu; unsigned cpu;
unsigned int i;
xen_init_lock_cpu(0); xen_init_lock_cpu(0);
smp_store_cpu_info(0); smp_store_cpu_info(0);
cpu_data(0).x86_max_cores = 1; cpu_data(0).x86_max_cores = 1;
for_each_possible_cpu(i) {
zalloc_cpumask_var(&per_cpu(cpu_sibling_map, i), GFP_KERNEL);
zalloc_cpumask_var(&per_cpu(cpu_core_map, i), GFP_KERNEL);
zalloc_cpumask_var(&per_cpu(cpu_llc_shared_map, i), GFP_KERNEL);
}
set_cpu_sibling_map(0); set_cpu_sibling_map(0);
if (xen_smp_intr_init(0)) if (xen_smp_intr_init(0))

View File

@ -387,7 +387,7 @@ static int pm_runtime_clk_notify(struct notifier_block *nb,
clknb = container_of(nb, struct pm_clk_notifier_block, nb); clknb = container_of(nb, struct pm_clk_notifier_block, nb);
switch (action) { switch (action) {
case BUS_NOTIFY_ADD_DEVICE: case BUS_NOTIFY_BIND_DRIVER:
if (clknb->con_ids[0]) { if (clknb->con_ids[0]) {
for (con_id = clknb->con_ids; *con_id; con_id++) for (con_id = clknb->con_ids; *con_id; con_id++)
enable_clock(dev, *con_id); enable_clock(dev, *con_id);
@ -395,7 +395,7 @@ static int pm_runtime_clk_notify(struct notifier_block *nb,
enable_clock(dev, NULL); enable_clock(dev, NULL);
} }
break; break;
case BUS_NOTIFY_DEL_DEVICE: case BUS_NOTIFY_UNBOUND_DRIVER:
if (clknb->con_ids[0]) { if (clknb->con_ids[0]) {
for (con_id = clknb->con_ids; *con_id; con_id++) for (con_id = clknb->con_ids; *con_id; con_id++)
disable_clock(dev, *con_id); disable_clock(dev, *con_id);

View File

@ -57,7 +57,8 @@ static int async_error;
*/ */
void device_pm_init(struct device *dev) void device_pm_init(struct device *dev)
{ {
dev->power.in_suspend = false; dev->power.is_prepared = false;
dev->power.is_suspended = false;
init_completion(&dev->power.completion); init_completion(&dev->power.completion);
complete_all(&dev->power.completion); complete_all(&dev->power.completion);
dev->power.wakeup = NULL; dev->power.wakeup = NULL;
@ -91,7 +92,7 @@ void device_pm_add(struct device *dev)
pr_debug("PM: Adding info for %s:%s\n", pr_debug("PM: Adding info for %s:%s\n",
dev->bus ? dev->bus->name : "No Bus", dev_name(dev)); dev->bus ? dev->bus->name : "No Bus", dev_name(dev));
mutex_lock(&dpm_list_mtx); mutex_lock(&dpm_list_mtx);
if (dev->parent && dev->parent->power.in_suspend) if (dev->parent && dev->parent->power.is_prepared)
dev_warn(dev, "parent %s should not be sleeping\n", dev_warn(dev, "parent %s should not be sleeping\n",
dev_name(dev->parent)); dev_name(dev->parent));
list_add_tail(&dev->power.entry, &dpm_list); list_add_tail(&dev->power.entry, &dpm_list);
@ -511,7 +512,14 @@ static int device_resume(struct device *dev, pm_message_t state, bool async)
dpm_wait(dev->parent, async); dpm_wait(dev->parent, async);
device_lock(dev); device_lock(dev);
dev->power.in_suspend = false; /*
* This is a fib. But we'll allow new children to be added below
* a resumed device, even if the device hasn't been completed yet.
*/
dev->power.is_prepared = false;
if (!dev->power.is_suspended)
goto Unlock;
if (dev->pwr_domain) { if (dev->pwr_domain) {
pm_dev_dbg(dev, state, "power domain "); pm_dev_dbg(dev, state, "power domain ");
@ -548,6 +556,9 @@ static int device_resume(struct device *dev, pm_message_t state, bool async)
} }
End: End:
dev->power.is_suspended = false;
Unlock:
device_unlock(dev); device_unlock(dev);
complete_all(&dev->power.completion); complete_all(&dev->power.completion);
@ -670,7 +681,7 @@ void dpm_complete(pm_message_t state)
struct device *dev = to_device(dpm_prepared_list.prev); struct device *dev = to_device(dpm_prepared_list.prev);
get_device(dev); get_device(dev);
dev->power.in_suspend = false; dev->power.is_prepared = false;
list_move(&dev->power.entry, &list); list_move(&dev->power.entry, &list);
mutex_unlock(&dpm_list_mtx); mutex_unlock(&dpm_list_mtx);
@ -835,11 +846,11 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async)
device_lock(dev); device_lock(dev);
if (async_error) if (async_error)
goto End; goto Unlock;
if (pm_wakeup_pending()) { if (pm_wakeup_pending()) {
async_error = -EBUSY; async_error = -EBUSY;
goto End; goto Unlock;
} }
if (dev->pwr_domain) { if (dev->pwr_domain) {
@ -877,6 +888,9 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async)
} }
End: End:
dev->power.is_suspended = !error;
Unlock:
device_unlock(dev); device_unlock(dev);
complete_all(&dev->power.completion); complete_all(&dev->power.completion);
@ -1042,7 +1056,7 @@ int dpm_prepare(pm_message_t state)
put_device(dev); put_device(dev);
break; break;
} }
dev->power.in_suspend = true; dev->power.is_prepared = true;
if (!list_empty(&dev->power.entry)) if (!list_empty(&dev->power.entry))
list_move_tail(&dev->power.entry, &dpm_prepared_list); list_move_tail(&dev->power.entry, &dpm_prepared_list);
put_device(dev); put_device(dev);

View File

@ -64,6 +64,8 @@ static ssize_t btmrvl_hscfgcmd_write(struct file *file,
return -EFAULT; return -EFAULT;
ret = strict_strtol(buf, 10, &result); ret = strict_strtol(buf, 10, &result);
if (ret)
return ret;
priv->btmrvl_dev.hscfgcmd = result; priv->btmrvl_dev.hscfgcmd = result;
@ -108,6 +110,8 @@ static ssize_t btmrvl_psmode_write(struct file *file, const char __user *ubuf,
return -EFAULT; return -EFAULT;
ret = strict_strtol(buf, 10, &result); ret = strict_strtol(buf, 10, &result);
if (ret)
return ret;
priv->btmrvl_dev.psmode = result; priv->btmrvl_dev.psmode = result;
@ -147,6 +151,8 @@ static ssize_t btmrvl_pscmd_write(struct file *file, const char __user *ubuf,
return -EFAULT; return -EFAULT;
ret = strict_strtol(buf, 10, &result); ret = strict_strtol(buf, 10, &result);
if (ret)
return ret;
priv->btmrvl_dev.pscmd = result; priv->btmrvl_dev.pscmd = result;
@ -191,6 +197,8 @@ static ssize_t btmrvl_gpiogap_write(struct file *file, const char __user *ubuf,
return -EFAULT; return -EFAULT;
ret = strict_strtol(buf, 16, &result); ret = strict_strtol(buf, 16, &result);
if (ret)
return ret;
priv->btmrvl_dev.gpio_gap = result; priv->btmrvl_dev.gpio_gap = result;
@ -230,6 +238,8 @@ static ssize_t btmrvl_hscmd_write(struct file *file, const char __user *ubuf,
return -EFAULT; return -EFAULT;
ret = strict_strtol(buf, 10, &result); ret = strict_strtol(buf, 10, &result);
if (ret)
return ret;
priv->btmrvl_dev.hscmd = result; priv->btmrvl_dev.hscmd = result;
if (priv->btmrvl_dev.hscmd) { if (priv->btmrvl_dev.hscmd) {
@ -272,6 +282,8 @@ static ssize_t btmrvl_hsmode_write(struct file *file, const char __user *ubuf,
return -EFAULT; return -EFAULT;
ret = strict_strtol(buf, 10, &result); ret = strict_strtol(buf, 10, &result);
if (ret)
return ret;
priv->btmrvl_dev.hsmode = result; priv->btmrvl_dev.hsmode = result;

View File

@ -163,11 +163,32 @@ static irqreturn_t hpet_interrupt(int irq, void *data)
* This has the effect of treating non-periodic like periodic. * This has the effect of treating non-periodic like periodic.
*/ */
if ((devp->hd_flags & (HPET_IE | HPET_PERIODIC)) == HPET_IE) { if ((devp->hd_flags & (HPET_IE | HPET_PERIODIC)) == HPET_IE) {
unsigned long m, t; unsigned long m, t, mc, base, k;
struct hpet __iomem *hpet = devp->hd_hpet;
struct hpets *hpetp = devp->hd_hpets;
t = devp->hd_ireqfreq; t = devp->hd_ireqfreq;
m = read_counter(&devp->hd_timer->hpet_compare); m = read_counter(&devp->hd_timer->hpet_compare);
write_counter(t + m, &devp->hd_timer->hpet_compare); mc = read_counter(&hpet->hpet_mc);
/* The time for the next interrupt would logically be t + m,
* however, if we are very unlucky and the interrupt is delayed
* for longer than t then we will completely miss the next
* interrupt if we set t + m and an application will hang.
* Therefore we need to make a more complex computation assuming
* that there exists a k for which the following is true:
* k * t + base < mc + delta
* (k + 1) * t + base > mc + delta
* where t is the interval in hpet ticks for the given freq,
* base is the theoretical start value 0 < base < t,
* mc is the main counter value at the time of the interrupt,
* delta is the time it takes to write the a value to the
* comparator.
* k may then be computed as (mc - base + delta) / t .
*/
base = mc % t;
k = (mc - base + hpetp->hp_delta) / t;
write_counter(t * (k + 1) + base,
&devp->hd_timer->hpet_compare);
} }
if (devp->hd_flags & HPET_SHARED_IRQ) if (devp->hd_flags & HPET_SHARED_IRQ)

View File

@ -298,11 +298,13 @@ static int cpufreq_stat_notifier_trans(struct notifier_block *nb,
old_index = stat->last_index; old_index = stat->last_index;
new_index = freq_table_get_index(stat, freq->new); new_index = freq_table_get_index(stat, freq->new);
cpufreq_stats_update(freq->cpu); /* We can't do stat->time_in_state[-1]= .. */
if (old_index == new_index) if (old_index == -1 || new_index == -1)
return 0; return 0;
if (old_index == -1 || new_index == -1) cpufreq_stats_update(freq->cpu);
if (old_index == new_index)
return 0; return 0;
spin_lock(&cpufreq_stats_lock); spin_lock(&cpufreq_stats_lock);

View File

@ -1079,6 +1079,9 @@ static int transition_frequency_fidvid(struct powernow_k8_data *data,
} }
res = transition_fid_vid(data, fid, vid); res = transition_fid_vid(data, fid, vid);
if (res)
return res;
freqs.new = find_khz_freq_from_fid(data->currfid); freqs.new = find_khz_freq_from_fid(data->currfid);
for_each_cpu(i, data->available_cores) { for_each_cpu(i, data->available_cores) {
@ -1101,7 +1104,8 @@ static int transition_frequency_pstate(struct powernow_k8_data *data,
/* get MSR index for hardware pstate transition */ /* get MSR index for hardware pstate transition */
pstate = index & HW_PSTATE_MASK; pstate = index & HW_PSTATE_MASK;
if (pstate > data->max_hw_pstate) if (pstate > data->max_hw_pstate)
return 0; return -EINVAL;
freqs.old = find_khz_freq_from_pstate(data->powernow_table, freqs.old = find_khz_freq_from_pstate(data->powernow_table,
data->currpstate); data->currpstate);
freqs.new = find_khz_freq_from_pstate(data->powernow_table, pstate); freqs.new = find_khz_freq_from_pstate(data->powernow_table, pstate);

View File

@ -1221,6 +1221,11 @@ static int __init sh_dmae_probe(struct platform_device *pdev)
} else { } else {
do { do {
for (i = chanirq_res->start; i <= chanirq_res->end; i++) { for (i = chanirq_res->start; i <= chanirq_res->end; i++) {
if (irq_cnt >= SH_DMAC_MAX_CHANNELS) {
irq_cap = 1;
break;
}
if ((errirq_res->flags & IORESOURCE_BITS) == if ((errirq_res->flags & IORESOURCE_BITS) ==
IORESOURCE_IRQ_SHAREABLE) IORESOURCE_IRQ_SHAREABLE)
chan_flag[irq_cnt] = IRQF_SHARED; chan_flag[irq_cnt] = IRQF_SHARED;
@ -1230,15 +1235,11 @@ static int __init sh_dmae_probe(struct platform_device *pdev)
"Found IRQ %d for channel %d\n", "Found IRQ %d for channel %d\n",
i, irq_cnt); i, irq_cnt);
chan_irq[irq_cnt++] = i; chan_irq[irq_cnt++] = i;
if (irq_cnt >= SH_DMAC_MAX_CHANNELS)
break;
} }
if (irq_cnt >= SH_DMAC_MAX_CHANNELS) { if (irq_cnt >= SH_DMAC_MAX_CHANNELS)
irq_cap = 1;
break; break;
}
chanirq_res = platform_get_resource(pdev, chanirq_res = platform_get_resource(pdev,
IORESOURCE_IRQ, ++irqres); IORESOURCE_IRQ, ++irqres);
} while (irq_cnt < pdata->channel_num && chanirq_res); } while (irq_cnt < pdata->channel_num && chanirq_res);

View File

@ -469,8 +469,9 @@ static inline void set_24xx_gpio_triggering(struct gpio_bank *bank, int gpio,
+ OMAP24XX_GPIO_CLEARWKUENA); + OMAP24XX_GPIO_CLEARWKUENA);
} }
} }
/* This part needs to be executed always for OMAP34xx */ /* This part needs to be executed always for OMAP{34xx, 44xx} */
if (cpu_is_omap34xx() || (bank->non_wakeup_gpios & gpio_bit)) { if (cpu_is_omap34xx() || cpu_is_omap44xx() ||
(bank->non_wakeup_gpios & gpio_bit)) {
/* /*
* Log the edge gpio and manually trigger the IRQ * Log the edge gpio and manually trigger the IRQ
* after resume if the input level changes * after resume if the input level changes

View File

@ -184,9 +184,9 @@ drm_edid_block_valid(u8 *raw_edid)
bad: bad:
if (raw_edid) { if (raw_edid) {
DRM_ERROR("Raw EDID:\n"); printk(KERN_ERR "Raw EDID:\n");
print_hex_dump_bytes(KERN_ERR, DUMP_PREFIX_NONE, raw_edid, EDID_LENGTH); print_hex_dump_bytes(KERN_ERR, DUMP_PREFIX_NONE, raw_edid, EDID_LENGTH);
printk("\n"); printk(KERN_ERR "\n");
} }
return 0; return 0;
} }
@ -258,6 +258,17 @@ drm_do_probe_ddc_edid(struct i2c_adapter *adapter, unsigned char *buf,
return ret == 2 ? 0 : -1; return ret == 2 ? 0 : -1;
} }
static bool drm_edid_is_zero(u8 *in_edid, int length)
{
int i;
u32 *raw_edid = (u32 *)in_edid;
for (i = 0; i < length / 4; i++)
if (*(raw_edid + i) != 0)
return false;
return true;
}
static u8 * static u8 *
drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter) drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter)
{ {
@ -273,6 +284,10 @@ drm_do_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter)
goto out; goto out;
if (drm_edid_block_valid(block)) if (drm_edid_block_valid(block))
break; break;
if (i == 0 && drm_edid_is_zero(block, EDID_LENGTH)) {
connector->null_edid_counter++;
goto carp;
}
} }
if (i == 4) if (i == 4)
goto carp; goto carp;

View File

@ -28,6 +28,7 @@
* IN THE SOFTWARE. * IN THE SOFTWARE.
*/ */
#include <linux/compat.h> #include <linux/compat.h>
#include <linux/ratelimit.h>
#include "drmP.h" #include "drmP.h"
#include "drm_core.h" #include "drm_core.h"
@ -253,10 +254,10 @@ static int compat_drm_addmap(struct file *file, unsigned int cmd,
return -EFAULT; return -EFAULT;
m32.handle = (unsigned long)handle; m32.handle = (unsigned long)handle;
if (m32.handle != (unsigned long)handle && printk_ratelimit()) if (m32.handle != (unsigned long)handle)
printk(KERN_ERR "compat_drm_addmap truncated handle" printk_ratelimited(KERN_ERR "compat_drm_addmap truncated handle"
" %p for type %d offset %x\n", " %p for type %d offset %x\n",
handle, m32.type, m32.offset); handle, m32.type, m32.offset);
if (copy_to_user(argp, &m32, sizeof(m32))) if (copy_to_user(argp, &m32, sizeof(m32)))
return -EFAULT; return -EFAULT;

View File

@ -251,7 +251,7 @@ err:
} }
int drm_pci_irq_by_busid(struct drm_device *dev, struct drm_irq_busid *p) static int drm_pci_irq_by_busid(struct drm_device *dev, struct drm_irq_busid *p)
{ {
if ((p->busnum >> 8) != drm_get_pci_domain(dev) || if ((p->busnum >> 8) != drm_get_pci_domain(dev) ||
(p->busnum & 0xff) != dev->pdev->bus->number || (p->busnum & 0xff) != dev->pdev->bus->number ||
@ -292,6 +292,7 @@ static struct drm_bus drm_pci_bus = {
.get_name = drm_pci_get_name, .get_name = drm_pci_get_name,
.set_busid = drm_pci_set_busid, .set_busid = drm_pci_set_busid,
.set_unique = drm_pci_set_unique, .set_unique = drm_pci_set_unique,
.irq_by_busid = drm_pci_irq_by_busid,
.agp_init = drm_pci_agp_init, .agp_init = drm_pci_agp_init,
}; };

View File

@ -1740,6 +1740,16 @@ void ironlake_irq_preinstall(struct drm_device *dev)
INIT_WORK(&dev_priv->rps_work, gen6_pm_rps_work); INIT_WORK(&dev_priv->rps_work, gen6_pm_rps_work);
I915_WRITE(HWSTAM, 0xeffe); I915_WRITE(HWSTAM, 0xeffe);
if (IS_GEN6(dev)) {
/* Workaround stalls observed on Sandy Bridge GPUs by
* making the blitter command streamer generate a
* write to the Hardware Status Page for
* MI_USER_INTERRUPT. This appears to serialize the
* previous seqno write out before the interrupt
* happens.
*/
I915_WRITE(GEN6_BLITTER_HWSTAM, ~GEN6_BLITTER_USER_INTERRUPT);
}
/* XXX hotplug from PCH */ /* XXX hotplug from PCH */

View File

@ -401,8 +401,7 @@ int intel_setup_gmbus(struct drm_device *dev)
bus->reg0 = i | GMBUS_RATE_100KHZ; bus->reg0 = i | GMBUS_RATE_100KHZ;
/* XXX force bit banging until GMBUS is fully debugged */ /* XXX force bit banging until GMBUS is fully debugged */
if (IS_GEN2(dev)) bus->force_bit = intel_gpio_create(dev_priv, i);
bus->force_bit = intel_gpio_create(dev_priv, i);
} }
intel_i2c_reset(dev_priv->dev); intel_i2c_reset(dev_priv->dev);

View File

@ -262,7 +262,6 @@ static bool nouveau_dsm_detect(void)
vga_count++; vga_count++;
retval = nouveau_dsm_pci_probe(pdev); retval = nouveau_dsm_pci_probe(pdev);
printk("ret val is %d\n", retval);
if (retval & NOUVEAU_DSM_HAS_MUX) if (retval & NOUVEAU_DSM_HAS_MUX)
has_dsm |= 1; has_dsm |= 1;
if (retval & NOUVEAU_DSM_HAS_OPT) if (retval & NOUVEAU_DSM_HAS_OPT)

View File

@ -339,11 +339,12 @@ semaphore_acquire(struct nouveau_channel *chan, struct nouveau_semaphore *sema)
int ret; int ret;
if (dev_priv->chipset < 0x84) { if (dev_priv->chipset < 0x84) {
ret = RING_SPACE(chan, 3); ret = RING_SPACE(chan, 4);
if (ret) if (ret)
return ret; return ret;
BEGIN_RING(chan, NvSubSw, NV_SW_SEMAPHORE_OFFSET, 2); BEGIN_RING(chan, NvSubSw, NV_SW_DMA_SEMAPHORE, 3);
OUT_RING (chan, NvSema);
OUT_RING (chan, sema->mem->start); OUT_RING (chan, sema->mem->start);
OUT_RING (chan, 1); OUT_RING (chan, 1);
} else } else
@ -351,10 +352,12 @@ semaphore_acquire(struct nouveau_channel *chan, struct nouveau_semaphore *sema)
struct nouveau_vma *vma = &dev_priv->fence.bo->vma; struct nouveau_vma *vma = &dev_priv->fence.bo->vma;
u64 offset = vma->offset + sema->mem->start; u64 offset = vma->offset + sema->mem->start;
ret = RING_SPACE(chan, 5); ret = RING_SPACE(chan, 7);
if (ret) if (ret)
return ret; return ret;
BEGIN_RING(chan, NvSubSw, NV_SW_DMA_SEMAPHORE, 1);
OUT_RING (chan, chan->vram_handle);
BEGIN_RING(chan, NvSubSw, 0x0010, 4); BEGIN_RING(chan, NvSubSw, 0x0010, 4);
OUT_RING (chan, upper_32_bits(offset)); OUT_RING (chan, upper_32_bits(offset));
OUT_RING (chan, lower_32_bits(offset)); OUT_RING (chan, lower_32_bits(offset));
@ -394,11 +397,12 @@ semaphore_release(struct nouveau_channel *chan, struct nouveau_semaphore *sema)
int ret; int ret;
if (dev_priv->chipset < 0x84) { if (dev_priv->chipset < 0x84) {
ret = RING_SPACE(chan, 4); ret = RING_SPACE(chan, 5);
if (ret) if (ret)
return ret; return ret;
BEGIN_RING(chan, NvSubSw, NV_SW_SEMAPHORE_OFFSET, 1); BEGIN_RING(chan, NvSubSw, NV_SW_DMA_SEMAPHORE, 2);
OUT_RING (chan, NvSema);
OUT_RING (chan, sema->mem->start); OUT_RING (chan, sema->mem->start);
BEGIN_RING(chan, NvSubSw, NV_SW_SEMAPHORE_RELEASE, 1); BEGIN_RING(chan, NvSubSw, NV_SW_SEMAPHORE_RELEASE, 1);
OUT_RING (chan, 1); OUT_RING (chan, 1);
@ -407,10 +411,12 @@ semaphore_release(struct nouveau_channel *chan, struct nouveau_semaphore *sema)
struct nouveau_vma *vma = &dev_priv->fence.bo->vma; struct nouveau_vma *vma = &dev_priv->fence.bo->vma;
u64 offset = vma->offset + sema->mem->start; u64 offset = vma->offset + sema->mem->start;
ret = RING_SPACE(chan, 5); ret = RING_SPACE(chan, 7);
if (ret) if (ret)
return ret; return ret;
BEGIN_RING(chan, NvSubSw, NV_SW_DMA_SEMAPHORE, 1);
OUT_RING (chan, chan->vram_handle);
BEGIN_RING(chan, NvSubSw, 0x0010, 4); BEGIN_RING(chan, NvSubSw, 0x0010, 4);
OUT_RING (chan, upper_32_bits(offset)); OUT_RING (chan, upper_32_bits(offset));
OUT_RING (chan, lower_32_bits(offset)); OUT_RING (chan, lower_32_bits(offset));
@ -504,22 +510,22 @@ nouveau_fence_channel_init(struct nouveau_channel *chan)
struct nouveau_gpuobj *obj = NULL; struct nouveau_gpuobj *obj = NULL;
int ret; int ret;
if (dev_priv->card_type >= NV_C0) if (dev_priv->card_type < NV_C0) {
goto out_initialised; /* Create an NV_SW object for various sync purposes */
ret = nouveau_gpuobj_gr_new(chan, NvSw, NV_SW);
if (ret)
return ret;
/* Create an NV_SW object for various sync purposes */ ret = RING_SPACE(chan, 2);
ret = nouveau_gpuobj_gr_new(chan, NvSw, NV_SW); if (ret)
if (ret) return ret;
return ret;
/* we leave subchannel empty for nvc0 */ BEGIN_RING(chan, NvSubSw, 0, 1);
ret = RING_SPACE(chan, 2); OUT_RING (chan, NvSw);
if (ret) FIRE_RING (chan);
return ret; }
BEGIN_RING(chan, NvSubSw, 0, 1);
OUT_RING(chan, NvSw);
/* Create a DMA object for the shared cross-channel sync area. */ /* Setup area of memory shared between all channels for x-chan sync */
if (USE_SEMA(dev) && dev_priv->chipset < 0x84) { if (USE_SEMA(dev) && dev_priv->chipset < 0x84) {
struct ttm_mem_reg *mem = &dev_priv->fence.bo->bo.mem; struct ttm_mem_reg *mem = &dev_priv->fence.bo->bo.mem;
@ -534,23 +540,8 @@ nouveau_fence_channel_init(struct nouveau_channel *chan)
nouveau_gpuobj_ref(NULL, &obj); nouveau_gpuobj_ref(NULL, &obj);
if (ret) if (ret)
return ret; return ret;
ret = RING_SPACE(chan, 2);
if (ret)
return ret;
BEGIN_RING(chan, NvSubSw, NV_SW_DMA_SEMAPHORE, 1);
OUT_RING(chan, NvSema);
} else {
ret = RING_SPACE(chan, 2);
if (ret)
return ret;
BEGIN_RING(chan, NvSubSw, NV_SW_DMA_SEMAPHORE, 1);
OUT_RING (chan, chan->vram_handle); /* whole VM */
} }
FIRE_RING(chan);
out_initialised:
INIT_LIST_HEAD(&chan->fence.pending); INIT_LIST_HEAD(&chan->fence.pending);
spin_lock_init(&chan->fence.lock); spin_lock_init(&chan->fence.lock);
atomic_set(&chan->fence.last_sequence_irq, 0); atomic_set(&chan->fence.last_sequence_irq, 0);

View File

@ -182,6 +182,11 @@ nouveau_perf_init(struct drm_device *dev)
entries = perf[2]; entries = perf[2];
} }
if (entries > NOUVEAU_PM_MAX_LEVEL) {
NV_DEBUG(dev, "perf table has too many entries - buggy vbios?\n");
entries = NOUVEAU_PM_MAX_LEVEL;
}
entry = perf + headerlen; entry = perf + headerlen;
for (i = 0; i < entries; i++) { for (i = 0; i < entries; i++) {
struct nouveau_pm_level *perflvl = &pm->perflvl[pm->nr_perflvl]; struct nouveau_pm_level *perflvl = &pm->perflvl[pm->nr_perflvl];

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