2
0
mirror of https://github.com/edk2-porting/linux-next.git synced 2024-11-20 00:26:39 +08:00

Merge branch 'tracing/urgent' into tracing/core

Merge reason: Pick up fixes and move base from -rc1 to -rc5.

Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
Ingo Molnar 2009-10-29 09:02:15 +01:00
commit 9de09ace8d
1426 changed files with 83077 additions and 20211 deletions

View File

@ -31,3 +31,31 @@ Date: March 2009
Kernel Version: 2.6.30 Kernel Version: 2.6.30
Contact: iss_storagedev@hp.com Contact: iss_storagedev@hp.com
Description: A symbolic link to /sys/block/cciss!cXdY Description: A symbolic link to /sys/block/cciss!cXdY
Where: /sys/bus/pci/devices/<dev>/ccissX/rescan
Date: August 2009
Kernel Version: 2.6.31
Contact: iss_storagedev@hp.com
Description: Kicks of a rescan of the controller to discover logical
drive topology changes.
Where: /sys/bus/pci/devices/<dev>/ccissX/cXdY/lunid
Date: August 2009
Kernel Version: 2.6.31
Contact: iss_storagedev@hp.com
Description: Displays the 8-byte LUN ID used to address logical
drive Y of controller X.
Where: /sys/bus/pci/devices/<dev>/ccissX/cXdY/raid_level
Date: August 2009
Kernel Version: 2.6.31
Contact: iss_storagedev@hp.com
Description: Displays the RAID level of logical drive Y of
controller X.
Where: /sys/bus/pci/devices/<dev>/ccissX/cXdY/usage_count
Date: August 2009
Kernel Version: 2.6.31
Contact: iss_storagedev@hp.com
Description: Displays the usage count (number of opens) of logical drive Y
of controller X.

View File

@ -1,4 +1,4 @@
What: /sys/class/usb_host/usb_hostN/wusb_chid What: /sys/class/uwb_rc/uwbN/wusbhc/wusb_chid
Date: July 2008 Date: July 2008
KernelVersion: 2.6.27 KernelVersion: 2.6.27
Contact: David Vrabel <david.vrabel@csr.com> Contact: David Vrabel <david.vrabel@csr.com>
@ -9,7 +9,7 @@ Description:
Set an all zero CHID to stop the host controller. Set an all zero CHID to stop the host controller.
What: /sys/class/usb_host/usb_hostN/wusb_trust_timeout What: /sys/class/uwb_rc/uwbN/wusbhc/wusb_trust_timeout
Date: July 2008 Date: July 2008
KernelVersion: 2.6.27 KernelVersion: 2.6.27
Contact: David Vrabel <david.vrabel@csr.com> Contact: David Vrabel <david.vrabel@csr.com>

View File

@ -227,7 +227,14 @@ as the path relative to the root of the cgroup file system.
Each cgroup is represented by a directory in the cgroup file system Each cgroup is represented by a directory in the cgroup file system
containing the following files describing that cgroup: containing the following files describing that cgroup:
- tasks: list of tasks (by pid) attached to that cgroup - tasks: list of tasks (by pid) attached to that cgroup. This list
is not guaranteed to be sorted. Writing a thread id into this file
moves the thread into this cgroup.
- cgroup.procs: list of tgids in the cgroup. This list is not
guaranteed to be sorted or free of duplicate tgids, and userspace
should sort/uniquify the list if this property is required.
Writing a tgid into this file moves all threads with that tgid into
this cgroup.
- notify_on_release flag: run the release agent on exit? - notify_on_release flag: run the release agent on exit?
- release_agent: the path to use for release notifications (this file - release_agent: the path to use for release notifications (this file
exists in the top cgroup only) exists in the top cgroup only)
@ -374,7 +381,7 @@ Now you want to do something with this cgroup.
In this directory you can find several files: In this directory you can find several files:
# ls # ls
notify_on_release tasks cgroup.procs notify_on_release tasks
(plus whatever files added by the attached subsystems) (plus whatever files added by the attached subsystems)
Now attach your shell to this cgroup: Now attach your shell to this cgroup:

View File

@ -64,14 +64,14 @@ be used to view the printk buffer of a remote machine, even with live update.
Bernhard Kaindl enhanced firescope to support accessing 64-bit machines Bernhard Kaindl enhanced firescope to support accessing 64-bit machines
from 32-bit firescope and vice versa: from 32-bit firescope and vice versa:
- ftp://ftp.suse.de/private/bk/firewire/tools/firescope-0.2.2.tar.bz2 - http://halobates.de/firewire/firescope-0.2.2.tar.bz2
and he implemented fast system dump (alpha version - read README.txt): and he implemented fast system dump (alpha version - read README.txt):
- ftp://ftp.suse.de/private/bk/firewire/tools/firedump-0.1.tar.bz2 - http://halobates.de/firewire/firedump-0.1.tar.bz2
There is also a gdb proxy for firewire which allows to use gdb to access There is also a gdb proxy for firewire which allows to use gdb to access
data which can be referenced from symbols found by gdb in vmlinux: data which can be referenced from symbols found by gdb in vmlinux:
- ftp://ftp.suse.de/private/bk/firewire/tools/fireproxy-0.33.tar.bz2 - http://halobates.de/firewire/fireproxy-0.33.tar.bz2
The latest version of this gdb proxy (fireproxy-0.34) can communicate (not The latest version of this gdb proxy (fireproxy-0.34) can communicate (not
yet stable) with kgdb over an memory-based communication module (kgdbom). yet stable) with kgdb over an memory-based communication module (kgdbom).
@ -178,7 +178,7 @@ Step-by-step instructions for using firescope with early OHCI initialization:
Notes Notes
----- -----
Documentation and specifications: ftp://ftp.suse.de/private/bk/firewire/docs Documentation and specifications: http://halobates.de/firewire/
FireWire is a trademark of Apple Inc. - for more information please refer to: FireWire is a trademark of Apple Inc. - for more information please refer to:
http://en.wikipedia.org/wiki/FireWire http://en.wikipedia.org/wiki/FireWire

View File

@ -418,6 +418,14 @@ When: 2.6.33
Why: Should be implemented in userspace, policy daemon. Why: Should be implemented in userspace, policy daemon.
Who: Johannes Berg <johannes@sipsolutions.net> Who: Johannes Berg <johannes@sipsolutions.net>
---------------------------
What: CONFIG_INOTIFY
When: 2.6.33
Why: last user (audit) will be converted to the newer more generic
and more easily maintained fsnotify subsystem
Who: Eric Paris <eparis@redhat.com>
---------------------------- ----------------------------
What: lock_policy_rwsem_* and unlock_policy_rwsem_* will not be What: lock_policy_rwsem_* and unlock_policy_rwsem_* will not be
@ -451,3 +459,33 @@ Why: OSS sound_core grabs all legacy minors (0-255) of SOUND_MAJOR
will also allow making ALSA OSS emulation independent of will also allow making ALSA OSS emulation independent of
sound_core. The dependency will be broken then too. sound_core. The dependency will be broken then too.
Who: Tejun Heo <tj@kernel.org> Who: Tejun Heo <tj@kernel.org>
----------------------------
What: Support for VMware's guest paravirtuliazation technique [VMI] will be
dropped.
When: 2.6.37 or earlier.
Why: With the recent innovations in CPU hardware acceleration technologies
from Intel and AMD, VMware ran a few experiments to compare these
techniques to guest paravirtualization technique on VMware's platform.
These hardware assisted virtualization techniques have outperformed the
performance benefits provided by VMI in most of the workloads. VMware
expects that these hardware features will be ubiquitous in a couple of
years, as a result, VMware has started a phased retirement of this
feature from the hypervisor. We will be removing this feature from the
Kernel too. Right now we are targeting 2.6.37 but can retire earlier if
technical reasons (read opportunity to remove major chunk of pvops)
arise.
Please note that VMI has always been an optimization and non-VMI kernels
still work fine on VMware's platform.
Latest versions of VMware's product which support VMI are,
Workstation 7.0 and VSphere 4.0 on ESX side, future maintainence
releases for these products will continue supporting VMI.
For more details about VMI retirement take a look at this,
http://blogs.vmware.com/guestosguide/2009/09/vmi-retirement.html
Who: Alok N Kataria <akataria@vmware.com>
----------------------------

View File

