Merge commit 'v3.2-rc4' into core/locking
Merge reason: Pick up post-rc1 fixes. Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
commit
7119a341f3
709 changed files with 7338 additions and 5166 deletions
|
@ -206,16 +206,3 @@ Description:
|
|||
when a discarded area is read the discard_zeroes_data
|
||||
parameter will be set to one. Otherwise it will be 0 and
|
||||
the result of reading a discarded area is undefined.
|
||||
What: /sys/block/<disk>/alias
|
||||
Date: Aug 2011
|
||||
Contact: Nao Nishijima <nao.nishijima.xt@hitachi.com>
|
||||
Description:
|
||||
A raw device name of a disk does not always point a same disk
|
||||
each boot-up time. Therefore, users have to use persistent
|
||||
device names, which udev creates when the kernel finds a disk,
|
||||
instead of raw device name. However, kernel doesn't show those
|
||||
persistent names on its messages (e.g. dmesg).
|
||||
This file can store an alias of the disk and it would be
|
||||
appeared in kernel messages if it is set. A disk can have an
|
||||
alias which length is up to 255bytes. Users can use alphabets,
|
||||
numbers, "-" and "_" in alias name. This file is writeonce.
|
||||
|
|
|
@ -520,6 +520,11 @@ Here's a description of the fields of <varname>struct uio_mem</varname>:
|
|||
</para>
|
||||
|
||||
<itemizedlist>
|
||||
<listitem><para>
|
||||
<varname>const char *name</varname>: Optional. Set this to help identify
|
||||
the memory region, it will show up in the corresponding sysfs node.
|
||||
</para></listitem>
|
||||
|
||||
<listitem><para>
|
||||
<varname>int memtype</varname>: Required if the mapping is used. Set this to
|
||||
<varname>UIO_MEM_PHYS</varname> if you you have physical memory on your
|
||||
|
@ -553,7 +558,7 @@ instead to remember such an address.
|
|||
</itemizedlist>
|
||||
|
||||
<para>
|
||||
Please do not touch the <varname>kobj</varname> element of
|
||||
Please do not touch the <varname>map</varname> element of
|
||||
<varname>struct uio_mem</varname>! It is used by the UIO framework
|
||||
to set up sysfs files for this mapping. Simply leave it alone.
|
||||
</para>
|
||||
|
|
|
@ -98,14 +98,12 @@ You must enable "SCSI tape drive support for Smart Array 5xxx" and
|
|||
"SCSI support" in your kernel configuration to be able to use SCSI
|
||||
tape drives with your Smart Array 5xxx controller.
|
||||
|
||||
Additionally, note that the driver will not engage the SCSI core at init
|
||||
time. The driver must be directed to dynamically engage the SCSI core via
|
||||
the /proc filesystem entry which the "block" side of the driver creates as
|
||||
/proc/driver/cciss/cciss* at runtime. This is because at driver init time,
|
||||
the SCSI core may not yet be initialized (because the driver is a block
|
||||
driver) and attempting to register it with the SCSI core in such a case
|
||||
would cause a hang. This is best done via an initialization script
|
||||
(typically in /etc/init.d, but could vary depending on distribution).
|
||||
Additionally, note that the driver will engage the SCSI core at init
|
||||
time if any tape drives or medium changers are detected. The driver may
|
||||
also be directed to dynamically engage the SCSI core via the /proc filesystem
|
||||
entry which the "block" side of the driver creates as
|
||||
/proc/driver/cciss/cciss* at runtime. This is best done via a script.
|
||||
|
||||
For example:
|
||||
|
||||
for x in /proc/driver/cciss/cciss[0-9]*
|
||||
|
|
|
@ -33,6 +33,7 @@ qcom Qualcomm, Inc.
|
|||
ramtron Ramtron International
|
||||
samsung Samsung Semiconductor
|
||||
schindler Schindler
|
||||
sil Silicon Image
|
||||
simtek
|
||||
sirf SiRF Technology, Inc.
|
||||
stericsson ST-Ericsson
|
||||
|
|
|
@ -63,8 +63,8 @@ IRC network.
|
|||
Userspace tools for creating and manipulating Btrfs file systems are
|
||||
available from the git repository at the following location:
|
||||
|
||||
http://git.kernel.org/?p=linux/kernel/git/mason/btrfs-progs-unstable.git
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-progs-unstable.git
|
||||
http://git.kernel.org/?p=linux/kernel/git/mason/btrfs-progs.git
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-progs.git
|
||||
|
||||
These include the following tools:
|
||||
|
||||
|
|
|
@ -1,22 +1,24 @@
|
|||
The I2C protocol knows about two kinds of device addresses: normal 7 bit
|
||||
addresses, and an extended set of 10 bit addresses. The sets of addresses
|
||||
do not intersect: the 7 bit address 0x10 is not the same as the 10 bit
|
||||
address 0x10 (though a single device could respond to both of them). You
|
||||
select a 10 bit address by adding an extra byte after the address
|
||||
byte:
|
||||
S Addr7 Rd/Wr ....
|
||||
becomes
|
||||
S 11110 Addr10 Rd/Wr
|
||||
S is the start bit, Rd/Wr the read/write bit, and if you count the number
|
||||
of bits, you will see the there are 8 after the S bit for 7 bit addresses,
|
||||
and 16 after the S bit for 10 bit addresses.
|
||||
address 0x10 (though a single device could respond to both of them).
|
||||
|
||||
WARNING! The current 10 bit address support is EXPERIMENTAL. There are
|
||||
several places in the code that will cause SEVERE PROBLEMS with 10 bit
|
||||
addresses, even though there is some basic handling and hooks. Also,
|
||||
almost no supported adapter handles the 10 bit addresses correctly.
|
||||
I2C messages to and from 10-bit address devices have a different format.
|
||||
See the I2C specification for the details.
|
||||
|
||||
As soon as a real 10 bit address device is spotted 'in the wild', we
|
||||
can and will add proper support. Right now, 10 bit address devices
|
||||
are defined by the I2C protocol, but we have never seen a single device
|
||||
which supports them.
|
||||
The current 10 bit address support is minimal. It should work, however
|
||||
you can expect some problems along the way:
|
||||
* Not all bus drivers support 10-bit addresses. Some don't because the
|
||||
hardware doesn't support them (SMBus doesn't require 10-bit address
|
||||
support for example), some don't because nobody bothered adding the
|
||||
code (or it's there but not working properly.) Software implementation
|
||||
(i2c-algo-bit) is known to work.
|
||||
* Some optional features do not support 10-bit addresses. This is the
|
||||
case of automatic detection and instantiation of devices by their,
|
||||
drivers, for example.
|
||||
* Many user-space packages (for example i2c-tools) lack support for
|
||||
10-bit addresses.
|
||||
|
||||
Note that 10-bit address devices are still pretty rare, so the limitations
|
||||
listed above could stay for a long time, maybe even forever if nobody
|
||||
needs them to be fixed.
|
||||
|
|
|
@ -20,7 +20,7 @@ ip_no_pmtu_disc - BOOLEAN
|
|||
default FALSE
|
||||
|
||||
min_pmtu - INTEGER
|
||||
default 562 - minimum discovered Path MTU
|
||||
default 552 - minimum discovered Path MTU
|
||||
|
||||
route/max_size - INTEGER
|
||||
Maximum number of routes allowed in the kernel. Increase
|
||||
|
|
|
@ -123,9 +123,10 @@ please refer directly to the source code for more information about it.
|
|||
Subsystem-Level Methods
|
||||
-----------------------
|
||||
The core methods to suspend and resume devices reside in struct dev_pm_ops
|
||||
pointed to by the pm member of struct bus_type, struct device_type and
|
||||
struct class. They are mostly of interest to the people writing infrastructure
|
||||
for buses, like PCI or USB, or device type and device class drivers.
|
||||
pointed to by the ops member of struct dev_pm_domain, or by the pm member of
|
||||
struct bus_type, struct device_type and struct class. They are mostly of
|
||||
interest to the people writing infrastructure for platforms and buses, like PCI
|
||||
or USB, or device type and device class drivers.
|
||||
|
||||
Bus drivers implement these methods as appropriate for the hardware and the
|
||||
drivers using it; PCI works differently from USB, and so on. Not many people
|
||||
|
@ -139,41 +140,57 @@ sequencing in the driver model tree.
|
|||
|
||||
/sys/devices/.../power/wakeup files
|
||||
-----------------------------------
|
||||
All devices in the driver model have two flags to control handling of wakeup
|
||||
events (hardware signals that can force the device and/or system out of a low
|
||||
power state). These flags are initialized by bus or device driver code using
|
||||
All device objects in the driver model contain fields that control the handling
|
||||
of system wakeup events (hardware signals that can force the system out of a
|
||||
sleep state). These fields are initialized by bus or device driver code using
|
||||
device_set_wakeup_capable() and device_set_wakeup_enable(), defined in
|
||||
include/linux/pm_wakeup.h.
|
||||
|
||||
The "can_wakeup" flag just records whether the device (and its driver) can
|
||||
The "power.can_wakeup" flag just records whether the device (and its driver) can
|
||||
physically support wakeup events. The device_set_wakeup_capable() routine
|
||||
affects this flag. The "should_wakeup" flag controls whether the device should
|
||||
try to use its wakeup mechanism. device_set_wakeup_enable() affects this flag;
|
||||
for the most part drivers should not change its value. The initial value of
|
||||
should_wakeup is supposed to be false for the majority of devices; the major
|
||||
exceptions are power buttons, keyboards, and Ethernet adapters whose WoL
|
||||
(wake-on-LAN) feature has been set up with ethtool. It should also default
|
||||
to true for devices that don't generate wakeup requests on their own but merely
|
||||
forward wakeup requests from one bus to another (like PCI bridges).
|
||||
affects this flag. The "power.wakeup" field is a pointer to an object of type
|
||||
struct wakeup_source used for controlling whether or not the device should use
|
||||
its system wakeup mechanism and for notifying the PM core of system wakeup
|
||||
events signaled by the device. This object is only present for wakeup-capable
|
||||
devices (i.e. devices whose "can_wakeup" flags are set) and is created (or
|
||||
removed) by device_set_wakeup_capable().
|
||||
|
||||
Whether or not a device is capable of issuing wakeup events is a hardware
|
||||
matter, and the kernel is responsible for keeping track of it. By contrast,
|
||||
whether or not a wakeup-capable device should issue wakeup events is a policy
|
||||
decision, and it is managed by user space through a sysfs attribute: the
|
||||
power/wakeup file. User space can write the strings "enabled" or "disabled" to
|
||||
set or clear the "should_wakeup" flag, respectively. This file is only present
|
||||
for wakeup-capable devices (i.e. devices whose "can_wakeup" flags are set)
|
||||
and is created (or removed) by device_set_wakeup_capable(). Reads from the
|
||||
file will return the corresponding string.
|
||||
"power/wakeup" file. User space can write the strings "enabled" or "disabled"
|
||||
to it to indicate whether or not, respectively, the device is supposed to signal
|
||||
system wakeup. This file is only present if the "power.wakeup" object exists
|
||||
for the given device and is created (or removed) along with that object, by
|
||||
device_set_wakeup_capable(). Reads from the file will return the corresponding
|
||||
string.
|
||||
|
||||
The device_may_wakeup() routine returns true only if both flags are set.
|
||||
The "power/wakeup" file is supposed to contain the "disabled" string initially
|
||||
for the majority of devices; the major exceptions are power buttons, keyboards,
|
||||
and Ethernet adapters whose WoL (wake-on-LAN) feature has been set up with
|
||||
ethtool. It should also default to "enabled" for devices that don't generate
|
||||
wakeup requests on their own but merely forward wakeup requests from one bus to
|
||||
another (like PCI Express ports).
|
||||
|
||||
The device_may_wakeup() routine returns true only if the "power.wakeup" object
|
||||
exists and the corresponding "power/wakeup" file contains the string "enabled".
|
||||
This information is used by subsystems, like the PCI bus type code, to see
|
||||
whether or not to enable the devices' wakeup mechanisms. If device wakeup
|
||||
mechanisms are enabled or disabled directly by drivers, they also should use
|
||||
device_may_wakeup() to decide what to do during a system sleep transition.
|
||||
However for runtime power management, wakeup events should be enabled whenever
|
||||
the device and driver both support them, regardless of the should_wakeup flag.
|
||||
Device drivers, however, are not supposed to call device_set_wakeup_enable()
|
||||
directly in any case.
|
||||
|
||||
It ought to be noted that system wakeup is conceptually different from "remote
|
||||
wakeup" used by runtime power management, although it may be supported by the
|
||||
same physical mechanism. Remote wakeup is a feature allowing devices in
|
||||
low-power states to trigger specific interrupts to signal conditions in which
|
||||
they should be put into the full-power state. Those interrupts may or may not
|
||||
be used to signal system wakeup events, depending on the hardware design. On
|
||||
some systems it is impossible to trigger them from system sleep states. In any
|
||||
case, remote wakeup should always be enabled for runtime power management for
|
||||
all devices and drivers that support it.
|
||||
|
||||
/sys/devices/.../power/control files
|
||||
------------------------------------
|
||||
|
@ -249,20 +266,31 @@ for every device before the next phase begins. Not all busses or classes
|
|||
support all these callbacks and not all drivers use all the callbacks. The
|
||||
various phases always run after tasks have been frozen and before they are
|
||||
unfrozen. Furthermore, the *_noirq phases run at a time when IRQ handlers have
|
||||
been disabled (except for those marked with the IRQ_WAKEUP flag).
|
||||
been disabled (except for those marked with the IRQF_NO_SUSPEND flag).
|
||||
|
||||
All phases use bus, type, or class callbacks (that is, methods defined in
|
||||
dev->bus->pm, dev->type->pm, or dev->class->pm). These callbacks are mutually
|
||||
exclusive, so if the device type provides a struct dev_pm_ops object pointed to
|
||||
by its pm field (i.e. both dev->type and dev->type->pm are defined), the
|
||||
callbacks included in that object (i.e. dev->type->pm) will be used. Otherwise,
|
||||
if the class provides a struct dev_pm_ops object pointed to by its pm field
|
||||
(i.e. both dev->class and dev->class->pm are defined), the PM core will use the
|
||||
callbacks from that object (i.e. dev->class->pm). Finally, if the pm fields of
|
||||
both the device type and class objects are NULL (or those objects do not exist),
|
||||
the callbacks provided by the bus (that is, the callbacks from dev->bus->pm)
|
||||
will be used (this allows device types to override callbacks provided by bus
|
||||
types or classes if necessary).
|
||||
All phases use PM domain, bus, type, or class callbacks (that is, methods
|
||||
defined in dev->pm_domain->ops, dev->bus->pm, dev->type->pm, or dev->class->pm).
|
||||
These callbacks are regarded by the PM core as mutually exclusive. Moreover,
|
||||
PM domain callbacks always take precedence over bus, type and class callbacks,
|
||||
while type callbacks take precedence over bus and class callbacks, and class
|
||||
callbacks take precedence over bus callbacks. To be precise, the following
|
||||
rules are used to determine which callback to execute in the given phase:
|
||||
|
||||
1. If dev->pm_domain is present, the PM core will attempt to execute the
|
||||
callback included in dev->pm_domain->ops. If that callback is not
|
||||
present, no action will be carried out for the given device.
|
||||
|
||||
2. Otherwise, if both dev->type and dev->type->pm are present, the callback
|
||||
included in dev->type->pm will be executed.
|
||||
|
||||
3. Otherwise, if both dev->class and dev->class->pm are present, the
|
||||
callback included in dev->class->pm will be executed.
|
||||
|
||||
4. Otherwise, if both dev->bus and dev->bus->pm are present, the callback
|
||||
included in dev->bus->pm will be executed.
|
||||
|
||||
This allows PM domains and device types to override callbacks provided by bus
|
||||
types or device classes if necessary.
|
||||
|
||||
These callbacks may in turn invoke device- or driver-specific methods stored in
|
||||
dev->driver->pm, but they don't have to.
|
||||
|
@ -283,9 +311,8 @@ When the system goes into the standby or memory sleep state, the phases are:
|
|||
|
||||
After the prepare callback method returns, no new children may be
|
||||
registered below the device. The method may also prepare the device or
|
||||
driver in some way for the upcoming system power transition (for
|
||||
example, by allocating additional memory required for this purpose), but
|
||||
it should not put the device into a low-power state.
|
||||
driver in some way for the upcoming system power transition, but it
|
||||
should not put the device into a low-power state.
|
||||
|
||||
2. The suspend methods should quiesce the device to stop it from performing
|
||||
I/O. They also may save the device registers and put it into the
|
||||
|
|
|
@ -44,25 +44,33 @@ struct dev_pm_ops {
|
|||
};
|
||||
|
||||
The ->runtime_suspend(), ->runtime_resume() and ->runtime_idle() callbacks
|
||||
are executed by the PM core for either the power domain, or the device type
|
||||
(if the device power domain's struct dev_pm_ops does not exist), or the class
|
||||
(if the device power domain's and type's struct dev_pm_ops object does not
|
||||
exist), or the bus type (if the device power domain's, type's and class'
|
||||
struct dev_pm_ops objects do not exist) of the given device, so the priority
|
||||
order of callbacks from high to low is that power domain callbacks, device
|
||||
type callbacks, class callbacks and bus type callbacks, and the high priority
|
||||
one will take precedence over low priority one. The bus type, device type and
|
||||
class callbacks are referred to as subsystem-level callbacks in what follows,
|
||||
and generally speaking, the power domain callbacks are used for representing
|
||||
power domains within a SoC.
|
||||
are executed by the PM core for the device's subsystem that may be either of
|
||||
the following:
|
||||
|
||||
1. PM domain of the device, if the device's PM domain object, dev->pm_domain,
|
||||
is present.
|
||||
|
||||
2. Device type of the device, if both dev->type and dev->type->pm are present.
|
||||
|
||||
3. Device class of the device, if both dev->class and dev->class->pm are
|
||||
present.
|
||||
|
||||
4. Bus type of the device, if both dev->bus and dev->bus->pm are present.
|
||||
|
||||
The PM core always checks which callback to use in the order given above, so the
|
||||
priority order of callbacks from high to low is: PM domain, device type, class
|
||||
and bus type. Moreover, the high-priority one will always take precedence over
|
||||
a low-priority one. The PM domain, bus type, device type and class callbacks
|
||||
are referred to as subsystem-level callbacks in what follows.
|
||||
|
||||
By default, the callbacks are always invoked in process context with interrupts
|
||||
enabled. However, subsystems can use the pm_runtime_irq_safe() helper function
|
||||
to tell the PM core that a device's ->runtime_suspend() and ->runtime_resume()
|
||||
callbacks should be invoked in atomic context with interrupts disabled.
|
||||
This implies that these callback routines must not block or sleep, but it also
|
||||
means that the synchronous helper functions listed at the end of Section 4 can
|
||||
be used within an interrupt handler or in an atomic context.
|
||||
to tell the PM core that their ->runtime_suspend(), ->runtime_resume() and
|
||||
->runtime_idle() callbacks may be invoked in atomic context with interrupts
|
||||
disabled for a given device. This implies that the callback routines in
|
||||
question must not block or sleep, but it also means that the synchronous helper
|
||||
functions listed at the end of Section 4 may be used for that device within an
|
||||
interrupt handler or generally in an atomic context.
|
||||
|
||||
The subsystem-level suspend callback is _entirely_ _responsible_ for handling
|
||||
the suspend of the device as appropriate, which may, but need not include
|
||||
|
|
|
@ -97,15 +97,23 @@
|
|||
|
||||
struct serial_rs485 rs485conf;
|
||||
|
||||
/* Set RS485 mode: */
|
||||
/* Enable RS485 mode: */
|
||||
rs485conf.flags |= SER_RS485_ENABLED;
|
||||
|
||||
/* Set logical level for RTS pin equal to 1 when sending: */
|
||||
rs485conf.flags |= SER_RS485_RTS_ON_SEND;
|
||||
/* or, set logical level for RTS pin equal to 0 when sending: */
|
||||
rs485conf.flags &= ~(SER_RS485_RTS_ON_SEND);
|
||||
|
||||
/* Set logical level for RTS pin equal to 1 after sending: */
|
||||
rs485conf.flags |= SER_RS485_RTS_AFTER_SEND;
|
||||
/* or, set logical level for RTS pin equal to 0 after sending: */
|
||||
rs485conf.flags &= ~(SER_RS485_RTS_AFTER_SEND);
|
||||
|
||||
/* Set rts delay before send, if needed: */
|
||||
rs485conf.flags |= SER_RS485_RTS_BEFORE_SEND;
|
||||
rs485conf.delay_rts_before_send = ...;
|
||||
|
||||
/* Set rts delay after send, if needed: */
|
||||
rs485conf.flags |= SER_RS485_RTS_AFTER_SEND;
|
||||
rs485conf.delay_rts_after_send = ...;
|
||||
|
||||
/* Set this flag if you want to receive data even whilst sending data */
|
||||
|
|
|
@ -579,7 +579,7 @@ Development Tree
|
|||
~~~~~~~~~~~~~~~~
|
||||
The latest development codes for HD-audio are found on sound git tree:
|
||||
|
||||
- git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6.git
|
||||
- git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git
|
||||
|
||||
The master branch or for-next branches can be used as the main
|
||||
development branches in general while the HD-audio specific patches
|
||||
|
@ -594,7 +594,7 @@ is, installed via the usual spells: configure, make and make
|
|||
install(-modules). See INSTALL in the package. The snapshot tarballs
|
||||
are found at:
|
||||
|
||||
- ftp://ftp.kernel.org/pub/linux/kernel/people/tiwai/snapshot/
|
||||
- ftp://ftp.suse.com/pub/people/tiwai/snapshot/
|
||||
|
||||
|
||||
Sending a Bug Report
|
||||
|
@ -696,7 +696,7 @@ via hda-verb won't change the mixer value.
|
|||
|
||||
The hda-verb program is found in the ftp directory:
|
||||
|
||||
- ftp://ftp.kernel.org/pub/linux/kernel/people/tiwai/misc/
|
||||
- ftp://ftp.suse.com/pub/people/tiwai/misc/
|
||||
|
||||
Also a git repository is available:
|
||||
|
||||
|
@ -764,7 +764,7 @@ operation, the jack plugging simulation, etc.
|
|||
|
||||
The package is found in:
|
||||
|
||||
- ftp://ftp.kernel.org/pub/linux/kernel/people/tiwai/misc/
|
||||
- ftp://ftp.suse.com/pub/people/tiwai/misc/
|
||||
|
||||
A git repository is available:
|
||||
|
||||
|
|
39
MAINTAINERS
39
MAINTAINERS
|
@ -789,6 +789,7 @@ L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
|||
S: Maintained
|
||||
T: git git://git.pengutronix.de/git/imx/linux-2.6.git
|
||||
F: arch/arm/mach-mx*/
|
||||
F: arch/arm/mach-imx/
|
||||
F: arch/arm/plat-mxc/
|
||||
|
||||
ARM/FREESCALE IMX51
|
||||
|
@ -804,6 +805,13 @@ S: Maintained
|
|||
T: git git://git.linaro.org/people/shawnguo/linux-2.6.git
|
||||
F: arch/arm/mach-imx/*imx6*
|
||||
|
||||
ARM/FREESCALE MXS ARM ARCHITECTURE
|
||||
M: Shawn Guo <shawn.guo@linaro.org>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
T: git git://git.linaro.org/people/shawnguo/linux-2.6.git
|
||||
F: arch/arm/mach-mxs/
|
||||
|
||||
ARM/GLOMATION GESBC9312SX MACHINE SUPPORT
|
||||
M: Lennert Buytenhek <kernel@wantstofly.org>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
|
@ -1789,6 +1797,14 @@ F: include/net/cfg80211.h
|
|||
F: net/wireless/*
|
||||
X: net/wireless/wext*
|
||||
|
||||
CHAR and MISC DRIVERS
|
||||
M: Arnd Bergmann <arnd@arndb.de>
|
||||
M: Greg Kroah-Hartman <greg@kroah.com>
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git
|
||||
S: Maintained
|
||||
F: drivers/char/*
|
||||
F: drivers/misc/*
|
||||
|
||||
CHECKPATCH
|
||||
M: Andy Whitcroft <apw@canonical.com>
|
||||
S: Supported
|
||||
|
@ -1927,9 +1943,11 @@ S: Maintained
|
|||
F: drivers/connector/
|
||||
|
||||
CONTROL GROUPS (CGROUPS)
|
||||
M: Paul Menage <paul@paulmenage.org>
|
||||
M: Tejun Heo <tj@kernel.org>
|
||||
M: Li Zefan <lizf@cn.fujitsu.com>
|
||||
L: containers@lists.linux-foundation.org
|
||||
L: cgroups@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup.git
|
||||
S: Maintained
|
||||
F: include/linux/cgroup*
|
||||
F: kernel/cgroup*
|
||||
|
@ -2584,7 +2602,7 @@ S: Maintained
|
|||
F: drivers/net/ethernet/i825xx/eexpress.*
|
||||
|
||||
ETHERNET BRIDGE
|
||||
M: Stephen Hemminger <shemminger@linux-foundation.org>
|
||||
M: Stephen Hemminger <shemminger@vyatta.com>
|
||||
L: bridge@lists.linux-foundation.org
|
||||
L: netdev@vger.kernel.org
|
||||
W: http://www.linuxfoundation.org/en/Net:Bridge
|
||||
|
@ -3718,7 +3736,7 @@ F: fs/jbd2/
|
|||
F: include/linux/jbd2.h
|
||||
|
||||
JSM Neo PCI based serial card
|
||||
M: Breno Leitao <leitao@linux.vnet.ibm.com>
|
||||
M: Lucas Tavares <lucaskt@linux.vnet.ibm.com>
|
||||
L: linux-serial@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/tty/serial/jsm/
|
||||
|
@ -4304,6 +4322,7 @@ MEMORY RESOURCE CONTROLLER
|
|||
M: Balbir Singh <bsingharora@gmail.com>
|
||||
M: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp>
|
||||
M: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
|
||||
L: cgroups@vger.kernel.org
|
||||
L: linux-mm@kvack.org
|
||||
S: Maintained
|
||||
F: mm/memcontrol.c
|
||||
|
@ -4337,7 +4356,7 @@ MIPS
|
|||
M: Ralf Baechle <ralf@linux-mips.org>
|
||||
L: linux-mips@linux-mips.org
|
||||
W: http://www.linux-mips.org/
|
||||
T: git git://git.linux-mips.org/pub/scm/linux.git
|
||||
T: git git://git.linux-mips.org/pub/scm/ralf/linux.git
|
||||
Q: http://patchwork.linux-mips.org/project/linux-mips/list/
|
||||
S: Supported
|
||||
F: Documentation/mips/
|
||||
|
@ -4470,7 +4489,7 @@ S: Supported
|
|||
F: drivers/infiniband/hw/nes/
|
||||
|
||||
NETEM NETWORK EMULATOR
|
||||
M: Stephen Hemminger <shemminger@linux-foundation.org>
|
||||
M: Stephen Hemminger <shemminger@vyatta.com>
|
||||
L: netem@lists.linux-foundation.org
|
||||
S: Maintained
|
||||
F: net/sched/sch_netem.c
|
||||
|
@ -4947,7 +4966,7 @@ F: drivers/char/ppdev.c
|
|||
F: include/linux/ppdev.h
|
||||
|
||||
PARAVIRT_OPS INTERFACE
|
||||
M: Jeremy Fitzhardinge <jeremy@xensource.com>
|
||||
M: Jeremy Fitzhardinge <jeremy@goop.org>
|
||||
M: Chris Wright <chrisw@sous-sol.org>
|
||||
M: Alok Kataria <akataria@vmware.com>
|
||||
M: Rusty Russell <rusty@rustcorp.com.au>
|
||||
|
@ -5656,7 +5675,6 @@ F: drivers/media/video/*7146*
|
|||
F: include/media/*7146*
|
||||
|
||||
SAMSUNG AUDIO (ASoC) DRIVERS
|
||||
M: Jassi Brar <jassisinghbrar@gmail.com>
|
||||
M: Sangbeom Kim <sbkim73@samsung.com>
|
||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||
S: Supported
|
||||
|
@ -5985,7 +6003,7 @@ S: Maintained
|
|||
F: drivers/usb/misc/sisusbvga/
|
||||
|
||||
SKGE, SKY2 10/100/1000 GIGABIT ETHERNET DRIVERS
|
||||
M: Stephen Hemminger <shemminger@linux-foundation.org>
|
||||
M: Stephen Hemminger <shemminger@vyatta.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/net/ethernet/marvell/sk*
|
||||
|
@ -7399,8 +7417,8 @@ S: Maintained
|
|||
F: arch/x86/kernel/cpu/mcheck/*
|
||||
|
||||
XEN HYPERVISOR INTERFACE
|
||||
M: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
|
||||
M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
||||
M: Jeremy Fitzhardinge <jeremy@goop.org>
|
||||
L: xen-devel@lists.xensource.com (moderated for non-subscribers)
|
||||
L: virtualization@lists.linux-foundation.org
|
||||
S: Supported
|
||||
|
@ -7433,7 +7451,8 @@ F: drivers/xen/*swiotlb*
|
|||
|
||||
XFS FILESYSTEM
|
||||
P: Silicon Graphics Inc
|
||||
M: Alex Elder <aelder@sgi.com>
|
||||
M: Ben Myers <bpm@sgi.com>
|
||||
M: Alex Elder <elder@kernel.org>
|
||||
M: xfs-masters@oss.sgi.com
|
||||
L: xfs@oss.sgi.com
|
||||
W: http://oss.sgi.com/projects/xfs
|
||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 3
|
||||
PATCHLEVEL = 2
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc1
|
||||
EXTRAVERSION = -rc4
|
||||
NAME = Saber-toothed Squirrel
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
@ -1231,7 +1231,7 @@ config ARM_ERRATA_742231
|
|||
capabilities of the processor.
|
||||
|
||||
config PL310_ERRATA_588369
|
||||
bool "Clean & Invalidate maintenance operations do not invalidate clean lines"
|
||||
bool "PL310 errata: Clean & Invalidate maintenance operations do not invalidate clean lines"
|
||||
depends on CACHE_L2X0
|
||||
help
|
||||
The PL310 L2 cache controller implements three types of Clean &
|
||||
|
@ -1256,7 +1256,7 @@ config ARM_ERRATA_720789
|
|||
entries regardless of the ASID.
|
||||
|
||||
config PL310_ERRATA_727915
|
||||
bool "Background Clean & Invalidate by Way operation can cause data corruption"
|
||||
bool "PL310 errata: Background Clean & Invalidate by Way operation can cause data corruption"
|
||||
depends on CACHE_L2X0
|
||||
help
|
||||
PL310 implements the Clean & Invalidate by Way L2 cache maintenance
|
||||
|
@ -1289,8 +1289,8 @@ config ARM_ERRATA_751472
|
|||
operation is received by a CPU before the ICIALLUIS has completed,
|
||||
potentially leading to corrupted entries in the cache or TLB.
|
||||
|
||||
config ARM_ERRATA_753970
|
||||
bool "ARM errata: cache sync operation may be faulty"
|
||||
config PL310_ERRATA_753970
|
||||
bool "PL310 errata: cache sync operation may be faulty"
|
||||
depends on CACHE_PL310
|
||||
help
|
||||
This option enables the workaround for the 753970 PL310 (r3p0) erratum.
|
||||
|
@ -1352,6 +1352,18 @@ config ARM_ERRATA_764369
|
|||
relevant cache maintenance functions and sets a specific bit
|
||||
in the diagnostic control register of the SCU.
|
||||
|
||||
config PL310_ERRATA_769419
|
||||
bool "PL310 errata: no automatic Store Buffer drain"
|
||||
depends on CACHE_L2X0
|
||||
help
|
||||
On revisions of the PL310 prior to r3p2, the Store Buffer does
|
||||
not automatically drain. This can cause normal, non-cacheable
|
||||
writes to be retained when the memory system is idle, leading
|
||||
to suboptimal I/O performance for drivers using coherent DMA.
|
||||
This option adds a write barrier to the cpu_idle loop so that,
|
||||
on systems with an outer cache, the store buffer is drained
|
||||
explicitly.
|
||||
|
||||
endmenu
|
||||
|
||||
source "arch/arm/common/Kconfig"
|
||||
|
|
|
@ -65,6 +65,8 @@ $(obj)/%.dtb: $(src)/dts/%.dts
|
|||
|
||||
$(obj)/dtbs: $(addprefix $(obj)/, $(dtb-y))
|
||||
|
||||
clean-files := *.dtb
|
||||
|
||||
quiet_cmd_uimage = UIMAGE $@
|
||||
cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A arm -O linux -T kernel \
|
||||
-C none -a $(LOADADDR) -e $(STARTADDR) \
|
||||
|
|
|
@ -526,7 +526,8 @@ static void __init gic_pm_init(struct gic_chip_data *gic)
|
|||
sizeof(u32));
|
||||
BUG_ON(!gic->saved_ppi_conf);
|
||||
|
||||
cpu_pm_register_notifier(&gic_notifier_block);
|
||||
if (gic == &gic_data[0])
|
||||
cpu_pm_register_notifier(&gic_notifier_block);
|
||||
}
|
||||
#else
|
||||
static void __init gic_pm_init(struct gic_chip_data *gic)
|
||||
|
@ -581,13 +582,16 @@ void __init gic_init(unsigned int gic_nr, int irq_start,
|
|||
* For primary GICs, skip over SGIs.
|
||||
* For secondary GICs, skip over PPIs, too.
|
||||
*/
|
||||
domain->hwirq_base = 32;
|
||||
if (gic_nr == 0) {
|
||||
gic_cpu_base_addr = cpu_base;
|
||||
domain->hwirq_base = 16;
|
||||
if (irq_start > 0)
|
||||
irq_start = (irq_start & ~31) + 16;
|
||||
} else
|
||||
domain->hwirq_base = 32;
|
||||
|
||||
if ((irq_start & 31) > 0) {
|
||||
domain->hwirq_base = 16;
|
||||
if (irq_start != -1)
|
||||
irq_start = (irq_start & ~31) + 16;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Find out how many interrupts are supported.
|
||||
|
|
|
@ -1211,8 +1211,8 @@ static inline u32 _prepare_ccr(const struct pl330_reqcfg *rqc)
|
|||
ccr |= (rqc->brst_size << CC_SRCBRSTSIZE_SHFT);
|
||||
ccr |= (rqc->brst_size << CC_DSTBRSTSIZE_SHFT);
|
||||
|
||||
ccr |= (rqc->dcctl << CC_SRCCCTRL_SHFT);
|
||||
ccr |= (rqc->scctl << CC_DSTCCTRL_SHFT);
|
||||
ccr |= (rqc->scctl << CC_SRCCCTRL_SHFT);
|
||||
ccr |= (rqc->dcctl << CC_DSTCCTRL_SHFT);
|
||||
|
||||
ccr |= (rqc->swap << CC_SWAP_SHFT);
|
||||
|
||||
|
@ -1623,6 +1623,11 @@ static inline int _alloc_event(struct pl330_thread *thrd)
|
|||
return -1;
|
||||
}
|
||||
|
||||
static bool _chan_ns(const struct pl330_info *pi, int i)
|
||||
{
|
||||
return pi->pcfg.irq_ns & (1 << i);
|
||||
}
|
||||
|
||||
/* Upon success, returns IdentityToken for the
|
||||
* allocated channel, NULL otherwise.
|
||||
*/
|
||||
|
@ -1647,7 +1652,8 @@ void *pl330_request_channel(const struct pl330_info *pi)
|
|||
|
||||
for (i = 0; i < chans; i++) {
|
||||
thrd = &pl330->channels[i];
|
||||
if (thrd->free) {
|
||||
if ((thrd->free) && (!_manager_ns(thrd) ||
|
||||
_chan_ns(pi, i))) {
|
||||
thrd->ev = _alloc_event(thrd);
|
||||
if (thrd->ev >= 0) {
|
||||
thrd->free = false;
|
||||
|
|
|
@ -38,7 +38,6 @@ CONFIG_IP_PNP_RARP=y
|
|||
# CONFIG_IPV6 is not set
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
CONFIG_MTD=y
|
||||
CONFIG_MTD_PARTITIONS=y
|
||||
CONFIG_MTD_CMDLINE_PARTS=y
|
||||
CONFIG_MTD_CHAR=y
|
||||
CONFIG_MTD_BLOCK=y
|
||||
|
@ -52,16 +51,12 @@ CONFIG_MTD_NAND_ATMEL=y
|
|||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_SIZE=8192
|
||||
CONFIG_ATMEL_SSC=y
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_SCSI_MULTI_LUN=y
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_MII=y
|
||||
CONFIG_MACB=y
|
||||
# CONFIG_NETDEV_1000 is not set
|
||||
# CONFIG_NETDEV_10000 is not set
|
||||
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
|
||||
CONFIG_INPUT_EVDEV=y
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
|
@ -81,7 +76,6 @@ CONFIG_WATCHDOG=y
|
|||
CONFIG_WATCHDOG_NOWAYOUT=y
|
||||
CONFIG_FB=y
|
||||
CONFIG_FB_ATMEL=y
|
||||
# CONFIG_VGA_CONSOLE is not set
|
||||
CONFIG_LOGO=y
|
||||
# CONFIG_LOGO_LINUX_MONO is not set
|
||||
# CONFIG_LOGO_LINUX_CLUT224 is not set
|
||||
|
@ -99,7 +93,6 @@ CONFIG_MMC_AT91=m
|
|||
CONFIG_RTC_CLASS=y
|
||||
CONFIG_RTC_DRV_AT91SAM9=y
|
||||
CONFIG_EXT2_FS=y
|
||||
CONFIG_INOTIFY=y
|
||||
CONFIG_VFAT_FS=y
|
||||
CONFIG_TMPFS=y
|
||||
CONFIG_JFFS2_FS=y
|
|
@ -5,7 +5,6 @@ CONFIG_SYSVIPC=y
|
|||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
CONFIG_SYSFS_DEPRECATED_V2=y
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_FORCE_LOAD=y
|
||||
|
@ -56,7 +55,6 @@ CONFIG_IP_PNP=y
|
|||
CONFIG_IP_PNP_DHCP=y
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
CONFIG_NET_IPIP=m
|
||||
CONFIG_NET_IPGRE=m
|
||||
CONFIG_INET_AH=m
|
||||
CONFIG_INET_ESP=m
|
||||
CONFIG_INET_IPCOMP=m
|
||||
|
@ -75,18 +73,8 @@ CONFIG_IPV6_TUNNEL=m
|
|||
CONFIG_BRIDGE=m
|
||||
CONFIG_VLAN_8021Q=m
|
||||
CONFIG_BT=m
|
||||
CONFIG_BT_L2CAP=m
|
||||
CONFIG_BT_SCO=m
|
||||
CONFIG_BT_RFCOMM=m
|
||||
CONFIG_BT_RFCOMM_TTY=y
|
||||
CONFIG_BT_BNEP=m
|
||||
CONFIG_BT_BNEP_MC_FILTER=y
|
||||
CONFIG_BT_BNEP_PROTO_FILTER=y
|
||||
CONFIG_BT_HIDP=m
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
CONFIG_MTD=y
|
||||
CONFIG_MTD_CONCAT=y
|
||||
CONFIG_MTD_PARTITIONS=y
|
||||
CONFIG_MTD_CMDLINE_PARTS=y
|
||||
CONFIG_MTD_AFS_PARTS=y
|
||||
CONFIG_MTD_CHAR=y
|
||||
|
@ -108,8 +96,6 @@ CONFIG_BLK_DEV_LOOP=y
|
|||
CONFIG_BLK_DEV_NBD=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_SIZE=8192
|
||||
CONFIG_ATMEL_TCLIB=y
|
||||
CONFIG_EEPROM_LEGACY=m
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_BLK_DEV_SR=m
|
||||
|
@ -119,14 +105,23 @@ CONFIG_SCSI_MULTI_LUN=y
|
|||
# CONFIG_SCSI_LOWLEVEL is not set
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_TUN=m
|
||||
CONFIG_ARM_AT91_ETHER=y
|
||||
CONFIG_PHYLIB=y
|
||||
CONFIG_DAVICOM_PHY=y
|
||||
CONFIG_SMSC_PHY=y
|
||||
CONFIG_MICREL_PHY=y
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_ARM_AT91_ETHER=y
|
||||
# CONFIG_NETDEV_1000 is not set
|
||||
# CONFIG_NETDEV_10000 is not set
|
||||
CONFIG_PPP=y
|
||||
CONFIG_PPP_BSDCOMP=y
|
||||
CONFIG_PPP_DEFLATE=y
|
||||
CONFIG_PPP_FILTER=y
|
||||
CONFIG_PPP_MPPE=m
|
||||
CONFIG_PPP_MULTILINK=y
|
||||
CONFIG_PPPOE=m
|
||||
CONFIG_PPP_ASYNC=y
|
||||
CONFIG_SLIP=m
|
||||
CONFIG_SLIP_COMPRESSED=y
|
||||
CONFIG_SLIP_SMART=y
|
||||
CONFIG_SLIP_MODE_SLIP6=y
|
||||
CONFIG_USB_CATC=m
|
||||
CONFIG_USB_KAWETH=m
|
||||
CONFIG_USB_PEGASUS=m
|
||||
|
@ -139,18 +134,6 @@ CONFIG_USB_NET_RNDIS_HOST=m
|
|||
CONFIG_USB_ALI_M5632=y
|
||||
CONFIG_USB_AN2720=y
|
||||
CONFIG_USB_EPSON2888=y
|
||||
CONFIG_PPP=y
|
||||
CONFIG_PPP_MULTILINK=y
|
||||
CONFIG_PPP_FILTER=y
|
||||
CONFIG_PPP_ASYNC=y
|
||||
CONFIG_PPP_DEFLATE=y
|
||||
CONFIG_PPP_BSDCOMP=y
|
||||
CONFIG_PPP_MPPE=m
|
||||
CONFIG_PPPOE=m
|
||||
CONFIG_SLIP=m
|
||||
CONFIG_SLIP_COMPRESSED=y
|
||||
CONFIG_SLIP_SMART=y
|
||||
CONFIG_SLIP_MODE_SLIP6=y
|
||||
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_X=640
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=480
|
||||
|
@ -158,9 +141,9 @@ CONFIG_INPUT_EVDEV=y
|
|||
CONFIG_KEYBOARD_GPIO=y
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
CONFIG_INPUT_TOUCHSCREEN=y
|
||||
CONFIG_LEGACY_PTY_COUNT=32
|
||||
CONFIG_SERIAL_ATMEL=y
|
||||
CONFIG_SERIAL_ATMEL_CONSOLE=y
|
||||
CONFIG_LEGACY_PTY_COUNT=32
|
||||
CONFIG_HW_RANDOM=y
|
||||
CONFIG_I2C=y
|
||||
CONFIG_I2C_CHARDEV=y
|
||||
|
@ -290,7 +273,6 @@ CONFIG_NFS_V3_ACL=y
|
|||
CONFIG_NFS_V4=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=y
|
||||
CONFIG_SMB_FS=m
|
||||
CONFIG_CIFS=m
|
||||
CONFIG_PARTITION_ADVANCED=y
|
||||
CONFIG_MAC_PARTITION=y
|
||||
|
@ -335,7 +317,6 @@ CONFIG_NLS_UTF8=y
|
|||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_DEBUG_FS=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
|
||||
# CONFIG_FTRACE is not set
|
||||
CONFIG_CRYPTO_PCBC=y
|
||||
CONFIG_CRYPTO_SHA1=y
|
||||
|
|
|
@ -12,11 +12,23 @@ CONFIG_MODULE_UNLOAD=y
|
|||
# CONFIG_IOSCHED_CFQ is not set
|
||||
CONFIG_ARCH_AT91=y
|
||||
CONFIG_ARCH_AT91SAM9260=y
|
||||
CONFIG_ARCH_AT91SAM9260_SAM9XE=y
|
||||
CONFIG_MACH_AT91SAM9260EK=y
|
||||
CONFIG_MACH_CAM60=y
|
||||
CONFIG_MACH_SAM9_L9260=y
|
||||
CONFIG_MACH_AFEB9260=y
|
||||
CONFIG_MACH_USB_A9260=y
|
||||
CONFIG_MACH_QIL_A9260=y
|
||||
CONFIG_MACH_CPU9260=y
|
||||
CONFIG_MACH_FLEXIBITY=y
|
||||
CONFIG_MACH_SNAPPER_9260=y
|
||||
CONFIG_MACH_AT91SAM_DT=y
|
||||
CONFIG_AT91_PROGRAMMABLE_CLOCKS=y
|
||||
# CONFIG_ARM_THUMB is not set
|
||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||
CONFIG_ARM_APPENDED_DTB=y
|
||||
CONFIG_ARM_ATAG_DTB_COMPAT=y
|
||||
CONFIG_CMDLINE="mem=64M console=ttyS0,115200 initrd=0x21100000,3145728 root=/dev/ram0 rw"
|
||||
CONFIG_FPE_NWFPE=y
|
||||
CONFIG_NET=y
|
||||
|
@ -33,12 +45,10 @@ CONFIG_IP_PNP_BOOTP=y
|
|||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_SIZE=8192
|
||||
CONFIG_ATMEL_SSC=y
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_SCSI_MULTI_LUN=y
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_MII=y
|
||||
CONFIG_MACB=y
|
||||
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
|
||||
|
@ -55,7 +65,6 @@ CONFIG_I2C_GPIO=y
|
|||
CONFIG_WATCHDOG=y
|
||||
CONFIG_WATCHDOG_NOWAYOUT=y
|
||||
CONFIG_AT91SAM9X_WATCHDOG=y
|
||||
# CONFIG_VGA_CONSOLE is not set
|
||||
# CONFIG_USB_HID is not set
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_DEVICEFS=y
|
||||
|
@ -71,7 +80,6 @@ CONFIG_USB_G_SERIAL=m
|
|||
CONFIG_RTC_CLASS=y
|
||||
CONFIG_RTC_DRV_AT91SAM9=y
|
||||
CONFIG_EXT2_FS=y
|
||||
CONFIG_INOTIFY=y
|
||||
CONFIG_VFAT_FS=y
|
||||
CONFIG_TMPFS=y
|
||||
CONFIG_CRAMFS=y
|
|
@ -14,6 +14,15 @@ CONFIG_ARCH_AT91=y
|
|||
CONFIG_ARCH_AT91SAM9G20=y
|
||||
CONFIG_MACH_AT91SAM9G20EK=y
|
||||
CONFIG_MACH_AT91SAM9G20EK_2MMC=y
|
||||
CONFIG_MACH_CPU9G20=y
|
||||
CONFIG_MACH_ACMENETUSFOXG20=y
|
||||
CONFIG_MACH_PORTUXG20=y
|
||||
CONFIG_MACH_STAMP9G20=y
|
||||
CONFIG_MACH_PCONTROL_G20=y
|
||||
CONFIG_MACH_GSIA18S=y
|
||||
CONFIG_MACH_USB_A9G20=y
|
||||
CONFIG_MACH_SNAPPER_9260=y
|
||||
CONFIG_MACH_AT91SAM_DT=y
|
||||
CONFIG_AT91_PROGRAMMABLE_CLOCKS=y
|
||||
# CONFIG_ARM_THUMB is not set
|
||||
CONFIG_AEABI=y
|
||||
|
@ -21,9 +30,10 @@ CONFIG_LEDS=y
|
|||
CONFIG_LEDS_CPU=y
|
||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||
CONFIG_ARM_APPENDED_DTB=y
|
||||
CONFIG_ARM_ATAG_DTB_COMPAT=y
|
||||
CONFIG_CMDLINE="mem=64M console=ttyS0,115200 initrd=0x21100000,3145728 root=/dev/ram0 rw"
|
||||
CONFIG_FPE_NWFPE=y
|
||||
CONFIG_PM=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_UNIX=y
|
||||
|
@ -37,8 +47,6 @@ CONFIG_IP_PNP_BOOTP=y
|
|||
# CONFIG_IPV6 is not set
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
CONFIG_MTD=y
|
||||
CONFIG_MTD_CONCAT=y
|
||||
CONFIG_MTD_PARTITIONS=y
|
||||
CONFIG_MTD_CMDLINE_PARTS=y
|
||||
CONFIG_MTD_CHAR=y
|
||||
CONFIG_MTD_BLOCK=y
|
||||
|
@ -48,17 +56,13 @@ CONFIG_MTD_NAND_ATMEL=y
|
|||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_SIZE=8192
|
||||
CONFIG_ATMEL_SSC=y
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_SCSI_MULTI_LUN=y
|
||||
# CONFIG_SCSI_LOWLEVEL is not set
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_MII=y
|
||||
CONFIG_MACB=y
|
||||
# CONFIG_NETDEV_1000 is not set
|
||||
# CONFIG_NETDEV_10000 is not set
|
||||
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_X=320
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=240
|
||||
|
@ -66,15 +70,14 @@ CONFIG_INPUT_EVDEV=y
|
|||
# CONFIG_KEYBOARD_ATKBD is not set
|
||||
CONFIG_KEYBOARD_GPIO=y
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
CONFIG_LEGACY_PTY_COUNT=16
|
||||
CONFIG_SERIAL_ATMEL=y
|
||||
CONFIG_SERIAL_ATMEL_CONSOLE=y
|
||||
CONFIG_LEGACY_PTY_COUNT=16
|
||||
CONFIG_HW_RANDOM=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_ATMEL=y
|
||||
CONFIG_SPI_SPIDEV=y
|
||||
# CONFIG_HWMON is not set
|
||||
# CONFIG_VGA_CONSOLE is not set
|
||||
CONFIG_SOUND=y
|
||||
CONFIG_SND=y
|
||||
CONFIG_SND_SEQUENCER=y
|
||||
|
@ -82,7 +85,6 @@ CONFIG_SND_MIXER_OSS=y
|
|||
CONFIG_SND_PCM_OSS=y
|
||||
CONFIG_SND_SEQUENCER_OSS=y
|
||||
# CONFIG_SND_VERBOSE_PROCFS is not set
|
||||
CONFIG_SND_AT73C213=y
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_DEVICEFS=y
|
||||
# CONFIG_USB_DEVICE_CLASS is not set
|
||||
|
@ -105,7 +107,6 @@ CONFIG_LEDS_TRIGGER_HEARTBEAT=y
|
|||
CONFIG_RTC_CLASS=y
|
||||
CONFIG_RTC_DRV_AT91SAM9=y
|
||||
CONFIG_EXT2_FS=y
|
||||
CONFIG_INOTIFY=y
|
||||
CONFIG_MSDOS_FS=y
|
||||
CONFIG_VFAT_FS=y
|
||||
CONFIG_TMPFS=y
|
|
@ -18,6 +18,7 @@ CONFIG_MODULE_UNLOAD=y
|
|||
CONFIG_ARCH_AT91=y
|
||||
CONFIG_ARCH_AT91SAM9G45=y
|
||||
CONFIG_MACH_AT91SAM9M10G45EK=y
|
||||
CONFIG_MACH_AT91SAM_DT=y
|
||||
CONFIG_AT91_PROGRAMMABLE_CLOCKS=y
|
||||
CONFIG_AT91_SLOW_CLOCK=y
|
||||
CONFIG_AEABI=y
|
||||
|
@ -73,11 +74,8 @@ CONFIG_SCSI_MULTI_LUN=y
|
|||
# CONFIG_SCSI_LOWLEVEL is not set
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_MII=y
|
||||
CONFIG_DAVICOM_PHY=y
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_MACB=y
|
||||
# CONFIG_NETDEV_1000 is not set
|
||||
# CONFIG_NETDEV_10000 is not set
|
||||
CONFIG_DAVICOM_PHY=y
|
||||
CONFIG_LIBERTAS_THINFIRM=m
|
||||
CONFIG_LIBERTAS_THINFIRM_USB=m
|
||||
CONFIG_AT76C50X_USB=m
|
||||
|
@ -131,7 +129,6 @@ CONFIG_I2C_GPIO=y
|
|||
CONFIG_SPI=y
|
||||
CONFIG_SPI_ATMEL=y
|
||||
# CONFIG_HWMON is not set
|
||||
# CONFIG_MFD_SUPPORT is not set
|
||||
CONFIG_FB=y
|
||||
CONFIG_FB_ATMEL=y
|
||||
CONFIG_FB_UDL=m
|
||||
|
|
|
@ -23,8 +23,6 @@ CONFIG_NET=y
|
|||
CONFIG_UNIX=y
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
CONFIG_MTD=y
|
||||
CONFIG_MTD_CONCAT=y
|
||||
CONFIG_MTD_PARTITIONS=y
|
||||
CONFIG_MTD_CMDLINE_PARTS=y
|
||||
CONFIG_MTD_CHAR=y
|
||||
CONFIG_MTD_BLOCK=y
|
||||
|
@ -35,7 +33,6 @@ CONFIG_BLK_DEV_LOOP=y
|
|||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_COUNT=4
|
||||
CONFIG_BLK_DEV_RAM_SIZE=24576
|
||||
CONFIG_ATMEL_SSC=y
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_SCSI_MULTI_LUN=y
|
||||
|
@ -62,13 +59,11 @@ CONFIG_WATCHDOG_NOWAYOUT=y
|
|||
CONFIG_AT91SAM9X_WATCHDOG=y
|
||||
CONFIG_FB=y
|
||||
CONFIG_FB_ATMEL=y
|
||||
# CONFIG_VGA_CONSOLE is not set
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_AT91=m
|
||||
CONFIG_RTC_CLASS=y
|
||||
CONFIG_RTC_DRV_AT91SAM9=y
|
||||
CONFIG_EXT2_FS=y
|
||||
CONFIG_INOTIFY=y
|
||||
CONFIG_MSDOS_FS=y
|
||||
CONFIG_VFAT_FS=y
|
||||
CONFIG_TMPFS=y
|
|
@ -287,7 +287,7 @@ CONFIG_USB=y
|
|||
# CONFIG_USB_DEVICE_CLASS is not set
|
||||
CONFIG_USB_OHCI_HCD=y
|
||||
CONFIG_USB_GADGET=y
|
||||
CONFIG_USB_GADGET_PXA27X=y
|
||||
CONFIG_USB_PXA27X=y
|
||||
CONFIG_USB_ETH=m
|
||||
# CONFIG_USB_ETH_RNDIS is not set
|
||||
CONFIG_MMC=y
|
||||
|
|
|
@ -263,7 +263,7 @@ CONFIG_USB=y
|
|||
# CONFIG_USB_DEVICE_CLASS is not set
|
||||
CONFIG_USB_OHCI_HCD=y
|
||||
CONFIG_USB_GADGET=y
|
||||
CONFIG_USB_GADGET_PXA27X=y
|
||||
CONFIG_USB_PXA27X=y
|
||||
CONFIG_USB_ETH=m
|
||||
# CONFIG_USB_ETH_RNDIS is not set
|
||||
CONFIG_MMC=y
|
||||
|
|
|
@ -132,7 +132,7 @@ CONFIG_USB_MON=m
|
|||
CONFIG_USB_OHCI_HCD=y
|
||||
CONFIG_USB_GADGET=y
|
||||
CONFIG_USB_GADGET_VBUS_DRAW=500
|
||||
CONFIG_USB_GADGET_PXA27X=y
|
||||
CONFIG_USB_PXA27X=y
|
||||
CONFIG_USB_ETH=m
|
||||
# CONFIG_USB_ETH_RNDIS is not set
|
||||
CONFIG_USB_GADGETFS=m
|
||||
|
|
|
@ -48,7 +48,6 @@ CONFIG_MACH_SX1=y
|
|||
CONFIG_MACH_NOKIA770=y
|
||||
CONFIG_MACH_AMS_DELTA=y
|
||||
CONFIG_MACH_OMAP_GENERIC=y
|
||||
CONFIG_OMAP_CLOCKS_SET_BY_BOOTLOADER=y
|
||||
CONFIG_OMAP_ARM_216MHZ=y
|
||||
CONFIG_OMAP_ARM_195MHZ=y
|
||||
CONFIG_OMAP_ARM_192MHZ=y
|
||||
|
|
|
@ -14,8 +14,6 @@ CONFIG_MODULE_UNLOAD=y
|
|||
CONFIG_ARCH_U300=y
|
||||
CONFIG_MACH_U300=y
|
||||
CONFIG_MACH_U300_BS335=y
|
||||
CONFIG_MACH_U300_DUAL_RAM=y
|
||||
CONFIG_U300_DEBUG=y
|
||||
CONFIG_MACH_U300_SPIDUMMY=y
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
|
@ -26,19 +24,21 @@ CONFIG_ZBOOT_ROM_BSS=0x0
|
|||
CONFIG_CMDLINE="root=/dev/ram0 rw rootfstype=rootfs console=ttyAMA0,115200n8 lpj=515072"
|
||||
CONFIG_CPU_IDLE=y
|
||||
CONFIG_FPE_NWFPE=y
|
||||
CONFIG_PM=y
|
||||
# CONFIG_SUSPEND is not set
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
# CONFIG_PREVENT_FIRMWARE_BUILD is not set
|
||||
# CONFIG_MISC_DEVICES is not set
|
||||
CONFIG_MTD=y
|
||||
CONFIG_MTD_CMDLINE_PARTS=y
|
||||
CONFIG_MTD_NAND=y
|
||||
CONFIG_MTD_NAND_FSMC=y
|
||||
# CONFIG_INPUT_MOUSEDEV is not set
|
||||
CONFIG_INPUT_EVDEV=y
|
||||
# CONFIG_KEYBOARD_ATKBD is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
# CONFIG_SERIO is not set
|
||||
CONFIG_LEGACY_PTY_COUNT=16
|
||||
CONFIG_SERIAL_AMBA_PL011=y
|
||||
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
|
||||
CONFIG_LEGACY_PTY_COUNT=16
|
||||
# CONFIG_HW_RANDOM is not set
|
||||
CONFIG_I2C=y
|
||||
# CONFIG_HWMON is not set
|
||||
|
@ -51,6 +51,7 @@ CONFIG_BACKLIGHT_CLASS_DEVICE=y
|
|||
# CONFIG_HID_SUPPORT is not set
|
||||
# CONFIG_USB_SUPPORT is not set
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_CLKGATE=y
|
||||
CONFIG_MMC_ARMMMCI=y
|
||||
CONFIG_RTC_CLASS=y
|
||||
# CONFIG_RTC_HCTOSYS is not set
|
||||
|
@ -65,10 +66,8 @@ CONFIG_NLS_CODEPAGE_437=y
|
|||
CONFIG_NLS_ISO8859_1=y
|
||||
CONFIG_PRINTK_TIME=y
|
||||
CONFIG_DEBUG_FS=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
# CONFIG_SCHED_DEBUG is not set
|
||||
CONFIG_TIMER_STATS=y
|
||||
# CONFIG_DEBUG_PREEMPT is not set
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
|
||||
# CONFIG_CRC32 is not set
|
||||
|
|
|
@ -10,7 +10,7 @@ CONFIG_MODULE_UNLOAD=y
|
|||
CONFIG_ARCH_U8500=y
|
||||
CONFIG_UX500_SOC_DB5500=y
|
||||
CONFIG_UX500_SOC_DB8500=y
|
||||
CONFIG_MACH_U8500=y
|
||||
CONFIG_MACH_HREFV60=y
|
||||
CONFIG_MACH_SNOWBALL=y
|
||||
CONFIG_MACH_U5500=y
|
||||
CONFIG_NO_HZ=y
|
||||
|
@ -24,6 +24,7 @@ CONFIG_CPU_FREQ=y
|
|||
CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y
|
||||
CONFIG_VFP=y
|
||||
CONFIG_NEON=y
|
||||
CONFIG_PM_RUNTIME=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_UNIX=y
|
||||
|
@ -41,11 +42,8 @@ CONFIG_MISC_DEVICES=y
|
|||
CONFIG_AB8500_PWM=y
|
||||
CONFIG_SENSORS_BH1780=y
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_SMSC_PHY=y
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_SMSC911X=y
|
||||
# CONFIG_NETDEV_1000 is not set
|
||||
# CONFIG_NETDEV_10000 is not set
|
||||
CONFIG_SMSC_PHY=y
|
||||
# CONFIG_WLAN is not set
|
||||
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
|
||||
CONFIG_INPUT_EVDEV=y
|
||||
|
@ -72,15 +70,12 @@ CONFIG_SPI=y
|
|||
CONFIG_SPI_PL022=y
|
||||
CONFIG_GPIO_STMPE=y
|
||||
CONFIG_GPIO_TC3589X=y
|
||||
# CONFIG_HWMON is not set
|
||||
CONFIG_MFD_STMPE=y
|
||||
CONFIG_MFD_TC3589X=y
|
||||
CONFIG_AB5500_CORE=y
|
||||
CONFIG_AB8500_CORE=y
|
||||
CONFIG_REGULATOR_AB8500=y
|
||||
# CONFIG_HID_SUPPORT is not set
|
||||
CONFIG_USB_MUSB_HDRC=y
|
||||
CONFIG_USB_GADGET_MUSB_HDRC=y
|
||||
CONFIG_MUSB_PIO_ONLY=y
|
||||
CONFIG_USB_GADGET=y
|
||||
CONFIG_AB8500_USB=y
|
||||
CONFIG_MMC=y
|
||||
|
@ -97,6 +92,7 @@ CONFIG_DMADEVICES=y
|
|||
CONFIG_STE_DMA40=y
|
||||
CONFIG_STAGING=y
|
||||
CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4=y
|
||||
CONFIG_HSEM_U8500=y
|
||||
CONFIG_EXT2_FS=y
|
||||
CONFIG_EXT2_FS_XATTR=y
|
||||
CONFIG_EXT2_FS_POSIX_ACL=y
|
||||
|
|
|
@ -140,7 +140,7 @@ CONFIG_USB_SERIAL=m
|
|||
CONFIG_USB_SERIAL_GENERIC=y
|
||||
CONFIG_USB_SERIAL_MCT_U232=m
|
||||
CONFIG_USB_GADGET=m
|
||||
CONFIG_USB_GADGET_PXA27X=y
|
||||
CONFIG_USB_PXA27X=y
|
||||
CONFIG_USB_ETH=m
|
||||
CONFIG_USB_GADGETFS=m
|
||||
CONFIG_USB_FILE_STORAGE=m
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
#ifndef __ASM_ARM_HARDWARE_L2X0_H
|
||||
#define __ASM_ARM_HARDWARE_L2X0_H
|
||||
|
||||
#include <linux/errno.h>
|
||||
|
||||
#define L2X0_CACHE_ID 0x000
|
||||
#define L2X0_CACHE_TYPE 0x004
|
||||
#define L2X0_CTRL 0x100
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
struct tag;
|
||||
struct meminfo;
|
||||
struct sys_timer;
|
||||
struct pt_regs;
|
||||
|
||||
struct machine_desc {
|
||||
unsigned int nr; /* architecture number */
|
||||
|
|
|
@ -55,16 +55,6 @@ reserve_pmu(enum arm_pmu_type type);
|
|||
extern void
|
||||
release_pmu(enum arm_pmu_type type);
|
||||
|
||||
/**
|
||||
* init_pmu() - Initialise the PMU.
|
||||
*
|
||||
* Initialise the system ready for PMU enabling. This should typically set the
|
||||
* IRQ affinity and nothing else. The users (oprofile/perf events etc) will do
|
||||
* the actual hardware initialisation.
|
||||
*/
|
||||
extern int
|
||||
init_pmu(enum arm_pmu_type type);
|
||||
|
||||
#else /* CONFIG_CPU_HAS_PMU */
|
||||
|
||||
#include <linux/err.h>
|
||||
|
|
|
@ -25,7 +25,7 @@ extern struct cputopo_arm cpu_topology[NR_CPUS];
|
|||
|
||||
void init_cpu_topology(void);
|
||||
void store_cpu_topology(unsigned int cpuid);
|
||||
const struct cpumask *cpu_coregroup_mask(unsigned int cpu);
|
||||
const struct cpumask *cpu_coregroup_mask(int cpu);
|
||||
|
||||
#else
|
||||
|
||||
|
|
|
@ -402,6 +402,8 @@
|
|||
#define __NR_syncfs (__NR_SYSCALL_BASE+373)
|
||||
#define __NR_sendmmsg (__NR_SYSCALL_BASE+374)
|
||||
#define __NR_setns (__NR_SYSCALL_BASE+375)
|
||||
#define __NR_process_vm_readv (__NR_SYSCALL_BASE+376)
|
||||
#define __NR_process_vm_writev (__NR_SYSCALL_BASE+377)
|
||||
|
||||
/*
|
||||
* The following SWIs are ARM private.
|
||||
|
|
|
@ -385,6 +385,8 @@
|
|||
CALL(sys_syncfs)
|
||||
CALL(sys_sendmmsg)
|
||||
/* 375 */ CALL(sys_setns)
|
||||
CALL(sys_process_vm_readv)
|
||||
CALL(sys_process_vm_writev)
|
||||
#ifndef syscalls_counted
|
||||
.equ syscalls_padding, ((NR_syscalls + 3) & ~3) - NR_syscalls
|
||||
#define syscalls_counted
|
||||
|
|
|
@ -497,7 +497,7 @@ ENDPROC(__und_usr)
|
|||
.popsection
|
||||
.pushsection __ex_table,"a"
|
||||
.long 1b, 4b
|
||||
#if __LINUX_ARM_ARCH__ >= 7
|
||||
#if CONFIG_ARM_THUMB && __LINUX_ARM_ARCH__ >= 6 && CONFIG_CPU_V7
|
||||
.long 2b, 4b
|
||||
.long 3b, 4b
|
||||
#endif
|
||||
|
|
|
@ -360,7 +360,7 @@ __secondary_data:
|
|||
* r13 = *virtual* address to jump to upon completion
|
||||
*/
|
||||
__enable_mmu:
|
||||
#ifdef CONFIG_ALIGNMENT_TRAP
|
||||
#if defined(CONFIG_ALIGNMENT_TRAP) && __LINUX_ARM_ARCH__ < 6
|
||||
orr r0, r0, #CR_A
|
||||
#else
|
||||
bic r0, r0, #CR_A
|
||||
|
|
|
@ -519,10 +519,12 @@ static const union decode_item arm_cccc_0000_____1001_table[] = {
|
|||
static const union decode_item arm_cccc_0001_____1001_table[] = {
|
||||
/* Synchronization primitives */
|
||||
|
||||
#if __LINUX_ARM_ARCH__ < 6
|
||||
/* Deprecated on ARMv6 and may be UNDEFINED on v7 */
|
||||
/* SMP/SWPB cccc 0001 0x00 xxxx xxxx xxxx 1001 xxxx */
|
||||
DECODE_EMULATEX (0x0fb000f0, 0x01000090, emulate_rd12rn16rm0_rwflags_nopc,
|
||||
REGS(NOPC, NOPC, 0, 0, NOPC)),
|
||||
|
||||
#endif
|
||||
/* LDREX/STREX{,D,B,H} cccc 0001 1xxx xxxx xxxx xxxx 1001 xxxx */
|
||||
/* And unallocated instructions... */
|
||||
DECODE_END
|
||||
|
|
|
@ -427,18 +427,25 @@ void kprobe_arm_test_cases(void)
|
|||
|
||||
TEST_GROUP("Synchronization primitives")
|
||||
|
||||
/*
|
||||
* Use hard coded constants for SWP instructions to avoid warnings
|
||||
* about deprecated instructions.
|
||||
*/
|
||||
TEST_RP( ".word 0xe108e097 @ swp lr, r",7,VAL2,", [r",8,0,"]")
|
||||
TEST_R( ".word 0x610d0091 @ swpvs r0, r",1,VAL1,", [sp]")
|
||||
TEST_RP( ".word 0xe10cd09e @ swp sp, r",14,VAL2,", [r",12,13*4,"]")
|
||||
#if __LINUX_ARM_ARCH__ < 6
|
||||
TEST_RP("swp lr, r",7,VAL2,", [r",8,0,"]")
|
||||
TEST_R( "swpvs r0, r",1,VAL1,", [sp]")
|
||||
TEST_RP("swp sp, r",14,VAL2,", [r",12,13*4,"]")
|
||||
#else
|
||||
TEST_UNSUPPORTED(".word 0xe108e097 @ swp lr, r7, [r8]")
|
||||
TEST_UNSUPPORTED(".word 0x610d0091 @ swpvs r0, r1, [sp]")
|
||||
TEST_UNSUPPORTED(".word 0xe10cd09e @ swp sp, r14 [r12]")
|
||||
#endif
|
||||
TEST_UNSUPPORTED(".word 0xe102f091 @ swp pc, r1, [r2]")
|
||||
TEST_UNSUPPORTED(".word 0xe102009f @ swp r0, pc, [r2]")
|
||||
TEST_UNSUPPORTED(".word 0xe10f0091 @ swp r0, r1, [pc]")
|
||||
TEST_RP( ".word 0xe148e097 @ swpb lr, r",7,VAL2,", [r",8,0,"]")
|
||||
TEST_R( ".word 0x614d0091 @ swpvsb r0, r",1,VAL1,", [sp]")
|
||||
#if __LINUX_ARM_ARCH__ < 6
|
||||
TEST_RP("swpb lr, r",7,VAL2,", [r",8,0,"]")
|
||||
TEST_R( "swpvsb r0, r",1,VAL1,", [sp]")
|
||||
#else
|
||||
TEST_UNSUPPORTED(".word 0xe148e097 @ swpb lr, r7, [r8]")
|
||||
TEST_UNSUPPORTED(".word 0x614d0091 @ swpvsb r0, r1, [sp]")
|
||||
#endif
|
||||
TEST_UNSUPPORTED(".word 0xe142f091 @ swpb pc, r1, [r2]")
|
||||
|
||||
TEST_UNSUPPORTED(".word 0xe1100090") /* Unallocated space */
|
||||
|
@ -550,7 +557,7 @@ void kprobe_arm_test_cases(void)
|
|||
TEST_RPR( "strccd r",8, VAL2,", [r",13,0, ", r",12,48,"]")
|
||||
TEST_RPR( "strd r",4, VAL1,", [r",2, 24,", r",3, 48,"]!")
|
||||
TEST_RPR( "strcsd r",12,VAL2,", [r",11,48,", -r",10,24,"]!")
|
||||
TEST_RPR( "strd r",2, VAL1,", [r",3, 24,"], r",4,48,"")
|
||||
TEST_RPR( "strd r",2, VAL1,", [r",5, 24,"], r",4,48,"")
|
||||
TEST_RPR( "strd r",10,VAL2,", [r",9, 48,"], -r",7,24,"")
|
||||
TEST_UNSUPPORTED(".word 0xe1afc0fa @ strd r12, [pc, r10]!")
|
||||
|
||||
|
|
|
@ -222,8 +222,8 @@ void kprobe_thumb16_test_cases(void)
|
|||
DONT_TEST_IN_ITBLOCK(
|
||||
TEST_BF_R( "cbnz r",0,0, ", 2f")
|
||||
TEST_BF_R( "cbz r",2,-1,", 2f")
|
||||
TEST_BF_RX( "cbnz r",4,1, ", 2f",0x20)
|
||||
TEST_BF_RX( "cbz r",7,0, ", 2f",0x40)
|
||||
TEST_BF_RX( "cbnz r",4,1, ", 2f", SPACE_0x20)
|
||||
TEST_BF_RX( "cbz r",7,0, ", 2f", SPACE_0x40)
|
||||
)
|
||||
TEST_R("sxth r0, r",7, HH1,"")
|
||||
TEST_R("sxth r7, r",0, HH2,"")
|
||||
|
@ -246,7 +246,7 @@ DONT_TEST_IN_ITBLOCK(
|
|||
TESTCASE_START(code) \
|
||||
TEST_ARG_PTR(13, offset) \
|
||||
TEST_ARG_END("") \
|
||||
TEST_BRANCH_F(code,0) \
|
||||
TEST_BRANCH_F(code) \
|
||||
TESTCASE_END
|
||||
|
||||
TEST("push {r0}")
|
||||
|
@ -319,8 +319,8 @@ CONDITION_INSTRUCTIONS(8,
|
|||
|
||||
TEST_BF( "b 2f")
|
||||
TEST_BB( "b 2b")
|
||||
TEST_BF_X("b 2f", 0x400)
|
||||
TEST_BB_X("b 2b", 0x400)
|
||||
TEST_BF_X("b 2f", SPACE_0x400)
|
||||
TEST_BB_X("b 2b", SPACE_0x400)
|
||||
|
||||
TEST_GROUP("Testing instructions in IT blocks")
|
||||
|
||||
|
@ -746,7 +746,7 @@ CONDITION_INSTRUCTIONS(22,
|
|||
TEST_BB("bne.w 2b")
|
||||
TEST_BF("bgt.w 2f")
|
||||
TEST_BB("blt.w 2b")
|
||||
TEST_BF_X("bpl.w 2f",0x1000)
|
||||
TEST_BF_X("bpl.w 2f", SPACE_0x1000)
|
||||
)
|
||||
|
||||
TEST_UNSUPPORTED("msr cpsr, r0")
|
||||
|
@ -786,11 +786,11 @@ CONDITION_INSTRUCTIONS(22,
|
|||
|
||||
TEST_BF( "b.w 2f")
|
||||
TEST_BB( "b.w 2b")
|
||||
TEST_BF_X("b.w 2f", 0x1000)
|
||||
TEST_BF_X("b.w 2f", SPACE_0x1000)
|
||||
|
||||
TEST_BF( "bl.w 2f")
|
||||
TEST_BB( "bl.w 2b")
|
||||
TEST_BB_X("bl.w 2b", 0x1000)
|
||||
TEST_BB_X("bl.w 2b", SPACE_0x1000)
|
||||
|
||||
TEST_X( "blx __dummy_arm_subroutine",
|
||||
".arm \n\t"
|
||||
|
|
|
@ -149,23 +149,31 @@ struct test_arg_end {
|
|||
"1: "instruction" \n\t" \
|
||||
" nop \n\t"
|
||||
|
||||
#define TEST_BRANCH_F(instruction, xtra_dist) \
|
||||
#define TEST_BRANCH_F(instruction) \
|
||||
TEST_INSTRUCTION(instruction) \
|
||||
".if "#xtra_dist" \n\t" \
|
||||
" b 99f \n\t" \
|
||||
".space "#xtra_dist" \n\t" \
|
||||
".endif \n\t" \
|
||||
" b 99f \n\t" \
|
||||
"2: nop \n\t"
|
||||
|
||||
#define TEST_BRANCH_B(instruction, xtra_dist) \
|
||||
#define TEST_BRANCH_B(instruction) \
|
||||
" b 50f \n\t" \
|
||||
" b 99f \n\t" \
|
||||
"2: nop \n\t" \
|
||||
" b 99f \n\t" \
|
||||
".if "#xtra_dist" \n\t" \
|
||||
".space "#xtra_dist" \n\t" \
|
||||
".endif \n\t" \
|
||||
TEST_INSTRUCTION(instruction)
|
||||
|
||||
#define TEST_BRANCH_FX(instruction, codex) \
|
||||
TEST_INSTRUCTION(instruction) \
|
||||
" b 99f \n\t" \
|
||||
codex" \n\t" \
|
||||
" b 99f \n\t" \
|
||||
"2: nop \n\t"
|
||||
|
||||
#define TEST_BRANCH_BX(instruction, codex) \
|
||||
" b 50f \n\t" \
|
||||
" b 99f \n\t" \
|
||||
"2: nop \n\t" \
|
||||
" b 99f \n\t" \
|
||||
codex" \n\t" \
|
||||
TEST_INSTRUCTION(instruction)
|
||||
|
||||
#define TESTCASE_END \
|
||||
|
@ -301,47 +309,60 @@ struct test_arg_end {
|
|||
TESTCASE_START(code1 #reg1 code2) \
|
||||
TEST_ARG_PTR(reg1, val1) \
|
||||
TEST_ARG_END("") \
|
||||
TEST_BRANCH_F(code1 #reg1 code2, 0) \
|
||||
TEST_BRANCH_F(code1 #reg1 code2) \
|
||||
TESTCASE_END
|
||||
|
||||
#define TEST_BF_X(code, xtra_dist) \
|
||||
#define TEST_BF(code) \
|
||||
TESTCASE_START(code) \
|
||||
TEST_ARG_END("") \
|
||||
TEST_BRANCH_F(code, xtra_dist) \
|
||||
TEST_BRANCH_F(code) \
|
||||
TESTCASE_END
|
||||
|
||||
#define TEST_BB_X(code, xtra_dist) \
|
||||
#define TEST_BB(code) \
|
||||
TESTCASE_START(code) \
|
||||
TEST_ARG_END("") \
|
||||
TEST_BRANCH_B(code, xtra_dist) \
|
||||
TEST_BRANCH_B(code) \
|
||||
TESTCASE_END
|
||||
|
||||
#define TEST_BF_RX(code1, reg, val, code2, xtra_dist) \
|
||||
TESTCASE_START(code1 #reg code2) \
|
||||
TEST_ARG_REG(reg, val) \
|
||||
TEST_ARG_END("") \
|
||||
TEST_BRANCH_F(code1 #reg code2, xtra_dist) \
|
||||
#define TEST_BF_R(code1, reg, val, code2) \
|
||||
TESTCASE_START(code1 #reg code2) \
|
||||
TEST_ARG_REG(reg, val) \
|
||||
TEST_ARG_END("") \
|
||||
TEST_BRANCH_F(code1 #reg code2) \
|
||||
TESTCASE_END
|
||||
|
||||
#define TEST_BB_RX(code1, reg, val, code2, xtra_dist) \
|
||||
TESTCASE_START(code1 #reg code2) \
|
||||
TEST_ARG_REG(reg, val) \
|
||||
TEST_ARG_END("") \
|
||||
TEST_BRANCH_B(code1 #reg code2, xtra_dist) \
|
||||
#define TEST_BB_R(code1, reg, val, code2) \
|
||||
TESTCASE_START(code1 #reg code2) \
|
||||
TEST_ARG_REG(reg, val) \
|
||||
TEST_ARG_END("") \
|
||||
TEST_BRANCH_B(code1 #reg code2) \
|
||||
TESTCASE_END
|
||||
|
||||
#define TEST_BF(code) TEST_BF_X(code, 0)
|
||||
#define TEST_BB(code) TEST_BB_X(code, 0)
|
||||
|
||||
#define TEST_BF_R(code1, reg, val, code2) TEST_BF_RX(code1, reg, val, code2, 0)
|
||||
#define TEST_BB_R(code1, reg, val, code2) TEST_BB_RX(code1, reg, val, code2, 0)
|
||||
|
||||
#define TEST_BF_RR(code1, reg1, val1, code2, reg2, val2, code3) \
|
||||
TESTCASE_START(code1 #reg1 code2 #reg2 code3) \
|
||||
TEST_ARG_REG(reg1, val1) \
|
||||
TEST_ARG_REG(reg2, val2) \
|
||||
TEST_ARG_END("") \
|
||||
TEST_BRANCH_F(code1 #reg1 code2 #reg2 code3, 0) \
|
||||
TEST_BRANCH_F(code1 #reg1 code2 #reg2 code3) \
|
||||
TESTCASE_END
|
||||
|
||||
#define TEST_BF_X(code, codex) \
|
||||
TESTCASE_START(code) \
|
||||
TEST_ARG_END("") \
|
||||
TEST_BRANCH_FX(code, codex) \
|
||||
TESTCASE_END
|
||||
|
||||
#define TEST_BB_X(code, codex) \
|
||||
TESTCASE_START(code) \
|
||||
TEST_ARG_END("") \
|
||||
TEST_BRANCH_BX(code, codex) \
|
||||
TESTCASE_END
|
||||
|
||||
#define TEST_BF_RX(code1, reg, val, code2, codex) \
|
||||
TESTCASE_START(code1 #reg code2) \
|
||||
TEST_ARG_REG(reg, val) \
|
||||
TEST_ARG_END("") \
|
||||
TEST_BRANCH_FX(code1 #reg code2, codex) \
|
||||
TESTCASE_END
|
||||
|
||||
#define TEST_X(code, codex) \
|
||||
|
@ -372,6 +393,25 @@ struct test_arg_end {
|
|||
TESTCASE_END
|
||||
|
||||
|
||||
/*
|
||||
* Macros for defining space directives spread over multiple lines.
|
||||
* These are required so the compiler guesses better the length of inline asm
|
||||
* code and will spill the literal pool early enough to avoid generating PC
|
||||
* relative loads with out of range offsets.
|
||||
*/
|
||||
#define TWICE(x) x x
|
||||
#define SPACE_0x8 TWICE(".space 4\n\t")
|
||||
#define SPACE_0x10 TWICE(SPACE_0x8)
|
||||
#define SPACE_0x20 TWICE(SPACE_0x10)
|
||||
#define SPACE_0x40 TWICE(SPACE_0x20)
|
||||
#define SPACE_0x80 TWICE(SPACE_0x40)
|
||||
#define SPACE_0x100 TWICE(SPACE_0x80)
|
||||
#define SPACE_0x200 TWICE(SPACE_0x100)
|
||||
#define SPACE_0x400 TWICE(SPACE_0x200)
|
||||
#define SPACE_0x800 TWICE(SPACE_0x400)
|
||||
#define SPACE_0x1000 TWICE(SPACE_0x800)
|
||||
|
||||
|
||||
/* Various values used in test cases... */
|
||||
#define N(val) (val ^ 0xffffffff)
|
||||
#define VAL1 0x12345678
|
||||
|
|
|
@ -32,24 +32,6 @@ static atomic_t waiting_for_crash_ipi;
|
|||
|
||||
int machine_kexec_prepare(struct kimage *image)
|
||||
{
|
||||
unsigned long page_list;
|
||||
void *reboot_code_buffer;
|
||||
page_list = image->head & PAGE_MASK;
|
||||
|
||||
reboot_code_buffer = page_address(image->control_code_page);
|
||||
|
||||
/* Prepare parameters for reboot_code_buffer*/
|
||||
kexec_start_address = image->start;
|
||||
kexec_indirection_page = page_list;
|
||||
kexec_mach_type = machine_arch_type;
|
||||
kexec_boot_atags = image->start - KEXEC_ARM_ZIMAGE_OFFSET + KEXEC_ARM_ATAGS_OFFSET;
|
||||
|
||||
/* copy our kernel relocation code to the control code page */
|
||||
memcpy(reboot_code_buffer,
|
||||
relocate_new_kernel, relocate_new_kernel_size);
|
||||
|
||||
flush_icache_range((unsigned long) reboot_code_buffer,
|
||||
(unsigned long) reboot_code_buffer + KEXEC_CONTROL_PAGE_SIZE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -100,14 +82,31 @@ void (*kexec_reinit)(void);
|
|||
|
||||
void machine_kexec(struct kimage *image)
|
||||
{
|
||||
unsigned long page_list;
|
||||
unsigned long reboot_code_buffer_phys;
|
||||
void *reboot_code_buffer;
|
||||
|
||||
|
||||
page_list = image->head & PAGE_MASK;
|
||||
|
||||
/* we need both effective and real address here */
|
||||
reboot_code_buffer_phys =
|
||||
page_to_pfn(image->control_code_page) << PAGE_SHIFT;
|
||||
reboot_code_buffer = page_address(image->control_code_page);
|
||||
|
||||
/* Prepare parameters for reboot_code_buffer*/
|
||||
kexec_start_address = image->start;
|
||||
kexec_indirection_page = page_list;
|
||||
kexec_mach_type = machine_arch_type;
|
||||
kexec_boot_atags = image->start - KEXEC_ARM_ZIMAGE_OFFSET + KEXEC_ARM_ATAGS_OFFSET;
|
||||
|
||||
/* copy our kernel relocation code to the control code page */
|
||||
memcpy(reboot_code_buffer,
|
||||
relocate_new_kernel, relocate_new_kernel_size);
|
||||
|
||||
|
||||
flush_icache_range((unsigned long) reboot_code_buffer,
|
||||
(unsigned long) reboot_code_buffer + KEXEC_CONTROL_PAGE_SIZE);
|
||||
printk(KERN_INFO "Bye!\n");
|
||||
|
||||
if (kexec_reinit)
|
||||
|
|
|
@ -343,8 +343,14 @@ validate_group(struct perf_event *event)
|
|||
{
|
||||
struct perf_event *sibling, *leader = event->group_leader;
|
||||
struct pmu_hw_events fake_pmu;
|
||||
DECLARE_BITMAP(fake_used_mask, ARMPMU_MAX_HWEVENTS);
|
||||
|
||||
memset(&fake_pmu, 0, sizeof(fake_pmu));
|
||||
/*
|
||||
* Initialise the fake PMU. We only need to populate the
|
||||
* used_mask for the purposes of validation.
|
||||
*/
|
||||
memset(fake_used_mask, 0, sizeof(fake_used_mask));
|
||||
fake_pmu.used_mask = fake_used_mask;
|
||||
|
||||
if (!validate_event(&fake_pmu, leader))
|
||||
return -ENOSPC;
|
||||
|
@ -396,6 +402,9 @@ armpmu_reserve_hardware(struct arm_pmu *armpmu)
|
|||
int i, err, irq, irqs;
|
||||
struct platform_device *pmu_device = armpmu->plat_device;
|
||||
|
||||
if (!pmu_device)
|
||||
return -ENODEV;
|
||||
|
||||
err = reserve_pmu(armpmu->type);
|
||||
if (err) {
|
||||
pr_warning("unable to reserve pmu\n");
|
||||
|
|
|
@ -33,3 +33,4 @@ release_pmu(enum arm_pmu_type type)
|
|||
{
|
||||
clear_bit_unlock(type, pmu_lock);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(release_pmu);
|
||||
|
|
|
@ -192,6 +192,9 @@ void cpu_idle(void)
|
|||
#endif
|
||||
|
||||
local_irq_disable();
|
||||
#ifdef CONFIG_PL310_ERRATA_769419
|
||||
wmb();
|
||||
#endif
|
||||
if (hlt_counter) {
|
||||
local_irq_enable();
|
||||
cpu_relax();
|
||||
|
|
|
@ -461,8 +461,10 @@ static void __init setup_processor(void)
|
|||
cpu_name, read_cpuid_id(), read_cpuid_id() & 15,
|
||||
proc_arch[cpu_architecture()], cr_alignment);
|
||||
|
||||
sprintf(init_utsname()->machine, "%s%c", list->arch_name, ENDIANNESS);
|
||||
sprintf(elf_platform, "%s%c", list->elf_name, ENDIANNESS);
|
||||
snprintf(init_utsname()->machine, __NEW_UTS_LEN + 1, "%s%c",
|
||||
list->arch_name, ENDIANNESS);
|
||||
snprintf(elf_platform, ELF_PLATFORM_SIZE, "%s%c",
|
||||
list->elf_name, ENDIANNESS);
|
||||
elf_hwcap = list->elf_hwcap;
|
||||
#ifndef CONFIG_ARM_THUMB
|
||||
elf_hwcap &= ~HWCAP_THUMB;
|
||||
|
|
|
@ -43,7 +43,7 @@
|
|||
|
||||
struct cputopo_arm cpu_topology[NR_CPUS];
|
||||
|
||||
const struct cpumask *cpu_coregroup_mask(unsigned int cpu)
|
||||
const struct cpumask *cpu_coregroup_mask(int cpu)
|
||||
{
|
||||
return &cpu_topology[cpu].core_sibling;
|
||||
}
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
#include <asm/unwind.h>
|
||||
|
||||
#if __LINUX_ARM_ARCH__ >= 6
|
||||
.macro bitop, instr
|
||||
.macro bitop, name, instr
|
||||
ENTRY( \name )
|
||||
UNWIND( .fnstart )
|
||||
ands ip, r1, #3
|
||||
strneb r1, [ip] @ assert word-aligned
|
||||
mov r2, #1
|
||||
|
@ -13,9 +17,13 @@
|
|||
cmp r0, #0
|
||||
bne 1b
|
||||
bx lr
|
||||
UNWIND( .fnend )
|
||||
ENDPROC(\name )
|
||||
.endm
|
||||
|
||||
.macro testop, instr, store
|
||||
.macro testop, name, instr, store
|
||||
ENTRY( \name )
|
||||
UNWIND( .fnstart )
|
||||
ands ip, r1, #3
|
||||
strneb r1, [ip] @ assert word-aligned
|
||||
mov r2, #1
|
||||
|
@ -34,9 +42,13 @@
|
|||
cmp r0, #0
|
||||
movne r0, #1
|
||||
2: bx lr
|
||||
UNWIND( .fnend )
|
||||
ENDPROC(\name )
|
||||
.endm
|
||||
#else
|
||||
.macro bitop, instr
|
||||
.macro bitop, name, instr
|
||||
ENTRY( \name )
|
||||
UNWIND( .fnstart )
|
||||
ands ip, r1, #3
|
||||
strneb r1, [ip] @ assert word-aligned
|
||||
and r2, r0, #31
|
||||
|
@ -49,6 +61,8 @@
|
|||
str r2, [r1, r0, lsl #2]
|
||||
restore_irqs ip
|
||||
mov pc, lr
|
||||
UNWIND( .fnend )
|
||||
ENDPROC(\name )
|
||||
.endm
|
||||
|
||||
/**
|
||||
|
@ -59,7 +73,9 @@
|
|||
* Note: we can trivially conditionalise the store instruction
|
||||
* to avoid dirtying the data cache.
|
||||
*/
|
||||
.macro testop, instr, store
|
||||
.macro testop, name, instr, store
|
||||
ENTRY( \name )
|
||||
UNWIND( .fnstart )
|
||||
ands ip, r1, #3
|
||||
strneb r1, [ip] @ assert word-aligned
|
||||
and r3, r0, #31
|
||||
|
@ -73,5 +89,7 @@
|
|||
moveq r0, #0
|
||||
restore_irqs ip
|
||||
mov pc, lr
|
||||
UNWIND( .fnend )
|
||||
ENDPROC(\name )
|
||||
.endm
|
||||
#endif
|
||||
|
|
|
@ -12,6 +12,4 @@
|
|||
#include "bitops.h"
|
||||
.text
|
||||
|
||||
ENTRY(_change_bit)
|
||||
bitop eor
|
||||
ENDPROC(_change_bit)
|
||||
bitop _change_bit, eor
|
||||
|
|
|
@ -12,6 +12,4 @@
|
|||
#include "bitops.h"
|
||||
.text
|
||||
|
||||
ENTRY(_clear_bit)
|
||||
bitop bic
|
||||
ENDPROC(_clear_bit)
|
||||
bitop _clear_bit, bic
|
||||
|
|
|
@ -12,6 +12,4 @@
|
|||
#include "bitops.h"
|
||||
.text
|
||||
|
||||
ENTRY(_set_bit)
|
||||
bitop orr
|
||||
ENDPROC(_set_bit)
|
||||
bitop _set_bit, orr
|
||||
|
|
|
@ -12,6 +12,4 @@
|
|||
#include "bitops.h"
|
||||
.text
|
||||
|
||||
ENTRY(_test_and_change_bit)
|
||||
testop eor, str
|
||||
ENDPROC(_test_and_change_bit)
|
||||
testop _test_and_change_bit, eor, str
|
||||
|
|
|
@ -12,6 +12,4 @@
|
|||
#include "bitops.h"
|
||||
.text
|
||||
|
||||
ENTRY(_test_and_clear_bit)
|
||||
testop bicne, strne
|
||||
ENDPROC(_test_and_clear_bit)
|
||||
testop _test_and_clear_bit, bicne, strne
|
||||
|
|
|
@ -12,6 +12,4 @@
|
|||
#include "bitops.h"
|
||||
.text
|
||||
|
||||
ENTRY(_test_and_set_bit)
|
||||
testop orreq, streq
|
||||
ENDPROC(_test_and_set_bit)
|
||||
testop _test_and_set_bit, orreq, streq
|
||||
|
|
|
@ -235,7 +235,7 @@ void __init bcmring_init_timer(void)
|
|||
*/
|
||||
bcmring_clocksource_init();
|
||||
|
||||
sp804_clockevents_register(TIMER0_VA_BASE, IRQ_TIMER0, "timer0");
|
||||
sp804_clockevents_init(TIMER0_VA_BASE, IRQ_TIMER0, "timer0");
|
||||
}
|
||||
|
||||
struct sys_timer bcmring_timer = {
|
||||
|
|
|
@ -36,6 +36,7 @@
|
|||
#include <linux/mm.h>
|
||||
#include <linux/pfn.h>
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/sched.h>
|
||||
#include <mach/dma.h>
|
||||
|
||||
/* I don't quite understand why dc4 fails when this is set to 1 and DMA is enabled */
|
||||
|
|
|
@ -12,6 +12,8 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/cpuidle.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/time.h>
|
||||
|
||||
#include <asm/proc-fns.h>
|
||||
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#include <linux/of_irq.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/smp.h>
|
||||
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/unified.h>
|
||||
|
@ -72,6 +73,9 @@ static void __init highbank_map_io(void)
|
|||
|
||||
void highbank_set_cpu_jump(int cpu, void *jump_addr)
|
||||
{
|
||||
#ifdef CONFIG_SMP
|
||||
cpu = cpu_logical_map(cpu);
|
||||
#endif
|
||||
writel(BSYM(virt_to_phys(jump_addr)), HB_JUMP_TABLE_VIRT(cpu));
|
||||
__cpuc_flush_dcache_area(HB_JUMP_TABLE_VIRT(cpu), 16);
|
||||
outer_clean_range(HB_JUMP_TABLE_PHYS(cpu),
|
||||
|
|
|
@ -10,11 +10,6 @@ config HAVE_IMX_MMDC
|
|||
config HAVE_IMX_SRC
|
||||
bool
|
||||
|
||||
#
|
||||
# ARCH_MX31 and ARCH_MX35 are left for compatibility
|
||||
# Some usages assume that having one of them implies not having (e.g.) ARCH_MX2.
|
||||
# To easily distinguish good and reviewed from unreviewed usages new (and IMHO
|
||||
# more sensible) names are used: SOC_IMX31 and SOC_IMX35
|
||||
config ARCH_MX1
|
||||
bool
|
||||
|
||||
|
@ -27,12 +22,6 @@ config ARCH_MX25
|
|||
config MACH_MX27
|
||||
bool
|
||||
|
||||
config ARCH_MX31
|
||||
bool
|
||||
|
||||
config ARCH_MX35
|
||||
bool
|
||||
|
||||
config SOC_IMX1
|
||||
bool
|
||||
select ARCH_MX1
|
||||
|
@ -72,7 +61,6 @@ config SOC_IMX31
|
|||
select CPU_V6
|
||||
select IMX_HAVE_PLATFORM_MXC_RNGA
|
||||
select ARCH_MXC_AUDMUX_V2
|
||||
select ARCH_MX31
|
||||
select MXC_AVIC
|
||||
select SMP_ON_UP if SMP
|
||||
|
||||
|
@ -82,7 +70,6 @@ config SOC_IMX35
|
|||
select ARCH_MXC_IOMUX_V3
|
||||
select ARCH_MXC_AUDMUX_V2
|
||||
select HAVE_EPIT
|
||||
select ARCH_MX35
|
||||
select MXC_AVIC
|
||||
select SMP_ON_UP if SMP
|
||||
|
||||
|
|
|
@ -1953,14 +1953,17 @@ static struct map_desc imx6q_clock_desc[] = {
|
|||
imx_map_entry(MX6Q, ANATOP, MT_DEVICE),
|
||||
};
|
||||
|
||||
void __init imx6q_clock_map_io(void)
|
||||
{
|
||||
iotable_init(imx6q_clock_desc, ARRAY_SIZE(imx6q_clock_desc));
|
||||
}
|
||||
|
||||
int __init mx6q_clocks_init(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
void __iomem *base;
|
||||
int i, irq;
|
||||
|
||||
iotable_init(imx6q_clock_desc, ARRAY_SIZE(imx6q_clock_desc));
|
||||
|
||||
/* retrieve the freqency of fixed clocks from device tree */
|
||||
for_each_compatible_node(np, NULL, "fixed-clock") {
|
||||
u32 rate;
|
||||
|
|
|
@ -34,6 +34,7 @@ static void __init imx6q_map_io(void)
|
|||
{
|
||||
imx_lluart_map_io();
|
||||
imx_scu_map_io();
|
||||
imx6q_clock_map_io();
|
||||
}
|
||||
|
||||
static void __init imx6q_gpio_add_irq_domain(struct device_node *np,
|
||||
|
|
|
@ -33,29 +33,32 @@
|
|||
static void imx3_idle(void)
|
||||
{
|
||||
unsigned long reg = 0;
|
||||
__asm__ __volatile__(
|
||||
/* disable I and D cache */
|
||||
"mrc p15, 0, %0, c1, c0, 0\n"
|
||||
"bic %0, %0, #0x00001000\n"
|
||||
"bic %0, %0, #0x00000004\n"
|
||||
"mcr p15, 0, %0, c1, c0, 0\n"
|
||||
/* invalidate I cache */
|
||||
"mov %0, #0\n"
|
||||
"mcr p15, 0, %0, c7, c5, 0\n"
|
||||
/* clear and invalidate D cache */
|
||||
"mov %0, #0\n"
|
||||
"mcr p15, 0, %0, c7, c14, 0\n"
|
||||
/* WFI */
|
||||
"mov %0, #0\n"
|
||||
"mcr p15, 0, %0, c7, c0, 4\n"
|
||||
"nop\n" "nop\n" "nop\n" "nop\n"
|
||||
"nop\n" "nop\n" "nop\n"
|
||||
/* enable I and D cache */
|
||||
"mrc p15, 0, %0, c1, c0, 0\n"
|
||||
"orr %0, %0, #0x00001000\n"
|
||||
"orr %0, %0, #0x00000004\n"
|
||||
"mcr p15, 0, %0, c1, c0, 0\n"
|
||||
: "=r" (reg));
|
||||
|
||||
if (!need_resched())
|
||||
__asm__ __volatile__(
|
||||
/* disable I and D cache */
|
||||
"mrc p15, 0, %0, c1, c0, 0\n"
|
||||
"bic %0, %0, #0x00001000\n"
|
||||
"bic %0, %0, #0x00000004\n"
|
||||
"mcr p15, 0, %0, c1, c0, 0\n"
|
||||
/* invalidate I cache */
|
||||
"mov %0, #0\n"
|
||||
"mcr p15, 0, %0, c7, c5, 0\n"
|
||||
/* clear and invalidate D cache */
|
||||
"mov %0, #0\n"
|
||||
"mcr p15, 0, %0, c7, c14, 0\n"
|
||||
/* WFI */
|
||||
"mov %0, #0\n"
|
||||
"mcr p15, 0, %0, c7, c0, 4\n"
|
||||
"nop\n" "nop\n" "nop\n" "nop\n"
|
||||
"nop\n" "nop\n" "nop\n"
|
||||
/* enable I and D cache */
|
||||
"mrc p15, 0, %0, c1, c0, 0\n"
|
||||
"orr %0, %0, #0x00001000\n"
|
||||
"orr %0, %0, #0x00000004\n"
|
||||
"mcr p15, 0, %0, c1, c0, 0\n"
|
||||
: "=r" (reg));
|
||||
local_irq_enable();
|
||||
}
|
||||
|
||||
static void __iomem *imx3_ioremap(unsigned long phys_addr, size_t size,
|
||||
|
@ -108,6 +111,7 @@ void imx3_init_l2x0(void)
|
|||
l2x0_init(l2x0_base, 0x00030024, 0x00000000);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SOC_IMX31
|
||||
static struct map_desc mx31_io_desc[] __initdata = {
|
||||
imx_map_entry(MX31, X_MEMC, MT_DEVICE),
|
||||
imx_map_entry(MX31, AVIC, MT_DEVICE_NONSHARED),
|
||||
|
@ -126,33 +130,11 @@ void __init mx31_map_io(void)
|
|||
iotable_init(mx31_io_desc, ARRAY_SIZE(mx31_io_desc));
|
||||
}
|
||||
|
||||
static struct map_desc mx35_io_desc[] __initdata = {
|
||||
imx_map_entry(MX35, X_MEMC, MT_DEVICE),
|
||||
imx_map_entry(MX35, AVIC, MT_DEVICE_NONSHARED),
|
||||
imx_map_entry(MX35, AIPS1, MT_DEVICE_NONSHARED),
|
||||
imx_map_entry(MX35, AIPS2, MT_DEVICE_NONSHARED),
|
||||
imx_map_entry(MX35, SPBA0, MT_DEVICE_NONSHARED),
|
||||
};
|
||||
|
||||
void __init mx35_map_io(void)
|
||||
{
|
||||
iotable_init(mx35_io_desc, ARRAY_SIZE(mx35_io_desc));
|
||||
}
|
||||
|
||||
void __init imx31_init_early(void)
|
||||
{
|
||||
mxc_set_cpu_type(MXC_CPU_MX31);
|
||||
mxc_arch_reset_init(MX31_IO_ADDRESS(MX31_WDOG_BASE_ADDR));
|
||||
imx_idle = imx3_idle;
|
||||
imx_ioremap = imx3_ioremap;
|
||||
}
|
||||
|
||||
void __init imx35_init_early(void)
|
||||
{
|
||||
mxc_set_cpu_type(MXC_CPU_MX35);
|
||||
mxc_iomux_v3_init(MX35_IO_ADDRESS(MX35_IOMUXC_BASE_ADDR));
|
||||
mxc_arch_reset_init(MX35_IO_ADDRESS(MX35_WDOG_BASE_ADDR));
|
||||
imx_idle = imx3_idle;
|
||||
pm_idle = imx3_idle;
|
||||
imx_ioremap = imx3_ioremap;
|
||||
}
|
||||
|
||||
|
@ -161,11 +143,6 @@ void __init mx31_init_irq(void)
|
|||
mxc_init_irq(MX31_IO_ADDRESS(MX31_AVIC_BASE_ADDR));
|
||||
}
|
||||
|
||||
void __init mx35_init_irq(void)
|
||||
{
|
||||
mxc_init_irq(MX35_IO_ADDRESS(MX35_AVIC_BASE_ADDR));
|
||||
}
|
||||
|
||||
static struct sdma_script_start_addrs imx31_to1_sdma_script __initdata = {
|
||||
.per_2_per_addr = 1677,
|
||||
};
|
||||
|
@ -199,6 +176,35 @@ void __init imx31_soc_init(void)
|
|||
|
||||
imx_add_imx_sdma("imx31-sdma", MX31_SDMA_BASE_ADDR, MX31_INT_SDMA, &imx31_sdma_pdata);
|
||||
}
|
||||
#endif /* ifdef CONFIG_SOC_IMX31 */
|
||||
|
||||
#ifdef CONFIG_SOC_IMX35
|
||||
static struct map_desc mx35_io_desc[] __initdata = {
|
||||
imx_map_entry(MX35, X_MEMC, MT_DEVICE),
|
||||
imx_map_entry(MX35, AVIC, MT_DEVICE_NONSHARED),
|
||||
imx_map_entry(MX35, AIPS1, MT_DEVICE_NONSHARED),
|
||||
imx_map_entry(MX35, AIPS2, MT_DEVICE_NONSHARED),
|
||||
imx_map_entry(MX35, SPBA0, MT_DEVICE_NONSHARED),
|
||||
};
|
||||
|
||||
void __init mx35_map_io(void)
|
||||
{
|
||||
iotable_init(mx35_io_desc, ARRAY_SIZE(mx35_io_desc));
|
||||
}
|
||||
|
||||
void __init imx35_init_early(void)
|
||||
{
|
||||
mxc_set_cpu_type(MXC_CPU_MX35);
|
||||
mxc_iomux_v3_init(MX35_IO_ADDRESS(MX35_IOMUXC_BASE_ADDR));
|
||||
mxc_arch_reset_init(MX35_IO_ADDRESS(MX35_WDOG_BASE_ADDR));
|
||||
pm_idle = imx3_idle;
|
||||
imx_ioremap = imx3_ioremap;
|
||||
}
|
||||
|
||||
void __init mx35_init_irq(void)
|
||||
{
|
||||
mxc_init_irq(MX35_IO_ADDRESS(MX35_AVIC_BASE_ADDR));
|
||||
}
|
||||
|
||||
static struct sdma_script_start_addrs imx35_to1_sdma_script __initdata = {
|
||||
.ap_2_ap_addr = 642,
|
||||
|
@ -254,3 +260,4 @@ void __init imx35_soc_init(void)
|
|||
|
||||
imx_add_imx_sdma("imx35-sdma", MX35_SDMA_BASE_ADDR, MX35_INT_SDMA, &imx35_sdma_pdata);
|
||||
}
|
||||
#endif /* ifdef CONFIG_SOC_IMX35 */
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include <linux/io.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/smp.h>
|
||||
#include <asm/unified.h>
|
||||
|
||||
#define SRC_SCR 0x000
|
||||
|
@ -23,10 +24,15 @@
|
|||
|
||||
static void __iomem *src_base;
|
||||
|
||||
#ifndef CONFIG_SMP
|
||||
#define cpu_logical_map(cpu) 0
|
||||
#endif
|
||||
|
||||
void imx_enable_cpu(int cpu, bool enable)
|
||||
{
|
||||
u32 mask, val;
|
||||
|
||||
cpu = cpu_logical_map(cpu);
|
||||
mask = 1 << (BP_SRC_SCR_CORE1_ENABLE + cpu - 1);
|
||||
val = readl_relaxed(src_base + SRC_SCR);
|
||||
val = enable ? val | mask : val & ~mask;
|
||||
|
@ -35,6 +41,7 @@ void imx_enable_cpu(int cpu, bool enable)
|
|||
|
||||
void imx_set_cpu_jump(int cpu, void *jump_addr)
|
||||
{
|
||||
cpu = cpu_logical_map(cpu);
|
||||
writel_relaxed(BSYM(virt_to_phys(jump_addr)),
|
||||
src_base + SRC_GPR1 + cpu * 8);
|
||||
}
|
||||
|
|
|
@ -182,7 +182,7 @@ static void __init gplugd_init(void)
|
|||
|
||||
/* on-chip devices */
|
||||
pxa168_add_uart(3);
|
||||
pxa168_add_ssp(0);
|
||||
pxa168_add_ssp(1);
|
||||
pxa168_add_twsi(0, NULL, ARRAY_AND_SIZE(gplugd_i2c_board_info));
|
||||
|
||||
pxa168_add_eth(&gplugd_eth_platform_data);
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
#define GPIO_REGS_VIRT (APB_VIRT_BASE + 0x19000)
|
||||
|
||||
#define BANK_OFF(n) (((n) < 3) ? (n) << 2 : 0x100 + (((n) - 3) << 2))
|
||||
#define GPIO_REG(x) (GPIO_REGS_VIRT + (x))
|
||||
#define GPIO_REG(x) (*(volatile u32 *)(GPIO_REGS_VIRT + (x)))
|
||||
|
||||
#define NR_BUILTIN_GPIO IRQ_GPIO_NUM
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/io.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
static int mx5_cpu_rev = -1;
|
||||
|
||||
|
@ -67,7 +67,8 @@ static int __init mx51_neon_fixup(void)
|
|||
if (!cpu_is_mx51())
|
||||
return 0;
|
||||
|
||||
if (mx51_revision() < IMX_CHIP_REVISION_3_0 && (elf_hwcap & HWCAP_NEON)) {
|
||||
if (mx51_revision() < IMX_CHIP_REVISION_3_0 &&
|
||||
(elf_hwcap & HWCAP_NEON)) {
|
||||
elf_hwcap &= ~HWCAP_NEON;
|
||||
pr_info("Turning off NEON support, detected broken NEON implementation\n");
|
||||
}
|
||||
|
|
|
@ -23,7 +23,9 @@
|
|||
|
||||
static void imx5_idle(void)
|
||||
{
|
||||
mx5_cpu_lp_set(WAIT_UNCLOCKED_POWER_OFF);
|
||||
if (!need_resched())
|
||||
mx5_cpu_lp_set(WAIT_UNCLOCKED_POWER_OFF);
|
||||
local_irq_enable();
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -89,7 +91,7 @@ void __init imx51_init_early(void)
|
|||
mxc_set_cpu_type(MXC_CPU_MX51);
|
||||
mxc_iomux_v3_init(MX51_IO_ADDRESS(MX51_IOMUXC_BASE_ADDR));
|
||||
mxc_arch_reset_init(MX51_IO_ADDRESS(MX51_WDOG1_BASE_ADDR));
|
||||
imx_idle = imx5_idle;
|
||||
pm_idle = imx5_idle;
|
||||
}
|
||||
|
||||
void __init imx53_init_early(void)
|
||||
|
|
|
@ -404,7 +404,7 @@ static int name##_set_rate(struct clk *clk, unsigned long rate) \
|
|||
reg = __raw_readl(CLKCTRL_BASE_ADDR + HW_CLKCTRL_##dr); \
|
||||
reg &= ~BM_CLKCTRL_##dr##_DIV; \
|
||||
reg |= div << BP_CLKCTRL_##dr##_DIV; \
|
||||
if (reg | (1 << clk->enable_shift)) { \
|
||||
if (reg & (1 << clk->enable_shift)) { \
|
||||
pr_err("%s: clock is gated\n", __func__); \
|
||||
return -EINVAL; \
|
||||
} \
|
||||
|
|
|
@ -171,14 +171,6 @@ config MACH_OMAP_GENERIC
|
|||
comment "OMAP CPU Speed"
|
||||
depends on ARCH_OMAP1
|
||||
|
||||
config OMAP_CLOCKS_SET_BY_BOOTLOADER
|
||||
bool "OMAP clocks set by bootloader"
|
||||
depends on ARCH_OMAP1
|
||||
help
|
||||
Enable this option to prevent the kernel from overriding the clock
|
||||
frequencies programmed by bootloader for MPU, DSP, MMUs, TC,
|
||||
internal LCD controller and MPU peripherals.
|
||||
|
||||
config OMAP_ARM_216MHZ
|
||||
bool "OMAP ARM 216 MHz CPU (1710 only)"
|
||||
depends on ARCH_OMAP1 && ARCH_OMAP16XX
|
||||
|
|
|
@ -302,8 +302,6 @@ static void __init ams_delta_init(void)
|
|||
omap_cfg_reg(J19_1610_CAM_D6);
|
||||
omap_cfg_reg(J18_1610_CAM_D7);
|
||||
|
||||
iotable_init(ams_delta_io_desc, ARRAY_SIZE(ams_delta_io_desc));
|
||||
|
||||
omap_board_config = ams_delta_config;
|
||||
omap_board_config_size = ARRAY_SIZE(ams_delta_config);
|
||||
omap_serial_init();
|
||||
|
@ -373,10 +371,16 @@ static int __init ams_delta_modem_init(void)
|
|||
}
|
||||
arch_initcall(ams_delta_modem_init);
|
||||
|
||||
static void __init ams_delta_map_io(void)
|
||||
{
|
||||
omap15xx_map_io();
|
||||
iotable_init(ams_delta_io_desc, ARRAY_SIZE(ams_delta_io_desc));
|
||||
}
|
||||
|
||||
MACHINE_START(AMS_DELTA, "Amstrad E3 (Delta)")
|
||||
/* Maintainer: Jonathan McDowell <noodles@earth.li> */
|
||||
.atag_offset = 0x100,
|
||||
.map_io = omap15xx_map_io,
|
||||
.map_io = ams_delta_map_io,
|
||||
.init_early = omap1_init_early,
|
||||
.reserve = omap_reserve,
|
||||
.init_irq = omap1_init_irq,
|
||||
|
|
|
@ -17,7 +17,8 @@
|
|||
|
||||
#include <plat/clock.h>
|
||||
|
||||
extern int __init omap1_clk_init(void);
|
||||
int omap1_clk_init(void);
|
||||
void omap1_clk_late_init(void);
|
||||
extern int omap1_clk_enable(struct clk *clk);
|
||||
extern void omap1_clk_disable(struct clk *clk);
|
||||
extern long omap1_clk_round_rate(struct clk *clk, unsigned long rate);
|
||||
|
|
|
@ -767,6 +767,15 @@ static struct clk_functions omap1_clk_functions = {
|
|||
.clk_disable_unused = omap1_clk_disable_unused,
|
||||
};
|
||||
|
||||
static void __init omap1_show_rates(void)
|
||||
{
|
||||
pr_notice("Clocking rate (xtal/DPLL1/MPU): "
|
||||
"%ld.%01ld/%ld.%01ld/%ld.%01ld MHz\n",
|
||||
ck_ref.rate / 1000000, (ck_ref.rate / 100000) % 10,
|
||||
ck_dpll1.rate / 1000000, (ck_dpll1.rate / 100000) % 10,
|
||||
arm_ck.rate / 1000000, (arm_ck.rate / 100000) % 10);
|
||||
}
|
||||
|
||||
int __init omap1_clk_init(void)
|
||||
{
|
||||
struct omap_clk *c;
|
||||
|
@ -835,9 +844,12 @@ int __init omap1_clk_init(void)
|
|||
/* We want to be in syncronous scalable mode */
|
||||
omap_writew(0x1000, ARM_SYSST);
|
||||
|
||||
#ifdef CONFIG_OMAP_CLOCKS_SET_BY_BOOTLOADER
|
||||
/* Use values set by bootloader. Determine PLL rate and recalculate
|
||||
* dependent clocks as if kernel had changed PLL or divisors.
|
||||
|
||||
/*
|
||||
* Initially use the values set by bootloader. Determine PLL rate and
|
||||
* recalculate dependent clocks as if kernel had changed PLL or
|
||||
* divisors. See also omap1_clk_late_init() that can reprogram dpll1
|
||||
* after the SRAM is initialized.
|
||||
*/
|
||||
{
|
||||
unsigned pll_ctl_val = omap_readw(DPLL_CTL);
|
||||
|
@ -862,25 +874,10 @@ int __init omap1_clk_init(void)
|
|||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
/* Find the highest supported frequency and enable it */
|
||||
if (omap1_select_table_rate(&virtual_ck_mpu, ~0)) {
|
||||
printk(KERN_ERR "System frequencies not set. Check your config.\n");
|
||||
/* Guess sane values (60MHz) */
|
||||
omap_writew(0x2290, DPLL_CTL);
|
||||
omap_writew(cpu_is_omap7xx() ? 0x3005 : 0x1005, ARM_CKCTL);
|
||||
ck_dpll1.rate = 60000000;
|
||||
}
|
||||
#endif
|
||||
propagate_rate(&ck_dpll1);
|
||||
/* Cache rates for clocks connected to ck_ref (not dpll1) */
|
||||
propagate_rate(&ck_ref);
|
||||
printk(KERN_INFO "Clocking rate (xtal/DPLL1/MPU): "
|
||||
"%ld.%01ld/%ld.%01ld/%ld.%01ld MHz\n",
|
||||
ck_ref.rate / 1000000, (ck_ref.rate / 100000) % 10,
|
||||
ck_dpll1.rate / 1000000, (ck_dpll1.rate / 100000) % 10,
|
||||
arm_ck.rate / 1000000, (arm_ck.rate / 100000) % 10);
|
||||
|
||||
omap1_show_rates();
|
||||
if (machine_is_omap_perseus2() || machine_is_omap_fsample()) {
|
||||
/* Select slicer output as OMAP input clock */
|
||||
omap_writew(omap_readw(OMAP7XX_PCC_UPLD_CTRL) & ~0x1,
|
||||
|
@ -925,3 +922,21 @@ int __init omap1_clk_init(void)
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define OMAP1_DPLL1_SANE_VALUE 60000000
|
||||
|
||||
void __init omap1_clk_late_init(void)
|
||||
{
|
||||
if (ck_dpll1.rate >= OMAP1_DPLL1_SANE_VALUE)
|
||||
return;
|
||||
|
||||
/* Find the highest supported frequency and enable it */
|
||||
if (omap1_select_table_rate(&virtual_ck_mpu, ~0)) {
|
||||
pr_err("System frequencies not set, using default. Check your config.\n");
|
||||
omap_writew(0x2290, DPLL_CTL);
|
||||
omap_writew(cpu_is_omap7xx() ? 0x3005 : 0x1005, ARM_CKCTL);
|
||||
ck_dpll1.rate = OMAP1_DPLL1_SANE_VALUE;
|
||||
}
|
||||
propagate_rate(&ck_dpll1);
|
||||
omap1_show_rates();
|
||||
}
|
||||
|
|
|
@ -30,6 +30,8 @@
|
|||
#include <plat/omap7xx.h>
|
||||
#include <plat/mcbsp.h>
|
||||
|
||||
#include "clock.h"
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
#if defined(CONFIG_RTC_DRV_OMAP) || defined(CONFIG_RTC_DRV_OMAP_MODULE)
|
||||
|
@ -293,6 +295,7 @@ static int __init omap1_init_devices(void)
|
|||
return -ENODEV;
|
||||
|
||||
omap_sram_init();
|
||||
omap1_clk_late_init();
|
||||
|
||||
/* please keep these calls, and their implementations above,
|
||||
* in alphabetical order so they're easier to sort through.
|
||||
|
|
|
@ -334,6 +334,7 @@ config MACH_OMAP4_PANDA
|
|||
config OMAP3_EMU
|
||||
bool "OMAP3 debugging peripherals"
|
||||
depends on ARCH_OMAP3
|
||||
select ARM_AMBA
|
||||
select OC_ETM
|
||||
help
|
||||
Say Y here to enable debugging hardware of omap3
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
# Common support
|
||||
obj-y := id.o io.o control.o mux.o devices.o serial.o gpmc.o timer.o pm.o \
|
||||
common.o gpio.o dma.o wd_timer.o
|
||||
common.o gpio.o dma.o wd_timer.o display.o
|
||||
|
||||
omap-2-3-common = irq.o sdrc.o
|
||||
hwmod-common = omap_hwmod.o \
|
||||
|
@ -264,7 +264,4 @@ smsc911x-$(CONFIG_SMSC911X) := gpmc-smsc911x.o
|
|||
obj-y += $(smsc911x-m) $(smsc911x-y)
|
||||
obj-$(CONFIG_ARCH_OMAP4) += hwspinlock.o
|
||||
|
||||
disp-$(CONFIG_OMAP2_DSS) := display.o
|
||||
obj-y += $(disp-m) $(disp-y)
|
||||
|
||||
obj-y += common-board-devices.o twl-common.o
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
|
||||
#include <linux/sched.h>
|
||||
#include <linux/cpuidle.h>
|
||||
#include <linux/export.h>
|
||||
|
||||
#include <plat/prcm.h>
|
||||
#include <plat/irqs.h>
|
||||
|
|
|
@ -27,8 +27,35 @@
|
|||
#include <plat/omap_hwmod.h>
|
||||
#include <plat/omap_device.h>
|
||||
#include <plat/omap-pm.h>
|
||||
#include <plat/common.h>
|
||||
|
||||
#include "control.h"
|
||||
#include "display.h"
|
||||
|
||||
#define DISPC_CONTROL 0x0040
|
||||
#define DISPC_CONTROL2 0x0238
|
||||
#define DISPC_IRQSTATUS 0x0018
|
||||
|
||||
#define DSS_SYSCONFIG 0x10
|
||||
#define DSS_SYSSTATUS 0x14
|
||||
#define DSS_CONTROL 0x40
|
||||
#define DSS_SDI_CONTROL 0x44
|
||||
#define DSS_PLL_CONTROL 0x48
|
||||
|
||||
#define LCD_EN_MASK (0x1 << 0)
|
||||
#define DIGIT_EN_MASK (0x1 << 1)
|
||||
|
||||
#define FRAMEDONE_IRQ_SHIFT 0
|
||||
#define EVSYNC_EVEN_IRQ_SHIFT 2
|
||||
#define EVSYNC_ODD_IRQ_SHIFT 3
|
||||
#define FRAMEDONE2_IRQ_SHIFT 22
|
||||
#define FRAMEDONETV_IRQ_SHIFT 24
|
||||
|
||||
/*
|
||||
* FRAMEDONE_IRQ_TIMEOUT: how long (in milliseconds) to wait during DISPC
|
||||
* reset before deciding that something has gone wrong
|
||||
*/
|
||||
#define FRAMEDONE_IRQ_TIMEOUT 100
|
||||
|
||||
static struct platform_device omap_display_device = {
|
||||
.name = "omapdss",
|
||||
|
@ -172,3 +199,135 @@ int __init omap_display_init(struct omap_dss_board_info *board_data)
|
|||
|
||||
return r;
|
||||
}
|
||||
|
||||
static void dispc_disable_outputs(void)
|
||||
{
|
||||
u32 v, irq_mask = 0;
|
||||
bool lcd_en, digit_en, lcd2_en = false;
|
||||
int i;
|
||||
struct omap_dss_dispc_dev_attr *da;
|
||||
struct omap_hwmod *oh;
|
||||
|
||||
oh = omap_hwmod_lookup("dss_dispc");
|
||||
if (!oh) {
|
||||
WARN(1, "display: could not disable outputs during reset - could not find dss_dispc hwmod\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!oh->dev_attr) {
|
||||
pr_err("display: could not disable outputs during reset due to missing dev_attr\n");
|
||||
return;
|
||||
}
|
||||
|
||||
da = (struct omap_dss_dispc_dev_attr *)oh->dev_attr;
|
||||
|
||||
/* store value of LCDENABLE and DIGITENABLE bits */
|
||||
v = omap_hwmod_read(oh, DISPC_CONTROL);
|
||||
lcd_en = v & LCD_EN_MASK;
|
||||
digit_en = v & DIGIT_EN_MASK;
|
||||
|
||||
/* store value of LCDENABLE for LCD2 */
|
||||
if (da->manager_count > 2) {
|
||||
v = omap_hwmod_read(oh, DISPC_CONTROL2);
|
||||
lcd2_en = v & LCD_EN_MASK;
|
||||
}
|
||||
|
||||
if (!(lcd_en | digit_en | lcd2_en))
|
||||
return; /* no managers currently enabled */
|
||||
|
||||
/*
|
||||
* If any manager was enabled, we need to disable it before
|
||||
* DSS clocks are disabled or DISPC module is reset
|
||||
*/
|
||||
if (lcd_en)
|
||||
irq_mask |= 1 << FRAMEDONE_IRQ_SHIFT;
|
||||
|
||||
if (digit_en) {
|
||||
if (da->has_framedonetv_irq) {
|
||||
irq_mask |= 1 << FRAMEDONETV_IRQ_SHIFT;
|
||||
} else {
|
||||
irq_mask |= 1 << EVSYNC_EVEN_IRQ_SHIFT |
|
||||
1 << EVSYNC_ODD_IRQ_SHIFT;
|
||||
}
|
||||
}
|
||||
|
||||
if (lcd2_en)
|
||||
irq_mask |= 1 << FRAMEDONE2_IRQ_SHIFT;
|
||||
|
||||
/*
|
||||
* clear any previous FRAMEDONE, FRAMEDONETV,
|
||||
* EVSYNC_EVEN/ODD or FRAMEDONE2 interrupts
|
||||
*/
|
||||
omap_hwmod_write(irq_mask, oh, DISPC_IRQSTATUS);
|
||||
|
||||
/* disable LCD and TV managers */
|
||||
v = omap_hwmod_read(oh, DISPC_CONTROL);
|
||||
v &= ~(LCD_EN_MASK | DIGIT_EN_MASK);
|
||||
omap_hwmod_write(v, oh, DISPC_CONTROL);
|
||||
|
||||
/* disable LCD2 manager */
|
||||
if (da->manager_count > 2) {
|
||||
v = omap_hwmod_read(oh, DISPC_CONTROL2);
|
||||
v &= ~LCD_EN_MASK;
|
||||
omap_hwmod_write(v, oh, DISPC_CONTROL2);
|
||||
}
|
||||
|
||||
i = 0;
|
||||
while ((omap_hwmod_read(oh, DISPC_IRQSTATUS) & irq_mask) !=
|
||||
irq_mask) {
|
||||
i++;
|
||||
if (i > FRAMEDONE_IRQ_TIMEOUT) {
|
||||
pr_err("didn't get FRAMEDONE1/2 or TV interrupt\n");
|
||||
break;
|
||||
}
|
||||
mdelay(1);
|
||||
}
|
||||
}
|
||||
|
||||
#define MAX_MODULE_SOFTRESET_WAIT 10000
|
||||
int omap_dss_reset(struct omap_hwmod *oh)
|
||||
{
|
||||
struct omap_hwmod_opt_clk *oc;
|
||||
int c = 0;
|
||||
int i, r;
|
||||
|
||||
if (!(oh->class->sysc->sysc_flags & SYSS_HAS_RESET_STATUS)) {
|
||||
pr_err("dss_core: hwmod data doesn't contain reset data\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++)
|
||||
if (oc->_clk)
|
||||
clk_enable(oc->_clk);
|
||||
|
||||
dispc_disable_outputs();
|
||||
|
||||
/* clear SDI registers */
|
||||
if (cpu_is_omap3430()) {
|
||||
omap_hwmod_write(0x0, oh, DSS_SDI_CONTROL);
|
||||
omap_hwmod_write(0x0, oh, DSS_PLL_CONTROL);
|
||||
}
|
||||
|
||||
/*
|
||||
* clear DSS_CONTROL register to switch DSS clock sources to
|
||||
* PRCM clock, if any
|
||||
*/
|
||||
omap_hwmod_write(0x0, oh, DSS_CONTROL);
|
||||
|
||||
omap_test_timeout((omap_hwmod_read(oh, oh->class->sysc->syss_offs)
|
||||
& SYSS_RESETDONE_MASK),
|
||||
MAX_MODULE_SOFTRESET_WAIT, c);
|
||||
|
||||
if (c == MAX_MODULE_SOFTRESET_WAIT)
|
||||
pr_warning("dss_core: waiting for reset to finish failed\n");
|
||||
else
|
||||
pr_debug("dss_core: softreset done\n");
|
||||
|
||||
for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++)
|
||||
if (oc->_clk)
|
||||
clk_disable(oc->_clk);
|
||||
|
||||
r = (c == MAX_MODULE_SOFTRESET_WAIT) ? -ETIMEDOUT : 0;
|
||||
|
||||
return r;
|
||||
}
|
||||
|
|
29
arch/arm/mach-omap2/display.h
Normal file
29
arch/arm/mach-omap2/display.h
Normal file
|
@ -0,0 +1,29 @@
|
|||
/*
|
||||
* display.h - OMAP2+ integration-specific DSS header
|
||||
*
|
||||
* Copyright (C) 2011 Texas Instruments, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __ARCH_ARM_MACH_OMAP2_DISPLAY_H
|
||||
#define __ARCH_ARM_MACH_OMAP2_DISPLAY_H
|
||||
|
||||
#include <linux/kernel.h>
|
||||
|
||||
struct omap_dss_dispc_dev_attr {
|
||||
u8 manager_count;
|
||||
bool has_framedonetv_irq;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -749,7 +749,7 @@ static int _count_mpu_irqs(struct omap_hwmod *oh)
|
|||
ohii = &oh->mpu_irqs[i++];
|
||||
} while (ohii->irq != -1);
|
||||
|
||||
return i;
|
||||
return i-1;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -772,7 +772,7 @@ static int _count_sdma_reqs(struct omap_hwmod *oh)
|
|||
ohdi = &oh->sdma_reqs[i++];
|
||||
} while (ohdi->dma_req != -1);
|
||||
|
||||
return i;
|
||||
return i-1;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -795,7 +795,7 @@ static int _count_ocp_if_addr_spaces(struct omap_hwmod_ocp_if *os)
|
|||
mem = &os->addr[i++];
|
||||
} while (mem->pa_start != mem->pa_end);
|
||||
|
||||
return i;
|
||||
return i-1;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -875,6 +875,10 @@ static struct omap_hwmod_ocp_if *omap2420_dss_slaves[] = {
|
|||
};
|
||||
|
||||
static struct omap_hwmod_opt_clk dss_opt_clks[] = {
|
||||
/*
|
||||
* The DSS HW needs all DSS clocks enabled during reset. The dss_core
|
||||
* driver does not use these clocks.
|
||||
*/
|
||||
{ .role = "tv_clk", .clk = "dss_54m_fck" },
|
||||
{ .role = "sys_clk", .clk = "dss2_fck" },
|
||||
};
|
||||
|
@ -899,7 +903,7 @@ static struct omap_hwmod omap2420_dss_core_hwmod = {
|
|||
.slaves_cnt = ARRAY_SIZE(omap2420_dss_slaves),
|
||||
.masters = omap2420_dss_masters,
|
||||
.masters_cnt = ARRAY_SIZE(omap2420_dss_masters),
|
||||
.flags = HWMOD_NO_IDLEST,
|
||||
.flags = HWMOD_NO_IDLEST | HWMOD_CONTROL_OPT_CLKS_IN_RESET,
|
||||
};
|
||||
|
||||
/* l4_core -> dss_dispc */
|
||||
|
@ -939,6 +943,7 @@ static struct omap_hwmod omap2420_dss_dispc_hwmod = {
|
|||
.slaves = omap2420_dss_dispc_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2420_dss_dispc_slaves),
|
||||
.flags = HWMOD_NO_IDLEST,
|
||||
.dev_attr = &omap2_3_dss_dispc_dev_attr
|
||||
};
|
||||
|
||||
/* l4_core -> dss_rfbi */
|
||||
|
@ -961,6 +966,10 @@ static struct omap_hwmod_ocp_if *omap2420_dss_rfbi_slaves[] = {
|
|||
&omap2420_l4_core__dss_rfbi,
|
||||
};
|
||||
|
||||
static struct omap_hwmod_opt_clk dss_rfbi_opt_clks[] = {
|
||||
{ .role = "ick", .clk = "dss_ick" },
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap2420_dss_rfbi_hwmod = {
|
||||
.name = "dss_rfbi",
|
||||
.class = &omap2_rfbi_hwmod_class,
|
||||
|
@ -972,6 +981,8 @@ static struct omap_hwmod omap2420_dss_rfbi_hwmod = {
|
|||
.module_offs = CORE_MOD,
|
||||
},
|
||||
},
|
||||
.opt_clks = dss_rfbi_opt_clks,
|
||||
.opt_clks_cnt = ARRAY_SIZE(dss_rfbi_opt_clks),
|
||||
.slaves = omap2420_dss_rfbi_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2420_dss_rfbi_slaves),
|
||||
.flags = HWMOD_NO_IDLEST,
|
||||
|
@ -981,7 +992,7 @@ static struct omap_hwmod omap2420_dss_rfbi_hwmod = {
|
|||
static struct omap_hwmod_ocp_if omap2420_l4_core__dss_venc = {
|
||||
.master = &omap2420_l4_core_hwmod,
|
||||
.slave = &omap2420_dss_venc_hwmod,
|
||||
.clk = "dss_54m_fck",
|
||||
.clk = "dss_ick",
|
||||
.addr = omap2_dss_venc_addrs,
|
||||
.fw = {
|
||||
.omap2 = {
|
||||
|
@ -1001,7 +1012,7 @@ static struct omap_hwmod_ocp_if *omap2420_dss_venc_slaves[] = {
|
|||
static struct omap_hwmod omap2420_dss_venc_hwmod = {
|
||||
.name = "dss_venc",
|
||||
.class = &omap2_venc_hwmod_class,
|
||||
.main_clk = "dss1_fck",
|
||||
.main_clk = "dss_54m_fck",
|
||||
.prcm = {
|
||||
.omap2 = {
|
||||
.prcm_reg_id = 1,
|
||||
|
|
|
@ -942,6 +942,10 @@ static struct omap_hwmod_ocp_if *omap2430_dss_slaves[] = {
|
|||
};
|
||||
|
||||
static struct omap_hwmod_opt_clk dss_opt_clks[] = {
|
||||
/*
|
||||
* The DSS HW needs all DSS clocks enabled during reset. The dss_core
|
||||
* driver does not use these clocks.
|
||||
*/
|
||||
{ .role = "tv_clk", .clk = "dss_54m_fck" },
|
||||
{ .role = "sys_clk", .clk = "dss2_fck" },
|
||||
};
|
||||
|
@ -966,7 +970,7 @@ static struct omap_hwmod omap2430_dss_core_hwmod = {
|
|||
.slaves_cnt = ARRAY_SIZE(omap2430_dss_slaves),
|
||||
.masters = omap2430_dss_masters,
|
||||
.masters_cnt = ARRAY_SIZE(omap2430_dss_masters),
|
||||
.flags = HWMOD_NO_IDLEST,
|
||||
.flags = HWMOD_NO_IDLEST | HWMOD_CONTROL_OPT_CLKS_IN_RESET,
|
||||
};
|
||||
|
||||
/* l4_core -> dss_dispc */
|
||||
|
@ -1000,6 +1004,7 @@ static struct omap_hwmod omap2430_dss_dispc_hwmod = {
|
|||
.slaves = omap2430_dss_dispc_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2430_dss_dispc_slaves),
|
||||
.flags = HWMOD_NO_IDLEST,
|
||||
.dev_attr = &omap2_3_dss_dispc_dev_attr
|
||||
};
|
||||
|
||||
/* l4_core -> dss_rfbi */
|
||||
|
@ -1016,6 +1021,10 @@ static struct omap_hwmod_ocp_if *omap2430_dss_rfbi_slaves[] = {
|
|||
&omap2430_l4_core__dss_rfbi,
|
||||
};
|
||||
|
||||
static struct omap_hwmod_opt_clk dss_rfbi_opt_clks[] = {
|
||||
{ .role = "ick", .clk = "dss_ick" },
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap2430_dss_rfbi_hwmod = {
|
||||
.name = "dss_rfbi",
|
||||
.class = &omap2_rfbi_hwmod_class,
|
||||
|
@ -1027,6 +1036,8 @@ static struct omap_hwmod omap2430_dss_rfbi_hwmod = {
|
|||
.module_offs = CORE_MOD,
|
||||
},
|
||||
},
|
||||
.opt_clks = dss_rfbi_opt_clks,
|
||||
.opt_clks_cnt = ARRAY_SIZE(dss_rfbi_opt_clks),
|
||||
.slaves = omap2430_dss_rfbi_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2430_dss_rfbi_slaves),
|
||||
.flags = HWMOD_NO_IDLEST,
|
||||
|
@ -1036,7 +1047,7 @@ static struct omap_hwmod omap2430_dss_rfbi_hwmod = {
|
|||
static struct omap_hwmod_ocp_if omap2430_l4_core__dss_venc = {
|
||||
.master = &omap2430_l4_core_hwmod,
|
||||
.slave = &omap2430_dss_venc_hwmod,
|
||||
.clk = "dss_54m_fck",
|
||||
.clk = "dss_ick",
|
||||
.addr = omap2_dss_venc_addrs,
|
||||
.flags = OCPIF_SWSUP_IDLE,
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
|
@ -1050,7 +1061,7 @@ static struct omap_hwmod_ocp_if *omap2430_dss_venc_slaves[] = {
|
|||
static struct omap_hwmod omap2430_dss_venc_hwmod = {
|
||||
.name = "dss_venc",
|
||||
.class = &omap2_venc_hwmod_class,
|
||||
.main_clk = "dss1_fck",
|
||||
.main_clk = "dss_54m_fck",
|
||||
.prcm = {
|
||||
.omap2 = {
|
||||
.prcm_reg_id = 1,
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include <plat/omap_hwmod.h>
|
||||
#include <plat/serial.h>
|
||||
#include <plat/dma.h>
|
||||
#include <plat/common.h>
|
||||
|
||||
#include <mach/irqs.h>
|
||||
|
||||
|
@ -43,13 +44,15 @@ static struct omap_hwmod_class_sysconfig omap2_dss_sysc = {
|
|||
.rev_offs = 0x0000,
|
||||
.sysc_offs = 0x0010,
|
||||
.syss_offs = 0x0014,
|
||||
.sysc_flags = (SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE),
|
||||
.sysc_flags = (SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE |
|
||||
SYSS_HAS_RESET_STATUS),
|
||||
.sysc_fields = &omap_hwmod_sysc_type1,
|
||||
};
|
||||
|
||||
struct omap_hwmod_class omap2_dss_hwmod_class = {
|
||||
.name = "dss",
|
||||
.sysc = &omap2_dss_sysc,
|
||||
.reset = omap_dss_reset,
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -1369,9 +1369,14 @@ static struct omap_hwmod_ocp_if *omap3xxx_dss_slaves[] = {
|
|||
};
|
||||
|
||||
static struct omap_hwmod_opt_clk dss_opt_clks[] = {
|
||||
{ .role = "tv_clk", .clk = "dss_tv_fck" },
|
||||
{ .role = "video_clk", .clk = "dss_96m_fck" },
|
||||
/*
|
||||
* The DSS HW needs all DSS clocks enabled during reset. The dss_core
|
||||
* driver does not use these clocks.
|
||||
*/
|
||||
{ .role = "sys_clk", .clk = "dss2_alwon_fck" },
|
||||
{ .role = "tv_clk", .clk = "dss_tv_fck" },
|
||||
/* required only on OMAP3430 */
|
||||
{ .role = "tv_dac_clk", .clk = "dss_96m_fck" },
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap3430es1_dss_core_hwmod = {
|
||||
|
@ -1394,11 +1399,12 @@ static struct omap_hwmod omap3430es1_dss_core_hwmod = {
|
|||
.slaves_cnt = ARRAY_SIZE(omap3430es1_dss_slaves),
|
||||
.masters = omap3xxx_dss_masters,
|
||||
.masters_cnt = ARRAY_SIZE(omap3xxx_dss_masters),
|
||||
.flags = HWMOD_NO_IDLEST,
|
||||
.flags = HWMOD_NO_IDLEST | HWMOD_CONTROL_OPT_CLKS_IN_RESET,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap3xxx_dss_core_hwmod = {
|
||||
.name = "dss_core",
|
||||
.flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
|
||||
.class = &omap2_dss_hwmod_class,
|
||||
.main_clk = "dss1_alwon_fck", /* instead of dss_fck */
|
||||
.sdma_reqs = omap3xxx_dss_sdma_chs,
|
||||
|
@ -1456,6 +1462,7 @@ static struct omap_hwmod omap3xxx_dss_dispc_hwmod = {
|
|||
.slaves = omap3xxx_dss_dispc_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap3xxx_dss_dispc_slaves),
|
||||
.flags = HWMOD_NO_IDLEST,
|
||||
.dev_attr = &omap2_3_dss_dispc_dev_attr
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -1486,6 +1493,7 @@ static struct omap_hwmod_addr_space omap3xxx_dss_dsi1_addrs[] = {
|
|||
static struct omap_hwmod_ocp_if omap3xxx_l4_core__dss_dsi1 = {
|
||||
.master = &omap3xxx_l4_core_hwmod,
|
||||
.slave = &omap3xxx_dss_dsi1_hwmod,
|
||||
.clk = "dss_ick",
|
||||
.addr = omap3xxx_dss_dsi1_addrs,
|
||||
.fw = {
|
||||
.omap2 = {
|
||||
|
@ -1502,6 +1510,10 @@ static struct omap_hwmod_ocp_if *omap3xxx_dss_dsi1_slaves[] = {
|
|||
&omap3xxx_l4_core__dss_dsi1,
|
||||
};
|
||||
|
||||
static struct omap_hwmod_opt_clk dss_dsi1_opt_clks[] = {
|
||||
{ .role = "sys_clk", .clk = "dss2_alwon_fck" },
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap3xxx_dss_dsi1_hwmod = {
|
||||
.name = "dss_dsi1",
|
||||
.class = &omap3xxx_dsi_hwmod_class,
|
||||
|
@ -1514,6 +1526,8 @@ static struct omap_hwmod omap3xxx_dss_dsi1_hwmod = {
|
|||
.module_offs = OMAP3430_DSS_MOD,
|
||||
},
|
||||
},
|
||||
.opt_clks = dss_dsi1_opt_clks,
|
||||
.opt_clks_cnt = ARRAY_SIZE(dss_dsi1_opt_clks),
|
||||
.slaves = omap3xxx_dss_dsi1_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap3xxx_dss_dsi1_slaves),
|
||||
.flags = HWMOD_NO_IDLEST,
|
||||
|
@ -1540,6 +1554,10 @@ static struct omap_hwmod_ocp_if *omap3xxx_dss_rfbi_slaves[] = {
|
|||
&omap3xxx_l4_core__dss_rfbi,
|
||||
};
|
||||
|
||||
static struct omap_hwmod_opt_clk dss_rfbi_opt_clks[] = {
|
||||
{ .role = "ick", .clk = "dss_ick" },
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap3xxx_dss_rfbi_hwmod = {
|
||||
.name = "dss_rfbi",
|
||||
.class = &omap2_rfbi_hwmod_class,
|
||||
|
@ -1551,6 +1569,8 @@ static struct omap_hwmod omap3xxx_dss_rfbi_hwmod = {
|
|||
.module_offs = OMAP3430_DSS_MOD,
|
||||
},
|
||||
},
|
||||
.opt_clks = dss_rfbi_opt_clks,
|
||||
.opt_clks_cnt = ARRAY_SIZE(dss_rfbi_opt_clks),
|
||||
.slaves = omap3xxx_dss_rfbi_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap3xxx_dss_rfbi_slaves),
|
||||
.flags = HWMOD_NO_IDLEST,
|
||||
|
@ -1560,7 +1580,7 @@ static struct omap_hwmod omap3xxx_dss_rfbi_hwmod = {
|
|||
static struct omap_hwmod_ocp_if omap3xxx_l4_core__dss_venc = {
|
||||
.master = &omap3xxx_l4_core_hwmod,
|
||||
.slave = &omap3xxx_dss_venc_hwmod,
|
||||
.clk = "dss_tv_fck",
|
||||
.clk = "dss_ick",
|
||||
.addr = omap2_dss_venc_addrs,
|
||||
.fw = {
|
||||
.omap2 = {
|
||||
|
@ -1578,10 +1598,15 @@ static struct omap_hwmod_ocp_if *omap3xxx_dss_venc_slaves[] = {
|
|||
&omap3xxx_l4_core__dss_venc,
|
||||
};
|
||||
|
||||
static struct omap_hwmod_opt_clk dss_venc_opt_clks[] = {
|
||||
/* required only on OMAP3430 */
|
||||
{ .role = "tv_dac_clk", .clk = "dss_96m_fck" },
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap3xxx_dss_venc_hwmod = {
|
||||
.name = "dss_venc",
|
||||
.class = &omap2_venc_hwmod_class,
|
||||
.main_clk = "dss1_alwon_fck",
|
||||
.main_clk = "dss_tv_fck",
|
||||
.prcm = {
|
||||
.omap2 = {
|
||||
.prcm_reg_id = 1,
|
||||
|
@ -1589,6 +1614,8 @@ static struct omap_hwmod omap3xxx_dss_venc_hwmod = {
|
|||
.module_offs = OMAP3430_DSS_MOD,
|
||||
},
|
||||
},
|
||||
.opt_clks = dss_venc_opt_clks,
|
||||
.opt_clks_cnt = ARRAY_SIZE(dss_venc_opt_clks),
|
||||
.slaves = omap3xxx_dss_venc_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap3xxx_dss_venc_slaves),
|
||||
.flags = HWMOD_NO_IDLEST,
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#include <plat/mmc.h>
|
||||
#include <plat/i2c.h>
|
||||
#include <plat/dmtimer.h>
|
||||
#include <plat/common.h>
|
||||
|
||||
#include "omap_hwmod_common_data.h"
|
||||
|
||||
|
@ -1187,6 +1188,7 @@ static struct omap_hwmod_class_sysconfig omap44xx_dss_sysc = {
|
|||
static struct omap_hwmod_class omap44xx_dss_hwmod_class = {
|
||||
.name = "dss",
|
||||
.sysc = &omap44xx_dss_sysc,
|
||||
.reset = omap_dss_reset,
|
||||
};
|
||||
|
||||
/* dss */
|
||||
|
@ -1240,12 +1242,12 @@ static struct omap_hwmod_ocp_if *omap44xx_dss_slaves[] = {
|
|||
static struct omap_hwmod_opt_clk dss_opt_clks[] = {
|
||||
{ .role = "sys_clk", .clk = "dss_sys_clk" },
|
||||
{ .role = "tv_clk", .clk = "dss_tv_clk" },
|
||||
{ .role = "dss_clk", .clk = "dss_dss_clk" },
|
||||
{ .role = "video_clk", .clk = "dss_48mhz_clk" },
|
||||
{ .role = "hdmi_clk", .clk = "dss_48mhz_clk" },
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap44xx_dss_hwmod = {
|
||||
.name = "dss_core",
|
||||
.flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
|
||||
.class = &omap44xx_dss_hwmod_class,
|
||||
.clkdm_name = "l3_dss_clkdm",
|
||||
.main_clk = "dss_dss_clk",
|
||||
|
@ -1325,6 +1327,11 @@ static struct omap_hwmod_addr_space omap44xx_dss_dispc_addrs[] = {
|
|||
{ }
|
||||
};
|
||||
|
||||
static struct omap_dss_dispc_dev_attr omap44xx_dss_dispc_dev_attr = {
|
||||
.manager_count = 3,
|
||||
.has_framedonetv_irq = 1
|
||||
};
|
||||
|
||||
/* l4_per -> dss_dispc */
|
||||
static struct omap_hwmod_ocp_if omap44xx_l4_per__dss_dispc = {
|
||||
.master = &omap44xx_l4_per_hwmod,
|
||||
|
@ -1340,12 +1347,6 @@ static struct omap_hwmod_ocp_if *omap44xx_dss_dispc_slaves[] = {
|
|||
&omap44xx_l4_per__dss_dispc,
|
||||
};
|
||||
|
||||
static struct omap_hwmod_opt_clk dss_dispc_opt_clks[] = {
|
||||
{ .role = "sys_clk", .clk = "dss_sys_clk" },
|
||||
{ .role = "tv_clk", .clk = "dss_tv_clk" },
|
||||
{ .role = "hdmi_clk", .clk = "dss_48mhz_clk" },
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap44xx_dss_dispc_hwmod = {
|
||||
.name = "dss_dispc",
|
||||
.class = &omap44xx_dispc_hwmod_class,
|
||||
|
@ -1359,10 +1360,9 @@ static struct omap_hwmod omap44xx_dss_dispc_hwmod = {
|
|||
.context_offs = OMAP4_RM_DSS_DSS_CONTEXT_OFFSET,
|
||||
},
|
||||
},
|
||||
.opt_clks = dss_dispc_opt_clks,
|
||||
.opt_clks_cnt = ARRAY_SIZE(dss_dispc_opt_clks),
|
||||
.slaves = omap44xx_dss_dispc_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap44xx_dss_dispc_slaves),
|
||||
.dev_attr = &omap44xx_dss_dispc_dev_attr
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -1624,7 +1624,7 @@ static struct omap_hwmod omap44xx_dss_hdmi_hwmod = {
|
|||
.clkdm_name = "l3_dss_clkdm",
|
||||
.mpu_irqs = omap44xx_dss_hdmi_irqs,
|
||||
.sdma_reqs = omap44xx_dss_hdmi_sdma_reqs,
|
||||
.main_clk = "dss_dss_clk",
|
||||
.main_clk = "dss_48mhz_clk",
|
||||
.prcm = {
|
||||
.omap4 = {
|
||||
.clkctrl_offs = OMAP4_CM_DSS_DSS_CLKCTRL_OFFSET,
|
||||
|
@ -1785,7 +1785,7 @@ static struct omap_hwmod omap44xx_dss_venc_hwmod = {
|
|||
.name = "dss_venc",
|
||||
.class = &omap44xx_venc_hwmod_class,
|
||||
.clkdm_name = "l3_dss_clkdm",
|
||||
.main_clk = "dss_dss_clk",
|
||||
.main_clk = "dss_tv_clk",
|
||||
.prcm = {
|
||||
.omap4 = {
|
||||
.clkctrl_offs = OMAP4_CM_DSS_DSS_CLKCTRL_OFFSET,
|
||||
|
|
|
@ -49,3 +49,7 @@ struct omap_hwmod_sysc_fields omap_hwmod_sysc_type2 = {
|
|||
.srst_shift = SYSC_TYPE2_SOFTRESET_SHIFT,
|
||||
};
|
||||
|
||||
struct omap_dss_dispc_dev_attr omap2_3_dss_dispc_dev_attr = {
|
||||
.manager_count = 2,
|
||||
.has_framedonetv_irq = 0
|
||||
};
|
||||
|
|
|
@ -16,6 +16,8 @@
|
|||
|
||||
#include <plat/omap_hwmod.h>
|
||||
|
||||
#include "display.h"
|
||||
|
||||
/* Common address space across OMAP2xxx */
|
||||
extern struct omap_hwmod_addr_space omap2xxx_uart1_addr_space[];
|
||||
extern struct omap_hwmod_addr_space omap2xxx_uart2_addr_space[];
|
||||
|
@ -111,4 +113,6 @@ extern struct omap_hwmod_class omap2xxx_dma_hwmod_class;
|
|||
extern struct omap_hwmod_class omap2xxx_mailbox_hwmod_class;
|
||||
extern struct omap_hwmod_class omap2xxx_mcspi_class;
|
||||
|
||||
extern struct omap_dss_dispc_dev_attr omap2_3_dss_dispc_dev_attr;
|
||||
|
||||
#endif
|
||||
|
|
|
@ -237,7 +237,7 @@ static int __devexit omap4_l3_remove(struct platform_device *pdev)
|
|||
static const struct of_device_id l3_noc_match[] = {
|
||||
{.compatible = "ti,omap4-l3-noc", },
|
||||
{},
|
||||
}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, l3_noc_match);
|
||||
#else
|
||||
#define l3_noc_match NULL
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include "powerdomain.h"
|
||||
#include "clockdomain.h"
|
||||
#include "pm.h"
|
||||
#include "twl-common.h"
|
||||
|
||||
static struct omap_device_pm_latency *pm_lats;
|
||||
|
||||
|
@ -226,11 +227,8 @@ postcore_initcall(omap2_common_pm_init);
|
|||
|
||||
static int __init omap2_common_pm_late_init(void)
|
||||
{
|
||||
/* Init the OMAP TWL parameters */
|
||||
omap3_twl_init();
|
||||
omap4_twl_init();
|
||||
|
||||
/* Init the voltage layer */
|
||||
omap_pmic_late_init();
|
||||
omap_voltage_late_init();
|
||||
|
||||
/* Initialize the voltages */
|
||||
|
|
|
@ -139,7 +139,7 @@ static irqreturn_t sr_interrupt(int irq, void *data)
|
|||
sr_write_reg(sr_info, ERRCONFIG_V1, status);
|
||||
} else if (sr_info->ip_type == SR_TYPE_V2) {
|
||||
/* Read the status bits */
|
||||
sr_read_reg(sr_info, IRQSTATUS);
|
||||
status = sr_read_reg(sr_info, IRQSTATUS);
|
||||
|
||||
/* Clear them by writing back */
|
||||
sr_write_reg(sr_info, IRQSTATUS, status);
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
#include <plat/usb.h>
|
||||
|
||||
#include "twl-common.h"
|
||||
#include "pm.h"
|
||||
|
||||
static struct i2c_board_info __initdata pmic_i2c_board_info = {
|
||||
.addr = 0x48,
|
||||
|
@ -48,6 +49,16 @@ void __init omap_pmic_init(int bus, u32 clkrate,
|
|||
omap_register_i2c_bus(bus, clkrate, &pmic_i2c_board_info, 1);
|
||||
}
|
||||
|
||||
void __init omap_pmic_late_init(void)
|
||||
{
|
||||
/* Init the OMAP TWL parameters (if PMIC has been registerd) */
|
||||
if (!pmic_i2c_board_info.irq)
|
||||
return;
|
||||
|
||||
omap3_twl_init();
|
||||
omap4_twl_init();
|
||||
}
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP3)
|
||||
static struct twl4030_usb_data omap3_usb_pdata = {
|
||||
.usb_mode = T2_USB_MODE_ULPI,
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
#ifndef __OMAP_PMIC_COMMON__
|
||||
#define __OMAP_PMIC_COMMON__
|
||||
|
||||
#include <plat/irqs.h>
|
||||
|
||||
#define TWL_COMMON_PDATA_USB (1 << 0)
|
||||
#define TWL_COMMON_PDATA_BCI (1 << 1)
|
||||
#define TWL_COMMON_PDATA_MADC (1 << 2)
|
||||
|
@ -30,6 +32,7 @@ struct twl4030_platform_data;
|
|||
|
||||
void omap_pmic_init(int bus, u32 clkrate, const char *pmic_type, int pmic_irq,
|
||||
struct twl4030_platform_data *pmic_data);
|
||||
void omap_pmic_late_init(void);
|
||||
|
||||
static inline void omap2_pmic_init(const char *pmic_type,
|
||||
struct twl4030_platform_data *pmic_data)
|
||||
|
|
|
@ -307,7 +307,7 @@ static inline void balloon3_mmc_init(void) {}
|
|||
/******************************************************************************
|
||||
* USB Gadget
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_USB_GADGET_PXA27X)||defined(CONFIG_USB_GADGET_PXA27X_MODULE)
|
||||
#if defined(CONFIG_USB_PXA27X)||defined(CONFIG_USB_PXA27X_MODULE)
|
||||
static void balloon3_udc_command(int cmd)
|
||||
{
|
||||
if (cmd == PXA2XX_UDC_CMD_CONNECT)
|
||||
|
|
|
@ -146,7 +146,7 @@ static void __init colibri_pxa320_init_eth(void)
|
|||
static inline void __init colibri_pxa320_init_eth(void) {}
|
||||
#endif /* CONFIG_AX88796 */
|
||||
|
||||
#if defined(CONFIG_USB_GADGET_PXA27X)||defined(CONFIG_USB_GADGET_PXA27X_MODULE)
|
||||
#if defined(CONFIG_USB_PXA27X)||defined(CONFIG_USB_PXA27X_MODULE)
|
||||
static struct gpio_vbus_mach_info colibri_pxa320_gpio_vbus_info = {
|
||||
.gpio_vbus = mfp_to_gpio(MFP_PIN_GPIO96),
|
||||
.gpio_pullup = -1,
|
||||
|
|
|
@ -106,7 +106,7 @@ static void __init gumstix_mmc_init(void)
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_USB_GADGET_PXA25X
|
||||
#ifdef CONFIG_USB_PXA25X
|
||||
static struct gpio_vbus_mach_info gumstix_udc_info = {
|
||||
.gpio_vbus = GPIO_GUMSTIX_USB_GPIOn,
|
||||
.gpio_pullup = GPIO_GUMSTIX_USB_GPIOx,
|
||||
|
|
|
@ -37,8 +37,8 @@ extern void __init palm27x_lcd_init(int power,
|
|||
#define palm27x_lcd_init(power, mode) do {} while (0)
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_USB_GADGET_PXA27X) || \
|
||||
defined(CONFIG_USB_GADGET_PXA27X_MODULE)
|
||||
#if defined(CONFIG_USB_PXA27X) || \
|
||||
defined(CONFIG_USB_PXA27X_MODULE)
|
||||
extern void __init palm27x_udc_init(int vbus, int pullup,
|
||||
int vbus_inverted);
|
||||
#else
|
||||
|
|
|
@ -164,8 +164,8 @@ void __init palm27x_lcd_init(int power, struct pxafb_mode_info *mode)
|
|||
/******************************************************************************
|
||||
* USB Gadget
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_USB_GADGET_PXA27X) || \
|
||||
defined(CONFIG_USB_GADGET_PXA27X_MODULE)
|
||||
#if defined(CONFIG_USB_PXA27X) || \
|
||||
defined(CONFIG_USB_PXA27X_MODULE)
|
||||
static struct gpio_vbus_mach_info palm27x_udc_info = {
|
||||
.gpio_vbus_inverted = 1,
|
||||
};
|
||||
|
|
|
@ -338,7 +338,7 @@ static inline void palmtc_mkp_init(void) {}
|
|||
/******************************************************************************
|
||||
* UDC
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_USB_GADGET_PXA25X)||defined(CONFIG_USB_GADGET_PXA25X_MODULE)
|
||||
#if defined(CONFIG_USB_PXA25X)||defined(CONFIG_USB_PXA25X_MODULE)
|
||||
static struct gpio_vbus_mach_info palmtc_udc_info = {
|
||||
.gpio_vbus = GPIO_NR_PALMTC_USB_DETECT_N,
|
||||
.gpio_vbus_inverted = 1,
|
||||
|
|
|
@ -343,7 +343,7 @@ static inline void vpac270_uhc_init(void) {}
|
|||
/******************************************************************************
|
||||
* USB Gadget
|
||||
******************************************************************************/
|
||||
#if defined(CONFIG_USB_GADGET_PXA27X)||defined(CONFIG_USB_GADGET_PXA27X_MODULE)
|
||||
#if defined(CONFIG_USB_PXA27X)||defined(CONFIG_USB_PXA27X_MODULE)
|
||||
static struct gpio_vbus_mach_info vpac270_gpio_vbus_info = {
|
||||
.gpio_vbus = GPIO41_VPAC270_UDC_DETECT,
|
||||
.gpio_pullup = -1,
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue