Merge commit 'v3.0-rc7' into devicetree/next
This commit is contained in:
commit
8c11642a50
2
CREDITS
2
CREDITS
@ -518,7 +518,7 @@ N: Zach Brown
|
|||||||
E: zab@zabbo.net
|
E: zab@zabbo.net
|
||||||
D: maestro pci sound
|
D: maestro pci sound
|
||||||
|
|
||||||
M: David Brownell
|
N: David Brownell
|
||||||
D: Kernel engineer, mentor, and friend. Maintained USB EHCI and
|
D: Kernel engineer, mentor, and friend. Maintained USB EHCI and
|
||||||
D: gadget layers, SPI subsystem, GPIO subsystem, and more than a few
|
D: gadget layers, SPI subsystem, GPIO subsystem, and more than a few
|
||||||
D: device drivers. His encouragement also helped many engineers get
|
D: device drivers. His encouragement also helped many engineers get
|
||||||
|
@ -2,13 +2,7 @@ Intro
|
|||||||
=====
|
=====
|
||||||
|
|
||||||
This document is designed to provide a list of the minimum levels of
|
This document is designed to provide a list of the minimum levels of
|
||||||
software necessary to run the 2.6 kernels, as well as provide brief
|
software necessary to run the 3.0 kernels.
|
||||||
instructions regarding any other "Gotchas" users may encounter when
|
|
||||||
trying life on the Bleeding Edge. If upgrading from a pre-2.4.x
|
|
||||||
kernel, please consult the Changes file included with 2.4.x kernels for
|
|
||||||
additional information; most of that information will not be repeated
|
|
||||||
here. Basically, this document assumes that your system is already
|
|
||||||
functional and running at least 2.4.x kernels.
|
|
||||||
|
|
||||||
This document is originally based on my "Changes" file for 2.0.x kernels
|
This document is originally based on my "Changes" file for 2.0.x kernels
|
||||||
and therefore owes credit to the same people as that file (Jared Mauch,
|
and therefore owes credit to the same people as that file (Jared Mauch,
|
||||||
@ -22,11 +16,10 @@ Upgrade to at *least* these software revisions before thinking you've
|
|||||||
encountered a bug! If you're unsure what version you're currently
|
encountered a bug! If you're unsure what version you're currently
|
||||||
running, the suggested command should tell you.
|
running, the suggested command should tell you.
|
||||||
|
|
||||||
Again, keep in mind that this list assumes you are already
|
Again, keep in mind that this list assumes you are already functionally
|
||||||
functionally running a Linux 2.4 kernel. Also, not all tools are
|
running a Linux kernel. Also, not all tools are necessary on all
|
||||||
necessary on all systems; obviously, if you don't have any ISDN
|
systems; obviously, if you don't have any ISDN hardware, for example,
|
||||||
hardware, for example, you probably needn't concern yourself with
|
you probably needn't concern yourself with isdn4k-utils.
|
||||||
isdn4k-utils.
|
|
||||||
|
|
||||||
o Gnu C 3.2 # gcc --version
|
o Gnu C 3.2 # gcc --version
|
||||||
o Gnu make 3.80 # make --version
|
o Gnu make 3.80 # make --version
|
||||||
@ -114,12 +107,12 @@ Ksymoops
|
|||||||
|
|
||||||
If the unthinkable happens and your kernel oopses, you may need the
|
If the unthinkable happens and your kernel oopses, you may need the
|
||||||
ksymoops tool to decode it, but in most cases you don't.
|
ksymoops tool to decode it, but in most cases you don't.
|
||||||
In the 2.6 kernel it is generally preferred to build the kernel with
|
It is generally preferred to build the kernel with CONFIG_KALLSYMS so
|
||||||
CONFIG_KALLSYMS so that it produces readable dumps that can be used as-is
|
that it produces readable dumps that can be used as-is (this also
|
||||||
(this also produces better output than ksymoops).
|
produces better output than ksymoops). If for some reason your kernel
|
||||||
If for some reason your kernel is not build with CONFIG_KALLSYMS and
|
is not build with CONFIG_KALLSYMS and you have no way to rebuild and
|
||||||
you have no way to rebuild and reproduce the Oops with that option, then
|
reproduce the Oops with that option, then you can still decode that Oops
|
||||||
you can still decode that Oops with ksymoops.
|
with ksymoops.
|
||||||
|
|
||||||
Module-Init-Tools
|
Module-Init-Tools
|
||||||
-----------------
|
-----------------
|
||||||
@ -261,8 +254,8 @@ needs to be recompiled or (preferably) upgraded.
|
|||||||
NFS-utils
|
NFS-utils
|
||||||
---------
|
---------
|
||||||
|
|
||||||
In 2.4 and earlier kernels, the nfs server needed to know about any
|
In ancient (2.4 and earlier) kernels, the nfs server needed to know
|
||||||
client that expected to be able to access files via NFS. This
|
about any client that expected to be able to access files via NFS. This
|
||||||
information would be given to the kernel by "mountd" when the client
|
information would be given to the kernel by "mountd" when the client
|
||||||
mounted the filesystem, or by "exportfs" at system startup. exportfs
|
mounted the filesystem, or by "exportfs" at system startup. exportfs
|
||||||
would take information about active clients from /var/lib/nfs/rmtab.
|
would take information about active clients from /var/lib/nfs/rmtab.
|
||||||
@ -272,11 +265,11 @@ which is not always easy, particularly when trying to implement
|
|||||||
fail-over. Even when the system is working well, rmtab suffers from
|
fail-over. Even when the system is working well, rmtab suffers from
|
||||||
getting lots of old entries that never get removed.
|
getting lots of old entries that never get removed.
|
||||||
|
|
||||||
With 2.6 we have the option of having the kernel tell mountd when it
|
With modern kernels we have the option of having the kernel tell mountd
|
||||||
gets a request from an unknown host, and mountd can give appropriate
|
when it gets a request from an unknown host, and mountd can give
|
||||||
export information to the kernel. This removes the dependency on
|
appropriate export information to the kernel. This removes the
|
||||||
rmtab and means that the kernel only needs to know about currently
|
dependency on rmtab and means that the kernel only needs to know about
|
||||||
active clients.
|
currently active clients.
|
||||||
|
|
||||||
To enable this new functionality, you need to:
|
To enable this new functionality, you need to:
|
||||||
|
|
||||||
|
@ -680,8 +680,8 @@ ones already enabled by DEBUG.
|
|||||||
Chapter 14: Allocating memory
|
Chapter 14: Allocating memory
|
||||||
|
|
||||||
The kernel provides the following general purpose memory allocators:
|
The kernel provides the following general purpose memory allocators:
|
||||||
kmalloc(), kzalloc(), kcalloc(), and vmalloc(). Please refer to the API
|
kmalloc(), kzalloc(), kcalloc(), vmalloc(), and vzalloc(). Please refer to
|
||||||
documentation for further information about them.
|
the API documentation for further information about them.
|
||||||
|
|
||||||
The preferred form for passing a size of a struct is the following:
|
The preferred form for passing a size of a struct is the following:
|
||||||
|
|
||||||
|
@ -77,7 +77,7 @@ Throttling/Upper Limit policy
|
|||||||
- 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" > /sys/fs/cgroup/blkio/blkio.read_bps_device
|
echo "8:16 1048576" > /sys/fs/cgroup/blkio/blkio.throttle.read_bps_device
|
||||||
|
|
||||||
Above will put a limit of 1MB/second on reads happening for root group
|
Above will put a limit of 1MB/second on reads happening for root group
|
||||||
on device having major/minor number 8:16.
|
on device having major/minor number 8:16.
|
||||||
@ -90,7 +90,7 @@ Throttling/Upper Limit policy
|
|||||||
1024+0 records out
|
1024+0 records out
|
||||||
4194304 bytes (4.2 MB) copied, 4.0001 s, 1.0 MB/s
|
4194304 bytes (4.2 MB) copied, 4.0001 s, 1.0 MB/s
|
||||||
|
|
||||||
Limits for writes can be put using blkio.write_bps_device file.
|
Limits for writes can be put using blkio.throttle.write_bps_device file.
|
||||||
|
|
||||||
Hierarchical Cgroups
|
Hierarchical Cgroups
|
||||||
====================
|
====================
|
||||||
@ -286,28 +286,28 @@ Throttling/Upper limit policy files
|
|||||||
specified in bytes per second. Rules are per deivce. Following is
|
specified in bytes per second. Rules are per deivce. Following is
|
||||||
the format.
|
the format.
|
||||||
|
|
||||||
echo "<major>:<minor> <rate_bytes_per_second>" > /cgrp/blkio.read_bps_device
|
echo "<major>:<minor> <rate_bytes_per_second>" > /cgrp/blkio.throttle.read_bps_device
|
||||||
|
|
||||||
- blkio.throttle.write_bps_device
|
- blkio.throttle.write_bps_device
|
||||||
- Specifies upper limit on WRITE rate to the device. IO rate is
|
- Specifies upper limit on WRITE rate to the device. IO rate is
|
||||||
specified in bytes per second. Rules are per deivce. Following is
|
specified in bytes per second. Rules are per deivce. Following is
|
||||||
the format.
|
the format.
|
||||||
|
|
||||||
echo "<major>:<minor> <rate_bytes_per_second>" > /cgrp/blkio.write_bps_device
|
echo "<major>:<minor> <rate_bytes_per_second>" > /cgrp/blkio.throttle.write_bps_device
|
||||||
|
|
||||||
- blkio.throttle.read_iops_device
|
- blkio.throttle.read_iops_device
|
||||||
- Specifies upper limit on READ rate from the device. IO rate is
|
- Specifies upper limit on READ rate from the device. IO rate is
|
||||||
specified in IO per second. Rules are per deivce. Following is
|
specified in IO per second. Rules are per deivce. Following is
|
||||||
the format.
|
the format.
|
||||||
|
|
||||||
echo "<major>:<minor> <rate_io_per_second>" > /cgrp/blkio.read_iops_device
|
echo "<major>:<minor> <rate_io_per_second>" > /cgrp/blkio.throttle.read_iops_device
|
||||||
|
|
||||||
- blkio.throttle.write_iops_device
|
- blkio.throttle.write_iops_device
|
||||||
- Specifies upper limit on WRITE rate to the device. IO rate is
|
- Specifies upper limit on WRITE rate to the device. IO rate is
|
||||||
specified in io per second. Rules are per deivce. Following is
|
specified in io per second. Rules are per deivce. Following is
|
||||||
the format.
|
the format.
|
||||||
|
|
||||||
echo "<major>:<minor> <rate_io_per_second>" > /cgrp/blkio.write_iops_device
|
echo "<major>:<minor> <rate_io_per_second>" > /cgrp/blkio.throttle.write_iops_device
|
||||||
|
|
||||||
Note: If both BW and IOPS rules are specified for a device, then IO is
|
Note: If both BW and IOPS rules are specified for a device, then IO is
|
||||||
subjectd to both the constraints.
|
subjectd to both the constraints.
|
||||||
|
@ -583,3 +583,25 @@ Why: Superseded by the UVCIOC_CTRL_QUERY ioctl.
|
|||||||
Who: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
Who: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||||
|
|
||||||
----------------------------
|
----------------------------
|
||||||
|
|
||||||
|
What: For VIDIOC_S_FREQUENCY the type field must match the device node's type.
|
||||||
|
If not, return -EINVAL.
|
||||||
|
When: 3.2
|
||||||
|
Why: It makes no sense to switch the tuner to radio mode by calling
|
||||||
|
VIDIOC_S_FREQUENCY on a video node, or to switch the tuner to tv mode by
|
||||||
|
calling VIDIOC_S_FREQUENCY on a radio node. This is the first step of a
|
||||||
|
move to more consistent handling of tv and radio tuners.
|
||||||
|
Who: Hans Verkuil <hans.verkuil@cisco.com>
|
||||||
|
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
What: Opening a radio device node will no longer automatically switch the
|
||||||
|
tuner mode from tv to radio.
|
||||||
|
When: 3.3
|
||||||
|
Why: Just opening a V4L device should not change the state of the hardware
|
||||||
|
like that. It's very unexpected and against the V4L spec. Instead, you
|
||||||
|
switch to radio mode by calling VIDIOC_S_FREQUENCY. This is the second
|
||||||
|
and last step of the move to consistent handling of tv and radio tuners.
|
||||||
|
Who: Hans Verkuil <hans.verkuil@cisco.com>
|
||||||
|
|
||||||
|
----------------------------
|
||||||
|
@ -673,6 +673,22 @@ storage request to complete, or it may attempt to cancel the storage request -
|
|||||||
in which case the page will not be stored in the cache this time.
|
in which case the page will not be stored in the cache this time.
|
||||||
|
|
||||||
|
|
||||||
|
BULK INODE PAGE UNCACHE
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
A convenience routine is provided to perform an uncache on all the pages
|
||||||
|
attached to an inode. This assumes that the pages on the inode correspond on a
|
||||||
|
1:1 basis with the pages in the cache.
|
||||||
|
|
||||||
|
void fscache_uncache_all_inode_pages(struct fscache_cookie *cookie,
|
||||||
|
struct inode *inode);
|
||||||
|
|
||||||
|
This takes the netfs cookie that the pages were cached with and the inode that
|
||||||
|
the pages are attached to. This function will wait for pages to finish being
|
||||||
|
written to the cache and for the cache to finish with the page generally. No
|
||||||
|
error is returned.
|
||||||
|
|
||||||
|
|
||||||
==========================
|
==========================
|
||||||
INDEX AND DATA FILE UPDATE
|
INDEX AND DATA FILE UPDATE
|
||||||
==========================
|
==========================
|
||||||
|
@ -22,6 +22,10 @@ Supported chips:
|
|||||||
Prefix: 'f71869'
|
Prefix: 'f71869'
|
||||||
Addresses scanned: none, address read from Super I/O config space
|
Addresses scanned: none, address read from Super I/O config space
|
||||||
Datasheet: Available from the Fintek website
|
Datasheet: Available from the Fintek website
|
||||||
|
* Fintek F71869A
|
||||||
|
Prefix: 'f71869a'
|
||||||
|
Addresses scanned: none, address read from Super I/O config space
|
||||||
|
Datasheet: Not public
|
||||||
* Fintek F71882FG and F71883FG
|
* Fintek F71882FG and F71883FG
|
||||||
Prefix: 'f71882fg'
|
Prefix: 'f71882fg'
|
||||||
Addresses scanned: none, address read from Super I/O config space
|
Addresses scanned: none, address read from Super I/O config space
|
||||||
|
@ -9,8 +9,8 @@ Supported chips:
|
|||||||
Socket S1G3: Athlon II, Sempron, Turion II
|
Socket S1G3: Athlon II, Sempron, Turion II
|
||||||
* AMD Family 11h processors:
|
* AMD Family 11h processors:
|
||||||
Socket S1G2: Athlon (X2), Sempron (X2), Turion X2 (Ultra)
|
Socket S1G2: Athlon (X2), Sempron (X2), Turion X2 (Ultra)
|
||||||
* AMD Family 12h processors: "Llano"
|
* AMD Family 12h processors: "Llano" (E2/A4/A6/A8-Series)
|
||||||
* AMD Family 14h processors: "Brazos" (C/E/G-Series)
|
* AMD Family 14h processors: "Brazos" (C/E/G/Z-Series)
|
||||||
* AMD Family 15h processors: "Bulldozer"
|
* AMD Family 15h processors: "Bulldozer"
|
||||||
|
|
||||||
Prefix: 'k10temp'
|
Prefix: 'k10temp'
|
||||||
@ -20,12 +20,16 @@ Supported chips:
|
|||||||
http://support.amd.com/us/Processor_TechDocs/31116.pdf
|
http://support.amd.com/us/Processor_TechDocs/31116.pdf
|
||||||
BIOS and Kernel Developer's Guide (BKDG) for AMD Family 11h Processors:
|
BIOS and Kernel Developer's Guide (BKDG) for AMD Family 11h Processors:
|
||||||
http://support.amd.com/us/Processor_TechDocs/41256.pdf
|
http://support.amd.com/us/Processor_TechDocs/41256.pdf
|
||||||
|
BIOS and Kernel Developer's Guide (BKDG) for AMD Family 12h Processors:
|
||||||
|
http://support.amd.com/us/Processor_TechDocs/41131.pdf
|
||||||
BIOS and Kernel Developer's Guide (BKDG) for AMD Family 14h Models 00h-0Fh Processors:
|
BIOS and Kernel Developer's Guide (BKDG) for AMD Family 14h Models 00h-0Fh Processors:
|
||||||
http://support.amd.com/us/Processor_TechDocs/43170.pdf
|
http://support.amd.com/us/Processor_TechDocs/43170.pdf
|
||||||
Revision Guide for AMD Family 10h Processors:
|
Revision Guide for AMD Family 10h Processors:
|
||||||
http://support.amd.com/us/Processor_TechDocs/41322.pdf
|
http://support.amd.com/us/Processor_TechDocs/41322.pdf
|
||||||
Revision Guide for AMD Family 11h Processors:
|
Revision Guide for AMD Family 11h Processors:
|
||||||
http://support.amd.com/us/Processor_TechDocs/41788.pdf
|
http://support.amd.com/us/Processor_TechDocs/41788.pdf
|
||||||
|
Revision Guide for AMD Family 12h Processors:
|
||||||
|
http://support.amd.com/us/Processor_TechDocs/44739.pdf
|
||||||
Revision Guide for AMD Family 14h Models 00h-0Fh Processors:
|
Revision Guide for AMD Family 14h Models 00h-0Fh Processors:
|
||||||
http://support.amd.com/us/Processor_TechDocs/47534.pdf
|
http://support.amd.com/us/Processor_TechDocs/47534.pdf
|
||||||
AMD Family 11h Processor Power and Thermal Data Sheet for Notebooks:
|
AMD Family 11h Processor Power and Thermal Data Sheet for Notebooks:
|
||||||
|
@ -2015,6 +2015,8 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
|||||||
the default.
|
the default.
|
||||||
off: Turn ECRC off
|
off: Turn ECRC off
|
||||||
on: Turn ECRC on.
|
on: Turn ECRC on.
|
||||||
|
realloc reallocate PCI resources if allocations done by BIOS
|
||||||
|
are erroneous.
|
||||||
|
|
||||||
pcie_aspm= [PCIE] Forcibly enable or disable PCIe Active State Power
|
pcie_aspm= [PCIE] Forcibly enable or disable PCIe Active State Power
|
||||||
Management.
|
Management.
|
||||||
|
@ -534,6 +534,8 @@ Events that are never propagated by the driver:
|
|||||||
0x2404 System is waking up from hibernation to undock
|
0x2404 System is waking up from hibernation to undock
|
||||||
0x2405 System is waking up from hibernation to eject bay
|
0x2405 System is waking up from hibernation to eject bay
|
||||||
0x5010 Brightness level changed/control event
|
0x5010 Brightness level changed/control event
|
||||||
|
0x6000 KEYBOARD: Numlock key pressed
|
||||||
|
0x6005 KEYBOARD: Fn key pressed (TO BE VERIFIED)
|
||||||
|
|
||||||
Events that are propagated by the driver to userspace:
|
Events that are propagated by the driver to userspace:
|
||||||
|
|
||||||
@ -545,6 +547,8 @@ Events that are propagated by the driver to userspace:
|
|||||||
0x3006 Bay hotplug request (hint to power up SATA link when
|
0x3006 Bay hotplug request (hint to power up SATA link when
|
||||||
the optical drive tray is ejected)
|
the optical drive tray is ejected)
|
||||||
0x4003 Undocked (see 0x2x04), can sleep again
|
0x4003 Undocked (see 0x2x04), can sleep again
|
||||||
|
0x4010 Docked into hotplug port replicator (non-ACPI dock)
|
||||||
|
0x4011 Undocked from hotplug port replicator (non-ACPI dock)
|
||||||
0x500B Tablet pen inserted into its storage bay
|
0x500B Tablet pen inserted into its storage bay
|
||||||
0x500C Tablet pen removed from its storage bay
|
0x500C Tablet pen removed from its storage bay
|
||||||
0x6011 ALARM: battery is too hot
|
0x6011 ALARM: battery is too hot
|
||||||
@ -552,6 +556,7 @@ Events that are propagated by the driver to userspace:
|
|||||||
0x6021 ALARM: a sensor is too hot
|
0x6021 ALARM: a sensor is too hot
|
||||||
0x6022 ALARM: a sensor is extremely hot
|
0x6022 ALARM: a sensor is extremely hot
|
||||||
0x6030 System thermal table changed
|
0x6030 System thermal table changed
|
||||||
|
0x6040 Nvidia Optimus/AC adapter related (TO BE VERIFIED)
|
||||||
|
|
||||||
Battery nearly empty alarms are a last resort attempt to get the
|
Battery nearly empty alarms are a last resort attempt to get the
|
||||||
operating system to hibernate or shutdown cleanly (0x2313), or shutdown
|
operating system to hibernate or shutdown cleanly (0x2313), or shutdown
|
||||||
|
@ -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
|
||||||
|
@ -501,13 +501,29 @@ helper functions described in Section 4. In that case, pm_runtime_resume()
|
|||||||
should be used. Of course, for this purpose the device's run-time PM has to be
|
should be used. Of course, for this purpose the device's run-time PM has to be
|
||||||
enabled earlier by calling pm_runtime_enable().
|
enabled earlier by calling pm_runtime_enable().
|
||||||
|
|
||||||
If the device bus type's or driver's ->probe() or ->remove() callback runs
|
If the device bus type's or driver's ->probe() callback runs
|
||||||
pm_runtime_suspend() or pm_runtime_idle() or their asynchronous counterparts,
|
pm_runtime_suspend() or pm_runtime_idle() or their asynchronous counterparts,
|
||||||
they will fail returning -EAGAIN, because the device's usage counter is
|
they will fail returning -EAGAIN, because the device's usage counter is
|
||||||
incremented by the core before executing ->probe() and ->remove(). Still, it
|
incremented by the driver core before executing ->probe(). Still, it may be
|
||||||
may be desirable to suspend the device as soon as ->probe() or ->remove() has
|
desirable to suspend the device as soon as ->probe() has finished, so the driver
|
||||||
finished, so the PM core uses pm_runtime_idle_sync() to invoke the
|
core uses pm_runtime_put_sync() to invoke the subsystem-level idle callback for
|
||||||
subsystem-level idle callback for the device at that time.
|
the device at that time.
|
||||||
|
|
||||||
|
Moreover, the driver core prevents runtime PM callbacks from racing with the bus
|
||||||
|
notifier callback in __device_release_driver(), which is necessary, because the
|
||||||
|
notifier is used by some subsystems to carry out operations affecting the
|
||||||
|
runtime PM functionality. It does so by calling pm_runtime_get_sync() before
|
||||||
|
driver_sysfs_remove() and the BUS_NOTIFY_UNBIND_DRIVER notifications. This
|
||||||
|
resumes the device if it's in the suspended state and prevents it from
|
||||||
|
being suspended again while those routines are being executed.
|
||||||
|
|
||||||
|
To allow bus types and drivers to put devices into the suspended state by
|
||||||
|
calling pm_runtime_suspend() from their ->remove() routines, the driver core
|
||||||
|
executes pm_runtime_put_sync() after running the BUS_NOTIFY_UNBIND_DRIVER
|
||||||
|
notifications in __device_release_driver(). This requires bus types and
|
||||||
|
drivers to make their ->remove() callbacks avoid races with runtime PM directly,
|
||||||
|
but also it allows of more flexibility in the handling of devices during the
|
||||||
|
removal of their drivers.
|
||||||
|
|
||||||
The user space can effectively disallow the driver of the device to power manage
|
The user space can effectively disallow the driver of the device to power manage
|
||||||
it at run time by changing the value of its /sys/devices/.../power/control
|
it at run time by changing the value of its /sys/devices/.../power/control
|
||||||
@ -566,11 +582,6 @@ to do this is:
|
|||||||
pm_runtime_set_active(dev);
|
pm_runtime_set_active(dev);
|
||||||
pm_runtime_enable(dev);
|
pm_runtime_enable(dev);
|
||||||
|
|
||||||
The PM core always increments the run-time usage counter before calling the
|
|
||||||
->prepare() callback and decrements it after calling the ->complete() callback.
|
|
||||||
Hence disabling run-time PM temporarily like this will not cause any run-time
|
|
||||||
suspend callbacks to be lost.
|
|
||||||
|
|
||||||
7. Generic subsystem callbacks
|
7. Generic subsystem callbacks
|
||||||
|
|
||||||
Subsystems may wish to conserve code space by using the set of generic power
|
Subsystems may wish to conserve code space by using the set of generic power
|
||||||
|
@ -13,18 +13,8 @@ static DEFINE_SPINLOCK(xxx_lock);
|
|||||||
The above is always safe. It will disable interrupts _locally_, but the
|
The above is always safe. It will disable interrupts _locally_, but the
|
||||||
spinlock itself will guarantee the global lock, so it will guarantee that
|
spinlock itself will guarantee the global lock, so it will guarantee that
|
||||||
there is only one thread-of-control within the region(s) protected by that
|
there is only one thread-of-control within the region(s) protected by that
|
||||||
lock. This works well even under UP. The above sequence under UP
|
lock. This works well even under UP also, so the code does _not_ need to
|
||||||
essentially is just the same as doing
|
worry about UP vs SMP issues: the spinlocks work correctly under both.
|
||||||
|
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
save_flags(flags); cli();
|
|
||||||
... critical section ...
|
|
||||||
restore_flags(flags);
|
|
||||||
|
|
||||||
so the code does _not_ need to worry about UP vs SMP issues: the spinlocks
|
|
||||||
work correctly under both (and spinlocks are actually more efficient on
|
|
||||||
architectures that allow doing the "save_flags + cli" in one operation).
|
|
||||||
|
|
||||||
NOTE! Implications of spin_locks for memory are further described in:
|
NOTE! Implications of spin_locks for memory are further described in:
|
||||||
|
|
||||||
@ -36,27 +26,7 @@ The above is usually pretty simple (you usually need and want only one
|
|||||||
spinlock for most things - using more than one spinlock can make things a
|
spinlock for most things - using more than one spinlock can make things a
|
||||||
lot more complex and even slower and is usually worth it only for
|
lot more complex and even slower and is usually worth it only for
|
||||||
sequences that you _know_ need to be split up: avoid it at all cost if you
|
sequences that you _know_ need to be split up: avoid it at all cost if you
|
||||||
aren't sure). HOWEVER, it _does_ mean that if you have some code that does
|
aren't sure).
|
||||||
|
|
||||||
cli();
|
|
||||||
.. critical section ..
|
|
||||||
sti();
|
|
||||||
|
|
||||||
and another sequence that does
|
|
||||||
|
|
||||||
spin_lock_irqsave(flags);
|
|
||||||
.. critical section ..
|
|
||||||
spin_unlock_irqrestore(flags);
|
|
||||||
|
|
||||||
then they are NOT mutually exclusive, and the critical regions can happen
|
|
||||||
at the same time on two different CPU's. That's fine per se, but the
|
|
||||||
critical regions had better be critical for different things (ie they
|
|
||||||
can't stomp on each other).
|
|
||||||
|
|
||||||
The above is a problem mainly if you end up mixing code - for example the
|
|
||||||
routines in ll_rw_block() tend to use cli/sti to protect the atomicity of
|
|
||||||
their actions, and if a driver uses spinlocks instead then you should
|
|
||||||
think about issues like the above.
|
|
||||||
|
|
||||||
This is really the only really hard part about spinlocks: once you start
|
This is really the only really hard part about spinlocks: once you start
|
||||||
using spinlocks they tend to expand to areas you might not have noticed
|
using spinlocks they tend to expand to areas you might not have noticed
|
||||||
@ -120,11 +90,10 @@ Lesson 3: spinlocks revisited.
|
|||||||
|
|
||||||
The single spin-lock primitives above are by no means the only ones. They
|
The single spin-lock primitives above are by no means the only ones. They
|
||||||
are the most safe ones, and the ones that work under all circumstances,
|
are the most safe ones, and the ones that work under all circumstances,
|
||||||
but partly _because_ they are safe they are also fairly slow. They are
|
but partly _because_ they are safe they are also fairly slow. They are slower
|
||||||
much faster than a generic global cli/sti pair, but slower than they'd
|
than they'd need to be, because they do have to disable interrupts
|
||||||
need to be, because they do have to disable interrupts (which is just a
|
(which is just a single instruction on a x86, but it's an expensive one -
|
||||||
single instruction on a x86, but it's an expensive one - and on other
|
and on other architectures it can be worse).
|
||||||
architectures it can be worse).
|
|
||||||
|
|
||||||
If you have a case where you have to protect a data structure across
|
If you have a case where you have to protect a data structure across
|
||||||
several CPU's and you want to use spinlocks you can potentially use
|
several CPU's and you want to use spinlocks you can potentially use
|
||||||
|
@ -76,6 +76,13 @@ A transfer's actual_length may be positive even when an error has been
|
|||||||
reported. That's because transfers often involve several packets, so that
|
reported. That's because transfers often involve several packets, so that
|
||||||
one or more packets could finish before an error stops further endpoint I/O.
|
one or more packets could finish before an error stops further endpoint I/O.
|
||||||
|
|
||||||
|
For isochronous URBs, the urb status value is non-zero only if the URB is
|
||||||
|
unlinked, the device is removed, the host controller is disabled, or the total
|
||||||
|
transferred length is less than the requested length and the URB_SHORT_NOT_OK
|
||||||
|
flag is set. Completion handlers for isochronous URBs should only see
|
||||||
|
urb->status set to zero, -ENOENT, -ECONNRESET, -ESHUTDOWN, or -EREMOTEIO.
|
||||||
|
Individual frame descriptor status fields may report more status codes.
|
||||||
|
|
||||||
|
|
||||||
0 Transfer completed successfully
|
0 Transfer completed successfully
|
||||||
|
|
||||||
@ -132,7 +139,7 @@ one or more packets could finish before an error stops further endpoint I/O.
|
|||||||
device removal events immediately.
|
device removal events immediately.
|
||||||
|
|
||||||
-EXDEV ISO transfer only partially completed
|
-EXDEV ISO transfer only partially completed
|
||||||
look at individual frame status for details
|
(only set in iso_frame_desc[n].status, not urb->status)
|
||||||
|
|
||||||
-EINVAL ISO madness, if this happens: Log off and go home
|
-EINVAL ISO madness, if this happens: Log off and go home
|
||||||
|
|
||||||
|
44
MAINTAINERS
44
MAINTAINERS
@ -594,6 +594,16 @@ S: Maintained
|
|||||||
F: arch/arm/lib/floppydma.S
|
F: arch/arm/lib/floppydma.S
|
||||||
F: arch/arm/include/asm/floppy.h
|
F: arch/arm/include/asm/floppy.h
|
||||||
|
|
||||||
|
ARM PMU PROFILING AND DEBUGGING
|
||||||
|
M: Will Deacon <will.deacon@arm.com>
|
||||||
|
S: Maintained
|
||||||
|
F: arch/arm/kernel/perf_event*
|
||||||
|
F: arch/arm/oprofile/common.c
|
||||||
|
F: arch/arm/kernel/pmu.c
|
||||||
|
F: arch/arm/include/asm/pmu.h
|
||||||
|
F: arch/arm/kernel/hw_breakpoint.c
|
||||||
|
F: arch/arm/include/asm/hw_breakpoint.h
|
||||||
|
|
||||||
ARM PORT
|
ARM PORT
|
||||||
M: Russell King <linux@arm.linux.org.uk>
|
M: Russell King <linux@arm.linux.org.uk>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
@ -1345,16 +1355,18 @@ F: drivers/auxdisplay/
|
|||||||
F: include/linux/cfag12864b.h
|
F: include/linux/cfag12864b.h
|
||||||
|
|
||||||
AVR32 ARCHITECTURE
|
AVR32 ARCHITECTURE
|
||||||
M: Hans-Christian Egtvedt <hans-christian.egtvedt@atmel.com>
|
M: Haavard Skinnemoen <hskinnemoen@gmail.com>
|
||||||
|
M: Hans-Christian Egtvedt <egtvedt@samfundet.no>
|
||||||
W: http://www.atmel.com/products/AVR32/
|
W: http://www.atmel.com/products/AVR32/
|
||||||
W: http://avr32linux.org/
|
W: http://avr32linux.org/
|
||||||
W: http://avrfreaks.net/
|
W: http://avrfreaks.net/
|
||||||
S: Supported
|
S: Maintained
|
||||||
F: arch/avr32/
|
F: arch/avr32/
|
||||||
|
|
||||||
AVR32/AT32AP MACHINE SUPPORT
|
AVR32/AT32AP MACHINE SUPPORT
|
||||||
M: Hans-Christian Egtvedt <hans-christian.egtvedt@atmel.com>
|
M: Haavard Skinnemoen <hskinnemoen@gmail.com>
|
||||||
S: Supported
|
M: Hans-Christian Egtvedt <egtvedt@samfundet.no>
|
||||||
|
S: Maintained
|
||||||
F: arch/avr32/mach-at32ap/
|
F: arch/avr32/mach-at32ap/
|
||||||
|
|
||||||
AX.25 NETWORK LAYER
|
AX.25 NETWORK LAYER
|
||||||
@ -1390,7 +1402,6 @@ F: include/linux/backlight.h
|
|||||||
BATMAN ADVANCED
|
BATMAN ADVANCED
|
||||||
M: Marek Lindner <lindner_marek@yahoo.de>
|
M: Marek Lindner <lindner_marek@yahoo.de>
|
||||||
M: Simon Wunderlich <siwu@hrz.tu-chemnitz.de>
|
M: Simon Wunderlich <siwu@hrz.tu-chemnitz.de>
|
||||||
M: Sven Eckelmann <sven@narfation.org>
|
|
||||||
L: b.a.t.m.a.n@lists.open-mesh.org
|
L: b.a.t.m.a.n@lists.open-mesh.org
|
||||||
W: http://www.open-mesh.org/
|
W: http://www.open-mesh.org/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
@ -1423,7 +1434,6 @@ S: Supported
|
|||||||
F: arch/blackfin/
|
F: arch/blackfin/
|
||||||
|
|
||||||
BLACKFIN EMAC DRIVER
|
BLACKFIN EMAC DRIVER
|
||||||
M: Michael Hennerich <michael.hennerich@analog.com>
|
|
||||||
L: uclinux-dist-devel@blackfin.uclinux.org
|
L: uclinux-dist-devel@blackfin.uclinux.org
|
||||||
W: http://blackfin.uclinux.org
|
W: http://blackfin.uclinux.org
|
||||||
S: Supported
|
S: Supported
|
||||||
@ -1639,7 +1649,7 @@ CAN NETWORK LAYER
|
|||||||
M: Oliver Hartkopp <socketcan@hartkopp.net>
|
M: Oliver Hartkopp <socketcan@hartkopp.net>
|
||||||
M: Oliver Hartkopp <oliver.hartkopp@volkswagen.de>
|
M: Oliver Hartkopp <oliver.hartkopp@volkswagen.de>
|
||||||
M: Urs Thuermann <urs.thuermann@volkswagen.de>
|
M: Urs Thuermann <urs.thuermann@volkswagen.de>
|
||||||
L: socketcan-core@lists.berlios.de
|
L: socketcan-core@lists.berlios.de (subscribers-only)
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
W: http://developer.berlios.de/projects/socketcan/
|
W: http://developer.berlios.de/projects/socketcan/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
@ -1651,7 +1661,7 @@ F: include/linux/can/raw.h
|
|||||||
|
|
||||||
CAN NETWORK DRIVERS
|
CAN NETWORK DRIVERS
|
||||||
M: Wolfgang Grandegger <wg@grandegger.com>
|
M: Wolfgang Grandegger <wg@grandegger.com>
|
||||||
L: socketcan-core@lists.berlios.de
|
L: socketcan-core@lists.berlios.de (subscribers-only)
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
W: http://developer.berlios.de/projects/socketcan/
|
W: http://developer.berlios.de/projects/socketcan/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
@ -2197,7 +2207,7 @@ F: drivers/acpi/dock.c
|
|||||||
DOCUMENTATION
|
DOCUMENTATION
|
||||||
M: Randy Dunlap <rdunlap@xenotime.net>
|
M: Randy Dunlap <rdunlap@xenotime.net>
|
||||||
L: linux-doc@vger.kernel.org
|
L: linux-doc@vger.kernel.org
|
||||||
T: quilt oss.oracle.com/~rdunlap/kernel-doc-patches/current/
|
T: quilt http://userweb.kernel.org/~rdunlap/kernel-doc-patches/current/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/
|
F: Documentation/
|
||||||
|
|
||||||
@ -4982,7 +4992,7 @@ F: drivers/power/power_supply*
|
|||||||
|
|
||||||
PNP SUPPORT
|
PNP SUPPORT
|
||||||
M: Adam Belay <abelay@mit.edu>
|
M: Adam Belay <abelay@mit.edu>
|
||||||
M: Bjorn Helgaas <bjorn.helgaas@hp.com>
|
M: Bjorn Helgaas <bhelgaas@google.com>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/pnp/
|
F: drivers/pnp/
|
||||||
|
|
||||||
@ -5181,6 +5191,7 @@ S: Supported
|
|||||||
F: drivers/net/qlcnic/
|
F: drivers/net/qlcnic/
|
||||||
|
|
||||||
QLOGIC QLGE 10Gb ETHERNET DRIVER
|
QLOGIC QLGE 10Gb ETHERNET DRIVER
|
||||||
|
M: Jitendra Kalsaria <jitendra.kalsaria@qlogic.com>
|
||||||
M: Ron Mercer <ron.mercer@qlogic.com>
|
M: Ron Mercer <ron.mercer@qlogic.com>
|
||||||
M: linux-driver@qlogic.com
|
M: linux-driver@qlogic.com
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
@ -6434,8 +6445,9 @@ S: Maintained
|
|||||||
F: drivers/usb/misc/rio500*
|
F: drivers/usb/misc/rio500*
|
||||||
|
|
||||||
USB EHCI DRIVER
|
USB EHCI DRIVER
|
||||||
|
M: Alan Stern <stern@rowland.harvard.edu>
|
||||||
L: linux-usb@vger.kernel.org
|
L: linux-usb@vger.kernel.org
|
||||||
S: Orphan
|
S: Maintained
|
||||||
F: Documentation/usb/ehci.txt
|
F: Documentation/usb/ehci.txt
|
||||||
F: drivers/usb/host/ehci*
|
F: drivers/usb/host/ehci*
|
||||||
|
|
||||||
@ -6465,6 +6477,12 @@ S: Maintained
|
|||||||
F: Documentation/hid/hiddev.txt
|
F: Documentation/hid/hiddev.txt
|
||||||
F: drivers/hid/usbhid/
|
F: drivers/hid/usbhid/
|
||||||
|
|
||||||
|
USB/IP DRIVERS
|
||||||
|
M: Matt Mooney <mfm@muteddisk.com>
|
||||||
|
L: linux-usb@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
F: drivers/staging/usbip/
|
||||||
|
|
||||||
USB ISP116X DRIVER
|
USB ISP116X DRIVER
|
||||||
M: Olav Kongas <ok@artecdesign.ee>
|
M: Olav Kongas <ok@artecdesign.ee>
|
||||||
L: linux-usb@vger.kernel.org
|
L: linux-usb@vger.kernel.org
|
||||||
@ -6494,8 +6512,9 @@ S: Maintained
|
|||||||
F: sound/usb/midi.*
|
F: sound/usb/midi.*
|
||||||
|
|
||||||
USB OHCI DRIVER
|
USB OHCI DRIVER
|
||||||
|
M: Alan Stern <stern@rowland.harvard.edu>
|
||||||
L: linux-usb@vger.kernel.org
|
L: linux-usb@vger.kernel.org
|
||||||
S: Orphan
|
S: Maintained
|
||||||
F: Documentation/usb/ohci.txt
|
F: Documentation/usb/ohci.txt
|
||||||
F: drivers/usb/host/ohci*
|
F: drivers/usb/host/ohci*
|
||||||
|
|
||||||
@ -6724,6 +6743,7 @@ F: fs/fat/
|
|||||||
VIDEOBUF2 FRAMEWORK
|
VIDEOBUF2 FRAMEWORK
|
||||||
M: Pawel Osciak <pawel@osciak.com>
|
M: Pawel Osciak <pawel@osciak.com>
|
||||||
M: Marek Szyprowski <m.szyprowski@samsung.com>
|
M: Marek Szyprowski <m.szyprowski@samsung.com>
|
||||||
|
M: Kyungmin Park <kyungmin.park@samsung.com>
|
||||||
L: linux-media@vger.kernel.org
|
L: linux-media@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/media/video/videobuf2-*
|
F: drivers/media/video/videobuf2-*
|
||||||
|
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
|||||||
VERSION = 3
|
VERSION = 3
|
||||||
PATCHLEVEL = 0
|
PATCHLEVEL = 0
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc4
|
EXTRAVERSION = -rc7
|
||||||
NAME = Sneaky Weasel
|
NAME = Sneaky Weasel
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
42
README
42
README
@ -1,6 +1,6 @@
|
|||||||
Linux kernel release 2.6.xx <http://kernel.org/>
|
Linux kernel release 3.x <http://kernel.org/>
|
||||||
|
|
||||||
These are the release notes for Linux version 2.6. Read them carefully,
|
These are the release notes for Linux version 3. Read them carefully,
|
||||||
as they tell you what this is all about, explain how to install the
|
as they tell you what this is all about, explain how to install the
|
||||||
kernel, and what to do if something goes wrong.
|
kernel, and what to do if something goes wrong.
|
||||||
|
|
||||||
@ -62,10 +62,10 @@ INSTALLING the kernel source:
|
|||||||
directory where you have permissions (eg. your home directory) and
|
directory where you have permissions (eg. your home directory) and
|
||||||
unpack it:
|
unpack it:
|
||||||
|
|
||||||
gzip -cd linux-2.6.XX.tar.gz | tar xvf -
|
gzip -cd linux-3.X.tar.gz | tar xvf -
|
||||||
|
|
||||||
or
|
or
|
||||||
bzip2 -dc linux-2.6.XX.tar.bz2 | tar xvf -
|
bzip2 -dc linux-3.X.tar.bz2 | tar xvf -
|
||||||
|
|
||||||
|
|
||||||
Replace "XX" with the version number of the latest kernel.
|
Replace "XX" with the version number of the latest kernel.
|
||||||
@ -75,15 +75,15 @@ INSTALLING the kernel source:
|
|||||||
files. They should match the library, and not get messed up by
|
files. They should match the library, and not get messed up by
|
||||||
whatever the kernel-du-jour happens to be.
|
whatever the kernel-du-jour happens to be.
|
||||||
|
|
||||||
- You can also upgrade between 2.6.xx releases by patching. Patches are
|
- You can also upgrade between 3.x releases by patching. Patches are
|
||||||
distributed in the traditional gzip and the newer bzip2 format. To
|
distributed in the traditional gzip and the newer bzip2 format. To
|
||||||
install by patching, get all the newer patch files, enter the
|
install by patching, get all the newer patch files, enter the
|
||||||
top level directory of the kernel source (linux-2.6.xx) and execute:
|
top level directory of the kernel source (linux-3.x) and execute:
|
||||||
|
|
||||||
gzip -cd ../patch-2.6.xx.gz | patch -p1
|
gzip -cd ../patch-3.x.gz | patch -p1
|
||||||
|
|
||||||
or
|
or
|
||||||
bzip2 -dc ../patch-2.6.xx.bz2 | patch -p1
|
bzip2 -dc ../patch-3.x.bz2 | patch -p1
|
||||||
|
|
||||||
(repeat xx for all versions bigger than the version of your current
|
(repeat xx for all versions bigger than the version of your current
|
||||||
source tree, _in_order_) and you should be ok. You may want to remove
|
source tree, _in_order_) and you should be ok. You may want to remove
|
||||||
@ -91,9 +91,9 @@ INSTALLING the kernel source:
|
|||||||
failed patches (xxx# or xxx.rej). If there are, either you or me has
|
failed patches (xxx# or xxx.rej). If there are, either you or me has
|
||||||
made a mistake.
|
made a mistake.
|
||||||
|
|
||||||
Unlike patches for the 2.6.x kernels, patches for the 2.6.x.y kernels
|
Unlike patches for the 3.x kernels, patches for the 3.x.y kernels
|
||||||
(also known as the -stable kernels) are not incremental but instead apply
|
(also known as the -stable kernels) are not incremental but instead apply
|
||||||
directly to the base 2.6.x kernel. Please read
|
directly to the base 3.x kernel. Please read
|
||||||
Documentation/applying-patches.txt for more information.
|
Documentation/applying-patches.txt for more information.
|
||||||
|
|
||||||
Alternatively, the script patch-kernel can be used to automate this
|
Alternatively, the script patch-kernel can be used to automate this
|
||||||
@ -107,14 +107,14 @@ INSTALLING the kernel source:
|
|||||||
an alternative directory can be specified as the second argument.
|
an alternative directory can be specified as the second argument.
|
||||||
|
|
||||||
- If you are upgrading between releases using the stable series patches
|
- If you are upgrading between releases using the stable series patches
|
||||||
(for example, patch-2.6.xx.y), note that these "dot-releases" are
|
(for example, patch-3.x.y), note that these "dot-releases" are
|
||||||
not incremental and must be applied to the 2.6.xx base tree. For
|
not incremental and must be applied to the 3.x base tree. For
|
||||||
example, if your base kernel is 2.6.12 and you want to apply the
|
example, if your base kernel is 3.0 and you want to apply the
|
||||||
2.6.12.3 patch, you do not and indeed must not first apply the
|
3.0.3 patch, you do not and indeed must not first apply the
|
||||||
2.6.12.1 and 2.6.12.2 patches. Similarly, if you are running kernel
|
3.0.1 and 3.0.2 patches. Similarly, if you are running kernel
|
||||||
version 2.6.12.2 and want to jump to 2.6.12.3, you must first
|
version 3.0.2 and want to jump to 3.0.3, you must first
|
||||||
reverse the 2.6.12.2 patch (that is, patch -R) _before_ applying
|
reverse the 3.0.2 patch (that is, patch -R) _before_ applying
|
||||||
the 2.6.12.3 patch.
|
the 3.0.3 patch.
|
||||||
You can read more on this in Documentation/applying-patches.txt
|
You can read more on this in Documentation/applying-patches.txt
|
||||||
|
|
||||||
- Make sure you have no stale .o files and dependencies lying around:
|
- Make sure you have no stale .o files and dependencies lying around:
|
||||||
@ -126,7 +126,7 @@ INSTALLING the kernel source:
|
|||||||
|
|
||||||
SOFTWARE REQUIREMENTS
|
SOFTWARE REQUIREMENTS
|
||||||
|
|
||||||
Compiling and running the 2.6.xx kernels requires up-to-date
|
Compiling and running the 3.x kernels requires up-to-date
|
||||||
versions of various software packages. Consult
|
versions of various software packages. Consult
|
||||||
Documentation/Changes for the minimum version numbers required
|
Documentation/Changes for the minimum version numbers required
|
||||||
and how to get updates for these packages. Beware that using
|
and how to get updates for these packages. Beware that using
|
||||||
@ -142,11 +142,11 @@ BUILD directory for the kernel:
|
|||||||
Using the option "make O=output/dir" allow you to specify an alternate
|
Using the option "make O=output/dir" allow you to specify an alternate
|
||||||
place for the output files (including .config).
|
place for the output files (including .config).
|
||||||
Example:
|
Example:
|
||||||
kernel source code: /usr/src/linux-2.6.N
|
kernel source code: /usr/src/linux-3.N
|
||||||
build directory: /home/name/build/kernel
|
build directory: /home/name/build/kernel
|
||||||
|
|
||||||
To configure and build the kernel use:
|
To configure and build the kernel use:
|
||||||
cd /usr/src/linux-2.6.N
|
cd /usr/src/linux-3.N
|
||||||
make O=/home/name/build/kernel menuconfig
|
make O=/home/name/build/kernel menuconfig
|
||||||
make O=/home/name/build/kernel
|
make O=/home/name/build/kernel
|
||||||
sudo make O=/home/name/build/kernel modules_install install
|
sudo make O=/home/name/build/kernel modules_install install
|
||||||
|
@ -56,7 +56,6 @@ PLAT_NODE_DATA_LOCALNR(unsigned long p, int n)
|
|||||||
* Given a kernel address, find the home node of the underlying memory.
|
* Given a kernel address, find the home node of the underlying memory.
|
||||||
*/
|
*/
|
||||||
#define kvaddr_to_nid(kaddr) pa_to_nid(__pa(kaddr))
|
#define kvaddr_to_nid(kaddr) pa_to_nid(__pa(kaddr))
|
||||||
#define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Given a kaddr, LOCAL_BASE_ADDR finds the owning node of the memory
|
* Given a kaddr, LOCAL_BASE_ADDR finds the owning node of the memory
|
||||||
|
@ -597,6 +597,8 @@ __common_mmu_cache_on:
|
|||||||
sub pc, lr, r0, lsr #32 @ properly flush pipeline
|
sub pc, lr, r0, lsr #32 @ properly flush pipeline
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define PROC_ENTRY_SIZE (4*5)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Here follow the relocatable cache support functions for the
|
* Here follow the relocatable cache support functions for the
|
||||||
* various processors. This is a generic hook for locating an
|
* various processors. This is a generic hook for locating an
|
||||||
@ -624,7 +626,7 @@ call_cache_fn: adr r12, proc_types
|
|||||||
ARM( addeq pc, r12, r3 ) @ call cache function
|
ARM( addeq pc, r12, r3 ) @ call cache function
|
||||||
THUMB( addeq r12, r3 )
|
THUMB( addeq r12, r3 )
|
||||||
THUMB( moveq pc, r12 ) @ call cache function
|
THUMB( moveq pc, r12 ) @ call cache function
|
||||||
add r12, r12, #4*5
|
add r12, r12, #PROC_ENTRY_SIZE
|
||||||
b 1b
|
b 1b
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -794,6 +796,16 @@ proc_types:
|
|||||||
|
|
||||||
.size proc_types, . - proc_types
|
.size proc_types, . - proc_types
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If you get a "non-constant expression in ".if" statement"
|
||||||
|
* error from the assembler on this line, check that you have
|
||||||
|
* not accidentally written a "b" instruction where you should
|
||||||
|
* have written W(b).
|
||||||
|
*/
|
||||||
|
.if (. - proc_types) % PROC_ENTRY_SIZE != 0
|
||||||
|
.error "The size of one or more proc_types entries is wrong."
|
||||||
|
.endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Turn off the Cache and MMU. ARMv3 does not support
|
* Turn off the Cache and MMU. ARMv3 does not support
|
||||||
* reading the control register, but ARMv4 does.
|
* reading the control register, but ARMv4 does.
|
||||||
|
@ -255,7 +255,7 @@ static inline dma_addr_t map_single(struct device *dev, void *ptr, size_t size,
|
|||||||
if (buf == 0) {
|
if (buf == 0) {
|
||||||
dev_err(dev, "%s: unable to map unsafe buffer %p!\n",
|
dev_err(dev, "%s: unable to map unsafe buffer %p!\n",
|
||||||
__func__, ptr);
|
__func__, ptr);
|
||||||
return 0;
|
return ~0;
|
||||||
}
|
}
|
||||||
|
|
||||||
dev_dbg(dev,
|
dev_dbg(dev,
|
||||||
|
@ -13,6 +13,9 @@
|
|||||||
* Do not include any C declarations in this file - it is included by
|
* Do not include any C declarations in this file - it is included by
|
||||||
* assembler source.
|
* assembler source.
|
||||||
*/
|
*/
|
||||||
|
#ifndef __ASM_ASSEMBLER_H__
|
||||||
|
#define __ASM_ASSEMBLER_H__
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
#error "Only include this from assembly code"
|
#error "Only include this from assembly code"
|
||||||
#endif
|
#endif
|
||||||
@ -290,3 +293,4 @@
|
|||||||
.macro ldrusr, reg, ptr, inc, cond=al, rept=1, abort=9001f
|
.macro ldrusr, reg, ptr, inc, cond=al, rept=1, abort=9001f
|
||||||
usracc ldr, \reg, \ptr, \inc, \cond, \rept, \abort
|
usracc ldr, \reg, \ptr, \inc, \cond, \rept, \abort
|
||||||
.endm
|
.endm
|
||||||
|
#endif /* __ASM_ASSEMBLER_H__ */
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
#include <asm/assembler.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Interrupt handling. Preserves r7, r8, r9
|
* Interrupt handling. Preserves r7, r8, r9
|
||||||
*/
|
*/
|
||||||
|
@ -193,8 +193,17 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex,
|
|||||||
offset -= 0x02000000;
|
offset -= 0x02000000;
|
||||||
offset += sym->st_value - loc;
|
offset += sym->st_value - loc;
|
||||||
|
|
||||||
/* only Thumb addresses allowed (no interworking) */
|
/*
|
||||||
if (!(offset & 1) ||
|
* For function symbols, only Thumb addresses are
|
||||||
|
* allowed (no interworking).
|
||||||
|
*
|
||||||
|
* For non-function symbols, the destination
|
||||||
|
* has no specific ARM/Thumb disposition, so
|
||||||
|
* the branch is resolved under the assumption
|
||||||
|
* that interworking is not required.
|
||||||
|
*/
|
||||||
|
if ((ELF32_ST_TYPE(sym->st_info) == STT_FUNC &&
|
||||||
|
!(offset & 1)) ||
|
||||||
offset <= (s32)0xff000000 ||
|
offset <= (s32)0xff000000 ||
|
||||||
offset >= (s32)0x01000000) {
|
offset >= (s32)0x01000000) {
|
||||||
pr_err("%s: section %u reloc %u sym '%s': relocation %u out of range (%#lx -> %#x)\n",
|
pr_err("%s: section %u reloc %u sym '%s': relocation %u out of range (%#lx -> %#x)\n",
|
||||||
|
@ -583,7 +583,7 @@ static int armpmu_event_init(struct perf_event *event)
|
|||||||
static void armpmu_enable(struct pmu *pmu)
|
static void armpmu_enable(struct pmu *pmu)
|
||||||
{
|
{
|
||||||
/* Enable all of the perf events on hardware. */
|
/* Enable all of the perf events on hardware. */
|
||||||
int idx;
|
int idx, enabled = 0;
|
||||||
struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events);
|
struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events);
|
||||||
|
|
||||||
if (!armpmu)
|
if (!armpmu)
|
||||||
@ -596,9 +596,11 @@ static void armpmu_enable(struct pmu *pmu)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
armpmu->enable(&event->hw, idx);
|
armpmu->enable(&event->hw, idx);
|
||||||
|
enabled = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
armpmu->start();
|
if (enabled)
|
||||||
|
armpmu->start();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void armpmu_disable(struct pmu *pmu)
|
static void armpmu_disable(struct pmu *pmu)
|
||||||
|
@ -73,6 +73,7 @@ __setup("fpe=", fpe_setup);
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern void paging_init(struct machine_desc *desc);
|
extern void paging_init(struct machine_desc *desc);
|
||||||
|
extern void sanity_check_meminfo(void);
|
||||||
extern void reboot_setup(char *str);
|
extern void reboot_setup(char *str);
|
||||||
|
|
||||||
unsigned int processor_id;
|
unsigned int processor_id;
|
||||||
@ -900,6 +901,7 @@ void __init setup_arch(char **cmdline_p)
|
|||||||
|
|
||||||
parse_early_param();
|
parse_early_param();
|
||||||
|
|
||||||
|
sanity_check_meminfo();
|
||||||
arm_memblock_init(&meminfo, mdesc);
|
arm_memblock_init(&meminfo, mdesc);
|
||||||
|
|
||||||
paging_init(mdesc);
|
paging_init(mdesc);
|
||||||
|
@ -318,9 +318,13 @@ asmlinkage void __cpuinit secondary_start_kernel(void)
|
|||||||
smp_store_cpu_info(cpu);
|
smp_store_cpu_info(cpu);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* OK, now it's safe to let the boot CPU continue
|
* OK, now it's safe to let the boot CPU continue. Wait for
|
||||||
|
* the CPU migration code to notice that the CPU is online
|
||||||
|
* before we continue.
|
||||||
*/
|
*/
|
||||||
set_cpu_online(cpu, true);
|
set_cpu_online(cpu, true);
|
||||||
|
while (!cpu_active(cpu))
|
||||||
|
cpu_relax();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* OK, it's off to the idle thread for us
|
* OK, it's off to the idle thread for us
|
||||||
|
@ -115,7 +115,7 @@ static void __cpuinit twd_calibrate_rate(void)
|
|||||||
twd_timer_rate = (0xFFFFFFFFU - count) * (HZ / 5);
|
twd_timer_rate = (0xFFFFFFFFU - count) * (HZ / 5);
|
||||||
|
|
||||||
printk("%lu.%02luMHz.\n", twd_timer_rate / 1000000,
|
printk("%lu.%02luMHz.\n", twd_timer_rate / 1000000,
|
||||||
(twd_timer_rate / 1000000) % 100);
|
(twd_timer_rate / 10000) % 100);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -223,15 +223,15 @@ static struct clk *periph_clocks[] __initdata = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct clk_lookup periph_clocks_lookups[] = {
|
static struct clk_lookup periph_clocks_lookups[] = {
|
||||||
CLKDEV_CON_DEV_ID("hclk", "atmel_usba_udc.0", &utmi_clk),
|
CLKDEV_CON_DEV_ID("hclk", "atmel_usba_udc", &utmi_clk),
|
||||||
CLKDEV_CON_DEV_ID("pclk", "atmel_usba_udc.0", &udphs_clk),
|
CLKDEV_CON_DEV_ID("pclk", "atmel_usba_udc", &udphs_clk),
|
||||||
CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.0", &mmc0_clk),
|
CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.0", &mmc0_clk),
|
||||||
CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.1", &mmc1_clk),
|
CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.1", &mmc1_clk),
|
||||||
CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk),
|
CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk),
|
||||||
CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk),
|
CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk),
|
||||||
CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tcb_clk),
|
CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tcb_clk),
|
||||||
CLKDEV_CON_DEV_ID("ssc", "ssc.0", &ssc0_clk),
|
CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk),
|
||||||
CLKDEV_CON_DEV_ID("ssc", "ssc.1", &ssc1_clk),
|
CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk_lookup usart_clocks_lookups[] = {
|
static struct clk_lookup usart_clocks_lookups[] = {
|
||||||
|
@ -1220,7 +1220,7 @@ void __init at91_set_serial_console(unsigned portnr)
|
|||||||
{
|
{
|
||||||
if (portnr < ATMEL_MAX_UART) {
|
if (portnr < ATMEL_MAX_UART) {
|
||||||
atmel_default_console_device = at91_uarts[portnr];
|
atmel_default_console_device = at91_uarts[portnr];
|
||||||
at91cap9_set_console_clock(portnr);
|
at91cap9_set_console_clock(at91_uarts[portnr]->id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -199,9 +199,9 @@ static struct clk_lookup periph_clocks_lookups[] = {
|
|||||||
CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.1", &tc3_clk),
|
CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.1", &tc3_clk),
|
||||||
CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.1", &tc4_clk),
|
CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.1", &tc4_clk),
|
||||||
CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.1", &tc5_clk),
|
CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.1", &tc5_clk),
|
||||||
CLKDEV_CON_DEV_ID("ssc", "ssc.0", &ssc0_clk),
|
CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk),
|
||||||
CLKDEV_CON_DEV_ID("ssc", "ssc.1", &ssc1_clk),
|
CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk),
|
||||||
CLKDEV_CON_DEV_ID("ssc", "ssc.2", &ssc2_clk),
|
CLKDEV_CON_DEV_ID("pclk", "ssc.2", &ssc2_clk),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk_lookup usart_clocks_lookups[] = {
|
static struct clk_lookup usart_clocks_lookups[] = {
|
||||||
|
@ -1135,7 +1135,7 @@ void __init at91_set_serial_console(unsigned portnr)
|
|||||||
{
|
{
|
||||||
if (portnr < ATMEL_MAX_UART) {
|
if (portnr < ATMEL_MAX_UART) {
|
||||||
atmel_default_console_device = at91_uarts[portnr];
|
atmel_default_console_device = at91_uarts[portnr];
|
||||||
at91rm9200_set_console_clock(portnr);
|
at91rm9200_set_console_clock(at91_uarts[portnr]->id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1173,7 +1173,7 @@ void __init at91_set_serial_console(unsigned portnr)
|
|||||||
{
|
{
|
||||||
if (portnr < ATMEL_MAX_UART) {
|
if (portnr < ATMEL_MAX_UART) {
|
||||||
atmel_default_console_device = at91_uarts[portnr];
|
atmel_default_console_device = at91_uarts[portnr];
|
||||||
at91sam9260_set_console_clock(portnr);
|
at91sam9260_set_console_clock(at91_uarts[portnr]->id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1013,7 +1013,7 @@ void __init at91_set_serial_console(unsigned portnr)
|
|||||||
{
|
{
|
||||||
if (portnr < ATMEL_MAX_UART) {
|
if (portnr < ATMEL_MAX_UART) {
|
||||||
atmel_default_console_device = at91_uarts[portnr];
|
atmel_default_console_device = at91_uarts[portnr];
|
||||||
at91sam9261_set_console_clock(portnr);
|
at91sam9261_set_console_clock(at91_uarts[portnr]->id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1395,7 +1395,7 @@ void __init at91_set_serial_console(unsigned portnr)
|
|||||||
{
|
{
|
||||||
if (portnr < ATMEL_MAX_UART) {
|
if (portnr < ATMEL_MAX_UART) {
|
||||||
atmel_default_console_device = at91_uarts[portnr];
|
atmel_default_console_device = at91_uarts[portnr];
|
||||||
at91sam9263_set_console_clock(portnr);
|
at91sam9263_set_console_clock(at91_uarts[portnr]->id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -217,11 +217,11 @@ static struct clk *periph_clocks[] __initdata = {
|
|||||||
static struct clk_lookup periph_clocks_lookups[] = {
|
static struct clk_lookup periph_clocks_lookups[] = {
|
||||||
/* One additional fake clock for ohci */
|
/* One additional fake clock for ohci */
|
||||||
CLKDEV_CON_ID("ohci_clk", &uhphs_clk),
|
CLKDEV_CON_ID("ohci_clk", &uhphs_clk),
|
||||||
CLKDEV_CON_DEV_ID("ehci_clk", "atmel-ehci.0", &uhphs_clk),
|
CLKDEV_CON_DEV_ID("ehci_clk", "atmel-ehci", &uhphs_clk),
|
||||||
CLKDEV_CON_DEV_ID("hclk", "atmel_usba_udc.0", &utmi_clk),
|
CLKDEV_CON_DEV_ID("hclk", "atmel_usba_udc", &utmi_clk),
|
||||||
CLKDEV_CON_DEV_ID("pclk", "atmel_usba_udc.0", &udphs_clk),
|
CLKDEV_CON_DEV_ID("pclk", "atmel_usba_udc", &udphs_clk),
|
||||||
CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.0", &mmc0_clk),
|
CLKDEV_CON_DEV_ID("mci_clk", "atmel_mci.0", &mmc0_clk),
|
||||||
CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.1", &mmc1_clk),
|
CLKDEV_CON_DEV_ID("mci_clk", "atmel_mci.1", &mmc1_clk),
|
||||||
CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk),
|
CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk),
|
||||||
CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk),
|
CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk),
|
||||||
CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tcb0_clk),
|
CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tcb0_clk),
|
||||||
|
@ -1550,7 +1550,7 @@ void __init at91_set_serial_console(unsigned portnr)
|
|||||||
{
|
{
|
||||||
if (portnr < ATMEL_MAX_UART) {
|
if (portnr < ATMEL_MAX_UART) {
|
||||||
atmel_default_console_device = at91_uarts[portnr];
|
atmel_default_console_device = at91_uarts[portnr];
|
||||||
at91sam9g45_set_console_clock(portnr);
|
at91sam9g45_set_console_clock(at91_uarts[portnr]->id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -191,8 +191,8 @@ static struct clk *periph_clocks[] __initdata = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct clk_lookup periph_clocks_lookups[] = {
|
static struct clk_lookup periph_clocks_lookups[] = {
|
||||||
CLKDEV_CON_DEV_ID("hclk", "atmel_usba_udc.0", &utmi_clk),
|
CLKDEV_CON_DEV_ID("hclk", "atmel_usba_udc", &utmi_clk),
|
||||||
CLKDEV_CON_DEV_ID("pclk", "atmel_usba_udc.0", &udphs_clk),
|
CLKDEV_CON_DEV_ID("pclk", "atmel_usba_udc", &udphs_clk),
|
||||||
CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tc0_clk),
|
CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tc0_clk),
|
||||||
CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.0", &tc1_clk),
|
CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.0", &tc1_clk),
|
||||||
CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.0", &tc2_clk),
|
CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.0", &tc2_clk),
|
||||||
|
@ -1168,7 +1168,7 @@ void __init at91_set_serial_console(unsigned portnr)
|
|||||||
{
|
{
|
||||||
if (portnr < ATMEL_MAX_UART) {
|
if (portnr < ATMEL_MAX_UART) {
|
||||||
atmel_default_console_device = at91_uarts[portnr];
|
atmel_default_console_device = at91_uarts[portnr];
|
||||||
at91sam9rl_set_console_clock(portnr);
|
at91sam9rl_set_console_clock(at91_uarts[portnr]->id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -215,7 +215,7 @@ static void __init cap9adk_add_device_nand(void)
|
|||||||
csa = at91_sys_read(AT91_MATRIX_EBICSA);
|
csa = at91_sys_read(AT91_MATRIX_EBICSA);
|
||||||
at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_EBI_VDDIOMSEL_3_3V);
|
at91_sys_write(AT91_MATRIX_EBICSA, csa | AT91_MATRIX_EBI_VDDIOMSEL_3_3V);
|
||||||
|
|
||||||
cap9adk_nand_data.bus_width_16 = !board_have_nand_8bit();
|
cap9adk_nand_data.bus_width_16 = board_have_nand_16bit();
|
||||||
/* setup bus-width (8 or 16) */
|
/* setup bus-width (8 or 16) */
|
||||||
if (cap9adk_nand_data.bus_width_16)
|
if (cap9adk_nand_data.bus_width_16)
|
||||||
cap9adk_nand_smc_config.mode |= AT91_SMC_DBW_16;
|
cap9adk_nand_smc_config.mode |= AT91_SMC_DBW_16;
|
||||||
|
@ -214,7 +214,7 @@ static struct sam9_smc_config __initdata ek_nand_smc_config = {
|
|||||||
|
|
||||||
static void __init ek_add_device_nand(void)
|
static void __init ek_add_device_nand(void)
|
||||||
{
|
{
|
||||||
ek_nand_data.bus_width_16 = !board_have_nand_8bit();
|
ek_nand_data.bus_width_16 = board_have_nand_16bit();
|
||||||
/* setup bus-width (8 or 16) */
|
/* setup bus-width (8 or 16) */
|
||||||
if (ek_nand_data.bus_width_16)
|
if (ek_nand_data.bus_width_16)
|
||||||
ek_nand_smc_config.mode |= AT91_SMC_DBW_16;
|
ek_nand_smc_config.mode |= AT91_SMC_DBW_16;
|
||||||
|
@ -220,7 +220,7 @@ static struct sam9_smc_config __initdata ek_nand_smc_config = {
|
|||||||
|
|
||||||
static void __init ek_add_device_nand(void)
|
static void __init ek_add_device_nand(void)
|
||||||
{
|
{
|
||||||
ek_nand_data.bus_width_16 = !board_have_nand_8bit();
|
ek_nand_data.bus_width_16 = board_have_nand_16bit();
|
||||||
/* setup bus-width (8 or 16) */
|
/* setup bus-width (8 or 16) */
|
||||||
if (ek_nand_data.bus_width_16)
|
if (ek_nand_data.bus_width_16)
|
||||||
ek_nand_smc_config.mode |= AT91_SMC_DBW_16;
|
ek_nand_smc_config.mode |= AT91_SMC_DBW_16;
|
||||||
|
@ -221,7 +221,7 @@ static struct sam9_smc_config __initdata ek_nand_smc_config = {
|
|||||||
|
|
||||||
static void __init ek_add_device_nand(void)
|
static void __init ek_add_device_nand(void)
|
||||||
{
|
{
|
||||||
ek_nand_data.bus_width_16 = !board_have_nand_8bit();
|
ek_nand_data.bus_width_16 = board_have_nand_16bit();
|
||||||
/* setup bus-width (8 or 16) */
|
/* setup bus-width (8 or 16) */
|
||||||
if (ek_nand_data.bus_width_16)
|
if (ek_nand_data.bus_width_16)
|
||||||
ek_nand_smc_config.mode |= AT91_SMC_DBW_16;
|
ek_nand_smc_config.mode |= AT91_SMC_DBW_16;
|
||||||
|
@ -198,7 +198,7 @@ static struct sam9_smc_config __initdata ek_nand_smc_config = {
|
|||||||
|
|
||||||
static void __init ek_add_device_nand(void)
|
static void __init ek_add_device_nand(void)
|
||||||
{
|
{
|
||||||
ek_nand_data.bus_width_16 = !board_have_nand_8bit();
|
ek_nand_data.bus_width_16 = board_have_nand_16bit();
|
||||||
/* setup bus-width (8 or 16) */
|
/* setup bus-width (8 or 16) */
|
||||||
if (ek_nand_data.bus_width_16)
|
if (ek_nand_data.bus_width_16)
|
||||||
ek_nand_smc_config.mode |= AT91_SMC_DBW_16;
|
ek_nand_smc_config.mode |= AT91_SMC_DBW_16;
|
||||||
|
@ -178,7 +178,7 @@ static struct sam9_smc_config __initdata ek_nand_smc_config = {
|
|||||||
|
|
||||||
static void __init ek_add_device_nand(void)
|
static void __init ek_add_device_nand(void)
|
||||||
{
|
{
|
||||||
ek_nand_data.bus_width_16 = !board_have_nand_8bit();
|
ek_nand_data.bus_width_16 = board_have_nand_16bit();
|
||||||
/* setup bus-width (8 or 16) */
|
/* setup bus-width (8 or 16) */
|
||||||
if (ek_nand_data.bus_width_16)
|
if (ek_nand_data.bus_width_16)
|
||||||
ek_nand_smc_config.mode |= AT91_SMC_DBW_16;
|
ek_nand_smc_config.mode |= AT91_SMC_DBW_16;
|
||||||
|
@ -13,13 +13,13 @@
|
|||||||
* the 16-31 bit are reserved for at91 generic information
|
* the 16-31 bit are reserved for at91 generic information
|
||||||
*
|
*
|
||||||
* bit 31:
|
* bit 31:
|
||||||
* 0 => nand 16 bit
|
* 0 => nand 8 bit
|
||||||
* 1 => nand 8 bit
|
* 1 => nand 16 bit
|
||||||
*/
|
*/
|
||||||
#define BOARD_HAVE_NAND_8BIT (1 << 31)
|
#define BOARD_HAVE_NAND_16BIT (1 << 31)
|
||||||
static int inline board_have_nand_8bit(void)
|
static inline int board_have_nand_16bit(void)
|
||||||
{
|
{
|
||||||
return system_rev & BOARD_HAVE_NAND_8BIT;
|
return system_rev & BOARD_HAVE_NAND_16BIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* __ARCH_SYSTEM_REV_H__ */
|
#endif /* __ARCH_SYSTEM_REV_H__ */
|
||||||
|
@ -251,9 +251,9 @@ static void ep93xx_uart_set_mctrl(struct amba_device *dev,
|
|||||||
unsigned int mcr;
|
unsigned int mcr;
|
||||||
|
|
||||||
mcr = 0;
|
mcr = 0;
|
||||||
if (!(mctrl & TIOCM_RTS))
|
if (mctrl & TIOCM_RTS)
|
||||||
mcr |= 2;
|
mcr |= 2;
|
||||||
if (!(mctrl & TIOCM_DTR))
|
if (mctrl & TIOCM_DTR)
|
||||||
mcr |= 1;
|
mcr |= 1;
|
||||||
|
|
||||||
__raw_writel(mcr, base + EP93XX_UART_MCR_OFFSET);
|
__raw_writel(mcr, base + EP93XX_UART_MCR_OFFSET);
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include <plat/sdhci.h>
|
#include <plat/sdhci.h>
|
||||||
#include <plat/devs.h>
|
#include <plat/devs.h>
|
||||||
#include <plat/fimc-core.h>
|
#include <plat/fimc-core.h>
|
||||||
|
#include <plat/iic-core.h>
|
||||||
|
|
||||||
#include <mach/regs-irq.h>
|
#include <mach/regs-irq.h>
|
||||||
|
|
||||||
@ -132,6 +133,11 @@ void __init exynos4_map_io(void)
|
|||||||
s3c_fimc_setname(1, "exynos4-fimc");
|
s3c_fimc_setname(1, "exynos4-fimc");
|
||||||
s3c_fimc_setname(2, "exynos4-fimc");
|
s3c_fimc_setname(2, "exynos4-fimc");
|
||||||
s3c_fimc_setname(3, "exynos4-fimc");
|
s3c_fimc_setname(3, "exynos4-fimc");
|
||||||
|
|
||||||
|
/* The I2C bus controllers are directly compatible with s3c2440 */
|
||||||
|
s3c_i2c0_setname("s3c2440-i2c");
|
||||||
|
s3c_i2c1_setname("s3c2440-i2c");
|
||||||
|
s3c_i2c2_setname("s3c2440-i2c");
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init exynos4_init_clocks(int xtal)
|
void __init exynos4_init_clocks(int xtal)
|
||||||
|
@ -330,7 +330,7 @@ struct platform_device exynos4_device_ac97 = {
|
|||||||
|
|
||||||
static int exynos4_spdif_cfg_gpio(struct platform_device *pdev)
|
static int exynos4_spdif_cfg_gpio(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
s3c_gpio_cfgpin_range(EXYNOS4_GPC1(0), 2, S3C_GPIO_SFN(3));
|
s3c_gpio_cfgpin_range(EXYNOS4_GPC1(0), 2, S3C_GPIO_SFN(4));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
|
||||||
__INIT
|
__CPUINIT
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* exynos4 specific entry point for secondary CPUs. This provides
|
* exynos4 specific entry point for secondary CPUs. This provides
|
||||||
|
@ -35,6 +35,7 @@ void __init exynos4_common_init_uarts(struct s3c2410_uartcfg *cfg, int no)
|
|||||||
tcfg->clocks = exynos4_serial_clocks;
|
tcfg->clocks = exynos4_serial_clocks;
|
||||||
tcfg->clocks_size = ARRAY_SIZE(exynos4_serial_clocks);
|
tcfg->clocks_size = ARRAY_SIZE(exynos4_serial_clocks);
|
||||||
}
|
}
|
||||||
|
tcfg->flags |= NO_NEED_CHECK_CLKSRC;
|
||||||
}
|
}
|
||||||
|
|
||||||
s3c24xx_init_uartdevs("s5pv210-uart", s5p_uart_resources, cfg, no);
|
s3c24xx_init_uartdevs("s5pv210-uart", s5p_uart_resources, cfg, no);
|
||||||
|
@ -78,9 +78,7 @@ static struct s3c2410_uartcfg smdkv310_uartcfgs[] __initdata = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct s3c_sdhci_platdata smdkv310_hsmmc0_pdata __initdata = {
|
static struct s3c_sdhci_platdata smdkv310_hsmmc0_pdata __initdata = {
|
||||||
.cd_type = S3C_SDHCI_CD_GPIO,
|
.cd_type = S3C_SDHCI_CD_INTERNAL,
|
||||||
.ext_cd_gpio = EXYNOS4_GPK0(2),
|
|
||||||
.ext_cd_gpio_invert = 1,
|
|
||||||
.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
|
.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
|
||||||
#ifdef CONFIG_EXYNOS4_SDHCI_CH0_8BIT
|
#ifdef CONFIG_EXYNOS4_SDHCI_CH0_8BIT
|
||||||
.max_width = 8,
|
.max_width = 8,
|
||||||
@ -96,9 +94,7 @@ static struct s3c_sdhci_platdata smdkv310_hsmmc1_pdata __initdata = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct s3c_sdhci_platdata smdkv310_hsmmc2_pdata __initdata = {
|
static struct s3c_sdhci_platdata smdkv310_hsmmc2_pdata __initdata = {
|
||||||
.cd_type = S3C_SDHCI_CD_GPIO,
|
.cd_type = S3C_SDHCI_CD_INTERNAL,
|
||||||
.ext_cd_gpio = EXYNOS4_GPK2(2),
|
|
||||||
.ext_cd_gpio_invert = 1,
|
|
||||||
.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
|
.clk_type = S3C_SDHCI_CLK_DIV_EXTERNAL,
|
||||||
#ifdef CONFIG_EXYNOS4_SDHCI_CH2_8BIT
|
#ifdef CONFIG_EXYNOS4_SDHCI_CH2_8BIT
|
||||||
.max_width = 8,
|
.max_width = 8,
|
||||||
|
@ -6,12 +6,14 @@ config ARCH_H7201
|
|||||||
bool "gms30c7201"
|
bool "gms30c7201"
|
||||||
depends on ARCH_H720X
|
depends on ARCH_H720X
|
||||||
select CPU_H7201
|
select CPU_H7201
|
||||||
|
select ZONE_DMA
|
||||||
help
|
help
|
||||||
Say Y here if you are using the Hynix GMS30C7201 Reference Board
|
Say Y here if you are using the Hynix GMS30C7201 Reference Board
|
||||||
|
|
||||||
config ARCH_H7202
|
config ARCH_H7202
|
||||||
bool "hms30c7202"
|
bool "hms30c7202"
|
||||||
select CPU_H7202
|
select CPU_H7202
|
||||||
|
select ZONE_DMA
|
||||||
depends on ARCH_H720X
|
depends on ARCH_H720X
|
||||||
help
|
help
|
||||||
Say Y here if you are using the Hynix HMS30C7202 Reference Board
|
Say Y here if you are using the Hynix HMS30C7202 Reference Board
|
||||||
|
@ -215,7 +215,7 @@ static struct omap_kp_platform_data ams_delta_kp_data __initdata = {
|
|||||||
.delay = 9,
|
.delay = 9,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device ams_delta_kp_device __initdata = {
|
static struct platform_device ams_delta_kp_device = {
|
||||||
.name = "omap-keypad",
|
.name = "omap-keypad",
|
||||||
.id = -1,
|
.id = -1,
|
||||||
.dev = {
|
.dev = {
|
||||||
@ -225,12 +225,12 @@ static struct platform_device ams_delta_kp_device __initdata = {
|
|||||||
.resource = ams_delta_kp_resources,
|
.resource = ams_delta_kp_resources,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device ams_delta_lcd_device __initdata = {
|
static struct platform_device ams_delta_lcd_device = {
|
||||||
.name = "lcd_ams_delta",
|
.name = "lcd_ams_delta",
|
||||||
.id = -1,
|
.id = -1,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device ams_delta_led_device __initdata = {
|
static struct platform_device ams_delta_led_device = {
|
||||||
.name = "ams-delta-led",
|
.name = "ams-delta-led",
|
||||||
.id = -1
|
.id = -1
|
||||||
};
|
};
|
||||||
@ -267,7 +267,7 @@ static struct soc_camera_link ams_delta_iclink = {
|
|||||||
.power = ams_delta_camera_power,
|
.power = ams_delta_camera_power,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device ams_delta_camera_device __initdata = {
|
static struct platform_device ams_delta_camera_device = {
|
||||||
.name = "soc-camera-pdrv",
|
.name = "soc-camera-pdrv",
|
||||||
.id = 0,
|
.id = 0,
|
||||||
.dev = {
|
.dev = {
|
||||||
|
@ -41,7 +41,7 @@ static struct __initdata omap_gpio_platform_data omap15xx_mpu_gpio_config = {
|
|||||||
.bank_stride = 1,
|
.bank_stride = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct __initdata platform_device omap15xx_mpu_gpio = {
|
static struct platform_device omap15xx_mpu_gpio = {
|
||||||
.name = "omap_gpio",
|
.name = "omap_gpio",
|
||||||
.id = 0,
|
.id = 0,
|
||||||
.dev = {
|
.dev = {
|
||||||
@ -70,7 +70,7 @@ static struct __initdata omap_gpio_platform_data omap15xx_gpio_config = {
|
|||||||
.bank_width = 16,
|
.bank_width = 16,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct __initdata platform_device omap15xx_gpio = {
|
static struct platform_device omap15xx_gpio = {
|
||||||
.name = "omap_gpio",
|
.name = "omap_gpio",
|
||||||
.id = 1,
|
.id = 1,
|
||||||
.dev = {
|
.dev = {
|
||||||
|
@ -44,7 +44,7 @@ static struct __initdata omap_gpio_platform_data omap16xx_mpu_gpio_config = {
|
|||||||
.bank_stride = 1,
|
.bank_stride = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct __initdata platform_device omap16xx_mpu_gpio = {
|
static struct platform_device omap16xx_mpu_gpio = {
|
||||||
.name = "omap_gpio",
|
.name = "omap_gpio",
|
||||||
.id = 0,
|
.id = 0,
|
||||||
.dev = {
|
.dev = {
|
||||||
@ -73,7 +73,7 @@ static struct __initdata omap_gpio_platform_data omap16xx_gpio1_config = {
|
|||||||
.bank_width = 16,
|
.bank_width = 16,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct __initdata platform_device omap16xx_gpio1 = {
|
static struct platform_device omap16xx_gpio1 = {
|
||||||
.name = "omap_gpio",
|
.name = "omap_gpio",
|
||||||
.id = 1,
|
.id = 1,
|
||||||
.dev = {
|
.dev = {
|
||||||
@ -102,7 +102,7 @@ static struct __initdata omap_gpio_platform_data omap16xx_gpio2_config = {
|
|||||||
.bank_width = 16,
|
.bank_width = 16,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct __initdata platform_device omap16xx_gpio2 = {
|
static struct platform_device omap16xx_gpio2 = {
|
||||||
.name = "omap_gpio",
|
.name = "omap_gpio",
|
||||||
.id = 2,
|
.id = 2,
|
||||||
.dev = {
|
.dev = {
|
||||||
@ -131,7 +131,7 @@ static struct __initdata omap_gpio_platform_data omap16xx_gpio3_config = {
|
|||||||
.bank_width = 16,
|
.bank_width = 16,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct __initdata platform_device omap16xx_gpio3 = {
|
static struct platform_device omap16xx_gpio3 = {
|
||||||
.name = "omap_gpio",
|
.name = "omap_gpio",
|
||||||
.id = 3,
|
.id = 3,
|
||||||
.dev = {
|
.dev = {
|
||||||
@ -160,7 +160,7 @@ static struct __initdata omap_gpio_platform_data omap16xx_gpio4_config = {
|
|||||||
.bank_width = 16,
|
.bank_width = 16,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct __initdata platform_device omap16xx_gpio4 = {
|
static struct platform_device omap16xx_gpio4 = {
|
||||||
.name = "omap_gpio",
|
.name = "omap_gpio",
|
||||||
.id = 4,
|
.id = 4,
|
||||||
.dev = {
|
.dev = {
|
||||||
|
@ -46,7 +46,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_mpu_gpio_config = {
|
|||||||
.bank_stride = 2,
|
.bank_stride = 2,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct __initdata platform_device omap7xx_mpu_gpio = {
|
static struct platform_device omap7xx_mpu_gpio = {
|
||||||
.name = "omap_gpio",
|
.name = "omap_gpio",
|
||||||
.id = 0,
|
.id = 0,
|
||||||
.dev = {
|
.dev = {
|
||||||
@ -75,7 +75,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_gpio1_config = {
|
|||||||
.bank_width = 32,
|
.bank_width = 32,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct __initdata platform_device omap7xx_gpio1 = {
|
static struct platform_device omap7xx_gpio1 = {
|
||||||
.name = "omap_gpio",
|
.name = "omap_gpio",
|
||||||
.id = 1,
|
.id = 1,
|
||||||
.dev = {
|
.dev = {
|
||||||
@ -104,7 +104,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_gpio2_config = {
|
|||||||
.bank_width = 32,
|
.bank_width = 32,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct __initdata platform_device omap7xx_gpio2 = {
|
static struct platform_device omap7xx_gpio2 = {
|
||||||
.name = "omap_gpio",
|
.name = "omap_gpio",
|
||||||
.id = 2,
|
.id = 2,
|
||||||
.dev = {
|
.dev = {
|
||||||
@ -133,7 +133,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_gpio3_config = {
|
|||||||
.bank_width = 32,
|
.bank_width = 32,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct __initdata platform_device omap7xx_gpio3 = {
|
static struct platform_device omap7xx_gpio3 = {
|
||||||
.name = "omap_gpio",
|
.name = "omap_gpio",
|
||||||
.id = 3,
|
.id = 3,
|
||||||
.dev = {
|
.dev = {
|
||||||
@ -162,7 +162,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_gpio4_config = {
|
|||||||
.bank_width = 32,
|
.bank_width = 32,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct __initdata platform_device omap7xx_gpio4 = {
|
static struct platform_device omap7xx_gpio4 = {
|
||||||
.name = "omap_gpio",
|
.name = "omap_gpio",
|
||||||
.id = 4,
|
.id = 4,
|
||||||
.dev = {
|
.dev = {
|
||||||
@ -191,7 +191,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_gpio5_config = {
|
|||||||
.bank_width = 32,
|
.bank_width = 32,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct __initdata platform_device omap7xx_gpio5 = {
|
static struct platform_device omap7xx_gpio5 = {
|
||||||
.name = "omap_gpio",
|
.name = "omap_gpio",
|
||||||
.id = 5,
|
.id = 5,
|
||||||
.dev = {
|
.dev = {
|
||||||
@ -220,7 +220,7 @@ static struct __initdata omap_gpio_platform_data omap7xx_gpio6_config = {
|
|||||||
.bank_width = 32,
|
.bank_width = 32,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct __initdata platform_device omap7xx_gpio6 = {
|
static struct platform_device omap7xx_gpio6 = {
|
||||||
.name = "omap_gpio",
|
.name = "omap_gpio",
|
||||||
.id = 6,
|
.id = 6,
|
||||||
.dev = {
|
.dev = {
|
||||||
|
@ -558,7 +558,7 @@ static struct radio_si4713_platform_data rx51_si4713_data __initdata_or_module =
|
|||||||
.subdev_board_info = &rx51_si4713_board_info,
|
.subdev_board_info = &rx51_si4713_board_info,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device rx51_si4713_dev __initdata_or_module = {
|
static struct platform_device rx51_si4713_dev = {
|
||||||
.name = "radio-si4713",
|
.name = "radio-si4713",
|
||||||
.id = -1,
|
.id = -1,
|
||||||
.dev = {
|
.dev = {
|
||||||
|
@ -552,7 +552,7 @@ struct mini2440_features_t {
|
|||||||
struct platform_device *optional[8];
|
struct platform_device *optional[8];
|
||||||
};
|
};
|
||||||
|
|
||||||
static void mini2440_parse_features(
|
static void __init mini2440_parse_features(
|
||||||
struct mini2440_features_t * features,
|
struct mini2440_features_t * features,
|
||||||
const char * features_str )
|
const char * features_str )
|
||||||
{
|
{
|
||||||
|
@ -88,6 +88,7 @@ static struct s3c64xx_spi_info s3c64xx_spi0_pdata = {
|
|||||||
.cfg_gpio = s3c64xx_spi_cfg_gpio,
|
.cfg_gpio = s3c64xx_spi_cfg_gpio,
|
||||||
.fifo_lvl_mask = 0x7f,
|
.fifo_lvl_mask = 0x7f,
|
||||||
.rx_lvl_offset = 13,
|
.rx_lvl_offset = 13,
|
||||||
|
.tx_st_done = 21,
|
||||||
};
|
};
|
||||||
|
|
||||||
static u64 spi_dmamask = DMA_BIT_MASK(32);
|
static u64 spi_dmamask = DMA_BIT_MASK(32);
|
||||||
@ -132,6 +133,7 @@ static struct s3c64xx_spi_info s3c64xx_spi1_pdata = {
|
|||||||
.cfg_gpio = s3c64xx_spi_cfg_gpio,
|
.cfg_gpio = s3c64xx_spi_cfg_gpio,
|
||||||
.fifo_lvl_mask = 0x7f,
|
.fifo_lvl_mask = 0x7f,
|
||||||
.rx_lvl_offset = 13,
|
.rx_lvl_offset = 13,
|
||||||
|
.tx_st_done = 21,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct platform_device s3c64xx_device_spi1 = {
|
struct platform_device s3c64xx_device_spi1 = {
|
||||||
|
@ -112,12 +112,14 @@ static struct s3c64xx_spi_info s5p6440_spi0_pdata = {
|
|||||||
.cfg_gpio = s5p6440_spi_cfg_gpio,
|
.cfg_gpio = s5p6440_spi_cfg_gpio,
|
||||||
.fifo_lvl_mask = 0x1ff,
|
.fifo_lvl_mask = 0x1ff,
|
||||||
.rx_lvl_offset = 15,
|
.rx_lvl_offset = 15,
|
||||||
|
.tx_st_done = 25,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct s3c64xx_spi_info s5p6450_spi0_pdata = {
|
static struct s3c64xx_spi_info s5p6450_spi0_pdata = {
|
||||||
.cfg_gpio = s5p6450_spi_cfg_gpio,
|
.cfg_gpio = s5p6450_spi_cfg_gpio,
|
||||||
.fifo_lvl_mask = 0x1ff,
|
.fifo_lvl_mask = 0x1ff,
|
||||||
.rx_lvl_offset = 15,
|
.rx_lvl_offset = 15,
|
||||||
|
.tx_st_done = 25,
|
||||||
};
|
};
|
||||||
|
|
||||||
static u64 spi_dmamask = DMA_BIT_MASK(32);
|
static u64 spi_dmamask = DMA_BIT_MASK(32);
|
||||||
@ -160,12 +162,14 @@ static struct s3c64xx_spi_info s5p6440_spi1_pdata = {
|
|||||||
.cfg_gpio = s5p6440_spi_cfg_gpio,
|
.cfg_gpio = s5p6440_spi_cfg_gpio,
|
||||||
.fifo_lvl_mask = 0x7f,
|
.fifo_lvl_mask = 0x7f,
|
||||||
.rx_lvl_offset = 15,
|
.rx_lvl_offset = 15,
|
||||||
|
.tx_st_done = 25,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct s3c64xx_spi_info s5p6450_spi1_pdata = {
|
static struct s3c64xx_spi_info s5p6450_spi1_pdata = {
|
||||||
.cfg_gpio = s5p6450_spi_cfg_gpio,
|
.cfg_gpio = s5p6450_spi_cfg_gpio,
|
||||||
.fifo_lvl_mask = 0x7f,
|
.fifo_lvl_mask = 0x7f,
|
||||||
.rx_lvl_offset = 15,
|
.rx_lvl_offset = 15,
|
||||||
|
.tx_st_done = 25,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct platform_device s5p64x0_device_spi1 = {
|
struct platform_device s5p64x0_device_spi1 = {
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
#include <mach/dma.h>
|
#include <mach/dma.h>
|
||||||
#include <mach/map.h>
|
#include <mach/map.h>
|
||||||
#include <mach/spi-clocks.h>
|
#include <mach/spi-clocks.h>
|
||||||
|
#include <mach/irqs.h>
|
||||||
|
|
||||||
#include <plat/s3c64xx-spi.h>
|
#include <plat/s3c64xx-spi.h>
|
||||||
#include <plat/gpio-cfg.h>
|
#include <plat/gpio-cfg.h>
|
||||||
@ -90,6 +91,7 @@ static struct s3c64xx_spi_info s5pc100_spi0_pdata = {
|
|||||||
.fifo_lvl_mask = 0x7f,
|
.fifo_lvl_mask = 0x7f,
|
||||||
.rx_lvl_offset = 13,
|
.rx_lvl_offset = 13,
|
||||||
.high_speed = 1,
|
.high_speed = 1,
|
||||||
|
.tx_st_done = 21,
|
||||||
};
|
};
|
||||||
|
|
||||||
static u64 spi_dmamask = DMA_BIT_MASK(32);
|
static u64 spi_dmamask = DMA_BIT_MASK(32);
|
||||||
@ -134,6 +136,7 @@ static struct s3c64xx_spi_info s5pc100_spi1_pdata = {
|
|||||||
.fifo_lvl_mask = 0x7f,
|
.fifo_lvl_mask = 0x7f,
|
||||||
.rx_lvl_offset = 13,
|
.rx_lvl_offset = 13,
|
||||||
.high_speed = 1,
|
.high_speed = 1,
|
||||||
|
.tx_st_done = 21,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct platform_device s5pc100_device_spi1 = {
|
struct platform_device s5pc100_device_spi1 = {
|
||||||
@ -176,6 +179,7 @@ static struct s3c64xx_spi_info s5pc100_spi2_pdata = {
|
|||||||
.fifo_lvl_mask = 0x7f,
|
.fifo_lvl_mask = 0x7f,
|
||||||
.rx_lvl_offset = 13,
|
.rx_lvl_offset = 13,
|
||||||
.high_speed = 1,
|
.high_speed = 1,
|
||||||
|
.tx_st_done = 21,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct platform_device s5pc100_device_spi2 = {
|
struct platform_device s5pc100_device_spi2 = {
|
||||||
|
@ -85,6 +85,7 @@ static struct s3c64xx_spi_info s5pv210_spi0_pdata = {
|
|||||||
.fifo_lvl_mask = 0x1ff,
|
.fifo_lvl_mask = 0x1ff,
|
||||||
.rx_lvl_offset = 15,
|
.rx_lvl_offset = 15,
|
||||||
.high_speed = 1,
|
.high_speed = 1,
|
||||||
|
.tx_st_done = 25,
|
||||||
};
|
};
|
||||||
|
|
||||||
static u64 spi_dmamask = DMA_BIT_MASK(32);
|
static u64 spi_dmamask = DMA_BIT_MASK(32);
|
||||||
@ -129,6 +130,7 @@ static struct s3c64xx_spi_info s5pv210_spi1_pdata = {
|
|||||||
.fifo_lvl_mask = 0x7f,
|
.fifo_lvl_mask = 0x7f,
|
||||||
.rx_lvl_offset = 15,
|
.rx_lvl_offset = 15,
|
||||||
.high_speed = 1,
|
.high_speed = 1,
|
||||||
|
.tx_st_done = 25,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct platform_device s5pv210_device_spi1 = {
|
struct platform_device s5pv210_device_spi1 = {
|
||||||
|
@ -381,7 +381,7 @@ void ag5evm_sdhi1_set_pwr(struct platform_device *pdev, int state)
|
|||||||
gpio_set_value(GPIO_PORT114, state);
|
gpio_set_value(GPIO_PORT114, state);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct sh_mobile_sdhi_info sh_sdhi1_platdata = {
|
static struct sh_mobile_sdhi_info sh_sdhi1_info = {
|
||||||
.tmio_flags = TMIO_MMC_WRPROTECT_DISABLE,
|
.tmio_flags = TMIO_MMC_WRPROTECT_DISABLE,
|
||||||
.tmio_caps = MMC_CAP_NONREMOVABLE | MMC_CAP_SDIO_IRQ,
|
.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,
|
||||||
@ -413,7 +413,7 @@ static struct platform_device sdhi1_device = {
|
|||||||
.name = "sh_mobile_sdhi",
|
.name = "sh_mobile_sdhi",
|
||||||
.id = 1,
|
.id = 1,
|
||||||
.dev = {
|
.dev = {
|
||||||
.platform_data = &sh_sdhi1_platdata,
|
.platform_data = &sh_sdhi1_info,
|
||||||
},
|
},
|
||||||
.num_resources = ARRAY_SIZE(sdhi1_resources),
|
.num_resources = ARRAY_SIZE(sdhi1_resources),
|
||||||
.resource = sdhi1_resources,
|
.resource = sdhi1_resources,
|
||||||
|
@ -913,7 +913,7 @@ static struct i2c_board_info imx074_info = {
|
|||||||
I2C_BOARD_INFO("imx074", 0x1a),
|
I2C_BOARD_INFO("imx074", 0x1a),
|
||||||
};
|
};
|
||||||
|
|
||||||
struct soc_camera_link imx074_link = {
|
static struct soc_camera_link imx074_link = {
|
||||||
.bus_id = 0,
|
.bus_id = 0,
|
||||||
.board_info = &imx074_info,
|
.board_info = &imx074_info,
|
||||||
.i2c_adapter_id = 0,
|
.i2c_adapter_id = 0,
|
||||||
|
@ -1287,9 +1287,9 @@ 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,
|
||||||
|
&usbhs0_device,
|
||||||
&leds_device,
|
&leds_device,
|
||||||
&fsi_device,
|
&fsi_device,
|
||||||
&fsi_ak4643_device,
|
&fsi_ak4643_device,
|
||||||
|
@ -110,10 +110,18 @@ static pin_cfg_t mop500_pins_common[] = {
|
|||||||
GPIO168_KP_O0,
|
GPIO168_KP_O0,
|
||||||
|
|
||||||
/* UART */
|
/* UART */
|
||||||
GPIO0_U0_CTSn | PIN_INPUT_PULLUP,
|
/* uart-0 pins gpio configuration should be
|
||||||
GPIO1_U0_RTSn | PIN_OUTPUT_HIGH,
|
* kept intact to prevent glitch in tx line
|
||||||
GPIO2_U0_RXD | PIN_INPUT_PULLUP,
|
* when tty dev is opened. Later these pins
|
||||||
GPIO3_U0_TXD | PIN_OUTPUT_HIGH,
|
* are configured to uart mop500_pins_uart0
|
||||||
|
*
|
||||||
|
* It will be replaced with uart configuration
|
||||||
|
* once the issue is solved.
|
||||||
|
*/
|
||||||
|
GPIO0_GPIO | PIN_INPUT_PULLUP,
|
||||||
|
GPIO1_GPIO | PIN_OUTPUT_HIGH,
|
||||||
|
GPIO2_GPIO | PIN_INPUT_PULLUP,
|
||||||
|
GPIO3_GPIO | PIN_OUTPUT_HIGH,
|
||||||
|
|
||||||
GPIO29_U2_RXD | PIN_INPUT_PULLUP,
|
GPIO29_U2_RXD | PIN_INPUT_PULLUP,
|
||||||
GPIO30_U2_TXD | PIN_OUTPUT_HIGH,
|
GPIO30_U2_TXD | PIN_OUTPUT_HIGH,
|
||||||
|
@ -27,18 +27,21 @@
|
|||||||
#include <linux/leds-lp5521.h>
|
#include <linux/leds-lp5521.h>
|
||||||
#include <linux/input.h>
|
#include <linux/input.h>
|
||||||
#include <linux/gpio_keys.h>
|
#include <linux/gpio_keys.h>
|
||||||
|
#include <linux/delay.h>
|
||||||
|
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
#include <asm/mach/arch.h>
|
#include <asm/mach/arch.h>
|
||||||
|
|
||||||
#include <plat/i2c.h>
|
#include <plat/i2c.h>
|
||||||
#include <plat/ste_dma40.h>
|
#include <plat/ste_dma40.h>
|
||||||
|
#include <plat/pincfg.h>
|
||||||
|
|
||||||
#include <mach/hardware.h>
|
#include <mach/hardware.h>
|
||||||
#include <mach/setup.h>
|
#include <mach/setup.h>
|
||||||
#include <mach/devices.h>
|
#include <mach/devices.h>
|
||||||
#include <mach/irqs.h>
|
#include <mach/irqs.h>
|
||||||
|
|
||||||
|
#include "pins-db8500.h"
|
||||||
#include "ste-dma40-db8500.h"
|
#include "ste-dma40-db8500.h"
|
||||||
#include "devices-db8500.h"
|
#include "devices-db8500.h"
|
||||||
#include "board-mop500.h"
|
#include "board-mop500.h"
|
||||||
@ -393,12 +396,63 @@ static struct stedma40_chan_cfg uart2_dma_cfg_tx = {
|
|||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
static pin_cfg_t mop500_pins_uart0[] = {
|
||||||
|
GPIO0_U0_CTSn | PIN_INPUT_PULLUP,
|
||||||
|
GPIO1_U0_RTSn | PIN_OUTPUT_HIGH,
|
||||||
|
GPIO2_U0_RXD | PIN_INPUT_PULLUP,
|
||||||
|
GPIO3_U0_TXD | PIN_OUTPUT_HIGH,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define PRCC_K_SOFTRST_SET 0x18
|
||||||
|
#define PRCC_K_SOFTRST_CLEAR 0x1C
|
||||||
|
static void ux500_uart0_reset(void)
|
||||||
|
{
|
||||||
|
void __iomem *prcc_rst_set, *prcc_rst_clr;
|
||||||
|
|
||||||
|
prcc_rst_set = (void __iomem *)IO_ADDRESS(U8500_CLKRST1_BASE +
|
||||||
|
PRCC_K_SOFTRST_SET);
|
||||||
|
prcc_rst_clr = (void __iomem *)IO_ADDRESS(U8500_CLKRST1_BASE +
|
||||||
|
PRCC_K_SOFTRST_CLEAR);
|
||||||
|
|
||||||
|
/* Activate soft reset PRCC_K_SOFTRST_CLEAR */
|
||||||
|
writel((readl(prcc_rst_clr) | 0x1), prcc_rst_clr);
|
||||||
|
udelay(1);
|
||||||
|
|
||||||
|
/* Release soft reset PRCC_K_SOFTRST_SET */
|
||||||
|
writel((readl(prcc_rst_set) | 0x1), prcc_rst_set);
|
||||||
|
udelay(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ux500_uart0_init(void)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = nmk_config_pins(mop500_pins_uart0,
|
||||||
|
ARRAY_SIZE(mop500_pins_uart0));
|
||||||
|
if (ret < 0)
|
||||||
|
pr_err("pl011: uart pins_enable failed\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ux500_uart0_exit(void)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = nmk_config_pins_sleep(mop500_pins_uart0,
|
||||||
|
ARRAY_SIZE(mop500_pins_uart0));
|
||||||
|
if (ret < 0)
|
||||||
|
pr_err("pl011: uart pins_disable failed\n");
|
||||||
|
}
|
||||||
|
|
||||||
static struct amba_pl011_data uart0_plat = {
|
static struct amba_pl011_data uart0_plat = {
|
||||||
#ifdef CONFIG_STE_DMA40
|
#ifdef CONFIG_STE_DMA40
|
||||||
.dma_filter = stedma40_filter,
|
.dma_filter = stedma40_filter,
|
||||||
.dma_rx_param = &uart0_dma_cfg_rx,
|
.dma_rx_param = &uart0_dma_cfg_rx,
|
||||||
.dma_tx_param = &uart0_dma_cfg_tx,
|
.dma_tx_param = &uart0_dma_cfg_tx,
|
||||||
#endif
|
#endif
|
||||||
|
.init = ux500_uart0_init,
|
||||||
|
.exit = ux500_uart0_exit,
|
||||||
|
.reset = ux500_uart0_reset,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct amba_pl011_data uart1_plat = {
|
static struct amba_pl011_data uart1_plat = {
|
||||||
|
@ -39,9 +39,10 @@
|
|||||||
static void __iomem *ic_regbase;
|
static void __iomem *ic_regbase;
|
||||||
static void __iomem *sic_regbase;
|
static void __iomem *sic_regbase;
|
||||||
|
|
||||||
static void vt8500_irq_mask(unsigned int irq)
|
static void vt8500_irq_mask(struct irq_data *d)
|
||||||
{
|
{
|
||||||
void __iomem *base = ic_regbase;
|
void __iomem *base = ic_regbase;
|
||||||
|
unsigned irq = d->irq;
|
||||||
u8 edge;
|
u8 edge;
|
||||||
|
|
||||||
if (irq >= 64) {
|
if (irq >= 64) {
|
||||||
@ -64,9 +65,10 @@ static void vt8500_irq_mask(unsigned int irq)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vt8500_irq_unmask(unsigned int irq)
|
static void vt8500_irq_unmask(struct irq_data *d)
|
||||||
{
|
{
|
||||||
void __iomem *base = ic_regbase;
|
void __iomem *base = ic_regbase;
|
||||||
|
unsigned irq = d->irq;
|
||||||
u8 dctr;
|
u8 dctr;
|
||||||
|
|
||||||
if (irq >= 64) {
|
if (irq >= 64) {
|
||||||
@ -78,10 +80,11 @@ static void vt8500_irq_unmask(unsigned int irq)
|
|||||||
writeb(dctr, base + VT8500_IC_DCTR + irq);
|
writeb(dctr, base + VT8500_IC_DCTR + irq);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int vt8500_irq_set_type(unsigned int irq, unsigned int flow_type)
|
static int vt8500_irq_set_type(struct irq_data *d, unsigned int flow_type)
|
||||||
{
|
{
|
||||||
void __iomem *base = ic_regbase;
|
void __iomem *base = ic_regbase;
|
||||||
unsigned int orig_irq = irq;
|
unsigned irq = d->irq;
|
||||||
|
unsigned orig_irq = irq;
|
||||||
u8 dctr;
|
u8 dctr;
|
||||||
|
|
||||||
if (irq >= 64) {
|
if (irq >= 64) {
|
||||||
@ -114,11 +117,11 @@ static int vt8500_irq_set_type(unsigned int irq, unsigned int flow_type)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static struct irq_chip vt8500_irq_chip = {
|
static struct irq_chip vt8500_irq_chip = {
|
||||||
.name = "vt8500",
|
.name = "vt8500",
|
||||||
.ack = vt8500_irq_mask,
|
.irq_ack = vt8500_irq_mask,
|
||||||
.mask = vt8500_irq_mask,
|
.irq_mask = vt8500_irq_mask,
|
||||||
.unmask = vt8500_irq_unmask,
|
.irq_unmask = vt8500_irq_unmask,
|
||||||
.set_type = vt8500_irq_set_type,
|
.irq_set_type = vt8500_irq_set_type,
|
||||||
};
|
};
|
||||||
|
|
||||||
void __init vt8500_init_irq(void)
|
void __init vt8500_init_irq(void)
|
||||||
|
@ -120,17 +120,22 @@ static void l2x0_cache_sync(void)
|
|||||||
spin_unlock_irqrestore(&l2x0_lock, flags);
|
spin_unlock_irqrestore(&l2x0_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void __l2x0_flush_all(void)
|
||||||
|
{
|
||||||
|
debug_writel(0x03);
|
||||||
|
writel_relaxed(l2x0_way_mask, l2x0_base + L2X0_CLEAN_INV_WAY);
|
||||||
|
cache_wait_way(l2x0_base + L2X0_CLEAN_INV_WAY, l2x0_way_mask);
|
||||||
|
cache_sync();
|
||||||
|
debug_writel(0x00);
|
||||||
|
}
|
||||||
|
|
||||||
static void l2x0_flush_all(void)
|
static void l2x0_flush_all(void)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
/* clean all ways */
|
/* clean all ways */
|
||||||
spin_lock_irqsave(&l2x0_lock, flags);
|
spin_lock_irqsave(&l2x0_lock, flags);
|
||||||
debug_writel(0x03);
|
__l2x0_flush_all();
|
||||||
writel_relaxed(l2x0_way_mask, l2x0_base + L2X0_CLEAN_INV_WAY);
|
|
||||||
cache_wait_way(l2x0_base + L2X0_CLEAN_INV_WAY, l2x0_way_mask);
|
|
||||||
cache_sync();
|
|
||||||
debug_writel(0x00);
|
|
||||||
spin_unlock_irqrestore(&l2x0_lock, flags);
|
spin_unlock_irqrestore(&l2x0_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -266,7 +271,9 @@ static void l2x0_disable(void)
|
|||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
spin_lock_irqsave(&l2x0_lock, flags);
|
spin_lock_irqsave(&l2x0_lock, flags);
|
||||||
writel(0, l2x0_base + L2X0_CTRL);
|
__l2x0_flush_all();
|
||||||
|
writel_relaxed(0, l2x0_base + L2X0_CTRL);
|
||||||
|
dsb();
|
||||||
spin_unlock_irqrestore(&l2x0_lock, flags);
|
spin_unlock_irqrestore(&l2x0_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -759,7 +759,7 @@ early_param("vmalloc", early_vmalloc);
|
|||||||
|
|
||||||
static phys_addr_t lowmem_limit __initdata = 0;
|
static phys_addr_t lowmem_limit __initdata = 0;
|
||||||
|
|
||||||
static void __init sanity_check_meminfo(void)
|
void __init sanity_check_meminfo(void)
|
||||||
{
|
{
|
||||||
int i, j, highmem = 0;
|
int i, j, highmem = 0;
|
||||||
|
|
||||||
@ -1032,8 +1032,9 @@ void __init paging_init(struct machine_desc *mdesc)
|
|||||||
{
|
{
|
||||||
void *zero_page;
|
void *zero_page;
|
||||||
|
|
||||||
|
memblock_set_current_limit(lowmem_limit);
|
||||||
|
|
||||||
build_mem_type_table();
|
build_mem_type_table();
|
||||||
sanity_check_meminfo();
|
|
||||||
prepare_page_table();
|
prepare_page_table();
|
||||||
map_lowmem();
|
map_lowmem();
|
||||||
devicemaps_init(mdesc);
|
devicemaps_init(mdesc);
|
||||||
|
@ -27,6 +27,10 @@ void __init arm_mm_memblock_reserve(void)
|
|||||||
memblock_reserve(CONFIG_VECTORS_BASE, PAGE_SIZE);
|
memblock_reserve(CONFIG_VECTORS_BASE, PAGE_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void __init sanity_check_meminfo(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* paging_init() sets up the page tables, initialises the zone memory
|
* paging_init() sets up the page tables, initialises the zone memory
|
||||||
* maps, and sets up the zero page, bad page and bad page tables.
|
* maps, and sets up the zero page, bad page and bad page tables.
|
||||||
|
@ -210,19 +210,21 @@ cpu_v7_name:
|
|||||||
|
|
||||||
/* Suspend/resume support: derived from arch/arm/mach-s5pv210/sleep.S */
|
/* Suspend/resume support: derived from arch/arm/mach-s5pv210/sleep.S */
|
||||||
.globl cpu_v7_suspend_size
|
.globl cpu_v7_suspend_size
|
||||||
.equ cpu_v7_suspend_size, 4 * 8
|
.equ cpu_v7_suspend_size, 4 * 9
|
||||||
#ifdef CONFIG_PM_SLEEP
|
#ifdef CONFIG_PM_SLEEP
|
||||||
ENTRY(cpu_v7_do_suspend)
|
ENTRY(cpu_v7_do_suspend)
|
||||||
stmfd sp!, {r4 - r11, lr}
|
stmfd sp!, {r4 - r11, lr}
|
||||||
mrc p15, 0, r4, c13, c0, 0 @ FCSE/PID
|
mrc p15, 0, r4, c13, c0, 0 @ FCSE/PID
|
||||||
mrc p15, 0, r5, c13, c0, 1 @ Context ID
|
mrc p15, 0, r5, c13, c0, 1 @ Context ID
|
||||||
|
mrc p15, 0, r6, c13, c0, 3 @ User r/o thread ID
|
||||||
|
stmia r0!, {r4 - r6}
|
||||||
mrc p15, 0, r6, c3, c0, 0 @ Domain ID
|
mrc p15, 0, r6, c3, c0, 0 @ Domain ID
|
||||||
mrc p15, 0, r7, c2, c0, 0 @ TTB 0
|
mrc p15, 0, r7, c2, c0, 0 @ TTB 0
|
||||||
mrc p15, 0, r8, c2, c0, 1 @ TTB 1
|
mrc p15, 0, r8, c2, c0, 1 @ TTB 1
|
||||||
mrc p15, 0, r9, c1, c0, 0 @ Control register
|
mrc p15, 0, r9, c1, c0, 0 @ Control register
|
||||||
mrc p15, 0, r10, c1, c0, 1 @ Auxiliary control register
|
mrc p15, 0, r10, c1, c0, 1 @ Auxiliary control register
|
||||||
mrc p15, 0, r11, c1, c0, 2 @ Co-processor access control
|
mrc p15, 0, r11, c1, c0, 2 @ Co-processor access control
|
||||||
stmia r0, {r4 - r11}
|
stmia r0, {r6 - r11}
|
||||||
ldmfd sp!, {r4 - r11, pc}
|
ldmfd sp!, {r4 - r11, pc}
|
||||||
ENDPROC(cpu_v7_do_suspend)
|
ENDPROC(cpu_v7_do_suspend)
|
||||||
|
|
||||||
@ -230,9 +232,11 @@ ENTRY(cpu_v7_do_resume)
|
|||||||
mov ip, #0
|
mov ip, #0
|
||||||
mcr p15, 0, ip, c8, c7, 0 @ invalidate TLBs
|
mcr p15, 0, ip, c8, c7, 0 @ invalidate TLBs
|
||||||
mcr p15, 0, ip, c7, c5, 0 @ invalidate I cache
|
mcr p15, 0, ip, c7, c5, 0 @ invalidate I cache
|
||||||
ldmia r0, {r4 - r11}
|
ldmia r0!, {r4 - r6}
|
||||||
mcr p15, 0, r4, c13, c0, 0 @ FCSE/PID
|
mcr p15, 0, r4, c13, c0, 0 @ FCSE/PID
|
||||||
mcr p15, 0, r5, c13, c0, 1 @ Context ID
|
mcr p15, 0, r5, c13, c0, 1 @ Context ID
|
||||||
|
mcr p15, 0, r6, c13, c0, 3 @ User r/o thread ID
|
||||||
|
ldmia r0, {r6 - r11}
|
||||||
mcr p15, 0, r6, c3, c0, 0 @ Domain ID
|
mcr p15, 0, r6, c3, c0, 0 @ Domain ID
|
||||||
mcr p15, 0, r7, c2, c0, 0 @ TTB 0
|
mcr p15, 0, r7, c2, c0, 0 @ TTB 0
|
||||||
mcr p15, 0, r8, c2, c0, 1 @ TTB 1
|
mcr p15, 0, r8, c2, c0, 1 @ TTB 1
|
||||||
@ -418,9 +422,9 @@ ENTRY(v7_processor_functions)
|
|||||||
.word cpu_v7_dcache_clean_area
|
.word cpu_v7_dcache_clean_area
|
||||||
.word cpu_v7_switch_mm
|
.word cpu_v7_switch_mm
|
||||||
.word cpu_v7_set_pte_ext
|
.word cpu_v7_set_pte_ext
|
||||||
.word 0
|
.word cpu_v7_suspend_size
|
||||||
.word 0
|
.word cpu_v7_do_suspend
|
||||||
.word 0
|
.word cpu_v7_do_resume
|
||||||
.size v7_processor_functions, . - v7_processor_functions
|
.size v7_processor_functions, . - v7_processor_functions
|
||||||
|
|
||||||
.section ".rodata"
|
.section ".rodata"
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
*/
|
*/
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <asm/traps.h>
|
#include <asm/traps.h>
|
||||||
|
#include <asm/ptrace.h>
|
||||||
|
|
||||||
static int cp6_trap(struct pt_regs *regs, unsigned int instr)
|
static int cp6_trap(struct pt_regs *regs, unsigned int instr)
|
||||||
{
|
{
|
||||||
|
@ -1027,17 +1027,13 @@ int s3c2410_dma_config(unsigned int channel,
|
|||||||
struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
|
struct s3c2410_dma_chan *chan = s3c_dma_lookup_channel(channel);
|
||||||
unsigned int dcon;
|
unsigned int dcon;
|
||||||
|
|
||||||
pr_debug("%s: chan=%d, xfer_unit=%d, dcon=%08x\n",
|
pr_debug("%s: chan=%d, xfer_unit=%d\n", __func__, channel, xferunit);
|
||||||
__func__, channel, xferunit, dcon);
|
|
||||||
|
|
||||||
if (chan == NULL)
|
if (chan == NULL)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
pr_debug("%s: Initial dcon is %08x\n", __func__, dcon);
|
|
||||||
|
|
||||||
dcon = chan->dcon & dma_sel.dcon_mask;
|
dcon = chan->dcon & dma_sel.dcon_mask;
|
||||||
|
pr_debug("%s: dcon is %08x\n", __func__, dcon);
|
||||||
pr_debug("%s: New dcon is %08x\n", __func__, dcon);
|
|
||||||
|
|
||||||
switch (chan->req_ch) {
|
switch (chan->req_ch) {
|
||||||
case DMACH_I2S_IN:
|
case DMACH_I2S_IN:
|
||||||
@ -1235,7 +1231,7 @@ static void s3c2410_dma_resume_chan(struct s3c2410_dma_chan *cp)
|
|||||||
/* restore channel's hardware configuration */
|
/* restore channel's hardware configuration */
|
||||||
|
|
||||||
if (!cp->in_use)
|
if (!cp->in_use)
|
||||||
return 0;
|
return;
|
||||||
|
|
||||||
printk(KERN_INFO "dma%d: restoring configuration\n", cp->number);
|
printk(KERN_INFO "dma%d: restoring configuration\n", cp->number);
|
||||||
|
|
||||||
@ -1246,8 +1242,6 @@ static void s3c2410_dma_resume_chan(struct s3c2410_dma_chan *cp)
|
|||||||
|
|
||||||
if (cp->map != NULL)
|
if (cp->map != NULL)
|
||||||
dma_sel.select(cp, cp->map);
|
dma_sel.select(cp, cp->map);
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void s3c2410_dma_resume(void)
|
static void s3c2410_dma_resume(void)
|
||||||
|
@ -370,11 +370,11 @@ static void __init s5p_clocksource_init(void)
|
|||||||
|
|
||||||
clock_rate = clk_get_rate(tin_source);
|
clock_rate = clk_get_rate(tin_source);
|
||||||
|
|
||||||
init_sched_clock(&cd, s5p_update_sched_clock, 32, clock_rate);
|
|
||||||
|
|
||||||
s5p_time_setup(timer_source.source_id, TCNT_MAX);
|
s5p_time_setup(timer_source.source_id, TCNT_MAX);
|
||||||
s5p_time_start(timer_source.source_id, PERIODIC);
|
s5p_time_start(timer_source.source_id, PERIODIC);
|
||||||
|
|
||||||
|
init_sched_clock(&cd, s5p_update_sched_clock, 32, clock_rate);
|
||||||
|
|
||||||
if (clocksource_register_hz(&time_clocksource, clock_rate))
|
if (clocksource_register_hz(&time_clocksource, clock_rate))
|
||||||
panic("%s: can't register clocksource\n", time_clocksource.name);
|
panic("%s: can't register clocksource\n", time_clocksource.name);
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,10 @@
|
|||||||
* it under the terms of the GNU General Public License version 2 as
|
* it under the terms of the GNU General Public License version 2 as
|
||||||
* published by the Free Software Foundation.
|
* published by the Free Software Foundation.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef __PLAT_DEVS_H
|
||||||
|
#define __PLAT_DEVS_H __FILE__
|
||||||
|
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
|
||||||
struct s3c24xx_uart_resources {
|
struct s3c24xx_uart_resources {
|
||||||
@ -159,3 +163,5 @@ extern struct platform_device s3c_device_ac97;
|
|||||||
*/
|
*/
|
||||||
extern void *s3c_set_platdata(void *pd, size_t pdsize,
|
extern void *s3c_set_platdata(void *pd, size_t pdsize,
|
||||||
struct platform_device *pdev);
|
struct platform_device *pdev);
|
||||||
|
|
||||||
|
#endif /* __PLAT_DEVS_H */
|
||||||
|
@ -224,6 +224,8 @@
|
|||||||
#define S5PV210_UFSTAT_RXMASK (255<<0)
|
#define S5PV210_UFSTAT_RXMASK (255<<0)
|
||||||
#define S5PV210_UFSTAT_RXSHIFT (0)
|
#define S5PV210_UFSTAT_RXSHIFT (0)
|
||||||
|
|
||||||
|
#define NO_NEED_CHECK_CLKSRC 1
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
/* struct s3c24xx_uart_clksrc
|
/* struct s3c24xx_uart_clksrc
|
||||||
|
@ -39,6 +39,7 @@ struct s3c64xx_spi_csinfo {
|
|||||||
* @fifo_lvl_mask: All tx fifo_lvl fields start at offset-6
|
* @fifo_lvl_mask: All tx fifo_lvl fields start at offset-6
|
||||||
* @rx_lvl_offset: Depends on tx fifo_lvl field and bus number
|
* @rx_lvl_offset: Depends on tx fifo_lvl field and bus number
|
||||||
* @high_speed: If the controller supports HIGH_SPEED_EN bit
|
* @high_speed: If the controller supports HIGH_SPEED_EN bit
|
||||||
|
* @tx_st_done: Depends on tx fifo_lvl field
|
||||||
*/
|
*/
|
||||||
struct s3c64xx_spi_info {
|
struct s3c64xx_spi_info {
|
||||||
int src_clk_nr;
|
int src_clk_nr;
|
||||||
@ -53,6 +54,7 @@ struct s3c64xx_spi_info {
|
|||||||
int fifo_lvl_mask;
|
int fifo_lvl_mask;
|
||||||
int rx_lvl_offset;
|
int rx_lvl_offset;
|
||||||
int high_speed;
|
int high_speed;
|
||||||
|
int tx_st_done;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -14,12 +14,6 @@ extern struct pglist_data *node_data[];
|
|||||||
#define NODE_DATA(nid) (node_data[nid])
|
#define NODE_DATA(nid) (node_data[nid])
|
||||||
|
|
||||||
#define node_localnr(pfn, nid) ((pfn) - NODE_DATA(nid)->node_start_pfn)
|
#define node_localnr(pfn, nid) ((pfn) - NODE_DATA(nid)->node_start_pfn)
|
||||||
#define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
|
|
||||||
#define node_end_pfn(nid) \
|
|
||||||
({ \
|
|
||||||
pg_data_t *__pgdat = NODE_DATA(nid); \
|
|
||||||
__pgdat->node_start_pfn + __pgdat->node_spanned_pages - 1; \
|
|
||||||
})
|
|
||||||
|
|
||||||
#define pmd_page(pmd) (pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT))
|
#define pmd_page(pmd) (pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT))
|
||||||
/*
|
/*
|
||||||
@ -44,7 +38,7 @@ static __inline__ int pfn_to_nid(unsigned long pfn)
|
|||||||
int node;
|
int node;
|
||||||
|
|
||||||
for (node = 0 ; node < MAX_NUMNODES ; node++)
|
for (node = 0 ; node < MAX_NUMNODES ; node++)
|
||||||
if (pfn >= node_start_pfn(node) && pfn <= node_end_pfn(node))
|
if (pfn >= node_start_pfn(node) && pfn < node_end_pfn(node))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
return node;
|
return node;
|
||||||
|
@ -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>
|
||||||
|
|
||||||
|
@ -14,13 +14,6 @@ extern struct node_map_data node_data[];
|
|||||||
|
|
||||||
#define NODE_DATA(nid) (&node_data[nid].pg_data)
|
#define NODE_DATA(nid) (&node_data[nid].pg_data)
|
||||||
|
|
||||||
#define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
|
|
||||||
#define node_end_pfn(nid) \
|
|
||||||
({ \
|
|
||||||
pg_data_t *__pgdat = NODE_DATA(nid); \
|
|
||||||
__pgdat->node_start_pfn + __pgdat->node_spanned_pages; \
|
|
||||||
})
|
|
||||||
|
|
||||||
/* We have these possible memory map layouts:
|
/* We have these possible memory map layouts:
|
||||||
* Astro: 0-3.75, 67.75-68, 4-64
|
* Astro: 0-3.75, 67.75-68, 4-64
|
||||||
* zx1: 0-1, 257-260, 4-256
|
* zx1: 0-1, 257-260, 4-256
|
||||||
|
@ -209,8 +209,10 @@
|
|||||||
wm8776:codec@1a {
|
wm8776:codec@1a {
|
||||||
compatible = "wlf,wm8776";
|
compatible = "wlf,wm8776";
|
||||||
reg = <0x1a>;
|
reg = <0x1a>;
|
||||||
/* MCLK source is a stand-alone oscillator */
|
/*
|
||||||
clock-frequency = <12288000>;
|
* clock-frequency will be set by U-Boot if
|
||||||
|
* the clock is enabled.
|
||||||
|
*/
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -280,7 +282,8 @@
|
|||||||
codec-handle = <&wm8776>;
|
codec-handle = <&wm8776>;
|
||||||
fsl,playback-dma = <&dma00>;
|
fsl,playback-dma = <&dma00>;
|
||||||
fsl,capture-dma = <&dma01>;
|
fsl,capture-dma = <&dma01>;
|
||||||
fsl,fifo-depth = <16>;
|
fsl,fifo-depth = <15>;
|
||||||
|
fsl,ssi-asynchronous;
|
||||||
};
|
};
|
||||||
|
|
||||||
dma@c300 {
|
dma@c300 {
|
||||||
|
@ -148,7 +148,6 @@ CONFIG_SCSI_SAS_ATTRS=m
|
|||||||
CONFIG_SCSI_CXGB3_ISCSI=m
|
CONFIG_SCSI_CXGB3_ISCSI=m
|
||||||
CONFIG_SCSI_CXGB4_ISCSI=m
|
CONFIG_SCSI_CXGB4_ISCSI=m
|
||||||
CONFIG_SCSI_BNX2_ISCSI=m
|
CONFIG_SCSI_BNX2_ISCSI=m
|
||||||
CONFIG_SCSI_BNX2_ISCSI=m
|
|
||||||
CONFIG_BE2ISCSI=m
|
CONFIG_BE2ISCSI=m
|
||||||
CONFIG_SCSI_IBMVSCSI=y
|
CONFIG_SCSI_IBMVSCSI=y
|
||||||
CONFIG_SCSI_IBMVFC=m
|
CONFIG_SCSI_IBMVFC=m
|
||||||
|
@ -38,13 +38,6 @@ u64 memory_hotplug_max(void);
|
|||||||
#define memory_hotplug_max() memblock_end_of_DRAM()
|
#define memory_hotplug_max() memblock_end_of_DRAM()
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* Following are macros that each numa implmentation must define.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
|
|
||||||
#define node_end_pfn(nid) (NODE_DATA(nid)->node_end_pfn)
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#define memory_hotplug_max() memblock_end_of_DRAM()
|
#define memory_hotplug_max() memblock_end_of_DRAM()
|
||||||
#endif /* CONFIG_NEED_MULTIPLE_NODES */
|
#endif /* CONFIG_NEED_MULTIPLE_NODES */
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/rtc.h>
|
#include <linux/rtc.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
|
#include <linux/ratelimit.h>
|
||||||
#include <asm/prom.h>
|
#include <asm/prom.h>
|
||||||
#include <asm/rtas.h>
|
#include <asm/rtas.h>
|
||||||
#include <asm/time.h>
|
#include <asm/time.h>
|
||||||
@ -29,9 +30,10 @@ unsigned long __init rtas_get_boot_time(void)
|
|||||||
}
|
}
|
||||||
} while (wait_time && (get_tb() < max_wait_tb));
|
} while (wait_time && (get_tb() < max_wait_tb));
|
||||||
|
|
||||||
if (error != 0 && printk_ratelimit()) {
|
if (error != 0) {
|
||||||
printk(KERN_WARNING "error: reading the clock failed (%d)\n",
|
printk_ratelimited(KERN_WARNING
|
||||||
error);
|
"error: reading the clock failed (%d)\n",
|
||||||
|
error);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -55,19 +57,21 @@ void rtas_get_rtc_time(struct rtc_time *rtc_tm)
|
|||||||
|
|
||||||
wait_time = rtas_busy_delay_time(error);
|
wait_time = rtas_busy_delay_time(error);
|
||||||
if (wait_time) {
|
if (wait_time) {
|
||||||
if (in_interrupt() && printk_ratelimit()) {
|
if (in_interrupt()) {
|
||||||
memset(rtc_tm, 0, sizeof(struct rtc_time));
|
memset(rtc_tm, 0, sizeof(struct rtc_time));
|
||||||
printk(KERN_WARNING "error: reading clock"
|
printk_ratelimited(KERN_WARNING
|
||||||
" would delay interrupt\n");
|
"error: reading clock "
|
||||||
|
"would delay interrupt\n");
|
||||||
return; /* delay not allowed */
|
return; /* delay not allowed */
|
||||||
}
|
}
|
||||||
msleep(wait_time);
|
msleep(wait_time);
|
||||||
}
|
}
|
||||||
} while (wait_time && (get_tb() < max_wait_tb));
|
} while (wait_time && (get_tb() < max_wait_tb));
|
||||||
|
|
||||||
if (error != 0 && printk_ratelimit()) {
|
if (error != 0) {
|
||||||
printk(KERN_WARNING "error: reading the clock failed (%d)\n",
|
printk_ratelimited(KERN_WARNING
|
||||||
error);
|
"error: reading the clock failed (%d)\n",
|
||||||
|
error);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -99,9 +103,10 @@ int rtas_set_rtc_time(struct rtc_time *tm)
|
|||||||
}
|
}
|
||||||
} while (wait_time && (get_tb() < max_wait_tb));
|
} while (wait_time && (get_tb() < max_wait_tb));
|
||||||
|
|
||||||
if (error != 0 && printk_ratelimit())
|
if (error != 0)
|
||||||
printk(KERN_WARNING "error: setting the clock failed (%d)\n",
|
printk_ratelimited(KERN_WARNING
|
||||||
error);
|
"error: setting the clock failed (%d)\n",
|
||||||
|
error);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/elf.h>
|
#include <linux/elf.h>
|
||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
|
#include <linux/ratelimit.h>
|
||||||
#ifdef CONFIG_PPC64
|
#ifdef CONFIG_PPC64
|
||||||
#include <linux/syscalls.h>
|
#include <linux/syscalls.h>
|
||||||
#include <linux/compat.h>
|
#include <linux/compat.h>
|
||||||
@ -892,11 +893,12 @@ badframe:
|
|||||||
printk("badframe in handle_rt_signal, regs=%p frame=%p newsp=%lx\n",
|
printk("badframe in handle_rt_signal, regs=%p frame=%p newsp=%lx\n",
|
||||||
regs, frame, newsp);
|
regs, frame, newsp);
|
||||||
#endif
|
#endif
|
||||||
if (show_unhandled_signals && printk_ratelimit())
|
if (show_unhandled_signals)
|
||||||
printk(KERN_INFO "%s[%d]: bad frame in handle_rt_signal32: "
|
printk_ratelimited(KERN_INFO
|
||||||
"%p nip %08lx lr %08lx\n",
|
"%s[%d]: bad frame in handle_rt_signal32: "
|
||||||
current->comm, current->pid,
|
"%p nip %08lx lr %08lx\n",
|
||||||
addr, regs->nip, regs->link);
|
current->comm, current->pid,
|
||||||
|
addr, regs->nip, regs->link);
|
||||||
|
|
||||||
force_sigsegv(sig, current);
|
force_sigsegv(sig, current);
|
||||||
return 0;
|
return 0;
|
||||||
@ -1058,11 +1060,12 @@ long sys_rt_sigreturn(int r3, int r4, int r5, int r6, int r7, int r8,
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
bad:
|
bad:
|
||||||
if (show_unhandled_signals && printk_ratelimit())
|
if (show_unhandled_signals)
|
||||||
printk(KERN_INFO "%s[%d]: bad frame in sys_rt_sigreturn: "
|
printk_ratelimited(KERN_INFO
|
||||||
"%p nip %08lx lr %08lx\n",
|
"%s[%d]: bad frame in sys_rt_sigreturn: "
|
||||||
current->comm, current->pid,
|
"%p nip %08lx lr %08lx\n",
|
||||||
rt_sf, regs->nip, regs->link);
|
current->comm, current->pid,
|
||||||
|
rt_sf, regs->nip, regs->link);
|
||||||
|
|
||||||
force_sig(SIGSEGV, current);
|
force_sig(SIGSEGV, current);
|
||||||
return 0;
|
return 0;
|
||||||
@ -1149,12 +1152,12 @@ int sys_debug_setcontext(struct ucontext __user *ctx,
|
|||||||
* We kill the task with a SIGSEGV in this situation.
|
* We kill the task with a SIGSEGV in this situation.
|
||||||
*/
|
*/
|
||||||
if (do_setcontext(ctx, regs, 1)) {
|
if (do_setcontext(ctx, regs, 1)) {
|
||||||
if (show_unhandled_signals && printk_ratelimit())
|
if (show_unhandled_signals)
|
||||||
printk(KERN_INFO "%s[%d]: bad frame in "
|
printk_ratelimited(KERN_INFO "%s[%d]: bad frame in "
|
||||||
"sys_debug_setcontext: %p nip %08lx "
|
"sys_debug_setcontext: %p nip %08lx "
|
||||||
"lr %08lx\n",
|
"lr %08lx\n",
|
||||||
current->comm, current->pid,
|
current->comm, current->pid,
|
||||||
ctx, regs->nip, regs->link);
|
ctx, regs->nip, regs->link);
|
||||||
|
|
||||||
force_sig(SIGSEGV, current);
|
force_sig(SIGSEGV, current);
|
||||||
goto out;
|
goto out;
|
||||||
@ -1236,11 +1239,12 @@ badframe:
|
|||||||
printk("badframe in handle_signal, regs=%p frame=%p newsp=%lx\n",
|
printk("badframe in handle_signal, regs=%p frame=%p newsp=%lx\n",
|
||||||
regs, frame, newsp);
|
regs, frame, newsp);
|
||||||
#endif
|
#endif
|
||||||
if (show_unhandled_signals && printk_ratelimit())
|
if (show_unhandled_signals)
|
||||||
printk(KERN_INFO "%s[%d]: bad frame in handle_signal32: "
|
printk_ratelimited(KERN_INFO
|
||||||
"%p nip %08lx lr %08lx\n",
|
"%s[%d]: bad frame in handle_signal32: "
|
||||||
current->comm, current->pid,
|
"%p nip %08lx lr %08lx\n",
|
||||||
frame, regs->nip, regs->link);
|
current->comm, current->pid,
|
||||||
|
frame, regs->nip, regs->link);
|
||||||
|
|
||||||
force_sigsegv(sig, current);
|
force_sigsegv(sig, current);
|
||||||
return 0;
|
return 0;
|
||||||
@ -1288,11 +1292,12 @@ long sys_sigreturn(int r3, int r4, int r5, int r6, int r7, int r8,
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
badframe:
|
badframe:
|
||||||
if (show_unhandled_signals && printk_ratelimit())
|
if (show_unhandled_signals)
|
||||||
printk(KERN_INFO "%s[%d]: bad frame in sys_sigreturn: "
|
printk_ratelimited(KERN_INFO
|
||||||
"%p nip %08lx lr %08lx\n",
|
"%s[%d]: bad frame in sys_sigreturn: "
|
||||||
current->comm, current->pid,
|
"%p nip %08lx lr %08lx\n",
|
||||||
addr, regs->nip, regs->link);
|
current->comm, current->pid,
|
||||||
|
addr, regs->nip, regs->link);
|
||||||
|
|
||||||
force_sig(SIGSEGV, current);
|
force_sig(SIGSEGV, current);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
#include <linux/elf.h>
|
#include <linux/elf.h>
|
||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
#include <linux/ratelimit.h>
|
||||||
|
|
||||||
#include <asm/sigcontext.h>
|
#include <asm/sigcontext.h>
|
||||||
#include <asm/ucontext.h>
|
#include <asm/ucontext.h>
|
||||||
@ -380,10 +381,10 @@ badframe:
|
|||||||
printk("badframe in sys_rt_sigreturn, regs=%p uc=%p &uc->uc_mcontext=%p\n",
|
printk("badframe in sys_rt_sigreturn, regs=%p uc=%p &uc->uc_mcontext=%p\n",
|
||||||
regs, uc, &uc->uc_mcontext);
|
regs, uc, &uc->uc_mcontext);
|
||||||
#endif
|
#endif
|
||||||
if (show_unhandled_signals && printk_ratelimit())
|
if (show_unhandled_signals)
|
||||||
printk(regs->msr & MSR_64BIT ? fmt64 : fmt32,
|
printk_ratelimited(regs->msr & MSR_64BIT ? fmt64 : fmt32,
|
||||||
current->comm, current->pid, "rt_sigreturn",
|
current->comm, current->pid, "rt_sigreturn",
|
||||||
(long)uc, regs->nip, regs->link);
|
(long)uc, regs->nip, regs->link);
|
||||||
|
|
||||||
force_sig(SIGSEGV, current);
|
force_sig(SIGSEGV, current);
|
||||||
return 0;
|
return 0;
|
||||||
@ -468,10 +469,10 @@ badframe:
|
|||||||
printk("badframe in setup_rt_frame, regs=%p frame=%p newsp=%lx\n",
|
printk("badframe in setup_rt_frame, regs=%p frame=%p newsp=%lx\n",
|
||||||
regs, frame, newsp);
|
regs, frame, newsp);
|
||||||
#endif
|
#endif
|
||||||
if (show_unhandled_signals && printk_ratelimit())
|
if (show_unhandled_signals)
|
||||||
printk(regs->msr & MSR_64BIT ? fmt64 : fmt32,
|
printk_ratelimited(regs->msr & MSR_64BIT ? fmt64 : fmt32,
|
||||||
current->comm, current->pid, "setup_rt_frame",
|
current->comm, current->pid, "setup_rt_frame",
|
||||||
(long)frame, regs->nip, regs->link);
|
(long)frame, regs->nip, regs->link);
|
||||||
|
|
||||||
force_sigsegv(signr, current);
|
force_sigsegv(signr, current);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
#include <linux/bug.h>
|
#include <linux/bug.h>
|
||||||
#include <linux/kdebug.h>
|
#include <linux/kdebug.h>
|
||||||
#include <linux/debugfs.h>
|
#include <linux/debugfs.h>
|
||||||
|
#include <linux/ratelimit.h>
|
||||||
|
|
||||||
#include <asm/emulated_ops.h>
|
#include <asm/emulated_ops.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
@ -197,12 +198,11 @@ void _exception(int signr, struct pt_regs *regs, int code, unsigned long addr)
|
|||||||
if (die("Exception in kernel mode", regs, signr))
|
if (die("Exception in kernel mode", regs, signr))
|
||||||
return;
|
return;
|
||||||
} else if (show_unhandled_signals &&
|
} else if (show_unhandled_signals &&
|
||||||
unhandled_signal(current, signr) &&
|
unhandled_signal(current, signr)) {
|
||||||
printk_ratelimit()) {
|
printk_ratelimited(regs->msr & MSR_64BIT ? fmt64 : fmt32,
|
||||||
printk(regs->msr & MSR_64BIT ? fmt64 : fmt32,
|
current->comm, current->pid, signr,
|
||||||
current->comm, current->pid, signr,
|
addr, regs->nip, regs->link, code);
|
||||||
addr, regs->nip, regs->link, code);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
memset(&info, 0, sizeof(info));
|
memset(&info, 0, sizeof(info));
|
||||||
info.si_signo = signr;
|
info.si_signo = signr;
|
||||||
@ -425,7 +425,7 @@ int machine_check_e500mc(struct pt_regs *regs)
|
|||||||
unsigned long reason = mcsr;
|
unsigned long reason = mcsr;
|
||||||
int recoverable = 1;
|
int recoverable = 1;
|
||||||
|
|
||||||
if (reason & MCSR_BUS_RBERR) {
|
if (reason & MCSR_LD) {
|
||||||
recoverable = fsl_rio_mcheck_exception(regs);
|
recoverable = fsl_rio_mcheck_exception(regs);
|
||||||
if (recoverable == 1)
|
if (recoverable == 1)
|
||||||
goto silent_out;
|
goto silent_out;
|
||||||
@ -1342,9 +1342,8 @@ void altivec_assist_exception(struct pt_regs *regs)
|
|||||||
} else {
|
} else {
|
||||||
/* didn't recognize the instruction */
|
/* didn't recognize the instruction */
|
||||||
/* XXX quick hack for now: set the non-Java bit in the VSCR */
|
/* XXX quick hack for now: set the non-Java bit in the VSCR */
|
||||||
if (printk_ratelimit())
|
printk_ratelimited(KERN_ERR "Unrecognized altivec instruction "
|
||||||
printk(KERN_ERR "Unrecognized altivec instruction "
|
"in %s at %lx\n", current->comm, regs->nip);
|
||||||
"in %s at %lx\n", current->comm, regs->nip);
|
|
||||||
current->thread.vscr.u[3] |= 0x10000;
|
current->thread.vscr.u[3] |= 0x10000;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1548,9 +1547,8 @@ u32 ppc_warn_emulated;
|
|||||||
|
|
||||||
void ppc_warn_emulated_print(const char *type)
|
void ppc_warn_emulated_print(const char *type)
|
||||||
{
|
{
|
||||||
if (printk_ratelimit())
|
pr_warn_ratelimited("%s used emulated %s instruction\n", current->comm,
|
||||||
pr_warning("%s used emulated %s instruction\n", current->comm,
|
type);
|
||||||
type);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init ppc_warn_emulated_init(void)
|
static int __init ppc_warn_emulated_init(void)
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
#include <linux/kdebug.h>
|
#include <linux/kdebug.h>
|
||||||
#include <linux/perf_event.h>
|
#include <linux/perf_event.h>
|
||||||
#include <linux/magic.h>
|
#include <linux/magic.h>
|
||||||
|
#include <linux/ratelimit.h>
|
||||||
|
|
||||||
#include <asm/firmware.h>
|
#include <asm/firmware.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
@ -346,11 +347,10 @@ bad_area_nosemaphore:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_exec && (error_code & DSISR_PROTFAULT)
|
if (is_exec && (error_code & DSISR_PROTFAULT))
|
||||||
&& printk_ratelimit())
|
printk_ratelimited(KERN_CRIT "kernel tried to execute NX-protected"
|
||||||
printk(KERN_CRIT "kernel tried to execute NX-protected"
|
" page (%lx) - exploit attempt? (uid: %d)\n",
|
||||||
" page (%lx) - exploit attempt? (uid: %d)\n",
|
address, current_uid());
|
||||||
address, current_uid());
|
|
||||||
|
|
||||||
return SIGSEGV;
|
return SIGSEGV;
|
||||||
|
|
||||||
|
@ -283,23 +283,24 @@ static void __iomem *rio_regs_win;
|
|||||||
#ifdef CONFIG_E500
|
#ifdef CONFIG_E500
|
||||||
int fsl_rio_mcheck_exception(struct pt_regs *regs)
|
int fsl_rio_mcheck_exception(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
const struct exception_table_entry *entry = NULL;
|
const struct exception_table_entry *entry;
|
||||||
unsigned long reason = mfspr(SPRN_MCSR);
|
unsigned long reason;
|
||||||
|
|
||||||
if (reason & MCSR_BUS_RBERR) {
|
if (!rio_regs_win)
|
||||||
reason = in_be32((u32 *)(rio_regs_win + RIO_LTLEDCSR));
|
return 0;
|
||||||
if (reason & (RIO_LTLEDCSR_IER | RIO_LTLEDCSR_PRT)) {
|
|
||||||
/* Check if we are prepared to handle this fault */
|
reason = in_be32((u32 *)(rio_regs_win + RIO_LTLEDCSR));
|
||||||
entry = search_exception_tables(regs->nip);
|
if (reason & (RIO_LTLEDCSR_IER | RIO_LTLEDCSR_PRT)) {
|
||||||
if (entry) {
|
/* Check if we are prepared to handle this fault */
|
||||||
pr_debug("RIO: %s - MC Exception handled\n",
|
entry = search_exception_tables(regs->nip);
|
||||||
__func__);
|
if (entry) {
|
||||||
out_be32((u32 *)(rio_regs_win + RIO_LTLEDCSR),
|
pr_debug("RIO: %s - MC Exception handled\n",
|
||||||
0);
|
__func__);
|
||||||
regs->msr |= MSR_RI;
|
out_be32((u32 *)(rio_regs_win + RIO_LTLEDCSR),
|
||||||
regs->nip = entry->fixup;
|
0);
|
||||||
return 1;
|
regs->msr |= MSR_RI;
|
||||||
}
|
regs->nip = entry->fixup;
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/syscore_ops.h>
|
#include <linux/syscore_ops.h>
|
||||||
|
#include <linux/ratelimit.h>
|
||||||
|
|
||||||
#include <asm/ptrace.h>
|
#include <asm/ptrace.h>
|
||||||
#include <asm/signal.h>
|
#include <asm/signal.h>
|
||||||
@ -1648,9 +1649,8 @@ static unsigned int _mpic_get_one_irq(struct mpic *mpic, int reg)
|
|||||||
return NO_IRQ;
|
return NO_IRQ;
|
||||||
}
|
}
|
||||||
if (unlikely(mpic->protected && test_bit(src, mpic->protected))) {
|
if (unlikely(mpic->protected && test_bit(src, mpic->protected))) {
|
||||||
if (printk_ratelimit())
|
printk_ratelimited(KERN_WARNING "%s: Got protected source %d !\n",
|
||||||
printk(KERN_WARNING "%s: Got protected source %d !\n",
|
mpic->name, (int)src);
|
||||||
mpic->name, (int)src);
|
|
||||||
mpic_eoi(mpic);
|
mpic_eoi(mpic);
|
||||||
return NO_IRQ;
|
return NO_IRQ;
|
||||||
}
|
}
|
||||||
@ -1688,9 +1688,8 @@ unsigned int mpic_get_coreint_irq(void)
|
|||||||
return NO_IRQ;
|
return NO_IRQ;
|
||||||
}
|
}
|
||||||
if (unlikely(mpic->protected && test_bit(src, mpic->protected))) {
|
if (unlikely(mpic->protected && test_bit(src, mpic->protected))) {
|
||||||
if (printk_ratelimit())
|
printk_ratelimited(KERN_WARNING "%s: Got protected source %d !\n",
|
||||||
printk(KERN_WARNING "%s: Got protected source %d !\n",
|
mpic->name, (int)src);
|
||||||
mpic->name, (int)src);
|
|
||||||
return NO_IRQ;
|
return NO_IRQ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -579,6 +579,7 @@ config S390_GUEST
|
|||||||
def_bool y
|
def_bool y
|
||||||
prompt "s390 guest support for KVM (EXPERIMENTAL)"
|
prompt "s390 guest support for KVM (EXPERIMENTAL)"
|
||||||
depends on 64BIT && EXPERIMENTAL
|
depends on 64BIT && EXPERIMENTAL
|
||||||
|
select VIRTUALIZATION
|
||||||
select VIRTIO
|
select VIRTIO
|
||||||
select VIRTIO_RING
|
select VIRTIO_RING
|
||||||
select VIRTIO_CONSOLE
|
select VIRTIO_CONSOLE
|
||||||
|
@ -262,7 +262,7 @@ void smp_ctl_set_bit(int cr, int bit)
|
|||||||
|
|
||||||
memset(&parms.orvals, 0, sizeof(parms.orvals));
|
memset(&parms.orvals, 0, sizeof(parms.orvals));
|
||||||
memset(&parms.andvals, 0xff, sizeof(parms.andvals));
|
memset(&parms.andvals, 0xff, sizeof(parms.andvals));
|
||||||
parms.orvals[cr] = 1 << bit;
|
parms.orvals[cr] = 1UL << bit;
|
||||||
on_each_cpu(smp_ctl_bit_callback, &parms, 1);
|
on_each_cpu(smp_ctl_bit_callback, &parms, 1);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(smp_ctl_set_bit);
|
EXPORT_SYMBOL(smp_ctl_set_bit);
|
||||||
@ -276,7 +276,7 @@ void smp_ctl_clear_bit(int cr, int bit)
|
|||||||
|
|
||||||
memset(&parms.orvals, 0, sizeof(parms.orvals));
|
memset(&parms.orvals, 0, sizeof(parms.orvals));
|
||||||
memset(&parms.andvals, 0xff, sizeof(parms.andvals));
|
memset(&parms.andvals, 0xff, sizeof(parms.andvals));
|
||||||
parms.andvals[cr] = ~(1L << bit);
|
parms.andvals[cr] = ~(1UL << bit);
|
||||||
on_each_cpu(smp_ctl_bit_callback, &parms, 1);
|
on_each_cpu(smp_ctl_bit_callback, &parms, 1);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(smp_ctl_clear_bit);
|
EXPORT_SYMBOL(smp_ctl_clear_bit);
|
||||||
|
@ -25,7 +25,7 @@ extern void s390_backtrace(struct pt_regs * const regs, unsigned int depth);
|
|||||||
|
|
||||||
#include "hwsampler.h"
|
#include "hwsampler.h"
|
||||||
|
|
||||||
#define DEFAULT_INTERVAL 4096
|
#define DEFAULT_INTERVAL 4127518
|
||||||
|
|
||||||
#define DEFAULT_SDBT_BLOCKS 1
|
#define DEFAULT_SDBT_BLOCKS 1
|
||||||
#define DEFAULT_SDB_BLOCKS 511
|
#define DEFAULT_SDB_BLOCKS 511
|
||||||
@ -151,6 +151,12 @@ static int oprofile_hwsampler_init(struct oprofile_operations *ops)
|
|||||||
if (oprofile_max_interval == 0)
|
if (oprofile_max_interval == 0)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
|
/* The initial value should be sane */
|
||||||
|
if (oprofile_hw_interval < oprofile_min_interval)
|
||||||
|
oprofile_hw_interval = oprofile_min_interval;
|
||||||
|
if (oprofile_hw_interval > oprofile_max_interval)
|
||||||
|
oprofile_hw_interval = oprofile_max_interval;
|
||||||
|
|
||||||
if (oprofile_timer_init(ops))
|
if (oprofile_timer_init(ops))
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
|
@ -348,6 +348,7 @@ config CPU_SUBTYPE_SH7720
|
|||||||
select SYS_SUPPORTS_CMT
|
select SYS_SUPPORTS_CMT
|
||||||
select ARCH_WANT_OPTIONAL_GPIOLIB
|
select ARCH_WANT_OPTIONAL_GPIOLIB
|
||||||
select USB_ARCH_HAS_OHCI
|
select USB_ARCH_HAS_OHCI
|
||||||
|
select USB_OHCI_SH if USB_OHCI_HCD
|
||||||
help
|
help
|
||||||
Select SH7720 if you have a SH3-DSP SH7720 CPU.
|
Select SH7720 if you have a SH3-DSP SH7720 CPU.
|
||||||
|
|
||||||
@ -357,6 +358,7 @@ config CPU_SUBTYPE_SH7721
|
|||||||
select CPU_HAS_DSP
|
select CPU_HAS_DSP
|
||||||
select SYS_SUPPORTS_CMT
|
select SYS_SUPPORTS_CMT
|
||||||
select USB_ARCH_HAS_OHCI
|
select USB_ARCH_HAS_OHCI
|
||||||
|
select USB_OHCI_SH if USB_OHCI_HCD
|
||||||
help
|
help
|
||||||
Select SH7721 if you have a SH3-DSP SH7721 CPU.
|
Select SH7721 if you have a SH3-DSP SH7721 CPU.
|
||||||
|
|
||||||
@ -440,6 +442,7 @@ config CPU_SUBTYPE_SH7763
|
|||||||
bool "Support SH7763 processor"
|
bool "Support SH7763 processor"
|
||||||
select CPU_SH4A
|
select CPU_SH4A
|
||||||
select USB_ARCH_HAS_OHCI
|
select USB_ARCH_HAS_OHCI
|
||||||
|
select USB_OHCI_SH if USB_OHCI_HCD
|
||||||
help
|
help
|
||||||
Select SH7763 if you have a SH4A SH7763(R5S77631) CPU.
|
Select SH7763 if you have a SH4A SH7763(R5S77631) CPU.
|
||||||
|
|
||||||
@ -467,7 +470,9 @@ config CPU_SUBTYPE_SH7786
|
|||||||
select GENERIC_CLOCKEVENTS_BROADCAST if SMP
|
select GENERIC_CLOCKEVENTS_BROADCAST if SMP
|
||||||
select ARCH_WANT_OPTIONAL_GPIOLIB
|
select ARCH_WANT_OPTIONAL_GPIOLIB
|
||||||
select USB_ARCH_HAS_OHCI
|
select USB_ARCH_HAS_OHCI
|
||||||
|
select USB_OHCI_SH if USB_OHCI_HCD
|
||||||
select USB_ARCH_HAS_EHCI
|
select USB_ARCH_HAS_EHCI
|
||||||
|
select USB_EHCI_SH if USB_EHCI_HCD
|
||||||
|
|
||||||
config CPU_SUBTYPE_SHX3
|
config CPU_SUBTYPE_SHX3
|
||||||
bool "Support SH-X3 processor"
|
bool "Support SH-X3 processor"
|
||||||
|
@ -9,7 +9,6 @@ CONFIG_TASK_XACCT=y
|
|||||||
CONFIG_TASK_IO_ACCOUNTING=y
|
CONFIG_TASK_IO_ACCOUNTING=y
|
||||||
CONFIG_LOG_BUF_SHIFT=14
|
CONFIG_LOG_BUF_SHIFT=14
|
||||||
CONFIG_BLK_DEV_INITRD=y
|
CONFIG_BLK_DEV_INITRD=y
|
||||||
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
|
||||||
# CONFIG_SYSCTL_SYSCALL is not set
|
# CONFIG_SYSCTL_SYSCALL is not set
|
||||||
CONFIG_KALLSYMS_ALL=y
|
CONFIG_KALLSYMS_ALL=y
|
||||||
CONFIG_SLAB=y
|
CONFIG_SLAB=y
|
||||||
@ -39,8 +38,6 @@ CONFIG_IPV6=y
|
|||||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||||
# CONFIG_FW_LOADER is not set
|
# CONFIG_FW_LOADER is not set
|
||||||
CONFIG_MTD=y
|
CONFIG_MTD=y
|
||||||
CONFIG_MTD_CONCAT=y
|
|
||||||
CONFIG_MTD_PARTITIONS=y
|
|
||||||
CONFIG_MTD_CHAR=y
|
CONFIG_MTD_CHAR=y
|
||||||
CONFIG_MTD_BLOCK=y
|
CONFIG_MTD_BLOCK=y
|
||||||
CONFIG_MTD_M25P80=y
|
CONFIG_MTD_M25P80=y
|
||||||
@ -56,18 +53,19 @@ CONFIG_SH_ETH=y
|
|||||||
# CONFIG_KEYBOARD_ATKBD is not set
|
# CONFIG_KEYBOARD_ATKBD is not set
|
||||||
# CONFIG_MOUSE_PS2 is not set
|
# CONFIG_MOUSE_PS2 is not set
|
||||||
# CONFIG_SERIO is not set
|
# CONFIG_SERIO is not set
|
||||||
|
# CONFIG_LEGACY_PTYS is not set
|
||||||
CONFIG_SERIAL_SH_SCI=y
|
CONFIG_SERIAL_SH_SCI=y
|
||||||
CONFIG_SERIAL_SH_SCI_NR_UARTS=3
|
CONFIG_SERIAL_SH_SCI_NR_UARTS=3
|
||||||
CONFIG_SERIAL_SH_SCI_CONSOLE=y
|
CONFIG_SERIAL_SH_SCI_CONSOLE=y
|
||||||
# CONFIG_LEGACY_PTYS is not set
|
|
||||||
# CONFIG_HW_RANDOM is not set
|
# CONFIG_HW_RANDOM is not set
|
||||||
CONFIG_SPI=y
|
CONFIG_SPI=y
|
||||||
CONFIG_SPI_SH=y
|
CONFIG_SPI_SH=y
|
||||||
# CONFIG_HWMON is not set
|
# CONFIG_HWMON is not set
|
||||||
CONFIG_MFD_SH_MOBILE_SDHI=y
|
|
||||||
CONFIG_USB=y
|
CONFIG_USB=y
|
||||||
CONFIG_USB_EHCI_HCD=y
|
CONFIG_USB_EHCI_HCD=y
|
||||||
|
CONFIG_USB_EHCI_SH=y
|
||||||
CONFIG_USB_OHCI_HCD=y
|
CONFIG_USB_OHCI_HCD=y
|
||||||
|
CONFIG_USB_OHCI_SH=y
|
||||||
CONFIG_USB_STORAGE=y
|
CONFIG_USB_STORAGE=y
|
||||||
CONFIG_MMC=y
|
CONFIG_MMC=y
|
||||||
CONFIG_MMC_SDHI=y
|
CONFIG_MMC_SDHI=y
|
||||||
|
@ -9,10 +9,6 @@
|
|||||||
extern struct pglist_data *node_data[];
|
extern struct pglist_data *node_data[];
|
||||||
#define NODE_DATA(nid) (node_data[nid])
|
#define NODE_DATA(nid) (node_data[nid])
|
||||||
|
|
||||||
#define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
|
|
||||||
#define node_end_pfn(nid) (NODE_DATA(nid)->node_start_pfn + \
|
|
||||||
NODE_DATA(nid)->node_spanned_pages)
|
|
||||||
|
|
||||||
static inline int pfn_to_nid(unsigned long pfn)
|
static inline int pfn_to_nid(unsigned long pfn)
|
||||||
{
|
{
|
||||||
int nid;
|
int nid;
|
||||||
|
@ -183,7 +183,7 @@ static const struct sh_dmae_slave_config sh7757_dmae1_slaves[] = {
|
|||||||
{
|
{
|
||||||
.slave_id = SHDMA_SLAVE_SCIF2_RX,
|
.slave_id = SHDMA_SLAVE_SCIF2_RX,
|
||||||
.addr = 0x1f4b0014,
|
.addr = 0x1f4b0014,
|
||||||
.chcr = SM_INC | 0x800 | 0x40000000 |
|
.chcr = DM_INC | 0x800 | 0x40000000 |
|
||||||
TS_INDEX2VAL(XMIT_SZ_8BIT),
|
TS_INDEX2VAL(XMIT_SZ_8BIT),
|
||||||
.mid_rid = 0x22,
|
.mid_rid = 0x22,
|
||||||
},
|
},
|
||||||
@ -197,7 +197,7 @@ static const struct sh_dmae_slave_config sh7757_dmae1_slaves[] = {
|
|||||||
{
|
{
|
||||||
.slave_id = SHDMA_SLAVE_SCIF3_RX,
|
.slave_id = SHDMA_SLAVE_SCIF3_RX,
|
||||||
.addr = 0x1f4c0014,
|
.addr = 0x1f4c0014,
|
||||||
.chcr = SM_INC | 0x800 | 0x40000000 |
|
.chcr = DM_INC | 0x800 | 0x40000000 |
|
||||||
TS_INDEX2VAL(XMIT_SZ_8BIT),
|
TS_INDEX2VAL(XMIT_SZ_8BIT),
|
||||||
.mid_rid = 0x2a,
|
.mid_rid = 0x2a,
|
||||||
},
|
},
|
||||||
@ -211,7 +211,7 @@ static const struct sh_dmae_slave_config sh7757_dmae1_slaves[] = {
|
|||||||
{
|
{
|
||||||
.slave_id = SHDMA_SLAVE_SCIF4_RX,
|
.slave_id = SHDMA_SLAVE_SCIF4_RX,
|
||||||
.addr = 0x1f4d0014,
|
.addr = 0x1f4d0014,
|
||||||
.chcr = SM_INC | 0x800 | 0x40000000 |
|
.chcr = DM_INC | 0x800 | 0x40000000 |
|
||||||
TS_INDEX2VAL(XMIT_SZ_8BIT),
|
TS_INDEX2VAL(XMIT_SZ_8BIT),
|
||||||
.mid_rid = 0x42,
|
.mid_rid = 0x42,
|
||||||
},
|
},
|
||||||
@ -228,7 +228,7 @@ static const struct sh_dmae_slave_config sh7757_dmae2_slaves[] = {
|
|||||||
{
|
{
|
||||||
.slave_id = SHDMA_SLAVE_RIIC0_RX,
|
.slave_id = SHDMA_SLAVE_RIIC0_RX,
|
||||||
.addr = 0x1e500013,
|
.addr = 0x1e500013,
|
||||||
.chcr = SM_INC | 0x800 | 0x40000000 |
|
.chcr = DM_INC | 0x800 | 0x40000000 |
|
||||||
TS_INDEX2VAL(XMIT_SZ_8BIT),
|
TS_INDEX2VAL(XMIT_SZ_8BIT),
|
||||||
.mid_rid = 0x22,
|
.mid_rid = 0x22,
|
||||||
},
|
},
|
||||||
@ -242,7 +242,7 @@ static const struct sh_dmae_slave_config sh7757_dmae2_slaves[] = {
|
|||||||
{
|
{
|
||||||
.slave_id = SHDMA_SLAVE_RIIC1_RX,
|
.slave_id = SHDMA_SLAVE_RIIC1_RX,
|
||||||
.addr = 0x1e510013,
|
.addr = 0x1e510013,
|
||||||
.chcr = SM_INC | 0x800 | 0x40000000 |
|
.chcr = DM_INC | 0x800 | 0x40000000 |
|
||||||
TS_INDEX2VAL(XMIT_SZ_8BIT),
|
TS_INDEX2VAL(XMIT_SZ_8BIT),
|
||||||
.mid_rid = 0x2a,
|
.mid_rid = 0x2a,
|
||||||
},
|
},
|
||||||
@ -256,7 +256,7 @@ static const struct sh_dmae_slave_config sh7757_dmae2_slaves[] = {
|
|||||||
{
|
{
|
||||||
.slave_id = SHDMA_SLAVE_RIIC2_RX,
|
.slave_id = SHDMA_SLAVE_RIIC2_RX,
|
||||||
.addr = 0x1e520013,
|
.addr = 0x1e520013,
|
||||||
.chcr = SM_INC | 0x800 | 0x40000000 |
|
.chcr = DM_INC | 0x800 | 0x40000000 |
|
||||||
TS_INDEX2VAL(XMIT_SZ_8BIT),
|
TS_INDEX2VAL(XMIT_SZ_8BIT),
|
||||||
.mid_rid = 0xa2,
|
.mid_rid = 0xa2,
|
||||||
},
|
},
|
||||||
@ -265,12 +265,12 @@ static const struct sh_dmae_slave_config sh7757_dmae2_slaves[] = {
|
|||||||
.addr = 0x1e530012,
|
.addr = 0x1e530012,
|
||||||
.chcr = SM_INC | 0x800 | 0x40000000 |
|
.chcr = SM_INC | 0x800 | 0x40000000 |
|
||||||
TS_INDEX2VAL(XMIT_SZ_8BIT),
|
TS_INDEX2VAL(XMIT_SZ_8BIT),
|
||||||
.mid_rid = 0xab,
|
.mid_rid = 0xa9,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.slave_id = SHDMA_SLAVE_RIIC3_RX,
|
.slave_id = SHDMA_SLAVE_RIIC3_RX,
|
||||||
.addr = 0x1e530013,
|
.addr = 0x1e530013,
|
||||||
.chcr = SM_INC | 0x800 | 0x40000000 |
|
.chcr = DM_INC | 0x800 | 0x40000000 |
|
||||||
TS_INDEX2VAL(XMIT_SZ_8BIT),
|
TS_INDEX2VAL(XMIT_SZ_8BIT),
|
||||||
.mid_rid = 0xaf,
|
.mid_rid = 0xaf,
|
||||||
},
|
},
|
||||||
@ -279,14 +279,14 @@ static const struct sh_dmae_slave_config sh7757_dmae2_slaves[] = {
|
|||||||
.addr = 0x1e540012,
|
.addr = 0x1e540012,
|
||||||
.chcr = SM_INC | 0x800 | 0x40000000 |
|
.chcr = SM_INC | 0x800 | 0x40000000 |
|
||||||
TS_INDEX2VAL(XMIT_SZ_8BIT),
|
TS_INDEX2VAL(XMIT_SZ_8BIT),
|
||||||
.mid_rid = 0xc1,
|
.mid_rid = 0xc5,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.slave_id = SHDMA_SLAVE_RIIC4_RX,
|
.slave_id = SHDMA_SLAVE_RIIC4_RX,
|
||||||
.addr = 0x1e540013,
|
.addr = 0x1e540013,
|
||||||
.chcr = SM_INC | 0x800 | 0x40000000 |
|
.chcr = DM_INC | 0x800 | 0x40000000 |
|
||||||
TS_INDEX2VAL(XMIT_SZ_8BIT),
|
TS_INDEX2VAL(XMIT_SZ_8BIT),
|
||||||
.mid_rid = 0xc2,
|
.mid_rid = 0xc6,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -301,7 +301,7 @@ static const struct sh_dmae_slave_config sh7757_dmae3_slaves[] = {
|
|||||||
{
|
{
|
||||||
.slave_id = SHDMA_SLAVE_RIIC5_RX,
|
.slave_id = SHDMA_SLAVE_RIIC5_RX,
|
||||||
.addr = 0x1e550013,
|
.addr = 0x1e550013,
|
||||||
.chcr = SM_INC | 0x800 | 0x40000000 |
|
.chcr = DM_INC | 0x800 | 0x40000000 |
|
||||||
TS_INDEX2VAL(XMIT_SZ_8BIT),
|
TS_INDEX2VAL(XMIT_SZ_8BIT),
|
||||||
.mid_rid = 0x22,
|
.mid_rid = 0x22,
|
||||||
},
|
},
|
||||||
@ -315,7 +315,7 @@ static const struct sh_dmae_slave_config sh7757_dmae3_slaves[] = {
|
|||||||
{
|
{
|
||||||
.slave_id = SHDMA_SLAVE_RIIC6_RX,
|
.slave_id = SHDMA_SLAVE_RIIC6_RX,
|
||||||
.addr = 0x1e560013,
|
.addr = 0x1e560013,
|
||||||
.chcr = SM_INC | 0x800 | 0x40000000 |
|
.chcr = DM_INC | 0x800 | 0x40000000 |
|
||||||
TS_INDEX2VAL(XMIT_SZ_8BIT),
|
TS_INDEX2VAL(XMIT_SZ_8BIT),
|
||||||
.mid_rid = 0x2a,
|
.mid_rid = 0x2a,
|
||||||
},
|
},
|
||||||
@ -329,7 +329,7 @@ static const struct sh_dmae_slave_config sh7757_dmae3_slaves[] = {
|
|||||||
{
|
{
|
||||||
.slave_id = SHDMA_SLAVE_RIIC7_RX,
|
.slave_id = SHDMA_SLAVE_RIIC7_RX,
|
||||||
.addr = 0x1e570013,
|
.addr = 0x1e570013,
|
||||||
.chcr = SM_INC | 0x800 | 0x40000000 |
|
.chcr = DM_INC | 0x800 | 0x40000000 |
|
||||||
TS_INDEX2VAL(XMIT_SZ_8BIT),
|
TS_INDEX2VAL(XMIT_SZ_8BIT),
|
||||||
.mid_rid = 0x42,
|
.mid_rid = 0x42,
|
||||||
},
|
},
|
||||||
@ -343,7 +343,7 @@ static const struct sh_dmae_slave_config sh7757_dmae3_slaves[] = {
|
|||||||
{
|
{
|
||||||
.slave_id = SHDMA_SLAVE_RIIC8_RX,
|
.slave_id = SHDMA_SLAVE_RIIC8_RX,
|
||||||
.addr = 0x1e580013,
|
.addr = 0x1e580013,
|
||||||
.chcr = SM_INC | 0x800 | 0x40000000 |
|
.chcr = DM_INC | 0x800 | 0x40000000 |
|
||||||
TS_INDEX2VAL(XMIT_SZ_8BIT),
|
TS_INDEX2VAL(XMIT_SZ_8BIT),
|
||||||
.mid_rid = 0x46,
|
.mid_rid = 0x46,
|
||||||
},
|
},
|
||||||
@ -357,7 +357,7 @@ static const struct sh_dmae_slave_config sh7757_dmae3_slaves[] = {
|
|||||||
{
|
{
|
||||||
.slave_id = SHDMA_SLAVE_RIIC9_RX,
|
.slave_id = SHDMA_SLAVE_RIIC9_RX,
|
||||||
.addr = 0x1e590013,
|
.addr = 0x1e590013,
|
||||||
.chcr = SM_INC | 0x800 | 0x40000000 |
|
.chcr = DM_INC | 0x800 | 0x40000000 |
|
||||||
TS_INDEX2VAL(XMIT_SZ_8BIT),
|
TS_INDEX2VAL(XMIT_SZ_8BIT),
|
||||||
.mid_rid = 0x52,
|
.mid_rid = 0x52,
|
||||||
},
|
},
|
||||||
@ -659,6 +659,54 @@ static struct platform_device spi0_device = {
|
|||||||
.resource = spi0_resources,
|
.resource = spi0_resources,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct resource usb_ehci_resources[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = 0xfe4f1000,
|
||||||
|
.end = 0xfe4f10ff,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.start = 57,
|
||||||
|
.end = 57,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device usb_ehci_device = {
|
||||||
|
.name = "sh_ehci",
|
||||||
|
.id = -1,
|
||||||
|
.dev = {
|
||||||
|
.dma_mask = &usb_ehci_device.dev.coherent_dma_mask,
|
||||||
|
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||||
|
},
|
||||||
|
.num_resources = ARRAY_SIZE(usb_ehci_resources),
|
||||||
|
.resource = usb_ehci_resources,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct resource usb_ohci_resources[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = 0xfe4f1800,
|
||||||
|
.end = 0xfe4f18ff,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.start = 57,
|
||||||
|
.end = 57,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device usb_ohci_device = {
|
||||||
|
.name = "sh_ohci",
|
||||||
|
.id = -1,
|
||||||
|
.dev = {
|
||||||
|
.dma_mask = &usb_ohci_device.dev.coherent_dma_mask,
|
||||||
|
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||||
|
},
|
||||||
|
.num_resources = ARRAY_SIZE(usb_ohci_resources),
|
||||||
|
.resource = usb_ohci_resources,
|
||||||
|
};
|
||||||
|
|
||||||
static struct platform_device *sh7757_devices[] __initdata = {
|
static struct platform_device *sh7757_devices[] __initdata = {
|
||||||
&scif2_device,
|
&scif2_device,
|
||||||
&scif3_device,
|
&scif3_device,
|
||||||
@ -670,6 +718,8 @@ static struct platform_device *sh7757_devices[] __initdata = {
|
|||||||
&dma2_device,
|
&dma2_device,
|
||||||
&dma3_device,
|
&dma3_device,
|
||||||
&spi0_device,
|
&spi0_device,
|
||||||
|
&usb_ehci_device,
|
||||||
|
&usb_ohci_device,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init sh7757_devices_setup(void)
|
static int __init sh7757_devices_setup(void)
|
||||||
@ -1039,13 +1089,13 @@ static DECLARE_INTC_DESC(intc_desc, "sh7757", vectors, groups,
|
|||||||
|
|
||||||
/* Support for external interrupt pins in IRQ mode */
|
/* Support for external interrupt pins in IRQ mode */
|
||||||
static struct intc_vect vectors_irq0123[] __initdata = {
|
static struct intc_vect vectors_irq0123[] __initdata = {
|
||||||
INTC_VECT(IRQ0, 0x240), INTC_VECT(IRQ1, 0x280),
|
INTC_VECT(IRQ0, 0x200), INTC_VECT(IRQ1, 0x240),
|
||||||
INTC_VECT(IRQ2, 0x2c0), INTC_VECT(IRQ3, 0x300),
|
INTC_VECT(IRQ2, 0x280), INTC_VECT(IRQ3, 0x2c0),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct intc_vect vectors_irq4567[] __initdata = {
|
static struct intc_vect vectors_irq4567[] __initdata = {
|
||||||
INTC_VECT(IRQ4, 0x340), INTC_VECT(IRQ5, 0x380),
|
INTC_VECT(IRQ4, 0x300), INTC_VECT(IRQ5, 0x340),
|
||||||
INTC_VECT(IRQ6, 0x3c0), INTC_VECT(IRQ7, 0x200),
|
INTC_VECT(IRQ6, 0x380), INTC_VECT(IRQ7, 0x3c0),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct intc_sense_reg sense_registers[] __initdata = {
|
static struct intc_sense_reg sense_registers[] __initdata = {
|
||||||
@ -1079,14 +1129,14 @@ static struct intc_vect vectors_irl0123[] __initdata = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static struct intc_vect vectors_irl4567[] __initdata = {
|
static struct intc_vect vectors_irl4567[] __initdata = {
|
||||||
INTC_VECT(IRL4_LLLL, 0xb00), INTC_VECT(IRL4_LLLH, 0xb20),
|
INTC_VECT(IRL4_LLLL, 0x200), INTC_VECT(IRL4_LLLH, 0x220),
|
||||||
INTC_VECT(IRL4_LLHL, 0xb40), INTC_VECT(IRL4_LLHH, 0xb60),
|
INTC_VECT(IRL4_LLHL, 0x240), INTC_VECT(IRL4_LLHH, 0x260),
|
||||||
INTC_VECT(IRL4_LHLL, 0xb80), INTC_VECT(IRL4_LHLH, 0xba0),
|
INTC_VECT(IRL4_LHLL, 0x280), INTC_VECT(IRL4_LHLH, 0x2a0),
|
||||||
INTC_VECT(IRL4_LHHL, 0xbc0), INTC_VECT(IRL4_LHHH, 0xbe0),
|
INTC_VECT(IRL4_LHHL, 0x2c0), INTC_VECT(IRL4_LHHH, 0x2e0),
|
||||||
INTC_VECT(IRL4_HLLL, 0xc00), INTC_VECT(IRL4_HLLH, 0xc20),
|
INTC_VECT(IRL4_HLLL, 0x300), INTC_VECT(IRL4_HLLH, 0x320),
|
||||||
INTC_VECT(IRL4_HLHL, 0xc40), INTC_VECT(IRL4_HLHH, 0xc60),
|
INTC_VECT(IRL4_HLHL, 0x340), INTC_VECT(IRL4_HLHH, 0x360),
|
||||||
INTC_VECT(IRL4_HHLL, 0xc80), INTC_VECT(IRL4_HHLH, 0xca0),
|
INTC_VECT(IRL4_HHLL, 0x380), INTC_VECT(IRL4_HHLH, 0x3a0),
|
||||||
INTC_VECT(IRL4_HHHL, 0xcc0),
|
INTC_VECT(IRL4_HHHL, 0x3c0),
|
||||||
};
|
};
|
||||||
|
|
||||||
static DECLARE_INTC_DESC(intc_desc_irl0123, "sh7757-irl0123", vectors_irl0123,
|
static DECLARE_INTC_DESC(intc_desc_irl0123, "sh7757-irl0123", vectors_irl0123,
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
#include <linux/seq_file.h>
|
#include <linux/seq_file.h>
|
||||||
#include <linux/ftrace.h>
|
#include <linux/ftrace.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
|
#include <linux/ratelimit.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/machvec.h>
|
#include <asm/machvec.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
@ -268,9 +269,8 @@ void migrate_irqs(void)
|
|||||||
unsigned int newcpu = cpumask_any_and(data->affinity,
|
unsigned int newcpu = cpumask_any_and(data->affinity,
|
||||||
cpu_online_mask);
|
cpu_online_mask);
|
||||||
if (newcpu >= nr_cpu_ids) {
|
if (newcpu >= nr_cpu_ids) {
|
||||||
if (printk_ratelimit())
|
pr_info_ratelimited("IRQ%u no longer affine to CPU%u\n",
|
||||||
printk(KERN_INFO "IRQ%u no longer affine to CPU%u\n",
|
irq, cpu);
|
||||||
irq, cpu);
|
|
||||||
|
|
||||||
cpumask_setall(data->affinity);
|
cpumask_setall(data->affinity);
|
||||||
newcpu = cpumask_any_and(data->affinity,
|
newcpu = cpumask_any_and(data->affinity,
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
#include <linux/seq_file.h>
|
#include <linux/seq_file.h>
|
||||||
#include <linux/proc_fs.h>
|
#include <linux/proc_fs.h>
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
|
#include <linux/ratelimit.h>
|
||||||
#include <asm/alignment.h>
|
#include <asm/alignment.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
|
|
||||||
@ -95,13 +96,13 @@ int set_unalign_ctl(struct task_struct *tsk, unsigned int val)
|
|||||||
void unaligned_fixups_notify(struct task_struct *tsk, insn_size_t insn,
|
void unaligned_fixups_notify(struct task_struct *tsk, insn_size_t insn,
|
||||||
struct pt_regs *regs)
|
struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
if (user_mode(regs) && (se_usermode & UM_WARN) && printk_ratelimit())
|
if (user_mode(regs) && (se_usermode & UM_WARN))
|
||||||
pr_notice("Fixing up unaligned userspace access "
|
pr_notice_ratelimited("Fixing up unaligned userspace access "
|
||||||
"in \"%s\" pid=%d pc=0x%p ins=0x%04hx\n",
|
"in \"%s\" pid=%d pc=0x%p ins=0x%04hx\n",
|
||||||
tsk->comm, task_pid_nr(tsk),
|
tsk->comm, task_pid_nr(tsk),
|
||||||
(void *)instruction_pointer(regs), insn);
|
(void *)instruction_pointer(regs), insn);
|
||||||
else if (se_kernmode_warn && printk_ratelimit())
|
else if (se_kernmode_warn)
|
||||||
pr_notice("Fixing up unaligned kernel access "
|
pr_notice_ratelimited("Fixing up unaligned kernel access "
|
||||||
"in \"%s\" pid=%d pc=0x%p ins=0x%04hx\n",
|
"in \"%s\" pid=%d pc=0x%p ins=0x%04hx\n",
|
||||||
tsk->comm, task_pid_nr(tsk),
|
tsk->comm, task_pid_nr(tsk),
|
||||||
(void *)instruction_pointer(regs), insn);
|
(void *)instruction_pointer(regs), insn);
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user