@ -123,10 +123,18 @@ resuid=n The user ID which may use the reserved blocks.
sb=n Use alternate superblock at this location. sb=n Use alternate superblock at this location.
quota quota These options are ignored by the filesystem. They
noquota noquota are used only by quota tools to recognize volumes
grpquota grpquota where quota should be turned on. See documentation
usrquota usrquota in the quota-tools package for more details
(http://sourceforge.net/projects/linuxquota).
jqfmt=<quota type> These options tell filesystem details about quota
usrjquota=<file> so that quota information can be properly updated
grpjquota=<file> during journal replay. They replace the above
quota options. See documentation in the quota-tools
package for more details
(http://sourceforge.net/projects/linuxquota).
bh (*) ext3 associates buffer heads to data pages to bh (*) ext3 associates buffer heads to data pages to
nobh (a) cache disk block mapping information nobh (a) cache disk block mapping information

View File

@ -1,5 +1,5 @@
Using flexible arrays in the kernel Using flexible arrays in the kernel
Last updated for 2.6.31 Last updated for 2.6.32
Jonathan Corbet <corbet@lwn.net> Jonathan Corbet <corbet@lwn.net>
Large contiguous memory allocations can be unreliable in the Linux kernel. Large contiguous memory allocations can be unreliable in the Linux kernel.
@ -40,6 +40,13 @@ argument is passed directly to the internal memory allocation calls. With
the current code, using flags to ask for high memory is likely to lead to the current code, using flags to ask for high memory is likely to lead to
notably unpleasant side effects. notably unpleasant side effects.
It is also possible to define flexible arrays at compile time with:
DEFINE_FLEX_ARRAY(name, element_size, total);
This macro will result in a definition of an array with the given name; the
element size and total will be checked for validity at compile time.
Storing data into a flexible array is accomplished with a call to: Storing data into a flexible array is accomplished with a call to:
int flex_array_put(struct flex_array *array, unsigned int element_nr, int flex_array_put(struct flex_array *array, unsigned int element_nr,
@ -76,16 +83,30 @@ particular element has never been allocated.
Note that it is possible to get back a valid pointer for an element which Note that it is possible to get back a valid pointer for an element which
has never been stored in the array. Memory for array elements is allocated has never been stored in the array. Memory for array elements is allocated
one page at a time; a single allocation could provide memory for several one page at a time; a single allocation could provide memory for several
adjacent elements. The flexible array code does not know if a specific adjacent elements. Flexible array elements are normally initialized to the
element has been written; it only knows if the associated memory is value FLEX_ARRAY_FREE (defined as 0x6c in <linux/poison.h>), so errors
present. So a flex_array_get() call on an element which was never stored involving that number probably result from use of unstored array entries.
in the array has the potential to return a pointer to random data. If the Note that, if array elements are allocated with __GFP_ZERO, they will be
caller does not have a separate way to know which elements were actually initialized to zero and this poisoning will not happen.
stored, it might be wise, at least, to add GFP_ZERO to the flags argument
to ensure that all elements are zeroed.
There is no way to remove a single element from the array. It is possible, Individual elements in the array can be cleared with:
though, to remove all elements with a call to:
int flex_array_clear(struct flex_array *array, unsigned int element_nr);
This function will set the given element to FLEX_ARRAY_FREE and return
zero. If storage for the indicated element is not allocated for the array,
flex_array_clear() will return -EINVAL instead. Note that clearing an
element does not release the storage associated with it; to reduce the
allocated size of an array, call:
int flex_array_shrink(struct flex_array *array);
The return value will be the number of pages of memory actually freed.
This function works by scanning the array for pages containing nothing but
FLEX_ARRAY_FREE bytes, so (1) it can be expensive, and (2) it will not work
if the array's pages are allocated with __GFP_ZERO.
It is possible to remove all elements of an array with a call to:
void flex_array_free_parts(struct flex_array *array); void flex_array_free_parts(struct flex_array *array);

View File

@ -22,12 +22,13 @@ Usage Notes
----------- -----------
This driver does not probe for LTC4215 devices, due to the fact that some This driver does not probe for LTC4215 devices, due to the fact that some
of the possible addresses are unfriendly to probing. You will need to use of the possible addresses are unfriendly to probing. You will have to
the "force" parameter to tell the driver where to find the device. instantiate the devices explicitly.
Example: the following will load the driver for an LTC4215 at address 0x44 Example: the following will load the driver for an LTC4215 at address 0x44
on I2C bus #0: on I2C bus #0:
$ modprobe ltc4215 force=0,0x44 $ modprobe ltc4215
$ echo ltc4215 0x44 > /sys/bus/i2c/devices/i2c-0/new_device
Sysfs entries Sysfs entries

View File

@ -23,12 +23,13 @@ Usage Notes
----------- -----------
This driver does not probe for LTC4245 devices, due to the fact that some This driver does not probe for LTC4245 devices, due to the fact that some
of the possible addresses are unfriendly to probing. You will need to use of the possible addresses are unfriendly to probing. You will have to
the "force" parameter to tell the driver where to find the device. instantiate the devices explicitly.
Example: the following will load the driver for an LTC4245 at address 0x23 Example: the following will load the driver for an LTC4245 at address 0x23
on I2C bus #1: on I2C bus #1:
$ modprobe ltc4245 force=1,0x23 $ modprobe ltc4245
$ echo ltc4245 0x23 > /sys/bus/i2c/devices/i2c-1/new_device
Sysfs entries Sysfs entries

View File

@ -188,7 +188,7 @@ segment, the address is sufficient to uniquely identify the device to be
deleted. deleted.
Example: Example:
# echo eeprom 0x50 > /sys/class/i2c-adapter/i2c-3/new_device # echo eeprom 0x50 > /sys/bus/i2c/devices/i2c-3/new_device
While this interface should only be used when in-kernel device declaration While this interface should only be used when in-kernel device declaration
can't be done, there is a variety of cases where it can be helpful: can't be done, there is a variety of cases where it can be helpful:

View File

@ -128,8 +128,8 @@ Setting IsSM Capability Bit
To create the appropriate character device files automatically with To create the appropriate character device files automatically with
udev, a rule like udev, a rule like
KERNEL="umad*", NAME="infiniband/%k" KERNEL=="umad*", NAME="infiniband/%k"
KERNEL="issm*", NAME="infiniband/%k" KERNEL=="issm*", NAME="infiniband/%k"
can be used. This will create device nodes named can be used. This will create device nodes named

View File

@ -58,7 +58,7 @@ Memory pinning
To create the appropriate character device files automatically with To create the appropriate character device files automatically with
udev, a rule like udev, a rule like
KERNEL="uverbs*", NAME="infiniband/%k" KERNEL=="uverbs*", NAME="infiniband/%k"
can be used. This will create device nodes named can be used. This will create device nodes named

View File

@ -60,10 +60,9 @@ open() operation on regular files or character devices.
After a successful return from register_appl(), CAPI messages from the After a successful return from register_appl(), CAPI messages from the
application may be passed to the driver for the device via calls to the application may be passed to the driver for the device via calls to the
send_message() callback function. The CAPI message to send is stored in the send_message() callback function. Conversely, the driver may call Kernel
data portion of an skb. Conversely, the driver may call Kernel CAPI's CAPI's capi_ctr_handle_message() function to pass a received CAPI message to
capi_ctr_handle_message() function to pass a received CAPI message to Kernel Kernel CAPI for forwarding to an application, specifying its ApplID.
CAPI for forwarding to an application, specifying its ApplID.
Deregistration requests (CAPI operation CAPI_RELEASE) from applications are Deregistration requests (CAPI operation CAPI_RELEASE) from applications are
forwarded as calls to the release_appl() callback function, passing the same forwarded as calls to the release_appl() callback function, passing the same
@ -142,6 +141,7 @@ u16 (*send_message)(struct capi_ctr *ctrlr, struct sk_buff *skb)
to accepting or queueing the message. Errors occurring during the to accepting or queueing the message. Errors occurring during the
actual processing of the message should be signaled with an actual processing of the message should be signaled with an
appropriate reply message. appropriate reply message.
May be called in process or interrupt context.
Calls to this function are not serialized by Kernel CAPI, ie. it must Calls to this function are not serialized by Kernel CAPI, ie. it must
be prepared to be re-entered. be prepared to be re-entered.
@ -154,7 +154,8 @@ read_proc_t *ctr_read_proc
system entry, /proc/capi/controllers/<n>; will be called with a system entry, /proc/capi/controllers/<n>; will be called with a
pointer to the device's capi_ctr structure as the last (data) argument pointer to the device's capi_ctr structure as the last (data) argument
Note: Callback functions are never called in interrupt context. Note: Callback functions except send_message() are never called in interrupt
context.
- to be filled in before calling capi_ctr_ready(): - to be filled in before calling capi_ctr_ready():
@ -171,14 +172,40 @@ u8 serial[CAPI_SERIAL_LEN]
value to return for CAPI_GET_SERIAL value to return for CAPI_GET_SERIAL
4.3 The _cmsg Structure 4.3 SKBs
CAPI messages are passed between Kernel CAPI and the driver via send_message()
and capi_ctr_handle_message(), stored in the data portion of a socket buffer
(skb). Each skb contains a single CAPI message coded according to the CAPI 2.0
standard.
For the data transfer messages, DATA_B3_REQ and DATA_B3_IND, the actual
payload data immediately follows the CAPI message itself within the same skb.
The Data and Data64 parameters are not used for processing. The Data64
parameter may be omitted by setting the length field of the CAPI message to 22
instead of 30.
4.4 The _cmsg Structure
(declared in <linux/isdn/capiutil.h>) (declared in <linux/isdn/capiutil.h>)
The _cmsg structure stores the contents of a CAPI 2.0 message in an easily The _cmsg structure stores the contents of a CAPI 2.0 message in an easily
accessible form. It contains members for all possible CAPI 2.0 parameters, of accessible form. It contains members for all possible CAPI 2.0 parameters,
which only those appearing in the message type currently being processed are including subparameters of the Additional Info and B Protocol structured
actually used. Unused members should be set to zero. parameters, with the following exceptions:
* second Calling party number (CONNECT_IND)
* Data64 (DATA_B3_REQ and DATA_B3_IND)
* Sending complete (subparameter of Additional Info, CONNECT_REQ and INFO_REQ)
* Global Configuration (subparameter of B Protocol, CONNECT_REQ, CONNECT_RESP
and SELECT_B_PROTOCOL_REQ)
Only those parameters appearing in the message type currently being processed
are actually used. Unused members should be set to zero.
Members are named after the CAPI 2.0 standard names of the parameters they Members are named after the CAPI 2.0 standard names of the parameters they
represent. See <linux/isdn/capiutil.h> for the exact spelling. Member data represent. See <linux/isdn/capiutil.h> for the exact spelling. Member data
@ -190,18 +217,19 @@ u16 for CAPI parameters of type 'word'
u32 for CAPI parameters of type 'dword' u32 for CAPI parameters of type 'dword'
_cstruct for CAPI parameters of type 'struct' not containing any _cstruct for CAPI parameters of type 'struct'
variably-sized (struct) subparameters (eg. 'Called Party Number')
The member is a pointer to a buffer containing the parameter in The member is a pointer to a buffer containing the parameter in
CAPI encoding (length + content). It may also be NULL, which will CAPI encoding (length + content). It may also be NULL, which will
be taken to represent an empty (zero length) parameter. be taken to represent an empty (zero length) parameter.
Subparameters are stored in encoded form within the content part.
_cmstruct for CAPI parameters of type 'struct' containing 'struct' _cmstruct alternative representation for CAPI parameters of type 'struct'
subparameters ('Additional Info' and 'B Protocol') (used only for the 'Additional Info' and 'B Protocol' parameters)
The representation is a single byte containing one of the values: The representation is a single byte containing one of the values:
CAPI_DEFAULT: the parameter is empty CAPI_DEFAULT: The parameter is empty/absent.
CAPI_COMPOSE: the values of the subparameters are stored CAPI_COMPOSE: The parameter is present.
individually in the corresponding _cmsg structure members Subparameter values are stored individually in the corresponding
_cmsg structure members.
Functions capi_cmsg2message() and capi_message2cmsg() are provided to convert Functions capi_cmsg2message() and capi_message2cmsg() are provided to convert
messages between their transport encoding described in the CAPI 2.0 standard messages between their transport encoding described in the CAPI 2.0 standard
@ -297,3 +325,26 @@ char *capi_cmd2str(u8 Command, u8 Subcommand)
be NULL if the command/subcommand is not one of those defined in the be NULL if the command/subcommand is not one of those defined in the
CAPI 2.0 standard. CAPI 2.0 standard.
7. Debugging
The module kernelcapi has a module parameter showcapimsgs controlling some
debugging output produced by the module. It can only be set when the module is
loaded, via a parameter "showcapimsgs=<n>" to the modprobe command, either on
the command line or in the configuration file.
If the lowest bit of showcapimsgs is set, kernelcapi logs controller and
application up and down events.
In addition, every registered CAPI controller has an associated traceflag
parameter controlling how CAPI messages sent from and to tha controller are
logged. The traceflag parameter is initialized with the value of the
showcapimsgs parameter when the controller is registered, but can later be
changed via the MANUFACTURER_REQ command KCAPI_CMD_TRACE.
If the value of traceflag is non-zero, CAPI messages are logged.
DATA_B3 messages are only logged if the value of traceflag is > 2.
If the lowest bit of traceflag is set, only the command/subcommand and message
length are logged. Otherwise, kernelcapi logs a readable representation of
the entire message.

View File

@ -671,6 +671,7 @@ and is between 256 and 4096 characters. It is defined in the file
earlyprintk= [X86,SH,BLACKFIN] earlyprintk= [X86,SH,BLACKFIN]
earlyprintk=vga earlyprintk=vga
earlyprintk=serial[,ttySn[,baudrate]] earlyprintk=serial[,ttySn[,baudrate]]
earlyprintk=ttySn[,baudrate]
earlyprintk=dbgp[debugController#] earlyprintk=dbgp[debugController#]
Append ",keep" to not disable it when the real console Append ",keep" to not disable it when the real console

View File

@ -42,7 +42,6 @@
#include <signal.h> #include <signal.h>
#include "linux/lguest_launcher.h" #include "linux/lguest_launcher.h"
#include "linux/virtio_config.h" #include "linux/virtio_config.h"
#include <linux/virtio_ids.h>
#include "linux/virtio_net.h" #include "linux/virtio_net.h"
#include "linux/virtio_blk.h" #include "linux/virtio_blk.h"
#include "linux/virtio_console.h" #include "linux/virtio_console.h"

View File

@ -42,10 +42,12 @@ General Remarks
Valid addresses for the MAX6875 are 0x50 and 0x52. Valid addresses for the MAX6875 are 0x50 and 0x52.
Valid addresses for the MAX6874 are 0x50, 0x52, 0x54 and 0x56. Valid addresses for the MAX6874 are 0x50, 0x52, 0x54 and 0x56.
The driver does not probe any address, so you must force the address. The driver does not probe any address, so you explicitly instantiate the
devices.
Example: Example:
$ modprobe max6875 force=0,0x50 $ modprobe max6875
$ echo max6875 0x50 > /sys/bus/i2c/devices/i2c-0/new_device
The MAX6874/MAX6875 ignores address bit 0, so this driver attaches to multiple The MAX6874/MAX6875 ignores address bit 0, so this driver attaches to multiple
addresses. For example, for address 0x50, it also reserves 0x51. addresses. For example, for address 0x50, it also reserves 0x51.

View File

@ -90,6 +90,11 @@ Examples:
pgset "dstmac 00:00:00:00:00:00" sets MAC destination address pgset "dstmac 00:00:00:00:00:00" sets MAC destination address
pgset "srcmac 00:00:00:00:00:00" sets MAC source address pgset "srcmac 00:00:00:00:00:00" sets MAC source address
pgset "queue_map_min 0" Sets the min value of tx queue interval
pgset "queue_map_max 7" Sets the max value of tx queue interval, for multiqueue devices
To select queue 1 of a given device,
use queue_map_min=1 and queue_map_max=1
pgset "src_mac_count 1" Sets the number of MACs we'll range through. pgset "src_mac_count 1" Sets the number of MACs we'll range through.
The 'minimum' MAC is what you set with srcmac. The 'minimum' MAC is what you set with srcmac.
@ -101,6 +106,9 @@ Examples:
IPDST_RND, UDPSRC_RND, IPDST_RND, UDPSRC_RND,
UDPDST_RND, MACSRC_RND, MACDST_RND UDPDST_RND, MACSRC_RND, MACDST_RND
MPLS_RND, VID_RND, SVID_RND MPLS_RND, VID_RND, SVID_RND
QUEUE_MAP_RND # queue map random
QUEUE_MAP_CPU # queue map mirrors smp_processor_id()
pgset "udp_src_min 9" set UDP source port min, If < udp_src_max, then pgset "udp_src_min 9" set UDP source port min, If < udp_src_max, then
cycle through the port range. cycle through the port range.

View File

@ -3,6 +3,25 @@ HIGHPOINT ROCKETRAID 3xxx/4xxx ADAPTER DRIVER (hptiop)
Controller Register Map Controller Register Map
------------------------- -------------------------
For RR44xx Intel IOP based adapters, the controller IOP is accessed via PCI BAR0 and BAR2:
BAR0 offset Register
0x11C5C Link Interface IRQ Set
0x11C60 Link Interface IRQ Clear
BAR2 offset Register
0x10 Inbound Message Register 0
0x14 Inbound Message Register 1
0x18 Outbound Message Register 0
0x1C Outbound Message Register 1
0x20 Inbound Doorbell Register
0x24 Inbound Interrupt Status Register
0x28 Inbound Interrupt Mask Register
0x30 Outbound Interrupt Status Register
0x34 Outbound Interrupt Mask Register
0x40 Inbound Queue Port
0x44 Outbound Queue Port
For Intel IOP based adapters, the controller IOP is accessed via PCI BAR0: For Intel IOP based adapters, the controller IOP is accessed via PCI BAR0:
BAR0 offset Register BAR0 offset Register
@ -93,7 +112,7 @@ The driver exposes following sysfs attributes:
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
Copyright (C) 2006-2007 HighPoint Technologies, Inc. All Rights Reserved. Copyright (C) 2006-2009 HighPoint Technologies, Inc. All Rights Reserved.
This file is distributed in the hope that it will be useful, This file is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of

View File

@ -359,6 +359,7 @@ STAC9227/9228/9229/927x
5stack-no-fp D965 5stack without front panel 5stack-no-fp D965 5stack without front panel
dell-3stack Dell Dimension E520 dell-3stack Dell Dimension E520
dell-bios Fixes with Dell BIOS setup dell-bios Fixes with Dell BIOS setup
volknob Fixes with volume-knob widget 0x24
auto BIOS setup (default) auto BIOS setup (default)
STAC92HD71B* STAC92HD71B*

View File

@ -1231,6 +1231,7 @@ something like this simple program:
#include <sys/stat.h> #include <sys/stat.h>
#include <fcntl.h> #include <fcntl.h>
#include <unistd.h> #include <unistd.h>
#include <string.h>
#define _STR(x) #x #define _STR(x) #x
#define STR(x) _STR(x) #define STR(x) _STR(x)
@ -1265,6 +1266,7 @@ const char *find_debugfs(void)
return NULL; return NULL;
} }
strcat(debugfs, "/tracing/");
debugfs_found = 1; debugfs_found = 1;
return debugfs; return debugfs;

View File

@ -52,15 +52,15 @@ The KSM daemon is controlled by sysfs files in /sys/kernel/mm/ksm/,
readable by all but writable only by root: readable by all but writable only by root:
max_kernel_pages - set to maximum number of kernel pages that KSM may use max_kernel_pages - set to maximum number of kernel pages that KSM may use
e.g. "echo 2000 > /sys/kernel/mm/ksm/max_kernel_pages" e.g. "echo 100000 > /sys/kernel/mm/ksm/max_kernel_pages"
Value 0 imposes no limit on the kernel pages KSM may use; Value 0 imposes no limit on the kernel pages KSM may use;
but note that any process using MADV_MERGEABLE can cause but note that any process using MADV_MERGEABLE can cause
KSM to allocate these pages, unswappable until it exits. KSM to allocate these pages, unswappable until it exits.
Default: 2000 (chosen for demonstration purposes) Default: quarter of memory (chosen to not pin too much)
pages_to_scan - how many present pages to scan before ksmd goes to sleep pages_to_scan - how many present pages to scan before ksmd goes to sleep
e.g. "echo 200 > /sys/kernel/mm/ksm/pages_to_scan" e.g. "echo 100 > /sys/kernel/mm/ksm/pages_to_scan"
Default: 200 (chosen for demonstration purposes) Default: 100 (chosen for demonstration purposes)
sleep_millisecs - how many milliseconds ksmd should sleep before next scan sleep_millisecs - how many milliseconds ksmd should sleep before next scan
e.g. "echo 20 > /sys/kernel/mm/ksm/sleep_millisecs" e.g. "echo 20 > /sys/kernel/mm/ksm/sleep_millisecs"
@ -70,7 +70,8 @@ run - set 0 to stop ksmd from running but keep merged pages,
set 1 to run ksmd e.g. "echo 1 > /sys/kernel/mm/ksm/run", set 1 to run ksmd e.g. "echo 1 > /sys/kernel/mm/ksm/run",
set 2 to stop ksmd and unmerge all pages currently merged, set 2 to stop ksmd and unmerge all pages currently merged,
but leave mergeable areas registered for next run but leave mergeable areas registered for next run
Default: 1 (for immediate use by apps which register) Default: 0 (must be changed to 1 to activate KSM,
except if CONFIG_SYSFS is disabled)
The effectiveness of KSM and MADV_MERGEABLE is shown in /sys/kernel/mm/ksm/: The effectiveness of KSM and MADV_MERGEABLE is shown in /sys/kernel/mm/ksm/:
@ -86,4 +87,4 @@ pages_volatile embraces several different kinds of activity, but a high
proportion there would also indicate poor use of madvise MADV_MERGEABLE. proportion there would also indicate poor use of madvise MADV_MERGEABLE.
Izik Eidus, Izik Eidus,
Hugh Dickins, 30 July 2009 Hugh Dickins, 24 Sept 2009

View File

@ -2,7 +2,10 @@
* page-types: Tool for querying page flags * page-types: Tool for querying page flags
* *
* Copyright (C) 2009 Intel corporation * Copyright (C) 2009 Intel corporation
* Copyright (C) 2009 Wu Fengguang <fengguang.wu@intel.com> *
* Authors: Wu Fengguang <fengguang.wu@intel.com>
*
* Released under the General Public License (GPL).
*/ */
#define _LARGEFILE64_SOURCE #define _LARGEFILE64_SOURCE
@ -69,7 +72,9 @@
#define KPF_COMPOUND_TAIL 16 #define KPF_COMPOUND_TAIL 16
#define KPF_HUGE 17 #define KPF_HUGE 17
#define KPF_UNEVICTABLE 18 #define KPF_UNEVICTABLE 18
#define KPF_HWPOISON 19
#define KPF_NOPAGE 20 #define KPF_NOPAGE 20
#define KPF_KSM 21
/* [32-] kernel hacking assistances */ /* [32-] kernel hacking assistances */
#define KPF_RESERVED 32 #define KPF_RESERVED 32
@ -116,7 +121,9 @@ static char *page_flag_names[] = {
[KPF_COMPOUND_TAIL] = "T:compound_tail", [KPF_COMPOUND_TAIL] = "T:compound_tail",
[KPF_HUGE] = "G:huge", [KPF_HUGE] = "G:huge",
[KPF_UNEVICTABLE] = "u:unevictable", [KPF_UNEVICTABLE] = "u:unevictable",
[KPF_HWPOISON] = "X:hwpoison",
[KPF_NOPAGE] = "n:nopage", [KPF_NOPAGE] = "n:nopage",
[KPF_KSM] = "x:ksm",
[KPF_RESERVED] = "r:reserved", [KPF_RESERVED] = "r:reserved",
[KPF_MLOCKED] = "m:mlocked", [KPF_MLOCKED] = "m:mlocked",
@ -152,9 +159,6 @@ static unsigned long opt_size[MAX_ADDR_RANGES];
static int nr_vmas; static int nr_vmas;
static unsigned long pg_start[MAX_VMAS]; static unsigned long pg_start[MAX_VMAS];
static unsigned long pg_end[MAX_VMAS]; static unsigned long pg_end[MAX_VMAS];
static unsigned long voffset;
static int pagemap_fd;
#define MAX_BIT_FILTERS 64 #define MAX_BIT_FILTERS 64
static int nr_bit_filters; static int nr_bit_filters;
@ -163,9 +167,16 @@ static uint64_t opt_bits[MAX_BIT_FILTERS];
static int page_size; static int page_size;
#define PAGES_BATCH (64 << 10) /* 64k pages */ static int pagemap_fd;
static int kpageflags_fd; static int kpageflags_fd;
static int opt_hwpoison;
static int opt_unpoison;
static char *hwpoison_debug_fs = "/debug/hwpoison";
static int hwpoison_inject_fd;
static int hwpoison_forget_fd;
#define HASH_SHIFT 13 #define HASH_SHIFT 13
#define HASH_SIZE (1 << HASH_SHIFT) #define HASH_SIZE (1 << HASH_SHIFT)
#define HASH_MASK (HASH_SIZE - 1) #define HASH_MASK (HASH_SIZE - 1)
@ -207,6 +218,74 @@ static void fatal(const char *x, ...)
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
int checked_open(const char *pathname, int flags)
{
int fd = open(pathname, flags);
if (fd < 0) {
perror(pathname);
exit(EXIT_FAILURE);
}
return fd;
}
/*
* pagemap/kpageflags routines
*/
static unsigned long do_u64_read(int fd, char *name,
uint64_t *buf,
unsigned long index,
unsigned long count)
{
long bytes;
if (index > ULONG_MAX / 8)
fatal("index overflow: %lu\n", index);
if (lseek(fd, index * 8, SEEK_SET) < 0) {
perror(name);
exit(EXIT_FAILURE);
}
bytes = read(fd, buf, count * 8);
if (bytes < 0) {
perror(name);
exit(EXIT_FAILURE);
}
if (bytes % 8)
fatal("partial read: %lu bytes\n", bytes);
return bytes / 8;
}
static unsigned long kpageflags_read(uint64_t *buf,
unsigned long index,
unsigned long pages)
{
return do_u64_read(kpageflags_fd, PROC_KPAGEFLAGS, buf, index, pages);
}
static unsigned long pagemap_read(uint64_t *buf,
unsigned long index,
unsigned long pages)
{
return do_u64_read(pagemap_fd, "/proc/pid/pagemap", buf, index, pages);
}
static unsigned long pagemap_pfn(uint64_t val)
{
unsigned long pfn;
if (val & PM_PRESENT)
pfn = PM_PFRAME(val);
else
pfn = 0;
return pfn;
}
/* /*
* page flag names * page flag names
@ -255,7 +334,8 @@ static char *page_flag_longname(uint64_t flags)
* page list and summary * page list and summary
*/ */
static void show_page_range(unsigned long offset, uint64_t flags) static void show_page_range(unsigned long voffset,
unsigned long offset, uint64_t flags)
{ {
static uint64_t flags0; static uint64_t flags0;
static unsigned long voff; static unsigned long voff;
@ -281,7 +361,8 @@ static void show_page_range(unsigned long offset, uint64_t flags)
count = 1; count = 1;
} }
static void show_page(unsigned long offset, uint64_t flags) static void show_page(unsigned long voffset,
unsigned long offset, uint64_t flags)
{ {
if (opt_pid) if (opt_pid)
printf("%lx\t", voffset); printf("%lx\t", voffset);
@ -362,6 +443,62 @@ static uint64_t well_known_flags(uint64_t flags)
return flags; return flags;
} }
static uint64_t kpageflags_flags(uint64_t flags)
{
flags = expand_overloaded_flags(flags);
if (!opt_raw)
flags = well_known_flags(flags);
return flags;
}
/*
* page actions
*/
static void prepare_hwpoison_fd(void)
{
char buf[100];
if (opt_hwpoison && !hwpoison_inject_fd) {
sprintf(buf, "%s/corrupt-pfn", hwpoison_debug_fs);
hwpoison_inject_fd = checked_open(buf, O_WRONLY);
}
if (opt_unpoison && !hwpoison_forget_fd) {
sprintf(buf, "%s/renew-pfn", hwpoison_debug_fs);
hwpoison_forget_fd = checked_open(buf, O_WRONLY);
}
}
static int hwpoison_page(unsigned long offset)
{
char buf[100];
int len;
len = sprintf(buf, "0x%lx\n", offset);
len = write(hwpoison_inject_fd, buf, len);
if (len < 0) {
perror("hwpoison inject");
return len;
}
return 0;
}
static int unpoison_page(unsigned long offset)
{
char buf[100];
int len;
len = sprintf(buf, "0x%lx\n", offset);
len = write(hwpoison_forget_fd, buf, len);
if (len < 0) {
perror("hwpoison forget");
return len;
}
return 0;
}
/* /*
* page frame walker * page frame walker
@ -394,104 +531,83 @@ static int hash_slot(uint64_t flags)
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
static void add_page(unsigned long offset, uint64_t flags) static void add_page(unsigned long voffset,
unsigned long offset, uint64_t flags)
{ {
flags = expand_overloaded_flags(flags); flags = kpageflags_flags(flags);
if (!opt_raw)
flags = well_known_flags(flags);
if (!bit_mask_ok(flags)) if (!bit_mask_ok(flags))
return; return;
if (opt_hwpoison)
hwpoison_page(offset);
if (opt_unpoison)
unpoison_page(offset);
if (opt_list == 1) if (opt_list == 1)
show_page_range(offset, flags); show_page_range(voffset, offset, flags);
else if (opt_list == 2) else if (opt_list == 2)
show_page(offset, flags); show_page(voffset, offset, flags);
nr_pages[hash_slot(flags)]++; nr_pages[hash_slot(flags)]++;
total_pages++; total_pages++;
} }
static void walk_pfn(unsigned long index, unsigned long count) #define KPAGEFLAGS_BATCH (64 << 10) /* 64k pages */
static void walk_pfn(unsigned long voffset,
unsigned long index,
unsigned long count)
{ {
uint64_t buf[KPAGEFLAGS_BATCH];
unsigned long batch; unsigned long batch;
unsigned long n; unsigned long pages;
unsigned long i; unsigned long i;
if (index > ULONG_MAX / KPF_BYTES)
fatal("index overflow: %lu\n", index);
lseek(kpageflags_fd, index * KPF_BYTES, SEEK_SET);
while (count) { while (count) {
uint64_t kpageflags_buf[KPF_BYTES * PAGES_BATCH]; batch = min_t(unsigned long, count, KPAGEFLAGS_BATCH);
pages = kpageflags_read(buf, index, batch);
batch = min_t(unsigned long, count, PAGES_BATCH); if (pages == 0)
n = read(kpageflags_fd, kpageflags_buf, batch * KPF_BYTES);
if (n == 0)
break; break;
if (n < 0) {
perror(PROC_KPAGEFLAGS);
exit(EXIT_FAILURE);
}
if (n % KPF_BYTES != 0) for (i = 0; i < pages; i++)
fatal("partial read: %lu bytes\n", n); add_page(voffset + i, index + i, buf[i]);
n = n / KPF_BYTES;
for (i = 0; i < n; i++) index += pages;
add_page(index + i, kpageflags_buf[i]); count -= pages;
index += batch;
count -= batch;
} }
} }
#define PAGEMAP_BATCH (64 << 10)
#define PAGEMAP_BATCH 4096 static void walk_vma(unsigned long index, unsigned long count)
static unsigned long task_pfn(unsigned long pgoff)
{ {
static uint64_t buf[PAGEMAP_BATCH]; uint64_t buf[PAGEMAP_BATCH];
static unsigned long start; unsigned long batch;
static long count; unsigned long pages;
uint64_t pfn; unsigned long pfn;
unsigned long i;
if (pgoff < start || pgoff >= start + count) { while (count) {
if (lseek64(pagemap_fd, batch = min_t(unsigned long, count, PAGEMAP_BATCH);
(uint64_t)pgoff * PM_ENTRY_BYTES, pages = pagemap_read(buf, index, batch);
SEEK_SET) < 0) { if (pages == 0)
perror("pagemap seek"); break;
exit(EXIT_FAILURE);
for (i = 0; i < pages; i++) {
pfn = pagemap_pfn(buf[i]);
if (pfn)
walk_pfn(index + i, pfn, 1);
} }
count = read(pagemap_fd, buf, sizeof(buf));
if (count == 0) index += pages;
return 0; count -= pages;
if (count < 0) {
perror("pagemap read");
exit(EXIT_FAILURE);
}
if (count % PM_ENTRY_BYTES) {
fatal("pagemap read not aligned.\n");
exit(EXIT_FAILURE);
}
count /= PM_ENTRY_BYTES;
start = pgoff;
} }
pfn = buf[pgoff - start];
if (pfn & PM_PRESENT)
pfn = PM_PFRAME(pfn);
else
pfn = 0;
return pfn;
} }
static void walk_task(unsigned long index, unsigned long count) static void walk_task(unsigned long index, unsigned long count)
{ {
int i = 0;
const unsigned long end = index + count; const unsigned long end = index + count;
unsigned long start;
int i = 0;
while (index < end) { while (index < end) {
@ -501,15 +617,11 @@ static void walk_task(unsigned long index, unsigned long count)
if (pg_start[i] >= end) if (pg_start[i] >= end)
return; return;
voffset = max_t(unsigned long, pg_start[i], index); start = max_t(unsigned long, pg_start[i], index);
index = min_t(unsigned long, pg_end[i], end); index = min_t(unsigned long, pg_end[i], end);
assert(voffset < index); assert(start < index);
for (; voffset < index; voffset++) { walk_vma(start, index - start);
unsigned long pfn = task_pfn(voffset);
if (pfn)
walk_pfn(pfn, 1);
}
} }
} }
@ -527,18 +639,14 @@ static void walk_addr_ranges(void)
{ {
int i; int i;
kpageflags_fd = open(PROC_KPAGEFLAGS, O_RDONLY); kpageflags_fd = checked_open(PROC_KPAGEFLAGS, O_RDONLY);
if (kpageflags_fd < 0) {
perror(PROC_KPAGEFLAGS);
exit(EXIT_FAILURE);
}
if (!nr_addr_ranges) if (!nr_addr_ranges)
add_addr_range(0, ULONG_MAX); add_addr_range(0, ULONG_MAX);
for (i = 0; i < nr_addr_ranges; i++) for (i = 0; i < nr_addr_ranges; i++)
if (!opt_pid) if (!opt_pid)
walk_pfn(opt_offset[i], opt_size[i]); walk_pfn(0, opt_offset[i], opt_size[i]);
else else
walk_task(opt_offset[i], opt_size[i]); walk_task(opt_offset[i], opt_size[i]);
@ -575,6 +683,8 @@ static void usage(void)
" -l|--list Show page details in ranges\n" " -l|--list Show page details in ranges\n"
" -L|--list-each Show page details one by one\n" " -L|--list-each Show page details one by one\n"
" -N|--no-summary Don't show summay info\n" " -N|--no-summary Don't show summay info\n"
" -X|--hwpoison hwpoison pages\n"
" -x|--unpoison unpoison pages\n"
" -h|--help Show this usage message\n" " -h|--help Show this usage message\n"
"addr-spec:\n" "addr-spec:\n"
" N one page at offset N (unit: pages)\n" " N one page at offset N (unit: pages)\n"
@ -624,11 +734,7 @@ static void parse_pid(const char *str)
opt_pid = parse_number(str); opt_pid = parse_number(str);
sprintf(buf, "/proc/%d/pagemap", opt_pid); sprintf(buf, "/proc/%d/pagemap", opt_pid);
pagemap_fd = open(buf, O_RDONLY); pagemap_fd = checked_open(buf, O_RDONLY);
if (pagemap_fd < 0) {
perror(buf);
exit(EXIT_FAILURE);
}
sprintf(buf, "/proc/%d/maps", opt_pid); sprintf(buf, "/proc/%d/maps", opt_pid);
file = fopen(buf, "r"); file = fopen(buf, "r");
@ -788,6 +894,8 @@ static struct option opts[] = {
{ "list" , 0, NULL, 'l' }, { "list" , 0, NULL, 'l' },
{ "list-each" , 0, NULL, 'L' }, { "list-each" , 0, NULL, 'L' },
{ "no-summary", 0, NULL, 'N' }, { "no-summary", 0, NULL, 'N' },
{ "hwpoison" , 0, NULL, 'X' },
{ "unpoison" , 0, NULL, 'x' },
{ "help" , 0, NULL, 'h' }, { "help" , 0, NULL, 'h' },
{ NULL , 0, NULL, 0 } { NULL , 0, NULL, 0 }
}; };
@ -799,7 +907,7 @@ int main(int argc, char *argv[])
page_size = getpagesize(); page_size = getpagesize();
while ((c = getopt_long(argc, argv, while ((c = getopt_long(argc, argv,
"rp:f:a:b:lLNh", opts, NULL)) != -1) { "rp:f:a:b:lLNXxh", opts, NULL)) != -1) {
switch (c) { switch (c) {
case 'r': case 'r':
opt_raw = 1; opt_raw = 1;
@ -825,6 +933,14 @@ int main(int argc, char *argv[])
case 'N': case 'N':
opt_no_summary = 1; opt_no_summary = 1;
break; break;
case 'X':
opt_hwpoison = 1;
prepare_hwpoison_fd();
break;
case 'x':
opt_unpoison = 1;
prepare_hwpoison_fd();
break;
case 'h': case 'h':
usage(); usage();
exit(0); exit(0);
@ -844,7 +960,7 @@ int main(int argc, char *argv[])
walk_addr_ranges(); walk_addr_ranges();
if (opt_list == 1) if (opt_list == 1)
show_page_range(0, 0); /* drain the buffer */ show_page_range(0, 0, 0); /* drain the buffer */
if (opt_no_summary) if (opt_no_summary)
return 0; return 0;

View File

@ -57,7 +57,9 @@ There are three components to pagemap:
16. COMPOUND_TAIL 16. COMPOUND_TAIL
16. HUGE 16. HUGE
18. UNEVICTABLE 18. UNEVICTABLE
19. HWPOISON
20. NOPAGE 20. NOPAGE
21. KSM
Short descriptions to the page flags: Short descriptions to the page flags:
@ -86,9 +88,15 @@ Short descriptions to the page flags:
17. HUGE 17. HUGE
this is an integral part of a HugeTLB page this is an integral part of a HugeTLB page
19. HWPOISON
hardware detected memory corruption on this page: don't touch the data!
20. NOPAGE 20. NOPAGE
no page frame exists at the requested address no page frame exists at the requested address
21. KSM
identical memory pages dynamically shared between one or more processes
[IO related page flags] [IO related page flags]
1. ERROR IO error occurred 1. ERROR IO error occurred
3. UPTODATE page has up-to-date data 3. UPTODATE page has up-to-date data

View File

@ -24,8 +24,8 @@ General Remarks
Valid addresses are 0x18, 0x19, 0x1a, and 0x1b. Valid addresses are 0x18, 0x19, 0x1a, and 0x1b.
However, the device cannot be detected without writing to the i2c bus, so no However, the device cannot be detected without writing to the i2c bus, so no
detection is done. detection is done. You should instantiate the device explicitly.
You should force the device address.
$ modprobe ds2482 force=0,0x18 $ modprobe ds2482
$ echo ds2482 0x18 > /sys/bus/i2c/devices/i2c-0/new_device

View File

@ -257,6 +257,13 @@ W: http://www.lesswatts.org/projects/acpi/
S: Supported S: Supported
F: drivers/acpi/fan.c F: drivers/acpi/fan.c
ACPI PROCESSOR AGGREGATOR DRIVER
M: Shaohua Li <shaohua.li@intel.com>
L: linux-acpi@vger.kernel.org
W: http://www.lesswatts.org/projects/acpi/
S: Supported
F: drivers/acpi/acpi_pad.c
ACPI THERMAL DRIVER ACPI THERMAL DRIVER
M: Zhang Rui <rui.zhang@intel.com> M: Zhang Rui <rui.zhang@intel.com>
L: linux-acpi@vger.kernel.org L: linux-acpi@vger.kernel.org
@ -570,6 +577,11 @@ M: Mike Rapoport <mike@compulab.co.il>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
S: Maintained S: Maintained
ARM/CONTEC MICRO9 MACHINE SUPPORT
M: Hubert Feurstein <hubert.feurstein@contec.at>
S: Maintained
F: arch/arm/mach-ep93xx/micro9.c
ARM/CORGI MACHINE SUPPORT ARM/CORGI MACHINE SUPPORT
M: Richard Purdie <rpurdie@rpsys.net> M: Richard Purdie <rpurdie@rpsys.net>
S: Maintained S: Maintained
@ -1224,6 +1236,13 @@ L: netdev@vger.kernel.org
S: Supported S: Supported
F: drivers/net/tg3.* F: drivers/net/tg3.*
BROCADE BFA FC SCSI DRIVER
P: Jing Huang
M: huangj@brocade.com
L: linux-scsi@vger.kernel.org
S: Supported
F: drivers/scsi/bfa/
BSG (block layer generic sg v4 driver) BSG (block layer generic sg v4 driver)
M: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> M: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
L: linux-scsi@vger.kernel.org L: linux-scsi@vger.kernel.org
@ -2051,7 +2070,7 @@ S: Maintained
F: fs/* F: fs/*
FINTEK F75375S HARDWARE MONITOR AND FAN CONTROLLER DRIVER FINTEK F75375S HARDWARE MONITOR AND FAN CONTROLLER DRIVER
M: Riku Voipio <riku.vipio@iki.fi> M: Riku Voipio <riku.voipio@iki.fi>
L: lm-sensors@lm-sensors.org L: lm-sensors@lm-sensors.org
S: Maintained S: Maintained
F: drivers/hwmon/f75375s.c F: drivers/hwmon/f75375s.c
@ -2596,6 +2615,7 @@ L: linux1394-devel@lists.sourceforge.net
W: http://www.linux1394.org/ W: http://www.linux1394.org/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6.git
S: Maintained S: Maintained
F: Documentation/debugging-via-ohci1394.txt
F: drivers/ieee1394/ F: drivers/ieee1394/
IEEE 1394 RAW I/O DRIVER IEEE 1394 RAW I/O DRIVER
@ -3636,10 +3656,18 @@ F: Documentation/blockdev/nbd.txt
F: drivers/block/nbd.c F: drivers/block/nbd.c
F: include/linux/nbd.h F: include/linux/nbd.h
NETWORK DROP MONITOR
M: Neil Horman <nhorman@tuxdriver.com>
L: netdev@vger.kernel.org
S: Maintained
W: https://fedorahosted.org/dropwatch/
F: net/core/drop_monitor.c
NETWORKING [GENERAL] NETWORKING [GENERAL]
M: "David S. Miller" <davem@davemloft.net> M: "David S. Miller" <davem@davemloft.net>
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
W: http://www.linuxfoundation.org/en/Net W: http://www.linuxfoundation.org/en/Net
W: http://patchwork.ozlabs.org/project/netdev/list/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6.git
S: Maintained S: Maintained
F: net/ F: net/
@ -3966,6 +3994,7 @@ F: drivers/block/paride/
PARISC ARCHITECTURE PARISC ARCHITECTURE
M: Kyle McMartin <kyle@mcmartin.ca> M: Kyle McMartin <kyle@mcmartin.ca>
M: Helge Deller <deller@gmx.de> M: Helge Deller <deller@gmx.de>
M: "James E.J. Bottomley" <jejb@parisc-linux.org>
L: linux-parisc@vger.kernel.org L: linux-parisc@vger.kernel.org
W: http://www.parisc-linux.org/ W: http://www.parisc-linux.org/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kyle/parisc-2.6.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/kyle/parisc-2.6.git
@ -4049,6 +4078,13 @@ M: Peter Zijlstra <a.p.zijlstra@chello.nl>
M: Paul Mackerras <paulus@samba.org> M: Paul Mackerras <paulus@samba.org>
M: Ingo Molnar <mingo@elte.hu> M: Ingo Molnar <mingo@elte.hu>
S: Supported S: Supported
F: kernel/perf_event.c
F: include/linux/perf_event.h
F: arch/*/*/kernel/perf_event.c
F: arch/*/include/asm/perf_event.h
F: arch/*/lib/perf_event.c
F: arch/*/kernel/perf_callchain.c
F: tools/perf/
PERSONALITY HANDLING PERSONALITY HANDLING
M: Christoph Hellwig <hch@infradead.org> M: Christoph Hellwig <hch@infradead.org>
@ -4631,6 +4667,14 @@ F: drivers/ata/
F: include/linux/ata.h F: include/linux/ata.h
F: include/linux/libata.h F: include/linux/libata.h
SERVER ENGINES 10Gbps iSCSI - BladeEngine 2 DRIVER
P: Jayamohan Kallickal
M: jayamohank@serverengines.com
L: linux-scsi@vger.kernel.org
W: http://www.serverengines.com
S: Supported
F: drivers/scsi/be2iscsi/
SERVER ENGINES 10Gbps NIC - BladeEngine 2 DRIVER SERVER ENGINES 10Gbps NIC - BladeEngine 2 DRIVER
M: Sathya Perla <sathyap@serverengines.com> M: Sathya Perla <sathyap@serverengines.com>
M: Subbu Seetharaman <subbus@serverengines.com> M: Subbu Seetharaman <subbus@serverengines.com>
@ -5621,6 +5665,13 @@ S: Maintained
F: drivers/vlynq/vlynq.c F: drivers/vlynq/vlynq.c
F: include/linux/vlynq.h F: include/linux/vlynq.h
VMWARE VMXNET3 ETHERNET DRIVER
M: Shreyas Bhatewara <sbhatewara@vmware.com>
M: VMware, Inc. <pv-drivers@vmware.com>
L: netdev@vger.kernel.org
S: Maintained
F: drivers/net/vmxnet3/
VOLTAGE AND CURRENT REGULATOR FRAMEWORK VOLTAGE AND CURRENT REGULATOR FRAMEWORK
M: Liam Girdwood <lrg@slimlogic.co.uk> M: Liam Girdwood <lrg@slimlogic.co.uk>
M: Mark Brown <broonie@opensource.wolfsonmicro.com> M: Mark Brown <broonie@opensource.wolfsonmicro.com>

View File

@ -1,7 +1,7 @@
VERSION = 2 VERSION = 2
PATCHLEVEL = 6 PATCHLEVEL = 6
SUBLEVEL = 32 SUBLEVEL = 32
EXTRAVERSION = -rc2 EXTRAVERSION = -rc5
NAME = Man-Eating Seals of Antiquity NAME = Man-Eating Seals of Antiquity
# *DOCUMENTATION* # *DOCUMENTATION*
@ -179,46 +179,9 @@ SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
# Alternatively CROSS_COMPILE can be set in the environment. # Alternatively CROSS_COMPILE can be set in the environment.
# Default value for CROSS_COMPILE is not to prefix executables # Default value for CROSS_COMPILE is not to prefix executables
# Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile # Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile
#
# To force ARCH and CROSS_COMPILE settings include kernel.* files
# in the kernel tree - do not patch this file.
export KBUILD_BUILDHOST := $(SUBARCH) export KBUILD_BUILDHOST := $(SUBARCH)
ARCH ?= $(SUBARCH)
# Kbuild save the ARCH and CROSS_COMPILE setting in kernel.* files. CROSS_COMPILE ?=
# Restore these settings and check that user did not specify
# conflicting values.
saved_arch := $(shell cat include/generated/kernel.arch 2> /dev/null)
saved_cross := $(shell cat include/generated/kernel.cross 2> /dev/null)
ifneq ($(CROSS_COMPILE),)
ifneq ($(saved_cross),)
ifneq ($(CROSS_COMPILE),$(saved_cross))
$(error CROSS_COMPILE changed from \
"$(saved_cross)" to \
to "$(CROSS_COMPILE)". \
Use "make mrproper" to fix it up)
endif
endif
else
CROSS_COMPILE := $(saved_cross)
endif
ifneq ($(ARCH),)
ifneq ($(saved_arch),)
ifneq ($(saved_arch),$(ARCH))
$(error ARCH changed from \
"$(saved_arch)" to "$(ARCH)". \
Use "make mrproper" to fix it up)
endif
endif
else
ifneq ($(saved_arch),)
ARCH := $(saved_arch)
else
ARCH := $(SUBARCH)
endif
endif
# Architecture as present in compile.h # Architecture as present in compile.h
UTS_MACHINE := $(ARCH) UTS_MACHINE := $(ARCH)
@ -483,11 +446,6 @@ ifeq ($(config-targets),1)
include $(srctree)/arch/$(SRCARCH)/Makefile include $(srctree)/arch/$(SRCARCH)/Makefile
export KBUILD_DEFCONFIG KBUILD_KCONFIG export KBUILD_DEFCONFIG KBUILD_KCONFIG
# save ARCH & CROSS_COMPILE settings
$(shell mkdir -p include/generated && \
echo $(ARCH) > include/generated/kernel.arch && \
echo $(CROSS_COMPILE) > include/generated/kernel.cross)
config: scripts_basic outputmakefile FORCE config: scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux include/config $(Q)mkdir -p include/linux include/config
$(Q)$(MAKE) $(build)=scripts/kconfig $@ $(Q)$(MAKE) $(build)=scripts/kconfig $@

View File

@ -969,7 +969,6 @@ CONFIG_USB_ETH_RNDIS=y
# #
CONFIG_USB_OTG_UTILS=y CONFIG_USB_OTG_UTILS=y
# CONFIG_USB_GPIO_VBUS is not set # CONFIG_USB_GPIO_VBUS is not set
# CONFIG_ISP1301_OMAP is not set
CONFIG_TWL4030_USB=y CONFIG_TWL4030_USB=y
# CONFIG_NOP_USB_XCEIV is not set # CONFIG_NOP_USB_XCEIV is not set
CONFIG_MMC=y CONFIG_MMC=y

View File

@ -84,7 +84,7 @@ ____atomic_test_and_set_bit(unsigned int bit, volatile unsigned long *p)
*p = res | mask; *p = res | mask;
raw_local_irq_restore(flags); raw_local_irq_restore(flags);
return res & mask; return (res & mask) != 0;
} }
static inline int static inline int
@ -101,7 +101,7 @@ ____atomic_test_and_clear_bit(unsigned int bit, volatile unsigned long *p)
*p = res & ~mask; *p = res & ~mask;
raw_local_irq_restore(flags); raw_local_irq_restore(flags);
return res & mask; return (res & mask) != 0;
} }
static inline int static inline int
@ -118,7 +118,7 @@ ____atomic_test_and_change_bit(unsigned int bit, volatile unsigned long *p)
*p = res ^ mask; *p = res ^ mask;
raw_local_irq_restore(flags); raw_local_irq_restore(flags);
return res & mask; return (res & mask) != 0;
} }
#include <asm-generic/bitops/non-atomic.h> #include <asm-generic/bitops/non-atomic.h>

View File

@ -21,6 +21,7 @@
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/time.h> #include <linux/time.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/sched.h>
#include <linux/smp.h> #include <linux/smp.h>
#include <linux/timex.h> #include <linux/timex.h>
#include <linux/errno.h> #include <linux/errno.h>

View File

@ -45,21 +45,21 @@ static int __init user_debug_setup(char *str)
__setup("user_debug=", user_debug_setup); __setup("user_debug=", user_debug_setup);
#endif #endif
static void dump_mem(const char *str, unsigned long bottom, unsigned long top); static void dump_mem(const char *, const char *, unsigned long, unsigned long);
void dump_backtrace_entry(unsigned long where, unsigned long from, unsigned long frame) void dump_backtrace_entry(unsigned long where, unsigned long from, unsigned long frame)
{ {
#ifdef CONFIG_KALLSYMS #ifdef CONFIG_KALLSYMS
printk("[<%08lx>] ", where); char sym1[KSYM_SYMBOL_LEN], sym2[KSYM_SYMBOL_LEN];
print_symbol("(%s) ", where); sprint_symbol(sym1, where);
printk("from [<%08lx>] ", from); sprint_symbol(sym2, from);
print_symbol("(%s)\n", from); printk("[<%08lx>] (%s) from [<%08lx>] (%s)\n", where, sym1, from, sym2);
#else #else
printk("Function entered at [<%08lx>] from [<%08lx>]\n", where, from); printk("Function entered at [<%08lx>] from [<%08lx>]\n", where, from);
#endif #endif
if (in_exception_text(where)) if (in_exception_text(where))
dump_mem("Exception stack", frame + 4, frame + 4 + sizeof(struct pt_regs)); dump_mem("", "Exception stack", frame + 4, frame + 4 + sizeof(struct pt_regs));
} }
#ifndef CONFIG_ARM_UNWIND #ifndef CONFIG_ARM_UNWIND
@ -81,9 +81,10 @@ static int verify_stack(unsigned long sp)
/* /*
* Dump out the contents of some memory nicely... * Dump out the contents of some memory nicely...
*/ */
static void dump_mem(const char *str, unsigned long bottom, unsigned long top) static void dump_mem(const char *lvl, const char *str, unsigned long bottom,
unsigned long top)
{ {
unsigned long p = bottom & ~31; unsigned long first;
mm_segment_t fs; mm_segment_t fs;
int i; int i;
@ -95,33 +96,37 @@ static void dump_mem(const char *str, unsigned long bottom, unsigned long top)
fs = get_fs(); fs = get_fs();
set_fs(KERNEL_DS); set_fs(KERNEL_DS);
printk("%s(0x%08lx to 0x%08lx)\n", str, bottom, top); printk("%s%s(0x%08lx to 0x%08lx)\n", lvl, str, bottom, top);
for (p = bottom & ~31; p < top;) { for (first = bottom & ~31; first < top; first += 32) {
printk("%04lx: ", p & 0xffff); unsigned long p;
char str[sizeof(" 12345678") * 8 + 1];
for (i = 0; i < 8; i++, p += 4) { memset(str, ' ', sizeof(str));
unsigned int val; str[sizeof(str) - 1] = '\0';
if (p < bottom || p >= top) for (p = first, i = 0; i < 8 && p < top; i++, p += 4) {
printk(" "); if (p >= bottom && p < top) {
else { unsigned long val;
__get_user(val, (unsigned long *)p); if (__get_user(val, (unsigned long *)p) == 0)
printk("%08x ", val); sprintf(str + i * 9, " %08lx", val);
else
sprintf(str + i * 9, " ????????");
} }
} }
printk ("\n"); printk("%s%04lx:%s\n", lvl, first & 0xffff, str);
} }
set_fs(fs); set_fs(fs);
} }
static void dump_instr(struct pt_regs *regs) static void dump_instr(const char *lvl, struct pt_regs *regs)
{ {
unsigned long addr = instruction_pointer(regs); unsigned long addr = instruction_pointer(regs);
const int thumb = thumb_mode(regs); const int thumb = thumb_mode(regs);
const int width = thumb ? 4 : 8; const int width = thumb ? 4 : 8;
mm_segment_t fs; mm_segment_t fs;
char str[sizeof("00000000 ") * 5 + 2 + 1], *p = str;
int i; int i;
/* /*
@ -132,7 +137,6 @@ static void dump_instr(struct pt_regs *regs)
fs = get_fs(); fs = get_fs();
set_fs(KERNEL_DS); set_fs(KERNEL_DS);
printk("Code: ");
for (i = -4; i < 1; i++) { for (i = -4; i < 1; i++) {
unsigned int val, bad; unsigned int val, bad;
@ -142,13 +146,14 @@ static void dump_instr(struct pt_regs *regs)
bad = __get_user(val, &((u32 *)addr)[i]); bad = __get_user(val, &((u32 *)addr)[i]);
if (!bad) if (!bad)
printk(i == 0 ? "(%0*x) " : "%0*x ", width, val); p += sprintf(p, i == 0 ? "(%0*x) " : "%0*x ",
width, val);
else { else {
printk("bad PC value."); p += sprintf(p, "bad PC value");
break; break;
} }
} }
printk("\n"); printk("%sCode: %s\n", lvl, str);
set_fs(fs); set_fs(fs);
} }
@ -224,18 +229,19 @@ static void __die(const char *str, int err, struct thread_info *thread, struct p
struct task_struct *tsk = thread->task; struct task_struct *tsk = thread->task;
static int die_counter; static int die_counter;
printk("Internal error: %s: %x [#%d]" S_PREEMPT S_SMP "\n", printk(KERN_EMERG "Internal error: %s: %x [#%d]" S_PREEMPT S_SMP "\n",
str, err, ++die_counter); str, err, ++die_counter);
sysfs_printk_last_file();
print_modules(); print_modules();
__show_regs(regs); __show_regs(regs);
printk("Process %s (pid: %d, stack limit = 0x%p)\n", printk(KERN_EMERG "Process %.*s (pid: %d, stack limit = 0x%p)\n",
tsk->comm, task_pid_nr(tsk), thread + 1); TASK_COMM_LEN, tsk->comm, task_pid_nr(tsk), thread + 1);
if (!user_mode(regs) || in_interrupt()) { if (!user_mode(regs) || in_interrupt()) {
dump_mem("Stack: ", regs->ARM_sp, dump_mem(KERN_EMERG, "Stack: ", regs->ARM_sp,
THREAD_SIZE + (unsigned long)task_stack_page(tsk)); THREAD_SIZE + (unsigned long)task_stack_page(tsk));
dump_backtrace(regs, tsk); dump_backtrace(regs, tsk);
dump_instr(regs); dump_instr(KERN_EMERG, regs);
} }
} }
@ -250,13 +256,14 @@ NORET_TYPE void die(const char *str, struct pt_regs *regs, int err)
oops_enter(); oops_enter();
console_verbose();
spin_lock_irq(&die_lock); spin_lock_irq(&die_lock);
console_verbose();
bust_spinlocks(1); bust_spinlocks(1);
__die(str, err, thread, regs); __die(str, err, thread, regs);
bust_spinlocks(0); bust_spinlocks(0);
add_taint(TAINT_DIE); add_taint(TAINT_DIE);
spin_unlock_irq(&die_lock); spin_unlock_irq(&die_lock);
oops_exit();
if (in_interrupt()) if (in_interrupt())
panic("Fatal exception in interrupt"); panic("Fatal exception in interrupt");
@ -264,7 +271,6 @@ NORET_TYPE void die(const char *str, struct pt_regs *regs, int err)
if (panic_on_oops) if (panic_on_oops)
panic("Fatal exception"); panic("Fatal exception");
oops_exit();
do_exit(SIGSEGV); do_exit(SIGSEGV);
} }
@ -349,7 +355,7 @@ asmlinkage void __exception do_undefinstr(struct pt_regs *regs)
if (user_debug & UDBG_UNDEFINED) { if (user_debug & UDBG_UNDEFINED) {
printk(KERN_INFO "%s (%d): undefined instruction: pc=%p\n", printk(KERN_INFO "%s (%d): undefined instruction: pc=%p\n",
current->comm, task_pid_nr(current), pc); current->comm, task_pid_nr(current), pc);
dump_instr(regs); dump_instr(KERN_INFO, regs);
} }
#endif #endif
@ -400,7 +406,7 @@ static int bad_syscall(int n, struct pt_regs *regs)
if (user_debug & UDBG_SYSCALL) { if (user_debug & UDBG_SYSCALL) {
printk(KERN_ERR "[%d] %s: obsolete system call %08x.\n", printk(KERN_ERR "[%d] %s: obsolete system call %08x.\n",
task_pid_nr(current), current->comm, n); task_pid_nr(current), current->comm, n);
dump_instr(regs); dump_instr(KERN_ERR, regs);
} }
#endif #endif
@ -579,7 +585,7 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs)
if (user_debug & UDBG_SYSCALL) { if (user_debug & UDBG_SYSCALL) {
printk("[%d] %s: arm syscall %d\n", printk("[%d] %s: arm syscall %d\n",
task_pid_nr(current), current->comm, no); task_pid_nr(current), current->comm, no);
dump_instr(regs); dump_instr("", regs);
if (user_mode(regs)) { if (user_mode(regs)) {
__show_regs(regs); __show_regs(regs);
c_backtrace(regs->ARM_fp, processor_mode(regs)); c_backtrace(regs->ARM_fp, processor_mode(regs));
@ -656,7 +662,7 @@ baddataabort(int code, unsigned long instr, struct pt_regs *regs)
if (user_debug & UDBG_BADABORT) { if (user_debug & UDBG_BADABORT) {
printk(KERN_ERR "[%d] %s: bad data abort: code %d instr 0x%08lx\n", printk(KERN_ERR "[%d] %s: bad data abort: code %d instr 0x%08lx\n",
task_pid_nr(current), current->comm, code, instr); task_pid_nr(current), current->comm, code, instr);
dump_instr(regs); dump_instr(KERN_ERR, regs);
show_pte(current->mm, addr); show_pte(current->mm, addr);
} }
#endif #endif

View File

@ -271,12 +271,12 @@ static struct irqaction bcmring_timer_irq = {
.handler = bcmring_timer_interrupt, .handler = bcmring_timer_interrupt,
}; };
static cycle_t bcmring_get_cycles_timer1(void) static cycle_t bcmring_get_cycles_timer1(struct clocksource *cs)
{ {
return ~readl(TIMER1_VA_BASE + TIMER_VALUE); return ~readl(TIMER1_VA_BASE + TIMER_VALUE);
} }
static cycle_t bcmring_get_cycles_timer3(void) static cycle_t bcmring_get_cycles_timer3(struct clocksource *cs)
{ {
return ~readl(TIMER3_VA_BASE + TIMER_VALUE); return ~readl(TIMER3_VA_BASE + TIMER_VALUE);
} }

View File

@ -29,7 +29,7 @@ static inline void arch_idle(void)
cpu_do_idle(); cpu_do_idle();
} }
static inline void arch_reset(char mode, char *cmd) static inline void arch_reset(char mode, const char *cmd)
{ {
printk("arch_reset:%c %x\n", mode, bcmring_arch_warm_reboot); printk("arch_reset:%c %x\n", mode, bcmring_arch_warm_reboot);

View File

@ -17,13 +17,31 @@ config EP93XX_SDCE3_SYNC_PHYS_OFFSET
bool "0x00000000 - SDCE3/SyncBoot" bool "0x00000000 - SDCE3/SyncBoot"
help help
Select this option if you want support for EP93xx boards with the Select this option if you want support for EP93xx boards with the
first SDRAM bank at 0x00000000 first SDRAM bank at 0x00000000.
config EP93XX_SDCE0_PHYS_OFFSET config EP93XX_SDCE0_PHYS_OFFSET
bool "0xc0000000 - SDCEO" bool "0xc0000000 - SDCEO"
help help
Select this option if you want support for EP93xx boards with the Select this option if you want support for EP93xx boards with the
first SDRAM bank at 0xc0000000 first SDRAM bank at 0xc0000000.
config EP93XX_SDCE1_PHYS_OFFSET
bool "0xd0000000 - SDCE1"
help
Select this option if you want support for EP93xx boards with the
first SDRAM bank at 0xd0000000.
config EP93XX_SDCE2_PHYS_OFFSET
bool "0xe0000000 - SDCE2"
help
Select this option if you want support for EP93xx boards with the
first SDRAM bank at 0xe0000000.
config EP93XX_SDCE3_ASYNC_PHYS_OFFSET
bool "0xf0000000 - SDCE3/AsyncBoot"
help
Select this option if you want support for EP93xx boards with the
first SDRAM bank at 0xf0000000.
endchoice endchoice
@ -112,28 +130,36 @@ config MACH_MICRO9
bool bool
config MACH_MICRO9H config MACH_MICRO9H
bool "Support Contec Hypercontrol Micro9-H" bool "Support Contec Micro9-High"
depends on EP93XX_SDCE3_SYNC_PHYS_OFFSET depends on EP93XX_SDCE3_SYNC_PHYS_OFFSET
select MACH_MICRO9 select MACH_MICRO9
help help
Say 'Y' here if you want your kernel to support the Say 'Y' here if you want your kernel to support the
Contec Hypercontrol Micro9-H board. Contec Micro9-High board.
config MACH_MICRO9M config MACH_MICRO9M
bool "Support Contec Hypercontrol Micro9-M" bool "Support Contec Micro9-Mid"
depends on EP93XX_SDCE3_SYNC_PHYS_OFFSET depends on EP93XX_SDCE3_ASYNC_PHYS_OFFSET
select MACH_MICRO9 select MACH_MICRO9
help help
Say 'Y' here if you want your kernel to support the Say 'Y' here if you want your kernel to support the
Contec Hypercontrol Micro9-M board. Contec Micro9-Mid board.
config MACH_MICRO9L config MACH_MICRO9L
bool "Support Contec Hypercontrol Micro9-L" bool "Support Contec Micro9-Lite"
depends on EP93XX_SDCE3_SYNC_PHYS_OFFSET depends on EP93XX_SDCE3_SYNC_PHYS_OFFSET
select MACH_MICRO9 select MACH_MICRO9
help help
Say 'Y' here if you want your kernel to support the Say 'Y' here if you want your kernel to support the
Contec Hypercontrol Micro9-L board. Contec Micro9-Lite board.
config MACH_MICRO9S
bool "Support Contec Micro9-Slim"
depends on EP93XX_SDCE3_ASYNC_PHYS_OFFSET
select MACH_MICRO9
help
Say 'Y' here if you want your kernel to support the
Contec Micro9-Slim board.
config MACH_TS72XX config MACH_TS72XX
bool "Support Technologic Systems TS-72xx SBC" bool "Support Technologic Systems TS-72xx SBC"

View File

@ -3,3 +3,12 @@ params_phys-$(CONFIG_EP93XX_SDCE3_SYNC_PHYS_OFFSET) := 0x00000100
zreladdr-$(CONFIG_EP93XX_SDCE0_PHYS_OFFSET) := 0xc0008000 zreladdr-$(CONFIG_EP93XX_SDCE0_PHYS_OFFSET) := 0xc0008000
params_phys-$(CONFIG_EP93XX_SDCE0_PHYS_OFFSET) := 0xc0000100 params_phys-$(CONFIG_EP93XX_SDCE0_PHYS_OFFSET) := 0xc0000100
zreladdr-$(CONFIG_EP93XX_SDCE1_PHYS_OFFSET) := 0xd0008000
params_phys-$(CONFIG_EP93XX_SDCE1_PHYS_OFFSET) := 0xd0000100
zreladdr-$(CONFIG_EP93XX_SDCE2_PHYS_OFFSET) := 0xe0008000
params_phys-$(CONFIG_EP93XX_SDCE2_PHYS_OFFSET) := 0xe0000100
zreladdr-$(CONFIG_EP93XX_SDCE3_ASYNC_PHYS_OFFSET) := 0xf0008000
params_phys-$(CONFIG_EP93XX_SDCE3_ASYNC_PHYS_OFFSET) := 0xf0000100

View File

@ -16,13 +16,16 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/string.h> #include <linux/string.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/spinlock.h>
#include <mach/hardware.h>
#include <asm/clkdev.h> #include <asm/clkdev.h>
#include <asm/div64.h> #include <asm/div64.h>
#include <mach/hardware.h>
struct clk { struct clk {
struct clk *parent;
unsigned long rate; unsigned long rate;
int users; int users;
int sw_locked; int sw_locked;
@ -39,40 +42,60 @@ static unsigned long get_uart_rate(struct clk *clk);
static int set_keytchclk_rate(struct clk *clk, unsigned long rate); static int set_keytchclk_rate(struct clk *clk, unsigned long rate);
static int set_div_rate(struct clk *clk, unsigned long rate); static int set_div_rate(struct clk *clk, unsigned long rate);
static struct clk clk_xtali = {
.rate = EP93XX_EXT_CLK_RATE,
};
static struct clk clk_uart1 = { static struct clk clk_uart1 = {
.parent = &clk_xtali,
.sw_locked = 1, .sw_locked = 1,
.enable_reg = EP93XX_SYSCON_DEVCFG, .enable_reg = EP93XX_SYSCON_DEVCFG,
.enable_mask = EP93XX_SYSCON_DEVCFG_U1EN, .enable_mask = EP93XX_SYSCON_DEVCFG_U1EN,
.get_rate = get_uart_rate, .get_rate = get_uart_rate,
}; };
static struct clk clk_uart2 = { static struct clk clk_uart2 = {
.parent = &clk_xtali,
.sw_locked = 1, .sw_locked = 1,
.enable_reg = EP93XX_SYSCON_DEVCFG, .enable_reg = EP93XX_SYSCON_DEVCFG,
.enable_mask = EP93XX_SYSCON_DEVCFG_U2EN, .enable_mask = EP93XX_SYSCON_DEVCFG_U2EN,
.get_rate = get_uart_rate, .get_rate = get_uart_rate,
}; };
static struct clk clk_uart3 = { static struct clk clk_uart3 = {
.parent = &clk_xtali,
.sw_locked = 1, .sw_locked = 1,
.enable_reg = EP93XX_SYSCON_DEVCFG, .enable_reg = EP93XX_SYSCON_DEVCFG,
.enable_mask = EP93XX_SYSCON_DEVCFG_U3EN, .enable_mask = EP93XX_SYSCON_DEVCFG_U3EN,
.get_rate = get_uart_rate, .get_rate = get_uart_rate,
}; };
static struct clk clk_pll1; static struct clk clk_pll1 = {
static struct clk clk_f; .parent = &clk_xtali,
static struct clk clk_h; };
static struct clk clk_p; static struct clk clk_f = {
static struct clk clk_pll2; .parent = &clk_pll1,
};
static struct clk clk_h = {
.parent = &clk_pll1,
};
static struct clk clk_p = {
.parent = &clk_pll1,
};
static struct clk clk_pll2 = {
.parent = &clk_xtali,
};
static struct clk clk_usb_host = { static struct clk clk_usb_host = {
.parent = &clk_pll2,
.enable_reg = EP93XX_SYSCON_PWRCNT, .enable_reg = EP93XX_SYSCON_PWRCNT,
.enable_mask = EP93XX_SYSCON_PWRCNT_USH_EN, .enable_mask = EP93XX_SYSCON_PWRCNT_USH_EN,
}; };
static struct clk clk_keypad = { static struct clk clk_keypad = {
.parent = &clk_xtali,
.sw_locked = 1, .sw_locked = 1,
.enable_reg = EP93XX_SYSCON_KEYTCHCLKDIV, .enable_reg = EP93XX_SYSCON_KEYTCHCLKDIV,
.enable_mask = EP93XX_SYSCON_KEYTCHCLKDIV_KEN, .enable_mask = EP93XX_SYSCON_KEYTCHCLKDIV_KEN,
.set_rate = set_keytchclk_rate, .set_rate = set_keytchclk_rate,
}; };
static struct clk clk_pwm = { static struct clk clk_pwm = {
.parent = &clk_xtali,
.rate = EP93XX_EXT_CLK_RATE, .rate = EP93XX_EXT_CLK_RATE,
}; };
@ -85,50 +108,62 @@ static struct clk clk_video = {
/* DMA Clocks */ /* DMA Clocks */
static struct clk clk_m2p0 = { static struct clk clk_m2p0 = {
.parent = &clk_h,
.enable_reg = EP93XX_SYSCON_PWRCNT, .enable_reg = EP93XX_SYSCON_PWRCNT,
.enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P0, .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P0,
}; };
static struct clk clk_m2p1 = { static struct clk clk_m2p1 = {
.parent = &clk_h,
.enable_reg = EP93XX_SYSCON_PWRCNT, .enable_reg = EP93XX_SYSCON_PWRCNT,
.enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P1, .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P1,
}; };
static struct clk clk_m2p2 = { static struct clk clk_m2p2 = {
.parent = &clk_h,
.enable_reg = EP93XX_SYSCON_PWRCNT, .enable_reg = EP93XX_SYSCON_PWRCNT,
.enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P2, .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P2,
}; };
static struct clk clk_m2p3 = { static struct clk clk_m2p3 = {
.parent = &clk_h,
.enable_reg = EP93XX_SYSCON_PWRCNT, .enable_reg = EP93XX_SYSCON_PWRCNT,
.enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P3, .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P3,
}; };
static struct clk clk_m2p4 = { static struct clk clk_m2p4 = {
.parent = &clk_h,
.enable_reg = EP93XX_SYSCON_PWRCNT, .enable_reg = EP93XX_SYSCON_PWRCNT,
.enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P4, .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P4,
}; };
static struct clk clk_m2p5 = { static struct clk clk_m2p5 = {
.parent = &clk_h,
.enable_reg = EP93XX_SYSCON_PWRCNT, .enable_reg = EP93XX_SYSCON_PWRCNT,
.enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P5, .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P5,
}; };
static struct clk clk_m2p6 = { static struct clk clk_m2p6 = {
.parent = &clk_h,
.enable_reg = EP93XX_SYSCON_PWRCNT, .enable_reg = EP93XX_SYSCON_PWRCNT,
.enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P6, .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P6,
}; };
static struct clk clk_m2p7 = { static struct clk clk_m2p7 = {
.parent = &clk_h,
.enable_reg = EP93XX_SYSCON_PWRCNT, .enable_reg = EP93XX_SYSCON_PWRCNT,
.enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P7, .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P7,
}; };
static struct clk clk_m2p8 = { static struct clk clk_m2p8 = {
.parent = &clk_h,
.enable_reg = EP93XX_SYSCON_PWRCNT, .enable_reg = EP93XX_SYSCON_PWRCNT,
.enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P8, .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P8,
}; };
static struct clk clk_m2p9 = { static struct clk clk_m2p9 = {
.parent = &clk_h,
.enable_reg = EP93XX_SYSCON_PWRCNT, .enable_reg = EP93XX_SYSCON_PWRCNT,
.enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P9, .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2P9,
}; };
static struct clk clk_m2m0 = { static struct clk clk_m2m0 = {
.parent = &clk_h,
.enable_reg = EP93XX_SYSCON_PWRCNT, .enable_reg = EP93XX_SYSCON_PWRCNT,
.enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2M0, .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2M0,
}; };
static struct clk clk_m2m1 = { static struct clk clk_m2m1 = {
.parent = &clk_h,
.enable_reg = EP93XX_SYSCON_PWRCNT, .enable_reg = EP93XX_SYSCON_PWRCNT,
.enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2M1, .enable_mask = EP93XX_SYSCON_PWRCNT_DMA_M2M1,
}; };
@ -137,6 +172,7 @@ static struct clk clk_m2m1 = {
{ .dev_id = dev, .con_id = con, .clk = ck } { .dev_id = dev, .con_id = con, .clk = ck }
static struct clk_lookup clocks[] = { static struct clk_lookup clocks[] = {
INIT_CK(NULL, "xtali", &clk_xtali),
INIT_CK("apb:uart1", NULL, &clk_uart1), INIT_CK("apb:uart1", NULL, &clk_uart1),
INIT_CK("apb:uart2", NULL, &clk_uart2), INIT_CK("apb:uart2", NULL, &clk_uart2),
INIT_CK("apb:uart3", NULL, &clk_uart3), INIT_CK("apb:uart3", NULL, &clk_uart3),
@ -163,48 +199,84 @@ static struct clk_lookup clocks[] = {
INIT_CK(NULL, "m2m1", &clk_m2m1), INIT_CK(NULL, "m2m1", &clk_m2m1),
}; };
static DEFINE_SPINLOCK(clk_lock);
static void __clk_enable(struct clk *clk)
{
if (!clk->users++) {
if (clk->parent)
__clk_enable(clk->parent);
if (clk->enable_reg) {
u32 v;
v = __raw_readl(clk->enable_reg);
v |= clk->enable_mask;
if (clk->sw_locked)
ep93xx_syscon_swlocked_write(v, clk->enable_reg);
else
__raw_writel(v, clk->enable_reg);
}
}
}
int clk_enable(struct clk *clk) int clk_enable(struct clk *clk)
{ {
if (!clk->users++ && clk->enable_reg) { unsigned long flags;
u32 value;
value = __raw_readl(clk->enable_reg); if (!clk)
value |= clk->enable_mask; return -EINVAL;
if (clk->sw_locked)
ep93xx_syscon_swlocked_write(value, clk->enable_reg); spin_lock_irqsave(&clk_lock, flags);
else __clk_enable(clk);
__raw_writel(value, clk->enable_reg); spin_unlock_irqrestore(&clk_lock, flags);
}
return 0; return 0;
} }
EXPORT_SYMBOL(clk_enable); EXPORT_SYMBOL(clk_enable);
static void __clk_disable(struct clk *clk)
{
if (!--clk->users) {
if (clk->enable_reg) {
u32 v;
v = __raw_readl(clk->enable_reg);
v &= ~clk->enable_mask;
if (clk->sw_locked)
ep93xx_syscon_swlocked_write(v, clk->enable_reg);
else
__raw_writel(v, clk->enable_reg);
}
if (clk->parent)
__clk_disable(clk->parent);
}
}
void clk_disable(struct clk *clk) void clk_disable(struct clk *clk)
{ {
if (!--clk->users && clk->enable_reg) { unsigned long flags;
u32 value;
value = __raw_readl(clk->enable_reg); if (!clk)
value &= ~clk->enable_mask; return;
if (clk->sw_locked)
ep93xx_syscon_swlocked_write(value, clk->enable_reg); spin_lock_irqsave(&clk_lock, flags);
else __clk_disable(clk);
__raw_writel(value, clk->enable_reg); spin_unlock_irqrestore(&clk_lock, flags);
}
} }
EXPORT_SYMBOL(clk_disable); EXPORT_SYMBOL(clk_disable);
static unsigned long get_uart_rate(struct clk *clk) static unsigned long get_uart_rate(struct clk *clk)
{ {
unsigned long rate = clk_get_rate(clk->parent);
u32 value; u32 value;
value = __raw_readl(EP93XX_SYSCON_PWRCNT); value = __raw_readl(EP93XX_SYSCON_PWRCNT);
if (value & EP93XX_SYSCON_PWRCNT_UARTBAUD) if (value & EP93XX_SYSCON_PWRCNT_UARTBAUD)
return EP93XX_EXT_CLK_RATE; return rate;
else else
return EP93XX_EXT_CLK_RATE / 2; return rate / 2;
} }
unsigned long clk_get_rate(struct clk *clk) unsigned long clk_get_rate(struct clk *clk)
@ -244,16 +316,16 @@ static int set_keytchclk_rate(struct clk *clk, unsigned long rate)
return 0; return 0;
} }
static unsigned long calc_clk_div(unsigned long rate, int *psel, int *esel, static int calc_clk_div(struct clk *clk, unsigned long rate,
int *pdiv, int *div) int *psel, int *esel, int *pdiv, int *div)
{ {
unsigned long max_rate, best_rate = 0, struct clk *mclk;
actual_rate = 0, mclk_rate = 0, rate_err = -1; unsigned long max_rate, actual_rate, mclk_rate, rate_err = -1;
int i, found = 0, __div = 0, __pdiv = 0; int i, found = 0, __div = 0, __pdiv = 0;
/* Don't exceed the maximum rate */ /* Don't exceed the maximum rate */
max_rate = max(max(clk_pll1.rate / 4, clk_pll2.rate / 4), max_rate = max(max(clk_pll1.rate / 4, clk_pll2.rate / 4),
(unsigned long)EP93XX_EXT_CLK_RATE / 4); clk_xtali.rate / 4);
rate = min(rate, max_rate); rate = min(rate, max_rate);
/* /*
@ -267,11 +339,12 @@ static unsigned long calc_clk_div(unsigned long rate, int *psel, int *esel,
*/ */
for (i = 0; i < 3; i++) { for (i = 0; i < 3; i++) {
if (i == 0) if (i == 0)
mclk_rate = EP93XX_EXT_CLK_RATE * 2; mclk = &clk_xtali;
else if (i == 1) else if (i == 1)
mclk_rate = clk_pll1.rate * 2; mclk = &clk_pll1;
else if (i == 2) else
mclk_rate = clk_pll2.rate * 2; mclk = &clk_pll2;
mclk_rate = mclk->rate * 2;
/* Try each predivider value */ /* Try each predivider value */
for (__pdiv = 4; __pdiv <= 6; __pdiv++) { for (__pdiv = 4; __pdiv <= 6; __pdiv++) {
@ -286,7 +359,8 @@ static unsigned long calc_clk_div(unsigned long rate, int *psel, int *esel,
*div = __div; *div = __div;
*psel = (i == 2); *psel = (i == 2);
*esel = (i != 0); *esel = (i != 0);
best_rate = actual_rate; clk->parent = mclk;
clk->rate = actual_rate;
rate_err = abs(actual_rate - rate); rate_err = abs(actual_rate - rate);
found = 1; found = 1;
} }
@ -294,21 +368,19 @@ static unsigned long calc_clk_div(unsigned long rate, int *psel, int *esel,
} }
if (!found) if (!found)
return 0; return -EINVAL;
return best_rate; return 0;
} }
static int set_div_rate(struct clk *clk, unsigned long rate) static int set_div_rate(struct clk *clk, unsigned long rate)
{ {
unsigned long actual_rate; int err, psel = 0, esel = 0, pdiv = 0, div = 0;
int psel = 0, esel = 0, pdiv = 0, div = 0;
u32 val; u32 val;
actual_rate = calc_clk_div(rate, &psel, &esel, &pdiv, &div); err = calc_clk_div(clk, rate, &psel, &esel, &pdiv, &div);
if (actual_rate == 0) if (err)
return -EINVAL; return err;
clk->rate = actual_rate;
/* Clear the esel, psel, pdiv and div bits */ /* Clear the esel, psel, pdiv and div bits */
val = __raw_readl(clk->enable_reg); val = __raw_readl(clk->enable_reg);
@ -344,7 +416,7 @@ static unsigned long calc_pll_rate(u32 config_word)
unsigned long long rate; unsigned long long rate;
int i; int i;
rate = EP93XX_EXT_CLK_RATE; rate = clk_xtali.rate;
rate *= ((config_word >> 11) & 0x1f) + 1; /* X1FBD */ rate *= ((config_word >> 11) & 0x1f) + 1; /* X1FBD */
rate *= ((config_word >> 5) & 0x3f) + 1; /* X2FBD */ rate *= ((config_word >> 5) & 0x3f) + 1; /* X2FBD */
do_div(rate, (config_word & 0x1f) + 1); /* X2IPD */ do_div(rate, (config_word & 0x1f) + 1); /* X2IPD */
@ -377,7 +449,7 @@ static int __init ep93xx_clock_init(void)
value = __raw_readl(EP93XX_SYSCON_CLOCK_SET1); value = __raw_readl(EP93XX_SYSCON_CLOCK_SET1);
if (!(value & 0x00800000)) { /* PLL1 bypassed? */ if (!(value & 0x00800000)) { /* PLL1 bypassed? */
clk_pll1.rate = EP93XX_EXT_CLK_RATE; clk_pll1.rate = clk_xtali.rate;
} else { } else {
clk_pll1.rate = calc_pll_rate(value); clk_pll1.rate = calc_pll_rate(value);
} }
@ -388,7 +460,7 @@ static int __init ep93xx_clock_init(void)
value = __raw_readl(EP93XX_SYSCON_CLOCK_SET2); value = __raw_readl(EP93XX_SYSCON_CLOCK_SET2);
if (!(value & 0x00080000)) { /* PLL2 bypassed? */ if (!(value & 0x00080000)) { /* PLL2 bypassed? */
clk_pll2.rate = EP93XX_EXT_CLK_RATE; clk_pll2.rate = clk_xtali.rate;
} else if (value & 0x00040000) { /* PLL2 enabled? */ } else if (value & 0x00040000) { /* PLL2 enabled? */
clk_pll2.rate = calc_pll_rate(value); clk_pll2.rate = calc_pll_rate(value);
} else { } else {

View File

@ -550,13 +550,11 @@ void __init ep93xx_register_eth(struct ep93xx_eth_data *data, int copy_addr)
platform_device_register(&ep93xx_eth_device); platform_device_register(&ep93xx_eth_device);
} }
static struct i2c_gpio_platform_data ep93xx_i2c_data = {
.sda_pin = EP93XX_GPIO_LINE_EEDAT, /*************************************************************************
.sda_is_open_drain = 0, * EP93xx i2c peripheral handling
.scl_pin = EP93XX_GPIO_LINE_EECLK, *************************************************************************/
.scl_is_open_drain = 0, static struct i2c_gpio_platform_data ep93xx_i2c_data;
.udelay = 2,
};
static struct platform_device ep93xx_i2c_device = { static struct platform_device ep93xx_i2c_device = {
.name = "i2c-gpio", .name = "i2c-gpio",
@ -564,8 +562,25 @@ static struct platform_device ep93xx_i2c_device = {
.dev.platform_data = &ep93xx_i2c_data, .dev.platform_data = &ep93xx_i2c_data,
}; };
void __init ep93xx_register_i2c(struct i2c_board_info *devices, int num) void __init ep93xx_register_i2c(struct i2c_gpio_platform_data *data,
struct i2c_board_info *devices, int num)
{ {
/*
* Set the EEPROM interface pin drive type control.
* Defines the driver type for the EECLK and EEDAT pins as either
* open drain, which will require an external pull-up, or a normal
* CMOS driver.
*/
if (data->sda_is_open_drain && data->sda_pin != EP93XX_GPIO_LINE_EEDAT)
pr_warning("ep93xx: sda != EEDAT, open drain has no effect\n");
if (data->scl_is_open_drain && data->scl_pin != EP93XX_GPIO_LINE_EECLK)
pr_warning("ep93xx: scl != EECLK, open drain has no effect\n");
__raw_writel((data->sda_is_open_drain << 1) |
(data->scl_is_open_drain << 0),
EP93XX_GPIO_EEDRIVE);
ep93xx_i2c_data = *data;
i2c_register_board_info(0, devices, num); i2c_register_board_info(0, devices, num);
platform_device_register(&ep93xx_i2c_device); platform_device_register(&ep93xx_i2c_device);
} }

View File

@ -27,8 +27,10 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/i2c.h>
#include <linux/mtd/physmap.h> #include <linux/mtd/physmap.h>
#include <linux/gpio.h>
#include <linux/i2c.h>
#include <linux/i2c-gpio.h>
#include <mach/hardware.h> #include <mach/hardware.h>
@ -76,13 +78,26 @@ static struct ep93xx_eth_data edb93xx_eth_data = {
.phy_id = 1, .phy_id = 1,
}; };
static struct i2c_board_info __initdata edb93xxa_i2c_data[] = {
/*************************************************************************
* EDB93xx i2c peripheral handling
*************************************************************************/
static struct i2c_gpio_platform_data edb93xx_i2c_gpio_data = {
.sda_pin = EP93XX_GPIO_LINE_EEDAT,
.sda_is_open_drain = 0,
.scl_pin = EP93XX_GPIO_LINE_EECLK,
.scl_is_open_drain = 0,
.udelay = 0, /* default to 100 kHz */
.timeout = 0, /* default to 100 ms */
};
static struct i2c_board_info __initdata edb93xxa_i2c_board_info[] = {
{ {
I2C_BOARD_INFO("isl1208", 0x6f), I2C_BOARD_INFO("isl1208", 0x6f),
}, },
}; };
static struct i2c_board_info __initdata edb93xx_i2c_data[] = { static struct i2c_board_info __initdata edb93xx_i2c_board_info[] = {
{ {
I2C_BOARD_INFO("ds1337", 0x68), I2C_BOARD_INFO("ds1337", 0x68),
}, },
@ -92,12 +107,14 @@ static void __init edb93xx_register_i2c(void)
{ {
if (machine_is_edb9302a() || machine_is_edb9307a() || if (machine_is_edb9302a() || machine_is_edb9307a() ||
machine_is_edb9315a()) { machine_is_edb9315a()) {
ep93xx_register_i2c(edb93xxa_i2c_data, ep93xx_register_i2c(&edb93xx_i2c_gpio_data,
ARRAY_SIZE(edb93xxa_i2c_data)); edb93xxa_i2c_board_info,
ARRAY_SIZE(edb93xxa_i2c_board_info));
} else if (machine_is_edb9307() || machine_is_edb9312() || } else if (machine_is_edb9307() || machine_is_edb9312() ||
machine_is_edb9315()) { machine_is_edb9315()) {
ep93xx_register_i2c(edb93xx_i2c_data, ep93xx_register_i2c(&edb93xx_i2c_gpio_data
ARRAY_SIZE(edb93xx_i2c_data)); edb93xx_i2c_board_info,
ARRAY_SIZE(edb93xx_i2c_board_info));
} }
} }

View File

@ -52,25 +52,27 @@
#define EP93XX_AHB_VIRT_BASE 0xfef00000 #define EP93XX_AHB_VIRT_BASE 0xfef00000
#define EP93XX_AHB_SIZE 0x00100000 #define EP93XX_AHB_SIZE 0x00100000
#define EP93XX_AHB_PHYS(x) (EP93XX_AHB_PHYS_BASE + (x))
#define EP93XX_AHB_IOMEM(x) IOMEM(EP93XX_AHB_VIRT_BASE + (x)) #define EP93XX_AHB_IOMEM(x) IOMEM(EP93XX_AHB_VIRT_BASE + (x))
#define EP93XX_APB_PHYS_BASE 0x80800000 #define EP93XX_APB_PHYS_BASE 0x80800000
#define EP93XX_APB_VIRT_BASE 0xfed00000 #define EP93XX_APB_VIRT_BASE 0xfed00000
#define EP93XX_APB_SIZE 0x00200000 #define EP93XX_APB_SIZE 0x00200000
#define EP93XX_APB_PHYS(x) (EP93XX_APB_PHYS_BASE + (x))
#define EP93XX_APB_IOMEM(x) IOMEM(EP93XX_APB_VIRT_BASE + (x)) #define EP93XX_APB_IOMEM(x) IOMEM(EP93XX_APB_VIRT_BASE + (x))
/* AHB peripherals */ /* AHB peripherals */
#define EP93XX_DMA_BASE EP93XX_AHB_IOMEM(0x00000000) #define EP93XX_DMA_BASE EP93XX_AHB_IOMEM(0x00000000)
#define EP93XX_ETHERNET_PHYS_BASE (EP93XX_AHB_PHYS_BASE + 0x00010000) #define EP93XX_ETHERNET_PHYS_BASE EP93XX_AHB_PHYS(0x00010000)
#define EP93XX_ETHERNET_BASE EP93XX_AHB_IOMEM(0x00010000) #define EP93XX_ETHERNET_BASE EP93XX_AHB_IOMEM(0x00010000)
#define EP93XX_USB_PHYS_BASE (EP93XX_AHB_PHYS_BASE + 0x00020000) #define EP93XX_USB_PHYS_BASE EP93XX_AHB_PHYS(0x00020000)
#define EP93XX_USB_BASE EP93XX_AHB_IOMEM(0x00020000) #define EP93XX_USB_BASE EP93XX_AHB_IOMEM(0x00020000)
#define EP93XX_RASTER_PHYS_BASE (EP93XX_AHB_PHYS_BASE + 0x00030000) #define EP93XX_RASTER_PHYS_BASE EP93XX_AHB_PHYS(0x00030000)
#define EP93XX_RASTER_BASE EP93XX_AHB_IOMEM(0x00030000) #define EP93XX_RASTER_BASE EP93XX_AHB_IOMEM(0x00030000)
#define EP93XX_GRAPHICS_ACCEL_BASE EP93XX_AHB_IOMEM(0x00040000) #define EP93XX_GRAPHICS_ACCEL_BASE EP93XX_AHB_IOMEM(0x00040000)
@ -112,21 +114,10 @@
#define EP93XX_GPIO_BASE EP93XX_APB_IOMEM(0x00040000) #define EP93XX_GPIO_BASE EP93XX_APB_IOMEM(0x00040000)
#define EP93XX_GPIO_REG(x) (EP93XX_GPIO_BASE + (x)) #define EP93XX_GPIO_REG(x) (EP93XX_GPIO_BASE + (x))
#define EP93XX_GPIO_F_INT_TYPE1 EP93XX_GPIO_REG(0x4c)
#define EP93XX_GPIO_F_INT_TYPE2 EP93XX_GPIO_REG(0x50)
#define EP93XX_GPIO_F_INT_ACK EP93XX_GPIO_REG(0x54)
#define EP93XX_GPIO_F_INT_ENABLE EP93XX_GPIO_REG(0x58)
#define EP93XX_GPIO_F_INT_STATUS EP93XX_GPIO_REG(0x5c) #define EP93XX_GPIO_F_INT_STATUS EP93XX_GPIO_REG(0x5c)
#define EP93XX_GPIO_A_INT_TYPE1 EP93XX_GPIO_REG(0x90)
#define EP93XX_GPIO_A_INT_TYPE2 EP93XX_GPIO_REG(0x94)
#define EP93XX_GPIO_A_INT_ACK EP93XX_GPIO_REG(0x98)
#define EP93XX_GPIO_A_INT_ENABLE EP93XX_GPIO_REG(0x9c)
#define EP93XX_GPIO_A_INT_STATUS EP93XX_GPIO_REG(0xa0) #define EP93XX_GPIO_A_INT_STATUS EP93XX_GPIO_REG(0xa0)
#define EP93XX_GPIO_B_INT_TYPE1 EP93XX_GPIO_REG(0xac)
#define EP93XX_GPIO_B_INT_TYPE2 EP93XX_GPIO_REG(0xb0)
#define EP93XX_GPIO_B_INT_ACK EP93XX_GPIO_REG(0xb4)
#define EP93XX_GPIO_B_INT_ENABLE EP93XX_GPIO_REG(0xb8)
#define EP93XX_GPIO_B_INT_STATUS EP93XX_GPIO_REG(0xbc) #define EP93XX_GPIO_B_INT_STATUS EP93XX_GPIO_REG(0xbc)
#define EP93XX_GPIO_EEDRIVE EP93XX_GPIO_REG(0xc8)
#define EP93XX_AAC_BASE EP93XX_APB_IOMEM(0x00080000) #define EP93XX_AAC_BASE EP93XX_APB_IOMEM(0x00080000)
@ -134,13 +125,13 @@
#define EP93XX_IRDA_BASE EP93XX_APB_IOMEM(0x000b0000) #define EP93XX_IRDA_BASE EP93XX_APB_IOMEM(0x000b0000)
#define EP93XX_UART1_PHYS_BASE (EP93XX_APB_PHYS_BASE + 0x000c0000) #define EP93XX_UART1_PHYS_BASE EP93XX_APB_PHYS(0x000c0000)
#define EP93XX_UART1_BASE EP93XX_APB_IOMEM(0x000c0000) #define EP93XX_UART1_BASE EP93XX_APB_IOMEM(0x000c0000)
#define EP93XX_UART2_PHYS_BASE (EP93XX_APB_PHYS_BASE + 0x000d0000) #define EP93XX_UART2_PHYS_BASE EP93XX_APB_PHYS(0x000d0000)
#define EP93XX_UART2_BASE EP93XX_APB_IOMEM(0x000d0000) #define EP93XX_UART2_BASE EP93XX_APB_IOMEM(0x000d0000)
#define EP93XX_UART3_PHYS_BASE (EP93XX_APB_PHYS_BASE + 0x000e0000) #define EP93XX_UART3_PHYS_BASE EP93XX_APB_PHYS(0x000e0000)
#define EP93XX_UART3_BASE EP93XX_APB_IOMEM(0x000e0000) #define EP93XX_UART3_BASE EP93XX_APB_IOMEM(0x000e0000)
#define EP93XX_KEY_MATRIX_BASE EP93XX_APB_IOMEM(0x000f0000) #define EP93XX_KEY_MATRIX_BASE EP93XX_APB_IOMEM(0x000f0000)
@ -148,10 +139,10 @@
#define EP93XX_ADC_BASE EP93XX_APB_IOMEM(0x00100000) #define EP93XX_ADC_BASE EP93XX_APB_IOMEM(0x00100000)
#define EP93XX_TOUCHSCREEN_BASE EP93XX_APB_IOMEM(0x00100000) #define EP93XX_TOUCHSCREEN_BASE EP93XX_APB_IOMEM(0x00100000)
#define EP93XX_PWM_PHYS_BASE (EP93XX_APB_PHYS_BASE + 0x00110000) #define EP93XX_PWM_PHYS_BASE EP93XX_APB_PHYS(0x00110000)
#define EP93XX_PWM_BASE EP93XX_APB_IOMEM(0x00110000) #define EP93XX_PWM_BASE EP93XX_APB_IOMEM(0x00110000)
#define EP93XX_RTC_PHYS_BASE (EP93XX_APB_PHYS_BASE + 0x00120000) #define EP93XX_RTC_PHYS_BASE EP93XX_APB_PHYS(0x00120000)
#define EP93XX_RTC_BASE EP93XX_APB_IOMEM(0x00120000) #define EP93XX_RTC_BASE EP93XX_APB_IOMEM(0x00120000)
#define EP93XX_SYSCON_BASE EP93XX_APB_IOMEM(0x00130000) #define EP93XX_SYSCON_BASE EP93XX_APB_IOMEM(0x00130000)
@ -218,6 +209,17 @@
#define EP93XX_SYSCON_KEYTCHCLKDIV_ADIV (1<<16) #define EP93XX_SYSCON_KEYTCHCLKDIV_ADIV (1<<16)
#define EP93XX_SYSCON_KEYTCHCLKDIV_KEN (1<<15) #define EP93XX_SYSCON_KEYTCHCLKDIV_KEN (1<<15)
#define EP93XX_SYSCON_KEYTCHCLKDIV_KDIV (1<<0) #define EP93XX_SYSCON_KEYTCHCLKDIV_KDIV (1<<0)
#define EP93XX_SYSCON_SYSCFG EP93XX_SYSCON_REG(0x9c)
#define EP93XX_SYSCON_SYSCFG_REV_MASK (0xf0000000)
#define EP93XX_SYSCON_SYSCFG_REV_SHIFT (28)
#define EP93XX_SYSCON_SYSCFG_SBOOT (1<<8)
#define EP93XX_SYSCON_SYSCFG_LCSN7 (1<<7)
#define EP93XX_SYSCON_SYSCFG_LCSN6 (1<<6)
#define EP93XX_SYSCON_SYSCFG_LASDO (1<<5)
#define EP93XX_SYSCON_SYSCFG_LEEDA (1<<4)
#define EP93XX_SYSCON_SYSCFG_LEECLK (1<<3)
#define EP93XX_SYSCON_SYSCFG_LCSN2 (1<<1)
#define EP93XX_SYSCON_SYSCFG_LCSN1 (1<<0)
#define EP93XX_SYSCON_SWLOCK EP93XX_SYSCON_REG(0xc0) #define EP93XX_SYSCON_SWLOCK EP93XX_SYSCON_REG(0xc0)
#define EP93XX_WATCHDOG_BASE EP93XX_APB_IOMEM(0x00140000) #define EP93XX_WATCHDOG_BASE EP93XX_APB_IOMEM(0x00140000)

View File

@ -114,17 +114,9 @@ extern void ep93xx_gpio_int_debounce(unsigned int irq, int enable);
* B0..B7 (7..15) to irq 72..79, and * B0..B7 (7..15) to irq 72..79, and
* F0..F7 (16..24) to irq 80..87. * F0..F7 (16..24) to irq 80..87.
*/ */
static inline int gpio_to_irq(unsigned gpio) #define gpio_to_irq(gpio) \
{ (((gpio) <= EP93XX_GPIO_LINE_MAX_IRQ) ? (64 + (gpio)) : -EINVAL)
if (gpio <= EP93XX_GPIO_LINE_MAX_IRQ)
return 64 + gpio;
return -EINVAL; #define irq_to_gpio(irq) ((irq) - gpio_to_irq(0))
}
static inline int irq_to_gpio(unsigned irq)
{
return irq - gpio_to_irq(0);
}
#endif #endif

View File

@ -9,6 +9,12 @@
#define PHYS_OFFSET UL(0x00000000) #define PHYS_OFFSET UL(0x00000000)
#elif defined(CONFIG_EP93XX_SDCE0_PHYS_OFFSET) #elif defined(CONFIG_EP93XX_SDCE0_PHYS_OFFSET)
#define PHYS_OFFSET UL(0xc0000000) #define PHYS_OFFSET UL(0xc0000000)
#elif defined(CONFIG_EP93XX_SDCE1_PHYS_OFFSET)
#define PHYS_OFFSET UL(0xd0000000)
#elif defined(CONFIG_EP93XX_SDCE2_PHYS_OFFSET)
#define PHYS_OFFSET UL(0xe0000000)
#elif defined(CONFIG_EP93XX_SDCE3_ASYNC_PHYS_OFFSET)
#define PHYS_OFFSET UL(0xf0000000)
#else #else
#error "Kconfig bug: No EP93xx PHYS_OFFSET set" #error "Kconfig bug: No EP93xx PHYS_OFFSET set"
#endif #endif

View File

@ -4,6 +4,7 @@
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
struct i2c_gpio_platform_data;
struct i2c_board_info; struct i2c_board_info;
struct platform_device; struct platform_device;
struct ep93xxfb_mach_info; struct ep93xxfb_mach_info;
@ -33,7 +34,8 @@ static inline void ep93xx_devcfg_clear_bits(unsigned int bits)
} }
void ep93xx_register_eth(struct ep93xx_eth_data *data, int copy_addr); void ep93xx_register_eth(struct ep93xx_eth_data *data, int copy_addr);
void ep93xx_register_i2c(struct i2c_board_info *devices, int num); void ep93xx_register_i2c(struct i2c_gpio_platform_data *data,
struct i2c_board_info *devices, int num);
void ep93xx_register_fb(struct ep93xxfb_mach_info *data); void ep93xx_register_fb(struct ep93xxfb_mach_info *data);
void ep93xx_register_pwm(int pwm0, int pwm1); void ep93xx_register_pwm(int pwm0, int pwm1);
int ep93xx_pwm_acquire_gpio(struct platform_device *pdev); int ep93xx_pwm_acquire_gpio(struct platform_device *pdev);

View File

@ -2,7 +2,9 @@
* linux/arch/arm/mach-ep93xx/micro9.c * linux/arch/arm/mach-ep93xx/micro9.c
* *
* Copyright (C) 2006 Contec Steuerungstechnik & Automation GmbH * Copyright (C) 2006 Contec Steuerungstechnik & Automation GmbH
* Manfred Gruber <manfred.gruber@contec.at> * Manfred Gruber <m.gruber@tirol.com>
* Copyright (C) 2009 Contec Steuerungstechnik & Automation GmbH
* Hubert Feurstein <hubert.feurstein@contec.at>
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License version 2 as
@ -20,104 +22,124 @@
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
static struct ep93xx_eth_data micro9_eth_data = { /*************************************************************************
.phy_id = 0x1f, * Micro9 NOR Flash
}; *
* Micro9-High has up to 64MB of 32-bit flash on CS1
* Micro9-Mid has up to 64MB of either 32-bit or 16-bit flash on CS1
* Micro9-Lite uses a seperate MTD map driver for flash support
* Micro9-Slim has up to 64MB of either 32-bit or 16-bit flash on CS1
*************************************************************************/
static struct physmap_flash_data micro9_flash_data;
static void __init micro9_init(void) static struct resource micro9_flash_resource = {
{
ep93xx_register_eth(&micro9_eth_data, 1);
}
/*
* Micro9-H
*/
#ifdef CONFIG_MACH_MICRO9H
static struct physmap_flash_data micro9h_flash_data = {
.width = 4,
};
static struct resource micro9h_flash_resource = {
.start = EP93XX_CS1_PHYS_BASE, .start = EP93XX_CS1_PHYS_BASE,
.end = EP93XX_CS1_PHYS_BASE + SZ_64M - 1, .end = EP93XX_CS1_PHYS_BASE + SZ_64M - 1,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}; };
static struct platform_device micro9h_flash = { static struct platform_device micro9_flash = {
.name = "physmap-flash", .name = "physmap-flash",
.id = 0, .id = 0,
.dev = { .dev = {
.platform_data = &micro9h_flash_data, .platform_data = &micro9_flash_data,
}, },
.num_resources = 1, .num_resources = 1,
.resource = &micro9h_flash_resource, .resource = &micro9_flash_resource,
}; };
static void __init micro9h_init(void) static void __init __micro9_register_flash(unsigned int width)
{ {
platform_device_register(&micro9h_flash); micro9_flash_data.width = width;
platform_device_register(&micro9_flash);
} }
static void __init micro9h_init_machine(void) static unsigned int __init micro9_detect_bootwidth(void)
{
u32 v;
/* Detect the bus width of the external flash memory */
v = __raw_readl(EP93XX_SYSCON_SYSCFG);
if (v & EP93XX_SYSCON_SYSCFG_LCSN7)
return 4; /* 32-bit */
else
return 2; /* 16-bit */
}
static void __init micro9_register_flash(void)
{
if (machine_is_micro9())
__micro9_register_flash(4);
else if (machine_is_micro9m() || machine_is_micro9s())
__micro9_register_flash(micro9_detect_bootwidth());
}
/*************************************************************************
* Micro9 Ethernet
*************************************************************************/
static struct ep93xx_eth_data micro9_eth_data = {
.phy_id = 0x1f,
};
static void __init micro9_init_machine(void)
{ {
ep93xx_init_devices(); ep93xx_init_devices();
micro9_init(); ep93xx_register_eth(&micro9_eth_data, 1);
micro9h_init(); micro9_register_flash();
} }
MACHINE_START(MICRO9, "Contec Hypercontrol Micro9-H")
/* Maintainer: Manfred Gruber <manfred.gruber@contec.at> */ #ifdef CONFIG_MACH_MICRO9H
MACHINE_START(MICRO9, "Contec Micro9-High")
/* Maintainer: Hubert Feurstein <hubert.feurstein@contec.at> */
.phys_io = EP93XX_APB_PHYS_BASE, .phys_io = EP93XX_APB_PHYS_BASE,
.io_pg_offst = ((EP93XX_APB_VIRT_BASE) >> 18) & 0xfffc, .io_pg_offst = ((EP93XX_APB_VIRT_BASE) >> 18) & 0xfffc,
.boot_params = EP93XX_SDCE3_PHYS_BASE_SYNC + 0x100, .boot_params = EP93XX_SDCE3_PHYS_BASE_SYNC + 0x100,
.map_io = ep93xx_map_io, .map_io = ep93xx_map_io,
.init_irq = ep93xx_init_irq, .init_irq = ep93xx_init_irq,
.timer = &ep93xx_timer, .timer = &ep93xx_timer,
.init_machine = micro9h_init_machine, .init_machine = micro9_init_machine,
MACHINE_END MACHINE_END
#endif #endif
/*
* Micro9-M
*/
#ifdef CONFIG_MACH_MICRO9M #ifdef CONFIG_MACH_MICRO9M
static void __init micro9m_init_machine(void) MACHINE_START(MICRO9M, "Contec Micro9-Mid")
{ /* Maintainer: Hubert Feurstein <hubert.feurstein@contec.at> */
ep93xx_init_devices();
micro9_init();
}
MACHINE_START(MICRO9M, "Contec Hypercontrol Micro9-M")
/* Maintainer: Manfred Gruber <manfred.gruber@contec.at> */
.phys_io = EP93XX_APB_PHYS_BASE, .phys_io = EP93XX_APB_PHYS_BASE,
.io_pg_offst = ((EP93XX_APB_VIRT_BASE) >> 18) & 0xfffc, .io_pg_offst = ((EP93XX_APB_VIRT_BASE) >> 18) & 0xfffc,
.boot_params = EP93XX_SDCE3_PHYS_BASE_SYNC + 0x100, .boot_params = EP93XX_SDCE3_PHYS_BASE_ASYNC + 0x100,
.map_io = ep93xx_map_io, .map_io = ep93xx_map_io,
.init_irq = ep93xx_init_irq, .init_irq = ep93xx_init_irq,
.timer = &ep93xx_timer, .timer = &ep93xx_timer,
.init_machine = micro9m_init_machine, .init_machine = micro9_init_machine,
MACHINE_END MACHINE_END
#endif #endif
/*
* Micro9-L
*/
#ifdef CONFIG_MACH_MICRO9L #ifdef CONFIG_MACH_MICRO9L
static void __init micro9l_init_machine(void) MACHINE_START(MICRO9L, "Contec Micro9-Lite")
{ /* Maintainer: Hubert Feurstein <hubert.feurstein@contec.at> */
ep93xx_init_devices();
micro9_init();
}
MACHINE_START(MICRO9L, "Contec Hypercontrol Micro9-L")
/* Maintainer: Manfred Gruber <manfred.gruber@contec.at> */
.phys_io = EP93XX_APB_PHYS_BASE, .phys_io = EP93XX_APB_PHYS_BASE,
.io_pg_offst = ((EP93XX_APB_VIRT_BASE) >> 18) & 0xfffc, .io_pg_offst = ((EP93XX_APB_VIRT_BASE) >> 18) & 0xfffc,
.boot_params = EP93XX_SDCE3_PHYS_BASE_SYNC + 0x100, .boot_params = EP93XX_SDCE3_PHYS_BASE_SYNC + 0x100,
.map_io = ep93xx_map_io, .map_io = ep93xx_map_io,
.init_irq = ep93xx_init_irq, .init_irq = ep93xx_init_irq,
.timer = &ep93xx_timer, .timer = &ep93xx_timer,
.init_machine = micro9l_init_machine, .init_machine = micro9_init_machine,
MACHINE_END MACHINE_END
#endif #endif
#ifdef CONFIG_MACH_MICRO9S
MACHINE_START(MICRO9S, "Contec Micro9-Slim")
/* Maintainer: Hubert Feurstein <hubert.feurstein@contec.at> */
.phys_io = EP93XX_APB_PHYS_BASE,
.io_pg_offst = ((EP93XX_APB_VIRT_BASE) >> 18) & 0xfffc,
.boot_params = EP93XX_SDCE3_PHYS_BASE_ASYNC + 0x100,
.map_io = ep93xx_map_io,
.init_irq = ep93xx_init_irq,
.timer = &ep93xx_timer,
.init_machine = micro9_init_machine,
MACHINE_END
#endif

View File

@ -31,6 +31,7 @@
#include <mach/hardware.h> #include <mach/hardware.h>
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/signal.h>
#include <asm/system.h> #include <asm/system.h>
#include <asm/mach/pci.h> #include <asm/mach/pci.h>
#include <asm/irq_regs.h> #include <asm/irq_regs.h>

View File

@ -38,49 +38,49 @@
static int board_keymap[] = { static int board_keymap[] = {
KEY(0, 0, KEY_Q), KEY(0, 0, KEY_Q),
KEY(0, 1, KEY_W), KEY(0, 1, KEY_O),
KEY(0, 2, KEY_E), KEY(0, 2, KEY_P),
KEY(0, 3, KEY_R), KEY(0, 3, KEY_COMMA),
KEY(0, 4, KEY_T), KEY(0, 4, KEY_BACKSPACE),
KEY(0, 5, KEY_Y), KEY(0, 6, KEY_A),
KEY(0, 6, KEY_U), KEY(0, 7, KEY_S),
KEY(0, 7, KEY_I), KEY(1, 0, KEY_W),
KEY(1, 0, KEY_O),
KEY(1, 1, KEY_D), KEY(1, 1, KEY_D),
KEY(1, 2, KEY_DOT), KEY(1, 2, KEY_F),
KEY(1, 3, KEY_V), KEY(1, 3, KEY_G),
KEY(1, 4, KEY_DOWN), KEY(1, 4, KEY_H),
KEY(2, 0, KEY_P), KEY(1, 5, KEY_J),
KEY(2, 1, KEY_F), KEY(1, 6, KEY_K),
KEY(1, 7, KEY_L),
KEY(2, 0, KEY_E),
KEY(2, 1, KEY_DOT),
KEY(2, 2, KEY_UP), KEY(2, 2, KEY_UP),
KEY(2, 3, KEY_B), KEY(2, 3, KEY_ENTER),
KEY(2, 4, KEY_RIGHT), KEY(2, 5, KEY_Z),
KEY(3, 0, KEY_COMMA), KEY(2, 6, KEY_X),
KEY(3, 1, KEY_G), KEY(2, 7, KEY_C),
KEY(3, 2, KEY_ENTER), KEY(3, 0, KEY_R),
KEY(3, 1, KEY_V),
KEY(3, 2, KEY_B),
KEY(3, 3, KEY_N), KEY(3, 3, KEY_N),
KEY(4, 0, KEY_BACKSPACE), KEY(3, 4, KEY_M),
KEY(4, 1, KEY_H), KEY(3, 5, KEY_SPACE),
KEY(4, 3, KEY_M), KEY(3, 6, KEY_SPACE),
KEY(3, 7, KEY_LEFT),
KEY(4, 0, KEY_T),
KEY(4, 1, KEY_DOWN),
KEY(4, 2, KEY_RIGHT),
KEY(4, 4, KEY_LEFTCTRL), KEY(4, 4, KEY_LEFTCTRL),
KEY(5, 1, KEY_J), KEY(4, 5, KEY_RIGHTALT),
KEY(5, 2, KEY_Z), KEY(4, 6, KEY_LEFTSHIFT),
KEY(5, 3, KEY_SPACE), KEY(5, 0, KEY_Y),
KEY(5, 4, KEY_LEFTSHIFT), KEY(6, 0, KEY_U),
KEY(6, 0, KEY_A), KEY(7, 0, KEY_I),
KEY(6, 1, KEY_K), KEY(7, 1, KEY_F7),
KEY(6, 2, KEY_X), KEY(7, 2, KEY_F8),
KEY(6, 3, KEY_SPACE), KEY(0xff, 2, KEY_F9),
KEY(6, 4, KEY_FN), KEY(0xff, 4, KEY_F10),
KEY(7, 0, KEY_S), KEY(0xff, 5, KEY_F11),
KEY(7, 1, KEY_L),
KEY(7, 2, KEY_C),
KEY(7, 3, KEY_LEFT),
KEY(0xff, 0, KEY_F6),
KEY(0xff, 1, KEY_F7),
KEY(0xff, 2, KEY_F8),
KEY(0xff, 4, KEY_F9),
KEY(0xff, 5, KEY_F10),
}; };
static struct matrix_keymap_data board_map_data = { static struct matrix_keymap_data board_map_data = {
@ -444,7 +444,7 @@ static int __init rx51_i2c_init(void)
rx51_twldata.vaux3 = &rx51_vaux3_cam; rx51_twldata.vaux3 = &rx51_vaux3_cam;
rx51_twldata.vmmc2 = &rx51_vmmc2; rx51_twldata.vmmc2 = &rx51_vmmc2;
} }
omap_register_i2c_bus(1, 2600, rx51_peripherals_i2c_board_info_1, omap_register_i2c_bus(1, 2200, rx51_peripherals_i2c_board_info_1,
ARRAY_SIZE(rx51_peripherals_i2c_board_info_1)); ARRAY_SIZE(rx51_peripherals_i2c_board_info_1));
omap_register_i2c_bus(2, 100, NULL, 0); omap_register_i2c_bus(2, 100, NULL, 0);
omap_register_i2c_bus(3, 400, NULL, 0); omap_register_i2c_bus(3, 400, NULL, 0);

View File

@ -25,6 +25,7 @@
#include <mach/keypad.h> #include <mach/keypad.h>
#include "mmc-twl4030.h" #include "mmc-twl4030.h"
#include "sdram-micron-mt46h32m32lf-6.h"
/* Zoom2 has Qwerty keyboard*/ /* Zoom2 has Qwerty keyboard*/
static int board_keymap[] = { static int board_keymap[] = {
@ -213,7 +214,8 @@ static void __init omap_zoom2_init_irq(void)
{ {
omap_board_config = zoom2_config; omap_board_config = zoom2_config;
omap_board_config_size = ARRAY_SIZE(zoom2_config); omap_board_config_size = ARRAY_SIZE(zoom2_config);
omap2_init_common_hw(NULL, NULL); omap2_init_common_hw(mt46h32m32lf6_sdrc_params,
mt46h32m32lf6_sdrc_params);
omap_init_irq(); omap_init_irq();
omap_gpio_init(); omap_gpio_init();
} }

View File

@ -769,6 +769,7 @@ int __init omap2_clk_init(void)
if (c->cpu & cpu_mask) { if (c->cpu & cpu_mask) {
clkdev_add(&c->lk); clkdev_add(&c->lk);
clk_register(c->lk.clk); clk_register(c->lk.clk);
omap2_init_clk_clkdm(c->lk.clk);
} }
/* Check the MPU rate set by bootloader */ /* Check the MPU rate set by bootloader */

View File

@ -338,6 +338,13 @@ static struct omap_clk omap34xx_clks[] = {
*/ */
#define SDRC_MPURATE_LOOPS 96 #define SDRC_MPURATE_LOOPS 96
/*
* DPLL5_FREQ_FOR_USBHOST: USBHOST and USBTLL are the only clocks
* that are sourced by DPLL5, and both of these require this clock
* to be at 120 MHz for proper operation.
*/
#define DPLL5_FREQ_FOR_USBHOST 120000000
/** /**
* omap3430es2_clk_ssi_find_idlest - return CM_IDLEST info for SSI * omap3430es2_clk_ssi_find_idlest - return CM_IDLEST info for SSI
* @clk: struct clk * being enabled * @clk: struct clk * being enabled
@ -1056,6 +1063,28 @@ void omap2_clk_prepare_for_reboot(void)
#endif #endif
} }
static void omap3_clk_lock_dpll5(void)
{
struct clk *dpll5_clk;
struct clk *dpll5_m2_clk;
dpll5_clk = clk_get(NULL, "dpll5_ck");
clk_set_rate(dpll5_clk, DPLL5_FREQ_FOR_USBHOST);
clk_enable(dpll5_clk);
/* Enable autoidle to allow it to enter low power bypass */
omap3_dpll_allow_idle(dpll5_clk);
/* Program dpll5_m2_clk divider for no division */
dpll5_m2_clk = clk_get(NULL, "dpll5_m2_ck");
clk_enable(dpll5_m2_clk);
clk_set_rate(dpll5_m2_clk, DPLL5_FREQ_FOR_USBHOST);
clk_disable(dpll5_m2_clk);
clk_disable(dpll5_clk);
return;
}
/* REVISIT: Move this init stuff out into clock.c */ /* REVISIT: Move this init stuff out into clock.c */
/* /*
@ -1148,6 +1177,12 @@ int __init omap2_clk_init(void)
*/ */
clk_enable_init_clocks(); clk_enable_init_clocks();
/*
* Lock DPLL5 and put it in autoidle.
*/
if (omap_rev() >= OMAP3430_REV_ES2_0)
omap3_clk_lock_dpll5();
/* Avoid sleeping during omap2_clk_prepare_for_reboot() */ /* Avoid sleeping during omap2_clk_prepare_for_reboot() */
/* REVISIT: not yet ready for 343x */ /* REVISIT: not yet ready for 343x */
#if 0 #if 0

View File

@ -137,6 +137,36 @@ static void _clkdm_del_autodeps(struct clockdomain *clkdm)
} }
} }
/*
* _omap2_clkdm_set_hwsup - set the hwsup idle transition bit
* @clkdm: struct clockdomain *
* @enable: int 0 to disable, 1 to enable
*
* Internal helper for actually switching the bit that controls hwsup
* idle transitions for clkdm.
*/
static void _omap2_clkdm_set_hwsup(struct clockdomain *clkdm, int enable)
{
u32 v;
if (cpu_is_omap24xx()) {
if (enable)
v = OMAP24XX_CLKSTCTRL_ENABLE_AUTO;
else
v = OMAP24XX_CLKSTCTRL_DISABLE_AUTO;
} else if (cpu_is_omap34xx()) {
if (enable)
v = OMAP34XX_CLKSTCTRL_ENABLE_AUTO;
else
v = OMAP34XX_CLKSTCTRL_DISABLE_AUTO;
} else {
BUG();
}
cm_rmw_mod_reg_bits(clkdm->clktrctrl_mask,
v << __ffs(clkdm->clktrctrl_mask),
clkdm->pwrdm.ptr->prcm_offs, CM_CLKSTCTRL);
}
static struct clockdomain *_clkdm_lookup(const char *name) static struct clockdomain *_clkdm_lookup(const char *name)
{ {
@ -456,8 +486,6 @@ int omap2_clkdm_wakeup(struct clockdomain *clkdm)
*/ */
void omap2_clkdm_allow_idle(struct clockdomain *clkdm) void omap2_clkdm_allow_idle(struct clockdomain *clkdm)
{ {
u32 v;
if (!clkdm) if (!clkdm)
return; return;
@ -473,18 +501,7 @@ void omap2_clkdm_allow_idle(struct clockdomain *clkdm)
if (atomic_read(&clkdm->usecount) > 0) if (atomic_read(&clkdm->usecount) > 0)
_clkdm_add_autodeps(clkdm); _clkdm_add_autodeps(clkdm);
if (cpu_is_omap24xx()) _omap2_clkdm_set_hwsup(clkdm, 1);
v = OMAP24XX_CLKSTCTRL_ENABLE_AUTO;
else if (cpu_is_omap34xx())
v = OMAP34XX_CLKSTCTRL_ENABLE_AUTO;
else
BUG();
cm_rmw_mod_reg_bits(clkdm->clktrctrl_mask,
v << __ffs(clkdm->clktrctrl_mask),
clkdm->pwrdm.ptr->prcm_offs,
CM_CLKSTCTRL);
pwrdm_clkdm_state_switch(clkdm); pwrdm_clkdm_state_switch(clkdm);
} }
@ -500,8 +517,6 @@ void omap2_clkdm_allow_idle(struct clockdomain *clkdm)
*/ */
void omap2_clkdm_deny_idle(struct clockdomain *clkdm) void omap2_clkdm_deny_idle(struct clockdomain *clkdm)
{ {
u32 v;
if (!clkdm) if (!clkdm)
return; return;
@ -514,16 +529,7 @@ void omap2_clkdm_deny_idle(struct clockdomain *clkdm)
pr_debug("clockdomain: disabling automatic idle transitions for %s\n", pr_debug("clockdomain: disabling automatic idle transitions for %s\n",
clkdm->name); clkdm->name);
if (cpu_is_omap24xx()) _omap2_clkdm_set_hwsup(clkdm, 0);
v = OMAP24XX_CLKSTCTRL_DISABLE_AUTO;
else if (cpu_is_omap34xx())
v = OMAP34XX_CLKSTCTRL_DISABLE_AUTO;
else
BUG();
cm_rmw_mod_reg_bits(clkdm->clktrctrl_mask,
v << __ffs(clkdm->clktrctrl_mask),
clkdm->pwrdm.ptr->prcm_offs, CM_CLKSTCTRL);
if (atomic_read(&clkdm->usecount) > 0) if (atomic_read(&clkdm->usecount) > 0)
_clkdm_del_autodeps(clkdm); _clkdm_del_autodeps(clkdm);
@ -569,10 +575,14 @@ int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk)
v = omap2_clkdm_clktrctrl_read(clkdm); v = omap2_clkdm_clktrctrl_read(clkdm);
if ((cpu_is_omap34xx() && v == OMAP34XX_CLKSTCTRL_ENABLE_AUTO) || if ((cpu_is_omap34xx() && v == OMAP34XX_CLKSTCTRL_ENABLE_AUTO) ||
(cpu_is_omap24xx() && v == OMAP24XX_CLKSTCTRL_ENABLE_AUTO)) (cpu_is_omap24xx() && v == OMAP24XX_CLKSTCTRL_ENABLE_AUTO)) {
/* Disable HW transitions when we are changing deps */
_omap2_clkdm_set_hwsup(clkdm, 0);
_clkdm_add_autodeps(clkdm); _clkdm_add_autodeps(clkdm);
else _omap2_clkdm_set_hwsup(clkdm, 1);
} else {
omap2_clkdm_wakeup(clkdm); omap2_clkdm_wakeup(clkdm);
}
pwrdm_wait_transition(clkdm->pwrdm.ptr); pwrdm_wait_transition(clkdm->pwrdm.ptr);
pwrdm_clkdm_state_switch(clkdm); pwrdm_clkdm_state_switch(clkdm);
@ -623,10 +633,14 @@ int omap2_clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk)
v = omap2_clkdm_clktrctrl_read(clkdm); v = omap2_clkdm_clktrctrl_read(clkdm);
if ((cpu_is_omap34xx() && v == OMAP34XX_CLKSTCTRL_ENABLE_AUTO) || if ((cpu_is_omap34xx() && v == OMAP34XX_CLKSTCTRL_ENABLE_AUTO) ||
(cpu_is_omap24xx() && v == OMAP24XX_CLKSTCTRL_ENABLE_AUTO)) (cpu_is_omap24xx() && v == OMAP24XX_CLKSTCTRL_ENABLE_AUTO)) {
/* Disable HW transitions when we are changing deps */
_omap2_clkdm_set_hwsup(clkdm, 0);
_clkdm_del_autodeps(clkdm); _clkdm_del_autodeps(clkdm);
else _omap2_clkdm_set_hwsup(clkdm, 1);
} else {
omap2_clkdm_sleep(clkdm); omap2_clkdm_sleep(clkdm);
}
pwrdm_clkdm_state_switch(clkdm); pwrdm_clkdm_state_switch(clkdm);

View File

@ -541,7 +541,7 @@ static int __init pm_dbg_init(void)
printk(KERN_ERR "%s: only OMAP3 supported\n", __func__); printk(KERN_ERR "%s: only OMAP3 supported\n", __func__);
return -ENODEV; return -ENODEV;
} }
d = debugfs_create_dir("pm_debug", NULL); d = debugfs_create_dir("pm_debug", NULL);
if (IS_ERR(d)) if (IS_ERR(d))
return PTR_ERR(d); return PTR_ERR(d);
@ -551,7 +551,7 @@ static int __init pm_dbg_init(void)
(void) debugfs_create_file("time", S_IRUGO, (void) debugfs_create_file("time", S_IRUGO,
d, (void *)DEBUG_FILE_TIMERS, &debug_fops); d, (void *)DEBUG_FILE_TIMERS, &debug_fops);
pwrdm_for_each(pwrdms_setup, (void *)d); pwrdm_for_each_nolock(pwrdms_setup, (void *)d);
pm_dbg_dir = debugfs_create_dir("registers", d); pm_dbg_dir = debugfs_create_dir("registers", d);
if (IS_ERR(pm_dbg_dir)) if (IS_ERR(pm_dbg_dir))

View File

@ -51,97 +51,112 @@ static void (*_omap_sram_idle)(u32 *addr, int save_state);
static struct powerdomain *mpu_pwrdm; static struct powerdomain *mpu_pwrdm;
/* PRCM Interrupt Handler for wakeups */ /*
* PRCM Interrupt Handler Helper Function
*
* The purpose of this function is to clear any wake-up events latched
* in the PRCM PM_WKST_x registers. It is possible that a wake-up event
* may occur whilst attempting to clear a PM_WKST_x register and thus
* set another bit in this register. A while loop is used to ensure
* that any peripheral wake-up events occurring while attempting to
* clear the PM_WKST_x are detected and cleared.
*/
static int prcm_clear_mod_irqs(s16 module, u8 regs)
{
u32 wkst, fclk, iclk, clken;
u16 wkst_off = (regs == 3) ? OMAP3430ES2_PM_WKST3 : PM_WKST1;
u16 fclk_off = (regs == 3) ? OMAP3430ES2_CM_FCLKEN3 : CM_FCLKEN1;
u16 iclk_off = (regs == 3) ? CM_ICLKEN3 : CM_ICLKEN1;
u16 grpsel_off = (regs == 3) ?
OMAP3430ES2_PM_MPUGRPSEL3 : OMAP3430_PM_MPUGRPSEL;
int c = 0;
wkst = prm_read_mod_reg(module, wkst_off);
wkst &= prm_read_mod_reg(module, grpsel_off);
if (wkst) {
iclk = cm_read_mod_reg(module, iclk_off);
fclk = cm_read_mod_reg(module, fclk_off);
while (wkst) {
clken = wkst;
cm_set_mod_reg_bits(clken, module, iclk_off);
/*
* For USBHOST, we don't know whether HOST1 or
* HOST2 woke us up, so enable both f-clocks
*/
if (module == OMAP3430ES2_USBHOST_MOD)
clken |= 1 << OMAP3430ES2_EN_USBHOST2_SHIFT;
cm_set_mod_reg_bits(clken, module, fclk_off);
prm_write_mod_reg(wkst, module, wkst_off);
wkst = prm_read_mod_reg(module, wkst_off);
c++;
}
cm_write_mod_reg(iclk, module, iclk_off);
cm_write_mod_reg(fclk, module, fclk_off);
}
return c;
}
static int _prcm_int_handle_wakeup(void)
{
int c;
c = prcm_clear_mod_irqs(WKUP_MOD, 1);
c += prcm_clear_mod_irqs(CORE_MOD, 1);
c += prcm_clear_mod_irqs(OMAP3430_PER_MOD, 1);
if (omap_rev() > OMAP3430_REV_ES1_0) {
c += prcm_clear_mod_irqs(CORE_MOD, 3);
c += prcm_clear_mod_irqs(OMAP3430ES2_USBHOST_MOD, 1);
}
return c;
}
/*
* PRCM Interrupt Handler
*
* The PRM_IRQSTATUS_MPU register indicates if there are any pending
* interrupts from the PRCM for the MPU. These bits must be cleared in
* order to clear the PRCM interrupt. The PRCM interrupt handler is
* implemented to simply clear the PRM_IRQSTATUS_MPU in order to clear
* the PRCM interrupt. Please note that bit 0 of the PRM_IRQSTATUS_MPU
* register indicates that a wake-up event is pending for the MPU and
* this bit can only be cleared if the all the wake-up events latched
* in the various PM_WKST_x registers have been cleared. The interrupt
* handler is implemented using a do-while loop so that if a wake-up
* event occurred during the processing of the prcm interrupt handler
* (setting a bit in the corresponding PM_WKST_x register and thus
* preventing us from clearing bit 0 of the PRM_IRQSTATUS_MPU register)
* this would be handled.
*/
static irqreturn_t prcm_interrupt_handler (int irq, void *dev_id) static irqreturn_t prcm_interrupt_handler (int irq, void *dev_id)
{ {
u32 wkst, irqstatus_mpu; u32 irqstatus_mpu;
u32 fclk, iclk; int c = 0;
/* WKUP */ do {
wkst = prm_read_mod_reg(WKUP_MOD, PM_WKST); irqstatus_mpu = prm_read_mod_reg(OCP_MOD,
if (wkst) { OMAP3_PRM_IRQSTATUS_MPU_OFFSET);
iclk = cm_read_mod_reg(WKUP_MOD, CM_ICLKEN);
fclk = cm_read_mod_reg(WKUP_MOD, CM_FCLKEN);
cm_set_mod_reg_bits(wkst, WKUP_MOD, CM_ICLKEN);
cm_set_mod_reg_bits(wkst, WKUP_MOD, CM_FCLKEN);
prm_write_mod_reg(wkst, WKUP_MOD, PM_WKST);
while (prm_read_mod_reg(WKUP_MOD, PM_WKST))
cpu_relax();
cm_write_mod_reg(iclk, WKUP_MOD, CM_ICLKEN);
cm_write_mod_reg(fclk, WKUP_MOD, CM_FCLKEN);
}
/* CORE */ if (irqstatus_mpu & (OMAP3430_WKUP_ST | OMAP3430_IO_ST)) {
wkst = prm_read_mod_reg(CORE_MOD, PM_WKST1); c = _prcm_int_handle_wakeup();
if (wkst) {
iclk = cm_read_mod_reg(CORE_MOD, CM_ICLKEN1);
fclk = cm_read_mod_reg(CORE_MOD, CM_FCLKEN1);
cm_set_mod_reg_bits(wkst, CORE_MOD, CM_ICLKEN1);
cm_set_mod_reg_bits(wkst, CORE_MOD, CM_FCLKEN1);
prm_write_mod_reg(wkst, CORE_MOD, PM_WKST1);
while (prm_read_mod_reg(CORE_MOD, PM_WKST1))
cpu_relax();
cm_write_mod_reg(iclk, CORE_MOD, CM_ICLKEN1);
cm_write_mod_reg(fclk, CORE_MOD, CM_FCLKEN1);
}
wkst = prm_read_mod_reg(CORE_MOD, OMAP3430ES2_PM_WKST3);
if (wkst) {
iclk = cm_read_mod_reg(CORE_MOD, CM_ICLKEN3);
fclk = cm_read_mod_reg(CORE_MOD, OMAP3430ES2_CM_FCLKEN3);
cm_set_mod_reg_bits(wkst, CORE_MOD, CM_ICLKEN3);
cm_set_mod_reg_bits(wkst, CORE_MOD, OMAP3430ES2_CM_FCLKEN3);
prm_write_mod_reg(wkst, CORE_MOD, OMAP3430ES2_PM_WKST3);
while (prm_read_mod_reg(CORE_MOD, OMAP3430ES2_PM_WKST3))
cpu_relax();
cm_write_mod_reg(iclk, CORE_MOD, CM_ICLKEN3);
cm_write_mod_reg(fclk, CORE_MOD, OMAP3430ES2_CM_FCLKEN3);
}
/* PER */ /*
wkst = prm_read_mod_reg(OMAP3430_PER_MOD, PM_WKST); * Is the MPU PRCM interrupt handler racing with the
if (wkst) { * IVA2 PRCM interrupt handler ?
iclk = cm_read_mod_reg(OMAP3430_PER_MOD, CM_ICLKEN); */
fclk = cm_read_mod_reg(OMAP3430_PER_MOD, CM_FCLKEN); WARN(c == 0, "prcm: WARNING: PRCM indicated MPU wakeup "
cm_set_mod_reg_bits(wkst, OMAP3430_PER_MOD, CM_ICLKEN); "but no wakeup sources are marked\n");
cm_set_mod_reg_bits(wkst, OMAP3430_PER_MOD, CM_FCLKEN); } else {
prm_write_mod_reg(wkst, OMAP3430_PER_MOD, PM_WKST); /* XXX we need to expand our PRCM interrupt handler */
while (prm_read_mod_reg(OMAP3430_PER_MOD, PM_WKST)) WARN(1, "prcm: WARNING: PRCM interrupt received, but "
cpu_relax(); "no code to handle it (%08x)\n", irqstatus_mpu);
cm_write_mod_reg(iclk, OMAP3430_PER_MOD, CM_ICLKEN);
cm_write_mod_reg(fclk, OMAP3430_PER_MOD, CM_FCLKEN);
}
if (omap_rev() > OMAP3430_REV_ES1_0) {
/* USBHOST */
wkst = prm_read_mod_reg(OMAP3430ES2_USBHOST_MOD, PM_WKST);
if (wkst) {
iclk = cm_read_mod_reg(OMAP3430ES2_USBHOST_MOD,
CM_ICLKEN);
fclk = cm_read_mod_reg(OMAP3430ES2_USBHOST_MOD,
CM_FCLKEN);
cm_set_mod_reg_bits(wkst, OMAP3430ES2_USBHOST_MOD,
CM_ICLKEN);
cm_set_mod_reg_bits(wkst, OMAP3430ES2_USBHOST_MOD,
CM_FCLKEN);
prm_write_mod_reg(wkst, OMAP3430ES2_USBHOST_MOD,
PM_WKST);
while (prm_read_mod_reg(OMAP3430ES2_USBHOST_MOD,
PM_WKST))
cpu_relax();
cm_write_mod_reg(iclk, OMAP3430ES2_USBHOST_MOD,
CM_ICLKEN);
cm_write_mod_reg(fclk, OMAP3430ES2_USBHOST_MOD,
CM_FCLKEN);
} }
}
irqstatus_mpu = prm_read_mod_reg(OCP_MOD, prm_write_mod_reg(irqstatus_mpu, OCP_MOD,
OMAP3_PRM_IRQSTATUS_MPU_OFFSET); OMAP3_PRM_IRQSTATUS_MPU_OFFSET);
prm_write_mod_reg(irqstatus_mpu, OCP_MOD,
OMAP3_PRM_IRQSTATUS_MPU_OFFSET);
while (prm_read_mod_reg(OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET)) } while (prm_read_mod_reg(OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET));
cpu_relax();
return IRQ_HANDLED; return IRQ_HANDLED;
} }
@ -624,6 +639,16 @@ static void __init prcm_setup_regs(void)
prm_write_mod_reg(OMAP3430_IO_EN | OMAP3430_WKUP_EN, prm_write_mod_reg(OMAP3430_IO_EN | OMAP3430_WKUP_EN,
OCP_MOD, OMAP3_PRM_IRQENABLE_MPU_OFFSET); OCP_MOD, OMAP3_PRM_IRQENABLE_MPU_OFFSET);
/* Enable GPIO wakeups in PER */
prm_write_mod_reg(OMAP3430_EN_GPIO2 | OMAP3430_EN_GPIO3 |
OMAP3430_EN_GPIO4 | OMAP3430_EN_GPIO5 |
OMAP3430_EN_GPIO6, OMAP3430_PER_MOD, PM_WKEN);
/* and allow them to wake up MPU */
prm_write_mod_reg(OMAP3430_GRPSEL_GPIO2 | OMAP3430_EN_GPIO3 |
OMAP3430_GRPSEL_GPIO4 | OMAP3430_EN_GPIO5 |
OMAP3430_GRPSEL_GPIO6,
OMAP3430_PER_MOD, OMAP3430_PM_MPUGRPSEL);
/* Don't attach IVA interrupts */ /* Don't attach IVA interrupts */
prm_write_mod_reg(0, WKUP_MOD, OMAP3430_PM_IVAGRPSEL); prm_write_mod_reg(0, WKUP_MOD, OMAP3430_PM_IVAGRPSEL);
prm_write_mod_reg(0, CORE_MOD, OMAP3430_PM_IVAGRPSEL1); prm_write_mod_reg(0, CORE_MOD, OMAP3430_PM_IVAGRPSEL1);

View File

@ -273,35 +273,50 @@ struct powerdomain *pwrdm_lookup(const char *name)
} }
/** /**
* pwrdm_for_each - call function on each registered clockdomain * pwrdm_for_each_nolock - call function on each registered clockdomain
* @fn: callback function * * @fn: callback function *
* *
* Call the supplied function for each registered powerdomain. The * Call the supplied function for each registered powerdomain. The
* callback function can return anything but 0 to bail out early from * callback function can return anything but 0 to bail out early from
* the iterator. The callback function is called with the pwrdm_rwlock * the iterator. Returns the last return value of the callback function, which
* held for reading, so no powerdomain structure manipulation * should be 0 for success or anything else to indicate failure; or -EINVAL if
* functions should be called from the callback, although hardware * the function pointer is null.
* powerdomain control functions are fine. Returns the last return
* value of the callback function, which should be 0 for success or
* anything else to indicate failure; or -EINVAL if the function
* pointer is null.
*/ */
int pwrdm_for_each(int (*fn)(struct powerdomain *pwrdm, void *user), int pwrdm_for_each_nolock(int (*fn)(struct powerdomain *pwrdm, void *user),
void *user) void *user)
{ {
struct powerdomain *temp_pwrdm; struct powerdomain *temp_pwrdm;
unsigned long flags;
int ret = 0; int ret = 0;
if (!fn) if (!fn)
return -EINVAL; return -EINVAL;
read_lock_irqsave(&pwrdm_rwlock, flags);
list_for_each_entry(temp_pwrdm, &pwrdm_list, node) { list_for_each_entry(temp_pwrdm, &pwrdm_list, node) {
ret = (*fn)(temp_pwrdm, user); ret = (*fn)(temp_pwrdm, user);
if (ret) if (ret)
break; break;
} }
return ret;
}
/**
* pwrdm_for_each - call function on each registered clockdomain
* @fn: callback function *
*
* This function is the same as 'pwrdm_for_each_nolock()', but keeps the
* &pwrdm_rwlock locked for reading, so no powerdomain structure manipulation
* functions should be called from the callback, although hardware powerdomain
* control functions are fine.
*/
int pwrdm_for_each(int (*fn)(struct powerdomain *pwrdm, void *user),
void *user)
{
unsigned long flags;
int ret;
read_lock_irqsave(&pwrdm_rwlock, flags);
ret = pwrdm_for_each_nolock(fn, user);
read_unlock_irqrestore(&pwrdm_rwlock, flags); read_unlock_irqrestore(&pwrdm_rwlock, flags);
return ret; return ret;

View File

@ -155,7 +155,7 @@ MODULE_PARM_DESC(pxa255_turbo_table, "Selects the frequency table (0 = run table
static pxa_freqs_t pxa27x_freqs[] = { static pxa_freqs_t pxa27x_freqs[] = {
{104000, 104000, PXA27x_CCCR(1, 8, 2), 0, CCLKCFG2(1, 0, 1), 900000, 1705000 }, {104000, 104000, PXA27x_CCCR(1, 8, 2), 0, CCLKCFG2(1, 0, 1), 900000, 1705000 },
{156000, 104000, PXA27x_CCCR(1, 8, 6), 0, CCLKCFG2(1, 1, 1), 1000000, 1705000 }, {156000, 104000, PXA27x_CCCR(1, 8, 3), 0, CCLKCFG2(1, 0, 1), 1000000, 1705000 },
{208000, 208000, PXA27x_CCCR(0, 16, 2), 1, CCLKCFG2(0, 0, 1), 1180000, 1705000 }, {208000, 208000, PXA27x_CCCR(0, 16, 2), 1, CCLKCFG2(0, 0, 1), 1180000, 1705000 },
{312000, 208000, PXA27x_CCCR(1, 16, 3), 1, CCLKCFG2(1, 0, 1), 1250000, 1705000 }, {312000, 208000, PXA27x_CCCR(1, 16, 3), 1, CCLKCFG2(1, 0, 1), 1250000, 1705000 },
{416000, 208000, PXA27x_CCCR(1, 16, 4), 1, CCLKCFG2(1, 0, 1), 1350000, 1705000 }, {416000, 208000, PXA27x_CCCR(1, 16, 4), 1, CCLKCFG2(1, 0, 1), 1350000, 1705000 },

View File

@ -238,7 +238,7 @@ static struct resource csb726_lan_resources[] = {
}; };
struct smsc911x_platform_config csb726_lan_config = { struct smsc911x_platform_config csb726_lan_config = {
.irq_type = SMSC911X_IRQ_POLARITY_ACTIVE_LOW, .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
.irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL, .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL,
.flags = SMSC911X_USE_32BIT, .flags = SMSC911X_USE_32BIT,
.phy_interface = PHY_INTERFACE_MODE_MII, .phy_interface = PHY_INTERFACE_MODE_MII,

View File

@ -25,6 +25,7 @@ led-$(CONFIG_SA1100_CERF) += leds-cerf.o
obj-$(CONFIG_SA1100_COLLIE) += collie.o obj-$(CONFIG_SA1100_COLLIE) += collie.o
obj-$(CONFIG_SA1100_H3100) += h3600.o
obj-$(CONFIG_SA1100_H3600) += h3600.o obj-$(CONFIG_SA1100_H3600) += h3600.o
obj-$(CONFIG_SA1100_HACKKIT) += hackkit.o obj-$(CONFIG_SA1100_HACKKIT) += hackkit.o

View File

@ -12,6 +12,7 @@
#include <linux/linkage.h> #include <linux/linkage.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/assembler.h> #include <asm/assembler.h>
#include <asm/unwind.h>
#include "proc-macros.S" #include "proc-macros.S"
@ -121,11 +122,13 @@ ENTRY(v6_coherent_kern_range)
* - the Icache does not read data from the write buffer * - the Icache does not read data from the write buffer
*/ */
ENTRY(v6_coherent_user_range) ENTRY(v6_coherent_user_range)
UNWIND(.fnstart )
#ifdef HARVARD_CACHE #ifdef HARVARD_CACHE
bic r0, r0, #CACHE_LINE_SIZE - 1 bic r0, r0, #CACHE_LINE_SIZE - 1
1: mcr p15, 0, r0, c7, c10, 1 @ clean D line 1:
USER( mcr p15, 0, r0, c7, c10, 1 ) @ clean D line
add r0, r0, #CACHE_LINE_SIZE add r0, r0, #CACHE_LINE_SIZE
2:
cmp r0, r1 cmp r0, r1
blo 1b blo 1b
#endif #endif
@ -142,6 +145,19 @@ ENTRY(v6_coherent_user_range)
#endif #endif
mov pc, lr mov pc, lr
/*
* Fault handling for the cache operation above. If the virtual address in r0
* isn't mapped, just try the next page.
*/
9001:
mov r0, r0, lsr #12
mov r0, r0, lsl #12
add r0, r0, #4096
b 2b
UNWIND(.fnend )
ENDPROC(v6_coherent_user_range)
ENDPROC(v6_coherent_kern_range)
/* /*
* v6_flush_kern_dcache_page(kaddr) * v6_flush_kern_dcache_page(kaddr)
* *

View File

@ -13,6 +13,7 @@
#include <linux/linkage.h> #include <linux/linkage.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/assembler.h> #include <asm/assembler.h>
#include <asm/unwind.h>
#include "proc-macros.S" #include "proc-macros.S"
@ -153,13 +154,16 @@ ENTRY(v7_coherent_kern_range)
* - the Icache does not read data from the write buffer * - the Icache does not read data from the write buffer
*/ */
ENTRY(v7_coherent_user_range) ENTRY(v7_coherent_user_range)
UNWIND(.fnstart )
dcache_line_size r2, r3 dcache_line_size r2, r3
sub r3, r2, #1 sub r3, r2, #1
bic r0, r0, r3 bic r0, r0, r3
1: mcr p15, 0, r0, c7, c11, 1 @ clean D line to the point of unification 1:
USER( mcr p15, 0, r0, c7, c11, 1 ) @ clean D line to the point of unification
dsb dsb
mcr p15, 0, r0, c7, c5, 1 @ invalidate I line USER( mcr p15, 0, r0, c7, c5, 1 ) @ invalidate I line
add r0, r0, r2 add r0, r0, r2
2:
cmp r0, r1 cmp r0, r1
blo 1b blo 1b
mov r0, #0 mov r0, #0
@ -167,6 +171,17 @@ ENTRY(v7_coherent_user_range)
dsb dsb
isb isb
mov pc, lr mov pc, lr
/*
* Fault handling for the cache operation above. If the virtual address in r0
* isn't mapped, just try the next page.
*/
9001:
mov r0, r0, lsr #12
mov r0, r0, lsl #12
add r0, r0, #4096
b 2b
UNWIND(.fnend )
ENDPROC(v7_coherent_kern_range) ENDPROC(v7_coherent_kern_range)
ENDPROC(v7_coherent_user_range) ENDPROC(v7_coherent_user_range)

View File

@ -153,14 +153,11 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long addr, pte_t pte)
page = pfn_to_page(pfn); page = pfn_to_page(pfn);
mapping = page_mapping(page); mapping = page_mapping(page);
if (mapping) {
#ifndef CONFIG_SMP #ifndef CONFIG_SMP
int dirty = test_and_clear_bit(PG_dcache_dirty, &page->flags); if (test_and_clear_bit(PG_dcache_dirty, &page->flags))
__flush_dcache_page(mapping, page);
if (dirty)
__flush_dcache_page(mapping, page);
#endif #endif
if (mapping) {
if (cache_is_vivt()) if (cache_is_vivt())
make_coherent(mapping, vma, addr, pfn); make_coherent(mapping, vma, addr, pfn);
else if (vma->vm_flags & VM_EXEC) else if (vma->vm_flags & VM_EXEC)

View File

@ -292,6 +292,11 @@ do_page_fault(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
* down_read() * down_read()
*/ */
might_sleep(); might_sleep();
#ifdef CONFIG_DEBUG_VM
if (!user_mode(regs) &&
!search_exception_tables(regs->ARM_pc))
goto no_context;
#endif
} }
fault = __do_page_fault(mm, addr, fsr, tsk); fault = __do_page_fault(mm, addr, fsr, tsk);

View File

@ -46,6 +46,8 @@ void *kmap_atomic(struct page *page, enum km_type type)
if (!PageHighMem(page)) if (!PageHighMem(page))
return page_address(page); return page_address(page);
debug_kmap_atomic(type);
kmap = kmap_high_get(page); kmap = kmap_high_get(page);
if (kmap) if (kmap)
return kmap; return kmap;

View File

@ -483,7 +483,7 @@ free_memmap(int node, unsigned long start_pfn, unsigned long end_pfn)
/* /*
* Convert start_pfn/end_pfn to a struct page pointer. * Convert start_pfn/end_pfn to a struct page pointer.
*/ */
start_pg = pfn_to_page(start_pfn); start_pg = pfn_to_page(start_pfn - 1) + 1;
end_pg = pfn_to_page(end_pfn); end_pg = pfn_to_page(end_pfn);
/* /*

View File

@ -829,10 +829,10 @@ EXPORT_SYMBOL(omap_free_dma);
* *
* @param arb_rate * @param arb_rate
* @param max_fifo_depth * @param max_fifo_depth
* @param tparams - Number of thereads to reserve : DMA_THREAD_RESERVE_NORM * @param tparams - Number of threads to reserve : DMA_THREAD_RESERVE_NORM
* DMA_THREAD_RESERVE_ONET * DMA_THREAD_RESERVE_ONET
* DMA_THREAD_RESERVE_TWOT * DMA_THREAD_RESERVE_TWOT
* DMA_THREAD_RESERVE_THREET * DMA_THREAD_RESERVE_THREET
*/ */
void void
omap_dma_set_global_params(int arb_rate, int max_fifo_depth, int tparams) omap_dma_set_global_params(int arb_rate, int max_fifo_depth, int tparams)
@ -844,11 +844,14 @@ omap_dma_set_global_params(int arb_rate, int max_fifo_depth, int tparams)
return; return;
} }
if (max_fifo_depth == 0)
max_fifo_depth = 1;
if (arb_rate == 0) if (arb_rate == 0)
arb_rate = 1; arb_rate = 1;
reg = (arb_rate & 0xff) << 16; reg = 0xff & max_fifo_depth;
reg |= (0xff & max_fifo_depth); reg |= (0x3 & tparams) << 12;
reg |= (arb_rate & 0xff) << 16;
dma_write(reg, GCR); dma_write(reg, GCR);
} }

View File

@ -303,32 +303,21 @@ IS_OMAP_TYPE(3430, 0x3430)
#define cpu_is_omap2430() 0 #define cpu_is_omap2430() 0
#define cpu_is_omap3430() 0 #define cpu_is_omap3430() 0
#if defined(MULTI_OMAP1)
# if defined(CONFIG_ARCH_OMAP730)
# undef cpu_is_omap730
# define cpu_is_omap730() is_omap730()
# endif
# if defined(CONFIG_ARCH_OMAP850)
# undef cpu_is_omap850
# define cpu_is_omap850() is_omap850()
# endif
#else
# if defined(CONFIG_ARCH_OMAP730)
# undef cpu_is_omap730
# define cpu_is_omap730() 1
# endif
#endif
#else
# if defined(CONFIG_ARCH_OMAP850)
# undef cpu_is_omap850
# define cpu_is_omap850() 1
# endif
#endif
/* /*
* Whether we have MULTI_OMAP1 or not, we still need to distinguish * Whether we have MULTI_OMAP1 or not, we still need to distinguish
* between 330 vs. 1510 and 1611B/5912 vs. 1710. * between 730 vs 850, 330 vs. 1510 and 1611B/5912 vs. 1710.
*/ */
#if defined(CONFIG_ARCH_OMAP730)
# undef cpu_is_omap730
# define cpu_is_omap730() is_omap730()
#endif
#if defined(CONFIG_ARCH_OMAP850)
# undef cpu_is_omap850
# define cpu_is_omap850() is_omap850()
#endif
#if defined(CONFIG_ARCH_OMAP15XX) #if defined(CONFIG_ARCH_OMAP15XX)
# undef cpu_is_omap310 # undef cpu_is_omap310
# undef cpu_is_omap1510 # undef cpu_is_omap1510
@ -433,3 +422,5 @@ IS_OMAP_TYPE(3430, 0x3430)
int omap_chip_is(struct omap_chip_id oci); int omap_chip_is(struct omap_chip_id oci);
void omap2_check_revision(void); void omap2_check_revision(void);
#endif

View File

@ -135,6 +135,8 @@ struct powerdomain *pwrdm_lookup(const char *name);
int pwrdm_for_each(int (*fn)(struct powerdomain *pwrdm, void *user), int pwrdm_for_each(int (*fn)(struct powerdomain *pwrdm, void *user),
void *user); void *user);
int pwrdm_for_each_nolock(int (*fn)(struct powerdomain *pwrdm, void *user),
void *user);
int pwrdm_add_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm); int pwrdm_add_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm);
int pwrdm_del_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm); int pwrdm_del_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm);

View File

@ -47,7 +47,7 @@
* 'va': mpu virtual address * 'va': mpu virtual address
* *
* 'c': contiguous memory area * 'c': contiguous memory area
* 'd': dicontiguous memory area * 'd': discontiguous memory area
* 'a': anonymous memory allocation * 'a': anonymous memory allocation
* '()': optional feature * '()': optional feature
* *
@ -363,8 +363,9 @@ void *da_to_va(struct iommu *obj, u32 da)
goto out; goto out;
} }
va = area->va; va = area->va;
mutex_unlock(&obj->mmap_lock);
out: out:
mutex_unlock(&obj->mmap_lock);
return va; return va;
} }
EXPORT_SYMBOL_GPL(da_to_va); EXPORT_SYMBOL_GPL(da_to_va);
@ -398,7 +399,7 @@ static inline void sgtable_drain_vmalloc(struct sg_table *sgt)
{ {
/* /*
* Actually this is not necessary at all, just exists for * Actually this is not necessary at all, just exists for
* consistency of the code readibility. * consistency of the code readability.
*/ */
BUG_ON(!sgt); BUG_ON(!sgt);
} }
@ -434,7 +435,7 @@ static inline void sgtable_drain_kmalloc(struct sg_table *sgt)
{ {
/* /*
* Actually this is not necessary at all, just exists for * Actually this is not necessary at all, just exists for
* consistency of the code readibility * consistency of the code readability
*/ */
BUG_ON(!sgt); BUG_ON(!sgt);
} }

View File

@ -595,7 +595,7 @@ void omap_mcbsp_stop(unsigned int id, int tx, int rx)
rx &= 1; rx &= 1;
if (cpu_is_omap2430() || cpu_is_omap34xx()) { if (cpu_is_omap2430() || cpu_is_omap34xx()) {
w = OMAP_MCBSP_READ(io_base, RCCR); w = OMAP_MCBSP_READ(io_base, RCCR);
w |= (tx ? RDISABLE : 0); w |= (rx ? RDISABLE : 0);
OMAP_MCBSP_WRITE(io_base, RCCR, w); OMAP_MCBSP_WRITE(io_base, RCCR, w);
} }
w = OMAP_MCBSP_READ(io_base, SPCR1); w = OMAP_MCBSP_READ(io_base, SPCR1);

View File

@ -270,7 +270,8 @@ void * omap_sram_push(void * start, unsigned long size)
omap_sram_ceil -= size; omap_sram_ceil -= size;
omap_sram_ceil = ROUND_DOWN(omap_sram_ceil, sizeof(void *)); omap_sram_ceil = ROUND_DOWN(omap_sram_ceil, sizeof(void *));
memcpy((void *)omap_sram_ceil, start, size); memcpy((void *)omap_sram_ceil, start, size);
flush_icache_range((unsigned long)start, (unsigned long)(start + size)); flush_icache_range((unsigned long)omap_sram_ceil,
(unsigned long)(omap_sram_ceil + size));
return (void *)omap_sram_ceil; return (void *)omap_sram_ceil;
} }

View File

@ -14,6 +14,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/sched.h>
#include <linux/list.h> #include <linux/list.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/clk.h> #include <linux/clk.h>

41
arch/blackfin/ADI_BSD.txt Normal file
View File

@ -0,0 +1,41 @@
This BSD-Style License applies to a few files in ./arch/blackfin directory,
and is included here, so people understand which code they can use outside
the Linux kernel, in non-GPL based projects.
Using the files released under the "ADI BSD" license, must comply with
these license terms.
--------------------------------------------------------------------------
Copyright Analog Devices, Inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
- Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the
distribution.
- Neither the name of Analog Devices, Inc. nor the names of its
contributors may be used to endorse or promote products derived
from this software without specific prior written permission.
- The use of this software may or may not infringe the patent rights
of one or more patent holders. This license does not release you
from the requirement that you obtain separate licenses from these
patent holders to use this software.
THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES "AS IS" AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, NON-INFRINGEMENT,
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL ANALOG DEVICES BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, INTELLECTUAL PROPERTY RIGHTS, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE

View File

@ -47,6 +47,9 @@ config GENERIC_HARDIRQS
config GENERIC_IRQ_PROBE config GENERIC_IRQ_PROBE
def_bool y def_bool y
config GENERIC_HARDIRQS_NO__DO_IRQ
def_bool y
config GENERIC_GPIO config GENERIC_GPIO
def_bool y def_bool y
@ -229,7 +232,7 @@ endchoice
config SMP config SMP
depends on BF561 depends on BF561
select GENERIC_TIME select GENERIC_CLOCKEVENTS
bool "Symmetric multi-processing support" bool "Symmetric multi-processing support"
---help--- ---help---
This enables support for systems with more than one CPU, This enables support for systems with more than one CPU,
@ -613,12 +616,10 @@ comment "Kernel Timer/Scheduler"
source kernel/Kconfig.hz source kernel/Kconfig.hz
config GENERIC_TIME config GENERIC_TIME
bool "Generic time" def_bool y
default y
config GENERIC_CLOCKEVENTS config GENERIC_CLOCKEVENTS
bool "Generic clock events" bool "Generic clock events"
depends on GENERIC_TIME
default y default y
choice choice
@ -653,6 +654,10 @@ config GPTMR0_CLOCKSOURCE
depends on GENERIC_CLOCKEVENTS depends on GENERIC_CLOCKEVENTS
depends on !TICKSOURCE_GPTMR0 depends on !TICKSOURCE_GPTMR0
config ARCH_USES_GETTIMEOFFSET
depends on !GENERIC_CLOCKEVENTS
def_bool y
source kernel/time/Kconfig source kernel/time/Kconfig
comment "Misc" comment "Misc"

View File

@ -1,3 +1,9 @@
/*
 * Copyright 2004-2009 Analog Devices Inc.
 *
 * Licensed under the GPL-2 or later.
 */
#ifndef __ARCH_BLACKFIN_ATOMIC__ #ifndef __ARCH_BLACKFIN_ATOMIC__
#define __ARCH_BLACKFIN_ATOMIC__ #define __ARCH_BLACKFIN_ATOMIC__

View File

@ -1,29 +1,9 @@
/* /*
* File: include/asm-blackfin/bfin-global.h * Global extern defines for blackfin
* Based on:
* Author: *
* Created:
* Description: Global extern defines for blackfin
* *
* Modified: * Copyright 2006-2009 Analog Devices Inc.
* Copyright 2004-2006 Analog Devices Inc.
* *
* Bugs: Enter bugs at http://blackfin.uclinux.org/ * Licensed under the GPL-2 or later.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see the file COPYING, or write
* to the Free Software Foundation, Inc.,
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#ifndef _BFIN_GLOBAL_H_ #ifndef _BFIN_GLOBAL_H_

View File

@ -3,8 +3,6 @@
* *
* Copyright 2004-2008 Analog Devices Inc. * Copyright 2004-2008 Analog Devices Inc.
* *
* Enter bugs at http://blackfin.uclinux.org/
*
* Licensed under the GPL-2 or later. * Licensed under the GPL-2 or later.
*/ */

View File

@ -1,6 +1,10 @@
/* /*
* board initialization should put one of these structures into platform_data * board initialization should put one of these structures into platform_data
* and place the bfin-rotary onto platform_bus named "bfin-rotary". * and place the bfin-rotary onto platform_bus named "bfin-rotary".
*
* Copyright 2008 Analog Devices Inc.
*
* Licensed under the GPL-2 or later.
*/ */
#ifndef _BFIN_ROTARY_H #ifndef _BFIN_ROTARY_H

View File

@ -1,3 +1,9 @@
/*
* Copyright 2006-2008 Analog Devices Inc.
*
* Licensed under the GPL-2 or later.
*/
#ifndef _bfin_simple_timer_h_ #ifndef _bfin_simple_timer_h_
#define _bfin_simple_timer_h_ #define _bfin_simple_timer_h_

View File

@ -1,3 +1,9 @@
/*
* Copyright 2004-2009 Analog Devices Inc.
*
* Licensed under the GPL-2 or later.
*/
#ifndef _BLACKFIN_BITOPS_H #ifndef _BLACKFIN_BITOPS_H
#define _BLACKFIN_BITOPS_H #define _BLACKFIN_BITOPS_H

View File

@ -1,6 +1,9 @@
/* /*
* Common header file for blackfin family of processors. * Common header file for Blackfin family of processors.
* *
 * Copyright 2004-2009 Analog Devices Inc.
 *
 * Licensed under the GPL-2 or later.
*/ */
#ifndef _BLACKFIN_H_ #ifndef _BLACKFIN_H_

View File

@ -1,3 +1,9 @@
/*
* Copyright 2004-2009 Analog Devices Inc.
*
* Licensed under the GPL-2 or later.
*/
#ifndef _BLACKFIN_BUG_H #ifndef _BLACKFIN_BUG_H
#define _BLACKFIN_BUG_H #define _BLACKFIN_BUG_H

View File

@ -1,6 +1 @@
#ifndef _BLACKFIN_BYTEORDER_H
#define _BLACKFIN_BYTEORDER_H
#include <linux/byteorder/little_endian.h> #include <linux/byteorder/little_endian.h>
#endif /* _BLACKFIN_BYTEORDER_H */

View File

@ -1,6 +1,9 @@
/* /*
* include/asm-blackfin/cache.h * Copyright 2004-2009 Analog Devices Inc.
*
* Licensed under the GPL-2 or later.
*/ */
#ifndef __ARCH_BLACKFIN_CACHE_H #ifndef __ARCH_BLACKFIN_CACHE_H
#define __ARCH_BLACKFIN_CACHE_H #define __ARCH_BLACKFIN_CACHE_H
@ -35,10 +38,10 @@
#if defined(CONFIG_SMP) && \ #if defined(CONFIG_SMP) && \
!defined(CONFIG_BFIN_CACHE_COHERENT) !defined(CONFIG_BFIN_CACHE_COHERENT)
# if defined(CONFIG_BFIN_ICACHEABLE) || defined(CONFIG_BFIN_L2_ICACHEABLE) # if defined(CONFIG_BFIN_EXTMEM_ICACHEABLE) || defined(CONFIG_BFIN_L2_ICACHEABLE)
# define __ARCH_SYNC_CORE_ICACHE # define __ARCH_SYNC_CORE_ICACHE
# endif # endif
# if defined(CONFIG_BFIN_DCACHEABLE) || defined(CONFIG_BFIN_L2_DCACHEABLE) # if defined(CONFIG_BFIN_EXTMEM_DCACHEABLE) || defined(CONFIG_BFIN_L2_DCACHEABLE)
# define __ARCH_SYNC_CORE_DCACHE # define __ARCH_SYNC_CORE_DCACHE
# endif # endif
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__

View File

@ -1,30 +1,9 @@
/* /*
* File: include/asm-blackfin/cacheflush.h * Blackfin low-level cache routines
* Based on: include/asm-m68knommu/cacheflush.h
* Author: LG Soft India
* Copyright (C) 2004 Analog Devices Inc.
* Created: Tue Sep 21 2004
* Description: Blackfin low-level cache routines adapted from the i386
* and PPC versions by Greg Ungerer (gerg@snapgear.com)
* *
* Modified: * Copyright 2004-2009 Analog Devices Inc.
* *
* Bugs: Enter bugs at http://blackfin.uclinux.org/ * Licensed under the GPL-2 or later.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING.
* If not, write to the Free Software Foundation,
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/ */
#ifndef _BLACKFIN_CACHEFLUSH_H #ifndef _BLACKFIN_CACHEFLUSH_H

View File

@ -1,30 +1,8 @@
/* /*
* File: include/asm-blackfin/mach-common/cdef_LPBlackfin.h * Copyright 2005-2008 Analog Devices Inc.
* Based on: *
* Author: unknown * Licensed under the GPL-2 or later.
* COPYRIGHT 2005 Analog Devices */
* Created: ?
* Description:
*
* Modified:
*
* Bugs: Enter bugs at http://blackfin.uclinux.org/
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING.
* If not, write to the Free Software Foundation,
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef _CDEF_LPBLACKFIN_H #ifndef _CDEF_LPBLACKFIN_H
#define _CDEF_LPBLACKFIN_H #define _CDEF_LPBLACKFIN_H

View File

@ -1,9 +1,14 @@
/*
* Copyright 2004-2009 Analog Devices Inc.
* akbar.hussain@lineo.com
*
* Licensed under the GPL-2 or later.
*/
#ifndef _BFIN_CHECKSUM_H #ifndef _BFIN_CHECKSUM_H
#define _BFIN_CHECKSUM_H #define _BFIN_CHECKSUM_H
/* /*
* MODIFIED FOR BFIN April 30, 2001 akbar.hussain@lineo.com
*
* computes the checksum of a memory block at buff, length len, * computes the checksum of a memory block at buff, length len,
* and adds in "sum" (32-bit) * and adds in "sum" (32-bit)
* *

View File

@ -1,30 +1,9 @@
/* /*
* File: include/asm-blackfin/mach-common/clocks.h * Common Clock definitions for various kernel files
* Based on: include/asm-blackfin/mach-bf537/bf537.h
* Author: Robin Getz <rgetz@blackfin.uclinux.org>
* *
* Created: 25Jul07 * Copyright 2007-2008 Analog Devices Inc.
* Description: Common Clock definitions for various kernel files
* *
* Modified: * Licensed under the GPL-2 or later.
* Copyright 2004-2007 Analog Devices Inc.
*
* Bugs: Enter bugs at http://blackfin.uclinux.org/
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see the file COPYING, or write
* to the Free Software Foundation, Inc.,
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#ifndef _BFIN_CLOCKS_H #ifndef _BFIN_CLOCKS_H

View File

@ -1,30 +1,7 @@
/* /*
* File: arch/blackfin/kernel/context.S * Copyright 2007-2009 Analog Devices Inc.
* Based on:
* Author:
* *
* Created: * Licensed under the GPL-2 or later.
* Description:
*
* Modified:
* Copyright 2004-2007 Analog Devices Inc.
*
* Bugs: Enter bugs at http://blackfin.uclinux.org/
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see the file COPYING, or write
* to the Free Software Foundation, Inc.,
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
/* /*

View File

@ -1,30 +1,7 @@
/* /*
* File: include/asm-blackfin/cplb.h * Copyright 2004-2009 Analog Devices Inc.
* Based on: include/asm-blackfin/mach-bf537/bf537.h
* Author: Robin Getz <rgetz@blackfin.uclinux.org>
* *
* Created: 2000 * Licensed under the GPL-2 or later.
* Description: Common CPLB definitions for CPLB init
*
* Modified:
* Copyright 2004-2007 Analog Devices Inc.
*
* Bugs: Enter bugs at http://blackfin.uclinux.org/
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see the file COPYING, or write
* to the Free Software Foundation, Inc.,
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#ifndef _CPLB_H #ifndef _CPLB_H

View File

@ -1,30 +1,9 @@
/* /*
* File: include/asm-blackfin/cplbinit.h * Common CPLB definitions for CPLB init
* Based on:
* Author:
* *
* Created: * Copyright 2006-2008 Analog Devices Inc.
* Description:
* *
* Modified: * Licensed under the GPL-2 or later.
* Copyright 2004-2006 Analog Devices Inc.
*
* Bugs: Enter bugs at http://blackfin.uclinux.org/
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see the file COPYING, or write
* to the Free Software Foundation, Inc.,
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#ifndef __ASM_CPLBINIT_H__ #ifndef __ASM_CPLBINIT_H__

View File

@ -1,23 +1,8 @@
/* /*
* File: arch/blackfin/include/asm/cpu.h. * Copyright 2007-2009 Analog Devices Inc.
* Author: Philippe Gerum <rpm@xenomai.org> * Philippe Gerum <rpm@xenomai.org>
* *
* Copyright 2007 Analog Devices Inc. * Licensed under the GPL-2 or later.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see the file COPYING, or write
* to the Free Software Foundation, Inc.,
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#ifndef __ASM_BLACKFIN_CPU_H #ifndef __ASM_BLACKFIN_CPU_H

View File

@ -1,32 +1,10 @@
/* /*
* File: include/asm-blackfin/mach-common/def_LPBlackfin.h * Blackfin core register bit & address definitions
* Based on: *
* Author: unknown * Copyright 2005-2008 Analog Devices Inc.
* COPYRIGHT 2005 Analog Devices *
* Created: ? * Licensed under the ADI BSD license or GPL-2 (or later).
* Description: */
*
* Modified:
*
* Bugs: Enter bugs at http://blackfin.uclinux.org/
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING.
* If not, write to the Free Software Foundation,
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* LP Blackfin CORE REGISTER BIT & ADDRESS DEFINITIONS FOR ADSP-BF532/33 */
#ifndef _DEF_LPBLACKFIN_H #ifndef _DEF_LPBLACKFIN_H
#define _DEF_LPBLACKFIN_H #define _DEF_LPBLACKFIN_H

View File

@ -1,3 +1,9 @@
/*
* Copyright 2004-2009 Analog Devices Inc.
*
* Licensed under the GPL-2 or later.
*/
#ifndef _BLACKFIN_DMA_MAPPING_H #ifndef _BLACKFIN_DMA_MAPPING_H
#define _BLACKFIN_DMA_MAPPING_H #define _BLACKFIN_DMA_MAPPING_H

View File

@ -1,9 +1,11 @@
/* /*
* include/asm-blackfin/dpmc.h - Miscellaneous IOCTL commands for Dynamic Power * Miscellaneous IOCTL commands for Dynamic Power Management Controller Driver
* Management Controller Driver. *
* Copyright (C) 2004-2008 Analog Device Inc. * Copyright (C) 2004-2008 Analog Device Inc.
* *
* Licensed under the GPL-2
*/ */
#ifndef _BLACKFIN_DPMC_H_ #ifndef _BLACKFIN_DPMC_H_
#define _BLACKFIN_DPMC_H_ #define _BLACKFIN_DPMC_H_

View File

@ -1,27 +1,11 @@
/* /*
* File: include/asm-blackfin/early_printk.h * function prototpyes for early printk
* Author: Robin Getz <rgetz@blackfin.uclinux.org
* *
* Created: 14Aug2007 * Copyright 2007-2009 Analog Devices Inc.
* Description: function prototpyes for early printk
* *
* Modified: * Licensed under the GPL-2 or later.
* Copyright 2004-2007 Analog Devices Inc.
*
* Bugs: Enter bugs at http://blackfin.uclinux.org/
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/ */
#ifndef __ASM_EARLY_PRINTK_H__ #ifndef __ASM_EARLY_PRINTK_H__
#define __ASM_EARLY_PRINTK_H__ #define __ASM_EARLY_PRINTK_H__

View File

@ -1,4 +1,8 @@
/* Changes made by LG Soft Oct 2004*/ /*
* Copyright 2004-2009 Analog Devices Inc.
*
* Licensed under the GPL-2 or later.
*/
#ifndef __ASMBFIN_ELF_H #ifndef __ASMBFIN_ELF_H
#define __ASMBFIN_ELF_H #define __ASMBFIN_ELF_H

View File

@ -1,3 +1,9 @@
/*
* Copyright 2004-2009 Analog Devices Inc.
*
* Licensed under the GPL-2 or later.
*/
#ifndef __BFIN_ENTRY_H #ifndef __BFIN_ENTRY_H
#define __BFIN_ENTRY_H #define __BFIN_ENTRY_H

View File

@ -1,3 +1,9 @@
/*
* Copyright 2004-2008 Analog Devices Inc.
*
* Licensed under the GPL-2 or later.
*/
#ifndef _BFIN_FCNTL_H #ifndef _BFIN_FCNTL_H
#define _BFIN_FCNTL_H #define _BFIN_FCNTL_H

View File

@ -1,5 +1,11 @@
/* This file defines the fixed addresses where userspace programs can find /*
atomic code sequences. */ * This file defines the fixed addresses where userspace programs
* can find atomic code sequences.
*
* Copyright 2007-2008 Analog Devices Inc.
*
* Licensed under the GPL-2 or later.
*/
#ifndef __BFIN_ASM_FIXED_CODE_H__ #ifndef __BFIN_ASM_FIXED_CODE_H__
#define __BFIN_ASM_FIXED_CODE_H__ #define __BFIN_ASM_FIXED_CODE_H__

View File

@ -1,8 +1,9 @@
/* /*
* include/asm-blackfin/flat.h -- uClinux flat-format executables * uClinux flat-format executables
* *
* Copyright (C) 2003, * Copyright 2003-2009 Analog Devices Inc.
* *
* Licensed under the GPL-2
*/ */
#ifndef __BLACKFIN_FLAT_H__ #ifndef __BLACKFIN_FLAT_H__

View File

@ -1,30 +1,7 @@
/* /*
* File: arch/blackfin/kernel/bfin_gpio.h * Copyright 2006-2009 Analog Devices Inc.
* Based on:
* Author: Michael Hennerich (hennerich@blackfin.uclinux.org)
* *
* Created: * Licensed under the GPL-2 or later.
* Description:
*
* Modified:
* Copyright 2004-2008 Analog Devices Inc.
*
* Bugs: Enter bugs at http://blackfin.uclinux.org/
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see the file COPYING, or write
* to the Free Software Foundation, Inc.,
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#ifndef __ARCH_BLACKFIN_GPIO_H__ #ifndef __ARCH_BLACKFIN_GPIO_H__

View File

@ -1,3 +1,9 @@
/*
* Copyright 2004-2009 Analog Devices Inc.
*
* Licensed under the GPL-2 or later.
*/
#ifndef __BFIN_HARDIRQ_H #ifndef __BFIN_HARDIRQ_H
#define __BFIN_HARDIRQ_H #define __BFIN_HARDIRQ_H

View File

@ -1,3 +1,9 @@
/*
* Copyright 2004-2009 Analog Devices Inc.
*
* Licensed under the GPL-2 or later.
*/
#ifndef _BFIN_IO_H #ifndef _BFIN_IO_H
#define _BFIN_IO_H #define _BFIN_IO_H

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