Merge branch 'omap2-upstream' into devel
This commit is contained in:
@@ -271,8 +271,6 @@ netlabel/
|
||||
- directory with information on the NetLabel subsystem.
|
||||
networking/
|
||||
- directory with info on various aspects of networking with Linux.
|
||||
nfsroot.txt
|
||||
- short guide on setting up a diskless box with NFS root filesystem.
|
||||
nmi_watchdog.txt
|
||||
- info on NMI watchdog for SMP systems.
|
||||
nommu-mmap.txt
|
||||
@@ -321,8 +319,6 @@ robust-futexes.txt
|
||||
- a description of what robust futexes are.
|
||||
rocket.txt
|
||||
- info on the Comtrol RocketPort multiport serial driver.
|
||||
rpc-cache.txt
|
||||
- introduction to the caching mechanisms in the sunrpc layer.
|
||||
rt-mutex-design.txt
|
||||
- description of the RealTime mutex implementation design.
|
||||
rt-mutex.txt
|
||||
|
||||
@@ -328,7 +328,7 @@ now, but you can do this to mark internal company procedures or just
|
||||
point out some special detail about the sign-off.
|
||||
|
||||
|
||||
13) When to use Acked-by:
|
||||
13) When to use Acked-by: and Cc:
|
||||
|
||||
The Signed-off-by: tag indicates that the signer was involved in the
|
||||
development of the patch, or that he/she was in the patch's delivery path.
|
||||
@@ -349,11 +349,59 @@ Acked-by: does not necessarily indicate acknowledgement of the entire patch.
|
||||
For example, if a patch affects multiple subsystems and has an Acked-by: from
|
||||
one subsystem maintainer then this usually indicates acknowledgement of just
|
||||
the part which affects that maintainer's code. Judgement should be used here.
|
||||
When in doubt people should refer to the original discussion in the mailing
|
||||
When in doubt people should refer to the original discussion in the mailing
|
||||
list archives.
|
||||
|
||||
If a person has had the opportunity to comment on a patch, but has not
|
||||
provided such comments, you may optionally add a "Cc:" tag to the patch.
|
||||
This is the only tag which might be added without an explicit action by the
|
||||
person it names. This tag documents that potentially interested parties
|
||||
have been included in the discussion
|
||||
|
||||
14) The canonical patch format
|
||||
|
||||
14) Using Test-by: and Reviewed-by:
|
||||
|
||||
A Tested-by: tag indicates that the patch has been successfully tested (in
|
||||
some environment) by the person named. This tag informs maintainers that
|
||||
some testing has been performed, provides a means to locate testers for
|
||||
future patches, and ensures credit for the testers.
|
||||
|
||||
Reviewed-by:, instead, indicates that the patch has been reviewed and found
|
||||
acceptable according to the Reviewer's Statement:
|
||||
|
||||
Reviewer's statement of oversight
|
||||
|
||||
By offering my Reviewed-by: tag, I state that:
|
||||
|
||||
(a) I have carried out a technical review of this patch to
|
||||
evaluate its appropriateness and readiness for inclusion into
|
||||
the mainline kernel.
|
||||
|
||||
(b) Any problems, concerns, or questions relating to the patch
|
||||
have been communicated back to the submitter. I am satisfied
|
||||
with the submitter's response to my comments.
|
||||
|
||||
(c) While there may be things that could be improved with this
|
||||
submission, I believe that it is, at this time, (1) a
|
||||
worthwhile modification to the kernel, and (2) free of known
|
||||
issues which would argue against its inclusion.
|
||||
|
||||
(d) While I have reviewed the patch and believe it to be sound, I
|
||||
do not (unless explicitly stated elsewhere) make any
|
||||
warranties or guarantees that it will achieve its stated
|
||||
purpose or function properly in any given situation.
|
||||
|
||||
A Reviewed-by tag is a statement of opinion that the patch is an
|
||||
appropriate modification of the kernel without any remaining serious
|
||||
technical issues. Any interested reviewer (who has done the work) can
|
||||
offer a Reviewed-by tag for a patch. This tag serves to give credit to
|
||||
reviewers and to inform maintainers of the degree of review which has been
|
||||
done on the patch. Reviewed-by: tags, when supplied by reviewers known to
|
||||
understand the subject area and to perform thorough reviews, will normally
|
||||
increase the liklihood of your patch getting into the kernel.
|
||||
|
||||
|
||||
15) The canonical patch format
|
||||
|
||||
The canonical patch subject line is:
|
||||
|
||||
@@ -512,7 +560,7 @@ They provide type safety, have no length limitations, no formatting
|
||||
limitations, and under gcc they are as cheap as macros.
|
||||
|
||||
Macros should only be used for cases where a static inline is clearly
|
||||
suboptimal [there a few, isolated cases of this in fast paths],
|
||||
suboptimal [there are a few, isolated cases of this in fast paths],
|
||||
or where it is impossible to use a static inline function [such as
|
||||
string-izing].
|
||||
|
||||
|
||||
@@ -66,6 +66,8 @@ mandatory-locking.txt
|
||||
- info on the Linux implementation of Sys V mandatory file locking.
|
||||
ncpfs.txt
|
||||
- info on Novell Netware(tm) filesystem using NCP protocol.
|
||||
nfsroot.txt
|
||||
- short guide on setting up a diskless box with NFS root filesystem.
|
||||
ntfs.txt
|
||||
- info and mount options for the NTFS filesystem (Windows NT).
|
||||
ocfs2.txt
|
||||
@@ -82,6 +84,10 @@ relay.txt
|
||||
- info on relay, for efficient streaming from kernel to user space.
|
||||
romfs.txt
|
||||
- description of the ROMFS filesystem.
|
||||
rpc-cache.txt
|
||||
- introduction to the caching mechanisms in the sunrpc layer.
|
||||
seq_file.txt
|
||||
- how to use the seq_file API
|
||||
sharedsubtree.txt
|
||||
- a description of shared subtrees for namespaces.
|
||||
smbfs.txt
|
||||
|
||||
@@ -0,0 +1,283 @@
|
||||
The seq_file interface
|
||||
|
||||
Copyright 2003 Jonathan Corbet <corbet@lwn.net>
|
||||
This file is originally from the LWN.net Driver Porting series at
|
||||
http://lwn.net/Articles/driver-porting/
|
||||
|
||||
|
||||
There are numerous ways for a device driver (or other kernel component) to
|
||||
provide information to the user or system administrator. One useful
|
||||
technique is the creation of virtual files, in debugfs, /proc or elsewhere.
|
||||
Virtual files can provide human-readable output that is easy to get at
|
||||
without any special utility programs; they can also make life easier for
|
||||
script writers. It is not surprising that the use of virtual files has
|
||||
grown over the years.
|
||||
|
||||
Creating those files correctly has always been a bit of a challenge,
|
||||
however. It is not that hard to make a virtual file which returns a
|
||||
string. But life gets trickier if the output is long - anything greater
|
||||
than an application is likely to read in a single operation. Handling
|
||||
multiple reads (and seeks) requires careful attention to the reader's
|
||||
position within the virtual file - that position is, likely as not, in the
|
||||
middle of a line of output. The kernel has traditionally had a number of
|
||||
implementations that got this wrong.
|
||||
|
||||
The 2.6 kernel contains a set of functions (implemented by Alexander Viro)
|
||||
which are designed to make it easy for virtual file creators to get it
|
||||
right.
|
||||
|
||||
The seq_file interface is available via <linux/seq_file.h>. There are
|
||||
three aspects to seq_file:
|
||||
|
||||
* An iterator interface which lets a virtual file implementation
|
||||
step through the objects it is presenting.
|
||||
|
||||
* Some utility functions for formatting objects for output without
|
||||
needing to worry about things like output buffers.
|
||||
|
||||
* A set of canned file_operations which implement most operations on
|
||||
the virtual file.
|
||||
|
||||
We'll look at the seq_file interface via an extremely simple example: a
|
||||
loadable module which creates a file called /proc/sequence. The file, when
|
||||
read, simply produces a set of increasing integer values, one per line. The
|
||||
sequence will continue until the user loses patience and finds something
|
||||
better to do. The file is seekable, in that one can do something like the
|
||||
following:
|
||||
|
||||
dd if=/proc/sequence of=out1 count=1
|
||||
dd if=/proc/sequence skip=1 out=out2 count=1
|
||||
|
||||
Then concatenate the output files out1 and out2 and get the right
|
||||
result. Yes, it is a thoroughly useless module, but the point is to show
|
||||
how the mechanism works without getting lost in other details. (Those
|
||||
wanting to see the full source for this module can find it at
|
||||
http://lwn.net/Articles/22359/).
|
||||
|
||||
|
||||
The iterator interface
|
||||
|
||||
Modules implementing a virtual file with seq_file must implement a simple
|
||||
iterator object that allows stepping through the data of interest.
|
||||
Iterators must be able to move to a specific position - like the file they
|
||||
implement - but the interpretation of that position is up to the iterator
|
||||
itself. A seq_file implementation that is formatting firewall rules, for
|
||||
example, could interpret position N as the Nth rule in the chain.
|
||||
Positioning can thus be done in whatever way makes the most sense for the
|
||||
generator of the data, which need not be aware of how a position translates
|
||||
to an offset in the virtual file. The one obvious exception is that a
|
||||
position of zero should indicate the beginning of the file.
|
||||
|
||||
The /proc/sequence iterator just uses the count of the next number it
|
||||
will output as its position.
|
||||
|
||||
Four functions must be implemented to make the iterator work. The first,
|
||||
called start() takes a position as an argument and returns an iterator
|
||||
which will start reading at that position. For our simple sequence example,
|
||||
the start() function looks like:
|
||||
|
||||
static void *ct_seq_start(struct seq_file *s, loff_t *pos)
|
||||
{
|
||||
loff_t *spos = kmalloc(sizeof(loff_t), GFP_KERNEL);
|
||||
if (! spos)
|
||||
return NULL;
|
||||
*spos = *pos;
|
||||
return spos;
|
||||
}
|
||||
|
||||
The entire data structure for this iterator is a single loff_t value
|
||||
holding the current position. There is no upper bound for the sequence
|
||||
iterator, but that will not be the case for most other seq_file
|
||||
implementations; in most cases the start() function should check for a
|
||||
"past end of file" condition and return NULL if need be.
|
||||
|
||||
For more complicated applications, the private field of the seq_file
|
||||
structure can be used. There is also a special value whch can be returned
|
||||
by the start() function called SEQ_START_TOKEN; it can be used if you wish
|
||||
to instruct your show() function (described below) to print a header at the
|
||||
top of the output. SEQ_START_TOKEN should only be used if the offset is
|
||||
zero, however.
|
||||
|
||||
The next function to implement is called, amazingly, next(); its job is to
|
||||
move the iterator forward to the next position in the sequence. The
|
||||
example module can simply increment the position by one; more useful
|
||||
modules will do what is needed to step through some data structure. The
|
||||
next() function returns a new iterator, or NULL if the sequence is
|
||||
complete. Here's the example version:
|
||||
|
||||
static void *ct_seq_next(struct seq_file *s, void *v, loff_t *pos)
|
||||
{
|
||||
loff_t *spos = v;
|
||||
*pos = ++*spos;
|
||||
return spos;
|
||||
}
|
||||
|
||||
The stop() function is called when iteration is complete; its job, of
|
||||
course, is to clean up. If dynamic memory is allocated for the iterator,
|
||||
stop() is the place to free it.
|
||||
|
||||
static void ct_seq_stop(struct seq_file *s, void *v)
|
||||
{
|
||||
kfree(v);
|
||||
}
|
||||
|
||||
Finally, the show() function should format the object currently pointed to
|
||||
by the iterator for output. It should return zero, or an error code if
|
||||
something goes wrong. The example module's show() function is:
|
||||
|
||||
static int ct_seq_show(struct seq_file *s, void *v)
|
||||
{
|
||||
loff_t *spos = v;
|
||||
seq_printf(s, "%lld\n", (long long)*spos);
|
||||
return 0;
|
||||
}
|
||||
|
||||
We will look at seq_printf() in a moment. But first, the definition of the
|
||||
seq_file iterator is finished by creating a seq_operations structure with
|
||||
the four functions we have just defined:
|
||||
|
||||
static const struct seq_operations ct_seq_ops = {
|
||||
.start = ct_seq_start,
|
||||
.next = ct_seq_next,
|
||||
.stop = ct_seq_stop,
|
||||
.show = ct_seq_show
|
||||
};
|
||||
|
||||
This structure will be needed to tie our iterator to the /proc file in
|
||||
a little bit.
|
||||
|
||||
It's worth noting that the interator value returned by start() and
|
||||
manipulated by the other functions is considered to be completely opaque by
|
||||
the seq_file code. It can thus be anything that is useful in stepping
|
||||
through the data to be output. Counters can be useful, but it could also be
|
||||
a direct pointer into an array or linked list. Anything goes, as long as
|
||||
the programmer is aware that things can happen between calls to the
|
||||
iterator function. However, the seq_file code (by design) will not sleep
|
||||
between the calls to start() and stop(), so holding a lock during that time
|
||||
is a reasonable thing to do. The seq_file code will also avoid taking any
|
||||
other locks while the iterator is active.
|
||||
|
||||
|
||||
Formatted output
|
||||
|
||||
The seq_file code manages positioning within the output created by the
|
||||
iterator and getting it into the user's buffer. But, for that to work, that
|
||||
output must be passed to the seq_file code. Some utility functions have
|
||||
been defined which make this task easy.
|
||||
|
||||
Most code will simply use seq_printf(), which works pretty much like
|
||||
printk(), but which requires the seq_file pointer as an argument. It is
|
||||
common to ignore the return value from seq_printf(), but a function
|
||||
producing complicated output may want to check that value and quit if
|
||||
something non-zero is returned; an error return means that the seq_file
|
||||
buffer has been filled and further output will be discarded.
|
||||
|
||||
For straight character output, the following functions may be used:
|
||||
|
||||
int seq_putc(struct seq_file *m, char c);
|
||||
int seq_puts(struct seq_file *m, const char *s);
|
||||
int seq_escape(struct seq_file *m, const char *s, const char *esc);
|
||||
|
||||
The first two output a single character and a string, just like one would
|
||||
expect. seq_escape() is like seq_puts(), except that any character in s
|
||||
which is in the string esc will be represented in octal form in the output.
|
||||
|
||||
There is also a function for printing filenames:
|
||||
|
||||
int seq_path(struct seq_file *m, struct path *path, char *esc);
|
||||
|
||||
Here, path indicates the file of interest, and esc is a set of characters
|
||||
which should be escaped in the output.
|
||||
|
||||
|
||||
Making it all work
|
||||
|
||||
So far, we have a nice set of functions which can produce output within the
|
||||
seq_file system, but we have not yet turned them into a file that a user
|
||||
can see. Creating a file within the kernel requires, of course, the
|
||||
creation of a set of file_operations which implement the operations on that
|
||||
file. The seq_file interface provides a set of canned operations which do
|
||||
most of the work. The virtual file author still must implement the open()
|
||||
method, however, to hook everything up. The open function is often a single
|
||||
line, as in the example module:
|
||||
|
||||
static int ct_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return seq_open(file, &ct_seq_ops);
|
||||
}
|
||||
|
||||
Here, the call to seq_open() takes the seq_operations structure we created
|
||||
before, and gets set up to iterate through the virtual file.
|
||||
|
||||
On a successful open, seq_open() stores the struct seq_file pointer in
|
||||
file->private_data. If you have an application where the same iterator can
|
||||
be used for more than one file, you can store an arbitrary pointer in the
|
||||
private field of the seq_file structure; that value can then be retrieved
|
||||
by the iterator functions.
|
||||
|
||||
The other operations of interest - read(), llseek(), and release() - are
|
||||
all implemented by the seq_file code itself. So a virtual file's
|
||||
file_operations structure will look like:
|
||||
|
||||
static const struct file_operations ct_file_ops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = ct_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = seq_release
|
||||
};
|
||||
|
||||
There is also a seq_release_private() which passes the contents of the
|
||||
seq_file private field to kfree() before releasing the structure.
|
||||
|
||||
The final step is the creation of the /proc file itself. In the example
|
||||
code, that is done in the initialization code in the usual way:
|
||||
|
||||
static int ct_init(void)
|
||||
{
|
||||
struct proc_dir_entry *entry;
|
||||
|
||||
entry = create_proc_entry("sequence", 0, NULL);
|
||||
if (entry)
|
||||
entry->proc_fops = &ct_file_ops;
|
||||
return 0;
|
||||
}
|
||||
|
||||
module_init(ct_init);
|
||||
|
||||
And that is pretty much it.
|
||||
|
||||
|
||||
seq_list
|
||||
|
||||
If your file will be iterating through a linked list, you may find these
|
||||
routines useful:
|
||||
|
||||
struct list_head *seq_list_start(struct list_head *head,
|
||||
loff_t pos);
|
||||
struct list_head *seq_list_start_head(struct list_head *head,
|
||||
loff_t pos);
|
||||
struct list_head *seq_list_next(void *v, struct list_head *head,
|
||||
loff_t *ppos);
|
||||
|
||||
These helpers will interpret pos as a position within the list and iterate
|
||||
accordingly. Your start() and next() functions need only invoke the
|
||||
seq_list_* helpers with a pointer to the appropriate list_head structure.
|
||||
|
||||
|
||||
The extra-simple version
|
||||
|
||||
For extremely simple virtual files, there is an even easier interface. A
|
||||
module can define only the show() function, which should create all the
|
||||
output that the virtual file will contain. The file's open() method then
|
||||
calls:
|
||||
|
||||
int single_open(struct file *file,
|
||||
int (*show)(struct seq_file *m, void *p),
|
||||
void *data);
|
||||
|
||||
When output time comes, the show() function will be called once. The data
|
||||
value given to single_open() can be found in the private field of the
|
||||
seq_file structure. When using single_open(), the programmer should use
|
||||
single_release() instead of seq_release() in the file_operations structure
|
||||
to avoid a memory leak.
|
||||
@@ -98,7 +98,7 @@ System-level global event devices are used for the Linux periodic tick. Per-CPU
|
||||
event devices are used to provide local CPU functionality such as process
|
||||
accounting, profiling, and high resolution timers.
|
||||
|
||||
The management layer assignes one or more of the folliwing functions to a clock
|
||||
The management layer assigns one or more of the following functions to a clock
|
||||
event device:
|
||||
- system global periodic tick (jiffies update)
|
||||
- cpu local update_process_times
|
||||
|
||||
@@ -70,7 +70,7 @@ Every PCI card emits a PCI IRQ, which can be INTA, INTB, INTC or INTD:
|
||||
|
||||
These INTA-D PCI IRQs are always 'local to the card', their real meaning
|
||||
depends on which slot they are in. If you look at the daisy chaining diagram,
|
||||
a card in slot4, issuing INTA IRQ, it will end up as a signal on PIRQ2 of
|
||||
a card in slot4, issuing INTA IRQ, it will end up as a signal on PIRQ4 of
|
||||
the PCI chipset. Most cards issue INTA, this creates optimal distribution
|
||||
between the PIRQ lines. (distributing IRQ sources properly is not a
|
||||
necessity, PCI IRQs can be shared at will, but it's a good for performance
|
||||
|
||||
@@ -170,11 +170,6 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
acpi_irq_isa= [HW,ACPI] If irq_balance, mark listed IRQs used by ISA
|
||||
Format: <irq>,<irq>...
|
||||
|
||||
acpi_new_pts_ordering [HW,ACPI]
|
||||
Enforce the ACPI 2.0 ordering of the _PTS control
|
||||
method wrt putting devices into low power states
|
||||
default: pre ACPI 2.0 ordering of _PTS
|
||||
|
||||
acpi_no_auto_ssdt [HW,ACPI] Disable automatic loading of SSDT
|
||||
|
||||
acpi_os_name= [HW,ACPI] Tell ACPI BIOS the name of the OS
|
||||
@@ -380,6 +375,10 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
ccw_timeout_log [S390]
|
||||
See Documentation/s390/CommonIO for details.
|
||||
|
||||
cgroup_disable= [KNL] Disable a particular controller
|
||||
Format: {name of the controller(s) to disable}
|
||||
{Currently supported controllers - "memory"}
|
||||
|
||||
checkreqprot [SELINUX] Set initial checkreqprot flag value.
|
||||
Format: { "0" | "1" }
|
||||
See security/selinux/Kconfig help text.
|
||||
@@ -845,7 +844,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
arch/alpha/kernel/core_marvel.c.
|
||||
|
||||
ip= [IP_PNP]
|
||||
See Documentation/nfsroot.txt.
|
||||
See Documentation/filesystems/nfsroot.txt.
|
||||
|
||||
ip2= [HW] Set IO/IRQ pairs for up to 4 IntelliPort boards
|
||||
See comment before ip2_setup() in
|
||||
@@ -1199,10 +1198,10 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
file if at all.
|
||||
|
||||
nfsaddrs= [NFS]
|
||||
See Documentation/nfsroot.txt.
|
||||
See Documentation/filesystems/nfsroot.txt.
|
||||
|
||||
nfsroot= [NFS] nfs root filesystem for disk-less boxes.
|
||||
See Documentation/nfsroot.txt.
|
||||
See Documentation/filesystems/nfsroot.txt.
|
||||
|
||||
nfs.callback_tcpport=
|
||||
[NFS] set the TCP port on which the NFSv4 callback
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/*P:100 This is the Launcher code, a simple program which lays out the
|
||||
* "physical" memory for the new Guest by mapping the kernel image and the
|
||||
* virtual devices, then reads repeatedly from /dev/lguest to run the Guest.
|
||||
:*/
|
||||
* "physical" memory for the new Guest by mapping the kernel image and
|
||||
* the virtual devices, then opens /dev/lguest to tell the kernel
|
||||
* about the Guest and control it. :*/
|
||||
#define _LARGEFILE64_SOURCE
|
||||
#define _GNU_SOURCE
|
||||
#include <stdio.h>
|
||||
@@ -43,7 +43,7 @@
|
||||
#include "linux/virtio_console.h"
|
||||
#include "linux/virtio_ring.h"
|
||||
#include "asm-x86/bootparam.h"
|
||||
/*L:110 We can ignore the 38 include files we need for this program, but I do
|
||||
/*L:110 We can ignore the 39 include files we need for this program, but I do
|
||||
* want to draw attention to the use of kernel-style types.
|
||||
*
|
||||
* As Linus said, "C is a Spartan language, and so should your naming be." I
|
||||
@@ -320,7 +320,7 @@ static unsigned long map_elf(int elf_fd, const Elf32_Ehdr *ehdr)
|
||||
err(1, "Reading program headers");
|
||||
|
||||
/* Try all the headers: there are usually only three. A read-only one,
|
||||
* a read-write one, and a "note" section which isn't loadable. */
|
||||
* a read-write one, and a "note" section which we don't load. */
|
||||
for (i = 0; i < ehdr->e_phnum; i++) {
|
||||
/* If this isn't a loadable segment, we ignore it */
|
||||
if (phdr[i].p_type != PT_LOAD)
|
||||
@@ -387,7 +387,7 @@ static unsigned long load_kernel(int fd)
|
||||
if (memcmp(hdr.e_ident, ELFMAG, SELFMAG) == 0)
|
||||
return map_elf(fd, &hdr);
|
||||
|
||||
/* Otherwise we assume it's a bzImage, and try to unpack it */
|
||||
/* Otherwise we assume it's a bzImage, and try to load it. */
|
||||
return load_bzimage(fd);
|
||||
}
|
||||
|
||||
@@ -433,12 +433,12 @@ static unsigned long load_initrd(const char *name, unsigned long mem)
|
||||
return len;
|
||||
}
|
||||
|
||||
/* Once we know how much memory we have, we can construct simple linear page
|
||||
/* Once we know how much memory we have we can construct simple linear page
|
||||
* tables which set virtual == physical which will get the Guest far enough
|
||||
* into the boot to create its own.
|
||||
*
|
||||
* We lay them out of the way, just below the initrd (which is why we need to
|
||||
* know its size). */
|
||||
* know its size here). */
|
||||
static unsigned long setup_pagetables(unsigned long mem,
|
||||
unsigned long initrd_size)
|
||||
{
|
||||
@@ -850,7 +850,8 @@ static void handle_console_output(int fd, struct virtqueue *vq)
|
||||
*
|
||||
* Handling output for network is also simple: we get all the output buffers
|
||||
* and write them (ignoring the first element) to this device's file descriptor
|
||||
* (stdout). */
|
||||
* (/dev/net/tun).
|
||||
*/
|
||||
static void handle_net_output(int fd, struct virtqueue *vq)
|
||||
{
|
||||
unsigned int head, out, in;
|
||||
@@ -924,7 +925,7 @@ static void enable_fd(int fd, struct virtqueue *vq)
|
||||
write(waker_fd, &vq->dev->fd, sizeof(vq->dev->fd));
|
||||
}
|
||||
|
||||
/* Resetting a device is fairly easy. */
|
||||
/* When the Guest asks us to reset a device, it's is fairly easy. */
|
||||
static void reset_device(struct device *dev)
|
||||
{
|
||||
struct virtqueue *vq;
|
||||
@@ -1003,8 +1004,8 @@ static void handle_input(int fd)
|
||||
if (select(devices.max_infd+1, &fds, NULL, NULL, &poll) == 0)
|
||||
break;
|
||||
|
||||
/* Otherwise, call the device(s) which have readable
|
||||
* file descriptors and a method of handling them. */
|
||||
/* Otherwise, call the device(s) which have readable file
|
||||
* descriptors and a method of handling them. */
|
||||
for (i = devices.dev; i; i = i->next) {
|
||||
if (i->handle_input && FD_ISSET(i->fd, &fds)) {
|
||||
int dev_fd;
|
||||
@@ -1015,8 +1016,7 @@ static void handle_input(int fd)
|
||||
* should no longer service it. Networking and
|
||||
* console do this when there's no input
|
||||
* buffers to deliver into. Console also uses
|
||||
* it when it discovers that stdin is
|
||||
* closed. */
|
||||
* it when it discovers that stdin is closed. */
|
||||
FD_CLR(i->fd, &devices.infds);
|
||||
/* Tell waker to ignore it too, by sending a
|
||||
* negative fd number (-1, since 0 is a valid
|
||||
@@ -1033,7 +1033,8 @@ static void handle_input(int fd)
|
||||
*
|
||||
* All devices need a descriptor so the Guest knows it exists, and a "struct
|
||||
* device" so the Launcher can keep track of it. We have common helper
|
||||
* routines to allocate and manage them. */
|
||||
* routines to allocate and manage them.
|
||||
*/
|
||||
|
||||
/* The layout of the device page is a "struct lguest_device_desc" followed by a
|
||||
* number of virtqueue descriptors, then two sets of feature bits, then an
|
||||
@@ -1078,7 +1079,7 @@ static void add_virtqueue(struct device *dev, unsigned int num_descs,
|
||||
struct virtqueue **i, *vq = malloc(sizeof(*vq));
|
||||
void *p;
|
||||
|
||||
/* First we need some pages for this virtqueue. */
|
||||
/* First we need some memory for this virtqueue. */
|
||||
pages = (vring_size(num_descs, getpagesize()) + getpagesize() - 1)
|
||||
/ getpagesize();
|
||||
p = get_pages(pages);
|
||||
@@ -1122,7 +1123,7 @@ static void add_virtqueue(struct device *dev, unsigned int num_descs,
|
||||
}
|
||||
|
||||
/* The first half of the feature bitmask is for us to advertise features. The
|
||||
* second half if for the Guest to accept features. */
|
||||
* second half is for the Guest to accept features. */
|
||||
static void add_feature(struct device *dev, unsigned bit)
|
||||
{
|
||||
u8 *features = get_feature_bits(dev);
|
||||
@@ -1151,7 +1152,9 @@ static void set_config(struct device *dev, unsigned len, const void *conf)
|
||||
}
|
||||
|
||||
/* This routine does all the creation and setup of a new device, including
|
||||
* calling new_dev_desc() to allocate the descriptor and device memory. */
|
||||
* calling new_dev_desc() to allocate the descriptor and device memory.
|
||||
*
|
||||
* See what I mean about userspace being boring? */
|
||||
static struct device *new_device(const char *name, u16 type, int fd,
|
||||
bool (*handle_input)(int, struct device *))
|
||||
{
|
||||
@@ -1383,7 +1386,6 @@ struct vblk_info
|
||||
* Launcher triggers interrupt to Guest. */
|
||||
int done_fd;
|
||||
};
|
||||
/*:*/
|
||||
|
||||
/*L:210
|
||||
* The Disk
|
||||
@@ -1493,7 +1495,10 @@ static int io_thread(void *_dev)
|
||||
while (read(vblk->workpipe[0], &c, 1) == 1) {
|
||||
/* We acknowledge each request immediately to reduce latency,
|
||||
* rather than waiting until we've done them all. I haven't
|
||||
* measured to see if it makes any difference. */
|
||||
* measured to see if it makes any difference.
|
||||
*
|
||||
* That would be an interesting test, wouldn't it? You could
|
||||
* also try having more than one I/O thread. */
|
||||
while (service_io(dev))
|
||||
write(vblk->done_fd, &c, 1);
|
||||
}
|
||||
@@ -1501,7 +1506,7 @@ static int io_thread(void *_dev)
|
||||
}
|
||||
|
||||
/* Now we've seen the I/O thread, we return to the Launcher to see what happens
|
||||
* when the thread tells us it's completed some I/O. */
|
||||
* when that thread tells us it's completed some I/O. */
|
||||
static bool handle_io_finish(int fd, struct device *dev)
|
||||
{
|
||||
char c;
|
||||
@@ -1573,11 +1578,12 @@ static void setup_block_file(const char *filename)
|
||||
* more work. */
|
||||
pipe(vblk->workpipe);
|
||||
|
||||
/* Create stack for thread and run it */
|
||||
/* Create stack for thread and run it. Since stack grows upwards, we
|
||||
* point the stack pointer to the end of this region. */
|
||||
stack = malloc(32768);
|
||||
/* SIGCHLD - We dont "wait" for our cloned thread, so prevent it from
|
||||
* becoming a zombie. */
|
||||
if (clone(io_thread, stack + 32768, CLONE_VM | SIGCHLD, dev) == -1)
|
||||
if (clone(io_thread, stack + 32768, CLONE_VM | SIGCHLD, dev) == -1)
|
||||
err(1, "Creating clone");
|
||||
|
||||
/* We don't need to keep the I/O thread's end of the pipes open. */
|
||||
@@ -1587,14 +1593,14 @@ static void setup_block_file(const char *filename)
|
||||
verbose("device %u: virtblock %llu sectors\n",
|
||||
devices.device_num, le64_to_cpu(conf.capacity));
|
||||
}
|
||||
/* That's the end of device setup. :*/
|
||||
/* That's the end of device setup. */
|
||||
|
||||
/* Reboot */
|
||||
/*L:230 Reboot is pretty easy: clean up and exec() the Launcher afresh. */
|
||||
static void __attribute__((noreturn)) restart_guest(void)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
/* Closing pipes causes the waker thread and io_threads to die, and
|
||||
/* Closing pipes causes the Waker thread and io_threads to die, and
|
||||
* closing /dev/lguest cleans up the Guest. Since we don't track all
|
||||
* open fds, we simply close everything beyond stderr. */
|
||||
for (i = 3; i < FD_SETSIZE; i++)
|
||||
@@ -1603,7 +1609,7 @@ static void __attribute__((noreturn)) restart_guest(void)
|
||||
err(1, "Could not exec %s", main_args[0]);
|
||||
}
|
||||
|
||||
/*L:220 Finally we reach the core of the Launcher, which runs the Guest, serves
|
||||
/*L:220 Finally we reach the core of the Launcher which runs the Guest, serves
|
||||
* its input and output, and finally, lays it to rest. */
|
||||
static void __attribute__((noreturn)) run_guest(int lguest_fd)
|
||||
{
|
||||
@@ -1644,7 +1650,7 @@ static void __attribute__((noreturn)) run_guest(int lguest_fd)
|
||||
err(1, "Resetting break");
|
||||
}
|
||||
}
|
||||
/*
|
||||
/*L:240
|
||||
* This is the end of the Launcher. The good news: we are over halfway
|
||||
* through! The bad news: the most fiendish part of the code still lies ahead
|
||||
* of us.
|
||||
@@ -1691,8 +1697,8 @@ int main(int argc, char *argv[])
|
||||
* device receive input from a file descriptor, we keep an fdset
|
||||
* (infds) and the maximum fd number (max_infd) with the head of the
|
||||
* list. We also keep a pointer to the last device. Finally, we keep
|
||||
* the next interrupt number to hand out (1: remember that 0 is used by
|
||||
* the timer). */
|
||||
* the next interrupt number to use for devices (1: remember that 0 is
|
||||
* used by the timer). */
|
||||
FD_ZERO(&devices.infds);
|
||||
devices.max_infd = -1;
|
||||
devices.lastdev = NULL;
|
||||
@@ -1793,8 +1799,8 @@ int main(int argc, char *argv[])
|
||||
lguest_fd = tell_kernel(pgdir, start);
|
||||
|
||||
/* We fork off a child process, which wakes the Launcher whenever one
|
||||
* of the input file descriptors needs attention. Otherwise we would
|
||||
* run the Guest until it tries to output something. */
|
||||
* of the input file descriptors needs attention. We call this the
|
||||
* Waker, and we'll cover it in a moment. */
|
||||
waker_fd = setup_waker(lguest_fd);
|
||||
|
||||
/* Finally, run the Guest. This doesn't return. */
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
Rusty's Remarkably Unreliable Guide to Lguest
|
||||
- or, A Young Coder's Illustrated Hypervisor
|
||||
http://lguest.ozlabs.org
|
||||
__
|
||||
(___()'`; Rusty's Remarkably Unreliable Guide to Lguest
|
||||
/, /` - or, A Young Coder's Illustrated Hypervisor
|
||||
\\"--\\ http://lguest.ozlabs.org
|
||||
|
||||
Lguest is designed to be a minimal hypervisor for the Linux kernel, for
|
||||
Linux developers and users to experiment with virtualization with the
|
||||
@@ -41,12 +42,16 @@ Running Lguest:
|
||||
CONFIG_PHYSICAL_ALIGN=0x100000)
|
||||
|
||||
"Device Drivers":
|
||||
"Block devices"
|
||||
"Virtio block driver (EXPERIMENTAL)" = M/Y
|
||||
"Network device support"
|
||||
"Universal TUN/TAP device driver support" = M/Y
|
||||
(CONFIG_TUN=m)
|
||||
"Virtualization"
|
||||
"Linux hypervisor example code" = M/Y
|
||||
(CONFIG_LGUEST=m)
|
||||
"Virtio network driver (EXPERIMENTAL)" = M/Y
|
||||
(CONFIG_VIRTIO_BLK=m, CONFIG_VIRTIO_NET=m and CONFIG_TUN=m)
|
||||
|
||||
"Virtualization"
|
||||
"Linux hypervisor example code" = M/Y
|
||||
(CONFIG_LGUEST=m)
|
||||
|
||||
- A tool called "lguest" is available in this directory: type "make"
|
||||
to build it. If you didn't build your kernel in-tree, use "make
|
||||
|
||||
@@ -84,9 +84,6 @@ policy-routing.txt
|
||||
- IP policy-based routing
|
||||
ray_cs.txt
|
||||
- Raylink Wireless LAN card driver info.
|
||||
sk98lin.txt
|
||||
- Marvell Yukon Chipset / SysKonnect SK-98xx compliant Gigabit
|
||||
Ethernet Adapter family driver info
|
||||
skfp.txt
|
||||
- SysKonnect FDDI (SK-5xxx, Compaq Netelligent) driver info.
|
||||
smc9.txt
|
||||
|
||||
@@ -1,568 +0,0 @@
|
||||
(C)Copyright 1999-2004 Marvell(R).
|
||||
All rights reserved
|
||||
===========================================================================
|
||||
|
||||
sk98lin.txt created 13-Feb-2004
|
||||
|
||||
Readme File for sk98lin v6.23
|
||||
Marvell Yukon/SysKonnect SK-98xx Gigabit Ethernet Adapter family driver for LINUX
|
||||
|
||||
This file contains
|
||||
1 Overview
|
||||
2 Required Files
|
||||
3 Installation
|
||||
3.1 Driver Installation
|
||||
3.2 Inclusion of adapter at system start
|
||||
4 Driver Parameters
|
||||
4.1 Per-Port Parameters
|
||||
4.2 Adapter Parameters
|
||||
5 Large Frame Support
|
||||
6 VLAN and Link Aggregation Support (IEEE 802.1, 802.1q, 802.3ad)
|
||||
7 Troubleshooting
|
||||
|
||||
===========================================================================
|
||||
|
||||
|
||||
1 Overview
|
||||
===========
|
||||
|
||||
The sk98lin driver supports the Marvell Yukon and SysKonnect
|
||||
SK-98xx/SK-95xx compliant Gigabit Ethernet Adapter on Linux. It has
|
||||
been tested with Linux on Intel/x86 machines.
|
||||
***
|
||||
|
||||
|
||||
2 Required Files
|
||||
=================
|
||||
|
||||
The linux kernel source.
|
||||
No additional files required.
|
||||
***
|
||||
|
||||
|
||||
3 Installation
|
||||
===============
|
||||
|
||||
It is recommended to download the latest version of the driver from the
|
||||
SysKonnect web site www.syskonnect.com. If you have downloaded the latest
|
||||
driver, the Linux kernel has to be patched before the driver can be
|
||||
installed. For details on how to patch a Linux kernel, refer to the
|
||||
patch.txt file.
|
||||
|
||||
3.1 Driver Installation
|
||||
------------------------
|
||||
|
||||
The following steps describe the actions that are required to install
|
||||
the driver and to start it manually. These steps should be carried
|
||||
out for the initial driver setup. Once confirmed to be ok, they can
|
||||
be included in the system start.
|
||||
|
||||
NOTE 1: To perform the following tasks you need 'root' access.
|
||||
|
||||
NOTE 2: In case of problems, please read the section "Troubleshooting"
|
||||
below.
|
||||
|
||||
The driver can either be integrated into the kernel or it can be compiled
|
||||
as a module. Select the appropriate option during the kernel
|
||||
configuration.
|
||||
|
||||
Compile/use the driver as a module
|
||||
----------------------------------
|
||||
To compile the driver, go to the directory /usr/src/linux and
|
||||
execute the command "make menuconfig" or "make xconfig" and proceed as
|
||||
follows:
|
||||
|
||||
To integrate the driver permanently into the kernel, proceed as follows:
|
||||
|
||||
1. Select the menu "Network device support" and then "Ethernet(1000Mbit)"
|
||||
2. Mark "Marvell Yukon Chipset / SysKonnect SK-98xx family support"
|
||||
with (*)
|
||||
3. Build a new kernel when the configuration of the above options is
|
||||
finished.
|
||||
4. Install the new kernel.
|
||||
5. Reboot your system.
|
||||
|
||||
To use the driver as a module, proceed as follows:
|
||||
|
||||
1. Enable 'loadable module support' in the kernel.
|
||||
2. For automatic driver start, enable the 'Kernel module loader'.
|
||||
3. Select the menu "Network device support" and then "Ethernet(1000Mbit)"
|
||||
4. Mark "Marvell Yukon Chipset / SysKonnect SK-98xx family support"
|
||||
with (M)
|
||||
5. Execute the command "make modules".
|
||||
6. Execute the command "make modules_install".
|
||||
The appropriate modules will be installed.
|
||||
7. Reboot your system.
|
||||
|
||||
|
||||
Load the module manually
|
||||
------------------------
|
||||
To load the module manually, proceed as follows:
|
||||
|
||||
1. Enter "modprobe sk98lin".
|
||||
2. If a Marvell Yukon or SysKonnect SK-98xx adapter is installed in
|
||||
your computer and you have a /proc file system, execute the command:
|
||||
"ls /proc/net/sk98lin/"
|
||||
This should produce an output containing a line with the following
|
||||
format:
|
||||
eth0 eth1 ...
|
||||
which indicates that your adapter has been found and initialized.
|
||||
|
||||
NOTE 1: If you have more than one Marvell Yukon or SysKonnect SK-98xx
|
||||
adapter installed, the adapters will be listed as 'eth0',
|
||||
'eth1', 'eth2', etc.
|
||||
For each adapter, repeat steps 3 and 4 below.
|
||||
|
||||
NOTE 2: If you have other Ethernet adapters installed, your Marvell
|
||||
Yukon or SysKonnect SK-98xx adapter will be mapped to the
|
||||
next available number, e.g. 'eth1'. The mapping is executed
|
||||
automatically.
|
||||
The module installation message (displayed either in a system
|
||||
log file or on the console) prints a line for each adapter
|
||||
found containing the corresponding 'ethX'.
|
||||
|
||||
3. Select an IP address and assign it to the respective adapter by
|
||||
entering:
|
||||
ifconfig eth0 <ip-address>
|
||||
With this command, the adapter is connected to the Ethernet.
|
||||
|
||||
SK-98xx Gigabit Ethernet Server Adapters: The yellow LED on the adapter
|
||||
is now active, the link status LED of the primary port is active and
|
||||
the link status LED of the secondary port (on dual port adapters) is
|
||||
blinking (if the ports are connected to a switch or hub).
|
||||
SK-98xx V2.0 Gigabit Ethernet Adapters: The link status LED is active.
|
||||
In addition, you will receive a status message on the console stating
|
||||
"ethX: network connection up using port Y" and showing the selected
|
||||
connection parameters (x stands for the ethernet device number
|
||||
(0,1,2, etc), y stands for the port name (A or B)).
|
||||
|
||||
NOTE: If you are in doubt about IP addresses, ask your network
|
||||
administrator for assistance.
|
||||
|
||||
4. Your adapter should now be fully operational.
|
||||
Use 'ping <otherstation>' to verify the connection to other computers
|
||||
on your network.
|
||||
5. To check the adapter configuration view /proc/net/sk98lin/[devicename].
|
||||
For example by executing:
|
||||
"cat /proc/net/sk98lin/eth0"
|
||||
|
||||
Unload the module
|
||||
-----------------
|
||||
To stop and unload the driver modules, proceed as follows:
|
||||
|
||||
1. Execute the command "ifconfig eth0 down".
|
||||
2. Execute the command "rmmod sk98lin".
|
||||
|
||||
3.2 Inclusion of adapter at system start
|
||||
-----------------------------------------
|
||||
|
||||
Since a large number of different Linux distributions are
|
||||
available, we are unable to describe a general installation procedure
|
||||
for the driver module.
|
||||
Because the driver is now integrated in the kernel, installation should
|
||||
be easy, using the standard mechanism of your distribution.
|
||||
Refer to the distribution's manual for installation of ethernet adapters.
|
||||
|
||||
***
|
||||
|
||||
4 Driver Parameters
|
||||
====================
|
||||
|
||||
Parameters can be set at the command line after the module has been
|
||||
loaded with the command 'modprobe'.
|
||||
In some distributions, the configuration tools are able to pass parameters
|
||||
to the driver module.
|
||||
|
||||
If you use the kernel module loader, you can set driver parameters
|
||||
in the file /etc/modprobe.conf (or /etc/modules.conf in 2.4 or earlier).
|
||||
To set the driver parameters in this file, proceed as follows:
|
||||
|
||||
1. Insert a line of the form :
|
||||
options sk98lin ...
|
||||
For "...", the same syntax is required as described for the command
|
||||
line parameters of modprobe below.
|
||||
2. To activate the new parameters, either reboot your computer
|
||||
or
|
||||
unload and reload the driver.
|
||||
The syntax of the driver parameters is:
|
||||
|
||||
modprobe sk98lin parameter=value1[,value2[,value3...]]
|
||||
|
||||
where value1 refers to the first adapter, value2 to the second etc.
|
||||
|
||||
NOTE: All parameters are case sensitive. Write them exactly as shown
|
||||
below.
|
||||
|
||||
Example:
|
||||
Suppose you have two adapters. You want to set auto-negotiation
|
||||
on the first adapter to ON and on the second adapter to OFF.
|
||||
You also want to set DuplexCapabilities on the first adapter
|
||||
to FULL, and on the second adapter to HALF.
|
||||
Then, you must enter:
|
||||
|
||||
modprobe sk98lin AutoNeg_A=On,Off DupCap_A=Full,Half
|
||||
|
||||
NOTE: The number of adapters that can be configured this way is
|
||||
limited in the driver (file skge.c, constant SK_MAX_CARD_PARAM).
|
||||
The current limit is 16. If you happen to install
|
||||
more adapters, adjust this and recompile.
|
||||
|
||||
|
||||
4.1 Per-Port Parameters
|
||||
------------------------
|
||||
|
||||
These settings are available for each port on the adapter.
|
||||
In the following description, '?' stands for the port for
|
||||
which you set the parameter (A or B).
|
||||
|
||||
Speed
|
||||
-----
|
||||
Parameter: Speed_?
|
||||
Values: 10, 100, 1000, Auto
|
||||
Default: Auto
|
||||
|
||||
This parameter is used to set the speed capabilities. It is only valid
|
||||
for the SK-98xx V2.0 copper adapters.
|
||||
Usually, the speed is negotiated between the two ports during link
|
||||
establishment. If this fails, a port can be forced to a specific setting
|
||||
with this parameter.
|
||||
|
||||
Auto-Negotiation
|
||||
----------------
|
||||
Parameter: AutoNeg_?
|
||||
Values: On, Off, Sense
|
||||
Default: On
|
||||
|
||||
The "Sense"-mode automatically detects whether the link partner supports
|
||||
auto-negotiation or not.
|
||||
|
||||
Duplex Capabilities
|
||||
-------------------
|
||||
Parameter: DupCap_?
|
||||
Values: Half, Full, Both
|
||||
Default: Both
|
||||
|
||||
This parameters is only relevant if auto-negotiation for this port is
|
||||
not set to "Sense". If auto-negotiation is set to "On", all three values
|
||||
are possible. If it is set to "Off", only "Full" and "Half" are allowed.
|
||||
This parameter is useful if your link partner does not support all
|
||||
possible combinations.
|
||||
|
||||
Flow Control
|
||||
------------
|
||||
Parameter: FlowCtrl_?
|
||||
Values: Sym, SymOrRem, LocSend, None
|
||||
Default: SymOrRem
|
||||
|
||||
This parameter can be used to set the flow control capabilities the
|
||||
port reports during auto-negotiation. It can be set for each port
|
||||
individually.
|
||||
Possible modes:
|
||||
-- Sym = Symmetric: both link partners are allowed to send
|
||||
PAUSE frames
|
||||
-- SymOrRem = SymmetricOrRemote: both or only remote partner
|
||||
are allowed to send PAUSE frames
|
||||
-- LocSend = LocalSend: only local link partner is allowed
|
||||
to send PAUSE frames
|
||||
-- None = no link partner is allowed to send PAUSE frames
|
||||
|
||||
NOTE: This parameter is ignored if auto-negotiation is set to "Off".
|
||||
|
||||
Role in Master-Slave-Negotiation (1000Base-T only)
|
||||
--------------------------------------------------
|
||||
Parameter: Role_?
|
||||
Values: Auto, Master, Slave
|
||||
Default: Auto
|
||||
|
||||
This parameter is only valid for the SK-9821 and SK-9822 adapters.
|
||||
For two 1000Base-T ports to communicate, one must take the role of the
|
||||
master (providing timing information), while the other must be the
|
||||
slave. Usually, this is negotiated between the two ports during link
|
||||
establishment. If this fails, a port can be forced to a specific setting
|
||||
with this parameter.
|
||||
|
||||
|
||||
4.2 Adapter Parameters
|
||||
-----------------------
|
||||
|
||||
Connection Type (SK-98xx V2.0 copper adapters only)
|
||||
---------------
|
||||
Parameter: ConType
|
||||
Values: Auto, 100FD, 100HD, 10FD, 10HD
|
||||
Default: Auto
|
||||
|
||||
The parameter 'ConType' is a combination of all five per-port parameters
|
||||
within one single parameter. This simplifies the configuration of both ports
|
||||
of an adapter card! The different values of this variable reflect the most
|
||||
meaningful combinations of port parameters.
|
||||
|
||||
The following table shows the values of 'ConType' and the corresponding
|
||||
combinations of the per-port parameters:
|
||||
|
||||
ConType | DupCap AutoNeg FlowCtrl Role Speed
|
||||
----------+------------------------------------------------------
|
||||
Auto | Both On SymOrRem Auto Auto
|
||||
100FD | Full Off None Auto (ignored) 100
|
||||
100HD | Half Off None Auto (ignored) 100
|
||||
10FD | Full Off None Auto (ignored) 10
|
||||
10HD | Half Off None Auto (ignored) 10
|
||||
|
||||
Stating any other port parameter together with this 'ConType' variable
|
||||
will result in a merged configuration of those settings. This due to
|
||||
the fact, that the per-port parameters (e.g. Speed_? ) have a higher
|
||||
priority than the combined variable 'ConType'.
|
||||
|
||||
NOTE: This parameter is always used on both ports of the adapter card.
|
||||
|
||||
Interrupt Moderation
|
||||
--------------------
|
||||
Parameter: Moderation
|
||||
Values: None, Static, Dynamic
|
||||
Default: None
|
||||
|
||||
Interrupt moderation is employed to limit the maximum number of interrupts
|
||||
the driver has to serve. That is, one or more interrupts (which indicate any
|
||||
transmit or receive packet to be processed) are queued until the driver
|
||||
processes them. When queued interrupts are to be served, is determined by the
|
||||
'IntsPerSec' parameter, which is explained later below.
|
||||
|
||||
Possible modes:
|
||||
|
||||
-- None - No interrupt moderation is applied on the adapter card.
|
||||
Therefore, each transmit or receive interrupt is served immediately
|
||||
as soon as it appears on the interrupt line of the adapter card.
|
||||
|
||||
-- Static - Interrupt moderation is applied on the adapter card.
|
||||
All transmit and receive interrupts are queued until a complete
|
||||
moderation interval ends. If such a moderation interval ends, all
|
||||
queued interrupts are processed in one big bunch without any delay.
|
||||
The term 'static' reflects the fact, that interrupt moderation is
|
||||
always enabled, regardless how much network load is currently
|
||||
passing via a particular interface. In addition, the duration of
|
||||
the moderation interval has a fixed length that never changes while
|
||||
the driver is operational.
|
||||
|
||||
-- Dynamic - Interrupt moderation might be applied on the adapter card,
|
||||
depending on the load of the system. If the driver detects that the
|
||||
system load is too high, the driver tries to shield the system against
|
||||
too much network load by enabling interrupt moderation. If - at a later
|
||||
time - the CPU utilization decreases again (or if the network load is
|
||||
negligible) the interrupt moderation will automatically be disabled.
|
||||
|
||||
Interrupt moderation should be used when the driver has to handle one or more
|
||||
interfaces with a high network load, which - as a consequence - leads also to a
|
||||
high CPU utilization. When moderation is applied in such high network load
|
||||
situations, CPU load might be reduced by 20-30%.
|
||||
|
||||
NOTE: The drawback of using interrupt moderation is an increase of the round-
|
||||
trip-time (RTT), due to the queueing and serving of interrupts at dedicated
|
||||
moderation times.
|
||||
|
||||
Interrupts per second
|
||||
---------------------
|
||||
Parameter: IntsPerSec
|
||||
Values: 30...40000 (interrupts per second)
|
||||
Default: 2000
|
||||
|
||||
This parameter is only used if either static or dynamic interrupt moderation
|
||||
is used on a network adapter card. Using this parameter if no moderation is
|
||||
applied will lead to no action performed.
|
||||
|
||||
This parameter determines the length of any interrupt moderation interval.
|
||||
Assuming that static interrupt moderation is to be used, an 'IntsPerSec'
|
||||
parameter value of 2000 will lead to an interrupt moderation interval of
|
||||
500 microseconds.
|
||||
|
||||
NOTE: The duration of the moderation interval is to be chosen with care.
|
||||
At first glance, selecting a very long duration (e.g. only 100 interrupts per
|
||||
second) seems to be meaningful, but the increase of packet-processing delay
|
||||
is tremendous. On the other hand, selecting a very short moderation time might
|
||||
compensate the use of any moderation being applied.
|
||||
|
||||
|
||||
Preferred Port
|
||||
--------------
|
||||
Parameter: PrefPort
|
||||
Values: A, B
|
||||
Default: A
|
||||
|
||||
This is used to force the preferred port to A or B (on dual-port network
|
||||
adapters). The preferred port is the one that is used if both are detected
|
||||
as fully functional.
|
||||
|
||||
RLMT Mode (Redundant Link Management Technology)
|
||||
------------------------------------------------
|
||||
Parameter: RlmtMode
|
||||
Values: CheckLinkState,CheckLocalPort, CheckSeg, DualNet
|
||||
Default: CheckLinkState
|
||||
|
||||
RLMT monitors the status of the port. If the link of the active port
|
||||
fails, RLMT switches immediately to the standby link. The virtual link is
|
||||
maintained as long as at least one 'physical' link is up.
|
||||
|
||||
Possible modes:
|
||||
|
||||
-- CheckLinkState - Check link state only: RLMT uses the link state
|
||||
reported by the adapter hardware for each individual port to
|
||||
determine whether a port can be used for all network traffic or
|
||||
not.
|
||||
|
||||
-- CheckLocalPort - In this mode, RLMT monitors the network path
|
||||
between the two ports of an adapter by regularly exchanging packets
|
||||
between them. This mode requires a network configuration in which
|
||||
the two ports are able to "see" each other (i.e. there must not be
|
||||
any router between the ports).
|
||||
|
||||
-- CheckSeg - Check local port and segmentation: This mode supports the
|
||||
same functions as the CheckLocalPort mode and additionally checks
|
||||
network segmentation between the ports. Therefore, this mode is only
|
||||
to be used if Gigabit Ethernet switches are installed on the network
|
||||
that have been configured to use the Spanning Tree protocol.
|
||||
|
||||
-- DualNet - In this mode, ports A and B are used as separate devices.
|
||||
If you have a dual port adapter, port A will be configured as eth0
|
||||
and port B as eth1. Both ports can be used independently with
|
||||
distinct IP addresses. The preferred port setting is not used.
|
||||
RLMT is turned off.
|
||||
|
||||
NOTE: RLMT modes CLP and CLPSS are designed to operate in configurations
|
||||
where a network path between the ports on one adapter exists.
|
||||
Moreover, they are not designed to work where adapters are connected
|
||||
back-to-back.
|
||||
***
|
||||
|
||||
|
||||
5 Large Frame Support
|
||||
======================
|
||||
|
||||
The driver supports large frames (also called jumbo frames). Using large
|
||||
frames can result in an improved throughput if transferring large amounts
|
||||
of data.
|
||||
To enable large frames, set the MTU (maximum transfer unit) of the
|
||||
interface to the desired value (up to 9000), execute the following
|
||||
command:
|
||||
ifconfig eth0 mtu 9000
|
||||
This will only work if you have two adapters connected back-to-back
|
||||
or if you use a switch that supports large frames. When using a switch,
|
||||
it should be configured to allow large frames and auto-negotiation should
|
||||
be set to OFF. The setting must be configured on all adapters that can be
|
||||
reached by the large frames. If one adapter is not set to receive large
|
||||
frames, it will simply drop them.
|
||||
|
||||
You can switch back to the standard ethernet frame size by executing the
|
||||
following command:
|
||||
ifconfig eth0 mtu 1500
|
||||
|
||||
To permanently configure this setting, add a script with the 'ifconfig'
|
||||
line to the system startup sequence (named something like "S99sk98lin"
|
||||
in /etc/rc.d/rc2.d).
|
||||
***
|
||||
|
||||
|
||||
6 VLAN and Link Aggregation Support (IEEE 802.1, 802.1q, 802.3ad)
|
||||
==================================================================
|
||||
|
||||
The Marvell Yukon/SysKonnect Linux drivers are able to support VLAN and
|
||||
Link Aggregation according to IEEE standards 802.1, 802.1q, and 802.3ad.
|
||||
These features are only available after installation of open source
|
||||
modules available on the Internet:
|
||||
For VLAN go to: http://www.candelatech.com/~greear/vlan.html
|
||||
For Link Aggregation go to: http://www.st.rim.or.jp/~yumo
|
||||
|
||||
NOTE: SysKonnect GmbH does not offer any support for these open source
|
||||
modules and does not take the responsibility for any kind of
|
||||
failures or problems arising in connection with these modules.
|
||||
|
||||
NOTE: Configuring Link Aggregation on a SysKonnect dual link adapter may
|
||||
cause problems when unloading the driver.
|
||||
|
||||
|
||||
7 Troubleshooting
|
||||
==================
|
||||
|
||||
If any problems occur during the installation process, check the
|
||||
following list:
|
||||
|
||||
|
||||
Problem: The SK-98xx adapter cannot be found by the driver.
|
||||
Solution: In /proc/pci search for the following entry:
|
||||
'Ethernet controller: SysKonnect SK-98xx ...'
|
||||
If this entry exists, the SK-98xx or SK-98xx V2.0 adapter has
|
||||
been found by the system and should be operational.
|
||||
If this entry does not exist or if the file '/proc/pci' is not
|
||||
found, there may be a hardware problem or the PCI support may
|
||||
not be enabled in your kernel.
|
||||
The adapter can be checked using the diagnostics program which
|
||||
is available on the SysKonnect web site:
|
||||
www.syskonnect.com
|
||||
|
||||
Some COMPAQ machines have problems dealing with PCI under Linux.
|
||||
This problem is described in the 'PCI howto' document
|
||||
(included in some distributions or available from the
|
||||
web, e.g. at 'www.linux.org').
|
||||
|
||||
|
||||
Problem: Programs such as 'ifconfig' or 'route' cannot be found or the
|
||||
error message 'Operation not permitted' is displayed.
|
||||
Reason: You are not logged in as user 'root'.
|
||||
Solution: Logout and login as 'root' or change to 'root' via 'su'.
|
||||
|
||||
|
||||
Problem: Upon use of the command 'ping <address>' the message
|
||||
"ping: sendto: Network is unreachable" is displayed.
|
||||
Reason: Your route is not set correctly.
|
||||
Solution: If you are using RedHat, you probably forgot to set up the
|
||||
route in the 'network configuration'.
|
||||
Check the existing routes with the 'route' command and check
|
||||
if an entry for 'eth0' exists, and if so, if it is set correctly.
|
||||
|
||||
|
||||
Problem: The driver can be started, the adapter is connected to the
|
||||
network, but you cannot receive or transmit any packets;
|
||||
e.g. 'ping' does not work.
|
||||
Reason: There is an incorrect route in your routing table.
|
||||
Solution: Check the routing table with the command 'route' and read the
|
||||
manual help pages dealing with routes (enter 'man route').
|
||||
|
||||
NOTE: Although the 2.2.x kernel versions generate the routing entry
|
||||
automatically, problems of this kind may occur here as well. We've
|
||||
come across a situation in which the driver started correctly at
|
||||
system start, but after the driver has been removed and reloaded,
|
||||
the route of the adapter's network pointed to the 'dummy0'device
|
||||
and had to be corrected manually.
|
||||
|
||||
|
||||
Problem: Your computer should act as a router between multiple
|
||||
IP subnetworks (using multiple adapters), but computers in
|
||||
other subnetworks cannot be reached.
|
||||
Reason: Either the router's kernel is not configured for IP forwarding
|
||||
or the routing table and gateway configuration of at least one
|
||||
computer is not working.
|
||||
|
||||
Problem: Upon driver start, the following error message is displayed:
|
||||
"eth0: -- ERROR --
|
||||
Class: internal Software error
|
||||
Nr: 0xcc
|
||||
Msg: SkGeInitPort() cannot init running ports"
|
||||
Reason: You are using a driver compiled for single processor machines
|
||||
on a multiprocessor machine with SMP (Symmetric MultiProcessor)
|
||||
kernel.
|
||||
Solution: Configure your kernel appropriately and recompile the kernel or
|
||||
the modules.
|
||||
|
||||
|
||||
|
||||
If your problem is not listed here, please contact SysKonnect's technical
|
||||
support for help (linux@syskonnect.de).
|
||||
When contacting our technical support, please ensure that the following
|
||||
information is available:
|
||||
- System Manufacturer and HW Informations (CPU, Memory... )
|
||||
- PCI-Boards in your system
|
||||
- Distribution
|
||||
- Kernel version
|
||||
- Driver version
|
||||
***
|
||||
|
||||
|
||||
|
||||
***End of Readme File***
|
||||
@@ -23,8 +23,7 @@ kernel debugging options, such as Kernel Stack Meter or Kernel Tracer,
|
||||
may implicitly disable the NMI watchdog.]
|
||||
|
||||
For x86-64, the needed APIC is always compiled in, and the NMI watchdog is
|
||||
always enabled with I/O-APIC mode (nmi_watchdog=1). Currently, local APIC
|
||||
mode (nmi_watchdog=2) does not work on x86-64.
|
||||
always enabled with I/O-APIC mode (nmi_watchdog=1).
|
||||
|
||||
Using local APIC (nmi_watchdog=2) needs the first performance register, so
|
||||
you can't use it for other purposes (such as high precision performance
|
||||
|
||||
@@ -12,5 +12,7 @@ sched-domains.txt
|
||||
- information on scheduling domains.
|
||||
sched-nice-design.txt
|
||||
- How and why the scheduler's nice levels are implemented.
|
||||
sched-rt-group.txt
|
||||
- real-time group scheduling.
|
||||
sched-stats.txt
|
||||
- information on schedstats (Linux Scheduler Statistics).
|
||||
|
||||
@@ -116,6 +116,13 @@ low order bit. So when a chip's timing diagram shows the clock
|
||||
starting low (CPOL=0) and data stabilized for sampling during the
|
||||
trailing clock edge (CPHA=1), that's SPI mode 1.
|
||||
|
||||
Note that the clock mode is relevant as soon as the chipselect goes
|
||||
active. So the master must set the clock to inactive before selecting
|
||||
a slave, and the slave can tell the chosen polarity by sampling the
|
||||
clock level when its select line goes active. That's why many devices
|
||||
support for example both modes 0 and 3: they don't care about polarity,
|
||||
and alway clock data in/out on rising clock edges.
|
||||
|
||||
|
||||
How do these driver programming interfaces work?
|
||||
------------------------------------------------
|
||||
@@ -379,8 +386,14 @@ any more such messages.
|
||||
+ when bidirectional reads and writes start ... by how its
|
||||
sequence of spi_transfer requests is arranged;
|
||||
|
||||
+ which I/O buffers are used ... each spi_transfer wraps a
|
||||
buffer for each transfer direction, supporting full duplex
|
||||
(two pointers, maybe the same one in both cases) and half
|
||||
duplex (one pointer is NULL) transfers;
|
||||
|
||||
+ optionally defining short delays after transfers ... using
|
||||
the spi_transfer.delay_usecs setting;
|
||||
the spi_transfer.delay_usecs setting (this delay can be the
|
||||
only protocol effect, if the buffer length is zero);
|
||||
|
||||
+ whether the chipselect becomes inactive after a transfer and
|
||||
any delay ... by using the spi_transfer.cs_change flag;
|
||||
|
||||
@@ -5,6 +5,28 @@ Please use DEFINE_SPINLOCK()/DEFINE_RWLOCK() or
|
||||
__SPIN_LOCK_UNLOCKED()/__RW_LOCK_UNLOCKED() as appropriate for static
|
||||
initialization.
|
||||
|
||||
Most of the time, you can simply turn:
|
||||
|
||||
static spinlock_t xxx_lock = SPIN_LOCK_UNLOCKED;
|
||||
|
||||
into:
|
||||
|
||||
static DEFINE_SPINLOCK(xxx_lock);
|
||||
|
||||
Static structure member variables go from:
|
||||
|
||||
struct foo bar {
|
||||
.lock = SPIN_LOCK_UNLOCKED;
|
||||
};
|
||||
|
||||
to:
|
||||
|
||||
struct foo bar {
|
||||
.lock = __SPIN_LOCK_UNLOCKED(bar.lock);
|
||||
};
|
||||
|
||||
Declaration of static rw_locks undergo a similar transformation.
|
||||
|
||||
Dynamic initialization, when necessary, may be performed as
|
||||
demonstrated below.
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ here; a summary of the common scenarios is presented below:
|
||||
unaligned access to be corrected.
|
||||
- Some architectures are not capable of unaligned memory access, but will
|
||||
silently perform a different memory access to the one that was requested,
|
||||
resulting a a subtle code bug that is hard to detect!
|
||||
resulting in a subtle code bug that is hard to detect!
|
||||
|
||||
It should be obvious from the above that if your code causes unaligned
|
||||
memory accesses to happen, your code will not work correctly on certain
|
||||
@@ -209,7 +209,7 @@ memory and you wish to avoid unaligned access, its usage is as follows:
|
||||
|
||||
u32 value = get_unaligned((u32 *) data);
|
||||
|
||||
These macros work work for memory accesses of any length (not just 32 bits as
|
||||
These macros work for memory accesses of any length (not just 32 bits as
|
||||
in the examples above). Be aware that when compared to standard access of
|
||||
aligned memory, using these macros to access unaligned memory can be costly in
|
||||
terms of performance.
|
||||
|
||||
+9
-3
@@ -163,6 +163,12 @@ M: A2232@gmx.net
|
||||
L: linux-m68k@lists.linux-m68k.org
|
||||
S: Maintained
|
||||
|
||||
AFS FILESYSTEM & AF_RXRPC SOCKET DOMAIN
|
||||
P: David Howells
|
||||
M: dhowells@redhat.com
|
||||
L: linux-afs@lists.infradead.org
|
||||
S: Supported
|
||||
|
||||
AIO
|
||||
P: Benjamin LaHaise
|
||||
M: bcrl@kvack.org
|
||||
@@ -2116,7 +2122,7 @@ M: reinette.chatre@intel.com
|
||||
L: linux-wireless@vger.kernel.org
|
||||
L: ipw3945-devel@lists.sourceforge.net
|
||||
W: http://intellinuxwireless.org
|
||||
T: git git://intellinuxwireless.org/repos/iwlwifi
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/rchatre/iwlwifi-2.6.git
|
||||
S: Supported
|
||||
|
||||
IOC3 ETHERNET DRIVER
|
||||
@@ -2320,14 +2326,14 @@ L: kexec@lists.infradead.org
|
||||
S: Maintained
|
||||
|
||||
KPROBES
|
||||
P: Prasanna S Panchamukhi
|
||||
M: prasanna@in.ibm.com
|
||||
P: Ananth N Mavinakayanahalli
|
||||
M: ananth@in.ibm.com
|
||||
P: Anil S Keshavamurthy
|
||||
M: anil.s.keshavamurthy@intel.com
|
||||
P: David S. Miller
|
||||
M: davem@davemloft.net
|
||||
P: Masami Hiramatsu
|
||||
M: mhiramat@redhat.com
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 25
|
||||
EXTRAVERSION = -rc7
|
||||
EXTRAVERSION = -rc9
|
||||
NAME = Funky Weasel is Jiggy wit it
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
||||
@@ -424,11 +424,13 @@ EXPORT_SYMBOL(pci_unmap_page);
|
||||
else DMA_ADDRP is undefined. */
|
||||
|
||||
void *
|
||||
pci_alloc_consistent(struct pci_dev *pdev, size_t size, dma_addr_t *dma_addrp)
|
||||
__pci_alloc_consistent(struct pci_dev *pdev, size_t size,
|
||||
dma_addr_t *dma_addrp, gfp_t gfp)
|
||||
{
|
||||
void *cpu_addr;
|
||||
long order = get_order(size);
|
||||
gfp_t gfp = GFP_ATOMIC;
|
||||
|
||||
gfp &= ~GFP_DMA;
|
||||
|
||||
try_again:
|
||||
cpu_addr = (void *)__get_free_pages(gfp, order);
|
||||
@@ -458,7 +460,7 @@ try_again:
|
||||
|
||||
return cpu_addr;
|
||||
}
|
||||
EXPORT_SYMBOL(pci_alloc_consistent);
|
||||
EXPORT_SYMBOL(__pci_alloc_consistent);
|
||||
|
||||
/* Free and unmap a consistent DMA buffer. CPU_ADDR and DMA_ADDR must
|
||||
be values that were returned from pci_alloc_consistent. SIZE must
|
||||
|
||||
@@ -476,6 +476,7 @@ config ARCH_DAVINCI
|
||||
config ARCH_OMAP
|
||||
bool "TI OMAP"
|
||||
select GENERIC_GPIO
|
||||
select HAVE_GPIO_LIB
|
||||
select GENERIC_TIME
|
||||
select GENERIC_CLOCKEVENTS
|
||||
help
|
||||
|
||||
@@ -120,6 +120,7 @@ void it8152_irq_demux(unsigned int irq, struct irq_desc *desc)
|
||||
time, when they all three were 0. */
|
||||
bits_pd = __raw_readl(IT8152_INTC_PDCNIRR);
|
||||
bits_lp = __raw_readl(IT8152_INTC_LPCNIRR);
|
||||
bits_ld = __raw_readl(IT8152_INTC_LDCNIRR);
|
||||
if (!(bits_ld | bits_lp | bits_pd))
|
||||
return;
|
||||
}
|
||||
@@ -133,14 +134,14 @@ void it8152_irq_demux(unsigned int irq, struct irq_desc *desc)
|
||||
|
||||
bits_lp &= ((1 << IT8152_LP_IRQ_COUNT) - 1);
|
||||
while (bits_lp) {
|
||||
i = __ffs(bits_pd);
|
||||
i = __ffs(bits_lp);
|
||||
it8152_irq(IT8152_LP_IRQ(i));
|
||||
bits_lp &= ~(1 << i);
|
||||
}
|
||||
|
||||
bits_ld &= ((1 << IT8152_LD_IRQ_COUNT) - 1);
|
||||
while (bits_ld) {
|
||||
i = __ffs(bits_pd);
|
||||
i = __ffs(bits_ld);
|
||||
it8152_irq(IT8152_LD_IRQ(i));
|
||||
bits_ld &= ~(1 << i);
|
||||
}
|
||||
|
||||
@@ -336,7 +336,7 @@
|
||||
CALL(sys_mknodat)
|
||||
/* 325 */ CALL(sys_fchownat)
|
||||
CALL(sys_futimesat)
|
||||
CALL(sys_fstatat64)
|
||||
CALL(ABI(sys_fstatat64, sys_oabi_fstatat64))
|
||||
CALL(sys_unlinkat)
|
||||
CALL(sys_renameat)
|
||||
/* 330 */ CALL(sys_linkat)
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
* sys_stat64:
|
||||
* sys_lstat64:
|
||||
* sys_fstat64:
|
||||
* sys_fstatat64:
|
||||
*
|
||||
* struct stat64 has different sizes and some members are shifted
|
||||
* Compatibility wrappers are needed for them and provided below.
|
||||
@@ -169,6 +170,29 @@ asmlinkage long sys_oabi_fstat64(unsigned long fd,
|
||||
return error;
|
||||
}
|
||||
|
||||
asmlinkage long sys_oabi_fstatat64(int dfd,
|
||||
char __user *filename,
|
||||
struct oldabi_stat64 __user *statbuf,
|
||||
int flag)
|
||||
{
|
||||
struct kstat stat;
|
||||
int error = -EINVAL;
|
||||
|
||||
if ((flag & ~AT_SYMLINK_NOFOLLOW) != 0)
|
||||
goto out;
|
||||
|
||||
if (flag & AT_SYMLINK_NOFOLLOW)
|
||||
error = vfs_lstat_fd(dfd, filename, &stat);
|
||||
else
|
||||
error = vfs_stat_fd(dfd, filename, &stat);
|
||||
|
||||
if (!error)
|
||||
error = cp_oldabi_stat64(&stat, statbuf);
|
||||
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
|
||||
struct oabi_flock64 {
|
||||
short l_type;
|
||||
short l_whence;
|
||||
|
||||
@@ -5,7 +5,8 @@
|
||||
# Common support
|
||||
obj-y := io.o id.o clock.o irq.o mux.o serial.o devices.o
|
||||
|
||||
obj-$(CONFIG_OMAP_MPU_TIMER) += time.o
|
||||
obj-$(CONFIG_OMAP_MPU_TIMER) += time.o
|
||||
obj-$(CONFIG_OMAP_32K_TIMER) += timer32k.o
|
||||
|
||||
# Power Management
|
||||
obj-$(CONFIG_PM) += pm.o sleep.o
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/leds.h>
|
||||
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
@@ -183,11 +184,80 @@ static struct platform_device *osk5912_devices[] __initdata = {
|
||||
&osk5912_mcbsp1_device,
|
||||
};
|
||||
|
||||
static struct gpio_led tps_leds[] = {
|
||||
/* NOTE: D9 and D2 have hardware blink support.
|
||||
* Also, D9 requires non-battery power.
|
||||
*/
|
||||
{ .gpio = OSK_TPS_GPIO_LED_D9, .name = "d9", },
|
||||
{ .gpio = OSK_TPS_GPIO_LED_D2, .name = "d2", },
|
||||
{ .gpio = OSK_TPS_GPIO_LED_D3, .name = "d3", .active_low = 1,
|
||||
.default_trigger = "heartbeat", },
|
||||
};
|
||||
|
||||
static struct gpio_led_platform_data tps_leds_data = {
|
||||
.num_leds = 3,
|
||||
.leds = tps_leds,
|
||||
};
|
||||
|
||||
static struct platform_device osk5912_tps_leds = {
|
||||
.name = "leds-gpio",
|
||||
.id = 0,
|
||||
.dev.platform_data = &tps_leds_data,
|
||||
};
|
||||
|
||||
static int osk_tps_setup(struct i2c_client *client, void *context)
|
||||
{
|
||||
/* Set GPIO 1 HIGH to disable VBUS power supply;
|
||||
* OHCI driver powers it up/down as needed.
|
||||
*/
|
||||
gpio_request(OSK_TPS_GPIO_USB_PWR_EN, "n_vbus_en");
|
||||
gpio_direction_output(OSK_TPS_GPIO_USB_PWR_EN, 1);
|
||||
|
||||
/* Set GPIO 2 high so LED D3 is off by default */
|
||||
tps65010_set_gpio_out_value(GPIO2, HIGH);
|
||||
|
||||
/* Set GPIO 3 low to take ethernet out of reset */
|
||||
gpio_request(OSK_TPS_GPIO_LAN_RESET, "smc_reset");
|
||||
gpio_direction_output(OSK_TPS_GPIO_LAN_RESET, 0);
|
||||
|
||||
/* GPIO4 is VDD_DSP */
|
||||
gpio_request(OSK_TPS_GPIO_DSP_PWR_EN, "dsp_power");
|
||||
gpio_direction_output(OSK_TPS_GPIO_DSP_PWR_EN, 1);
|
||||
/* REVISIT if DSP support isn't configured, power it off ... */
|
||||
|
||||
/* Let LED1 (D9) blink; leds-gpio may override it */
|
||||
tps65010_set_led(LED1, BLINK);
|
||||
|
||||
/* Set LED2 off by default */
|
||||
tps65010_set_led(LED2, OFF);
|
||||
|
||||
/* Enable LOW_PWR handshake */
|
||||
tps65010_set_low_pwr(ON);
|
||||
|
||||
/* Switch VLDO2 to 3.0V for AIC23 */
|
||||
tps65010_config_vregs1(TPS_LDO2_ENABLE | TPS_VLDO2_3_0V
|
||||
| TPS_LDO1_ENABLE);
|
||||
|
||||
/* register these three LEDs */
|
||||
osk5912_tps_leds.dev.parent = &client->dev;
|
||||
platform_device_register(&osk5912_tps_leds);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct tps65010_board tps_board = {
|
||||
.base = OSK_TPS_GPIO_BASE,
|
||||
.outmask = 0x0f,
|
||||
.setup = osk_tps_setup,
|
||||
};
|
||||
|
||||
static struct i2c_board_info __initdata osk_i2c_board_info[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("tps65010", 0x48),
|
||||
.type = "tps65010",
|
||||
.irq = OMAP_GPIO_IRQ(OMAP_MPUIO(1)),
|
||||
.platform_data = &tps_board,
|
||||
|
||||
},
|
||||
/* TODO when driver support is ready:
|
||||
* - aic23 audio chip at 0x1a
|
||||
@@ -198,7 +268,7 @@ static struct i2c_board_info __initdata osk_i2c_board_info[] = {
|
||||
|
||||
static void __init osk_init_smc91x(void)
|
||||
{
|
||||
if ((omap_request_gpio(0)) < 0) {
|
||||
if ((gpio_request(0, "smc_irq")) < 0) {
|
||||
printk("Error requesting gpio 0 for smc91x irq\n");
|
||||
return;
|
||||
}
|
||||
@@ -210,7 +280,7 @@ static void __init osk_init_smc91x(void)
|
||||
static void __init osk_init_cf(void)
|
||||
{
|
||||
omap_cfg_reg(M7_1610_GPIO62);
|
||||
if ((omap_request_gpio(62)) < 0) {
|
||||
if ((gpio_request(62, "cf_irq")) < 0) {
|
||||
printk("Error requesting gpio 62 for CF irq\n");
|
||||
return;
|
||||
}
|
||||
@@ -334,7 +404,7 @@ static struct platform_device *mistral_devices[] __initdata = {
|
||||
|
||||
static int mistral_get_pendown_state(void)
|
||||
{
|
||||
return !omap_get_gpio_datain(4);
|
||||
return !gpio_get_value(4);
|
||||
}
|
||||
|
||||
static const struct ads7846_platform_data mistral_ts_info = {
|
||||
@@ -396,25 +466,31 @@ static void __init osk_mistral_init(void)
|
||||
omap_cfg_reg(W14_1610_CCP_DATAP);
|
||||
|
||||
/* CAM_PWDN */
|
||||
if (omap_request_gpio(11) == 0) {
|
||||
if (gpio_request(11, "cam_pwdn") == 0) {
|
||||
omap_cfg_reg(N20_1610_GPIO11);
|
||||
omap_set_gpio_direction(11, 0 /* out */);
|
||||
omap_set_gpio_dataout(11, 0 /* off */);
|
||||
gpio_direction_output(11, 0);
|
||||
} else
|
||||
pr_debug("OSK+Mistral: CAM_PWDN is awol\n");
|
||||
|
||||
|
||||
/* omap_cfg_reg(P19_1610_GPIO6); */ /* BUSY */
|
||||
gpio_request(6, "ts_busy");
|
||||
gpio_direction_input(6);
|
||||
|
||||
omap_cfg_reg(P20_1610_GPIO4); /* PENIRQ */
|
||||
gpio_request(4, "ts_int");
|
||||
gpio_direction_input(4);
|
||||
set_irq_type(OMAP_GPIO_IRQ(4), IRQT_FALLING);
|
||||
|
||||
spi_register_board_info(mistral_boardinfo,
|
||||
ARRAY_SIZE(mistral_boardinfo));
|
||||
|
||||
/* the sideways button (SW1) is for use as a "wakeup" button */
|
||||
omap_cfg_reg(N15_1610_MPUIO2);
|
||||
if (omap_request_gpio(OMAP_MPUIO(2)) == 0) {
|
||||
if (gpio_request(OMAP_MPUIO(2), "wakeup") == 0) {
|
||||
int ret = 0;
|
||||
omap_set_gpio_direction(OMAP_MPUIO(2), 1);
|
||||
|
||||
gpio_direction_input(OMAP_MPUIO(2));
|
||||
set_irq_type(OMAP_GPIO_IRQ(OMAP_MPUIO(2)), IRQT_RISING);
|
||||
#ifdef CONFIG_PM
|
||||
/* share the IRQ in case someone wants to use the
|
||||
@@ -425,7 +501,7 @@ static void __init osk_mistral_init(void)
|
||||
IRQF_SHARED, "mistral_wakeup",
|
||||
&osk_mistral_wake_interrupt);
|
||||
if (ret != 0) {
|
||||
omap_free_gpio(OMAP_MPUIO(2));
|
||||
gpio_free(OMAP_MPUIO(2));
|
||||
printk(KERN_ERR "OSK+Mistral: no wakeup irq, %d?\n",
|
||||
ret);
|
||||
} else
|
||||
@@ -438,10 +514,8 @@ static void __init osk_mistral_init(void)
|
||||
* board, like the touchscreen, EEPROM, and wakeup (!) switch.
|
||||
*/
|
||||
omap_cfg_reg(PWL);
|
||||
if (omap_request_gpio(2) == 0) {
|
||||
omap_set_gpio_direction(2, 0 /* out */);
|
||||
omap_set_gpio_dataout(2, 1 /* on */);
|
||||
}
|
||||
if (gpio_request(2, "lcd_pwr") == 0)
|
||||
gpio_direction_output(2, 1);
|
||||
|
||||
platform_add_devices(mistral_devices, ARRAY_SIZE(mistral_devices));
|
||||
}
|
||||
@@ -484,44 +558,6 @@ static void __init osk_map_io(void)
|
||||
omap1_map_common_io();
|
||||
}
|
||||
|
||||
#ifdef CONFIG_TPS65010
|
||||
static int __init osk_tps_init(void)
|
||||
{
|
||||
if (!machine_is_omap_osk())
|
||||
return 0;
|
||||
|
||||
/* Let LED1 (D9) blink */
|
||||
tps65010_set_led(LED1, BLINK);
|
||||
|
||||
/* Disable LED 2 (D2) */
|
||||
tps65010_set_led(LED2, OFF);
|
||||
|
||||
/* Set GPIO 1 HIGH to disable VBUS power supply;
|
||||
* OHCI driver powers it up/down as needed.
|
||||
*/
|
||||
tps65010_set_gpio_out_value(GPIO1, HIGH);
|
||||
|
||||
/* Set GPIO 2 low to turn on LED D3 */
|
||||
tps65010_set_gpio_out_value(GPIO2, HIGH);
|
||||
|
||||
/* Set GPIO 3 low to take ethernet out of reset */
|
||||
tps65010_set_gpio_out_value(GPIO3, LOW);
|
||||
|
||||
/* gpio4 for VDD_DSP */
|
||||
/* FIXME send power to DSP iff it's configured */
|
||||
|
||||
/* Enable LOW_PWR */
|
||||
tps65010_set_low_pwr(ON);
|
||||
|
||||
/* Switch VLDO2 to 3.0V for AIC23 */
|
||||
tps65010_config_vregs1(TPS_LDO2_ENABLE | TPS_VLDO2_3_0V
|
||||
| TPS_LDO1_ENABLE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
fs_initcall(osk_tps_init);
|
||||
#endif
|
||||
|
||||
MACHINE_START(OMAP_OSK, "TI-OSK")
|
||||
/* Maintainer: Dirk Behme <dirk.behme@de.bosch.com> */
|
||||
.phys_io = 0xfff00000,
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-omap1/leds-osk.c
|
||||
*
|
||||
* LED driver for OSK, and optionally Mistral QVGA, boards
|
||||
* LED driver for OSK with optional Mistral QVGA board
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/i2c/tps65010.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/leds.h>
|
||||
@@ -20,49 +18,11 @@
|
||||
#define LED_STATE_CLAIMED (1 << 1)
|
||||
static u8 led_state;
|
||||
|
||||
#define GREEN_LED (1 << 0) /* TPS65010 LED1 */
|
||||
#define AMBER_LED (1 << 1) /* TPS65010 LED2 */
|
||||
#define RED_LED (1 << 2) /* TPS65010 GPIO2 */
|
||||
#define TIMER_LED (1 << 3) /* Mistral board */
|
||||
#define IDLE_LED (1 << 4) /* Mistral board */
|
||||
static u8 hw_led_state;
|
||||
|
||||
|
||||
/* TPS65010 leds are changed using i2c -- from a task context.
|
||||
* Using one of these for the "idle" LED would be impractical...
|
||||
*/
|
||||
#define TPS_LEDS (GREEN_LED | RED_LED | AMBER_LED)
|
||||
|
||||
static u8 tps_leds_change;
|
||||
|
||||
static void tps_work(struct work_struct *unused)
|
||||
{
|
||||
for (;;) {
|
||||
u8 leds;
|
||||
|
||||
local_irq_disable();
|
||||
leds = tps_leds_change;
|
||||
tps_leds_change = 0;
|
||||
local_irq_enable();
|
||||
|
||||
if (!leds)
|
||||
break;
|
||||
|
||||
/* careful: the set_led() value is on/off/blink */
|
||||
if (leds & GREEN_LED)
|
||||
tps65010_set_led(LED1, !!(hw_led_state & GREEN_LED));
|
||||
if (leds & AMBER_LED)
|
||||
tps65010_set_led(LED2, !!(hw_led_state & AMBER_LED));
|
||||
|
||||
/* the gpio led doesn't have that issue */
|
||||
if (leds & RED_LED)
|
||||
tps65010_set_gpio_out_value(GPIO2,
|
||||
!(hw_led_state & RED_LED));
|
||||
}
|
||||
}
|
||||
|
||||
static DECLARE_WORK(work, tps_work);
|
||||
|
||||
#ifdef CONFIG_OMAP_OSK_MISTRAL
|
||||
|
||||
/* For now, all system indicators require the Mistral board, since that
|
||||
@@ -112,7 +72,6 @@ void osk_leds_event(led_event_t evt)
|
||||
case led_stop:
|
||||
led_state &= ~LED_STATE_ENABLED;
|
||||
hw_led_state = 0;
|
||||
/* NOTE: work may still be pending!! */
|
||||
break;
|
||||
|
||||
case led_claim:
|
||||
@@ -145,48 +104,11 @@ void osk_leds_event(led_event_t evt)
|
||||
|
||||
#endif /* CONFIG_OMAP_OSK_MISTRAL */
|
||||
|
||||
/* "green" == tps LED1 (leftmost, normally power-good)
|
||||
* works only with DC adapter, not on battery power!
|
||||
*/
|
||||
case led_green_on:
|
||||
if (led_state & LED_STATE_CLAIMED)
|
||||
hw_led_state |= GREEN_LED;
|
||||
break;
|
||||
case led_green_off:
|
||||
if (led_state & LED_STATE_CLAIMED)
|
||||
hw_led_state &= ~GREEN_LED;
|
||||
break;
|
||||
|
||||
/* "amber" == tps LED2 (middle) */
|
||||
case led_amber_on:
|
||||
if (led_state & LED_STATE_CLAIMED)
|
||||
hw_led_state |= AMBER_LED;
|
||||
break;
|
||||
case led_amber_off:
|
||||
if (led_state & LED_STATE_CLAIMED)
|
||||
hw_led_state &= ~AMBER_LED;
|
||||
break;
|
||||
|
||||
/* "red" == LED on tps gpio3 (rightmost) */
|
||||
case led_red_on:
|
||||
if (led_state & LED_STATE_CLAIMED)
|
||||
hw_led_state |= RED_LED;
|
||||
break;
|
||||
case led_red_off:
|
||||
if (led_state & LED_STATE_CLAIMED)
|
||||
hw_led_state &= ~RED_LED;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
leds ^= hw_led_state;
|
||||
leds &= TPS_LEDS;
|
||||
if (leds && (led_state & LED_STATE_CLAIMED)) {
|
||||
tps_leds_change |= leds;
|
||||
schedule_work(&work);
|
||||
}
|
||||
|
||||
done:
|
||||
local_irq_restore(flags);
|
||||
|
||||
+134
-14
@@ -3,9 +3,9 @@
|
||||
*
|
||||
* OMAP1 pin multiplexing configurations
|
||||
*
|
||||
* Copyright (C) 2003 - 2005 Nokia Corporation
|
||||
* Copyright (C) 2003 - 2008 Nokia Corporation
|
||||
*
|
||||
* Written by Tony Lindgren <tony.lindgren@nokia.com>
|
||||
* Written by Tony Lindgren
|
||||
*
|
||||
* 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
|
||||
@@ -32,8 +32,10 @@
|
||||
|
||||
#ifdef CONFIG_OMAP_MUX
|
||||
|
||||
static struct omap_mux_cfg arch_mux_cfg;
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP730
|
||||
struct pin_config __initdata_or_module omap730_pins[] = {
|
||||
static struct pin_config __initdata_or_module omap730_pins[] = {
|
||||
MUX_CFG_730("E2_730_KBR0", 12, 21, 0, 20, 1, 0)
|
||||
MUX_CFG_730("J7_730_KBR1", 12, 25, 0, 24, 1, 0)
|
||||
MUX_CFG_730("E1_730_KBR2", 12, 29, 0, 28, 1, 0)
|
||||
@@ -49,10 +51,14 @@ MUX_CFG_730("AA17_730_USB_DM", 2, 21, 0, 20, 0, 0)
|
||||
MUX_CFG_730("W16_730_USB_PU_EN", 2, 25, 0, 24, 0, 0)
|
||||
MUX_CFG_730("W17_730_USB_VBUSI", 2, 29, 0, 28, 0, 0)
|
||||
};
|
||||
#endif
|
||||
#define OMAP730_PINS_SZ ARRAY_SIZE(omap730_pins)
|
||||
#else
|
||||
#define omap730_pins NULL
|
||||
#define OMAP730_PINS_SZ 0
|
||||
#endif /* CONFIG_ARCH_OMAP730 */
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP15XX) || defined(CONFIG_ARCH_OMAP16XX)
|
||||
struct pin_config __initdata_or_module omap1xxx_pins[] = {
|
||||
static struct pin_config __initdata_or_module omap1xxx_pins[] = {
|
||||
/*
|
||||
* description mux mode mux pull pull pull pu_pd pu dbg
|
||||
* reg offset mode reg bit ena reg
|
||||
@@ -306,22 +312,136 @@ MUX_CFG("Y12_1610_CCP_CLKP", 8, 18, 6, 1, 24, 1, 1, 0, 0)
|
||||
MUX_CFG("W13_1610_CCP_CLKM", 9, 0, 6, 1, 28, 1, 1, 0, 0)
|
||||
MUX_CFG("W14_1610_CCP_DATAP", 9, 24, 6, 2, 4, 1, 2, 0, 0)
|
||||
MUX_CFG("Y14_1610_CCP_DATAM", 9, 21, 6, 2, 3, 1, 2, 0, 0)
|
||||
|
||||
};
|
||||
#define OMAP1XXX_PINS_SZ ARRAY_SIZE(omap1xxx_pins)
|
||||
#else
|
||||
#define omap1xxx_pins NULL
|
||||
#define OMAP1XXX_PINS_SZ 0
|
||||
#endif /* CONFIG_ARCH_OMAP15XX || CONFIG_ARCH_OMAP16XX */
|
||||
|
||||
int __init_or_module omap1_cfg_reg(const struct pin_config *cfg)
|
||||
{
|
||||
static DEFINE_SPINLOCK(mux_spin_lock);
|
||||
unsigned long flags;
|
||||
unsigned int reg_orig = 0, reg = 0, pu_pd_orig = 0, pu_pd = 0,
|
||||
pull_orig = 0, pull = 0;
|
||||
unsigned int mask, warn = 0;
|
||||
|
||||
/* Check the mux register in question */
|
||||
if (cfg->mux_reg) {
|
||||
unsigned tmp1, tmp2;
|
||||
|
||||
spin_lock_irqsave(&mux_spin_lock, flags);
|
||||
reg_orig = omap_readl(cfg->mux_reg);
|
||||
|
||||
/* The mux registers always seem to be 3 bits long */
|
||||
mask = (0x7 << cfg->mask_offset);
|
||||
tmp1 = reg_orig & mask;
|
||||
reg = reg_orig & ~mask;
|
||||
|
||||
tmp2 = (cfg->mask << cfg->mask_offset);
|
||||
reg |= tmp2;
|
||||
|
||||
if (tmp1 != tmp2)
|
||||
warn = 1;
|
||||
|
||||
omap_writel(reg, cfg->mux_reg);
|
||||
spin_unlock_irqrestore(&mux_spin_lock, flags);
|
||||
}
|
||||
|
||||
/* Check for pull up or pull down selection on 1610 */
|
||||
if (!cpu_is_omap15xx()) {
|
||||
if (cfg->pu_pd_reg && cfg->pull_val) {
|
||||
spin_lock_irqsave(&mux_spin_lock, flags);
|
||||
pu_pd_orig = omap_readl(cfg->pu_pd_reg);
|
||||
mask = 1 << cfg->pull_bit;
|
||||
|
||||
if (cfg->pu_pd_val) {
|
||||
if (!(pu_pd_orig & mask))
|
||||
warn = 1;
|
||||
/* Use pull up */
|
||||
pu_pd = pu_pd_orig | mask;
|
||||
} else {
|
||||
if (pu_pd_orig & mask)
|
||||
warn = 1;
|
||||
/* Use pull down */
|
||||
pu_pd = pu_pd_orig & ~mask;
|
||||
}
|
||||
omap_writel(pu_pd, cfg->pu_pd_reg);
|
||||
spin_unlock_irqrestore(&mux_spin_lock, flags);
|
||||
}
|
||||
}
|
||||
|
||||
/* Check for an associated pull down register */
|
||||
if (cfg->pull_reg) {
|
||||
spin_lock_irqsave(&mux_spin_lock, flags);
|
||||
pull_orig = omap_readl(cfg->pull_reg);
|
||||
mask = 1 << cfg->pull_bit;
|
||||
|
||||
if (cfg->pull_val) {
|
||||
if (pull_orig & mask)
|
||||
warn = 1;
|
||||
/* Low bit = pull enabled */
|
||||
pull = pull_orig & ~mask;
|
||||
} else {
|
||||
if (!(pull_orig & mask))
|
||||
warn = 1;
|
||||
/* High bit = pull disabled */
|
||||
pull = pull_orig | mask;
|
||||
}
|
||||
|
||||
omap_writel(pull, cfg->pull_reg);
|
||||
spin_unlock_irqrestore(&mux_spin_lock, flags);
|
||||
}
|
||||
|
||||
if (warn) {
|
||||
#ifdef CONFIG_OMAP_MUX_WARNINGS
|
||||
printk(KERN_WARNING "MUX: initialized %s\n", cfg->name);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OMAP_MUX_DEBUG
|
||||
if (cfg->debug || warn) {
|
||||
printk("MUX: Setting register %s\n", cfg->name);
|
||||
printk(" %s (0x%08x) = 0x%08x -> 0x%08x\n",
|
||||
cfg->mux_reg_name, cfg->mux_reg, reg_orig, reg);
|
||||
|
||||
if (!cpu_is_omap15xx()) {
|
||||
if (cfg->pu_pd_reg && cfg->pull_val) {
|
||||
printk(" %s (0x%08x) = 0x%08x -> 0x%08x\n",
|
||||
cfg->pu_pd_name, cfg->pu_pd_reg,
|
||||
pu_pd_orig, pu_pd);
|
||||
}
|
||||
}
|
||||
|
||||
if (cfg->pull_reg)
|
||||
printk(" %s (0x%08x) = 0x%08x -> 0x%08x\n",
|
||||
cfg->pull_name, cfg->pull_reg, pull_orig, pull);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_OMAP_MUX_ERRORS
|
||||
return warn ? -ETXTBSY : 0;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
int __init omap1_mux_init(void)
|
||||
{
|
||||
if (cpu_is_omap730()) {
|
||||
arch_mux_cfg.pins = omap730_pins;
|
||||
arch_mux_cfg.size = OMAP730_PINS_SZ;
|
||||
arch_mux_cfg.cfg_reg = omap1_cfg_reg;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP730
|
||||
omap_mux_register(omap730_pins, ARRAY_SIZE(omap730_pins));
|
||||
#endif
|
||||
if (cpu_is_omap15xx() || cpu_is_omap16xx()) {
|
||||
arch_mux_cfg.pins = omap1xxx_pins;
|
||||
arch_mux_cfg.size = OMAP1XXX_PINS_SZ;
|
||||
arch_mux_cfg.cfg_reg = omap1_cfg_reg;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP15XX) || defined(CONFIG_ARCH_OMAP16XX)
|
||||
omap_mux_register(omap1xxx_pins, ARRAY_SIZE(omap1xxx_pins));
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
return omap_mux_register(&arch_mux_cfg);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -56,37 +56,6 @@
|
||||
#define OMAP_MPU_TIMER_BASE OMAP_MPU_TIMER1_BASE
|
||||
#define OMAP_MPU_TIMER_OFFSET 0x100
|
||||
|
||||
/* cycles to nsec conversions taken from arch/i386/kernel/timers/timer_tsc.c,
|
||||
* converted to use kHz by Kevin Hilman */
|
||||
/* convert from cycles(64bits) => nanoseconds (64bits)
|
||||
* basic equation:
|
||||
* ns = cycles / (freq / ns_per_sec)
|
||||
* ns = cycles * (ns_per_sec / freq)
|
||||
* ns = cycles * (10^9 / (cpu_khz * 10^3))
|
||||
* ns = cycles * (10^6 / cpu_khz)
|
||||
*
|
||||
* Then we use scaling math (suggested by george at mvista.com) to get:
|
||||
* ns = cycles * (10^6 * SC / cpu_khz / SC
|
||||
* ns = cycles * cyc2ns_scale / SC
|
||||
*
|
||||
* And since SC is a constant power of two, we can convert the div
|
||||
* into a shift.
|
||||
* -johnstul at us.ibm.com "math is hard, lets go shopping!"
|
||||
*/
|
||||
static unsigned long cyc2ns_scale;
|
||||
#define CYC2NS_SCALE_FACTOR 10 /* 2^10, carefully chosen */
|
||||
|
||||
static inline void set_cyc2ns_scale(unsigned long cpu_khz)
|
||||
{
|
||||
cyc2ns_scale = (1000000 << CYC2NS_SCALE_FACTOR)/cpu_khz;
|
||||
}
|
||||
|
||||
static inline unsigned long long cycles_2_ns(unsigned long long cyc)
|
||||
{
|
||||
return (cyc * cyc2ns_scale) >> CYC2NS_SCALE_FACTOR;
|
||||
}
|
||||
|
||||
|
||||
typedef struct {
|
||||
u32 cntl; /* CNTL_TIMER, R/W */
|
||||
u32 load_tim; /* LOAD_TIM, W */
|
||||
@@ -194,8 +163,6 @@ static struct irqaction omap_mpu_timer1_irq = {
|
||||
|
||||
static __init void omap_init_mpu_timer(unsigned long rate)
|
||||
{
|
||||
set_cyc2ns_scale(rate / 1000);
|
||||
|
||||
setup_irq(INT_TIMER1, &omap_mpu_timer1_irq);
|
||||
omap_mpu_timer_start(0, (rate / HZ) - 1, 1);
|
||||
|
||||
@@ -260,22 +227,6 @@ static void __init omap_init_clocksource(unsigned long rate)
|
||||
printk(err, clocksource_mpu.name);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Scheduler clock - returns current time in nanosec units.
|
||||
*/
|
||||
unsigned long long sched_clock(void)
|
||||
{
|
||||
unsigned long ticks = 0 - omap_mpu_timer_read(1);
|
||||
unsigned long long ticks64;
|
||||
|
||||
ticks64 = omap_mpu_timer2_overflows;
|
||||
ticks64 <<= 32;
|
||||
ticks64 |= ticks;
|
||||
|
||||
return cycles_2_ns(ticks64);
|
||||
}
|
||||
|
||||
/*
|
||||
* ---------------------------------------------------------------------------
|
||||
* Timer initialization
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* linux/arch/arm/plat-omap/timer32k.c
|
||||
* linux/arch/arm/mach-omap1/timer32k.c
|
||||
*
|
||||
* OMAP 32K Timer
|
||||
*
|
||||
@@ -70,8 +70,6 @@ struct sys_timer omap_timer;
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP16XX)
|
||||
#define TIMER_32K_SYNCHRONIZED 0xfffbc410
|
||||
#elif defined(CONFIG_ARCH_OMAP24XX)
|
||||
#define TIMER_32K_SYNCHRONIZED (OMAP24XX_32KSYNCT_BASE + 0x10)
|
||||
#else
|
||||
#error OMAP 32KHz timer does not currently work on 15XX!
|
||||
#endif
|
||||
@@ -93,8 +91,6 @@ struct sys_timer omap_timer;
|
||||
#define JIFFIES_TO_HW_TICKS(nr_jiffies, clock_rate) \
|
||||
(((nr_jiffies) * (clock_rate)) / HZ)
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP1)
|
||||
|
||||
static inline void omap_32k_timer_write(int val, int reg)
|
||||
{
|
||||
omap_writew(val, OMAP1_32K_TIMER_BASE + reg);
|
||||
@@ -120,30 +116,14 @@ static inline void omap_32k_timer_stop(void)
|
||||
|
||||
#define omap_32k_timer_ack_irq()
|
||||
|
||||
#elif defined(CONFIG_ARCH_OMAP2)
|
||||
|
||||
static struct omap_dm_timer *gptimer;
|
||||
|
||||
static inline void omap_32k_timer_start(unsigned long load_val)
|
||||
static int omap_32k_timer_set_next_event(unsigned long delta,
|
||||
struct clock_event_device *dev)
|
||||
{
|
||||
omap_dm_timer_set_load(gptimer, 1, 0xffffffff - load_val);
|
||||
omap_dm_timer_set_int_enable(gptimer, OMAP_TIMER_INT_OVERFLOW);
|
||||
omap_dm_timer_start(gptimer);
|
||||
}
|
||||
omap_32k_timer_start(delta);
|
||||
|
||||
static inline void omap_32k_timer_stop(void)
|
||||
{
|
||||
omap_dm_timer_stop(gptimer);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void omap_32k_timer_ack_irq(void)
|
||||
{
|
||||
u32 status = omap_dm_timer_read_status(gptimer);
|
||||
omap_dm_timer_write_status(gptimer, status);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static void omap_32k_timer_set_mode(enum clock_event_mode mode,
|
||||
struct clock_event_device *evt)
|
||||
{
|
||||
@@ -164,8 +144,9 @@ static void omap_32k_timer_set_mode(enum clock_event_mode mode,
|
||||
|
||||
static struct clock_event_device clockevent_32k_timer = {
|
||||
.name = "32k-timer",
|
||||
.features = CLOCK_EVT_FEAT_PERIODIC,
|
||||
.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
|
||||
.shift = 32,
|
||||
.set_next_event = omap_32k_timer_set_next_event,
|
||||
.set_mode = omap_32k_timer_set_mode,
|
||||
};
|
||||
|
||||
@@ -178,32 +159,6 @@ static inline unsigned long omap_32k_sync_timer_read(void)
|
||||
return omap_readl(TIMER_32K_SYNCHRONIZED);
|
||||
}
|
||||
|
||||
/*
|
||||
* Rounds down to nearest usec. Note that this will overflow for larger values.
|
||||
*/
|
||||
static inline unsigned long omap_32k_ticks_to_usecs(unsigned long ticks_32k)
|
||||
{
|
||||
return (ticks_32k * 5*5*5*5*5*5) >> 9;
|
||||
}
|
||||
|
||||
/*
|
||||
* Rounds down to nearest nsec.
|
||||
*/
|
||||
static inline unsigned long long
|
||||
omap_32k_ticks_to_nsecs(unsigned long ticks_32k)
|
||||
{
|
||||
return (unsigned long long) ticks_32k * 1000 * 5*5*5*5*5*5 >> 9;
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns current time from boot in nsecs. It's OK for this to wrap
|
||||
* around for now, as it's just a relative time stamp.
|
||||
*/
|
||||
unsigned long long sched_clock(void)
|
||||
{
|
||||
return omap_32k_ticks_to_nsecs(omap_32k_sync_timer_read());
|
||||
}
|
||||
|
||||
static irqreturn_t omap_32k_timer_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
struct clock_event_device *evt = &clockevent_32k_timer;
|
||||
@@ -222,22 +177,7 @@ static struct irqaction omap_32k_timer_irq = {
|
||||
|
||||
static __init void omap_init_32k_timer(void)
|
||||
{
|
||||
if (cpu_class_is_omap1())
|
||||
setup_irq(INT_OS_TIMER, &omap_32k_timer_irq);
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP2
|
||||
/* REVISIT: Check 24xx TIOCP_CFG settings after idle works */
|
||||
if (cpu_is_omap24xx()) {
|
||||
gptimer = omap_dm_timer_request_specific(1);
|
||||
BUG_ON(gptimer == NULL);
|
||||
|
||||
omap_dm_timer_set_source(gptimer, OMAP_TIMER_SRC_32_KHZ);
|
||||
setup_irq(omap_dm_timer_get_irq(gptimer), &omap_32k_timer_irq);
|
||||
omap_dm_timer_set_int_enable(gptimer,
|
||||
OMAP_TIMER_INT_CAPTURE | OMAP_TIMER_INT_OVERFLOW |
|
||||
OMAP_TIMER_INT_MATCH);
|
||||
}
|
||||
#endif
|
||||
setup_irq(INT_OS_TIMER, &omap_32k_timer_irq);
|
||||
|
||||
clockevent_32k_timer.mult = div_sc(OMAP_32K_TICKS_PER_SEC,
|
||||
NSEC_PER_SEC,
|
||||
@@ -3,13 +3,15 @@
|
||||
#
|
||||
|
||||
# Common support
|
||||
obj-y := irq.o id.o io.o sram-fn.o memory.o prcm.o clock.o mux.o devices.o \
|
||||
serial.o gpmc.o
|
||||
|
||||
obj-$(CONFIG_OMAP_MPU_TIMER) += timer-gp.o
|
||||
obj-y := irq.o id.o io.o sram-fn.o memory.o control.o prcm.o clock.o mux.o \
|
||||
devices.o serial.o gpmc.o timer-gp.o
|
||||
|
||||
# Power Management
|
||||
obj-$(CONFIG_PM) += pm.o pm-domain.o sleep.o
|
||||
obj-$(CONFIG_PM) += pm.o sleep.o
|
||||
|
||||
# Clock framework
|
||||
obj-$(CONFIG_ARCH_OMAP2) += clock24xx.o
|
||||
obj-$(CONFIG_ARCH_OMAP3) += clock34xx.o
|
||||
|
||||
# Specific board support
|
||||
obj-$(CONFIG_MACH_OMAP_GENERIC) += board-generic.o
|
||||
|
||||
@@ -33,7 +33,6 @@
|
||||
#include <asm/arch/board.h>
|
||||
#include <asm/arch/common.h>
|
||||
#include <asm/arch/gpmc.h>
|
||||
#include "prcm-regs.h"
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
@@ -125,15 +124,18 @@ static inline void __init sdp2430_init_smc91x(void)
|
||||
int eth_cs;
|
||||
unsigned long cs_mem_base;
|
||||
unsigned int rate;
|
||||
struct clk *l3ck;
|
||||
struct clk *gpmc_fck;
|
||||
|
||||
eth_cs = SDP2430_SMC91X_CS;
|
||||
|
||||
l3ck = clk_get(NULL, "core_l3_ck");
|
||||
if (IS_ERR(l3ck))
|
||||
rate = 100000000;
|
||||
else
|
||||
rate = clk_get_rate(l3ck);
|
||||
gpmc_fck = clk_get(NULL, "gpmc_fck"); /* Always on ENABLE_ON_INIT */
|
||||
if (IS_ERR(gpmc_fck)) {
|
||||
WARN_ON(1);
|
||||
return;
|
||||
}
|
||||
|
||||
clk_enable(gpmc_fck);
|
||||
rate = clk_get_rate(gpmc_fck);
|
||||
|
||||
/* Make sure CS1 timings are correct, for 2430 always muxed */
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG1, 0x00011200);
|
||||
@@ -160,7 +162,7 @@ static inline void __init sdp2430_init_smc91x(void)
|
||||
|
||||
if (gpmc_cs_request(eth_cs, SZ_16M, &cs_mem_base) < 0) {
|
||||
printk(KERN_ERR "Failed to request GPMC mem for smc91x\n");
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
|
||||
sdp2430_smc91x_resources[0].start = cs_mem_base + 0x300;
|
||||
@@ -171,10 +173,13 @@ static inline void __init sdp2430_init_smc91x(void)
|
||||
printk(KERN_ERR "Failed to request GPIO%d for smc91x IRQ\n",
|
||||
OMAP24XX_ETHR_GPIO_IRQ);
|
||||
gpmc_cs_free(eth_cs);
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
omap_set_gpio_direction(OMAP24XX_ETHR_GPIO_IRQ, 1);
|
||||
|
||||
out:
|
||||
clk_disable(gpmc_fck);
|
||||
clk_put(gpmc_fck);
|
||||
}
|
||||
|
||||
static void __init omap_2430sdp_init_irq(void)
|
||||
|
||||
@@ -26,6 +26,8 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/clk.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/mach-types.h>
|
||||
@@ -39,7 +41,7 @@
|
||||
#include <asm/arch/board.h>
|
||||
#include <asm/arch/common.h>
|
||||
#include <asm/arch/gpmc.h>
|
||||
#include "prcm-regs.h"
|
||||
#include <asm/arch/control.h>
|
||||
|
||||
/* LED & Switch macros */
|
||||
#define LED0_GPIO13 13
|
||||
@@ -187,17 +189,47 @@ static inline void __init apollon_init_smc91x(void)
|
||||
{
|
||||
unsigned long base;
|
||||
|
||||
unsigned int rate;
|
||||
struct clk *gpmc_fck;
|
||||
int eth_cs;
|
||||
|
||||
gpmc_fck = clk_get(NULL, "gpmc_fck"); /* Always on ENABLE_ON_INIT */
|
||||
if (IS_ERR(gpmc_fck)) {
|
||||
WARN_ON(1);
|
||||
return;
|
||||
}
|
||||
|
||||
clk_enable(gpmc_fck);
|
||||
rate = clk_get_rate(gpmc_fck);
|
||||
|
||||
eth_cs = APOLLON_ETH_CS;
|
||||
|
||||
/* Make sure CS1 timings are correct */
|
||||
GPMC_CONFIG1_1 = 0x00011203;
|
||||
GPMC_CONFIG2_1 = 0x001f1f01;
|
||||
GPMC_CONFIG3_1 = 0x00080803;
|
||||
GPMC_CONFIG4_1 = 0x1c091c09;
|
||||
GPMC_CONFIG5_1 = 0x041f1f1f;
|
||||
GPMC_CONFIG6_1 = 0x000004c4;
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG1, 0x00011200);
|
||||
|
||||
if (rate >= 160000000) {
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG2, 0x001f1f01);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG3, 0x00080803);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG4, 0x1c0b1c0a);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG5, 0x041f1F1F);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG6, 0x000004C4);
|
||||
} else if (rate >= 130000000) {
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG2, 0x001f1f00);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG3, 0x00080802);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG4, 0x1C091C09);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG5, 0x041f1F1F);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG6, 0x000004C4);
|
||||
} else {/* rate = 100000000 */
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG2, 0x001f1f00);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG3, 0x00080802);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG4, 0x1C091C09);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG5, 0x031A1F1F);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG6, 0x000003C2);
|
||||
}
|
||||
|
||||
if (gpmc_cs_request(APOLLON_ETH_CS, SZ_16M, &base) < 0) {
|
||||
printk(KERN_ERR "Failed to request GPMC CS for smc91x\n");
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
apollon_smc91x_resources[0].start = base + 0x300;
|
||||
apollon_smc91x_resources[0].end = base + 0x30f;
|
||||
@@ -208,9 +240,13 @@ static inline void __init apollon_init_smc91x(void)
|
||||
printk(KERN_ERR "Failed to request GPIO%d for smc91x IRQ\n",
|
||||
APOLLON_ETHR_GPIO_IRQ);
|
||||
gpmc_cs_free(APOLLON_ETH_CS);
|
||||
return;
|
||||
goto out;
|
||||
}
|
||||
omap_set_gpio_direction(APOLLON_ETHR_GPIO_IRQ, 1);
|
||||
|
||||
out:
|
||||
clk_disable(gpmc_fck);
|
||||
clk_put(gpmc_fck);
|
||||
}
|
||||
|
||||
static void __init omap_apollon_init_irq(void)
|
||||
@@ -330,6 +366,8 @@ static void __init apollon_usb_init(void)
|
||||
|
||||
static void __init omap_apollon_init(void)
|
||||
{
|
||||
u32 v;
|
||||
|
||||
apollon_led_init();
|
||||
apollon_sw_init();
|
||||
apollon_flash_init();
|
||||
@@ -339,7 +377,9 @@ static void __init omap_apollon_init(void)
|
||||
omap_cfg_reg(W19_24XX_SYS_NIRQ);
|
||||
|
||||
/* Use Interal loop-back in MMC/SDIO Module Input Clock selection */
|
||||
CONTROL_DEVCONF |= (1 << 24);
|
||||
v = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
|
||||
v |= (1 << 24);
|
||||
omap_ctrl_writel(v, OMAP2_CONTROL_DEVCONF0);
|
||||
|
||||
/*
|
||||
* Make sure the serial ports are muxed on at this point.
|
||||
|
||||
+101
-10
@@ -19,6 +19,8 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/clk.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/mach-types.h>
|
||||
@@ -26,6 +28,7 @@
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/flash.h>
|
||||
|
||||
#include <asm/arch/control.h>
|
||||
#include <asm/arch/gpio.h>
|
||||
#include <asm/arch/gpioexpander.h>
|
||||
#include <asm/arch/mux.h>
|
||||
@@ -36,10 +39,13 @@
|
||||
#include <asm/arch/keypad.h>
|
||||
#include <asm/arch/menelaus.h>
|
||||
#include <asm/arch/dma.h>
|
||||
#include "prcm-regs.h"
|
||||
#include <asm/arch/gpmc.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
#define H4_FLASH_CS 0
|
||||
#define H4_SMC91X_CS 1
|
||||
|
||||
static unsigned int row_gpios[6] = { 88, 89, 124, 11, 6, 96 };
|
||||
static unsigned int col_gpios[7] = { 90, 91, 100, 36, 12, 97, 98 };
|
||||
|
||||
@@ -116,8 +122,6 @@ static struct flash_platform_data h4_flash_data = {
|
||||
};
|
||||
|
||||
static struct resource h4_flash_resource = {
|
||||
.start = H4_CS0_BASE,
|
||||
.end = H4_CS0_BASE + SZ_64M - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
};
|
||||
|
||||
@@ -253,21 +257,107 @@ static struct platform_device *h4_devices[] __initdata = {
|
||||
&h4_lcd_device,
|
||||
};
|
||||
|
||||
/* 2420 Sysboot setup (2430 is different) */
|
||||
static u32 get_sysboot_value(void)
|
||||
{
|
||||
return (omap_ctrl_readl(OMAP24XX_CONTROL_STATUS) &
|
||||
(OMAP2_SYSBOOT_5_MASK | OMAP2_SYSBOOT_4_MASK |
|
||||
OMAP2_SYSBOOT_3_MASK | OMAP2_SYSBOOT_2_MASK |
|
||||
OMAP2_SYSBOOT_1_MASK | OMAP2_SYSBOOT_0_MASK));
|
||||
}
|
||||
|
||||
/* H4-2420's always used muxed mode, H4-2422's always use non-muxed
|
||||
*
|
||||
* Note: OMAP-GIT doesn't correctly do is_cpu_omap2422 and is_cpu_omap2423
|
||||
* correctly. The macro needs to look at production_id not just hawkeye.
|
||||
*/
|
||||
static u32 is_gpmc_muxed(void)
|
||||
{
|
||||
u32 mux;
|
||||
mux = get_sysboot_value();
|
||||
if ((mux & 0xF) == 0xd)
|
||||
return 1; /* NAND config (could be either) */
|
||||
if (mux & 0x2) /* if mux'ed */
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void __init h4_init_debug(void)
|
||||
{
|
||||
int eth_cs;
|
||||
unsigned long cs_mem_base;
|
||||
unsigned int muxed, rate;
|
||||
struct clk *gpmc_fck;
|
||||
|
||||
eth_cs = H4_SMC91X_CS;
|
||||
|
||||
gpmc_fck = clk_get(NULL, "gpmc_fck"); /* Always on ENABLE_ON_INIT */
|
||||
if (IS_ERR(gpmc_fck)) {
|
||||
WARN_ON(1);
|
||||
return;
|
||||
}
|
||||
|
||||
clk_enable(gpmc_fck);
|
||||
rate = clk_get_rate(gpmc_fck);
|
||||
clk_disable(gpmc_fck);
|
||||
clk_put(gpmc_fck);
|
||||
|
||||
if (is_gpmc_muxed())
|
||||
muxed = 0x200;
|
||||
else
|
||||
muxed = 0;
|
||||
|
||||
/* Make sure CS1 timings are correct */
|
||||
GPMC_CONFIG1_1 = 0x00011200;
|
||||
GPMC_CONFIG2_1 = 0x001f1f01;
|
||||
GPMC_CONFIG3_1 = 0x00080803;
|
||||
GPMC_CONFIG4_1 = 0x1c091c09;
|
||||
GPMC_CONFIG5_1 = 0x041f1f1f;
|
||||
GPMC_CONFIG6_1 = 0x000004c4;
|
||||
GPMC_CONFIG7_1 = 0x00000f40 | (0x08000000 >> 24);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG1,
|
||||
0x00011000 | muxed);
|
||||
|
||||
if (rate >= 160000000) {
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG2, 0x001f1f01);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG3, 0x00080803);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG4, 0x1c0b1c0a);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG5, 0x041f1F1F);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG6, 0x000004C4);
|
||||
} else if (rate >= 130000000) {
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG2, 0x001f1f00);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG3, 0x00080802);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG4, 0x1C091C09);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG5, 0x041f1F1F);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG6, 0x000004C4);
|
||||
} else {/* rate = 100000000 */
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG2, 0x001f1f00);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG3, 0x00080802);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG4, 0x1C091C09);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG5, 0x031A1F1F);
|
||||
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG6, 0x000003C2);
|
||||
}
|
||||
|
||||
if (gpmc_cs_request(eth_cs, SZ_16M, &cs_mem_base) < 0) {
|
||||
printk(KERN_ERR "Failed to request GPMC mem for smc91x\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
udelay(100);
|
||||
|
||||
omap_cfg_reg(M15_24XX_GPIO92);
|
||||
if (debug_card_init(cs_mem_base, OMAP24XX_ETHR_GPIO_IRQ) < 0)
|
||||
gpmc_cs_free(eth_cs);
|
||||
|
||||
out:
|
||||
clk_disable(gpmc_fck);
|
||||
clk_put(gpmc_fck);
|
||||
}
|
||||
|
||||
static void __init h4_init_flash(void)
|
||||
{
|
||||
unsigned long base;
|
||||
|
||||
if (gpmc_cs_request(H4_FLASH_CS, SZ_64M, &base) < 0) {
|
||||
printk("Can't request GPMC CS for flash\n");
|
||||
return;
|
||||
}
|
||||
h4_flash_resource.start = base;
|
||||
h4_flash_resource.end = base + SZ_64M - 1;
|
||||
}
|
||||
|
||||
static void __init omap_h4_init_irq(void)
|
||||
@@ -275,6 +365,7 @@ static void __init omap_h4_init_irq(void)
|
||||
omap2_init_common_hw();
|
||||
omap_init_irq();
|
||||
omap_gpio_init();
|
||||
h4_init_flash();
|
||||
}
|
||||
|
||||
static struct omap_uart_config h4_uart_config __initdata = {
|
||||
|
||||
+493
-927
File diff suppressed because it is too large
Load Diff
+52
-2095
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,539 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-omap2/clock.c
|
||||
*
|
||||
* Copyright (C) 2005-2008 Texas Instruments, Inc.
|
||||
* Copyright (C) 2004-2008 Nokia Corporation
|
||||
*
|
||||
* Contacts:
|
||||
* Richard Woodruff <r-woodruff2@ti.com>
|
||||
* Paul Walmsley
|
||||
*
|
||||
* Based on earlier work by Tuukka Tikkanen, Tony Lindgren,
|
||||
* Gordon McNutt and RidgeRun, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#undef DEBUG
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/clk.h>
|
||||
|
||||
#include <linux/io.h>
|
||||
#include <linux/cpufreq.h>
|
||||
|
||||
#include <asm/arch/clock.h>
|
||||
#include <asm/arch/sram.h>
|
||||
#include <asm/div64.h>
|
||||
#include <asm/bitops.h>
|
||||
|
||||
#include "memory.h"
|
||||
#include "clock.h"
|
||||
#include "clock24xx.h"
|
||||
#include "prm.h"
|
||||
#include "prm-regbits-24xx.h"
|
||||
#include "cm.h"
|
||||
#include "cm-regbits-24xx.h"
|
||||
|
||||
/* CM_CLKEN_PLL.EN_{54,96}M_PLL options (24XX) */
|
||||
#define EN_APLL_STOPPED 0
|
||||
#define EN_APLL_LOCKED 3
|
||||
|
||||
/* CM_CLKSEL1_PLL.APLLS_CLKIN options (24XX) */
|
||||
#define APLLS_CLKIN_19_2MHZ 0
|
||||
#define APLLS_CLKIN_13MHZ 2
|
||||
#define APLLS_CLKIN_12MHZ 3
|
||||
|
||||
/* #define DOWN_VARIABLE_DPLL 1 */ /* Experimental */
|
||||
|
||||
static struct prcm_config *curr_prcm_set;
|
||||
static struct clk *vclk;
|
||||
static struct clk *sclk;
|
||||
|
||||
/*-------------------------------------------------------------------------
|
||||
* Omap24xx specific clock functions
|
||||
*-------------------------------------------------------------------------*/
|
||||
|
||||
/* This actually returns the rate of core_ck, not dpll_ck. */
|
||||
static u32 omap2_get_dpll_rate_24xx(struct clk *tclk)
|
||||
{
|
||||
long long dpll_clk;
|
||||
u8 amult;
|
||||
|
||||
dpll_clk = omap2_get_dpll_rate(tclk);
|
||||
|
||||
amult = cm_read_mod_reg(PLL_MOD, CM_CLKSEL2);
|
||||
amult &= OMAP24XX_CORE_CLK_SRC_MASK;
|
||||
dpll_clk *= amult;
|
||||
|
||||
return dpll_clk;
|
||||
}
|
||||
|
||||
static int omap2_enable_osc_ck(struct clk *clk)
|
||||
{
|
||||
u32 pcc;
|
||||
|
||||
pcc = __raw_readl(OMAP24XX_PRCM_CLKSRC_CTRL);
|
||||
|
||||
__raw_writel(pcc & ~OMAP_AUTOEXTCLKMODE_MASK,
|
||||
OMAP24XX_PRCM_CLKSRC_CTRL);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void omap2_disable_osc_ck(struct clk *clk)
|
||||
{
|
||||
u32 pcc;
|
||||
|
||||
pcc = __raw_readl(OMAP24XX_PRCM_CLKSRC_CTRL);
|
||||
|
||||
__raw_writel(pcc | OMAP_AUTOEXTCLKMODE_MASK,
|
||||
OMAP24XX_PRCM_CLKSRC_CTRL);
|
||||
}
|
||||
|
||||
#ifdef OLD_CK
|
||||
/* Recalculate SYST_CLK */
|
||||
static void omap2_sys_clk_recalc(struct clk * clk)
|
||||
{
|
||||
u32 div = PRCM_CLKSRC_CTRL;
|
||||
div &= (1 << 7) | (1 << 6); /* Test if ext clk divided by 1 or 2 */
|
||||
div >>= clk->rate_offset;
|
||||
clk->rate = (clk->parent->rate / div);
|
||||
propagate_rate(clk);
|
||||
}
|
||||
#endif /* OLD_CK */
|
||||
|
||||
/* Enable an APLL if off */
|
||||
static int omap2_clk_fixed_enable(struct clk *clk)
|
||||
{
|
||||
u32 cval, apll_mask;
|
||||
|
||||
apll_mask = EN_APLL_LOCKED << clk->enable_bit;
|
||||
|
||||
cval = cm_read_mod_reg(PLL_MOD, CM_CLKEN);
|
||||
|
||||
if ((cval & apll_mask) == apll_mask)
|
||||
return 0; /* apll already enabled */
|
||||
|
||||
cval &= ~apll_mask;
|
||||
cval |= apll_mask;
|
||||
cm_write_mod_reg(cval, PLL_MOD, CM_CLKEN);
|
||||
|
||||
if (clk == &apll96_ck)
|
||||
cval = OMAP24XX_ST_96M_APLL;
|
||||
else if (clk == &apll54_ck)
|
||||
cval = OMAP24XX_ST_54M_APLL;
|
||||
|
||||
omap2_wait_clock_ready(OMAP_CM_REGADDR(PLL_MOD, CM_IDLEST), cval,
|
||||
clk->name);
|
||||
|
||||
/*
|
||||
* REVISIT: Should we return an error code if omap2_wait_clock_ready()
|
||||
* fails?
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Stop APLL */
|
||||
static void omap2_clk_fixed_disable(struct clk *clk)
|
||||
{
|
||||
u32 cval;
|
||||
|
||||
cval = cm_read_mod_reg(PLL_MOD, CM_CLKEN);
|
||||
cval &= ~(EN_APLL_LOCKED << clk->enable_bit);
|
||||
cm_write_mod_reg(cval, PLL_MOD, CM_CLKEN);
|
||||
}
|
||||
|
||||
/*
|
||||
* Uses the current prcm set to tell if a rate is valid.
|
||||
* You can go slower, but not faster within a given rate set.
|
||||
*/
|
||||
static u32 omap2_dpll_round_rate(unsigned long target_rate)
|
||||
{
|
||||
u32 high, low, core_clk_src;
|
||||
|
||||
core_clk_src = cm_read_mod_reg(PLL_MOD, CM_CLKSEL2);
|
||||
core_clk_src &= OMAP24XX_CORE_CLK_SRC_MASK;
|
||||
|
||||
if (core_clk_src == CORE_CLK_SRC_DPLL) { /* DPLL clockout */
|
||||
high = curr_prcm_set->dpll_speed * 2;
|
||||
low = curr_prcm_set->dpll_speed;
|
||||
} else { /* DPLL clockout x 2 */
|
||||
high = curr_prcm_set->dpll_speed;
|
||||
low = curr_prcm_set->dpll_speed / 2;
|
||||
}
|
||||
|
||||
#ifdef DOWN_VARIABLE_DPLL
|
||||
if (target_rate > high)
|
||||
return high;
|
||||
else
|
||||
return target_rate;
|
||||
#else
|
||||
if (target_rate > low)
|
||||
return high;
|
||||
else
|
||||
return low;
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
static void omap2_dpll_recalc(struct clk *clk)
|
||||
{
|
||||
clk->rate = omap2_get_dpll_rate_24xx(clk);
|
||||
|
||||
propagate_rate(clk);
|
||||
}
|
||||
|
||||
static int omap2_reprogram_dpll(struct clk *clk, unsigned long rate)
|
||||
{
|
||||
u32 cur_rate, low, mult, div, valid_rate, done_rate;
|
||||
u32 bypass = 0;
|
||||
struct prcm_config tmpset;
|
||||
const struct dpll_data *dd;
|
||||
unsigned long flags;
|
||||
int ret = -EINVAL;
|
||||
|
||||
local_irq_save(flags);
|
||||
cur_rate = omap2_get_dpll_rate_24xx(&dpll_ck);
|
||||
mult = cm_read_mod_reg(PLL_MOD, CM_CLKSEL2);
|
||||
mult &= OMAP24XX_CORE_CLK_SRC_MASK;
|
||||
|
||||
if ((rate == (cur_rate / 2)) && (mult == 2)) {
|
||||
omap2_reprogram_sdrc(CORE_CLK_SRC_DPLL, 1);
|
||||
} else if ((rate == (cur_rate * 2)) && (mult == 1)) {
|
||||
omap2_reprogram_sdrc(CORE_CLK_SRC_DPLL_X2, 1);
|
||||
} else if (rate != cur_rate) {
|
||||
valid_rate = omap2_dpll_round_rate(rate);
|
||||
if (valid_rate != rate)
|
||||
goto dpll_exit;
|
||||
|
||||
if (mult == 1)
|
||||
low = curr_prcm_set->dpll_speed;
|
||||
else
|
||||
low = curr_prcm_set->dpll_speed / 2;
|
||||
|
||||
dd = clk->dpll_data;
|
||||
if (!dd)
|
||||
goto dpll_exit;
|
||||
|
||||
tmpset.cm_clksel1_pll = __raw_readl(dd->mult_div1_reg);
|
||||
tmpset.cm_clksel1_pll &= ~(dd->mult_mask |
|
||||
dd->div1_mask);
|
||||
div = ((curr_prcm_set->xtal_speed / 1000000) - 1);
|
||||
tmpset.cm_clksel2_pll = cm_read_mod_reg(PLL_MOD, CM_CLKSEL2);
|
||||
tmpset.cm_clksel2_pll &= ~OMAP24XX_CORE_CLK_SRC_MASK;
|
||||
if (rate > low) {
|
||||
tmpset.cm_clksel2_pll |= CORE_CLK_SRC_DPLL_X2;
|
||||
mult = ((rate / 2) / 1000000);
|
||||
done_rate = CORE_CLK_SRC_DPLL_X2;
|
||||
} else {
|
||||
tmpset.cm_clksel2_pll |= CORE_CLK_SRC_DPLL;
|
||||
mult = (rate / 1000000);
|
||||
done_rate = CORE_CLK_SRC_DPLL;
|
||||
}
|
||||
tmpset.cm_clksel1_pll |= (div << __ffs(dd->mult_mask));
|
||||
tmpset.cm_clksel1_pll |= (mult << __ffs(dd->div1_mask));
|
||||
|
||||
/* Worst case */
|
||||
tmpset.base_sdrc_rfr = SDRC_RFR_CTRL_BYPASS;
|
||||
|
||||
if (rate == curr_prcm_set->xtal_speed) /* If asking for 1-1 */
|
||||
bypass = 1;
|
||||
|
||||
omap2_reprogram_sdrc(CORE_CLK_SRC_DPLL_X2, 1); /* For init_mem */
|
||||
|
||||
/* Force dll lock mode */
|
||||
omap2_set_prcm(tmpset.cm_clksel1_pll, tmpset.base_sdrc_rfr,
|
||||
bypass);
|
||||
|
||||
/* Errata: ret dll entry state */
|
||||
omap2_init_memory_params(omap2_dll_force_needed());
|
||||
omap2_reprogram_sdrc(done_rate, 0);
|
||||
}
|
||||
omap2_dpll_recalc(&dpll_ck);
|
||||
ret = 0;
|
||||
|
||||
dpll_exit:
|
||||
local_irq_restore(flags);
|
||||
return(ret);
|
||||
}
|
||||
|
||||
/**
|
||||
* omap2_table_mpu_recalc - just return the MPU speed
|
||||
* @clk: virt_prcm_set struct clk
|
||||
*
|
||||
* Set virt_prcm_set's rate to the mpu_speed field of the current PRCM set.
|
||||
*/
|
||||
static void omap2_table_mpu_recalc(struct clk *clk)
|
||||
{
|
||||
clk->rate = curr_prcm_set->mpu_speed;
|
||||
}
|
||||
|
||||
/*
|
||||
* Look for a rate equal or less than the target rate given a configuration set.
|
||||
*
|
||||
* What's not entirely clear is "which" field represents the key field.
|
||||
* Some might argue L3-DDR, others ARM, others IVA. This code is simple and
|
||||
* just uses the ARM rates.
|
||||
*/
|
||||
static long omap2_round_to_table_rate(struct clk *clk, unsigned long rate)
|
||||
{
|
||||
struct prcm_config *ptr;
|
||||
long highest_rate;
|
||||
|
||||
if (clk != &virt_prcm_set)
|
||||
return -EINVAL;
|
||||
|
||||
highest_rate = -EINVAL;
|
||||
|
||||
for (ptr = rate_table; ptr->mpu_speed; ptr++) {
|
||||
if (!(ptr->flags & cpu_mask))
|
||||
continue;
|
||||
if (ptr->xtal_speed != sys_ck.rate)
|
||||
continue;
|
||||
|
||||
highest_rate = ptr->mpu_speed;
|
||||
|
||||
/* Can check only after xtal frequency check */
|
||||
if (ptr->mpu_speed <= rate)
|
||||
break;
|
||||
}
|
||||
return highest_rate;
|
||||
}
|
||||
|
||||
/* Sets basic clocks based on the specified rate */
|
||||
static int omap2_select_table_rate(struct clk *clk, unsigned long rate)
|
||||
{
|
||||
u32 cur_rate, done_rate, bypass = 0, tmp;
|
||||
struct prcm_config *prcm;
|
||||
unsigned long found_speed = 0;
|
||||
unsigned long flags;
|
||||
|
||||
if (clk != &virt_prcm_set)
|
||||
return -EINVAL;
|
||||
|
||||
for (prcm = rate_table; prcm->mpu_speed; prcm++) {
|
||||
if (!(prcm->flags & cpu_mask))
|
||||
continue;
|
||||
|
||||
if (prcm->xtal_speed != sys_ck.rate)
|
||||
continue;
|
||||
|
||||
if (prcm->mpu_speed <= rate) {
|
||||
found_speed = prcm->mpu_speed;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found_speed) {
|
||||
printk(KERN_INFO "Could not set MPU rate to %luMHz\n",
|
||||
rate / 1000000);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
curr_prcm_set = prcm;
|
||||
cur_rate = omap2_get_dpll_rate_24xx(&dpll_ck);
|
||||
|
||||
if (prcm->dpll_speed == cur_rate / 2) {
|
||||
omap2_reprogram_sdrc(CORE_CLK_SRC_DPLL, 1);
|
||||
} else if (prcm->dpll_speed == cur_rate * 2) {
|
||||
omap2_reprogram_sdrc(CORE_CLK_SRC_DPLL_X2, 1);
|
||||
} else if (prcm->dpll_speed != cur_rate) {
|
||||
local_irq_save(flags);
|
||||
|
||||
if (prcm->dpll_speed == prcm->xtal_speed)
|
||||
bypass = 1;
|
||||
|
||||
if ((prcm->cm_clksel2_pll & OMAP24XX_CORE_CLK_SRC_MASK) ==
|
||||
CORE_CLK_SRC_DPLL_X2)
|
||||
done_rate = CORE_CLK_SRC_DPLL_X2;
|
||||
else
|
||||
done_rate = CORE_CLK_SRC_DPLL;
|
||||
|
||||
/* MPU divider */
|
||||
cm_write_mod_reg(prcm->cm_clksel_mpu, MPU_MOD, CM_CLKSEL);
|
||||
|
||||
/* dsp + iva1 div(2420), iva2.1(2430) */
|
||||
cm_write_mod_reg(prcm->cm_clksel_dsp,
|
||||
OMAP24XX_DSP_MOD, CM_CLKSEL);
|
||||
|
||||
cm_write_mod_reg(prcm->cm_clksel_gfx, GFX_MOD, CM_CLKSEL);
|
||||
|
||||
/* Major subsystem dividers */
|
||||
tmp = cm_read_mod_reg(CORE_MOD, CM_CLKSEL1) & OMAP24XX_CLKSEL_DSS2_MASK;
|
||||
cm_write_mod_reg(prcm->cm_clksel1_core | tmp, CORE_MOD, CM_CLKSEL1);
|
||||
if (cpu_is_omap2430())
|
||||
cm_write_mod_reg(prcm->cm_clksel_mdm,
|
||||
OMAP2430_MDM_MOD, CM_CLKSEL);
|
||||
|
||||
/* x2 to enter init_mem */
|
||||
omap2_reprogram_sdrc(CORE_CLK_SRC_DPLL_X2, 1);
|
||||
|
||||
omap2_set_prcm(prcm->cm_clksel1_pll, prcm->base_sdrc_rfr,
|
||||
bypass);
|
||||
|
||||
omap2_init_memory_params(omap2_dll_force_needed());
|
||||
omap2_reprogram_sdrc(done_rate, 0);
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
omap2_dpll_recalc(&dpll_ck);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct clk_functions omap2_clk_functions = {
|
||||
.clk_enable = omap2_clk_enable,
|
||||
.clk_disable = omap2_clk_disable,
|
||||
.clk_round_rate = omap2_clk_round_rate,
|
||||
.clk_set_rate = omap2_clk_set_rate,
|
||||
.clk_set_parent = omap2_clk_set_parent,
|
||||
.clk_disable_unused = omap2_clk_disable_unused,
|
||||
};
|
||||
|
||||
static u32 omap2_get_apll_clkin(void)
|
||||
{
|
||||
u32 aplls, sclk = 0;
|
||||
|
||||
aplls = cm_read_mod_reg(PLL_MOD, CM_CLKSEL1);
|
||||
aplls &= OMAP24XX_APLLS_CLKIN_MASK;
|
||||
aplls >>= OMAP24XX_APLLS_CLKIN_SHIFT;
|
||||
|
||||
if (aplls == APLLS_CLKIN_19_2MHZ)
|
||||
sclk = 19200000;
|
||||
else if (aplls == APLLS_CLKIN_13MHZ)
|
||||
sclk = 13000000;
|
||||
else if (aplls == APLLS_CLKIN_12MHZ)
|
||||
sclk = 12000000;
|
||||
|
||||
return sclk;
|
||||
}
|
||||
|
||||
static u32 omap2_get_sysclkdiv(void)
|
||||
{
|
||||
u32 div;
|
||||
|
||||
div = __raw_readl(OMAP24XX_PRCM_CLKSRC_CTRL);
|
||||
div &= OMAP_SYSCLKDIV_MASK;
|
||||
div >>= OMAP_SYSCLKDIV_SHIFT;
|
||||
|
||||
return div;
|
||||
}
|
||||
|
||||
static void omap2_osc_clk_recalc(struct clk *clk)
|
||||
{
|
||||
clk->rate = omap2_get_apll_clkin() * omap2_get_sysclkdiv();
|
||||
propagate_rate(clk);
|
||||
}
|
||||
|
||||
static void omap2_sys_clk_recalc(struct clk *clk)
|
||||
{
|
||||
clk->rate = clk->parent->rate / omap2_get_sysclkdiv();
|
||||
propagate_rate(clk);
|
||||
}
|
||||
|
||||
/*
|
||||
* Set clocks for bypass mode for reboot to work.
|
||||
*/
|
||||
void omap2_clk_prepare_for_reboot(void)
|
||||
{
|
||||
u32 rate;
|
||||
|
||||
if (vclk == NULL || sclk == NULL)
|
||||
return;
|
||||
|
||||
rate = clk_get_rate(sclk);
|
||||
clk_set_rate(vclk, rate);
|
||||
}
|
||||
|
||||
/*
|
||||
* Switch the MPU rate if specified on cmdline.
|
||||
* We cannot do this early until cmdline is parsed.
|
||||
*/
|
||||
static int __init omap2_clk_arch_init(void)
|
||||
{
|
||||
if (!mpurate)
|
||||
return -EINVAL;
|
||||
|
||||
if (omap2_select_table_rate(&virt_prcm_set, mpurate))
|
||||
printk(KERN_ERR "Could not find matching MPU rate\n");
|
||||
|
||||
recalculate_root_clocks();
|
||||
|
||||
printk(KERN_INFO "Switched to new clocking rate (Crystal/DPLL/MPU): "
|
||||
"%ld.%01ld/%ld/%ld MHz\n",
|
||||
(sys_ck.rate / 1000000), (sys_ck.rate / 100000) % 10,
|
||||
(dpll_ck.rate / 1000000), (mpu_ck.rate / 1000000)) ;
|
||||
|
||||
return 0;
|
||||
}
|
||||
arch_initcall(omap2_clk_arch_init);
|
||||
|
||||
int __init omap2_clk_init(void)
|
||||
{
|
||||
struct prcm_config *prcm;
|
||||
struct clk **clkp;
|
||||
u32 clkrate;
|
||||
|
||||
if (cpu_is_omap242x())
|
||||
cpu_mask = RATE_IN_242X;
|
||||
else if (cpu_is_omap2430())
|
||||
cpu_mask = RATE_IN_243X;
|
||||
|
||||
clk_init(&omap2_clk_functions);
|
||||
|
||||
omap2_osc_clk_recalc(&osc_ck);
|
||||
omap2_sys_clk_recalc(&sys_ck);
|
||||
|
||||
for (clkp = onchip_24xx_clks;
|
||||
clkp < onchip_24xx_clks + ARRAY_SIZE(onchip_24xx_clks);
|
||||
clkp++) {
|
||||
|
||||
if ((*clkp)->flags & CLOCK_IN_OMAP242X && cpu_is_omap2420()) {
|
||||
clk_register(*clkp);
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((*clkp)->flags & CLOCK_IN_OMAP243X && cpu_is_omap2430()) {
|
||||
clk_register(*clkp);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check the MPU rate set by bootloader */
|
||||
clkrate = omap2_get_dpll_rate_24xx(&dpll_ck);
|
||||
for (prcm = rate_table; prcm->mpu_speed; prcm++) {
|
||||
if (!(prcm->flags & cpu_mask))
|
||||
continue;
|
||||
if (prcm->xtal_speed != sys_ck.rate)
|
||||
continue;
|
||||
if (prcm->dpll_speed <= clkrate)
|
||||
break;
|
||||
}
|
||||
curr_prcm_set = prcm;
|
||||
|
||||
recalculate_root_clocks();
|
||||
|
||||
printk(KERN_INFO "Clocking rate (Crystal/DPLL/MPU): "
|
||||
"%ld.%01ld/%ld/%ld MHz\n",
|
||||
(sys_ck.rate / 1000000), (sys_ck.rate / 100000) % 10,
|
||||
(dpll_ck.rate / 1000000), (mpu_ck.rate / 1000000)) ;
|
||||
|
||||
/*
|
||||
* Only enable those clocks we will need, let the drivers
|
||||
* enable other clocks as necessary
|
||||
*/
|
||||
clk_enable_init_clocks();
|
||||
|
||||
/* Avoid sleeping sleeping during omap2_clk_prepare_for_reboot() */
|
||||
vclk = clk_get(NULL, "virt_prcm_set");
|
||||
sclk = clk_get(NULL, "sys_ck");
|
||||
|
||||
return 0;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,235 @@
|
||||
/*
|
||||
* OMAP3-specific clock framework functions
|
||||
*
|
||||
* Copyright (C) 2007 Texas Instruments, Inc.
|
||||
* Copyright (C) 2007 Nokia Corporation
|
||||
*
|
||||
* Written by Paul Walmsley
|
||||
*
|
||||
* Parts of this code are based on code written by
|
||||
* Richard Woodruff, Tony Lindgren, Tuukka Tikkanen, Karthik Dasu
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#undef DEBUG
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <asm/arch/clock.h>
|
||||
#include <asm/arch/sram.h>
|
||||
#include <asm/div64.h>
|
||||
#include <asm/bitops.h>
|
||||
|
||||
#include "memory.h"
|
||||
#include "clock.h"
|
||||
#include "clock34xx.h"
|
||||
#include "prm.h"
|
||||
#include "prm-regbits-34xx.h"
|
||||
#include "cm.h"
|
||||
#include "cm-regbits-34xx.h"
|
||||
|
||||
/* CM_CLKEN_PLL*.EN* bit values */
|
||||
#define DPLL_LOCKED 0x7
|
||||
|
||||
/**
|
||||
* omap3_dpll_recalc - recalculate DPLL rate
|
||||
* @clk: DPLL struct clk
|
||||
*
|
||||
* Recalculate and propagate the DPLL rate.
|
||||
*/
|
||||
static void omap3_dpll_recalc(struct clk *clk)
|
||||
{
|
||||
clk->rate = omap2_get_dpll_rate(clk);
|
||||
|
||||
propagate_rate(clk);
|
||||
}
|
||||
|
||||
/**
|
||||
* omap3_clkoutx2_recalc - recalculate DPLL X2 output virtual clock rate
|
||||
* @clk: DPLL output struct clk
|
||||
*
|
||||
* Using parent clock DPLL data, look up DPLL state. If locked, set our
|
||||
* rate to the dpll_clk * 2; otherwise, just use dpll_clk.
|
||||
*/
|
||||
static void omap3_clkoutx2_recalc(struct clk *clk)
|
||||
{
|
||||
const struct dpll_data *dd;
|
||||
u32 v;
|
||||
struct clk *pclk;
|
||||
|
||||
/* Walk up the parents of clk, looking for a DPLL */
|
||||
pclk = clk->parent;
|
||||
while (pclk && !pclk->dpll_data)
|
||||
pclk = pclk->parent;
|
||||
|
||||
/* clk does not have a DPLL as a parent? */
|
||||
WARN_ON(!pclk);
|
||||
|
||||
dd = pclk->dpll_data;
|
||||
|
||||
WARN_ON(!dd->control_reg || !dd->enable_mask);
|
||||
|
||||
v = __raw_readl(dd->control_reg) & dd->enable_mask;
|
||||
v >>= __ffs(dd->enable_mask);
|
||||
if (v != DPLL_LOCKED)
|
||||
clk->rate = clk->parent->rate;
|
||||
else
|
||||
clk->rate = clk->parent->rate * 2;
|
||||
|
||||
if (clk->flags & RATE_PROPAGATES)
|
||||
propagate_rate(clk);
|
||||
}
|
||||
|
||||
/*
|
||||
* As it is structured now, this will prevent an OMAP2/3 multiboot
|
||||
* kernel from compiling. This will need further attention.
|
||||
*/
|
||||
#if defined(CONFIG_ARCH_OMAP3)
|
||||
|
||||
static struct clk_functions omap2_clk_functions = {
|
||||
.clk_enable = omap2_clk_enable,
|
||||
.clk_disable = omap2_clk_disable,
|
||||
.clk_round_rate = omap2_clk_round_rate,
|
||||
.clk_set_rate = omap2_clk_set_rate,
|
||||
.clk_set_parent = omap2_clk_set_parent,
|
||||
.clk_disable_unused = omap2_clk_disable_unused,
|
||||
};
|
||||
|
||||
/*
|
||||
* Set clocks for bypass mode for reboot to work.
|
||||
*/
|
||||
void omap2_clk_prepare_for_reboot(void)
|
||||
{
|
||||
/* REVISIT: Not ready for 343x */
|
||||
#if 0
|
||||
u32 rate;
|
||||
|
||||
if (vclk == NULL || sclk == NULL)
|
||||
return;
|
||||
|
||||
rate = clk_get_rate(sclk);
|
||||
clk_set_rate(vclk, rate);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* REVISIT: Move this init stuff out into clock.c */
|
||||
|
||||
/*
|
||||
* Switch the MPU rate if specified on cmdline.
|
||||
* We cannot do this early until cmdline is parsed.
|
||||
*/
|
||||
static int __init omap2_clk_arch_init(void)
|
||||
{
|
||||
if (!mpurate)
|
||||
return -EINVAL;
|
||||
|
||||
/* REVISIT: not yet ready for 343x */
|
||||
#if 0
|
||||
if (omap2_select_table_rate(&virt_prcm_set, mpurate))
|
||||
printk(KERN_ERR "Could not find matching MPU rate\n");
|
||||
#endif
|
||||
|
||||
recalculate_root_clocks();
|
||||
|
||||
printk(KERN_INFO "Switched to new clocking rate (Crystal/DPLL3/MPU): "
|
||||
"%ld.%01ld/%ld/%ld MHz\n",
|
||||
(osc_sys_ck.rate / 1000000), (osc_sys_ck.rate / 100000) % 10,
|
||||
(core_ck.rate / 1000000), (dpll1_fck.rate / 1000000)) ;
|
||||
|
||||
return 0;
|
||||
}
|
||||
arch_initcall(omap2_clk_arch_init);
|
||||
|
||||
int __init omap2_clk_init(void)
|
||||
{
|
||||
/* struct prcm_config *prcm; */
|
||||
struct clk **clkp;
|
||||
/* u32 clkrate; */
|
||||
u32 cpu_clkflg;
|
||||
|
||||
/* REVISIT: Ultimately this will be used for multiboot */
|
||||
#if 0
|
||||
if (cpu_is_omap242x()) {
|
||||
cpu_mask = RATE_IN_242X;
|
||||
cpu_clkflg = CLOCK_IN_OMAP242X;
|
||||
clkp = onchip_24xx_clks;
|
||||
} else if (cpu_is_omap2430()) {
|
||||
cpu_mask = RATE_IN_243X;
|
||||
cpu_clkflg = CLOCK_IN_OMAP243X;
|
||||
clkp = onchip_24xx_clks;
|
||||
}
|
||||
#endif
|
||||
if (cpu_is_omap34xx()) {
|
||||
cpu_mask = RATE_IN_343X;
|
||||
cpu_clkflg = CLOCK_IN_OMAP343X;
|
||||
clkp = onchip_34xx_clks;
|
||||
|
||||
/*
|
||||
* Update this if there are further clock changes between ES2
|
||||
* and production parts
|
||||
*/
|
||||
if (is_sil_rev_equal_to(OMAP3430_REV_ES1_0)) {
|
||||
/* No 3430ES1-only rates exist, so no RATE_IN_3430ES1 */
|
||||
cpu_clkflg |= CLOCK_IN_OMAP3430ES1;
|
||||
} else {
|
||||
cpu_mask |= RATE_IN_3430ES2;
|
||||
cpu_clkflg |= CLOCK_IN_OMAP3430ES2;
|
||||
}
|
||||
}
|
||||
|
||||
clk_init(&omap2_clk_functions);
|
||||
|
||||
for (clkp = onchip_34xx_clks;
|
||||
clkp < onchip_34xx_clks + ARRAY_SIZE(onchip_34xx_clks);
|
||||
clkp++) {
|
||||
if ((*clkp)->flags & cpu_clkflg)
|
||||
clk_register(*clkp);
|
||||
}
|
||||
|
||||
/* REVISIT: Not yet ready for OMAP3 */
|
||||
#if 0
|
||||
/* Check the MPU rate set by bootloader */
|
||||
clkrate = omap2_get_dpll_rate_24xx(&dpll_ck);
|
||||
for (prcm = rate_table; prcm->mpu_speed; prcm++) {
|
||||
if (!(prcm->flags & cpu_mask))
|
||||
continue;
|
||||
if (prcm->xtal_speed != sys_ck.rate)
|
||||
continue;
|
||||
if (prcm->dpll_speed <= clkrate)
|
||||
break;
|
||||
}
|
||||
curr_prcm_set = prcm;
|
||||
#endif
|
||||
|
||||
recalculate_root_clocks();
|
||||
|
||||
printk(KERN_INFO "Clocking rate (Crystal/DPLL/ARM core): "
|
||||
"%ld.%01ld/%ld/%ld MHz\n",
|
||||
(osc_sys_ck.rate / 1000000), (osc_sys_ck.rate / 100000) % 10,
|
||||
(core_ck.rate / 1000000), (arm_fck.rate / 1000000));
|
||||
|
||||
/*
|
||||
* Only enable those clocks we will need, let the drivers
|
||||
* enable other clocks as necessary
|
||||
*/
|
||||
clk_enable_init_clocks();
|
||||
|
||||
/* Avoid sleeping during omap2_clk_prepare_for_reboot() */
|
||||
/* REVISIT: not yet ready for 343x */
|
||||
#if 0
|
||||
vclk = clk_get(NULL, "virt_prcm_set");
|
||||
sclk = clk_get(NULL, "sys_ck");
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,401 @@
|
||||
#ifndef __ARCH_ARM_MACH_OMAP2_CM_REGBITS_24XX_H
|
||||
#define __ARCH_ARM_MACH_OMAP2_CM_REGBITS_24XX_H
|
||||
|
||||
/*
|
||||
* OMAP24XX Clock Management register bits
|
||||
*
|
||||
* Copyright (C) 2007 Texas Instruments, Inc.
|
||||
* Copyright (C) 2007 Nokia Corporation
|
||||
*
|
||||
* Written by Paul Walmsley
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include "cm.h"
|
||||
|
||||
/* Bits shared between registers */
|
||||
|
||||
/* CM_FCLKEN1_CORE and CM_ICLKEN1_CORE shared bits */
|
||||
#define OMAP24XX_EN_CAM_SHIFT 31
|
||||
#define OMAP24XX_EN_CAM (1 << 31)
|
||||
#define OMAP24XX_EN_WDT4_SHIFT 29
|
||||
#define OMAP24XX_EN_WDT4 (1 << 29)
|
||||
#define OMAP2420_EN_WDT3_SHIFT 28
|
||||
#define OMAP2420_EN_WDT3 (1 << 28)
|
||||
#define OMAP24XX_EN_MSPRO_SHIFT 27
|
||||
#define OMAP24XX_EN_MSPRO (1 << 27)
|
||||
#define OMAP24XX_EN_FAC_SHIFT 25
|
||||
#define OMAP24XX_EN_FAC (1 << 25)
|
||||
#define OMAP2420_EN_EAC_SHIFT 24
|
||||
#define OMAP2420_EN_EAC (1 << 24)
|
||||
#define OMAP24XX_EN_HDQ_SHIFT 23
|
||||
#define OMAP24XX_EN_HDQ (1 << 23)
|
||||
#define OMAP2420_EN_I2C2_SHIFT 20
|
||||
#define OMAP2420_EN_I2C2 (1 << 20)
|
||||
#define OMAP2420_EN_I2C1_SHIFT 19
|
||||
#define OMAP2420_EN_I2C1 (1 << 19)
|
||||
|
||||
/* CM_FCLKEN2_CORE and CM_ICLKEN2_CORE shared bits */
|
||||
#define OMAP2430_EN_MCBSP5_SHIFT 5
|
||||
#define OMAP2430_EN_MCBSP5 (1 << 5)
|
||||
#define OMAP2430_EN_MCBSP4_SHIFT 4
|
||||
#define OMAP2430_EN_MCBSP4 (1 << 4)
|
||||
#define OMAP2430_EN_MCBSP3_SHIFT 3
|
||||
#define OMAP2430_EN_MCBSP3 (1 << 3)
|
||||
#define OMAP24XX_EN_SSI_SHIFT 1
|
||||
#define OMAP24XX_EN_SSI (1 << 1)
|
||||
|
||||
/* CM_FCLKEN_WKUP and CM_ICLKEN_WKUP shared bits */
|
||||
#define OMAP24XX_EN_MPU_WDT_SHIFT 3
|
||||
#define OMAP24XX_EN_MPU_WDT (1 << 3)
|
||||
|
||||
/* Bits specific to each register */
|
||||
|
||||
/* CM_IDLEST_MPU */
|
||||
/* 2430 only */
|
||||
#define OMAP2430_ST_MPU (1 << 0)
|
||||
|
||||
/* CM_CLKSEL_MPU */
|
||||
#define OMAP24XX_CLKSEL_MPU_SHIFT 0
|
||||
#define OMAP24XX_CLKSEL_MPU_MASK (0x1f << 0)
|
||||
|
||||
/* CM_CLKSTCTRL_MPU */
|
||||
#define OMAP24XX_AUTOSTATE_MPU (1 << 0)
|
||||
|
||||
/* CM_FCLKEN1_CORE specific bits*/
|
||||
#define OMAP24XX_EN_TV_SHIFT 2
|
||||
#define OMAP24XX_EN_TV (1 << 2)
|
||||
#define OMAP24XX_EN_DSS2_SHIFT 1
|
||||
#define OMAP24XX_EN_DSS2 (1 << 1)
|
||||
#define OMAP24XX_EN_DSS1_SHIFT 0
|
||||
#define OMAP24XX_EN_DSS1 (1 << 0)
|
||||
|
||||
/* CM_FCLKEN2_CORE specific bits */
|
||||
#define OMAP2430_EN_I2CHS2_SHIFT 20
|
||||
#define OMAP2430_EN_I2CHS2 (1 << 20)
|
||||
#define OMAP2430_EN_I2CHS1_SHIFT 19
|
||||
#define OMAP2430_EN_I2CHS1 (1 << 19)
|
||||
#define OMAP2430_EN_MMCHSDB2_SHIFT 17
|
||||
#define OMAP2430_EN_MMCHSDB2 (1 << 17)
|
||||
#define OMAP2430_EN_MMCHSDB1_SHIFT 16
|
||||
#define OMAP2430_EN_MMCHSDB1 (1 << 16)
|
||||
|
||||
/* CM_ICLKEN1_CORE specific bits */
|
||||
#define OMAP24XX_EN_MAILBOXES_SHIFT 30
|
||||
#define OMAP24XX_EN_MAILBOXES (1 << 30)
|
||||
#define OMAP24XX_EN_DSS_SHIFT 0
|
||||
#define OMAP24XX_EN_DSS (1 << 0)
|
||||
|
||||
/* CM_ICLKEN2_CORE specific bits */
|
||||
|
||||
/* CM_ICLKEN3_CORE */
|
||||
/* 2430 only */
|
||||
#define OMAP2430_EN_SDRC_SHIFT 2
|
||||
#define OMAP2430_EN_SDRC (1 << 2)
|
||||
|
||||
/* CM_ICLKEN4_CORE */
|
||||
#define OMAP24XX_EN_PKA_SHIFT 4
|
||||
#define OMAP24XX_EN_PKA (1 << 4)
|
||||
#define OMAP24XX_EN_AES_SHIFT 3
|
||||
#define OMAP24XX_EN_AES (1 << 3)
|
||||
#define OMAP24XX_EN_RNG_SHIFT 2
|
||||
#define OMAP24XX_EN_RNG (1 << 2)
|
||||
#define OMAP24XX_EN_SHA_SHIFT 1
|
||||
#define OMAP24XX_EN_SHA (1 << 1)
|
||||
#define OMAP24XX_EN_DES_SHIFT 0
|
||||
#define OMAP24XX_EN_DES (1 << 0)
|
||||
|
||||
/* CM_IDLEST1_CORE specific bits */
|
||||
#define OMAP24XX_ST_MAILBOXES (1 << 30)
|
||||
#define OMAP24XX_ST_WDT4 (1 << 29)
|
||||
#define OMAP2420_ST_WDT3 (1 << 28)
|
||||
#define OMAP24XX_ST_MSPRO (1 << 27)
|
||||
#define OMAP24XX_ST_FAC (1 << 25)
|
||||
#define OMAP2420_ST_EAC (1 << 24)
|
||||
#define OMAP24XX_ST_HDQ (1 << 23)
|
||||
#define OMAP24XX_ST_I2C2 (1 << 20)
|
||||
#define OMAP24XX_ST_I2C1 (1 << 19)
|
||||
#define OMAP24XX_ST_MCBSP2 (1 << 16)
|
||||
#define OMAP24XX_ST_MCBSP1 (1 << 15)
|
||||
#define OMAP24XX_ST_DSS (1 << 0)
|
||||
|
||||
/* CM_IDLEST2_CORE */
|
||||
#define OMAP2430_ST_MCBSP5 (1 << 5)
|
||||
#define OMAP2430_ST_MCBSP4 (1 << 4)
|
||||
#define OMAP2430_ST_MCBSP3 (1 << 3)
|
||||
#define OMAP24XX_ST_SSI (1 << 1)
|
||||
|
||||
/* CM_IDLEST3_CORE */
|
||||
/* 2430 only */
|
||||
#define OMAP2430_ST_SDRC (1 << 2)
|
||||
|
||||
/* CM_IDLEST4_CORE */
|
||||
#define OMAP24XX_ST_PKA (1 << 4)
|
||||
#define OMAP24XX_ST_AES (1 << 3)
|
||||
#define OMAP24XX_ST_RNG (1 << 2)
|
||||
#define OMAP24XX_ST_SHA (1 << 1)
|
||||
#define OMAP24XX_ST_DES (1 << 0)
|
||||
|
||||
/* CM_AUTOIDLE1_CORE */
|
||||
#define OMAP24XX_AUTO_CAM (1 << 31)
|
||||
#define OMAP24XX_AUTO_MAILBOXES (1 << 30)
|
||||
#define OMAP24XX_AUTO_WDT4 (1 << 29)
|
||||
#define OMAP2420_AUTO_WDT3 (1 << 28)
|
||||
#define OMAP24XX_AUTO_MSPRO (1 << 27)
|
||||
#define OMAP2420_AUTO_MMC (1 << 26)
|
||||
#define OMAP24XX_AUTO_FAC (1 << 25)
|
||||
#define OMAP2420_AUTO_EAC (1 << 24)
|
||||
#define OMAP24XX_AUTO_HDQ (1 << 23)
|
||||
#define OMAP24XX_AUTO_UART2 (1 << 22)
|
||||
#define OMAP24XX_AUTO_UART1 (1 << 21)
|
||||
#define OMAP24XX_AUTO_I2C2 (1 << 20)
|
||||
#define OMAP24XX_AUTO_I2C1 (1 << 19)
|
||||
#define OMAP24XX_AUTO_MCSPI2 (1 << 18)
|
||||
#define OMAP24XX_AUTO_MCSPI1 (1 << 17)
|
||||
#define OMAP24XX_AUTO_MCBSP2 (1 << 16)
|
||||
#define OMAP24XX_AUTO_MCBSP1 (1 << 15)
|
||||
#define OMAP24XX_AUTO_GPT12 (1 << 14)
|
||||
#define OMAP24XX_AUTO_GPT11 (1 << 13)
|
||||
#define OMAP24XX_AUTO_GPT10 (1 << 12)
|
||||
#define OMAP24XX_AUTO_GPT9 (1 << 11)
|
||||
#define OMAP24XX_AUTO_GPT8 (1 << 10)
|
||||
#define OMAP24XX_AUTO_GPT7 (1 << 9)
|
||||
#define OMAP24XX_AUTO_GPT6 (1 << 8)
|
||||
#define OMAP24XX_AUTO_GPT5 (1 << 7)
|
||||
#define OMAP24XX_AUTO_GPT4 (1 << 6)
|
||||
#define OMAP24XX_AUTO_GPT3 (1 << 5)
|
||||
#define OMAP24XX_AUTO_GPT2 (1 << 4)
|
||||
#define OMAP2420_AUTO_VLYNQ (1 << 3)
|
||||
#define OMAP24XX_AUTO_DSS (1 << 0)
|
||||
|
||||
/* CM_AUTOIDLE2_CORE */
|
||||
#define OMAP2430_AUTO_MDM_INTC (1 << 11)
|
||||
#define OMAP2430_AUTO_GPIO5 (1 << 10)
|
||||
#define OMAP2430_AUTO_MCSPI3 (1 << 9)
|
||||
#define OMAP2430_AUTO_MMCHS2 (1 << 8)
|
||||
#define OMAP2430_AUTO_MMCHS1 (1 << 7)
|
||||
#define OMAP2430_AUTO_USBHS (1 << 6)
|
||||
#define OMAP2430_AUTO_MCBSP5 (1 << 5)
|
||||
#define OMAP2430_AUTO_MCBSP4 (1 << 4)
|
||||
#define OMAP2430_AUTO_MCBSP3 (1 << 3)
|
||||
#define OMAP24XX_AUTO_UART3 (1 << 2)
|
||||
#define OMAP24XX_AUTO_SSI (1 << 1)
|
||||
#define OMAP24XX_AUTO_USB (1 << 0)
|
||||
|
||||
/* CM_AUTOIDLE3_CORE */
|
||||
#define OMAP24XX_AUTO_SDRC (1 << 2)
|
||||
#define OMAP24XX_AUTO_GPMC (1 << 1)
|
||||
#define OMAP24XX_AUTO_SDMA (1 << 0)
|
||||
|
||||
/* CM_AUTOIDLE4_CORE */
|
||||
#define OMAP24XX_AUTO_PKA (1 << 4)
|
||||
#define OMAP24XX_AUTO_AES (1 << 3)
|
||||
#define OMAP24XX_AUTO_RNG (1 << 2)
|
||||
#define OMAP24XX_AUTO_SHA (1 << 1)
|
||||
#define OMAP24XX_AUTO_DES (1 << 0)
|
||||
|
||||
/* CM_CLKSEL1_CORE */
|
||||
#define OMAP24XX_CLKSEL_USB_SHIFT 25
|
||||
#define OMAP24XX_CLKSEL_USB_MASK (0x7 << 25)
|
||||
#define OMAP24XX_CLKSEL_SSI_SHIFT 20
|
||||
#define OMAP24XX_CLKSEL_SSI_MASK (0x1f << 20)
|
||||
#define OMAP2420_CLKSEL_VLYNQ_SHIFT 15
|
||||
#define OMAP2420_CLKSEL_VLYNQ_MASK (0x1f << 15)
|
||||
#define OMAP24XX_CLKSEL_DSS2_SHIFT 13
|
||||
#define OMAP24XX_CLKSEL_DSS2_MASK (0x1 << 13)
|
||||
#define OMAP24XX_CLKSEL_DSS1_SHIFT 8
|
||||
#define OMAP24XX_CLKSEL_DSS1_MASK (0x1f << 8)
|
||||
#define OMAP24XX_CLKSEL_L4_SHIFT 5
|
||||
#define OMAP24XX_CLKSEL_L4_MASK (0x3 << 5)
|
||||
#define OMAP24XX_CLKSEL_L3_SHIFT 0
|
||||
#define OMAP24XX_CLKSEL_L3_MASK (0x1f << 0)
|
||||
|
||||
/* CM_CLKSEL2_CORE */
|
||||
#define OMAP24XX_CLKSEL_GPT12_SHIFT 22
|
||||
#define OMAP24XX_CLKSEL_GPT12_MASK (0x3 << 22)
|
||||
#define OMAP24XX_CLKSEL_GPT11_SHIFT 20
|
||||
#define OMAP24XX_CLKSEL_GPT11_MASK (0x3 << 20)
|
||||
#define OMAP24XX_CLKSEL_GPT10_SHIFT 18
|
||||
#define OMAP24XX_CLKSEL_GPT10_MASK (0x3 << 18)
|
||||
#define OMAP24XX_CLKSEL_GPT9_SHIFT 16
|
||||
#define OMAP24XX_CLKSEL_GPT9_MASK (0x3 << 16)
|
||||
#define OMAP24XX_CLKSEL_GPT8_SHIFT 14
|
||||
#define OMAP24XX_CLKSEL_GPT8_MASK (0x3 << 14)
|
||||
#define OMAP24XX_CLKSEL_GPT7_SHIFT 12
|
||||
#define OMAP24XX_CLKSEL_GPT7_MASK (0x3 << 12)
|
||||
#define OMAP24XX_CLKSEL_GPT6_SHIFT 10
|
||||
#define OMAP24XX_CLKSEL_GPT6_MASK (0x3 << 10)
|
||||
#define OMAP24XX_CLKSEL_GPT5_SHIFT 8
|
||||
#define OMAP24XX_CLKSEL_GPT5_MASK (0x3 << 8)
|
||||
#define OMAP24XX_CLKSEL_GPT4_SHIFT 6
|
||||
#define OMAP24XX_CLKSEL_GPT4_MASK (0x3 << 6)
|
||||
#define OMAP24XX_CLKSEL_GPT3_SHIFT 4
|
||||
#define OMAP24XX_CLKSEL_GPT3_MASK (0x3 << 4)
|
||||
#define OMAP24XX_CLKSEL_GPT2_SHIFT 2
|
||||
#define OMAP24XX_CLKSEL_GPT2_MASK (0x3 << 2)
|
||||
|
||||
/* CM_CLKSTCTRL_CORE */
|
||||
#define OMAP24XX_AUTOSTATE_DSS (1 << 2)
|
||||
#define OMAP24XX_AUTOSTATE_L4 (1 << 1)
|
||||
#define OMAP24XX_AUTOSTATE_L3 (1 << 0)
|
||||
|
||||
/* CM_FCLKEN_GFX */
|
||||
#define OMAP24XX_EN_3D_SHIFT 2
|
||||
#define OMAP24XX_EN_3D (1 << 2)
|
||||
#define OMAP24XX_EN_2D_SHIFT 1
|
||||
#define OMAP24XX_EN_2D (1 << 1)
|
||||
|
||||
/* CM_ICLKEN_GFX specific bits */
|
||||
|
||||
/* CM_IDLEST_GFX specific bits */
|
||||
|
||||
/* CM_CLKSEL_GFX specific bits */
|
||||
|
||||
/* CM_CLKSTCTRL_GFX */
|
||||
#define OMAP24XX_AUTOSTATE_GFX (1 << 0)
|
||||
|
||||
/* CM_FCLKEN_WKUP specific bits */
|
||||
|
||||
/* CM_ICLKEN_WKUP specific bits */
|
||||
#define OMAP2430_EN_ICR_SHIFT 6
|
||||
#define OMAP2430_EN_ICR (1 << 6)
|
||||
#define OMAP24XX_EN_OMAPCTRL_SHIFT 5
|
||||
#define OMAP24XX_EN_OMAPCTRL (1 << 5)
|
||||
#define OMAP24XX_EN_WDT1_SHIFT 4
|
||||
#define OMAP24XX_EN_WDT1 (1 << 4)
|
||||
#define OMAP24XX_EN_32KSYNC_SHIFT 1
|
||||
#define OMAP24XX_EN_32KSYNC (1 << 1)
|
||||
|
||||
/* CM_IDLEST_WKUP specific bits */
|
||||
#define OMAP2430_ST_ICR (1 << 6)
|
||||
#define OMAP24XX_ST_OMAPCTRL (1 << 5)
|
||||
#define OMAP24XX_ST_WDT1 (1 << 4)
|
||||
#define OMAP24XX_ST_MPU_WDT (1 << 3)
|
||||
#define OMAP24XX_ST_32KSYNC (1 << 1)
|
||||
|
||||
/* CM_AUTOIDLE_WKUP */
|
||||
#define OMAP24XX_AUTO_OMAPCTRL (1 << 5)
|
||||
#define OMAP24XX_AUTO_WDT1 (1 << 4)
|
||||
#define OMAP24XX_AUTO_MPU_WDT (1 << 3)
|
||||
#define OMAP24XX_AUTO_GPIOS (1 << 2)
|
||||
#define OMAP24XX_AUTO_32KSYNC (1 << 1)
|
||||
#define OMAP24XX_AUTO_GPT1 (1 << 0)
|
||||
|
||||
/* CM_CLKSEL_WKUP */
|
||||
#define OMAP24XX_CLKSEL_GPT1_SHIFT 0
|
||||
#define OMAP24XX_CLKSEL_GPT1_MASK (0x3 << 0)
|
||||
|
||||
/* CM_CLKEN_PLL */
|
||||
#define OMAP24XX_EN_54M_PLL_SHIFT 6
|
||||
#define OMAP24XX_EN_54M_PLL_MASK (0x3 << 6)
|
||||
#define OMAP24XX_EN_96M_PLL_SHIFT 2
|
||||
#define OMAP24XX_EN_96M_PLL_MASK (0x3 << 2)
|
||||
#define OMAP24XX_EN_DPLL_SHIFT 0
|
||||
#define OMAP24XX_EN_DPLL_MASK (0x3 << 0)
|
||||
|
||||
/* CM_IDLEST_CKGEN */
|
||||
#define OMAP24XX_ST_54M_APLL (1 << 9)
|
||||
#define OMAP24XX_ST_96M_APLL (1 << 8)
|
||||
#define OMAP24XX_ST_54M_CLK (1 << 6)
|
||||
#define OMAP24XX_ST_12M_CLK (1 << 5)
|
||||
#define OMAP24XX_ST_48M_CLK (1 << 4)
|
||||
#define OMAP24XX_ST_96M_CLK (1 << 2)
|
||||
#define OMAP24XX_ST_CORE_CLK_SHIFT 0
|
||||
#define OMAP24XX_ST_CORE_CLK_MASK (0x3 << 0)
|
||||
|
||||
/* CM_AUTOIDLE_PLL */
|
||||
#define OMAP24XX_AUTO_54M_SHIFT 6
|
||||
#define OMAP24XX_AUTO_54M_MASK (0x3 << 6)
|
||||
#define OMAP24XX_AUTO_96M_SHIFT 2
|
||||
#define OMAP24XX_AUTO_96M_MASK (0x3 << 2)
|
||||
#define OMAP24XX_AUTO_DPLL_SHIFT 0
|
||||
#define OMAP24XX_AUTO_DPLL_MASK (0x3 << 0)
|
||||
|
||||
/* CM_CLKSEL1_PLL */
|
||||
#define OMAP2430_MAXDPLLFASTLOCK_SHIFT 28
|
||||
#define OMAP2430_MAXDPLLFASTLOCK_MASK (0x7 << 28)
|
||||
#define OMAP24XX_APLLS_CLKIN_SHIFT 23
|
||||
#define OMAP24XX_APLLS_CLKIN_MASK (0x7 << 23)
|
||||
#define OMAP24XX_DPLL_MULT_SHIFT 12
|
||||
#define OMAP24XX_DPLL_MULT_MASK (0x3ff << 12)
|
||||
#define OMAP24XX_DPLL_DIV_SHIFT 8
|
||||
#define OMAP24XX_DPLL_DIV_MASK (0xf << 8)
|
||||
#define OMAP24XX_54M_SOURCE_SHIFT 5
|
||||
#define OMAP24XX_54M_SOURCE (1 << 5)
|
||||
#define OMAP2430_96M_SOURCE_SHIFT 4
|
||||
#define OMAP2430_96M_SOURCE (1 << 4)
|
||||
#define OMAP24XX_48M_SOURCE_SHIFT 3
|
||||
#define OMAP24XX_48M_SOURCE (1 << 3)
|
||||
#define OMAP2430_ALTCLK_SOURCE_SHIFT 0
|
||||
#define OMAP2430_ALTCLK_SOURCE_MASK (0x7 << 0)
|
||||
|
||||
/* CM_CLKSEL2_PLL */
|
||||
#define OMAP24XX_CORE_CLK_SRC_SHIFT 0
|
||||
#define OMAP24XX_CORE_CLK_SRC_MASK (0x3 << 0)
|
||||
|
||||
/* CM_FCLKEN_DSP */
|
||||
#define OMAP2420_EN_IVA_COP_SHIFT 10
|
||||
#define OMAP2420_EN_IVA_COP (1 << 10)
|
||||
#define OMAP2420_EN_IVA_MPU_SHIFT 8
|
||||
#define OMAP2420_EN_IVA_MPU (1 << 8)
|
||||
#define OMAP24XX_CM_FCLKEN_DSP_EN_DSP_SHIFT 0
|
||||
#define OMAP24XX_CM_FCLKEN_DSP_EN_DSP (1 << 0)
|
||||
|
||||
/* CM_ICLKEN_DSP */
|
||||
#define OMAP2420_EN_DSP_IPI_SHIFT 1
|
||||
#define OMAP2420_EN_DSP_IPI (1 << 1)
|
||||
|
||||
/* CM_IDLEST_DSP */
|
||||
#define OMAP2420_ST_IVA (1 << 8)
|
||||
#define OMAP2420_ST_IPI (1 << 1)
|
||||
#define OMAP24XX_ST_DSP (1 << 0)
|
||||
|
||||
/* CM_AUTOIDLE_DSP */
|
||||
#define OMAP2420_AUTO_DSP_IPI (1 << 1)
|
||||
|
||||
/* CM_CLKSEL_DSP */
|
||||
#define OMAP2420_SYNC_IVA (1 << 13)
|
||||
#define OMAP2420_CLKSEL_IVA_SHIFT 8
|
||||
#define OMAP2420_CLKSEL_IVA_MASK (0x1f << 8)
|
||||
#define OMAP24XX_SYNC_DSP (1 << 7)
|
||||
#define OMAP24XX_CLKSEL_DSP_IF_SHIFT 5
|
||||
#define OMAP24XX_CLKSEL_DSP_IF_MASK (0x3 << 5)
|
||||
#define OMAP24XX_CLKSEL_DSP_SHIFT 0
|
||||
#define OMAP24XX_CLKSEL_DSP_MASK (0x1f << 0)
|
||||
|
||||
/* CM_CLKSTCTRL_DSP */
|
||||
#define OMAP2420_AUTOSTATE_IVA (1 << 8)
|
||||
#define OMAP24XX_AUTOSTATE_DSP (1 << 0)
|
||||
|
||||
/* CM_FCLKEN_MDM */
|
||||
/* 2430 only */
|
||||
#define OMAP2430_EN_OSC_SHIFT 1
|
||||
#define OMAP2430_EN_OSC (1 << 1)
|
||||
|
||||
/* CM_ICLKEN_MDM */
|
||||
/* 2430 only */
|
||||
#define OMAP2430_CM_ICLKEN_MDM_EN_MDM_SHIFT 0
|
||||
#define OMAP2430_CM_ICLKEN_MDM_EN_MDM (1 << 0)
|
||||
|
||||
/* CM_IDLEST_MDM specific bits */
|
||||
/* 2430 only */
|
||||
|
||||
/* CM_AUTOIDLE_MDM */
|
||||
/* 2430 only */
|
||||
#define OMAP2430_AUTO_OSC (1 << 1)
|
||||
#define OMAP2430_AUTO_MDM (1 << 0)
|
||||
|
||||
/* CM_CLKSEL_MDM */
|
||||
/* 2430 only */
|
||||
#define OMAP2430_SYNC_MDM (1 << 4)
|
||||
#define OMAP2430_CLKSEL_MDM_SHIFT 0
|
||||
#define OMAP2430_CLKSEL_MDM_MASK (0xf << 0)
|
||||
|
||||
/* CM_CLKSTCTRL_MDM */
|
||||
/* 2430 only */
|
||||
#define OMAP2430_AUTOSTATE_MDM (1 << 0)
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,673 @@
|
||||
#ifndef __ARCH_ARM_MACH_OMAP2_CM_REGBITS_34XX_H
|
||||
#define __ARCH_ARM_MACH_OMAP2_CM_REGBITS_34XX_H
|
||||
|
||||
/*
|
||||
* OMAP3430 Clock Management register bits
|
||||
*
|
||||
* Copyright (C) 2007-2008 Texas Instruments, Inc.
|
||||
* Copyright (C) 2007-2008 Nokia Corporation
|
||||
*
|
||||
* Written by Paul Walmsley
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include "cm.h"
|
||||
|
||||
/* Bits shared between registers */
|
||||
|
||||
/* CM_FCLKEN1_CORE and CM_ICLKEN1_CORE shared bits */
|
||||
#define OMAP3430ES2_EN_MMC3_MASK (1 << 30)
|
||||
#define OMAP3430ES2_EN_MMC3_SHIFT 30
|
||||
#define OMAP3430_EN_MSPRO (1 << 23)
|
||||
#define OMAP3430_EN_MSPRO_SHIFT 23
|
||||
#define OMAP3430_EN_HDQ (1 << 22)
|
||||
#define OMAP3430_EN_HDQ_SHIFT 22
|
||||
#define OMAP3430ES1_EN_FSHOSTUSB (1 << 5)
|
||||
#define OMAP3430ES1_EN_FSHOSTUSB_SHIFT 5
|
||||
#define OMAP3430ES1_EN_D2D (1 << 3)
|
||||
#define OMAP3430ES1_EN_D2D_SHIFT 3
|
||||
#define OMAP3430_EN_SSI (1 << 0)
|
||||
#define OMAP3430_EN_SSI_SHIFT 0
|
||||
|
||||
/* CM_FCLKEN3_CORE and CM_ICLKEN3_CORE shared bits */
|
||||
#define OMAP3430ES2_EN_USBTLL_SHIFT 2
|
||||
#define OMAP3430ES2_EN_USBTLL_MASK (1 << 2)
|
||||
|
||||
/* CM_FCLKEN_WKUP and CM_ICLKEN_WKUP shared bits */
|
||||
#define OMAP3430_EN_WDT2 (1 << 5)
|
||||
#define OMAP3430_EN_WDT2_SHIFT 5
|
||||
|
||||
/* CM_ICLKEN_CAM, CM_FCLKEN_CAM shared bits */
|
||||
#define OMAP3430_EN_CAM (1 << 0)
|
||||
#define OMAP3430_EN_CAM_SHIFT 0
|
||||
|
||||
/* CM_FCLKEN_PER, CM_ICLKEN_PER shared bits */
|
||||
#define OMAP3430_EN_WDT3 (1 << 12)
|
||||
#define OMAP3430_EN_WDT3_SHIFT 12
|
||||
|
||||
/* CM_CLKSEL2_EMU, CM_CLKSEL3_EMU shared bits */
|
||||
#define OMAP3430_OVERRIDE_ENABLE (1 << 19)
|
||||
|
||||
|
||||
/* Bits specific to each register */
|
||||
|
||||
/* CM_FCLKEN_IVA2 */
|
||||
#define OMAP3430_CM_FCLKEN_IVA2_EN_IVA2 (1 << 0)
|
||||
|
||||
/* CM_CLKEN_PLL_IVA2 */
|
||||
#define OMAP3430_IVA2_DPLL_RAMPTIME_SHIFT 8
|
||||
#define OMAP3430_IVA2_DPLL_RAMPTIME_MASK (0x3 << 8)
|
||||
#define OMAP3430_IVA2_DPLL_FREQSEL_SHIFT 4
|
||||
#define OMAP3430_IVA2_DPLL_FREQSEL_MASK (0xf << 4)
|
||||
#define OMAP3430_EN_IVA2_DPLL_DRIFTGUARD_SHIFT 3
|
||||
#define OMAP3430_EN_IVA2_DPLL_DRIFTGUARD_MASK (1 << 3)
|
||||
#define OMAP3430_EN_IVA2_DPLL_SHIFT 0
|
||||
#define OMAP3430_EN_IVA2_DPLL_MASK (0x7 << 0)
|
||||
|
||||
/* CM_IDLEST_IVA2 */
|
||||
#define OMAP3430_ST_IVA2 (1 << 0)
|
||||
|
||||
/* CM_IDLEST_PLL_IVA2 */
|
||||
#define OMAP3430_ST_IVA2_CLK (1 << 0)
|
||||
|
||||
/* CM_AUTOIDLE_PLL_IVA2 */
|
||||
#define OMAP3430_AUTO_IVA2_DPLL_SHIFT 0
|
||||
#define OMAP3430_AUTO_IVA2_DPLL_MASK (0x7 << 0)
|
||||
|
||||
/* CM_CLKSEL1_PLL_IVA2 */
|
||||
#define OMAP3430_IVA2_CLK_SRC_SHIFT 19
|
||||
#define OMAP3430_IVA2_CLK_SRC_MASK (0x3 << 19)
|
||||
#define OMAP3430_IVA2_DPLL_MULT_SHIFT 8
|
||||
#define OMAP3430_IVA2_DPLL_MULT_MASK (0x7ff << 8)
|
||||
#define OMAP3430_IVA2_DPLL_DIV_SHIFT 0
|
||||
#define OMAP3430_IVA2_DPLL_DIV_MASK (0x7f << 0)
|
||||
|
||||
/* CM_CLKSEL2_PLL_IVA2 */
|
||||
#define OMAP3430_IVA2_DPLL_CLKOUT_DIV_SHIFT 0
|
||||
#define OMAP3430_IVA2_DPLL_CLKOUT_DIV_MASK (0x1f << 0)
|
||||
|
||||
/* CM_CLKSTCTRL_IVA2 */
|
||||
#define OMAP3430_CLKTRCTRL_IVA2_SHIFT 0
|
||||
#define OMAP3430_CLKTRCTRL_IVA2_MASK (0x3 << 0)
|
||||
|
||||
/* CM_CLKSTST_IVA2 */
|
||||
#define OMAP3430_CLKACTIVITY_IVA2 (1 << 0)
|
||||
|
||||
/* CM_REVISION specific bits */
|
||||
|
||||
/* CM_SYSCONFIG specific bits */
|
||||
|
||||
/* CM_CLKEN_PLL_MPU */
|
||||
#define OMAP3430_MPU_DPLL_RAMPTIME_SHIFT 8
|
||||
#define OMAP3430_MPU_DPLL_RAMPTIME_MASK (0x3 << 8)
|
||||
#define OMAP3430_MPU_DPLL_FREQSEL_SHIFT 4
|
||||
#define OMAP3430_MPU_DPLL_FREQSEL_MASK (0xf << 4)
|
||||
#define OMAP3430_EN_MPU_DPLL_DRIFTGUARD_SHIFT 3
|
||||
#define OMAP3430_EN_MPU_DPLL_DRIFTGUARD_MASK (1 << 3)
|
||||
#define OMAP3430_EN_MPU_DPLL_SHIFT 0
|
||||
#define OMAP3430_EN_MPU_DPLL_MASK (0x7 << 0)
|
||||
|
||||
/* CM_IDLEST_MPU */
|
||||
#define OMAP3430_ST_MPU (1 << 0)
|
||||
|
||||
/* CM_IDLEST_PLL_MPU */
|
||||
#define OMAP3430_ST_MPU_CLK (1 << 0)
|
||||
#define OMAP3430_ST_IVA2_CLK_MASK (1 << 0)
|
||||
|
||||
/* CM_IDLEST_PLL_MPU */
|
||||
#define OMAP3430_ST_MPU_CLK_MASK (1 << 0)
|
||||
|
||||
/* CM_AUTOIDLE_PLL_MPU */
|
||||
#define OMAP3430_AUTO_MPU_DPLL_SHIFT 0
|
||||
#define OMAP3430_AUTO_MPU_DPLL_MASK (0x7 << 0)
|
||||
|
||||
/* CM_CLKSEL1_PLL_MPU */
|
||||
#define OMAP3430_MPU_CLK_SRC_SHIFT 19
|
||||
#define OMAP3430_MPU_CLK_SRC_MASK (0x3 << 19)
|
||||
#define OMAP3430_MPU_DPLL_MULT_SHIFT 8
|
||||
#define OMAP3430_MPU_DPLL_MULT_MASK (0x7ff << 8)
|
||||
#define OMAP3430_MPU_DPLL_DIV_SHIFT 0
|
||||
#define OMAP3430_MPU_DPLL_DIV_MASK (0x7f << 0)
|
||||
|
||||
/* CM_CLKSEL2_PLL_MPU */
|
||||
#define OMAP3430_MPU_DPLL_CLKOUT_DIV_SHIFT 0
|
||||
#define OMAP3430_MPU_DPLL_CLKOUT_DIV_MASK (0x1f << 0)
|
||||
|
||||
/* CM_CLKSTCTRL_MPU */
|
||||
#define OMAP3430_CLKTRCTRL_MPU_SHIFT 0
|
||||
#define OMAP3430_CLKTRCTRL_MPU_MASK (0x3 << 0)
|
||||
|
||||
/* CM_CLKSTST_MPU */
|
||||
#define OMAP3430_CLKACTIVITY_MPU (1 << 0)
|
||||
|
||||
/* CM_FCLKEN1_CORE specific bits */
|
||||
|
||||
/* CM_ICLKEN1_CORE specific bits */
|
||||
#define OMAP3430_EN_ICR (1 << 29)
|
||||
#define OMAP3430_EN_ICR_SHIFT 29
|
||||
#define OMAP3430_EN_AES2 (1 << 28)
|
||||
#define OMAP3430_EN_AES2_SHIFT 28
|
||||
#define OMAP3430_EN_SHA12 (1 << 27)
|
||||
#define OMAP3430_EN_SHA12_SHIFT 27
|
||||
#define OMAP3430_EN_DES2 (1 << 26)
|
||||
#define OMAP3430_EN_DES2_SHIFT 26
|
||||
#define OMAP3430ES1_EN_FAC (1 << 8)
|
||||
#define OMAP3430ES1_EN_FAC_SHIFT 8
|
||||
#define OMAP3430_EN_MAILBOXES (1 << 7)
|
||||
#define OMAP3430_EN_MAILBOXES_SHIFT 7
|
||||
#define OMAP3430_EN_OMAPCTRL (1 << 6)
|
||||
#define OMAP3430_EN_OMAPCTRL_SHIFT 6
|
||||
#define OMAP3430_EN_SDRC (1 << 1)
|
||||
#define OMAP3430_EN_SDRC_SHIFT 1
|
||||
|
||||
/* CM_ICLKEN2_CORE */
|
||||
#define OMAP3430_EN_PKA (1 << 4)
|
||||
#define OMAP3430_EN_PKA_SHIFT 4
|
||||
#define OMAP3430_EN_AES1 (1 << 3)
|
||||
#define OMAP3430_EN_AES1_SHIFT 3
|
||||
#define OMAP3430_EN_RNG (1 << 2)
|
||||
#define OMAP3430_EN_RNG_SHIFT 2
|
||||
#define OMAP3430_EN_SHA11 (1 << 1)
|
||||
#define OMAP3430_EN_SHA11_SHIFT 1
|
||||
#define OMAP3430_EN_DES1 (1 << 0)
|
||||
#define OMAP3430_EN_DES1_SHIFT 0
|
||||
|
||||
/* CM_FCLKEN3_CORE specific bits */
|
||||
#define OMAP3430ES2_EN_TS_SHIFT 1
|
||||
#define OMAP3430ES2_EN_TS_MASK (1 << 1)
|
||||
#define OMAP3430ES2_EN_CPEFUSE_SHIFT 0
|
||||
#define OMAP3430ES2_EN_CPEFUSE_MASK (1 << 0)
|
||||
|
||||
/* CM_IDLEST1_CORE specific bits */
|
||||
#define OMAP3430_ST_ICR (1 << 29)
|
||||
#define OMAP3430_ST_AES2 (1 << 28)
|
||||
#define OMAP3430_ST_SHA12 (1 << 27)
|
||||
#define OMAP3430_ST_DES2 (1 << 26)
|
||||
#define OMAP3430_ST_MSPRO (1 << 23)
|
||||
#define OMAP3430_ST_HDQ (1 << 22)
|
||||
#define OMAP3430ES1_ST_FAC (1 << 8)
|
||||
#define OMAP3430ES1_ST_MAILBOXES (1 << 7)
|
||||
#define OMAP3430_ST_OMAPCTRL (1 << 6)
|
||||
#define OMAP3430_ST_SDMA (1 << 2)
|
||||
#define OMAP3430_ST_SDRC (1 << 1)
|
||||
#define OMAP3430_ST_SSI (1 << 0)
|
||||
|
||||
/* CM_IDLEST2_CORE */
|
||||
#define OMAP3430_ST_PKA (1 << 4)
|
||||
#define OMAP3430_ST_AES1 (1 << 3)
|
||||
#define OMAP3430_ST_RNG (1 << 2)
|
||||
#define OMAP3430_ST_SHA11 (1 << 1)
|
||||
#define OMAP3430_ST_DES1 (1 << 0)
|
||||
|
||||
/* CM_IDLEST3_CORE */
|
||||
#define OMAP3430ES2_ST_USBTLL_SHIFT 2
|
||||
#define OMAP3430ES2_ST_USBTLL_MASK (1 << 2)
|
||||
|
||||
/* CM_AUTOIDLE1_CORE */
|
||||
#define OMAP3430_AUTO_AES2 (1 << 28)
|
||||
#define OMAP3430_AUTO_AES2_SHIFT 28
|
||||
#define OMAP3430_AUTO_SHA12 (1 << 27)
|
||||
#define OMAP3430_AUTO_SHA12_SHIFT 27
|
||||
#define OMAP3430_AUTO_DES2 (1 << 26)
|
||||
#define OMAP3430_AUTO_DES2_SHIFT 26
|
||||
#define OMAP3430_AUTO_MMC2 (1 << 25)
|
||||
#define OMAP3430_AUTO_MMC2_SHIFT 25
|
||||
#define OMAP3430_AUTO_MMC1 (1 << 24)
|
||||
#define OMAP3430_AUTO_MMC1_SHIFT 24
|
||||
#define OMAP3430_AUTO_MSPRO (1 << 23)
|
||||
#define OMAP3430_AUTO_MSPRO_SHIFT 23
|
||||
#define OMAP3430_AUTO_HDQ (1 << 22)
|
||||
#define OMAP3430_AUTO_HDQ_SHIFT 22
|
||||
#define OMAP3430_AUTO_MCSPI4 (1 << 21)
|
||||
#define OMAP3430_AUTO_MCSPI4_SHIFT 21
|
||||
#define OMAP3430_AUTO_MCSPI3 (1 << 20)
|
||||
#define OMAP3430_AUTO_MCSPI3_SHIFT 20
|
||||
#define OMAP3430_AUTO_MCSPI2 (1 << 19)
|
||||
#define OMAP3430_AUTO_MCSPI2_SHIFT 19
|
||||
#define OMAP3430_AUTO_MCSPI1 (1 << 18)
|
||||
#define OMAP3430_AUTO_MCSPI1_SHIFT 18
|
||||
#define OMAP3430_AUTO_I2C3 (1 << 17)
|
||||
#define OMAP3430_AUTO_I2C3_SHIFT 17
|
||||
#define OMAP3430_AUTO_I2C2 (1 << 16)
|
||||
#define OMAP3430_AUTO_I2C2_SHIFT 16
|
||||
#define OMAP3430_AUTO_I2C1 (1 << 15)
|
||||
#define OMAP3430_AUTO_I2C1_SHIFT 15
|
||||
#define OMAP3430_AUTO_UART2 (1 << 14)
|
||||
#define OMAP3430_AUTO_UART2_SHIFT 14
|
||||
#define OMAP3430_AUTO_UART1 (1 << 13)
|
||||
#define OMAP3430_AUTO_UART1_SHIFT 13
|
||||
#define OMAP3430_AUTO_GPT11 (1 << 12)
|
||||
#define OMAP3430_AUTO_GPT11_SHIFT 12
|
||||
#define OMAP3430_AUTO_GPT10 (1 << 11)
|
||||
#define OMAP3430_AUTO_GPT10_SHIFT 11
|
||||
#define OMAP3430_AUTO_MCBSP5 (1 << 10)
|
||||
#define OMAP3430_AUTO_MCBSP5_SHIFT 10
|
||||
#define OMAP3430_AUTO_MCBSP1 (1 << 9)
|
||||
#define OMAP3430_AUTO_MCBSP1_SHIFT 9
|
||||
#define OMAP3430ES1_AUTO_FAC (1 << 8)
|
||||
#define OMAP3430ES1_AUTO_FAC_SHIFT 8
|
||||
#define OMAP3430_AUTO_MAILBOXES (1 << 7)
|
||||
#define OMAP3430_AUTO_MAILBOXES_SHIFT 7
|
||||
#define OMAP3430_AUTO_OMAPCTRL (1 << 6)
|
||||
#define OMAP3430_AUTO_OMAPCTRL_SHIFT 6
|
||||
#define OMAP3430ES1_AUTO_FSHOSTUSB (1 << 5)
|
||||
#define OMAP3430ES1_AUTO_FSHOSTUSB_SHIFT 5
|
||||
#define OMAP3430_AUTO_HSOTGUSB (1 << 4)
|
||||
#define OMAP3430_AUTO_HSOTGUSB_SHIFT 4
|
||||
#define OMAP3430ES1_AUTO_D2D (1 << 3)
|
||||
#define OMAP3430ES1_AUTO_D2D_SHIFT 3
|
||||
#define OMAP3430_AUTO_SSI (1 << 0)
|
||||
#define OMAP3430_AUTO_SSI_SHIFT 0
|
||||
|
||||
/* CM_AUTOIDLE2_CORE */
|
||||
#define OMAP3430_AUTO_PKA (1 << 4)
|
||||
#define OMAP3430_AUTO_PKA_SHIFT 4
|
||||
#define OMAP3430_AUTO_AES1 (1 << 3)
|
||||
#define OMAP3430_AUTO_AES1_SHIFT 3
|
||||
#define OMAP3430_AUTO_RNG (1 << 2)
|
||||
#define OMAP3430_AUTO_RNG_SHIFT 2
|
||||
#define OMAP3430_AUTO_SHA11 (1 << 1)
|
||||
#define OMAP3430_AUTO_SHA11_SHIFT 1
|
||||
#define OMAP3430_AUTO_DES1 (1 << 0)
|
||||
#define OMAP3430_AUTO_DES1_SHIFT 0
|
||||
|
||||
/* CM_AUTOIDLE3_CORE */
|
||||
#define OMAP3430ES2_AUTO_USBTLL_SHIFT 2
|
||||
#define OMAP3430ES2_AUTO_USBTLL_MASK (1 << 2)
|
||||
|
||||
/* CM_CLKSEL_CORE */
|
||||
#define OMAP3430_CLKSEL_SSI_SHIFT 8
|
||||
#define OMAP3430_CLKSEL_SSI_MASK (0xf << 8)
|
||||
#define OMAP3430_CLKSEL_GPT11_MASK (1 << 7)
|
||||
#define OMAP3430_CLKSEL_GPT11_SHIFT 7
|
||||
#define OMAP3430_CLKSEL_GPT10_MASK (1 << 6)
|
||||
#define OMAP3430_CLKSEL_GPT10_SHIFT 6
|
||||
#define OMAP3430ES1_CLKSEL_FSHOSTUSB_SHIFT 4
|
||||
#define OMAP3430ES1_CLKSEL_FSHOSTUSB_MASK (0x3 << 4)
|
||||
#define OMAP3430_CLKSEL_L4_SHIFT 2
|
||||
#define OMAP3430_CLKSEL_L4_MASK (0x3 << 2)
|
||||
#define OMAP3430_CLKSEL_L3_SHIFT 0
|
||||
#define OMAP3430_CLKSEL_L3_MASK (0x3 << 0)
|
||||
|
||||
/* CM_CLKSTCTRL_CORE */
|
||||
#define OMAP3430ES1_CLKTRCTRL_D2D_SHIFT 4
|
||||
#define OMAP3430ES1_CLKTRCTRL_D2D_MASK (0x3 << 4)
|
||||
#define OMAP3430_CLKTRCTRL_L4_SHIFT 2
|
||||
#define OMAP3430_CLKTRCTRL_L4_MASK (0x3 << 2)
|
||||
#define OMAP3430_CLKTRCTRL_L3_SHIFT 0
|
||||
#define OMAP3430_CLKTRCTRL_L3_MASK (0x3 << 0)
|
||||
|
||||
/* CM_CLKSTST_CORE */
|
||||
#define OMAP3430ES1_CLKACTIVITY_D2D (1 << 2)
|
||||
#define OMAP3430_CLKACTIVITY_L4 (1 << 1)
|
||||
#define OMAP3430_CLKACTIVITY_L3 (1 << 0)
|
||||
|
||||
/* CM_FCLKEN_GFX */
|
||||
#define OMAP3430ES1_EN_3D (1 << 2)
|
||||
#define OMAP3430ES1_EN_3D_SHIFT 2
|
||||
#define OMAP3430ES1_EN_2D (1 << 1)
|
||||
#define OMAP3430ES1_EN_2D_SHIFT 1
|
||||
|
||||
/* CM_ICLKEN_GFX specific bits */
|
||||
|
||||
/* CM_IDLEST_GFX specific bits */
|
||||
|
||||
/* CM_CLKSEL_GFX specific bits */
|
||||
|
||||
/* CM_SLEEPDEP_GFX specific bits */
|
||||
|
||||
/* CM_CLKSTCTRL_GFX */
|
||||
#define OMAP3430ES1_CLKTRCTRL_GFX_SHIFT 0
|
||||
#define OMAP3430ES1_CLKTRCTRL_GFX_MASK (0x3 << 0)
|
||||
|
||||
/* CM_CLKSTST_GFX */
|
||||
#define OMAP3430ES1_CLKACTIVITY_GFX (1 << 0)
|
||||
|
||||
/* CM_FCLKEN_SGX */
|
||||
#define OMAP3430ES2_EN_SGX_SHIFT 1
|
||||
#define OMAP3430ES2_EN_SGX_MASK (1 << 1)
|
||||
|
||||
/* CM_CLKSEL_SGX */
|
||||
#define OMAP3430ES2_CLKSEL_SGX_SHIFT 0
|
||||
#define OMAP3430ES2_CLKSEL_SGX_MASK (0x7 << 0)
|
||||
|
||||
/* CM_FCLKEN_WKUP specific bits */
|
||||
#define OMAP3430ES2_EN_USIMOCP_SHIFT 9
|
||||
|
||||
/* CM_ICLKEN_WKUP specific bits */
|
||||
#define OMAP3430_EN_WDT1 (1 << 4)
|
||||
#define OMAP3430_EN_WDT1_SHIFT 4
|
||||
#define OMAP3430_EN_32KSYNC (1 << 2)
|
||||
#define OMAP3430_EN_32KSYNC_SHIFT 2
|
||||
|
||||
/* CM_IDLEST_WKUP specific bits */
|
||||
#define OMAP3430_ST_WDT2 (1 << 5)
|
||||
#define OMAP3430_ST_WDT1 (1 << 4)
|
||||
#define OMAP3430_ST_32KSYNC (1 << 2)
|
||||
|
||||
/* CM_AUTOIDLE_WKUP */
|
||||
#define OMAP3430_AUTO_WDT2 (1 << 5)
|
||||
#define OMAP3430_AUTO_WDT2_SHIFT 5
|
||||
#define OMAP3430_AUTO_WDT1 (1 << 4)
|
||||
#define OMAP3430_AUTO_WDT1_SHIFT 4
|
||||
#define OMAP3430_AUTO_GPIO1 (1 << 3)
|
||||
#define OMAP3430_AUTO_GPIO1_SHIFT 3
|
||||
#define OMAP3430_AUTO_32KSYNC (1 << 2)
|
||||
#define OMAP3430_AUTO_32KSYNC_SHIFT 2
|
||||
#define OMAP3430_AUTO_GPT12 (1 << 1)
|
||||
#define OMAP3430_AUTO_GPT12_SHIFT 1
|
||||
#define OMAP3430_AUTO_GPT1 (1 << 0)
|
||||
#define OMAP3430_AUTO_GPT1_SHIFT 0
|
||||
|
||||
/* CM_CLKSEL_WKUP */
|
||||
#define OMAP3430ES2_CLKSEL_USIMOCP_MASK (0xf << 3)
|
||||
#define OMAP3430_CLKSEL_RM_SHIFT 1
|
||||
#define OMAP3430_CLKSEL_RM_MASK (0x3 << 1)
|
||||
#define OMAP3430_CLKSEL_GPT1_SHIFT 0
|
||||
#define OMAP3430_CLKSEL_GPT1_MASK (1 << 0)
|
||||
|
||||
/* CM_CLKEN_PLL */
|
||||
#define OMAP3430_PWRDN_EMU_PERIPH_SHIFT 31
|
||||
#define OMAP3430_PWRDN_CAM_SHIFT 30
|
||||
#define OMAP3430_PWRDN_DSS1_SHIFT 29
|
||||
#define OMAP3430_PWRDN_TV_SHIFT 28
|
||||
#define OMAP3430_PWRDN_96M_SHIFT 27
|
||||
#define OMAP3430_PERIPH_DPLL_RAMPTIME_SHIFT 24
|
||||
#define OMAP3430_PERIPH_DPLL_RAMPTIME_MASK (0x3 << 24)
|
||||
#define OMAP3430_PERIPH_DPLL_FREQSEL_SHIFT 20
|
||||
#define OMAP3430_PERIPH_DPLL_FREQSEL_MASK (0xf << 20)
|
||||
#define OMAP3430_EN_PERIPH_DPLL_DRIFTGUARD_SHIFT 19
|
||||
#define OMAP3430_EN_PERIPH_DPLL_DRIFTGUARD_MASK (1 << 19)
|
||||
#define OMAP3430_EN_PERIPH_DPLL_SHIFT 16
|
||||
#define OMAP3430_EN_PERIPH_DPLL_MASK (0x7 << 16)
|
||||
#define OMAP3430_PWRDN_EMU_CORE_SHIFT 12
|
||||
#define OMAP3430_CORE_DPLL_RAMPTIME_SHIFT 8
|
||||
#define OMAP3430_CORE_DPLL_RAMPTIME_MASK (0x3 << 8)
|
||||
#define OMAP3430_CORE_DPLL_FREQSEL_SHIFT 4
|
||||
#define OMAP3430_CORE_DPLL_FREQSEL_MASK (0xf << 4)
|
||||
#define OMAP3430_EN_CORE_DPLL_DRIFTGUARD_SHIFT 3
|
||||
#define OMAP3430_EN_CORE_DPLL_DRIFTGUARD_MASK (1 << 3)
|
||||
#define OMAP3430_EN_CORE_DPLL_SHIFT 0
|
||||
#define OMAP3430_EN_CORE_DPLL_MASK (0x7 << 0)
|
||||
|
||||
/* CM_CLKEN2_PLL */
|
||||
#define OMAP3430ES2_EN_PERIPH2_DPLL_LPMODE_SHIFT 10
|
||||
#define OMAP3430ES2_PERIPH2_DPLL_RAMPTIME_MASK (0x3 << 8)
|
||||
#define OMAP3430ES2_PERIPH2_DPLL_FREQSEL_SHIFT 4
|
||||
#define OMAP3430ES2_PERIPH2_DPLL_FREQSEL_MASK (0xf << 4)
|
||||
#define OMAP3430ES2_EN_PERIPH2_DPLL_DRIFTGUARD_SHIFT 3
|
||||
#define OMAP3430ES2_EN_PERIPH2_DPLL_SHIFT 0
|
||||
#define OMAP3430ES2_EN_PERIPH2_DPLL_MASK (0x7 << 0)
|
||||
|
||||
/* CM_IDLEST_CKGEN */
|
||||
#define OMAP3430_ST_54M_CLK (1 << 5)
|
||||
#define OMAP3430_ST_12M_CLK (1 << 4)
|
||||
#define OMAP3430_ST_48M_CLK (1 << 3)
|
||||
#define OMAP3430_ST_96M_CLK (1 << 2)
|
||||
#define OMAP3430_ST_PERIPH_CLK (1 << 1)
|
||||
#define OMAP3430_ST_CORE_CLK (1 << 0)
|
||||
|
||||
/* CM_IDLEST2_CKGEN */
|
||||
#define OMAP3430ES2_ST_120M_CLK_SHIFT 1
|
||||
#define OMAP3430ES2_ST_120M_CLK_MASK (1 << 1)
|
||||
#define OMAP3430ES2_ST_PERIPH2_CLK_SHIFT 0
|
||||
#define OMAP3430ES2_ST_PERIPH2_CLK_MASK (1 << 0)
|
||||
|
||||
/* CM_AUTOIDLE_PLL */
|
||||
#define OMAP3430_AUTO_PERIPH_DPLL_SHIFT 3
|
||||
#define OMAP3430_AUTO_PERIPH_DPLL_MASK (0x7 << 3)
|
||||
#define OMAP3430_AUTO_CORE_DPLL_SHIFT 0
|
||||
#define OMAP3430_AUTO_CORE_DPLL_MASK (0x7 << 0)
|
||||
|
||||
/* CM_CLKSEL1_PLL */
|
||||
/* Note that OMAP3430_CORE_DPLL_CLKOUT_DIV_MASK was (0x3 << 27) on 3430ES1 */
|
||||
#define OMAP3430_CORE_DPLL_CLKOUT_DIV_SHIFT 27
|
||||
#define OMAP3430_CORE_DPLL_CLKOUT_DIV_MASK (0x1f << 27)
|
||||
#define OMAP3430_CORE_DPLL_MULT_SHIFT 16
|
||||
#define OMAP3430_CORE_DPLL_MULT_MASK (0x7ff << 16)
|
||||
#define OMAP3430_CORE_DPLL_DIV_SHIFT 8
|
||||
#define OMAP3430_CORE_DPLL_DIV_MASK (0x7f << 8)
|
||||
#define OMAP3430_SOURCE_54M (1 << 5)
|
||||
#define OMAP3430_SOURCE_48M (1 << 3)
|
||||
|
||||
/* CM_CLKSEL2_PLL */
|
||||
#define OMAP3430_PERIPH_DPLL_MULT_SHIFT 8
|
||||
#define OMAP3430_PERIPH_DPLL_MULT_MASK (0x7ff << 8)
|
||||
#define OMAP3430_PERIPH_DPLL_DIV_SHIFT 0
|
||||
#define OMAP3430_PERIPH_DPLL_DIV_MASK (0x7f << 0)
|
||||
|
||||
/* CM_CLKSEL3_PLL */
|
||||
#define OMAP3430_DIV_96M_SHIFT 0
|
||||
#define OMAP3430_DIV_96M_MASK (0x1f << 0)
|
||||
|
||||
/* CM_CLKSEL4_PLL */
|
||||
#define OMAP3430ES2_PERIPH2_DPLL_MULT_SHIFT 8
|
||||
#define OMAP3430ES2_PERIPH2_DPLL_MULT_MASK (0x7ff << 8)
|
||||
#define OMAP3430ES2_PERIPH2_DPLL_DIV_SHIFT 0
|
||||
#define OMAP3430ES2_PERIPH2_DPLL_DIV_MASK (0x7f << 0)
|
||||
|
||||
/* CM_CLKSEL5_PLL */
|
||||
#define OMAP3430ES2_DIV_120M_SHIFT 0
|
||||
#define OMAP3430ES2_DIV_120M_MASK (0x1f << 0)
|
||||
|
||||
/* CM_CLKOUT_CTRL */
|
||||
#define OMAP3430_CLKOUT2_EN_SHIFT 7
|
||||
#define OMAP3430_CLKOUT2_EN (1 << 7)
|
||||
#define OMAP3430_CLKOUT2_DIV_SHIFT 3
|
||||
#define OMAP3430_CLKOUT2_DIV_MASK (0x7 << 3)
|
||||
#define OMAP3430_CLKOUT2SOURCE_SHIFT 0
|
||||
#define OMAP3430_CLKOUT2SOURCE_MASK (0x3 << 0)
|
||||
|
||||
/* CM_FCLKEN_DSS */
|
||||
#define OMAP3430_EN_TV (1 << 2)
|
||||
#define OMAP3430_EN_TV_SHIFT 2
|
||||
#define OMAP3430_EN_DSS2 (1 << 1)
|
||||
#define OMAP3430_EN_DSS2_SHIFT 1
|
||||
#define OMAP3430_EN_DSS1 (1 << 0)
|
||||
#define OMAP3430_EN_DSS1_SHIFT 0
|
||||
|
||||
/* CM_ICLKEN_DSS */
|
||||
#define OMAP3430_CM_ICLKEN_DSS_EN_DSS (1 << 0)
|
||||
#define OMAP3430_CM_ICLKEN_DSS_EN_DSS_SHIFT 0
|
||||
|
||||
/* CM_IDLEST_DSS */
|
||||
#define OMAP3430_ST_DSS (1 << 0)
|
||||
|
||||
/* CM_AUTOIDLE_DSS */
|
||||
#define OMAP3430_AUTO_DSS (1 << 0)
|
||||
#define OMAP3430_AUTO_DSS_SHIFT 0
|
||||
|
||||
/* CM_CLKSEL_DSS */
|
||||
#define OMAP3430_CLKSEL_TV_SHIFT 8
|
||||
#define OMAP3430_CLKSEL_TV_MASK (0x1f << 8)
|
||||
#define OMAP3430_CLKSEL_DSS1_SHIFT 0
|
||||
#define OMAP3430_CLKSEL_DSS1_MASK (0x1f << 0)
|
||||
|
||||
/* CM_SLEEPDEP_DSS specific bits */
|
||||
|
||||
/* CM_CLKSTCTRL_DSS */
|
||||
#define OMAP3430_CLKTRCTRL_DSS_SHIFT 0
|
||||
#define OMAP3430_CLKTRCTRL_DSS_MASK (0x3 << 0)
|
||||
|
||||
/* CM_CLKSTST_DSS */
|
||||
#define OMAP3430_CLKACTIVITY_DSS (1 << 0)
|
||||
|
||||
/* CM_FCLKEN_CAM specific bits */
|
||||
|
||||
/* CM_ICLKEN_CAM specific bits */
|
||||
|
||||
/* CM_IDLEST_CAM */
|
||||
#define OMAP3430_ST_CAM (1 << 0)
|
||||
|
||||
/* CM_AUTOIDLE_CAM */
|
||||
#define OMAP3430_AUTO_CAM (1 << 0)
|
||||
#define OMAP3430_AUTO_CAM_SHIFT 0
|
||||
|
||||
/* CM_CLKSEL_CAM */
|
||||
#define OMAP3430_CLKSEL_CAM_SHIFT 0
|
||||
#define OMAP3430_CLKSEL_CAM_MASK (0x1f << 0)
|
||||
|
||||
/* CM_SLEEPDEP_CAM specific bits */
|
||||
|
||||
/* CM_CLKSTCTRL_CAM */
|
||||
#define OMAP3430_CLKTRCTRL_CAM_SHIFT 0
|
||||
#define OMAP3430_CLKTRCTRL_CAM_MASK (0x3 << 0)
|
||||
|
||||
/* CM_CLKSTST_CAM */
|
||||
#define OMAP3430_CLKACTIVITY_CAM (1 << 0)
|
||||
|
||||
/* CM_FCLKEN_PER specific bits */
|
||||
|
||||
/* CM_ICLKEN_PER specific bits */
|
||||
|
||||
/* CM_IDLEST_PER */
|
||||
#define OMAP3430_ST_WDT3 (1 << 12)
|
||||
#define OMAP3430_ST_MCBSP4 (1 << 2)
|
||||
#define OMAP3430_ST_MCBSP3 (1 << 1)
|
||||
#define OMAP3430_ST_MCBSP2 (1 << 0)
|
||||
|
||||
/* CM_AUTOIDLE_PER */
|
||||
#define OMAP3430_AUTO_GPIO6 (1 << 17)
|
||||
#define OMAP3430_AUTO_GPIO6_SHIFT 17
|
||||
#define OMAP3430_AUTO_GPIO5 (1 << 16)
|
||||
#define OMAP3430_AUTO_GPIO5_SHIFT 16
|
||||
#define OMAP3430_AUTO_GPIO4 (1 << 15)
|
||||
#define OMAP3430_AUTO_GPIO4_SHIFT 15
|
||||
#define OMAP3430_AUTO_GPIO3 (1 << 14)
|
||||
#define OMAP3430_AUTO_GPIO3_SHIFT 14
|
||||
#define OMAP3430_AUTO_GPIO2 (1 << 13)
|
||||
#define OMAP3430_AUTO_GPIO2_SHIFT 13
|
||||
#define OMAP3430_AUTO_WDT3 (1 << 12)
|
||||
#define OMAP3430_AUTO_WDT3_SHIFT 12
|
||||
#define OMAP3430_AUTO_UART3 (1 << 11)
|
||||
#define OMAP3430_AUTO_UART3_SHIFT 11
|
||||
#define OMAP3430_AUTO_GPT9 (1 << 10)
|
||||
#define OMAP3430_AUTO_GPT9_SHIFT 10
|
||||
#define OMAP3430_AUTO_GPT8 (1 << 9)
|
||||
#define OMAP3430_AUTO_GPT8_SHIFT 9
|
||||
#define OMAP3430_AUTO_GPT7 (1 << 8)
|
||||
#define OMAP3430_AUTO_GPT7_SHIFT 8
|
||||
#define OMAP3430_AUTO_GPT6 (1 << 7)
|
||||
#define OMAP3430_AUTO_GPT6_SHIFT 7
|
||||
#define OMAP3430_AUTO_GPT5 (1 << 6)
|
||||
#define OMAP3430_AUTO_GPT5_SHIFT 6
|
||||
#define OMAP3430_AUTO_GPT4 (1 << 5)
|
||||
#define OMAP3430_AUTO_GPT4_SHIFT 5
|
||||
#define OMAP3430_AUTO_GPT3 (1 << 4)
|
||||
#define OMAP3430_AUTO_GPT3_SHIFT 4
|
||||
#define OMAP3430_AUTO_GPT2 (1 << 3)
|
||||
#define OMAP3430_AUTO_GPT2_SHIFT 3
|
||||
#define OMAP3430_AUTO_MCBSP4 (1 << 2)
|
||||
#define OMAP3430_AUTO_MCBSP4_SHIFT 2
|
||||
#define OMAP3430_AUTO_MCBSP3 (1 << 1)
|
||||
#define OMAP3430_AUTO_MCBSP3_SHIFT 1
|
||||
#define OMAP3430_AUTO_MCBSP2 (1 << 0)
|
||||
#define OMAP3430_AUTO_MCBSP2_SHIFT 0
|
||||
|
||||
/* CM_CLKSEL_PER */
|
||||
#define OMAP3430_CLKSEL_GPT9_MASK (1 << 7)
|
||||
#define OMAP3430_CLKSEL_GPT9_SHIFT 7
|
||||
#define OMAP3430_CLKSEL_GPT8_MASK (1 << 6)
|
||||
#define OMAP3430_CLKSEL_GPT8_SHIFT 6
|
||||
#define OMAP3430_CLKSEL_GPT7_MASK (1 << 5)
|
||||
#define OMAP3430_CLKSEL_GPT7_SHIFT 5
|
||||
#define OMAP3430_CLKSEL_GPT6_MASK (1 << 4)
|
||||
#define OMAP3430_CLKSEL_GPT6_SHIFT 4
|
||||
#define OMAP3430_CLKSEL_GPT5_MASK (1 << 3)
|
||||
#define OMAP3430_CLKSEL_GPT5_SHIFT 3
|
||||
#define OMAP3430_CLKSEL_GPT4_MASK (1 << 2)
|
||||
#define OMAP3430_CLKSEL_GPT4_SHIFT 2
|
||||
#define OMAP3430_CLKSEL_GPT3_MASK (1 << 1)
|
||||
#define OMAP3430_CLKSEL_GPT3_SHIFT 1
|
||||
#define OMAP3430_CLKSEL_GPT2_MASK (1 << 0)
|
||||
#define OMAP3430_CLKSEL_GPT2_SHIFT 0
|
||||
|
||||
/* CM_SLEEPDEP_PER specific bits */
|
||||
#define OMAP3430_CM_SLEEPDEP_PER_EN_IVA2 (1 << 2)
|
||||
|
||||
/* CM_CLKSTCTRL_PER */
|
||||
#define OMAP3430_CLKTRCTRL_PER_SHIFT 0
|
||||
#define OMAP3430_CLKTRCTRL_PER_MASK (0x3 << 0)
|
||||
|
||||
/* CM_CLKSTST_PER */
|
||||
#define OMAP3430_CLKACTIVITY_PER (1 << 0)
|
||||
|
||||
/* CM_CLKSEL1_EMU */
|
||||
#define OMAP3430_DIV_DPLL4_SHIFT 24
|
||||
#define OMAP3430_DIV_DPLL4_MASK (0x1f << 24)
|
||||
#define OMAP3430_DIV_DPLL3_SHIFT 16
|
||||
#define OMAP3430_DIV_DPLL3_MASK (0x1f << 16)
|
||||
#define OMAP3430_CLKSEL_TRACECLK_SHIFT 11
|
||||
#define OMAP3430_CLKSEL_TRACECLK_MASK (0x7 << 11)
|
||||
#define OMAP3430_CLKSEL_PCLK_SHIFT 8
|
||||
#define OMAP3430_CLKSEL_PCLK_MASK (0x7 << 8)
|
||||
#define OMAP3430_CLKSEL_PCLKX2_SHIFT 6
|
||||
#define OMAP3430_CLKSEL_PCLKX2_MASK (0x3 << 6)
|
||||
#define OMAP3430_CLKSEL_ATCLK_SHIFT 4
|
||||
#define OMAP3430_CLKSEL_ATCLK_MASK (0x3 << 4)
|
||||
#define OMAP3430_TRACE_MUX_CTRL_SHIFT 2
|
||||
#define OMAP3430_TRACE_MUX_CTRL_MASK (0x3 << 2)
|
||||
#define OMAP3430_MUX_CTRL_SHIFT 0
|
||||
#define OMAP3430_MUX_CTRL_MASK (0x3 << 0)
|
||||
|
||||
/* CM_CLKSTCTRL_EMU */
|
||||
#define OMAP3430_CLKTRCTRL_EMU_SHIFT 0
|
||||
#define OMAP3430_CLKTRCTRL_EMU_MASK (0x3 << 0)
|
||||
|
||||
/* CM_CLKSTST_EMU */
|
||||
#define OMAP3430_CLKACTIVITY_EMU (1 << 0)
|
||||
|
||||
/* CM_CLKSEL2_EMU specific bits */
|
||||
#define OMAP3430_CORE_DPLL_EMU_MULT_SHIFT 8
|
||||
#define OMAP3430_CORE_DPLL_EMU_MULT_MASK (0x7ff << 8)
|
||||
#define OMAP3430_CORE_DPLL_EMU_DIV_SHIFT 0
|
||||
#define OMAP3430_CORE_DPLL_EMU_DIV_MASK (0x7f << 0)
|
||||
|
||||
/* CM_CLKSEL3_EMU specific bits */
|
||||
#define OMAP3430_PERIPH_DPLL_EMU_MULT_SHIFT 8
|
||||
#define OMAP3430_PERIPH_DPLL_EMU_MULT_MASK (0x7ff << 8)
|
||||
#define OMAP3430_PERIPH_DPLL_EMU_DIV_SHIFT 0
|
||||
#define OMAP3430_PERIPH_DPLL_EMU_DIV_MASK (0x7f << 0)
|
||||
|
||||
/* CM_POLCTRL */
|
||||
#define OMAP3430_CLKOUT2_POL (1 << 0)
|
||||
|
||||
/* CM_IDLEST_NEON */
|
||||
#define OMAP3430_ST_NEON (1 << 0)
|
||||
|
||||
/* CM_CLKSTCTRL_NEON */
|
||||
#define OMAP3430_CLKTRCTRL_NEON_SHIFT 0
|
||||
#define OMAP3430_CLKTRCTRL_NEON_MASK (0x3 << 0)
|
||||
|
||||
/* CM_FCLKEN_USBHOST */
|
||||
#define OMAP3430ES2_EN_USBHOST2_SHIFT 1
|
||||
#define OMAP3430ES2_EN_USBHOST2_MASK (1 << 1)
|
||||
#define OMAP3430ES2_EN_USBHOST1_SHIFT 0
|
||||
#define OMAP3430ES2_EN_USBHOST1_MASK (1 << 0)
|
||||
|
||||
/* CM_ICLKEN_USBHOST */
|
||||
#define OMAP3430ES2_EN_USBHOST_SHIFT 0
|
||||
#define OMAP3430ES2_EN_USBHOST_MASK (1 << 0)
|
||||
|
||||
/* CM_IDLEST_USBHOST */
|
||||
|
||||
/* CM_AUTOIDLE_USBHOST */
|
||||
#define OMAP3430ES2_AUTO_USBHOST_SHIFT 0
|
||||
#define OMAP3430ES2_AUTO_USBHOST_MASK (1 << 0)
|
||||
|
||||
/* CM_SLEEPDEP_USBHOST */
|
||||
#define OMAP3430ES2_EN_MPU_SHIFT 1
|
||||
#define OMAP3430ES2_EN_MPU_MASK (1 << 1)
|
||||
#define OMAP3430ES2_EN_IVA2_SHIFT 2
|
||||
#define OMAP3430ES2_EN_IVA2_MASK (1 << 2)
|
||||
|
||||
/* CM_CLKSTCTRL_USBHOST */
|
||||
#define OMAP3430ES2_CLKTRCTRL_USBHOST_SHIFT 0
|
||||
#define OMAP3430ES2_CLKTRCTRL_USBHOST_MASK (3 << 0)
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,124 @@
|
||||
#ifndef __ARCH_ASM_MACH_OMAP2_CM_H
|
||||
#define __ARCH_ASM_MACH_OMAP2_CM_H
|
||||
|
||||
/*
|
||||
* OMAP2/3 Clock Management (CM) register definitions
|
||||
*
|
||||
* Copyright (C) 2007-2008 Texas Instruments, Inc.
|
||||
* Copyright (C) 2007-2008 Nokia Corporation
|
||||
*
|
||||
* Written by Paul Walmsley
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include "prcm-common.h"
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
#define OMAP_CM_REGADDR(module, reg) \
|
||||
(void __iomem *)IO_ADDRESS(OMAP2_CM_BASE + (module) + (reg))
|
||||
#else
|
||||
#define OMAP2420_CM_REGADDR(module, reg) \
|
||||
IO_ADDRESS(OMAP2420_CM_BASE + (module) + (reg))
|
||||
#define OMAP2430_CM_REGADDR(module, reg) \
|
||||
IO_ADDRESS(OMAP2430_CM_BASE + (module) + (reg))
|
||||
#define OMAP34XX_CM_REGADDR(module, reg) \
|
||||
IO_ADDRESS(OMAP3430_CM_BASE + (module) + (reg))
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Architecture-specific global CM registers
|
||||
* Use cm_{read,write}_reg() with these registers.
|
||||
* These registers appear once per CM module.
|
||||
*/
|
||||
|
||||
#define OMAP3430_CM_REVISION OMAP_CM_REGADDR(OCP_MOD, 0x0000)
|
||||
#define OMAP3430_CM_SYSCONFIG OMAP_CM_REGADDR(OCP_MOD, 0x0010)
|
||||
#define OMAP3430_CM_POLCTRL OMAP_CM_REGADDR(OCP_MOD, 0x009c)
|
||||
|
||||
#define OMAP3430_CM_CLKOUT_CTRL OMAP_CM_REGADDR(OMAP3430_CCR_MOD, 0x0070)
|
||||
|
||||
/*
|
||||
* Module specific CM registers from CM_BASE + domain offset
|
||||
* Use cm_{read,write}_mod_reg() with these registers.
|
||||
* These register offsets generally appear in more than one PRCM submodule.
|
||||
*/
|
||||
|
||||
/* Common between 24xx and 34xx */
|
||||
|
||||
#define CM_FCLKEN 0x0000
|
||||
#define CM_FCLKEN1 CM_FCLKEN
|
||||
#define CM_CLKEN CM_FCLKEN
|
||||
#define CM_ICLKEN 0x0010
|
||||
#define CM_ICLKEN1 CM_ICLKEN
|
||||
#define CM_ICLKEN2 0x0014
|
||||
#define CM_ICLKEN3 0x0018
|
||||
#define CM_IDLEST 0x0020
|
||||
#define CM_IDLEST1 CM_IDLEST
|
||||
#define CM_IDLEST2 0x0024
|
||||
#define CM_AUTOIDLE 0x0030
|
||||
#define CM_AUTOIDLE1 CM_AUTOIDLE
|
||||
#define CM_AUTOIDLE2 0x0034
|
||||
#define CM_AUTOIDLE3 0x0038
|
||||
#define CM_CLKSEL 0x0040
|
||||
#define CM_CLKSEL1 CM_CLKSEL
|
||||
#define CM_CLKSEL2 0x0044
|
||||
#define CM_CLKSTCTRL 0x0048
|
||||
|
||||
|
||||
/* Architecture-specific registers */
|
||||
|
||||
#define OMAP24XX_CM_FCLKEN2 0x0004
|
||||
#define OMAP24XX_CM_ICLKEN4 0x001c
|
||||
#define OMAP24XX_CM_AUTOIDLE4 0x003c
|
||||
|
||||
#define OMAP2430_CM_IDLEST3 0x0028
|
||||
|
||||
#define OMAP3430_CM_CLKEN_PLL 0x0004
|
||||
#define OMAP3430ES2_CM_CLKEN2 0x0004
|
||||
#define OMAP3430ES2_CM_FCLKEN3 0x0008
|
||||
#define OMAP3430_CM_IDLEST_PLL CM_IDLEST2
|
||||
#define OMAP3430_CM_AUTOIDLE_PLL CM_AUTOIDLE2
|
||||
#define OMAP3430_CM_CLKSEL1 CM_CLKSEL
|
||||
#define OMAP3430_CM_CLKSEL1_PLL CM_CLKSEL
|
||||
#define OMAP3430_CM_CLKSEL2_PLL CM_CLKSEL2
|
||||
#define OMAP3430_CM_SLEEPDEP CM_CLKSEL2
|
||||
#define OMAP3430_CM_CLKSEL3 CM_CLKSTCTRL
|
||||
#define OMAP3430_CM_CLKSTST 0x004c
|
||||
#define OMAP3430ES2_CM_CLKSEL4 0x004c
|
||||
#define OMAP3430ES2_CM_CLKSEL5 0x0050
|
||||
#define OMAP3430_CM_CLKSEL2_EMU 0x0050
|
||||
#define OMAP3430_CM_CLKSEL3_EMU 0x0054
|
||||
|
||||
|
||||
/* Clock management domain register get/set */
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
static inline void cm_write_mod_reg(u32 val, s16 module, s16 idx)
|
||||
{
|
||||
__raw_writel(val, OMAP_CM_REGADDR(module, idx));
|
||||
}
|
||||
|
||||
static inline u32 cm_read_mod_reg(s16 module, s16 idx)
|
||||
{
|
||||
return __raw_readl(OMAP_CM_REGADDR(module, idx));
|
||||
}
|
||||
#endif
|
||||
|
||||
/* CM register bits shared between 24XX and 3430 */
|
||||
|
||||
/* CM_CLKSEL_GFX */
|
||||
#define OMAP_CLKSEL_GFX_SHIFT 0
|
||||
#define OMAP_CLKSEL_GFX_MASK (0x7 << 0)
|
||||
|
||||
/* CM_ICLKEN_GFX */
|
||||
#define OMAP_EN_GFX_SHIFT 0
|
||||
#define OMAP_EN_GFX (1 << 0)
|
||||
|
||||
/* CM_IDLEST_GFX */
|
||||
#define OMAP_ST_GFX (1 << 0)
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,74 @@
|
||||
/*
|
||||
* OMAP2/3 System Control Module register access
|
||||
*
|
||||
* Copyright (C) 2007 Texas Instruments, Inc.
|
||||
* Copyright (C) 2007 Nokia Corporation
|
||||
*
|
||||
* Written by Paul Walmsley
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#undef DEBUG
|
||||
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
#include <asm/arch/control.h>
|
||||
|
||||
static u32 omap2_ctrl_base;
|
||||
|
||||
#define OMAP_CTRL_REGADDR(reg) (void __iomem *)IO_ADDRESS(omap2_ctrl_base \
|
||||
+ (reg))
|
||||
|
||||
void omap_ctrl_base_set(u32 base)
|
||||
{
|
||||
omap2_ctrl_base = base;
|
||||
}
|
||||
|
||||
u32 omap_ctrl_base_get(void)
|
||||
{
|
||||
return omap2_ctrl_base;
|
||||
}
|
||||
|
||||
u8 omap_ctrl_readb(u16 offset)
|
||||
{
|
||||
return __raw_readb(OMAP_CTRL_REGADDR(offset));
|
||||
}
|
||||
|
||||
u16 omap_ctrl_readw(u16 offset)
|
||||
{
|
||||
return __raw_readw(OMAP_CTRL_REGADDR(offset));
|
||||
}
|
||||
|
||||
u32 omap_ctrl_readl(u16 offset)
|
||||
{
|
||||
return __raw_readl(OMAP_CTRL_REGADDR(offset));
|
||||
}
|
||||
|
||||
void omap_ctrl_writeb(u8 val, u16 offset)
|
||||
{
|
||||
pr_debug("omap_ctrl_writeb: writing 0x%0x to 0x%0x\n", val,
|
||||
(u32)OMAP_CTRL_REGADDR(offset));
|
||||
|
||||
__raw_writeb(val, OMAP_CTRL_REGADDR(offset));
|
||||
}
|
||||
|
||||
void omap_ctrl_writew(u16 val, u16 offset)
|
||||
{
|
||||
pr_debug("omap_ctrl_writew: writing 0x%0x to 0x%0x\n", val,
|
||||
(u32)OMAP_CTRL_REGADDR(offset));
|
||||
|
||||
__raw_writew(val, OMAP_CTRL_REGADDR(offset));
|
||||
}
|
||||
|
||||
void omap_ctrl_writel(u32 val, u16 offset)
|
||||
{
|
||||
pr_debug("omap_ctrl_writel: writing 0x%0x to 0x%0x\n", val,
|
||||
(u32)OMAP_CTRL_REGADDR(offset));
|
||||
|
||||
__raw_writel(val, OMAP_CTRL_REGADDR(offset));
|
||||
}
|
||||
|
||||
@@ -69,7 +69,7 @@ static void __iomem *gpmc_base =
|
||||
static void __iomem *gpmc_cs_base =
|
||||
(void __iomem *) IO_ADDRESS(GPMC_BASE) + GPMC_CS0;
|
||||
|
||||
static struct clk *gpmc_l3_clk;
|
||||
static struct clk *gpmc_fck;
|
||||
|
||||
static void gpmc_write_reg(int idx, u32 val)
|
||||
{
|
||||
@@ -94,11 +94,10 @@ u32 gpmc_cs_read_reg(int cs, int idx)
|
||||
return __raw_readl(gpmc_cs_base + (cs * GPMC_CS_SIZE) + idx);
|
||||
}
|
||||
|
||||
/* TODO: Add support for gpmc_fck to clock framework and use it */
|
||||
unsigned long gpmc_get_fclk_period(void)
|
||||
{
|
||||
/* In picoseconds */
|
||||
return 1000000000 / ((clk_get_rate(gpmc_l3_clk)) / 1000);
|
||||
return 1000000000 / ((clk_get_rate(gpmc_fck)) / 1000);
|
||||
}
|
||||
|
||||
unsigned int gpmc_ns_to_ticks(unsigned int time_ns)
|
||||
@@ -398,8 +397,11 @@ void __init gpmc_init(void)
|
||||
{
|
||||
u32 l;
|
||||
|
||||
gpmc_l3_clk = clk_get(NULL, "core_l3_ck");
|
||||
BUG_ON(IS_ERR(gpmc_l3_clk));
|
||||
gpmc_fck = clk_get(NULL, "gpmc_fck"); /* Always on ENABLE_ON_INIT */
|
||||
if (IS_ERR(gpmc_fck))
|
||||
WARN_ON(1);
|
||||
else
|
||||
clk_enable(gpmc_fck);
|
||||
|
||||
l = gpmc_read_reg(GPMC_REVISION);
|
||||
printk(KERN_INFO "GPMC revision %d.%d\n", (l >> 4) & 0x0f, l & 0x0f);
|
||||
|
||||
@@ -27,11 +27,16 @@
|
||||
#include <asm/arch/clock.h>
|
||||
#include <asm/arch/sram.h>
|
||||
|
||||
#include "prcm-regs.h"
|
||||
#include "memory.h"
|
||||
#include "prm.h"
|
||||
|
||||
#include "memory.h"
|
||||
#include "sdrc.h"
|
||||
|
||||
unsigned long omap2_sdrc_base;
|
||||
unsigned long omap2_sms_base;
|
||||
|
||||
static struct memory_timings mem_timings;
|
||||
static u32 curr_perf_level = CORE_CLK_SRC_DPLL_X2;
|
||||
|
||||
u32 omap2_memory_get_slow_dll_ctrl(void)
|
||||
{
|
||||
@@ -48,12 +53,60 @@ u32 omap2_memory_get_type(void)
|
||||
return mem_timings.m_type;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check the DLL lock state, and return tue if running in unlock mode.
|
||||
* This is needed to compensate for the shifted DLL value in unlock mode.
|
||||
*/
|
||||
u32 omap2_dll_force_needed(void)
|
||||
{
|
||||
/* dlla and dllb are a set */
|
||||
u32 dll_state = sdrc_read_reg(SDRC_DLLA_CTRL);
|
||||
|
||||
if ((dll_state & (1 << 2)) == (1 << 2))
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* 'level' is the value to store to CM_CLKSEL2_PLL.CORE_CLK_SRC.
|
||||
* Practical values are CORE_CLK_SRC_DPLL (for CORE_CLK = DPLL_CLK) or
|
||||
* CORE_CLK_SRC_DPLL_X2 (for CORE_CLK = * DPLL_CLK * 2)
|
||||
*/
|
||||
u32 omap2_reprogram_sdrc(u32 level, u32 force)
|
||||
{
|
||||
u32 dll_ctrl, m_type;
|
||||
u32 prev = curr_perf_level;
|
||||
unsigned long flags;
|
||||
|
||||
if ((curr_perf_level == level) && !force)
|
||||
return prev;
|
||||
|
||||
if (level == CORE_CLK_SRC_DPLL) {
|
||||
dll_ctrl = omap2_memory_get_slow_dll_ctrl();
|
||||
} else if (level == CORE_CLK_SRC_DPLL_X2) {
|
||||
dll_ctrl = omap2_memory_get_fast_dll_ctrl();
|
||||
} else {
|
||||
return prev;
|
||||
}
|
||||
|
||||
m_type = omap2_memory_get_type();
|
||||
|
||||
local_irq_save(flags);
|
||||
__raw_writel(0xffff, OMAP24XX_PRCM_VOLTSETUP);
|
||||
omap2_sram_reprogram_sdrc(level, dll_ctrl, m_type);
|
||||
curr_perf_level = level;
|
||||
local_irq_restore(flags);
|
||||
|
||||
return prev;
|
||||
}
|
||||
|
||||
void omap2_init_memory_params(u32 force_lock_to_unlock_mode)
|
||||
{
|
||||
unsigned long dll_cnt;
|
||||
u32 fast_dll = 0;
|
||||
|
||||
mem_timings.m_type = !((SDRC_MR_0 & 0x3) == 0x1); /* DDR = 1, SDR = 0 */
|
||||
mem_timings.m_type = !((sdrc_read_reg(SDRC_MR_0) & 0x3) == 0x1); /* DDR = 1, SDR = 0 */
|
||||
|
||||
/* 2422 es2.05 and beyond has a single SIP DDR instead of 2 like others.
|
||||
* In the case of 2422, its ok to use CS1 instead of CS0.
|
||||
@@ -73,11 +126,11 @@ void omap2_init_memory_params(u32 force_lock_to_unlock_mode)
|
||||
mem_timings.dll_mode = M_LOCK;
|
||||
|
||||
if (mem_timings.base_cs == 0) {
|
||||
fast_dll = SDRC_DLLA_CTRL;
|
||||
dll_cnt = SDRC_DLLA_STATUS & 0xff00;
|
||||
fast_dll = sdrc_read_reg(SDRC_DLLA_CTRL);
|
||||
dll_cnt = sdrc_read_reg(SDRC_DLLA_STATUS) & 0xff00;
|
||||
} else {
|
||||
fast_dll = SDRC_DLLB_CTRL;
|
||||
dll_cnt = SDRC_DLLB_STATUS & 0xff00;
|
||||
fast_dll = sdrc_read_reg(SDRC_DLLB_CTRL);
|
||||
dll_cnt = sdrc_read_reg(SDRC_DLLB_STATUS) & 0xff00;
|
||||
}
|
||||
if (force_lock_to_unlock_mode) {
|
||||
fast_dll &= ~0xff00;
|
||||
@@ -106,14 +159,13 @@ void __init omap2_init_memory(void)
|
||||
{
|
||||
u32 l;
|
||||
|
||||
l = SMS_SYSCONFIG;
|
||||
l = sms_read_reg(SMS_SYSCONFIG);
|
||||
l &= ~(0x3 << 3);
|
||||
l |= (0x2 << 3);
|
||||
SMS_SYSCONFIG = l;
|
||||
sms_write_reg(l, SMS_SYSCONFIG);
|
||||
|
||||
l = SDRC_SYSCONFIG;
|
||||
l = sdrc_read_reg(SDRC_SYSCONFIG);
|
||||
l &= ~(0x3 << 3);
|
||||
l |= (0x2 << 3);
|
||||
SDRC_SYSCONFIG = l;
|
||||
|
||||
sdrc_write_reg(l, SDRC_SYSCONFIG);
|
||||
}
|
||||
|
||||
@@ -32,3 +32,5 @@ extern void omap2_init_memory_params(u32 force_lock_to_unlock_mode);
|
||||
extern u32 omap2_memory_get_slow_dll_ctrl(void);
|
||||
extern u32 omap2_memory_get_fast_dll_ctrl(void);
|
||||
extern u32 omap2_memory_get_type(void);
|
||||
u32 omap2_dll_force_needed(void);
|
||||
u32 omap2_reprogram_sdrc(u32 level, u32 force);
|
||||
|
||||
+112
-9
@@ -1,11 +1,12 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-omap2/mux.c
|
||||
*
|
||||
* OMAP1 pin multiplexing configurations
|
||||
* OMAP2 pin multiplexing configurations
|
||||
*
|
||||
* Copyright (C) 2003 - 2005 Nokia Corporation
|
||||
* Copyright (C) 2004 - 2008 Texas Instruments Inc.
|
||||
* Copyright (C) 2003 - 2008 Nokia Corporation
|
||||
*
|
||||
* Written by Tony Lindgren <tony.lindgren@nokia.com>
|
||||
* Written by Tony Lindgren
|
||||
*
|
||||
* 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
|
||||
@@ -28,13 +29,17 @@
|
||||
#include <asm/io.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
#include <asm/arch/control.h>
|
||||
#include <asm/arch/mux.h>
|
||||
|
||||
#ifdef CONFIG_OMAP_MUX
|
||||
|
||||
static struct omap_mux_cfg arch_mux_cfg;
|
||||
|
||||
/* NOTE: See mux.h for the enumeration */
|
||||
|
||||
struct pin_config __initdata_or_module omap24xx_pins[] = {
|
||||
#ifdef CONFIG_ARCH_OMAP24XX
|
||||
static struct pin_config __initdata_or_module omap24xx_pins[] = {
|
||||
/*
|
||||
* description mux mux pull pull debug
|
||||
* offset mode ena type
|
||||
@@ -77,7 +82,12 @@ MUX_CFG_24XX("AA12_242X_GPIO17", 0x0e9, 3, 0, 0, 1)
|
||||
MUX_CFG_24XX("AA8_242X_GPIO58", 0x0ea, 3, 0, 0, 1)
|
||||
MUX_CFG_24XX("Y20_24XX_GPIO60", 0x12c, 3, 0, 0, 1)
|
||||
MUX_CFG_24XX("W4__24XX_GPIO74", 0x0f2, 3, 0, 0, 1)
|
||||
MUX_CFG_24XX("N15_24XX_GPIO85", 0x103, 3, 0, 0, 1)
|
||||
MUX_CFG_24XX("M15_24XX_GPIO92", 0x10a, 3, 0, 0, 1)
|
||||
MUX_CFG_24XX("P20_24XX_GPIO93", 0x10b, 3, 0, 0, 1)
|
||||
MUX_CFG_24XX("P18_24XX_GPIO95", 0x10d, 3, 0, 0, 1)
|
||||
MUX_CFG_24XX("M18_24XX_GPIO96", 0x10e, 3, 0, 0, 1)
|
||||
MUX_CFG_24XX("L14_24XX_GPIO97", 0x10f, 3, 0, 0, 1)
|
||||
MUX_CFG_24XX("J15_24XX_GPIO99", 0x113, 3, 1, 1, 1)
|
||||
MUX_CFG_24XX("V14_24XX_GPIO117", 0x128, 3, 1, 0, 1)
|
||||
MUX_CFG_24XX("P14_24XX_GPIO125", 0x140, 3, 1, 1, 1)
|
||||
@@ -102,9 +112,6 @@ MUX_CFG_24XX("G4_242X_DMAREQ3", 0x073, 2, 0, 0, 1)
|
||||
MUX_CFG_24XX("D3_242X_DMAREQ4", 0x072, 2, 0, 0, 1)
|
||||
MUX_CFG_24XX("E3_242X_DMAREQ5", 0x071, 2, 0, 0, 1)
|
||||
|
||||
/* TSC IRQ */
|
||||
MUX_CFG_24XX("P20_24XX_TSC_IRQ", 0x108, 0, 0, 0, 1)
|
||||
|
||||
/* UART3 */
|
||||
MUX_CFG_24XX("K15_24XX_UART3_TX", 0x118, 0, 0, 0, 1)
|
||||
MUX_CFG_24XX("K14_24XX_UART3_RX", 0x119, 0, 0, 0, 1)
|
||||
@@ -167,12 +174,108 @@ MUX_CFG_24XX("B3__24XX_KBR5", 0x30, 3, 1, 1, 1)
|
||||
MUX_CFG_24XX("AA4_24XX_KBC2", 0xe7, 3, 0, 0, 1)
|
||||
MUX_CFG_24XX("B13_24XX_KBC6", 0x110, 3, 0, 0, 1)
|
||||
|
||||
/* 2430 USB */
|
||||
MUX_CFG_24XX("AD9_2430_USB0_PUEN", 0x133, 4, 0, 0, 1)
|
||||
MUX_CFG_24XX("Y11_2430_USB0_VP", 0x134, 4, 0, 0, 1)
|
||||
MUX_CFG_24XX("AD7_2430_USB0_VM", 0x135, 4, 0, 0, 1)
|
||||
MUX_CFG_24XX("AE7_2430_USB0_RCV", 0x136, 4, 0, 0, 1)
|
||||
MUX_CFG_24XX("AD4_2430_USB0_TXEN", 0x137, 4, 0, 0, 1)
|
||||
MUX_CFG_24XX("AF9_2430_USB0_SE0", 0x138, 4, 0, 0, 1)
|
||||
MUX_CFG_24XX("AE6_2430_USB0_DAT", 0x139, 4, 0, 0, 1)
|
||||
MUX_CFG_24XX("AD24_2430_USB1_SE0", 0x107, 2, 0, 0, 1)
|
||||
MUX_CFG_24XX("AB24_2430_USB1_RCV", 0x108, 2, 0, 0, 1)
|
||||
MUX_CFG_24XX("Y25_2430_USB1_TXEN", 0x109, 2, 0, 0, 1)
|
||||
MUX_CFG_24XX("AA26_2430_USB1_DAT", 0x10A, 2, 0, 0, 1)
|
||||
|
||||
/* 2430 HS-USB */
|
||||
MUX_CFG_24XX("AD9_2430_USB0HS_DATA3", 0x133, 0, 0, 0, 1)
|
||||
MUX_CFG_24XX("Y11_2430_USB0HS_DATA4", 0x134, 0, 0, 0, 1)
|
||||
MUX_CFG_24XX("AD7_2430_USB0HS_DATA5", 0x135, 0, 0, 0, 1)
|
||||
MUX_CFG_24XX("AE7_2430_USB0HS_DATA6", 0x136, 0, 0, 0, 1)
|
||||
MUX_CFG_24XX("AD4_2430_USB0HS_DATA2", 0x137, 0, 0, 0, 1)
|
||||
MUX_CFG_24XX("AF9_2430_USB0HS_DATA0", 0x138, 0, 0, 0, 1)
|
||||
MUX_CFG_24XX("AE6_2430_USB0HS_DATA1", 0x139, 0, 0, 0, 1)
|
||||
MUX_CFG_24XX("AE8_2430_USB0HS_CLK", 0x13A, 0, 0, 0, 1)
|
||||
MUX_CFG_24XX("AD8_2430_USB0HS_DIR", 0x13B, 0, 0, 0, 1)
|
||||
MUX_CFG_24XX("AE5_2430_USB0HS_STP", 0x13c, 0, 1, 1, 1)
|
||||
MUX_CFG_24XX("AE9_2430_USB0HS_NXT", 0x13D, 0, 0, 0, 1)
|
||||
MUX_CFG_24XX("AC7_2430_USB0HS_DATA7", 0x13E, 0, 0, 0, 1)
|
||||
|
||||
/* 2430 McBSP */
|
||||
MUX_CFG_24XX("AC10_2430_MCBSP2_FSX", 0x012E, 1, 0, 0, 1)
|
||||
MUX_CFG_24XX("AD16_2430_MCBSP2_CLX", 0x012F, 1, 0, 0, 1)
|
||||
MUX_CFG_24XX("AE13_2430_MCBSP2_DX", 0x0130, 1, 0, 0, 1)
|
||||
MUX_CFG_24XX("AD13_2430_MCBSP2_DR", 0x0131, 1, 0, 0, 1)
|
||||
MUX_CFG_24XX("AC10_2430_MCBSP2_FSX_OFF",0x012E, 0, 0, 0, 1)
|
||||
MUX_CFG_24XX("AD16_2430_MCBSP2_CLX_OFF",0x012F, 0, 0, 0, 1)
|
||||
MUX_CFG_24XX("AE13_2430_MCBSP2_DX_OFF", 0x0130, 0, 0, 0, 1)
|
||||
MUX_CFG_24XX("AD13_2430_MCBSP2_DR_OFF", 0x0131, 0, 0, 0, 1)
|
||||
};
|
||||
|
||||
#define OMAP24XX_PINS_SZ ARRAY_SIZE(omap24xx_pins)
|
||||
|
||||
#else
|
||||
#define omap24xx_pins NULL
|
||||
#define OMAP24XX_PINS_SZ 0
|
||||
#endif /* CONFIG_ARCH_OMAP24XX */
|
||||
|
||||
#define OMAP24XX_PULL_ENA (1 << 3)
|
||||
#define OMAP24XX_PULL_UP (1 << 4)
|
||||
|
||||
#if defined(CONFIG_OMAP_MUX_DEBUG) || defined(CONFIG_OMAP_MUX_WARNINGS)
|
||||
void __init_or_module omap2_cfg_debug(const struct pin_config *cfg, u8 reg)
|
||||
{
|
||||
u16 orig;
|
||||
u8 warn = 0, debug = 0;
|
||||
|
||||
orig = omap_ctrl_readb(cfg->mux_reg);
|
||||
|
||||
#ifdef CONFIG_OMAP_MUX_DEBUG
|
||||
debug = cfg->debug;
|
||||
#endif
|
||||
warn = (orig != reg);
|
||||
if (debug || warn)
|
||||
printk(KERN_WARNING
|
||||
"MUX: setup %s (0x%08x): 0x%02x -> 0x%02x\n",
|
||||
cfg->name, omap_ctrl_base_get() + cfg->mux_reg,
|
||||
orig, reg);
|
||||
}
|
||||
#else
|
||||
#define omap2_cfg_debug(x, y) do {} while (0)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP24XX
|
||||
int __init_or_module omap24xx_cfg_reg(const struct pin_config *cfg)
|
||||
{
|
||||
static DEFINE_SPINLOCK(mux_spin_lock);
|
||||
unsigned long flags;
|
||||
u8 reg = 0;
|
||||
|
||||
spin_lock_irqsave(&mux_spin_lock, flags);
|
||||
reg |= cfg->mask & 0x7;
|
||||
if (cfg->pull_val)
|
||||
reg |= OMAP24XX_PULL_ENA;
|
||||
if (cfg->pu_pd_val)
|
||||
reg |= OMAP24XX_PULL_UP;
|
||||
omap2_cfg_debug(cfg, reg);
|
||||
omap_ctrl_writeb(reg, cfg->mux_reg);
|
||||
spin_unlock_irqrestore(&mux_spin_lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
#define omap24xx_cfg_reg 0
|
||||
#endif
|
||||
|
||||
int __init omap2_mux_init(void)
|
||||
{
|
||||
omap_mux_register(omap24xx_pins, ARRAY_SIZE(omap24xx_pins));
|
||||
return 0;
|
||||
if (cpu_is_omap24xx()) {
|
||||
arch_mux_cfg.pins = omap24xx_pins;
|
||||
arch_mux_cfg.size = OMAP24XX_PINS_SZ;
|
||||
arch_mux_cfg.cfg_reg = omap24xx_cfg_reg;
|
||||
}
|
||||
|
||||
return omap_mux_register(&arch_mux_cfg);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,299 +0,0 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-omap2/pm-domain.c
|
||||
*
|
||||
* Power domain functions for OMAP2
|
||||
*
|
||||
* Copyright (C) 2006 Nokia Corporation
|
||||
* Tony Lindgren <tony@atomide.com>
|
||||
*
|
||||
* Some code based on earlier OMAP2 sample PM code
|
||||
* Copyright (C) 2005 Texas Instruments, Inc.
|
||||
* Richard Woodruff <r-woodruff2@ti.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/clk.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
|
||||
#include "prcm-regs.h"
|
||||
|
||||
/* Power domain offsets */
|
||||
#define PM_MPU_OFFSET 0x100
|
||||
#define PM_CORE_OFFSET 0x200
|
||||
#define PM_GFX_OFFSET 0x300
|
||||
#define PM_WKUP_OFFSET 0x400 /* Autoidle only */
|
||||
#define PM_PLL_OFFSET 0x500 /* Autoidle only */
|
||||
#define PM_DSP_OFFSET 0x800
|
||||
#define PM_MDM_OFFSET 0xc00
|
||||
|
||||
/* Power domain wake-up dependency control register */
|
||||
#define PM_WKDEP_OFFSET 0xc8
|
||||
#define EN_MDM (1 << 5)
|
||||
#define EN_WKUP (1 << 4)
|
||||
#define EN_GFX (1 << 3)
|
||||
#define EN_DSP (1 << 2)
|
||||
#define EN_MPU (1 << 1)
|
||||
#define EN_CORE (1 << 0)
|
||||
|
||||
/* Core power domain state transition control register */
|
||||
#define PM_PWSTCTRL_OFFSET 0xe0
|
||||
#define FORCESTATE (1 << 18) /* Only for DSP & GFX */
|
||||
#define MEM4RETSTATE (1 << 6)
|
||||
#define MEM3RETSTATE (1 << 5)
|
||||
#define MEM2RETSTATE (1 << 4)
|
||||
#define MEM1RETSTATE (1 << 3)
|
||||
#define LOGICRETSTATE (1 << 2) /* Logic is retained */
|
||||
#define POWERSTATE_OFF 0x3
|
||||
#define POWERSTATE_RETENTION 0x1
|
||||
#define POWERSTATE_ON 0x0
|
||||
|
||||
/* Power domain state register */
|
||||
#define PM_PWSTST_OFFSET 0xe4
|
||||
|
||||
/* Hardware supervised state transition control register */
|
||||
#define CM_CLKSTCTRL_OFFSET 0x48
|
||||
#define AUTOSTAT_MPU (1 << 0) /* MPU */
|
||||
#define AUTOSTAT_DSS (1 << 2) /* Core */
|
||||
#define AUTOSTAT_L4 (1 << 1) /* Core */
|
||||
#define AUTOSTAT_L3 (1 << 0) /* Core */
|
||||
#define AUTOSTAT_GFX (1 << 0) /* GFX */
|
||||
#define AUTOSTAT_IVA (1 << 8) /* 2420 IVA in DSP domain */
|
||||
#define AUTOSTAT_DSP (1 << 0) /* DSP */
|
||||
#define AUTOSTAT_MDM (1 << 0) /* MDM */
|
||||
|
||||
/* Automatic control of interface clock idling */
|
||||
#define CM_AUTOIDLE1_OFFSET 0x30
|
||||
#define CM_AUTOIDLE2_OFFSET 0x34 /* Core only */
|
||||
#define CM_AUTOIDLE3_OFFSET 0x38 /* Core only */
|
||||
#define CM_AUTOIDLE4_OFFSET 0x3c /* Core only */
|
||||
#define AUTO_54M(x) (((x) & 0x3) << 6)
|
||||
#define AUTO_96M(x) (((x) & 0x3) << 2)
|
||||
#define AUTO_DPLL(x) (((x) & 0x3) << 0)
|
||||
#define AUTO_STOPPED 0x3
|
||||
#define AUTO_BYPASS_FAST 0x2 /* DPLL only */
|
||||
#define AUTO_BYPASS_LOW_POWER 0x1 /* DPLL only */
|
||||
#define AUTO_DISABLED 0x0
|
||||
|
||||
/* Voltage control PRCM_VOLTCTRL bits */
|
||||
#define AUTO_EXTVOLT (1 << 15)
|
||||
#define FORCE_EXTVOLT (1 << 14)
|
||||
#define SETOFF_LEVEL(x) (((x) & 0x3) << 12)
|
||||
#define MEMRETCTRL (1 << 8)
|
||||
#define SETRET_LEVEL(x) (((x) & 0x3) << 6)
|
||||
#define VOLT_LEVEL(x) (((x) & 0x3) << 0)
|
||||
|
||||
#define OMAP24XX_PRCM_VBASE IO_ADDRESS(OMAP24XX_PRCM_BASE)
|
||||
#define prcm_readl(r) __raw_readl(OMAP24XX_PRCM_VBASE + (r))
|
||||
#define prcm_writel(v, r) __raw_writel((v), OMAP24XX_PRCM_VBASE + (r))
|
||||
|
||||
static u32 pmdomain_get_wakeup_dependencies(int domain_offset)
|
||||
{
|
||||
return prcm_readl(domain_offset + PM_WKDEP_OFFSET);
|
||||
}
|
||||
|
||||
static void pmdomain_set_wakeup_dependencies(u32 state, int domain_offset)
|
||||
{
|
||||
prcm_writel(state, domain_offset + PM_WKDEP_OFFSET);
|
||||
}
|
||||
|
||||
static u32 pmdomain_get_powerstate(int domain_offset)
|
||||
{
|
||||
return prcm_readl(domain_offset + PM_PWSTCTRL_OFFSET);
|
||||
}
|
||||
|
||||
static void pmdomain_set_powerstate(u32 state, int domain_offset)
|
||||
{
|
||||
prcm_writel(state, domain_offset + PM_PWSTCTRL_OFFSET);
|
||||
}
|
||||
|
||||
static u32 pmdomain_get_clock_autocontrol(int domain_offset)
|
||||
{
|
||||
return prcm_readl(domain_offset + CM_CLKSTCTRL_OFFSET);
|
||||
}
|
||||
|
||||
static void pmdomain_set_clock_autocontrol(u32 state, int domain_offset)
|
||||
{
|
||||
prcm_writel(state, domain_offset + CM_CLKSTCTRL_OFFSET);
|
||||
}
|
||||
|
||||
static u32 pmdomain_get_clock_autoidle1(int domain_offset)
|
||||
{
|
||||
return prcm_readl(domain_offset + CM_AUTOIDLE1_OFFSET);
|
||||
}
|
||||
|
||||
/* Core domain only */
|
||||
static u32 pmdomain_get_clock_autoidle2(int domain_offset)
|
||||
{
|
||||
return prcm_readl(domain_offset + CM_AUTOIDLE2_OFFSET);
|
||||
}
|
||||
|
||||
/* Core domain only */
|
||||
static u32 pmdomain_get_clock_autoidle3(int domain_offset)
|
||||
{
|
||||
return prcm_readl(domain_offset + CM_AUTOIDLE3_OFFSET);
|
||||
}
|
||||
|
||||
/* Core domain only */
|
||||
static u32 pmdomain_get_clock_autoidle4(int domain_offset)
|
||||
{
|
||||
return prcm_readl(domain_offset + CM_AUTOIDLE4_OFFSET);
|
||||
}
|
||||
|
||||
static void pmdomain_set_clock_autoidle1(u32 state, int domain_offset)
|
||||
{
|
||||
prcm_writel(state, CM_AUTOIDLE1_OFFSET + domain_offset);
|
||||
}
|
||||
|
||||
/* Core domain only */
|
||||
static void pmdomain_set_clock_autoidle2(u32 state, int domain_offset)
|
||||
{
|
||||
prcm_writel(state, CM_AUTOIDLE2_OFFSET + domain_offset);
|
||||
}
|
||||
|
||||
/* Core domain only */
|
||||
static void pmdomain_set_clock_autoidle3(u32 state, int domain_offset)
|
||||
{
|
||||
prcm_writel(state, CM_AUTOIDLE3_OFFSET + domain_offset);
|
||||
}
|
||||
|
||||
/* Core domain only */
|
||||
static void pmdomain_set_clock_autoidle4(u32 state, int domain_offset)
|
||||
{
|
||||
prcm_writel(state, CM_AUTOIDLE4_OFFSET + domain_offset);
|
||||
}
|
||||
|
||||
/*
|
||||
* Configures power management domains to idle clocks automatically.
|
||||
*/
|
||||
void pmdomain_set_autoidle(void)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
/* Set PLL auto stop for 54M, 96M & DPLL */
|
||||
pmdomain_set_clock_autoidle1(AUTO_54M(AUTO_STOPPED) |
|
||||
AUTO_96M(AUTO_STOPPED) |
|
||||
AUTO_DPLL(AUTO_STOPPED), PM_PLL_OFFSET);
|
||||
|
||||
/* External clock input control
|
||||
* REVISIT: Should this be in clock framework?
|
||||
*/
|
||||
PRCM_CLKSRC_CTRL |= (0x3 << 3);
|
||||
|
||||
/* Configure number of 32KHz clock cycles for sys_clk */
|
||||
PRCM_CLKSSETUP = 0x00ff;
|
||||
|
||||
/* Configure automatic voltage transition */
|
||||
PRCM_VOLTSETUP = 0;
|
||||
val = PRCM_VOLTCTRL;
|
||||
val &= ~(SETOFF_LEVEL(0x3) | VOLT_LEVEL(0x3));
|
||||
val |= SETOFF_LEVEL(1) | VOLT_LEVEL(1) | AUTO_EXTVOLT;
|
||||
PRCM_VOLTCTRL = val;
|
||||
|
||||
/* Disable emulation tools functional clock */
|
||||
PRCM_CLKEMUL_CTRL = 0x0;
|
||||
|
||||
/* Set core memory retention state */
|
||||
val = pmdomain_get_powerstate(PM_CORE_OFFSET);
|
||||
if (cpu_is_omap2420()) {
|
||||
val &= ~(0x7 << 3);
|
||||
val |= (MEM3RETSTATE | MEM2RETSTATE | MEM1RETSTATE);
|
||||
} else {
|
||||
val &= ~(0xf << 3);
|
||||
val |= (MEM4RETSTATE | MEM3RETSTATE | MEM2RETSTATE |
|
||||
MEM1RETSTATE);
|
||||
}
|
||||
pmdomain_set_powerstate(val, PM_CORE_OFFSET);
|
||||
|
||||
/* OCP interface smart idle. REVISIT: Enable autoidle bit0 ? */
|
||||
val = SMS_SYSCONFIG;
|
||||
val &= ~(0x3 << 3);
|
||||
val |= (0x2 << 3) | (1 << 0);
|
||||
SMS_SYSCONFIG |= val;
|
||||
|
||||
val = SDRC_SYSCONFIG;
|
||||
val &= ~(0x3 << 3);
|
||||
val |= (0x2 << 3);
|
||||
SDRC_SYSCONFIG = val;
|
||||
|
||||
/* Configure L3 interface for smart idle.
|
||||
* REVISIT: Enable autoidle bit0 ?
|
||||
*/
|
||||
val = GPMC_SYSCONFIG;
|
||||
val &= ~(0x3 << 3);
|
||||
val |= (0x2 << 3) | (1 << 0);
|
||||
GPMC_SYSCONFIG = val;
|
||||
|
||||
pmdomain_set_powerstate(LOGICRETSTATE | POWERSTATE_RETENTION,
|
||||
PM_MPU_OFFSET);
|
||||
pmdomain_set_powerstate(POWERSTATE_RETENTION, PM_CORE_OFFSET);
|
||||
if (!cpu_is_omap2420())
|
||||
pmdomain_set_powerstate(POWERSTATE_RETENTION, PM_MDM_OFFSET);
|
||||
|
||||
/* Assume suspend function has saved the state for DSP and GFX */
|
||||
pmdomain_set_powerstate(FORCESTATE | POWERSTATE_OFF, PM_DSP_OFFSET);
|
||||
pmdomain_set_powerstate(FORCESTATE | POWERSTATE_OFF, PM_GFX_OFFSET);
|
||||
|
||||
#if 0
|
||||
/* REVISIT: Internal USB needs special handling */
|
||||
force_standby_usb();
|
||||
if (cpu_is_omap2430())
|
||||
force_hsmmc();
|
||||
sdram_self_refresh_on_idle_req(1);
|
||||
#endif
|
||||
|
||||
/* Enable clock auto control for all domains.
|
||||
* Note that CORE domain includes also DSS, L4 & L3.
|
||||
*/
|
||||
pmdomain_set_clock_autocontrol(AUTOSTAT_MPU, PM_MPU_OFFSET);
|
||||
pmdomain_set_clock_autocontrol(AUTOSTAT_GFX, PM_GFX_OFFSET);
|
||||
pmdomain_set_clock_autocontrol(AUTOSTAT_DSS | AUTOSTAT_L4 | AUTOSTAT_L3,
|
||||
PM_CORE_OFFSET);
|
||||
if (cpu_is_omap2420())
|
||||
pmdomain_set_clock_autocontrol(AUTOSTAT_IVA | AUTOSTAT_DSP,
|
||||
PM_DSP_OFFSET);
|
||||
else {
|
||||
pmdomain_set_clock_autocontrol(AUTOSTAT_DSP, PM_DSP_OFFSET);
|
||||
pmdomain_set_clock_autocontrol(AUTOSTAT_MDM, PM_MDM_OFFSET);
|
||||
}
|
||||
|
||||
/* Enable clock autoidle for all domains */
|
||||
pmdomain_set_clock_autoidle1(0x2, PM_DSP_OFFSET);
|
||||
if (cpu_is_omap2420()) {
|
||||
pmdomain_set_clock_autoidle1(0xfffffff9, PM_CORE_OFFSET);
|
||||
pmdomain_set_clock_autoidle2(0x7, PM_CORE_OFFSET);
|
||||
pmdomain_set_clock_autoidle1(0x3f, PM_WKUP_OFFSET);
|
||||
} else {
|
||||
pmdomain_set_clock_autoidle1(0xeafffff1, PM_CORE_OFFSET);
|
||||
pmdomain_set_clock_autoidle2(0xfff, PM_CORE_OFFSET);
|
||||
pmdomain_set_clock_autoidle1(0x7f, PM_WKUP_OFFSET);
|
||||
pmdomain_set_clock_autoidle1(0x3, PM_MDM_OFFSET);
|
||||
}
|
||||
pmdomain_set_clock_autoidle3(0x7, PM_CORE_OFFSET);
|
||||
pmdomain_set_clock_autoidle4(0x1f, PM_CORE_OFFSET);
|
||||
}
|
||||
|
||||
/*
|
||||
* Initializes power domains by removing wake-up dependencies and powering
|
||||
* down DSP and GFX. Gets called from PM init. Note that DSP and IVA code
|
||||
* must re-enable DSP and GFX when used.
|
||||
*/
|
||||
void __init pmdomain_init(void)
|
||||
{
|
||||
/* Remove all domain wakeup dependencies */
|
||||
pmdomain_set_wakeup_dependencies(EN_WKUP | EN_CORE, PM_MPU_OFFSET);
|
||||
pmdomain_set_wakeup_dependencies(0, PM_DSP_OFFSET);
|
||||
pmdomain_set_wakeup_dependencies(0, PM_GFX_OFFSET);
|
||||
pmdomain_set_wakeup_dependencies(EN_WKUP | EN_MPU, PM_CORE_OFFSET);
|
||||
if (cpu_is_omap2430())
|
||||
pmdomain_set_wakeup_dependencies(0, PM_MDM_OFFSET);
|
||||
|
||||
/* Power down DSP and GFX */
|
||||
pmdomain_set_powerstate(POWERSTATE_OFF | FORCESTATE, PM_DSP_OFFSET);
|
||||
pmdomain_set_powerstate(POWERSTATE_OFF | FORCESTATE, PM_GFX_OFFSET);
|
||||
}
|
||||
+1
-269
@@ -23,6 +23,7 @@
|
||||
#include <linux/sysfs.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/clk.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
@@ -36,8 +37,6 @@
|
||||
#include <asm/arch/sram.h>
|
||||
#include <asm/arch/pm.h>
|
||||
|
||||
#include "prcm-regs.h"
|
||||
|
||||
static struct clk *vclk;
|
||||
static void (*omap2_sram_idle)(void);
|
||||
static void (*omap2_sram_suspend)(int dllctrl, int cpu_rev);
|
||||
@@ -78,251 +77,8 @@ static int omap2_pm_prepare(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define INT0_WAKE_MASK (OMAP_IRQ_BIT(INT_24XX_GPIO_BANK1) | \
|
||||
OMAP_IRQ_BIT(INT_24XX_GPIO_BANK2) | \
|
||||
OMAP_IRQ_BIT(INT_24XX_GPIO_BANK3))
|
||||
|
||||
#define INT1_WAKE_MASK (OMAP_IRQ_BIT(INT_24XX_GPIO_BANK4))
|
||||
|
||||
#define INT2_WAKE_MASK (OMAP_IRQ_BIT(INT_24XX_UART1_IRQ) | \
|
||||
OMAP_IRQ_BIT(INT_24XX_UART2_IRQ) | \
|
||||
OMAP_IRQ_BIT(INT_24XX_UART3_IRQ))
|
||||
|
||||
#define preg(reg) printk("%s\t(0x%p):\t0x%08x\n", #reg, ®, reg);
|
||||
|
||||
static void omap2_pm_debug(char * desc)
|
||||
{
|
||||
printk("%s:\n", desc);
|
||||
|
||||
preg(CM_CLKSTCTRL_MPU);
|
||||
preg(CM_CLKSTCTRL_CORE);
|
||||
preg(CM_CLKSTCTRL_GFX);
|
||||
preg(CM_CLKSTCTRL_DSP);
|
||||
preg(CM_CLKSTCTRL_MDM);
|
||||
|
||||
preg(PM_PWSTCTRL_MPU);
|
||||
preg(PM_PWSTCTRL_CORE);
|
||||
preg(PM_PWSTCTRL_GFX);
|
||||
preg(PM_PWSTCTRL_DSP);
|
||||
preg(PM_PWSTCTRL_MDM);
|
||||
|
||||
preg(PM_PWSTST_MPU);
|
||||
preg(PM_PWSTST_CORE);
|
||||
preg(PM_PWSTST_GFX);
|
||||
preg(PM_PWSTST_DSP);
|
||||
preg(PM_PWSTST_MDM);
|
||||
|
||||
preg(CM_AUTOIDLE1_CORE);
|
||||
preg(CM_AUTOIDLE2_CORE);
|
||||
preg(CM_AUTOIDLE3_CORE);
|
||||
preg(CM_AUTOIDLE4_CORE);
|
||||
preg(CM_AUTOIDLE_WKUP);
|
||||
preg(CM_AUTOIDLE_PLL);
|
||||
preg(CM_AUTOIDLE_DSP);
|
||||
preg(CM_AUTOIDLE_MDM);
|
||||
|
||||
preg(CM_ICLKEN1_CORE);
|
||||
preg(CM_ICLKEN2_CORE);
|
||||
preg(CM_ICLKEN3_CORE);
|
||||
preg(CM_ICLKEN4_CORE);
|
||||
preg(CM_ICLKEN_GFX);
|
||||
preg(CM_ICLKEN_WKUP);
|
||||
preg(CM_ICLKEN_DSP);
|
||||
preg(CM_ICLKEN_MDM);
|
||||
|
||||
preg(CM_IDLEST1_CORE);
|
||||
preg(CM_IDLEST2_CORE);
|
||||
preg(CM_IDLEST3_CORE);
|
||||
preg(CM_IDLEST4_CORE);
|
||||
preg(CM_IDLEST_GFX);
|
||||
preg(CM_IDLEST_WKUP);
|
||||
preg(CM_IDLEST_CKGEN);
|
||||
preg(CM_IDLEST_DSP);
|
||||
preg(CM_IDLEST_MDM);
|
||||
|
||||
preg(RM_RSTST_MPU);
|
||||
preg(RM_RSTST_GFX);
|
||||
preg(RM_RSTST_WKUP);
|
||||
preg(RM_RSTST_DSP);
|
||||
preg(RM_RSTST_MDM);
|
||||
|
||||
preg(PM_WKDEP_MPU);
|
||||
preg(PM_WKDEP_CORE);
|
||||
preg(PM_WKDEP_GFX);
|
||||
preg(PM_WKDEP_DSP);
|
||||
preg(PM_WKDEP_MDM);
|
||||
|
||||
preg(CM_FCLKEN_WKUP);
|
||||
preg(CM_ICLKEN_WKUP);
|
||||
preg(CM_IDLEST_WKUP);
|
||||
preg(CM_AUTOIDLE_WKUP);
|
||||
preg(CM_CLKSEL_WKUP);
|
||||
|
||||
preg(PM_WKEN_WKUP);
|
||||
preg(PM_WKST_WKUP);
|
||||
}
|
||||
|
||||
static inline void omap2_pm_save_registers(void)
|
||||
{
|
||||
/* Save interrupt registers */
|
||||
OMAP24XX_SAVE(INTC_MIR0);
|
||||
OMAP24XX_SAVE(INTC_MIR1);
|
||||
OMAP24XX_SAVE(INTC_MIR2);
|
||||
|
||||
/* Save power control registers */
|
||||
OMAP24XX_SAVE(CM_CLKSTCTRL_MPU);
|
||||
OMAP24XX_SAVE(CM_CLKSTCTRL_CORE);
|
||||
OMAP24XX_SAVE(CM_CLKSTCTRL_GFX);
|
||||
OMAP24XX_SAVE(CM_CLKSTCTRL_DSP);
|
||||
OMAP24XX_SAVE(CM_CLKSTCTRL_MDM);
|
||||
|
||||
/* Save power state registers */
|
||||
OMAP24XX_SAVE(PM_PWSTCTRL_MPU);
|
||||
OMAP24XX_SAVE(PM_PWSTCTRL_CORE);
|
||||
OMAP24XX_SAVE(PM_PWSTCTRL_GFX);
|
||||
OMAP24XX_SAVE(PM_PWSTCTRL_DSP);
|
||||
OMAP24XX_SAVE(PM_PWSTCTRL_MDM);
|
||||
|
||||
/* Save autoidle registers */
|
||||
OMAP24XX_SAVE(CM_AUTOIDLE1_CORE);
|
||||
OMAP24XX_SAVE(CM_AUTOIDLE2_CORE);
|
||||
OMAP24XX_SAVE(CM_AUTOIDLE3_CORE);
|
||||
OMAP24XX_SAVE(CM_AUTOIDLE4_CORE);
|
||||
OMAP24XX_SAVE(CM_AUTOIDLE_WKUP);
|
||||
OMAP24XX_SAVE(CM_AUTOIDLE_PLL);
|
||||
OMAP24XX_SAVE(CM_AUTOIDLE_DSP);
|
||||
OMAP24XX_SAVE(CM_AUTOIDLE_MDM);
|
||||
|
||||
/* Save idle state registers */
|
||||
OMAP24XX_SAVE(CM_IDLEST1_CORE);
|
||||
OMAP24XX_SAVE(CM_IDLEST2_CORE);
|
||||
OMAP24XX_SAVE(CM_IDLEST3_CORE);
|
||||
OMAP24XX_SAVE(CM_IDLEST4_CORE);
|
||||
OMAP24XX_SAVE(CM_IDLEST_GFX);
|
||||
OMAP24XX_SAVE(CM_IDLEST_WKUP);
|
||||
OMAP24XX_SAVE(CM_IDLEST_CKGEN);
|
||||
OMAP24XX_SAVE(CM_IDLEST_DSP);
|
||||
OMAP24XX_SAVE(CM_IDLEST_MDM);
|
||||
|
||||
/* Save clock registers */
|
||||
OMAP24XX_SAVE(CM_FCLKEN1_CORE);
|
||||
OMAP24XX_SAVE(CM_FCLKEN2_CORE);
|
||||
OMAP24XX_SAVE(CM_ICLKEN1_CORE);
|
||||
OMAP24XX_SAVE(CM_ICLKEN2_CORE);
|
||||
OMAP24XX_SAVE(CM_ICLKEN3_CORE);
|
||||
OMAP24XX_SAVE(CM_ICLKEN4_CORE);
|
||||
}
|
||||
|
||||
static inline void omap2_pm_restore_registers(void)
|
||||
{
|
||||
/* Restore clock state registers */
|
||||
OMAP24XX_RESTORE(CM_CLKSTCTRL_MPU);
|
||||
OMAP24XX_RESTORE(CM_CLKSTCTRL_CORE);
|
||||
OMAP24XX_RESTORE(CM_CLKSTCTRL_GFX);
|
||||
OMAP24XX_RESTORE(CM_CLKSTCTRL_DSP);
|
||||
OMAP24XX_RESTORE(CM_CLKSTCTRL_MDM);
|
||||
|
||||
/* Restore power state registers */
|
||||
OMAP24XX_RESTORE(PM_PWSTCTRL_MPU);
|
||||
OMAP24XX_RESTORE(PM_PWSTCTRL_CORE);
|
||||
OMAP24XX_RESTORE(PM_PWSTCTRL_GFX);
|
||||
OMAP24XX_RESTORE(PM_PWSTCTRL_DSP);
|
||||
OMAP24XX_RESTORE(PM_PWSTCTRL_MDM);
|
||||
|
||||
/* Restore idle state registers */
|
||||
OMAP24XX_RESTORE(CM_IDLEST1_CORE);
|
||||
OMAP24XX_RESTORE(CM_IDLEST2_CORE);
|
||||
OMAP24XX_RESTORE(CM_IDLEST3_CORE);
|
||||
OMAP24XX_RESTORE(CM_IDLEST4_CORE);
|
||||
OMAP24XX_RESTORE(CM_IDLEST_GFX);
|
||||
OMAP24XX_RESTORE(CM_IDLEST_WKUP);
|
||||
OMAP24XX_RESTORE(CM_IDLEST_CKGEN);
|
||||
OMAP24XX_RESTORE(CM_IDLEST_DSP);
|
||||
OMAP24XX_RESTORE(CM_IDLEST_MDM);
|
||||
|
||||
/* Restore autoidle registers */
|
||||
OMAP24XX_RESTORE(CM_AUTOIDLE1_CORE);
|
||||
OMAP24XX_RESTORE(CM_AUTOIDLE2_CORE);
|
||||
OMAP24XX_RESTORE(CM_AUTOIDLE3_CORE);
|
||||
OMAP24XX_RESTORE(CM_AUTOIDLE4_CORE);
|
||||
OMAP24XX_RESTORE(CM_AUTOIDLE_WKUP);
|
||||
OMAP24XX_RESTORE(CM_AUTOIDLE_PLL);
|
||||
OMAP24XX_RESTORE(CM_AUTOIDLE_DSP);
|
||||
OMAP24XX_RESTORE(CM_AUTOIDLE_MDM);
|
||||
|
||||
/* Restore clock registers */
|
||||
OMAP24XX_RESTORE(CM_FCLKEN1_CORE);
|
||||
OMAP24XX_RESTORE(CM_FCLKEN2_CORE);
|
||||
OMAP24XX_RESTORE(CM_ICLKEN1_CORE);
|
||||
OMAP24XX_RESTORE(CM_ICLKEN2_CORE);
|
||||
OMAP24XX_RESTORE(CM_ICLKEN3_CORE);
|
||||
OMAP24XX_RESTORE(CM_ICLKEN4_CORE);
|
||||
|
||||
/* REVISIT: Clear interrupts here */
|
||||
|
||||
/* Restore interrupt registers */
|
||||
OMAP24XX_RESTORE(INTC_MIR0);
|
||||
OMAP24XX_RESTORE(INTC_MIR1);
|
||||
OMAP24XX_RESTORE(INTC_MIR2);
|
||||
}
|
||||
|
||||
static int omap2_pm_suspend(void)
|
||||
{
|
||||
int processor_type = 0;
|
||||
|
||||
/* REVISIT: 0x21 or 0x26? */
|
||||
if (cpu_is_omap2420())
|
||||
processor_type = 0x21;
|
||||
|
||||
if (!processor_type)
|
||||
return -ENOTSUPP;
|
||||
|
||||
local_irq_disable();
|
||||
local_fiq_disable();
|
||||
|
||||
omap2_pm_save_registers();
|
||||
|
||||
/* Disable interrupts except for the wake events */
|
||||
INTC_MIR_SET0 = 0xffffffff & ~INT0_WAKE_MASK;
|
||||
INTC_MIR_SET1 = 0xffffffff & ~INT1_WAKE_MASK;
|
||||
INTC_MIR_SET2 = 0xffffffff & ~INT2_WAKE_MASK;
|
||||
|
||||
pmdomain_set_autoidle();
|
||||
|
||||
/* Clear old wake-up events */
|
||||
PM_WKST1_CORE = 0;
|
||||
PM_WKST2_CORE = 0;
|
||||
PM_WKST_WKUP = 0;
|
||||
|
||||
/* Enable wake-up events */
|
||||
PM_WKEN1_CORE = (1 << 22) | (1 << 21); /* UART1 & 2 */
|
||||
PM_WKEN2_CORE = (1 << 2); /* UART3 */
|
||||
PM_WKEN_WKUP = (1 << 2) | (1 << 0); /* GPIO & GPT1 */
|
||||
|
||||
/* Disable clocks except for CM_ICLKEN2_CORE. It gets disabled
|
||||
* in the SRAM suspend code */
|
||||
CM_FCLKEN1_CORE = 0;
|
||||
CM_FCLKEN2_CORE = 0;
|
||||
CM_ICLKEN1_CORE = 0;
|
||||
CM_ICLKEN3_CORE = 0;
|
||||
CM_ICLKEN4_CORE = 0;
|
||||
|
||||
omap2_pm_debug("Status before suspend");
|
||||
|
||||
/* Must wait for serial buffers to clear */
|
||||
mdelay(200);
|
||||
|
||||
/* Jump to SRAM suspend code
|
||||
* REVISIT: When is this SDRC_DLLB_CTRL?
|
||||
*/
|
||||
omap2_sram_suspend(SDRC_DLLA_CTRL, processor_type);
|
||||
|
||||
/* Back from sleep */
|
||||
omap2_pm_restore_registers();
|
||||
|
||||
local_fiq_enable();
|
||||
local_irq_enable();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -357,30 +113,6 @@ static struct platform_suspend_ops omap_pm_ops = {
|
||||
|
||||
int __init omap2_pm_init(void)
|
||||
{
|
||||
printk("Power Management for TI OMAP.\n");
|
||||
|
||||
vclk = clk_get(NULL, "virt_prcm_set");
|
||||
if (IS_ERR(vclk)) {
|
||||
printk(KERN_ERR "Could not get PM vclk\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/*
|
||||
* We copy the assembler sleep/wakeup routines to SRAM.
|
||||
* These routines need to be in SRAM as that's the only
|
||||
* memory the MPU can see when it wakes up.
|
||||
*/
|
||||
omap2_sram_idle = omap_sram_push(omap24xx_idle_loop_suspend,
|
||||
omap24xx_idle_loop_suspend_sz);
|
||||
|
||||
omap2_sram_suspend = omap_sram_push(omap24xx_cpu_suspend,
|
||||
omap24xx_cpu_suspend_sz);
|
||||
|
||||
suspend_set_ops(&omap_pm_ops);
|
||||
pm_idle = omap2_pm_idle;
|
||||
|
||||
pmdomain_init();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,317 @@
|
||||
#ifndef __ARCH_ASM_MACH_OMAP2_PRCM_COMMON_H
|
||||
#define __ARCH_ASM_MACH_OMAP2_PRCM_COMMON_H
|
||||
|
||||
/*
|
||||
* OMAP2/3 PRCM base and module definitions
|
||||
*
|
||||
* Copyright (C) 2007-2008 Texas Instruments, Inc.
|
||||
* Copyright (C) 2007-2008 Nokia Corporation
|
||||
*
|
||||
* Written by Paul Walmsley
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
|
||||
/* Module offsets from both CM_BASE & PRM_BASE */
|
||||
|
||||
/*
|
||||
* Offsets that are the same on 24xx and 34xx
|
||||
*
|
||||
* Technically, in terms of the TRM, OCP_MOD is 34xx only; PLL_MOD is
|
||||
* CCR_MOD on 3430; and GFX_MOD only exists < 3430ES2.
|
||||
*/
|
||||
#define OCP_MOD 0x000
|
||||
#define MPU_MOD 0x100
|
||||
#define CORE_MOD 0x200
|
||||
#define GFX_MOD 0x300
|
||||
#define WKUP_MOD 0x400
|
||||
#define PLL_MOD 0x500
|
||||
|
||||
|
||||
/* Chip-specific module offsets */
|
||||
#define OMAP24XX_DSP_MOD 0x800
|
||||
|
||||
#define OMAP2430_MDM_MOD 0xc00
|
||||
|
||||
/* IVA2 module is < base on 3430 */
|
||||
#define OMAP3430_IVA2_MOD -0x800
|
||||
#define OMAP3430ES2_SGX_MOD GFX_MOD
|
||||
#define OMAP3430_CCR_MOD PLL_MOD
|
||||
#define OMAP3430_DSS_MOD 0x600
|
||||
#define OMAP3430_CAM_MOD 0x700
|
||||
#define OMAP3430_PER_MOD 0x800
|
||||
#define OMAP3430_EMU_MOD 0x900
|
||||
#define OMAP3430_GR_MOD 0xa00
|
||||
#define OMAP3430_NEON_MOD 0xb00
|
||||
#define OMAP3430ES2_USBHOST_MOD 0xc00
|
||||
|
||||
|
||||
/* 24XX register bits shared between CM & PRM registers */
|
||||
|
||||
/* CM_FCLKEN1_CORE, CM_ICLKEN1_CORE, PM_WKEN1_CORE shared bits */
|
||||
#define OMAP2420_EN_MMC_SHIFT 26
|
||||
#define OMAP2420_EN_MMC (1 << 26)
|
||||
#define OMAP24XX_EN_UART2_SHIFT 22
|
||||
#define OMAP24XX_EN_UART2 (1 << 22)
|
||||
#define OMAP24XX_EN_UART1_SHIFT 21
|
||||
#define OMAP24XX_EN_UART1 (1 << 21)
|
||||
#define OMAP24XX_EN_MCSPI2_SHIFT 18
|
||||
#define OMAP24XX_EN_MCSPI2 (1 << 18)
|
||||
#define OMAP24XX_EN_MCSPI1_SHIFT 17
|
||||
#define OMAP24XX_EN_MCSPI1 (1 << 17)
|
||||
#define OMAP24XX_EN_MCBSP2_SHIFT 16
|
||||
#define OMAP24XX_EN_MCBSP2 (1 << 16)
|
||||
#define OMAP24XX_EN_MCBSP1_SHIFT 15
|
||||
#define OMAP24XX_EN_MCBSP1 (1 << 15)
|
||||
#define OMAP24XX_EN_GPT12_SHIFT 14
|
||||
#define OMAP24XX_EN_GPT12 (1 << 14)
|
||||
#define OMAP24XX_EN_GPT11_SHIFT 13
|
||||
#define OMAP24XX_EN_GPT11 (1 << 13)
|
||||
#define OMAP24XX_EN_GPT10_SHIFT 12
|
||||
#define OMAP24XX_EN_GPT10 (1 << 12)
|
||||
#define OMAP24XX_EN_GPT9_SHIFT 11
|
||||
#define OMAP24XX_EN_GPT9 (1 << 11)
|
||||
#define OMAP24XX_EN_GPT8_SHIFT 10
|
||||
#define OMAP24XX_EN_GPT8 (1 << 10)
|
||||
#define OMAP24XX_EN_GPT7_SHIFT 9
|
||||
#define OMAP24XX_EN_GPT7 (1 << 9)
|
||||
#define OMAP24XX_EN_GPT6_SHIFT 8
|
||||
#define OMAP24XX_EN_GPT6 (1 << 8)
|
||||
#define OMAP24XX_EN_GPT5_SHIFT 7
|
||||
#define OMAP24XX_EN_GPT5 (1 << 7)
|
||||
#define OMAP24XX_EN_GPT4_SHIFT 6
|
||||
#define OMAP24XX_EN_GPT4 (1 << 6)
|
||||
#define OMAP24XX_EN_GPT3_SHIFT 5
|
||||
#define OMAP24XX_EN_GPT3 (1 << 5)
|
||||
#define OMAP24XX_EN_GPT2_SHIFT 4
|
||||
#define OMAP24XX_EN_GPT2 (1 << 4)
|
||||
#define OMAP2420_EN_VLYNQ_SHIFT 3
|
||||
#define OMAP2420_EN_VLYNQ (1 << 3)
|
||||
|
||||
/* CM_FCLKEN2_CORE, CM_ICLKEN2_CORE, PM_WKEN2_CORE shared bits */
|
||||
#define OMAP2430_EN_GPIO5_SHIFT 10
|
||||
#define OMAP2430_EN_GPIO5 (1 << 10)
|
||||
#define OMAP2430_EN_MCSPI3_SHIFT 9
|
||||
#define OMAP2430_EN_MCSPI3 (1 << 9)
|
||||
#define OMAP2430_EN_MMCHS2_SHIFT 8
|
||||
#define OMAP2430_EN_MMCHS2 (1 << 8)
|
||||
#define OMAP2430_EN_MMCHS1_SHIFT 7
|
||||
#define OMAP2430_EN_MMCHS1 (1 << 7)
|
||||
#define OMAP24XX_EN_UART3_SHIFT 2
|
||||
#define OMAP24XX_EN_UART3 (1 << 2)
|
||||
#define OMAP24XX_EN_USB_SHIFT 0
|
||||
#define OMAP24XX_EN_USB (1 << 0)
|
||||
|
||||
/* CM_ICLKEN2_CORE, PM_WKEN2_CORE shared bits */
|
||||
#define OMAP2430_EN_MDM_INTC_SHIFT 11
|
||||
#define OMAP2430_EN_MDM_INTC (1 << 11)
|
||||
#define OMAP2430_EN_USBHS_SHIFT 6
|
||||
#define OMAP2430_EN_USBHS (1 << 6)
|
||||
|
||||
/* CM_IDLEST1_CORE, PM_WKST1_CORE shared bits */
|
||||
#define OMAP2420_ST_MMC (1 << 26)
|
||||
#define OMAP24XX_ST_UART2 (1 << 22)
|
||||
#define OMAP24XX_ST_UART1 (1 << 21)
|
||||
#define OMAP24XX_ST_MCSPI2 (1 << 18)
|
||||
#define OMAP24XX_ST_MCSPI1 (1 << 17)
|
||||
#define OMAP24XX_ST_GPT12 (1 << 14)
|
||||
#define OMAP24XX_ST_GPT11 (1 << 13)
|
||||
#define OMAP24XX_ST_GPT10 (1 << 12)
|
||||
#define OMAP24XX_ST_GPT9 (1 << 11)
|
||||
#define OMAP24XX_ST_GPT8 (1 << 10)
|
||||
#define OMAP24XX_ST_GPT7 (1 << 9)
|
||||
#define OMAP24XX_ST_GPT6 (1 << 8)
|
||||
#define OMAP24XX_ST_GPT5 (1 << 7)
|
||||
#define OMAP24XX_ST_GPT4 (1 << 6)
|
||||
#define OMAP24XX_ST_GPT3 (1 << 5)
|
||||
#define OMAP24XX_ST_GPT2 (1 << 4)
|
||||
#define OMAP2420_ST_VLYNQ (1 << 3)
|
||||
|
||||
/* CM_IDLEST2_CORE, PM_WKST2_CORE shared bits */
|
||||
#define OMAP2430_ST_MDM_INTC (1 << 11)
|
||||
#define OMAP2430_ST_GPIO5 (1 << 10)
|
||||
#define OMAP2430_ST_MCSPI3 (1 << 9)
|
||||
#define OMAP2430_ST_MMCHS2 (1 << 8)
|
||||
#define OMAP2430_ST_MMCHS1 (1 << 7)
|
||||
#define OMAP2430_ST_USBHS (1 << 6)
|
||||
#define OMAP24XX_ST_UART3 (1 << 2)
|
||||
#define OMAP24XX_ST_USB (1 << 0)
|
||||
|
||||
/* CM_FCLKEN_WKUP, CM_ICLKEN_WKUP, PM_WKEN_WKUP shared bits */
|
||||
#define OMAP24XX_EN_GPIOS_SHIFT 2
|
||||
#define OMAP24XX_EN_GPIOS (1 << 2)
|
||||
#define OMAP24XX_EN_GPT1_SHIFT 0
|
||||
#define OMAP24XX_EN_GPT1 (1 << 0)
|
||||
|
||||
/* PM_WKST_WKUP, CM_IDLEST_WKUP shared bits */
|
||||
#define OMAP24XX_ST_GPIOS (1 << 2)
|
||||
#define OMAP24XX_ST_GPT1 (1 << 0)
|
||||
|
||||
/* CM_IDLEST_MDM and PM_WKST_MDM shared bits */
|
||||
#define OMAP2430_ST_MDM (1 << 0)
|
||||
|
||||
|
||||
/* 3430 register bits shared between CM & PRM registers */
|
||||
|
||||
/* CM_REVISION, PRM_REVISION shared bits */
|
||||
#define OMAP3430_REV_SHIFT 0
|
||||
#define OMAP3430_REV_MASK (0xff << 0)
|
||||
|
||||
/* CM_SYSCONFIG, PRM_SYSCONFIG shared bits */
|
||||
#define OMAP3430_AUTOIDLE (1 << 0)
|
||||
|
||||
/* CM_FCLKEN1_CORE, CM_ICLKEN1_CORE, PM_WKEN1_CORE shared bits */
|
||||
#define OMAP3430_EN_MMC2 (1 << 25)
|
||||
#define OMAP3430_EN_MMC2_SHIFT 25
|
||||
#define OMAP3430_EN_MMC1 (1 << 24)
|
||||
#define OMAP3430_EN_MMC1_SHIFT 24
|
||||
#define OMAP3430_EN_MCSPI4 (1 << 21)
|
||||
#define OMAP3430_EN_MCSPI4_SHIFT 21
|
||||
#define OMAP3430_EN_MCSPI3 (1 << 20)
|
||||
#define OMAP3430_EN_MCSPI3_SHIFT 20
|
||||
#define OMAP3430_EN_MCSPI2 (1 << 19)
|
||||
#define OMAP3430_EN_MCSPI2_SHIFT 19
|
||||
#define OMAP3430_EN_MCSPI1 (1 << 18)
|
||||
#define OMAP3430_EN_MCSPI1_SHIFT 18
|
||||
#define OMAP3430_EN_I2C3 (1 << 17)
|
||||
#define OMAP3430_EN_I2C3_SHIFT 17
|
||||
#define OMAP3430_EN_I2C2 (1 << 16)
|
||||
#define OMAP3430_EN_I2C2_SHIFT 16
|
||||
#define OMAP3430_EN_I2C1 (1 << 15)
|
||||
#define OMAP3430_EN_I2C1_SHIFT 15
|
||||
#define OMAP3430_EN_UART2 (1 << 14)
|
||||
#define OMAP3430_EN_UART2_SHIFT 14
|
||||
#define OMAP3430_EN_UART1 (1 << 13)
|
||||
#define OMAP3430_EN_UART1_SHIFT 13
|
||||
#define OMAP3430_EN_GPT11 (1 << 12)
|
||||
#define OMAP3430_EN_GPT11_SHIFT 12
|
||||
#define OMAP3430_EN_GPT10 (1 << 11)
|
||||
#define OMAP3430_EN_GPT10_SHIFT 11
|
||||
#define OMAP3430_EN_MCBSP5 (1 << 10)
|
||||
#define OMAP3430_EN_MCBSP5_SHIFT 10
|
||||
#define OMAP3430_EN_MCBSP1 (1 << 9)
|
||||
#define OMAP3430_EN_MCBSP1_SHIFT 9
|
||||
#define OMAP3430_EN_FSHOSTUSB (1 << 5)
|
||||
#define OMAP3430_EN_FSHOSTUSB_SHIFT 5
|
||||
#define OMAP3430_EN_D2D (1 << 3)
|
||||
#define OMAP3430_EN_D2D_SHIFT 3
|
||||
|
||||
/* CM_ICLKEN1_CORE, PM_WKEN1_CORE shared bits */
|
||||
#define OMAP3430_EN_HSOTGUSB (1 << 4)
|
||||
#define OMAP3430_EN_HSOTGUSB_SHIFT 4
|
||||
|
||||
/* PM_WKST1_CORE, CM_IDLEST1_CORE shared bits */
|
||||
#define OMAP3430_ST_MMC2 (1 << 25)
|
||||
#define OMAP3430_ST_MMC1 (1 << 24)
|
||||
#define OMAP3430_ST_MCSPI4 (1 << 21)
|
||||
#define OMAP3430_ST_MCSPI3 (1 << 20)
|
||||
#define OMAP3430_ST_MCSPI2 (1 << 19)
|
||||
#define OMAP3430_ST_MCSPI1 (1 << 18)
|
||||
#define OMAP3430_ST_I2C3 (1 << 17)
|
||||
#define OMAP3430_ST_I2C2 (1 << 16)
|
||||
#define OMAP3430_ST_I2C1 (1 << 15)
|
||||
#define OMAP3430_ST_UART2 (1 << 14)
|
||||
#define OMAP3430_ST_UART1 (1 << 13)
|
||||
#define OMAP3430_ST_GPT11 (1 << 12)
|
||||
#define OMAP3430_ST_GPT10 (1 << 11)
|
||||
#define OMAP3430_ST_MCBSP5 (1 << 10)
|
||||
#define OMAP3430_ST_MCBSP1 (1 << 9)
|
||||
#define OMAP3430_ST_FSHOSTUSB (1 << 5)
|
||||
#define OMAP3430_ST_HSOTGUSB (1 << 4)
|
||||
#define OMAP3430_ST_D2D (1 << 3)
|
||||
|
||||
/* CM_FCLKEN_WKUP, CM_ICLKEN_WKUP, PM_WKEN_WKUP shared bits */
|
||||
#define OMAP3430_EN_GPIO1 (1 << 3)
|
||||
#define OMAP3430_EN_GPIO1_SHIFT 3
|
||||
#define OMAP3430_EN_GPT1 (1 << 0)
|
||||
#define OMAP3430_EN_GPT1_SHIFT 0
|
||||
|
||||
/* CM_FCLKEN_WKUP, PM_WKEN_WKUP shared bits */
|
||||
#define OMAP3430_EN_SR2 (1 << 7)
|
||||
#define OMAP3430_EN_SR2_SHIFT 7
|
||||
#define OMAP3430_EN_SR1 (1 << 6)
|
||||
#define OMAP3430_EN_SR1_SHIFT 6
|
||||
|
||||
/* CM_ICLKEN_WKUP, PM_WKEN_WKUP shared bits */
|
||||
#define OMAP3430_EN_GPT12 (1 << 1)
|
||||
#define OMAP3430_EN_GPT12_SHIFT 1
|
||||
|
||||
/* CM_IDLEST_WKUP, PM_WKST_WKUP shared bits */
|
||||
#define OMAP3430_ST_SR2 (1 << 7)
|
||||
#define OMAP3430_ST_SR1 (1 << 6)
|
||||
#define OMAP3430_ST_GPIO1 (1 << 3)
|
||||
#define OMAP3430_ST_GPT12 (1 << 1)
|
||||
#define OMAP3430_ST_GPT1 (1 << 0)
|
||||
|
||||
/*
|
||||
* CM_SLEEPDEP_GFX, CM_SLEEPDEP_DSS, CM_SLEEPDEP_CAM,
|
||||
* CM_SLEEPDEP_PER, PM_WKDEP_IVA2, PM_WKDEP_GFX,
|
||||
* PM_WKDEP_DSS, PM_WKDEP_CAM, PM_WKDEP_PER, PM_WKDEP_NEON shared bits
|
||||
*/
|
||||
#define OMAP3430_EN_MPU (1 << 1)
|
||||
#define OMAP3430_EN_MPU_SHIFT 1
|
||||
|
||||
/* CM_FCLKEN_PER, CM_ICLKEN_PER, PM_WKEN_PER shared bits */
|
||||
#define OMAP3430_EN_GPIO6 (1 << 17)
|
||||
#define OMAP3430_EN_GPIO6_SHIFT 17
|
||||
#define OMAP3430_EN_GPIO5 (1 << 16)
|
||||
#define OMAP3430_EN_GPIO5_SHIFT 16
|
||||
#define OMAP3430_EN_GPIO4 (1 << 15)
|
||||
#define OMAP3430_EN_GPIO4_SHIFT 15
|
||||
#define OMAP3430_EN_GPIO3 (1 << 14)
|
||||
#define OMAP3430_EN_GPIO3_SHIFT 14
|
||||
#define OMAP3430_EN_GPIO2 (1 << 13)
|
||||
#define OMAP3430_EN_GPIO2_SHIFT 13
|
||||
#define OMAP3430_EN_UART3 (1 << 11)
|
||||
#define OMAP3430_EN_UART3_SHIFT 11
|
||||
#define OMAP3430_EN_GPT9 (1 << 10)
|
||||
#define OMAP3430_EN_GPT9_SHIFT 10
|
||||
#define OMAP3430_EN_GPT8 (1 << 9)
|
||||
#define OMAP3430_EN_GPT8_SHIFT 9
|
||||
#define OMAP3430_EN_GPT7 (1 << 8)
|
||||
#define OMAP3430_EN_GPT7_SHIFT 8
|
||||
#define OMAP3430_EN_GPT6 (1 << 7)
|
||||
#define OMAP3430_EN_GPT6_SHIFT 7
|
||||
#define OMAP3430_EN_GPT5 (1 << 6)
|
||||
#define OMAP3430_EN_GPT5_SHIFT 6
|
||||
#define OMAP3430_EN_GPT4 (1 << 5)
|
||||
#define OMAP3430_EN_GPT4_SHIFT 5
|
||||
#define OMAP3430_EN_GPT3 (1 << 4)
|
||||
#define OMAP3430_EN_GPT3_SHIFT 4
|
||||
#define OMAP3430_EN_GPT2 (1 << 3)
|
||||
#define OMAP3430_EN_GPT2_SHIFT 3
|
||||
|
||||
/* CM_FCLKEN_PER, CM_ICLKEN_PER, PM_WKEN_PER, PM_WKST_PER shared bits */
|
||||
/* XXX Possible TI documentation bug: should the PM_WKST_PER EN_* bits
|
||||
* be ST_* bits instead? */
|
||||
#define OMAP3430_EN_MCBSP4 (1 << 2)
|
||||
#define OMAP3430_EN_MCBSP4_SHIFT 2
|
||||
#define OMAP3430_EN_MCBSP3 (1 << 1)
|
||||
#define OMAP3430_EN_MCBSP3_SHIFT 1
|
||||
#define OMAP3430_EN_MCBSP2 (1 << 0)
|
||||
#define OMAP3430_EN_MCBSP2_SHIFT 0
|
||||
|
||||
/* CM_IDLEST_PER, PM_WKST_PER shared bits */
|
||||
#define OMAP3430_ST_GPIO6 (1 << 17)
|
||||
#define OMAP3430_ST_GPIO5 (1 << 16)
|
||||
#define OMAP3430_ST_GPIO4 (1 << 15)
|
||||
#define OMAP3430_ST_GPIO3 (1 << 14)
|
||||
#define OMAP3430_ST_GPIO2 (1 << 13)
|
||||
#define OMAP3430_ST_UART3 (1 << 11)
|
||||
#define OMAP3430_ST_GPT9 (1 << 10)
|
||||
#define OMAP3430_ST_GPT8 (1 << 9)
|
||||
#define OMAP3430_ST_GPT7 (1 << 8)
|
||||
#define OMAP3430_ST_GPT6 (1 << 7)
|
||||
#define OMAP3430_ST_GPT5 (1 << 6)
|
||||
#define OMAP3430_ST_GPT4 (1 << 5)
|
||||
#define OMAP3430_ST_GPT3 (1 << 4)
|
||||
#define OMAP3430_ST_GPT2 (1 << 3)
|
||||
|
||||
/* CM_SLEEPDEP_PER, PM_WKDEP_IVA2, PM_WKDEP_MPU, PM_WKDEP_PER shared bits */
|
||||
#define OMAP3430_EN_CORE (1 << 0)
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,483 +0,0 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-omap2/prcm-regs.h
|
||||
*
|
||||
* OMAP24XX Power Reset and Clock Management (PRCM) registers
|
||||
*
|
||||
* Copyright (C) 2005 Texas Instruments, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef __ARCH_ARM_MACH_OMAP2_PRCM_H
|
||||
#define __ARCH_ARM_MACH_OMAP2_PRCM_H
|
||||
|
||||
/* SET_PERFORMANCE_LEVEL PARAMETERS */
|
||||
#define PRCM_HALF_SPEED 1
|
||||
#define PRCM_FULL_SPEED 2
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
#define PRCM_REG32(offset) __REG32(OMAP24XX_PRCM_BASE + (offset))
|
||||
|
||||
#define PRCM_REVISION PRCM_REG32(0x000)
|
||||
#define PRCM_SYSCONFIG PRCM_REG32(0x010)
|
||||
#define PRCM_IRQSTATUS_MPU PRCM_REG32(0x018)
|
||||
#define PRCM_IRQENABLE_MPU PRCM_REG32(0x01C)
|
||||
#define PRCM_VOLTCTRL PRCM_REG32(0x050)
|
||||
#define PRCM_VOLTST PRCM_REG32(0x054)
|
||||
#define PRCM_CLKSRC_CTRL PRCM_REG32(0x060)
|
||||
#define PRCM_CLKOUT_CTRL PRCM_REG32(0x070)
|
||||
#define PRCM_CLKEMUL_CTRL PRCM_REG32(0x078)
|
||||
#define PRCM_CLKCFG_CTRL PRCM_REG32(0x080)
|
||||
#define PRCM_CLKCFG_STATUS PRCM_REG32(0x084)
|
||||
#define PRCM_VOLTSETUP PRCM_REG32(0x090)
|
||||
#define PRCM_CLKSSETUP PRCM_REG32(0x094)
|
||||
#define PRCM_POLCTRL PRCM_REG32(0x098)
|
||||
|
||||
/* GENERAL PURPOSE */
|
||||
#define GENERAL_PURPOSE1 PRCM_REG32(0x0B0)
|
||||
#define GENERAL_PURPOSE2 PRCM_REG32(0x0B4)
|
||||
#define GENERAL_PURPOSE3 PRCM_REG32(0x0B8)
|
||||
#define GENERAL_PURPOSE4 PRCM_REG32(0x0BC)
|
||||
#define GENERAL_PURPOSE5 PRCM_REG32(0x0C0)
|
||||
#define GENERAL_PURPOSE6 PRCM_REG32(0x0C4)
|
||||
#define GENERAL_PURPOSE7 PRCM_REG32(0x0C8)
|
||||
#define GENERAL_PURPOSE8 PRCM_REG32(0x0CC)
|
||||
#define GENERAL_PURPOSE9 PRCM_REG32(0x0D0)
|
||||
#define GENERAL_PURPOSE10 PRCM_REG32(0x0D4)
|
||||
#define GENERAL_PURPOSE11 PRCM_REG32(0x0D8)
|
||||
#define GENERAL_PURPOSE12 PRCM_REG32(0x0DC)
|
||||
#define GENERAL_PURPOSE13 PRCM_REG32(0x0E0)
|
||||
#define GENERAL_PURPOSE14 PRCM_REG32(0x0E4)
|
||||
#define GENERAL_PURPOSE15 PRCM_REG32(0x0E8)
|
||||
#define GENERAL_PURPOSE16 PRCM_REG32(0x0EC)
|
||||
#define GENERAL_PURPOSE17 PRCM_REG32(0x0F0)
|
||||
#define GENERAL_PURPOSE18 PRCM_REG32(0x0F4)
|
||||
#define GENERAL_PURPOSE19 PRCM_REG32(0x0F8)
|
||||
#define GENERAL_PURPOSE20 PRCM_REG32(0x0FC)
|
||||
|
||||
/* MPU */
|
||||
#define CM_CLKSEL_MPU PRCM_REG32(0x140)
|
||||
#define CM_CLKSTCTRL_MPU PRCM_REG32(0x148)
|
||||
#define RM_RSTST_MPU PRCM_REG32(0x158)
|
||||
#define PM_WKDEP_MPU PRCM_REG32(0x1C8)
|
||||
#define PM_EVGENCTRL_MPU PRCM_REG32(0x1D4)
|
||||
#define PM_EVEGENONTIM_MPU PRCM_REG32(0x1D8)
|
||||
#define PM_EVEGENOFFTIM_MPU PRCM_REG32(0x1DC)
|
||||
#define PM_PWSTCTRL_MPU PRCM_REG32(0x1E0)
|
||||
#define PM_PWSTST_MPU PRCM_REG32(0x1E4)
|
||||
|
||||
/* CORE */
|
||||
#define CM_FCLKEN1_CORE PRCM_REG32(0x200)
|
||||
#define CM_FCLKEN2_CORE PRCM_REG32(0x204)
|
||||
#define CM_FCLKEN3_CORE PRCM_REG32(0x208)
|
||||
#define CM_ICLKEN1_CORE PRCM_REG32(0x210)
|
||||
#define CM_ICLKEN2_CORE PRCM_REG32(0x214)
|
||||
#define CM_ICLKEN3_CORE PRCM_REG32(0x218)
|
||||
#define CM_ICLKEN4_CORE PRCM_REG32(0x21C)
|
||||
#define CM_IDLEST1_CORE PRCM_REG32(0x220)
|
||||
#define CM_IDLEST2_CORE PRCM_REG32(0x224)
|
||||
#define CM_IDLEST3_CORE PRCM_REG32(0x228)
|
||||
#define CM_IDLEST4_CORE PRCM_REG32(0x22C)
|
||||
#define CM_AUTOIDLE1_CORE PRCM_REG32(0x230)
|
||||
#define CM_AUTOIDLE2_CORE PRCM_REG32(0x234)
|
||||
#define CM_AUTOIDLE3_CORE PRCM_REG32(0x238)
|
||||
#define CM_AUTOIDLE4_CORE PRCM_REG32(0x23C)
|
||||
#define CM_CLKSEL1_CORE PRCM_REG32(0x240)
|
||||
#define CM_CLKSEL2_CORE PRCM_REG32(0x244)
|
||||
#define CM_CLKSTCTRL_CORE PRCM_REG32(0x248)
|
||||
#define PM_WKEN1_CORE PRCM_REG32(0x2A0)
|
||||
#define PM_WKEN2_CORE PRCM_REG32(0x2A4)
|
||||
#define PM_WKST1_CORE PRCM_REG32(0x2B0)
|
||||
#define PM_WKST2_CORE PRCM_REG32(0x2B4)
|
||||
#define PM_WKDEP_CORE PRCM_REG32(0x2C8)
|
||||
#define PM_PWSTCTRL_CORE PRCM_REG32(0x2E0)
|
||||
#define PM_PWSTST_CORE PRCM_REG32(0x2E4)
|
||||
|
||||
/* GFX */
|
||||
#define CM_FCLKEN_GFX PRCM_REG32(0x300)
|
||||
#define CM_ICLKEN_GFX PRCM_REG32(0x310)
|
||||
#define CM_IDLEST_GFX PRCM_REG32(0x320)
|
||||
#define CM_CLKSEL_GFX PRCM_REG32(0x340)
|
||||
#define CM_CLKSTCTRL_GFX PRCM_REG32(0x348)
|
||||
#define RM_RSTCTRL_GFX PRCM_REG32(0x350)
|
||||
#define RM_RSTST_GFX PRCM_REG32(0x358)
|
||||
#define PM_WKDEP_GFX PRCM_REG32(0x3C8)
|
||||
#define PM_PWSTCTRL_GFX PRCM_REG32(0x3E0)
|
||||
#define PM_PWSTST_GFX PRCM_REG32(0x3E4)
|
||||
|
||||
/* WAKE-UP */
|
||||
#define CM_FCLKEN_WKUP PRCM_REG32(0x400)
|
||||
#define CM_ICLKEN_WKUP PRCM_REG32(0x410)
|
||||
#define CM_IDLEST_WKUP PRCM_REG32(0x420)
|
||||
#define CM_AUTOIDLE_WKUP PRCM_REG32(0x430)
|
||||
#define CM_CLKSEL_WKUP PRCM_REG32(0x440)
|
||||
#define RM_RSTCTRL_WKUP PRCM_REG32(0x450)
|
||||
#define RM_RSTTIME_WKUP PRCM_REG32(0x454)
|
||||
#define RM_RSTST_WKUP PRCM_REG32(0x458)
|
||||
#define PM_WKEN_WKUP PRCM_REG32(0x4A0)
|
||||
#define PM_WKST_WKUP PRCM_REG32(0x4B0)
|
||||
|
||||
/* CLOCKS */
|
||||
#define CM_CLKEN_PLL PRCM_REG32(0x500)
|
||||
#define CM_IDLEST_CKGEN PRCM_REG32(0x520)
|
||||
#define CM_AUTOIDLE_PLL PRCM_REG32(0x530)
|
||||
#define CM_CLKSEL1_PLL PRCM_REG32(0x540)
|
||||
#define CM_CLKSEL2_PLL PRCM_REG32(0x544)
|
||||
|
||||
/* DSP */
|
||||
#define CM_FCLKEN_DSP PRCM_REG32(0x800)
|
||||
#define CM_ICLKEN_DSP PRCM_REG32(0x810)
|
||||
#define CM_IDLEST_DSP PRCM_REG32(0x820)
|
||||
#define CM_AUTOIDLE_DSP PRCM_REG32(0x830)
|
||||
#define CM_CLKSEL_DSP PRCM_REG32(0x840)
|
||||
#define CM_CLKSTCTRL_DSP PRCM_REG32(0x848)
|
||||
#define RM_RSTCTRL_DSP PRCM_REG32(0x850)
|
||||
#define RM_RSTST_DSP PRCM_REG32(0x858)
|
||||
#define PM_WKEN_DSP PRCM_REG32(0x8A0)
|
||||
#define PM_WKDEP_DSP PRCM_REG32(0x8C8)
|
||||
#define PM_PWSTCTRL_DSP PRCM_REG32(0x8E0)
|
||||
#define PM_PWSTST_DSP PRCM_REG32(0x8E4)
|
||||
#define PRCM_IRQSTATUS_DSP PRCM_REG32(0x8F0)
|
||||
#define PRCM_IRQENABLE_DSP PRCM_REG32(0x8F4)
|
||||
|
||||
/* IVA */
|
||||
#define PRCM_IRQSTATUS_IVA PRCM_REG32(0x8F8)
|
||||
#define PRCM_IRQENABLE_IVA PRCM_REG32(0x8FC)
|
||||
|
||||
/* Modem on 2430 */
|
||||
#define CM_FCLKEN_MDM PRCM_REG32(0xC00)
|
||||
#define CM_ICLKEN_MDM PRCM_REG32(0xC10)
|
||||
#define CM_IDLEST_MDM PRCM_REG32(0xC20)
|
||||
#define CM_AUTOIDLE_MDM PRCM_REG32(0xC30)
|
||||
#define CM_CLKSEL_MDM PRCM_REG32(0xC40)
|
||||
#define CM_CLKSTCTRL_MDM PRCM_REG32(0xC48)
|
||||
#define RM_RSTCTRL_MDM PRCM_REG32(0xC50)
|
||||
#define RM_RSTST_MDM PRCM_REG32(0xC58)
|
||||
#define PM_WKEN_MDM PRCM_REG32(0xCA0)
|
||||
#define PM_WKST_MDM PRCM_REG32(0xCB0)
|
||||
#define PM_WKDEP_MDM PRCM_REG32(0xCC8)
|
||||
#define PM_PWSTCTRL_MDM PRCM_REG32(0xCE0)
|
||||
#define PM_PWSTST_MDM PRCM_REG32(0xCE4)
|
||||
|
||||
#define OMAP24XX_L4_IO_BASE 0x48000000
|
||||
|
||||
#define DISP_BASE (OMAP24XX_L4_IO_BASE + 0x50000)
|
||||
#define DISP_REG32(offset) __REG32(DISP_BASE + (offset))
|
||||
|
||||
#define OMAP24XX_GPMC_BASE (L3_24XX_BASE + 0xa000)
|
||||
#define GPMC_REG32(offset) __REG32(OMAP24XX_GPMC_BASE + (offset))
|
||||
|
||||
/* FIXME: Move these to timer code */
|
||||
#define GPT1_BASE (0x48028000)
|
||||
#define GPT1_REG32(offset) __REG32(GPT1_BASE + (offset))
|
||||
|
||||
/* Misc sysconfig */
|
||||
#define DISPC_SYSCONFIG DISP_REG32(0x410)
|
||||
#define SPI_BASE (OMAP24XX_L4_IO_BASE + 0x98000)
|
||||
#define MCSPI1_SYSCONFIG __REG32(SPI_BASE + 0x10)
|
||||
#define MCSPI2_SYSCONFIG __REG32(SPI_BASE + 0x2000 + 0x10)
|
||||
#define MCSPI3_SYSCONFIG __REG32(OMAP24XX_L4_IO_BASE + 0xb8010)
|
||||
|
||||
#define CAMERA_MMU_SYSCONFIG __REG32(DISP_BASE + 0x2C10)
|
||||
#define CAMERA_DMA_SYSCONFIG __REG32(DISP_BASE + 0x282C)
|
||||
#define SYSTEM_DMA_SYSCONFIG __REG32(DISP_BASE + 0x602C)
|
||||
#define GPMC_SYSCONFIG GPMC_REG32(0x010)
|
||||
#define MAILBOXES_SYSCONFIG __REG32(OMAP24XX_L4_IO_BASE + 0x94010)
|
||||
#define UART1_SYSCONFIG __REG32(OMAP24XX_L4_IO_BASE + 0x6A054)
|
||||
#define UART2_SYSCONFIG __REG32(OMAP24XX_L4_IO_BASE + 0x6C054)
|
||||
#define UART3_SYSCONFIG __REG32(OMAP24XX_L4_IO_BASE + 0x6E054)
|
||||
#define SDRC_SYSCONFIG __REG32(OMAP24XX_SDRC_BASE + 0x10)
|
||||
#define OMAP24XX_SMS_BASE (L3_24XX_BASE + 0x8000)
|
||||
#define SMS_SYSCONFIG __REG32(OMAP24XX_SMS_BASE + 0x10)
|
||||
#define SSI_SYSCONFIG __REG32(DISP_BASE + 0x8010)
|
||||
|
||||
/* rkw - good cannidates for PM_ to start what nm was trying */
|
||||
#define OMAP24XX_GPT2 (OMAP24XX_L4_IO_BASE + 0x2A000)
|
||||
#define OMAP24XX_GPT3 (OMAP24XX_L4_IO_BASE + 0x78000)
|
||||
#define OMAP24XX_GPT4 (OMAP24XX_L4_IO_BASE + 0x7A000)
|
||||
#define OMAP24XX_GPT5 (OMAP24XX_L4_IO_BASE + 0x7C000)
|
||||
#define OMAP24XX_GPT6 (OMAP24XX_L4_IO_BASE + 0x7E000)
|
||||
#define OMAP24XX_GPT7 (OMAP24XX_L4_IO_BASE + 0x80000)
|
||||
#define OMAP24XX_GPT8 (OMAP24XX_L4_IO_BASE + 0x82000)
|
||||
#define OMAP24XX_GPT9 (OMAP24XX_L4_IO_BASE + 0x84000)
|
||||
#define OMAP24XX_GPT10 (OMAP24XX_L4_IO_BASE + 0x86000)
|
||||
#define OMAP24XX_GPT11 (OMAP24XX_L4_IO_BASE + 0x88000)
|
||||
#define OMAP24XX_GPT12 (OMAP24XX_L4_IO_BASE + 0x8A000)
|
||||
|
||||
/* FIXME: Move these to timer code */
|
||||
#define GPTIMER1_SYSCONFIG GPT1_REG32(0x010)
|
||||
#define GPTIMER2_SYSCONFIG __REG32(OMAP24XX_GPT2 + 0x10)
|
||||
#define GPTIMER3_SYSCONFIG __REG32(OMAP24XX_GPT3 + 0x10)
|
||||
#define GPTIMER4_SYSCONFIG __REG32(OMAP24XX_GPT4 + 0x10)
|
||||
#define GPTIMER5_SYSCONFIG __REG32(OMAP24XX_GPT5 + 0x10)
|
||||
#define GPTIMER6_SYSCONFIG __REG32(OMAP24XX_GPT6 + 0x10)
|
||||
#define GPTIMER7_SYSCONFIG __REG32(OMAP24XX_GPT7 + 0x10)
|
||||
#define GPTIMER8_SYSCONFIG __REG32(OMAP24XX_GPT8 + 0x10)
|
||||
#define GPTIMER9_SYSCONFIG __REG32(OMAP24XX_GPT9 + 0x10)
|
||||
#define GPTIMER10_SYSCONFIG __REG32(OMAP24XX_GPT10 + 0x10)
|
||||
#define GPTIMER11_SYSCONFIG __REG32(OMAP24XX_GPT11 + 0x10)
|
||||
#define GPTIMER12_SYSCONFIG __REG32(OMAP24XX_GPT12 + 0x10)
|
||||
|
||||
/* FIXME: Move these to gpio code */
|
||||
#define OMAP24XX_GPIO_BASE 0x48018000
|
||||
#define GPIOX_BASE(X) (OMAP24XX_GPIO_BASE + (0x2000 * ((X) - 1)))
|
||||
|
||||
#define GPIO1_SYSCONFIG __REG32((GPIOX_BASE(1) + 0x10))
|
||||
#define GPIO2_SYSCONFIG __REG32((GPIOX_BASE(2) + 0x10))
|
||||
#define GPIO3_SYSCONFIG __REG32((GPIOX_BASE(3) + 0x10))
|
||||
#define GPIO4_SYSCONFIG __REG32((GPIOX_BASE(4) + 0x10))
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP243X)
|
||||
#define GPIO5_SYSCONFIG __REG32((OMAP24XX_GPIO5_BASE + 0x10))
|
||||
#endif
|
||||
|
||||
/* GP TIMER 1 */
|
||||
#define GPTIMER1_TISTAT GPT1_REG32(0x014)
|
||||
#define GPTIMER1_TISR GPT1_REG32(0x018)
|
||||
#define GPTIMER1_TIER GPT1_REG32(0x01C)
|
||||
#define GPTIMER1_TWER GPT1_REG32(0x020)
|
||||
#define GPTIMER1_TCLR GPT1_REG32(0x024)
|
||||
#define GPTIMER1_TCRR GPT1_REG32(0x028)
|
||||
#define GPTIMER1_TLDR GPT1_REG32(0x02C)
|
||||
#define GPTIMER1_TTGR GPT1_REG32(0x030)
|
||||
#define GPTIMER1_TWPS GPT1_REG32(0x034)
|
||||
#define GPTIMER1_TMAR GPT1_REG32(0x038)
|
||||
#define GPTIMER1_TCAR1 GPT1_REG32(0x03C)
|
||||
#define GPTIMER1_TSICR GPT1_REG32(0x040)
|
||||
#define GPTIMER1_TCAR2 GPT1_REG32(0x044)
|
||||
|
||||
/* rkw -- base fix up please... */
|
||||
#define GPTIMER3_TISR __REG32(OMAP24XX_L4_IO_BASE + 0x78018)
|
||||
|
||||
/* SDRC */
|
||||
#define SDRC_DLLA_CTRL __REG32(OMAP24XX_SDRC_BASE + 0x060)
|
||||
#define SDRC_DLLA_STATUS __REG32(OMAP24XX_SDRC_BASE + 0x064)
|
||||
#define SDRC_DLLB_CTRL __REG32(OMAP24XX_SDRC_BASE + 0x068)
|
||||
#define SDRC_DLLB_STATUS __REG32(OMAP24XX_SDRC_BASE + 0x06C)
|
||||
#define SDRC_POWER __REG32(OMAP24XX_SDRC_BASE + 0x070)
|
||||
#define SDRC_MR_0 __REG32(OMAP24XX_SDRC_BASE + 0x084)
|
||||
|
||||
/* GPIO 1 */
|
||||
#define GPIO1_BASE GPIOX_BASE(1)
|
||||
#define GPIO1_REG32(offset) __REG32(GPIO1_BASE + (offset))
|
||||
#define GPIO1_IRQENABLE1 GPIO1_REG32(0x01C)
|
||||
#define GPIO1_IRQSTATUS1 GPIO1_REG32(0x018)
|
||||
#define GPIO1_IRQENABLE2 GPIO1_REG32(0x02C)
|
||||
#define GPIO1_IRQSTATUS2 GPIO1_REG32(0x028)
|
||||
#define GPIO1_WAKEUPENABLE GPIO1_REG32(0x020)
|
||||
#define GPIO1_RISINGDETECT GPIO1_REG32(0x048)
|
||||
#define GPIO1_DATAIN GPIO1_REG32(0x038)
|
||||
#define GPIO1_OE GPIO1_REG32(0x034)
|
||||
#define GPIO1_DATAOUT GPIO1_REG32(0x03C)
|
||||
|
||||
/* GPIO2 */
|
||||
#define GPIO2_BASE GPIOX_BASE(2)
|
||||
#define GPIO2_REG32(offset) __REG32(GPIO2_BASE + (offset))
|
||||
#define GPIO2_IRQENABLE1 GPIO2_REG32(0x01C)
|
||||
#define GPIO2_IRQSTATUS1 GPIO2_REG32(0x018)
|
||||
#define GPIO2_IRQENABLE2 GPIO2_REG32(0x02C)
|
||||
#define GPIO2_IRQSTATUS2 GPIO2_REG32(0x028)
|
||||
#define GPIO2_WAKEUPENABLE GPIO2_REG32(0x020)
|
||||
#define GPIO2_RISINGDETECT GPIO2_REG32(0x048)
|
||||
#define GPIO2_DATAIN GPIO2_REG32(0x038)
|
||||
#define GPIO2_OE GPIO2_REG32(0x034)
|
||||
#define GPIO2_DATAOUT GPIO2_REG32(0x03C)
|
||||
#define GPIO2_DEBOUNCENABLE GPIO2_REG32(0x050)
|
||||
#define GPIO2_DEBOUNCINGTIME GPIO2_REG32(0x054)
|
||||
|
||||
/* GPIO 3 */
|
||||
#define GPIO3_BASE GPIOX_BASE(3)
|
||||
#define GPIO3_REG32(offset) __REG32(GPIO3_BASE + (offset))
|
||||
#define GPIO3_IRQENABLE1 GPIO3_REG32(0x01C)
|
||||
#define GPIO3_IRQSTATUS1 GPIO3_REG32(0x018)
|
||||
#define GPIO3_IRQENABLE2 GPIO3_REG32(0x02C)
|
||||
#define GPIO3_IRQSTATUS2 GPIO3_REG32(0x028)
|
||||
#define GPIO3_WAKEUPENABLE GPIO3_REG32(0x020)
|
||||
#define GPIO3_RISINGDETECT GPIO3_REG32(0x048)
|
||||
#define GPIO3_FALLINGDETECT GPIO3_REG32(0x04C)
|
||||
#define GPIO3_DATAIN GPIO3_REG32(0x038)
|
||||
#define GPIO3_OE GPIO3_REG32(0x034)
|
||||
#define GPIO3_DATAOUT GPIO3_REG32(0x03C)
|
||||
#define GPIO3_DEBOUNCENABLE GPIO3_REG32(0x050)
|
||||
#define GPIO3_DEBOUNCINGTIME GPIO3_REG32(0x054)
|
||||
#define GPIO3_DEBOUNCENABLE GPIO3_REG32(0x050)
|
||||
#define GPIO3_DEBOUNCINGTIME GPIO3_REG32(0x054)
|
||||
|
||||
/* GPIO 4 */
|
||||
#define GPIO4_BASE GPIOX_BASE(4)
|
||||
#define GPIO4_REG32(offset) __REG32(GPIO4_BASE + (offset))
|
||||
#define GPIO4_IRQENABLE1 GPIO4_REG32(0x01C)
|
||||
#define GPIO4_IRQSTATUS1 GPIO4_REG32(0x018)
|
||||
#define GPIO4_IRQENABLE2 GPIO4_REG32(0x02C)
|
||||
#define GPIO4_IRQSTATUS2 GPIO4_REG32(0x028)
|
||||
#define GPIO4_WAKEUPENABLE GPIO4_REG32(0x020)
|
||||
#define GPIO4_RISINGDETECT GPIO4_REG32(0x048)
|
||||
#define GPIO4_FALLINGDETECT GPIO4_REG32(0x04C)
|
||||
#define GPIO4_DATAIN GPIO4_REG32(0x038)
|
||||
#define GPIO4_OE GPIO4_REG32(0x034)
|
||||
#define GPIO4_DATAOUT GPIO4_REG32(0x03C)
|
||||
#define GPIO4_DEBOUNCENABLE GPIO4_REG32(0x050)
|
||||
#define GPIO4_DEBOUNCINGTIME GPIO4_REG32(0x054)
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP243X)
|
||||
/* GPIO 5 */
|
||||
#define GPIO5_REG32(offset) __REG32((OMAP24XX_GPIO5_BASE + (offset)))
|
||||
#define GPIO5_IRQENABLE1 GPIO5_REG32(0x01C)
|
||||
#define GPIO5_IRQSTATUS1 GPIO5_REG32(0x018)
|
||||
#define GPIO5_IRQENABLE2 GPIO5_REG32(0x02C)
|
||||
#define GPIO5_IRQSTATUS2 GPIO5_REG32(0x028)
|
||||
#define GPIO5_WAKEUPENABLE GPIO5_REG32(0x020)
|
||||
#define GPIO5_RISINGDETECT GPIO5_REG32(0x048)
|
||||
#define GPIO5_FALLINGDETECT GPIO5_REG32(0x04C)
|
||||
#define GPIO5_DATAIN GPIO5_REG32(0x038)
|
||||
#define GPIO5_OE GPIO5_REG32(0x034)
|
||||
#define GPIO5_DATAOUT GPIO5_REG32(0x03C)
|
||||
#define GPIO5_DEBOUNCENABLE GPIO5_REG32(0x050)
|
||||
#define GPIO5_DEBOUNCINGTIME GPIO5_REG32(0x054)
|
||||
#endif
|
||||
|
||||
/* IO CONFIG */
|
||||
#define OMAP24XX_CTRL_BASE (L4_24XX_BASE)
|
||||
#define CONTROL_REG32(offset) __REG32(OMAP24XX_CTRL_BASE + (offset))
|
||||
|
||||
#define CONTROL_PADCONF_SPI1_NCS2 CONTROL_REG32(0x104)
|
||||
#define CONTROL_PADCONF_SYS_XTALOUT CONTROL_REG32(0x134)
|
||||
#define CONTROL_PADCONF_UART1_RX CONTROL_REG32(0x0C8)
|
||||
#define CONTROL_PADCONF_MCBSP1_DX CONTROL_REG32(0x10C)
|
||||
#define CONTROL_PADCONF_GPMC_NCS4 CONTROL_REG32(0x090)
|
||||
#define CONTROL_PADCONF_DSS_D5 CONTROL_REG32(0x0B8)
|
||||
#define CONTROL_PADCONF_DSS_D9 CONTROL_REG32(0x0BC) /* 2420 */
|
||||
#define CONTROL_PADCONF_DSS_D13 CONTROL_REG32(0x0C0)
|
||||
#define CONTROL_PADCONF_DSS_VSYNC CONTROL_REG32(0x0CC)
|
||||
#define CONTROL_PADCONF_SYS_NIRQW0 CONTROL_REG32(0x0BC) /* 2430 */
|
||||
#define CONTROL_PADCONF_SSI1_FLAG_TX CONTROL_REG32(0x108) /* 2430 */
|
||||
|
||||
/* CONTROL */
|
||||
#define CONTROL_DEVCONF CONTROL_REG32(0x274)
|
||||
#define CONTROL_DEVCONF1 CONTROL_REG32(0x2E8)
|
||||
|
||||
/* INTERRUPT CONTROLLER */
|
||||
#define INTC_BASE ((L4_24XX_BASE) + 0xfe000)
|
||||
#define INTC_REG32(offset) __REG32(INTC_BASE + (offset))
|
||||
|
||||
#define INTC1_U_BASE INTC_REG32(0x000)
|
||||
#define INTC_MIR0 INTC_REG32(0x084)
|
||||
#define INTC_MIR_SET0 INTC_REG32(0x08C)
|
||||
#define INTC_MIR_CLEAR0 INTC_REG32(0x088)
|
||||
#define INTC_ISR_CLEAR0 INTC_REG32(0x094)
|
||||
#define INTC_MIR1 INTC_REG32(0x0A4)
|
||||
#define INTC_MIR_SET1 INTC_REG32(0x0AC)
|
||||
#define INTC_MIR_CLEAR1 INTC_REG32(0x0A8)
|
||||
#define INTC_ISR_CLEAR1 INTC_REG32(0x0B4)
|
||||
#define INTC_MIR2 INTC_REG32(0x0C4)
|
||||
#define INTC_MIR_SET2 INTC_REG32(0x0CC)
|
||||
#define INTC_MIR_CLEAR2 INTC_REG32(0x0C8)
|
||||
#define INTC_ISR_CLEAR2 INTC_REG32(0x0D4)
|
||||
#define INTC_SIR_IRQ INTC_REG32(0x040)
|
||||
#define INTC_CONTROL INTC_REG32(0x048)
|
||||
#define INTC_ILR11 INTC_REG32(0x12C) /* PRCM on MPU PIC */
|
||||
#define INTC_ILR30 INTC_REG32(0x178)
|
||||
#define INTC_ILR31 INTC_REG32(0x17C)
|
||||
#define INTC_ILR32 INTC_REG32(0x180)
|
||||
#define INTC_ILR37 INTC_REG32(0x194) /* GPIO4 on MPU PIC */
|
||||
#define INTC_SYSCONFIG INTC_REG32(0x010) /* GPT1 on MPU PIC */
|
||||
|
||||
/* RAM FIREWALL */
|
||||
#define RAMFW_BASE (0x68005000)
|
||||
#define RAMFW_REG32(offset) __REG32(RAMFW_BASE + (offset))
|
||||
|
||||
#define RAMFW_REQINFOPERM0 RAMFW_REG32(0x048)
|
||||
#define RAMFW_READPERM0 RAMFW_REG32(0x050)
|
||||
#define RAMFW_WRITEPERM0 RAMFW_REG32(0x058)
|
||||
|
||||
/* GPMC CS1 FPGA ON USER INTERFACE MODULE */
|
||||
//#define DEBUG_BOARD_LED_REGISTER 0x04000014
|
||||
|
||||
/* GPMC CS0 */
|
||||
#define GPMC_CONFIG1_0 GPMC_REG32(0x060)
|
||||
#define GPMC_CONFIG2_0 GPMC_REG32(0x064)
|
||||
#define GPMC_CONFIG3_0 GPMC_REG32(0x068)
|
||||
#define GPMC_CONFIG4_0 GPMC_REG32(0x06C)
|
||||
#define GPMC_CONFIG5_0 GPMC_REG32(0x070)
|
||||
#define GPMC_CONFIG6_0 GPMC_REG32(0x074)
|
||||
#define GPMC_CONFIG7_0 GPMC_REG32(0x078)
|
||||
|
||||
/* GPMC CS1 */
|
||||
#define GPMC_CONFIG1_1 GPMC_REG32(0x090)
|
||||
#define GPMC_CONFIG2_1 GPMC_REG32(0x094)
|
||||
#define GPMC_CONFIG3_1 GPMC_REG32(0x098)
|
||||
#define GPMC_CONFIG4_1 GPMC_REG32(0x09C)
|
||||
#define GPMC_CONFIG5_1 GPMC_REG32(0x0a0)
|
||||
#define GPMC_CONFIG6_1 GPMC_REG32(0x0a4)
|
||||
#define GPMC_CONFIG7_1 GPMC_REG32(0x0a8)
|
||||
|
||||
/* GPMC CS3 */
|
||||
#define GPMC_CONFIG1_3 GPMC_REG32(0x0F0)
|
||||
#define GPMC_CONFIG2_3 GPMC_REG32(0x0F4)
|
||||
#define GPMC_CONFIG3_3 GPMC_REG32(0x0F8)
|
||||
#define GPMC_CONFIG4_3 GPMC_REG32(0x0FC)
|
||||
#define GPMC_CONFIG5_3 GPMC_REG32(0x100)
|
||||
#define GPMC_CONFIG6_3 GPMC_REG32(0x104)
|
||||
#define GPMC_CONFIG7_3 GPMC_REG32(0x108)
|
||||
|
||||
/* DSS */
|
||||
#define DSS_CONTROL DISP_REG32(0x040)
|
||||
#define DISPC_CONTROL DISP_REG32(0x440)
|
||||
#define DISPC_SYSSTATUS DISP_REG32(0x414)
|
||||
#define DISPC_IRQSTATUS DISP_REG32(0x418)
|
||||
#define DISPC_IRQENABLE DISP_REG32(0x41C)
|
||||
#define DISPC_CONFIG DISP_REG32(0x444)
|
||||
#define DISPC_DEFAULT_COLOR0 DISP_REG32(0x44C)
|
||||
#define DISPC_DEFAULT_COLOR1 DISP_REG32(0x450)
|
||||
#define DISPC_TRANS_COLOR0 DISP_REG32(0x454)
|
||||
#define DISPC_TRANS_COLOR1 DISP_REG32(0x458)
|
||||
#define DISPC_LINE_NUMBER DISP_REG32(0x460)
|
||||
#define DISPC_TIMING_H DISP_REG32(0x464)
|
||||
#define DISPC_TIMING_V DISP_REG32(0x468)
|
||||
#define DISPC_POL_FREQ DISP_REG32(0x46C)
|
||||
#define DISPC_DIVISOR DISP_REG32(0x470)
|
||||
#define DISPC_SIZE_DIG DISP_REG32(0x478)
|
||||
#define DISPC_SIZE_LCD DISP_REG32(0x47C)
|
||||
#define DISPC_GFX_BA0 DISP_REG32(0x480)
|
||||
#define DISPC_GFX_BA1 DISP_REG32(0x484)
|
||||
#define DISPC_GFX_POSITION DISP_REG32(0x488)
|
||||
#define DISPC_GFX_SIZE DISP_REG32(0x48C)
|
||||
#define DISPC_GFX_ATTRIBUTES DISP_REG32(0x4A0)
|
||||
#define DISPC_GFX_FIFO_THRESHOLD DISP_REG32(0x4A4)
|
||||
#define DISPC_GFX_ROW_INC DISP_REG32(0x4AC)
|
||||
#define DISPC_GFX_PIXEL_INC DISP_REG32(0x4B0)
|
||||
#define DISPC_GFX_WINDOW_SKIP DISP_REG32(0x4B4)
|
||||
#define DISPC_GFX_TABLE_BA DISP_REG32(0x4B8)
|
||||
#define DISPC_DATA_CYCLE1 DISP_REG32(0x5D4)
|
||||
#define DISPC_DATA_CYCLE2 DISP_REG32(0x5D8)
|
||||
#define DISPC_DATA_CYCLE3 DISP_REG32(0x5DC)
|
||||
|
||||
/* HSUSB Suspend */
|
||||
#define HSUSB_CTRL __REG8(0x480AC001)
|
||||
#define USBOTG_POWER __REG32(0x480AC000)
|
||||
|
||||
/* HS MMC */
|
||||
#define MMCHS1_SYSCONFIG __REG32(0x4809C010)
|
||||
#define MMCHS2_SYSCONFIG __REG32(0x480b4010)
|
||||
|
||||
#endif /* __ASSEMBLER__ */
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -17,19 +17,27 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/clk.h>
|
||||
|
||||
#include "prcm-regs.h"
|
||||
#include <asm/io.h>
|
||||
|
||||
#include "prm.h"
|
||||
#include "prm-regbits-24xx.h"
|
||||
|
||||
extern void omap2_clk_prepare_for_reboot(void);
|
||||
|
||||
u32 omap_prcm_get_reset_sources(void)
|
||||
{
|
||||
return RM_RSTST_WKUP & 0x7f;
|
||||
return prm_read_mod_reg(WKUP_MOD, RM_RSTST) & 0x7f;
|
||||
}
|
||||
EXPORT_SYMBOL(omap_prcm_get_reset_sources);
|
||||
|
||||
/* Resets clock rates and reboots the system. Only called from system.h */
|
||||
void omap_prcm_arch_reset(char mode)
|
||||
{
|
||||
u32 wkup;
|
||||
omap2_clk_prepare_for_reboot();
|
||||
RM_RSTCTRL_WKUP |= 2;
|
||||
|
||||
if (cpu_is_omap24xx()) {
|
||||
wkup = prm_read_mod_reg(WKUP_MOD, RM_RSTCTRL) | OMAP_RST_DPLL3;
|
||||
prm_write_mod_reg(wkup, WKUP_MOD, RM_RSTCTRL);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,279 @@
|
||||
#ifndef __ARCH_ARM_MACH_OMAP2_PRM_REGBITS_24XX_H
|
||||
#define __ARCH_ARM_MACH_OMAP2_PRM_REGBITS_24XX_H
|
||||
|
||||
/*
|
||||
* OMAP24XX Power/Reset Management register bits
|
||||
*
|
||||
* Copyright (C) 2007 Texas Instruments, Inc.
|
||||
* Copyright (C) 2007 Nokia Corporation
|
||||
*
|
||||
* Written by Paul Walmsley
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include "prm.h"
|
||||
|
||||
/* Bits shared between registers */
|
||||
|
||||
/* PRCM_IRQSTATUS_MPU, PM_IRQSTATUS_DSP, PRCM_IRQSTATUS_IVA shared bits */
|
||||
#define OMAP24XX_VOLTTRANS_ST (1 << 2)
|
||||
#define OMAP24XX_WKUP2_ST (1 << 1)
|
||||
#define OMAP24XX_WKUP1_ST (1 << 0)
|
||||
|
||||
/* PRCM_IRQENABLE_MPU, PM_IRQENABLE_DSP, PRCM_IRQENABLE_IVA shared bits */
|
||||
#define OMAP24XX_VOLTTRANS_EN (1 << 2)
|
||||
#define OMAP24XX_WKUP2_EN (1 << 1)
|
||||
#define OMAP24XX_WKUP1_EN (1 << 0)
|
||||
|
||||
/* PM_WKDEP_GFX, PM_WKDEP_MPU, PM_WKDEP_DSP, PM_WKDEP_MDM shared bits */
|
||||
#define OMAP24XX_EN_MPU (1 << 1)
|
||||
#define OMAP24XX_EN_CORE (1 << 0)
|
||||
|
||||
/*
|
||||
* PM_PWSTCTRL_MPU, PM_PWSTCTRL_GFX, PM_PWSTCTRL_DSP, PM_PWSTCTRL_MDM
|
||||
* shared bits
|
||||
*/
|
||||
#define OMAP24XX_MEMONSTATE_SHIFT 10
|
||||
#define OMAP24XX_MEMONSTATE_MASK (0x3 << 10)
|
||||
#define OMAP24XX_MEMRETSTATE (1 << 3)
|
||||
|
||||
/* PM_PWSTCTRL_GFX, PM_PWSTCTRL_DSP, PM_PWSTCTRL_MDM shared bits */
|
||||
#define OMAP24XX_FORCESTATE (1 << 18)
|
||||
|
||||
/*
|
||||
* PM_PWSTST_CORE, PM_PWSTST_GFX, PM_PWSTST_MPU, PM_PWSTST_DSP,
|
||||
* PM_PWSTST_MDM shared bits
|
||||
*/
|
||||
#define OMAP24XX_CLKACTIVITY (1 << 19)
|
||||
|
||||
/* PM_PWSTST_MPU, PM_PWSTST_CORE, PM_PWSTST_DSP shared bits */
|
||||
#define OMAP24XX_LASTSTATEENTERED_SHIFT 4
|
||||
#define OMAP24XX_LASTSTATEENTERED_MASK (0x3 << 4)
|
||||
|
||||
/* PM_PWSTST_MPU and PM_PWSTST_DSP shared bits */
|
||||
#define OMAP2430_MEMSTATEST_SHIFT 10
|
||||
#define OMAP2430_MEMSTATEST_MASK (0x3 << 10)
|
||||
|
||||
/* PM_PWSTST_GFX, PM_PWSTST_DSP, PM_PWSTST_MDM shared bits */
|
||||
#define OMAP24XX_POWERSTATEST_SHIFT 0
|
||||
#define OMAP24XX_POWERSTATEST_MASK (0x3 << 0)
|
||||
|
||||
|
||||
/* Bits specific to each register */
|
||||
|
||||
/* PRCM_REVISION */
|
||||
#define OMAP24XX_REV_SHIFT 0
|
||||
#define OMAP24XX_REV_MASK (0xff << 0)
|
||||
|
||||
/* PRCM_SYSCONFIG */
|
||||
#define OMAP24XX_AUTOIDLE (1 << 0)
|
||||
|
||||
/* PRCM_IRQSTATUS_MPU specific bits */
|
||||
#define OMAP2430_DPLL_RECAL_ST (1 << 6)
|
||||
#define OMAP24XX_TRANSITION_ST (1 << 5)
|
||||
#define OMAP24XX_EVGENOFF_ST (1 << 4)
|
||||
#define OMAP24XX_EVGENON_ST (1 << 3)
|
||||
|
||||
/* PRCM_IRQENABLE_MPU specific bits */
|
||||
#define OMAP2430_DPLL_RECAL_EN (1 << 6)
|
||||
#define OMAP24XX_TRANSITION_EN (1 << 5)
|
||||
#define OMAP24XX_EVGENOFF_EN (1 << 4)
|
||||
#define OMAP24XX_EVGENON_EN (1 << 3)
|
||||
|
||||
/* PRCM_VOLTCTRL */
|
||||
#define OMAP24XX_AUTO_EXTVOLT (1 << 15)
|
||||
#define OMAP24XX_FORCE_EXTVOLT (1 << 14)
|
||||
#define OMAP24XX_SETOFF_LEVEL_SHIFT 12
|
||||
#define OMAP24XX_SETOFF_LEVEL_MASK (0x3 << 12)
|
||||
#define OMAP24XX_MEMRETCTRL (1 << 8)
|
||||
#define OMAP24XX_SETRET_LEVEL_SHIFT 6
|
||||
#define OMAP24XX_SETRET_LEVEL_MASK (0x3 << 6)
|
||||
#define OMAP24XX_VOLT_LEVEL_SHIFT 0
|
||||
#define OMAP24XX_VOLT_LEVEL_MASK (0x3 << 0)
|
||||
|
||||
/* PRCM_VOLTST */
|
||||
#define OMAP24XX_ST_VOLTLEVEL_SHIFT 0
|
||||
#define OMAP24XX_ST_VOLTLEVEL_MASK (0x3 << 0)
|
||||
|
||||
/* PRCM_CLKSRC_CTRL specific bits */
|
||||
|
||||
/* PRCM_CLKOUT_CTRL */
|
||||
#define OMAP2420_CLKOUT2_EN_SHIFT 15
|
||||
#define OMAP2420_CLKOUT2_EN (1 << 15)
|
||||
#define OMAP2420_CLKOUT2_DIV_SHIFT 11
|
||||
#define OMAP2420_CLKOUT2_DIV_MASK (0x7 << 11)
|
||||
#define OMAP2420_CLKOUT2_SOURCE_SHIFT 8
|
||||
#define OMAP2420_CLKOUT2_SOURCE_MASK (0x3 << 8)
|
||||
#define OMAP24XX_CLKOUT_EN_SHIFT 7
|
||||
#define OMAP24XX_CLKOUT_EN (1 << 7)
|
||||
#define OMAP24XX_CLKOUT_DIV_SHIFT 3
|
||||
#define OMAP24XX_CLKOUT_DIV_MASK (0x7 << 3)
|
||||
#define OMAP24XX_CLKOUT_SOURCE_SHIFT 0
|
||||
#define OMAP24XX_CLKOUT_SOURCE_MASK (0x3 << 0)
|
||||
|
||||
/* PRCM_CLKEMUL_CTRL */
|
||||
#define OMAP24XX_EMULATION_EN_SHIFT 0
|
||||
#define OMAP24XX_EMULATION_EN (1 << 0)
|
||||
|
||||
/* PRCM_CLKCFG_CTRL */
|
||||
#define OMAP24XX_VALID_CONFIG (1 << 0)
|
||||
|
||||
/* PRCM_CLKCFG_STATUS */
|
||||
#define OMAP24XX_CONFIG_STATUS (1 << 0)
|
||||
|
||||
/* PRCM_VOLTSETUP specific bits */
|
||||
|
||||
/* PRCM_CLKSSETUP specific bits */
|
||||
|
||||
/* PRCM_POLCTRL */
|
||||
#define OMAP2420_CLKOUT2_POL (1 << 10)
|
||||
#define OMAP24XX_CLKOUT_POL (1 << 9)
|
||||
#define OMAP24XX_CLKREQ_POL (1 << 8)
|
||||
#define OMAP2430_USE_POWEROK (1 << 2)
|
||||
#define OMAP2430_POWEROK_POL (1 << 1)
|
||||
#define OMAP24XX_EXTVOL_POL (1 << 0)
|
||||
|
||||
/* RM_RSTST_MPU specific bits */
|
||||
/* 2430 calls GLOBALWMPU_RST "GLOBALWARM_RST" instead */
|
||||
|
||||
/* PM_WKDEP_MPU specific bits */
|
||||
#define OMAP2430_PM_WKDEP_MPU_EN_MDM (1 << 5)
|
||||
#define OMAP24XX_PM_WKDEP_MPU_EN_DSP (1 << 2)
|
||||
|
||||
/* PM_EVGENCTRL_MPU specific bits */
|
||||
|
||||
/* PM_EVEGENONTIM_MPU specific bits */
|
||||
|
||||
/* PM_EVEGENOFFTIM_MPU specific bits */
|
||||
|
||||
/* PM_PWSTCTRL_MPU specific bits */
|
||||
#define OMAP2430_FORCESTATE (1 << 18)
|
||||
|
||||
/* PM_PWSTST_MPU specific bits */
|
||||
/* INTRANSITION, CLKACTIVITY, POWERSTATE, MEMSTATEST are 2430 only */
|
||||
|
||||
/* PM_WKEN1_CORE specific bits */
|
||||
|
||||
/* PM_WKEN2_CORE specific bits */
|
||||
|
||||
/* PM_WKST1_CORE specific bits*/
|
||||
|
||||
/* PM_WKST2_CORE specific bits */
|
||||
|
||||
/* PM_WKDEP_CORE specific bits*/
|
||||
#define OMAP2430_PM_WKDEP_CORE_EN_MDM (1 << 5)
|
||||
#define OMAP24XX_PM_WKDEP_CORE_EN_GFX (1 << 3)
|
||||
#define OMAP24XX_PM_WKDEP_CORE_EN_DSP (1 << 2)
|
||||
|
||||
/* PM_PWSTCTRL_CORE specific bits */
|
||||
#define OMAP24XX_MEMORYCHANGE (1 << 20)
|
||||
#define OMAP24XX_MEM3ONSTATE_SHIFT 14
|
||||
#define OMAP24XX_MEM3ONSTATE_MASK (0x3 << 14)
|
||||
#define OMAP24XX_MEM2ONSTATE_SHIFT 12
|
||||
#define OMAP24XX_MEM2ONSTATE_MASK (0x3 << 12)
|
||||
#define OMAP24XX_MEM1ONSTATE_SHIFT 10
|
||||
#define OMAP24XX_MEM1ONSTATE_MASK (0x3 << 10)
|
||||
#define OMAP24XX_MEM3RETSTATE (1 << 5)
|
||||
#define OMAP24XX_MEM2RETSTATE (1 << 4)
|
||||
#define OMAP24XX_MEM1RETSTATE (1 << 3)
|
||||
|
||||
/* PM_PWSTST_CORE specific bits */
|
||||
#define OMAP24XX_MEM3STATEST_SHIFT 14
|
||||
#define OMAP24XX_MEM3STATEST_MASK (0x3 << 14)
|
||||
#define OMAP24XX_MEM2STATEST_SHIFT 12
|
||||
#define OMAP24XX_MEM2STATEST_MASK (0x3 << 12)
|
||||
#define OMAP24XX_MEM1STATEST_SHIFT 10
|
||||
#define OMAP24XX_MEM1STATEST_MASK (0x3 << 10)
|
||||
|
||||
/* RM_RSTCTRL_GFX */
|
||||
#define OMAP24XX_GFX_RST (1 << 0)
|
||||
|
||||
/* RM_RSTST_GFX specific bits */
|
||||
#define OMAP24XX_GFX_SW_RST (1 << 4)
|
||||
|
||||
/* PM_PWSTCTRL_GFX specific bits */
|
||||
|
||||
/* PM_WKDEP_GFX specific bits */
|
||||
/* 2430 often calls EN_WAKEUP "EN_WKUP" */
|
||||
|
||||
/* RM_RSTCTRL_WKUP specific bits */
|
||||
|
||||
/* RM_RSTTIME_WKUP specific bits */
|
||||
|
||||
/* RM_RSTST_WKUP specific bits */
|
||||
/* 2430 calls EXTWMPU_RST "EXTWARM_RST" and GLOBALWMPU_RST "GLOBALWARM_RST" */
|
||||
#define OMAP24XX_EXTWMPU_RST (1 << 6)
|
||||
#define OMAP24XX_SECU_WD_RST (1 << 5)
|
||||
#define OMAP24XX_MPU_WD_RST (1 << 4)
|
||||
#define OMAP24XX_SECU_VIOL_RST (1 << 3)
|
||||
|
||||
/* PM_WKEN_WKUP specific bits */
|
||||
|
||||
/* PM_WKST_WKUP specific bits */
|
||||
|
||||
/* RM_RSTCTRL_DSP */
|
||||
#define OMAP2420_RST_IVA (1 << 8)
|
||||
#define OMAP24XX_RST2_DSP (1 << 1)
|
||||
#define OMAP24XX_RST1_DSP (1 << 0)
|
||||
|
||||
/* RM_RSTST_DSP specific bits */
|
||||
/* 2430 calls GLOBALWMPU_RST "GLOBALWARM_RST" */
|
||||
#define OMAP2420_IVA_SW_RST (1 << 8)
|
||||
#define OMAP24XX_DSP_SW_RST2 (1 << 5)
|
||||
#define OMAP24XX_DSP_SW_RST1 (1 << 4)
|
||||
|
||||
/* PM_WKDEP_DSP specific bits */
|
||||
|
||||
/* PM_PWSTCTRL_DSP specific bits */
|
||||
/* 2430 only: MEMONSTATE, MEMRETSTATE */
|
||||
#define OMAP2420_MEMIONSTATE_SHIFT 12
|
||||
#define OMAP2420_MEMIONSTATE_MASK (0x3 << 12)
|
||||
#define OMAP2420_MEMIRETSTATE (1 << 4)
|
||||
|
||||
/* PM_PWSTST_DSP specific bits */
|
||||
/* MEMSTATEST is 2430 only */
|
||||
#define OMAP2420_MEMISTATEST_SHIFT 12
|
||||
#define OMAP2420_MEMISTATEST_MASK (0x3 << 12)
|
||||
|
||||
/* PRCM_IRQSTATUS_DSP specific bits */
|
||||
|
||||
/* PRCM_IRQENABLE_DSP specific bits */
|
||||
|
||||
/* RM_RSTCTRL_MDM */
|
||||
/* 2430 only */
|
||||
#define OMAP2430_PWRON1_MDM (1 << 1)
|
||||
#define OMAP2430_RST1_MDM (1 << 0)
|
||||
|
||||
/* RM_RSTST_MDM specific bits */
|
||||
/* 2430 only */
|
||||
#define OMAP2430_MDM_SECU_VIOL (1 << 6)
|
||||
#define OMAP2430_MDM_SW_PWRON1 (1 << 5)
|
||||
#define OMAP2430_MDM_SW_RST1 (1 << 4)
|
||||
|
||||
/* PM_WKEN_MDM */
|
||||
/* 2430 only */
|
||||
#define OMAP2430_PM_WKEN_MDM_EN_MDM (1 << 0)
|
||||
|
||||
/* PM_WKST_MDM specific bits */
|
||||
/* 2430 only */
|
||||
|
||||
/* PM_WKDEP_MDM specific bits */
|
||||
/* 2430 only */
|
||||
|
||||
/* PM_PWSTCTRL_MDM specific bits */
|
||||
/* 2430 only */
|
||||
#define OMAP2430_KILLDOMAINWKUP (1 << 19)
|
||||
|
||||
/* PM_PWSTST_MDM specific bits */
|
||||
/* 2430 only */
|
||||
|
||||
/* PRCM_IRQSTATUS_IVA */
|
||||
/* 2420 only */
|
||||
|
||||
/* PRCM_IRQENABLE_IVA */
|
||||
/* 2420 only */
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,582 @@
|
||||
#ifndef __ARCH_ARM_MACH_OMAP2_PRM_REGBITS_34XX_H
|
||||
#define __ARCH_ARM_MACH_OMAP2_PRM_REGBITS_34XX_H
|
||||
|
||||
/*
|
||||
* OMAP3430 Power/Reset Management register bits
|
||||
*
|
||||
* Copyright (C) 2007-2008 Texas Instruments, Inc.
|
||||
* Copyright (C) 2007-2008 Nokia Corporation
|
||||
*
|
||||
* Written by Paul Walmsley
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include "prm.h"
|
||||
|
||||
/* Shared register bits */
|
||||
|
||||
/* PRM_VC_CMD_VAL_0, PRM_VC_CMD_VAL_1 shared bits */
|
||||
#define OMAP3430_ON_SHIFT 24
|
||||
#define OMAP3430_ON_MASK (0xff << 24)
|
||||
#define OMAP3430_ONLP_SHIFT 16
|
||||
#define OMAP3430_ONLP_MASK (0xff << 16)
|
||||
#define OMAP3430_RET_SHIFT 8
|
||||
#define OMAP3430_RET_MASK (0xff << 8)
|
||||
#define OMAP3430_OFF_SHIFT 0
|
||||
#define OMAP3430_OFF_MASK (0xff << 0)
|
||||
|
||||
/* PRM_VP1_CONFIG, PRM_VP2_CONFIG shared bits */
|
||||
#define OMAP3430_ERROROFFSET_SHIFT 24
|
||||
#define OMAP3430_ERROROFFSET_MASK (0xff << 24)
|
||||
#define OMAP3430_ERRORGAIN_SHIFT 16
|
||||
#define OMAP3430_ERRORGAIN_MASK (0xff << 16)
|
||||
#define OMAP3430_INITVOLTAGE_SHIFT 8
|
||||
#define OMAP3430_INITVOLTAGE_MASK (0xff << 8)
|
||||
#define OMAP3430_TIMEOUTEN (1 << 3)
|
||||
#define OMAP3430_INITVDD (1 << 2)
|
||||
#define OMAP3430_FORCEUPDATE (1 << 1)
|
||||
#define OMAP3430_VPENABLE (1 << 0)
|
||||
|
||||
/* PRM_VP1_VSTEPMIN, PRM_VP2_VSTEPMIN shared bits */
|
||||
#define OMAP3430_SMPSWAITTIMEMIN_SHIFT 8
|
||||
#define OMAP3430_SMPSWAITTIMEMIN_MASK (0xffff << 8)
|
||||
#define OMAP3430_VSTEPMIN_SHIFT 0
|
||||
#define OMAP3430_VSTEPMIN_MASK (0xff << 0)
|
||||
|
||||
/* PRM_VP1_VSTEPMAX, PRM_VP2_VSTEPMAX shared bits */
|
||||
#define OMAP3430_SMPSWAITTIMEMAX_SHIFT 8
|
||||
#define OMAP3430_SMPSWAITTIMEMAX_MASK (0xffff << 8)
|
||||
#define OMAP3430_VSTEPMAX_SHIFT 0
|
||||
#define OMAP3430_VSTEPMAX_MASK (0xff << 0)
|
||||
|
||||
/* PRM_VP1_VLIMITTO, PRM_VP2_VLIMITTO shared bits */
|
||||
#define OMAP3430_VDDMAX_SHIFT 24
|
||||
#define OMAP3430_VDDMAX_MASK (0xff << 24)
|
||||
#define OMAP3430_VDDMIN_SHIFT 16
|
||||
#define OMAP3430_VDDMIN_MASK (0xff << 16)
|
||||
#define OMAP3430_TIMEOUT_SHIFT 0
|
||||
#define OMAP3430_TIMEOUT_MASK (0xffff << 0)
|
||||
|
||||
/* PRM_VP1_VOLTAGE, PRM_VP2_VOLTAGE shared bits */
|
||||
#define OMAP3430_VPVOLTAGE_SHIFT 0
|
||||
#define OMAP3430_VPVOLTAGE_MASK (0xff << 0)
|
||||
|
||||
/* PRM_VP1_STATUS, PRM_VP2_STATUS shared bits */
|
||||
#define OMAP3430_VPINIDLE (1 << 0)
|
||||
|
||||
/* PM_WKDEP_IVA2, PM_WKDEP_MPU shared bits */
|
||||
#define OMAP3430_EN_PER (1 << 7)
|
||||
|
||||
/* PM_PWSTCTRL_IVA2, PM_PWSTCTRL_MPU, PM_PWSTCTRL_CORE shared bits */
|
||||
#define OMAP3430_MEMORYCHANGE (1 << 3)
|
||||
|
||||
/* PM_PWSTST_IVA2, PM_PWSTST_CORE shared bits */
|
||||
#define OMAP3430_LOGICSTATEST (1 << 2)
|
||||
|
||||
/* PM_PREPWSTST_IVA2, PM_PREPWSTST_CORE shared bits */
|
||||
#define OMAP3430_LASTLOGICSTATEENTERED (1 << 2)
|
||||
|
||||
/*
|
||||
* PM_PREPWSTST_IVA2, PM_PREPWSTST_MPU, PM_PREPWSTST_CORE,
|
||||
* PM_PREPWSTST_GFX, PM_PREPWSTST_DSS, PM_PREPWSTST_CAM,
|
||||
* PM_PREPWSTST_PER, PM_PREPWSTST_NEON shared bits
|
||||
*/
|
||||
#define OMAP3430_LASTPOWERSTATEENTERED_SHIFT 0
|
||||
#define OMAP3430_LASTPOWERSTATEENTERED_MASK (0x3 << 0)
|
||||
|
||||
/* PRM_IRQSTATUS_IVA2, PRM_IRQSTATUS_MPU shared bits */
|
||||
#define OMAP3430_WKUP_ST (1 << 0)
|
||||
|
||||
/* PRM_IRQENABLE_IVA2, PRM_IRQENABLE_MPU shared bits */
|
||||
#define OMAP3430_WKUP_EN (1 << 0)
|
||||
|
||||
/* PM_MPUGRPSEL1_CORE, PM_IVA2GRPSEL1_CORE shared bits */
|
||||
#define OMAP3430_GRPSEL_MMC2 (1 << 25)
|
||||
#define OMAP3430_GRPSEL_MMC1 (1 << 24)
|
||||
#define OMAP3430_GRPSEL_MCSPI4 (1 << 21)
|
||||
#define OMAP3430_GRPSEL_MCSPI3 (1 << 20)
|
||||
#define OMAP3430_GRPSEL_MCSPI2 (1 << 19)
|
||||
#define OMAP3430_GRPSEL_MCSPI1 (1 << 18)
|
||||
#define OMAP3430_GRPSEL_I2C3 (1 << 17)
|
||||
#define OMAP3430_GRPSEL_I2C2 (1 << 16)
|
||||
#define OMAP3430_GRPSEL_I2C1 (1 << 15)
|
||||
#define OMAP3430_GRPSEL_UART2 (1 << 14)
|
||||
#define OMAP3430_GRPSEL_UART1 (1 << 13)
|
||||
#define OMAP3430_GRPSEL_GPT11 (1 << 12)
|
||||
#define OMAP3430_GRPSEL_GPT10 (1 << 11)
|
||||
#define OMAP3430_GRPSEL_MCBSP5 (1 << 10)
|
||||
#define OMAP3430_GRPSEL_MCBSP1 (1 << 9)
|
||||
#define OMAP3430_GRPSEL_HSOTGUSB (1 << 4)
|
||||
#define OMAP3430_GRPSEL_D2D (1 << 3)
|
||||
|
||||
/*
|
||||
* PM_PWSTCTRL_GFX, PM_PWSTCTRL_DSS, PM_PWSTCTRL_CAM,
|
||||
* PM_PWSTCTRL_PER shared bits
|
||||
*/
|
||||
#define OMAP3430_MEMONSTATE_SHIFT 16
|
||||
#define OMAP3430_MEMONSTATE_MASK (0x3 << 16)
|
||||
#define OMAP3430_MEMRETSTATE (1 << 8)
|
||||
|
||||
/* PM_MPUGRPSEL_PER, PM_IVA2GRPSEL_PER shared bits */
|
||||
#define OMAP3430_GRPSEL_GPIO6 (1 << 17)
|
||||
#define OMAP3430_GRPSEL_GPIO5 (1 << 16)
|
||||
#define OMAP3430_GRPSEL_GPIO4 (1 << 15)
|
||||
#define OMAP3430_GRPSEL_GPIO3 (1 << 14)
|
||||
#define OMAP3430_GRPSEL_GPIO2 (1 << 13)
|
||||
#define OMAP3430_GRPSEL_UART3 (1 << 11)
|
||||
#define OMAP3430_GRPSEL_GPT9 (1 << 10)
|
||||
#define OMAP3430_GRPSEL_GPT8 (1 << 9)
|
||||
#define OMAP3430_GRPSEL_GPT7 (1 << 8)
|
||||
#define OMAP3430_GRPSEL_GPT6 (1 << 7)
|
||||
#define OMAP3430_GRPSEL_GPT5 (1 << 6)
|
||||
#define OMAP3430_GRPSEL_GPT4 (1 << 5)
|
||||
#define OMAP3430_GRPSEL_GPT3 (1 << 4)
|
||||
#define OMAP3430_GRPSEL_GPT2 (1 << 3)
|
||||
#define OMAP3430_GRPSEL_MCBSP4 (1 << 2)
|
||||
#define OMAP3430_GRPSEL_MCBSP3 (1 << 1)
|
||||
#define OMAP3430_GRPSEL_MCBSP2 (1 << 0)
|
||||
|
||||
/* PM_MPUGRPSEL_WKUP, PM_IVA2GRPSEL_WKUP shared bits */
|
||||
#define OMAP3430_GRPSEL_IO (1 << 8)
|
||||
#define OMAP3430_GRPSEL_SR2 (1 << 7)
|
||||
#define OMAP3430_GRPSEL_SR1 (1 << 6)
|
||||
#define OMAP3430_GRPSEL_GPIO1 (1 << 3)
|
||||
#define OMAP3430_GRPSEL_GPT12 (1 << 1)
|
||||
#define OMAP3430_GRPSEL_GPT1 (1 << 0)
|
||||
|
||||
/* Bits specific to each register */
|
||||
|
||||
/* RM_RSTCTRL_IVA2 */
|
||||
#define OMAP3430_RST3_IVA2 (1 << 2)
|
||||
#define OMAP3430_RST2_IVA2 (1 << 1)
|
||||
#define OMAP3430_RST1_IVA2 (1 << 0)
|
||||
|
||||
/* RM_RSTST_IVA2 specific bits */
|
||||
#define OMAP3430_EMULATION_VSEQ_RST (1 << 13)
|
||||
#define OMAP3430_EMULATION_VHWA_RST (1 << 12)
|
||||
#define OMAP3430_EMULATION_IVA2_RST (1 << 11)
|
||||
#define OMAP3430_IVA2_SW_RST3 (1 << 10)
|
||||
#define OMAP3430_IVA2_SW_RST2 (1 << 9)
|
||||
#define OMAP3430_IVA2_SW_RST1 (1 << 8)
|
||||
|
||||
/* PM_WKDEP_IVA2 specific bits */
|
||||
|
||||
/* PM_PWSTCTRL_IVA2 specific bits */
|
||||
#define OMAP3430_L2FLATMEMONSTATE_SHIFT 22
|
||||
#define OMAP3430_L2FLATMEMONSTATE_MASK (0x3 << 22)
|
||||
#define OMAP3430_SHAREDL2CACHEFLATONSTATE_SHIFT 20
|
||||
#define OMAP3430_SHAREDL2CACHEFLATONSTATE_MASK (0x3 << 20)
|
||||
#define OMAP3430_L1FLATMEMONSTATE_SHIFT 18
|
||||
#define OMAP3430_L1FLATMEMONSTATE_MASK (0x3 << 18)
|
||||
#define OMAP3430_SHAREDL1CACHEFLATONSTATE_SHIFT 16
|
||||
#define OMAP3430_SHAREDL1CACHEFLATONSTATE_MASK (0x3 << 16)
|
||||
#define OMAP3430_L2FLATMEMRETSTATE (1 << 11)
|
||||
#define OMAP3430_SHAREDL2CACHEFLATRETSTATE (1 << 10)
|
||||
#define OMAP3430_L1FLATMEMRETSTATE (1 << 9)
|
||||
#define OMAP3430_SHAREDL1CACHEFLATRETSTATE (1 << 8)
|
||||
|
||||
/* PM_PWSTST_IVA2 specific bits */
|
||||
#define OMAP3430_L2FLATMEMSTATEST_SHIFT 10
|
||||
#define OMAP3430_L2FLATMEMSTATEST_MASK (0x3 << 10)
|
||||
#define OMAP3430_SHAREDL2CACHEFLATSTATEST_SHIFT 8
|
||||
#define OMAP3430_SHAREDL2CACHEFLATSTATEST_MASK (0x3 << 8)
|
||||
#define OMAP3430_L1FLATMEMSTATEST_SHIFT 6
|
||||
#define OMAP3430_L1FLATMEMSTATEST_MASK (0x3 << 6)
|
||||
#define OMAP3430_SHAREDL1CACHEFLATSTATEST_SHIFT 4
|
||||
#define OMAP3430_SHAREDL1CACHEFLATSTATEST_MASK (0x3 << 4)
|
||||
|
||||
/* PM_PREPWSTST_IVA2 specific bits */
|
||||
#define OMAP3430_LASTL2FLATMEMSTATEENTERED_SHIFT 10
|
||||
#define OMAP3430_LASTL2FLATMEMSTATEENTERED_MASK (0x3 << 10)
|
||||
#define OMAP3430_LASTSHAREDL2CACHEFLATSTATEENTERED_SHIFT 8
|
||||
#define OMAP3430_LASTSHAREDL2CACHEFLATSTATEENTERED_MASK (0x3 << 8)
|
||||
#define OMAP3430_LASTL1FLATMEMSTATEENTERED_SHIFT 6
|
||||
#define OMAP3430_LASTL1FLATMEMSTATEENTERED_MASK (0x3 << 6)
|
||||
#define OMAP3430_LASTSHAREDL1CACHEFLATSTATEENTERED_SHIFT 4
|
||||
#define OMAP3430_LASTSHAREDL1CACHEFLATSTATEENTERED_MASK (0x3 << 4)
|
||||
|
||||
/* PRM_IRQSTATUS_IVA2 specific bits */
|
||||
#define OMAP3430_PRM_IRQSTATUS_IVA2_IVA2_DPLL_ST (1 << 2)
|
||||
#define OMAP3430_FORCEWKUP_ST (1 << 1)
|
||||
|
||||
/* PRM_IRQENABLE_IVA2 specific bits */
|
||||
#define OMAP3430_PRM_IRQENABLE_IVA2_IVA2_DPLL_RECAL_EN (1 << 2)
|
||||
#define OMAP3430_FORCEWKUP_EN (1 << 1)
|
||||
|
||||
/* PRM_REVISION specific bits */
|
||||
|
||||
/* PRM_SYSCONFIG specific bits */
|
||||
|
||||
/* PRM_IRQSTATUS_MPU specific bits */
|
||||
#define OMAP3430ES2_SND_PERIPH_DPLL_ST_SHIFT 25
|
||||
#define OMAP3430ES2_SND_PERIPH_DPLL_ST (1 << 25)
|
||||
#define OMAP3430_VC_TIMEOUTERR_ST (1 << 24)
|
||||
#define OMAP3430_VC_RAERR_ST (1 << 23)
|
||||
#define OMAP3430_VC_SAERR_ST (1 << 22)
|
||||
#define OMAP3430_VP2_TRANXDONE_ST (1 << 21)
|
||||
#define OMAP3430_VP2_EQVALUE_ST (1 << 20)
|
||||
#define OMAP3430_VP2_NOSMPSACK_ST (1 << 19)
|
||||
#define OMAP3430_VP2_MAXVDD_ST (1 << 18)
|
||||
#define OMAP3430_VP2_MINVDD_ST (1 << 17)
|
||||
#define OMAP3430_VP2_OPPCHANGEDONE_ST (1 << 16)
|
||||
#define OMAP3430_VP1_TRANXDONE_ST (1 << 15)
|
||||
#define OMAP3430_VP1_EQVALUE_ST (1 << 14)
|
||||
#define OMAP3430_VP1_NOSMPSACK_ST (1 << 13)
|
||||
#define OMAP3430_VP1_MAXVDD_ST (1 << 12)
|
||||
#define OMAP3430_VP1_MINVDD_ST (1 << 11)
|
||||
#define OMAP3430_VP1_OPPCHANGEDONE_ST (1 << 10)
|
||||
#define OMAP3430_IO_ST (1 << 9)
|
||||
#define OMAP3430_PRM_IRQSTATUS_MPU_IVA2_DPLL_ST (1 << 8)
|
||||
#define OMAP3430_PRM_IRQSTATUS_MPU_IVA2_DPLL_ST_SHIFT 8
|
||||
#define OMAP3430_MPU_DPLL_ST (1 << 7)
|
||||
#define OMAP3430_MPU_DPLL_ST_SHIFT 7
|
||||
#define OMAP3430_PERIPH_DPLL_ST (1 << 6)
|
||||
#define OMAP3430_PERIPH_DPLL_ST_SHIFT 6
|
||||
#define OMAP3430_CORE_DPLL_ST (1 << 5)
|
||||
#define OMAP3430_CORE_DPLL_ST_SHIFT 5
|
||||
#define OMAP3430_TRANSITION_ST (1 << 4)
|
||||
#define OMAP3430_EVGENOFF_ST (1 << 3)
|
||||
#define OMAP3430_EVGENON_ST (1 << 2)
|
||||
#define OMAP3430_FS_USB_WKUP_ST (1 << 1)
|
||||
|
||||
/* PRM_IRQENABLE_MPU specific bits */
|
||||
#define OMAP3430ES2_SND_PERIPH_DPLL_RECAL_EN_SHIFT 25
|
||||
#define OMAP3430ES2_SND_PERIPH_DPLL_RECAL_EN (1 << 25)
|
||||
#define OMAP3430_VC_TIMEOUTERR_EN (1 << 24)
|
||||
#define OMAP3430_VC_RAERR_EN (1 << 23)
|
||||
#define OMAP3430_VC_SAERR_EN (1 << 22)
|
||||
#define OMAP3430_VP2_TRANXDONE_EN (1 << 21)
|
||||
#define OMAP3430_VP2_EQVALUE_EN (1 << 20)
|
||||
#define OMAP3430_VP2_NOSMPSACK_EN (1 << 19)
|
||||
#define OMAP3430_VP2_MAXVDD_EN (1 << 18)
|
||||
#define OMAP3430_VP2_MINVDD_EN (1 << 17)
|
||||
#define OMAP3430_VP2_OPPCHANGEDONE_EN (1 << 16)
|
||||
#define OMAP3430_VP1_TRANXDONE_EN (1 << 15)
|
||||
#define OMAP3430_VP1_EQVALUE_EN (1 << 14)
|
||||
#define OMAP3430_VP1_NOSMPSACK_EN (1 << 13)
|
||||
#define OMAP3430_VP1_MAXVDD_EN (1 << 12)
|
||||
#define OMAP3430_VP1_MINVDD_EN (1 << 11)
|
||||
#define OMAP3430_VP1_OPPCHANGEDONE_EN (1 << 10)
|
||||
#define OMAP3430_IO_EN (1 << 9)
|
||||
#define OMAP3430_PRM_IRQENABLE_MPU_IVA2_DPLL_RECAL_EN (1 << 8)
|
||||
#define OMAP3430_PRM_IRQENABLE_MPU_IVA2_DPLL_RECAL_EN_SHIFT 8
|
||||
#define OMAP3430_MPU_DPLL_RECAL_EN (1 << 7)
|
||||
#define OMAP3430_MPU_DPLL_RECAL_EN_SHIFT 7
|
||||
#define OMAP3430_PERIPH_DPLL_RECAL_EN (1 << 6)
|
||||
#define OMAP3430_PERIPH_DPLL_RECAL_EN_SHIFT 6
|
||||
#define OMAP3430_CORE_DPLL_RECAL_EN (1 << 5)
|
||||
#define OMAP3430_CORE_DPLL_RECAL_EN_SHIFT 5
|
||||
#define OMAP3430_TRANSITION_EN (1 << 4)
|
||||
#define OMAP3430_EVGENOFF_EN (1 << 3)
|
||||
#define OMAP3430_EVGENON_EN (1 << 2)
|
||||
#define OMAP3430_FS_USB_WKUP_EN (1 << 1)
|
||||
|
||||
/* RM_RSTST_MPU specific bits */
|
||||
#define OMAP3430_EMULATION_MPU_RST (1 << 11)
|
||||
|
||||
/* PM_WKDEP_MPU specific bits */
|
||||
#define OMAP3430_PM_WKDEP_MPU_EN_DSS (1 << 5)
|
||||
#define OMAP3430_PM_WKDEP_MPU_EN_IVA2 (1 << 2)
|
||||
|
||||
/* PM_EVGENCTRL_MPU */
|
||||
#define OMAP3430_OFFLOADMODE_SHIFT 3
|
||||
#define OMAP3430_OFFLOADMODE_MASK (0x3 << 3)
|
||||
#define OMAP3430_ONLOADMODE_SHIFT 1
|
||||
#define OMAP3430_ONLOADMODE_MASK (0x3 << 1)
|
||||
#define OMAP3430_ENABLE (1 << 0)
|
||||
|
||||
/* PM_EVGENONTIM_MPU */
|
||||
#define OMAP3430_ONTIMEVAL_SHIFT 0
|
||||
#define OMAP3430_ONTIMEVAL_MASK (0xffffffff << 0)
|
||||
|
||||
/* PM_EVGENOFFTIM_MPU */
|
||||
#define OMAP3430_OFFTIMEVAL_SHIFT 0
|
||||
#define OMAP3430_OFFTIMEVAL_MASK (0xffffffff << 0)
|
||||
|
||||
/* PM_PWSTCTRL_MPU specific bits */
|
||||
#define OMAP3430_L2CACHEONSTATE_SHIFT 16
|
||||
#define OMAP3430_L2CACHEONSTATE_MASK (0x3 << 16)
|
||||
#define OMAP3430_L2CACHERETSTATE (1 << 8)
|
||||
#define OMAP3430_LOGICL1CACHERETSTATE (1 << 2)
|
||||
|
||||
/* PM_PWSTST_MPU specific bits */
|
||||
#define OMAP3430_L2CACHESTATEST_SHIFT 6
|
||||
#define OMAP3430_L2CACHESTATEST_MASK (0x3 << 6)
|
||||
#define OMAP3430_LOGICL1CACHESTATEST (1 << 2)
|
||||
|
||||
/* PM_PREPWSTST_MPU specific bits */
|
||||
#define OMAP3430_LASTL2CACHESTATEENTERED_SHIFT 6
|
||||
#define OMAP3430_LASTL2CACHESTATEENTERED_MASK (0x3 << 6)
|
||||
#define OMAP3430_LASTLOGICL1CACHESTATEENTERED (1 << 2)
|
||||
|
||||
/* RM_RSTCTRL_CORE */
|
||||
#define OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RSTPWRON (1 << 1)
|
||||
#define OMAP3430_RM_RSTCTRL_CORE_MODEM_SW_RST (1 << 0)
|
||||
|
||||
/* RM_RSTST_CORE specific bits */
|
||||
#define OMAP3430_MODEM_SECURITY_VIOL_RST (1 << 10)
|
||||
#define OMAP3430_RM_RSTST_CORE_MODEM_SW_RSTPWRON (1 << 9)
|
||||
#define OMAP3430_RM_RSTST_CORE_MODEM_SW_RST (1 << 8)
|
||||
|
||||
/* PM_WKEN1_CORE specific bits */
|
||||
|
||||
/* PM_MPUGRPSEL1_CORE specific bits */
|
||||
#define OMAP3430_GRPSEL_FSHOSTUSB (1 << 5)
|
||||
|
||||
/* PM_IVA2GRPSEL1_CORE specific bits */
|
||||
|
||||
/* PM_WKST1_CORE specific bits */
|
||||
|
||||
/* PM_PWSTCTRL_CORE specific bits */
|
||||
#define OMAP3430_MEM2ONSTATE_SHIFT 18
|
||||
#define OMAP3430_MEM2ONSTATE_MASK (0x3 << 18)
|
||||
#define OMAP3430_MEM1ONSTATE_SHIFT 16
|
||||
#define OMAP3430_MEM1ONSTATE_MASK (0x3 << 16)
|
||||
#define OMAP3430_MEM2RETSTATE (1 << 9)
|
||||
#define OMAP3430_MEM1RETSTATE (1 << 8)
|
||||
|
||||
/* PM_PWSTST_CORE specific bits */
|
||||
#define OMAP3430_MEM2STATEST_SHIFT 6
|
||||
#define OMAP3430_MEM2STATEST_MASK (0x3 << 6)
|
||||
#define OMAP3430_MEM1STATEST_SHIFT 4
|
||||
#define OMAP3430_MEM1STATEST_MASK (0x3 << 4)
|
||||
|
||||
/* PM_PREPWSTST_CORE specific bits */
|
||||
#define OMAP3430_LASTMEM2STATEENTERED_SHIFT 6
|
||||
#define OMAP3430_LASTMEM2STATEENTERED_MASK (0x3 << 6)
|
||||
#define OMAP3430_LASTMEM1STATEENTERED_SHIFT 4
|
||||
#define OMAP3430_LASTMEM1STATEENTERED_MASK (0x3 << 4)
|
||||
|
||||
/* RM_RSTST_GFX specific bits */
|
||||
|
||||
/* PM_WKDEP_GFX specific bits */
|
||||
#define OMAP3430_PM_WKDEP_GFX_EN_IVA2 (1 << 2)
|
||||
|
||||
/* PM_PWSTCTRL_GFX specific bits */
|
||||
|
||||
/* PM_PWSTST_GFX specific bits */
|
||||
|
||||
/* PM_PREPWSTST_GFX specific bits */
|
||||
|
||||
/* PM_WKEN_WKUP specific bits */
|
||||
#define OMAP3430_EN_IO (1 << 8)
|
||||
|
||||
/* PM_MPUGRPSEL_WKUP specific bits */
|
||||
|
||||
/* PM_IVA2GRPSEL_WKUP specific bits */
|
||||
|
||||
/* PM_WKST_WKUP specific bits */
|
||||
#define OMAP3430_ST_IO (1 << 8)
|
||||
|
||||
/* PRM_CLKSEL */
|
||||
#define OMAP3430_SYS_CLKIN_SEL_SHIFT 0
|
||||
#define OMAP3430_SYS_CLKIN_SEL_MASK (0x7 << 0)
|
||||
|
||||
/* PRM_CLKOUT_CTRL */
|
||||
#define OMAP3430_CLKOUT_EN (1 << 7)
|
||||
#define OMAP3430_CLKOUT_EN_SHIFT 7
|
||||
|
||||
/* RM_RSTST_DSS specific bits */
|
||||
|
||||
/* PM_WKEN_DSS */
|
||||
#define OMAP3430_PM_WKEN_DSS_EN_DSS (1 << 0)
|
||||
|
||||
/* PM_WKDEP_DSS specific bits */
|
||||
#define OMAP3430_PM_WKDEP_DSS_EN_IVA2 (1 << 2)
|
||||
|
||||
/* PM_PWSTCTRL_DSS specific bits */
|
||||
|
||||
/* PM_PWSTST_DSS specific bits */
|
||||
|
||||
/* PM_PREPWSTST_DSS specific bits */
|
||||
|
||||
/* RM_RSTST_CAM specific bits */
|
||||
|
||||
/* PM_WKDEP_CAM specific bits */
|
||||
#define OMAP3430_PM_WKDEP_CAM_EN_IVA2 (1 << 2)
|
||||
|
||||
/* PM_PWSTCTRL_CAM specific bits */
|
||||
|
||||
/* PM_PWSTST_CAM specific bits */
|
||||
|
||||
/* PM_PREPWSTST_CAM specific bits */
|
||||
|
||||
/* PM_PWSTCTRL_USBHOST specific bits */
|
||||
#define OMAP3430ES2_SAVEANDRESTORE_SHIFT (1 << 4)
|
||||
|
||||
/* RM_RSTST_PER specific bits */
|
||||
|
||||
/* PM_WKEN_PER specific bits */
|
||||
|
||||
/* PM_MPUGRPSEL_PER specific bits */
|
||||
|
||||
/* PM_IVA2GRPSEL_PER specific bits */
|
||||
|
||||
/* PM_WKST_PER specific bits */
|
||||
|
||||
/* PM_WKDEP_PER specific bits */
|
||||
#define OMAP3430_PM_WKDEP_PER_EN_IVA2 (1 << 2)
|
||||
|
||||
/* PM_PWSTCTRL_PER specific bits */
|
||||
|
||||
/* PM_PWSTST_PER specific bits */
|
||||
|
||||
/* PM_PREPWSTST_PER specific bits */
|
||||
|
||||
/* RM_RSTST_EMU specific bits */
|
||||
|
||||
/* PM_PWSTST_EMU specific bits */
|
||||
|
||||
/* PRM_VC_SMPS_SA */
|
||||
#define OMAP3430_PRM_VC_SMPS_SA_SA1_SHIFT 16
|
||||
#define OMAP3430_PRM_VC_SMPS_SA_SA1_MASK (0x7f << 16)
|
||||
#define OMAP3430_PRM_VC_SMPS_SA_SA0_SHIFT 0
|
||||
#define OMAP3430_PRM_VC_SMPS_SA_SA0_MASK (0x7f << 0)
|
||||
|
||||
/* PRM_VC_SMPS_VOL_RA */
|
||||
#define OMAP3430_VOLRA1_SHIFT 16
|
||||
#define OMAP3430_VOLRA1_MASK (0xff << 16)
|
||||
#define OMAP3430_VOLRA0_SHIFT 0
|
||||
#define OMAP3430_VOLRA0_MASK (0xff << 0)
|
||||
|
||||
/* PRM_VC_SMPS_CMD_RA */
|
||||
#define OMAP3430_CMDRA1_SHIFT 16
|
||||
#define OMAP3430_CMDRA1_MASK (0xff << 16)
|
||||
#define OMAP3430_CMDRA0_SHIFT 0
|
||||
#define OMAP3430_CMDRA0_MASK (0xff << 0)
|
||||
|
||||
/* PRM_VC_CMD_VAL_0 specific bits */
|
||||
|
||||
/* PRM_VC_CMD_VAL_1 specific bits */
|
||||
|
||||
/* PRM_VC_CH_CONF */
|
||||
#define OMAP3430_CMD1 (1 << 20)
|
||||
#define OMAP3430_RACEN1 (1 << 19)
|
||||
#define OMAP3430_RAC1 (1 << 18)
|
||||
#define OMAP3430_RAV1 (1 << 17)
|
||||
#define OMAP3430_PRM_VC_CH_CONF_SA1 (1 << 16)
|
||||
#define OMAP3430_CMD0 (1 << 4)
|
||||
#define OMAP3430_RACEN0 (1 << 3)
|
||||
#define OMAP3430_RAC0 (1 << 2)
|
||||
#define OMAP3430_RAV0 (1 << 1)
|
||||
#define OMAP3430_PRM_VC_CH_CONF_SA0 (1 << 0)
|
||||
|
||||
/* PRM_VC_I2C_CFG */
|
||||
#define OMAP3430_HSMASTER (1 << 5)
|
||||
#define OMAP3430_SREN (1 << 4)
|
||||
#define OMAP3430_HSEN (1 << 3)
|
||||
#define OMAP3430_MCODE_SHIFT 0
|
||||
#define OMAP3430_MCODE_MASK (0x7 << 0)
|
||||
|
||||
/* PRM_VC_BYPASS_VAL */
|
||||
#define OMAP3430_VALID (1 << 24)
|
||||
#define OMAP3430_DATA_SHIFT 16
|
||||
#define OMAP3430_DATA_MASK (0xff << 16)
|
||||
#define OMAP3430_REGADDR_SHIFT 8
|
||||
#define OMAP3430_REGADDR_MASK (0xff << 8)
|
||||
#define OMAP3430_SLAVEADDR_SHIFT 0
|
||||
#define OMAP3430_SLAVEADDR_MASK (0x7f << 0)
|
||||
|
||||
/* PRM_RSTCTRL */
|
||||
#define OMAP3430_RST_DPLL3 (1 << 2)
|
||||
#define OMAP3430_RST_GS (1 << 1)
|
||||
|
||||
/* PRM_RSTTIME */
|
||||
#define OMAP3430_RSTTIME2_SHIFT 8
|
||||
#define OMAP3430_RSTTIME2_MASK (0x1f << 8)
|
||||
#define OMAP3430_RSTTIME1_SHIFT 0
|
||||
#define OMAP3430_RSTTIME1_MASK (0xff << 0)
|
||||
|
||||
/* PRM_RSTST */
|
||||
#define OMAP3430_ICECRUSHER_RST (1 << 10)
|
||||
#define OMAP3430_ICEPICK_RST (1 << 9)
|
||||
#define OMAP3430_VDD2_VOLTAGE_MANAGER_RST (1 << 8)
|
||||
#define OMAP3430_VDD1_VOLTAGE_MANAGER_RST (1 << 7)
|
||||
#define OMAP3430_EXTERNAL_WARM_RST (1 << 6)
|
||||
#define OMAP3430_SECURE_WD_RST (1 << 5)
|
||||
#define OMAP3430_MPU_WD_RST (1 << 4)
|
||||
#define OMAP3430_SECURITY_VIOL_RST (1 << 3)
|
||||
#define OMAP3430_GLOBAL_SW_RST (1 << 1)
|
||||
#define OMAP3430_GLOBAL_COLD_RST (1 << 0)
|
||||
|
||||
/* PRM_VOLTCTRL */
|
||||
#define OMAP3430_SEL_VMODE (1 << 4)
|
||||
#define OMAP3430_SEL_OFF (1 << 3)
|
||||
#define OMAP3430_AUTO_OFF (1 << 2)
|
||||
#define OMAP3430_AUTO_RET (1 << 1)
|
||||
#define OMAP3430_AUTO_SLEEP (1 << 0)
|
||||
|
||||
/* PRM_SRAM_PCHARGE */
|
||||
#define OMAP3430_PCHARGE_TIME_SHIFT 0
|
||||
#define OMAP3430_PCHARGE_TIME_MASK (0xff << 0)
|
||||
|
||||
/* PRM_CLKSRC_CTRL */
|
||||
#define OMAP3430_SYSCLKDIV_SHIFT 6
|
||||
#define OMAP3430_SYSCLKDIV_MASK (0x3 << 6)
|
||||
#define OMAP3430_AUTOEXTCLKMODE_SHIFT 3
|
||||
#define OMAP3430_AUTOEXTCLKMODE_MASK (0x3 << 3)
|
||||
#define OMAP3430_SYSCLKSEL_SHIFT 0
|
||||
#define OMAP3430_SYSCLKSEL_MASK (0x3 << 0)
|
||||
|
||||
/* PRM_VOLTSETUP1 */
|
||||
#define OMAP3430_SETUP_TIME2_SHIFT 16
|
||||
#define OMAP3430_SETUP_TIME2_MASK (0xffff << 16)
|
||||
#define OMAP3430_SETUP_TIME1_SHIFT 0
|
||||
#define OMAP3430_SETUP_TIME1_MASK (0xffff << 0)
|
||||
|
||||
/* PRM_VOLTOFFSET */
|
||||
#define OMAP3430_OFFSET_TIME_SHIFT 0
|
||||
#define OMAP3430_OFFSET_TIME_MASK (0xffff << 0)
|
||||
|
||||
/* PRM_CLKSETUP */
|
||||
#define OMAP3430_SETUP_TIME_SHIFT 0
|
||||
#define OMAP3430_SETUP_TIME_MASK (0xffff << 0)
|
||||
|
||||
/* PRM_POLCTRL */
|
||||
#define OMAP3430_OFFMODE_POL (1 << 3)
|
||||
#define OMAP3430_CLKOUT_POL (1 << 2)
|
||||
#define OMAP3430_CLKREQ_POL (1 << 1)
|
||||
#define OMAP3430_EXTVOL_POL (1 << 0)
|
||||
|
||||
/* PRM_VOLTSETUP2 */
|
||||
#define OMAP3430_OFFMODESETUPTIME_SHIFT 0
|
||||
#define OMAP3430_OFFMODESETUPTIME_MASK (0xffff << 0)
|
||||
|
||||
/* PRM_VP1_CONFIG specific bits */
|
||||
|
||||
/* PRM_VP1_VSTEPMIN specific bits */
|
||||
|
||||
/* PRM_VP1_VSTEPMAX specific bits */
|
||||
|
||||
/* PRM_VP1_VLIMITTO specific bits */
|
||||
|
||||
/* PRM_VP1_VOLTAGE specific bits */
|
||||
|
||||
/* PRM_VP1_STATUS specific bits */
|
||||
|
||||
/* PRM_VP2_CONFIG specific bits */
|
||||
|
||||
/* PRM_VP2_VSTEPMIN specific bits */
|
||||
|
||||
/* PRM_VP2_VSTEPMAX specific bits */
|
||||
|
||||
/* PRM_VP2_VLIMITTO specific bits */
|
||||
|
||||
/* PRM_VP2_VOLTAGE specific bits */
|
||||
|
||||
/* PRM_VP2_STATUS specific bits */
|
||||
|
||||
/* RM_RSTST_NEON specific bits */
|
||||
|
||||
/* PM_WKDEP_NEON specific bits */
|
||||
|
||||
/* PM_PWSTCTRL_NEON specific bits */
|
||||
|
||||
/* PM_PWSTST_NEON specific bits */
|
||||
|
||||
/* PM_PREPWSTST_NEON specific bits */
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,316 @@
|
||||
#ifndef __ARCH_ARM_MACH_OMAP2_PRM_H
|
||||
#define __ARCH_ARM_MACH_OMAP2_PRM_H
|
||||
|
||||
/*
|
||||
* OMAP2/3 Power/Reset Management (PRM) register definitions
|
||||
*
|
||||
* Copyright (C) 2007 Texas Instruments, Inc.
|
||||
* Copyright (C) 2007 Nokia Corporation
|
||||
*
|
||||
* Written by Paul Walmsley
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include "prcm-common.h"
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
#define OMAP_PRM_REGADDR(module, reg) \
|
||||
(void __iomem *)IO_ADDRESS(OMAP2_PRM_BASE + (module) + (reg))
|
||||
#else
|
||||
#define OMAP2420_PRM_REGADDR(module, reg) \
|
||||
IO_ADDRESS(OMAP2420_PRM_BASE + (module) + (reg))
|
||||
#define OMAP2430_PRM_REGADDR(module, reg) \
|
||||
IO_ADDRESS(OMAP2430_PRM_BASE + (module) + (reg))
|
||||
#define OMAP34XX_PRM_REGADDR(module, reg) \
|
||||
IO_ADDRESS(OMAP3430_PRM_BASE + (module) + (reg))
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Architecture-specific global PRM registers
|
||||
* Use prm_{read,write}_reg() with these registers.
|
||||
*
|
||||
* With a few exceptions, these are the register names beginning with
|
||||
* PRCM_* on 24xx, and PRM_* on 34xx. (The exceptions are the
|
||||
* IRQSTATUS and IRQENABLE bits.)
|
||||
*
|
||||
*/
|
||||
|
||||
#define OMAP24XX_PRCM_REVISION OMAP_PRM_REGADDR(OCP_MOD, 0x0000)
|
||||
#define OMAP24XX_PRCM_SYSCONFIG OMAP_PRM_REGADDR(OCP_MOD, 0x0010)
|
||||
|
||||
#define OMAP24XX_PRCM_IRQSTATUS_MPU OMAP_PRM_REGADDR(OCP_MOD, 0x0018)
|
||||
#define OMAP24XX_PRCM_IRQENABLE_MPU OMAP_PRM_REGADDR(OCP_MOD, 0x001c)
|
||||
|
||||
#define OMAP24XX_PRCM_VOLTCTRL OMAP_PRM_REGADDR(OCP_MOD, 0x0050)
|
||||
#define OMAP24XX_PRCM_VOLTST OMAP_PRM_REGADDR(OCP_MOD, 0x0054)
|
||||
#define OMAP24XX_PRCM_CLKSRC_CTRL OMAP_PRM_REGADDR(OCP_MOD, 0x0060)
|
||||
#define OMAP24XX_PRCM_CLKOUT_CTRL OMAP_PRM_REGADDR(OCP_MOD, 0x0070)
|
||||
#define OMAP24XX_PRCM_CLKEMUL_CTRL OMAP_PRM_REGADDR(OCP_MOD, 0x0078)
|
||||
#define OMAP24XX_PRCM_CLKCFG_CTRL OMAP_PRM_REGADDR(OCP_MOD, 0x0080)
|
||||
#define OMAP24XX_PRCM_CLKCFG_STATUS OMAP_PRM_REGADDR(OCP_MOD, 0x0084)
|
||||
#define OMAP24XX_PRCM_VOLTSETUP OMAP_PRM_REGADDR(OCP_MOD, 0x0090)
|
||||
#define OMAP24XX_PRCM_CLKSSETUP OMAP_PRM_REGADDR(OCP_MOD, 0x0094)
|
||||
#define OMAP24XX_PRCM_POLCTRL OMAP_PRM_REGADDR(OCP_MOD, 0x0098)
|
||||
|
||||
#define OMAP3430_PRM_REVISION OMAP_PRM_REGADDR(OCP_MOD, 0x0004)
|
||||
#define OMAP3430_PRM_SYSCONFIG OMAP_PRM_REGADDR(OCP_MOD, 0x0014)
|
||||
|
||||
#define OMAP3430_PRM_IRQSTATUS_MPU OMAP_PRM_REGADDR(OCP_MOD, 0x0018)
|
||||
#define OMAP3430_PRM_IRQENABLE_MPU OMAP_PRM_REGADDR(OCP_MOD, 0x001c)
|
||||
|
||||
|
||||
#define OMAP3430_PRM_VC_SMPS_SA OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x0020)
|
||||
#define OMAP3430_PRM_VC_SMPS_VOL_RA OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x0024)
|
||||
#define OMAP3430_PRM_VC_SMPS_CMD_RA OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x0028)
|
||||
#define OMAP3430_PRM_VC_CMD_VAL_0 OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x002c)
|
||||
#define OMAP3430_PRM_VC_CMD_VAL_1 OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x0030)
|
||||
#define OMAP3430_PRM_VC_CH_CONF OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x0034)
|
||||
#define OMAP3430_PRM_VC_I2C_CFG OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x0038)
|
||||
#define OMAP3430_PRM_VC_BYPASS_VAL OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x003c)
|
||||
#define OMAP3430_PRM_RSTCTRL OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x0050)
|
||||
#define OMAP3430_PRM_RSTTIME OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x0054)
|
||||
#define OMAP3430_PRM_RSTST OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x0058)
|
||||
#define OMAP3430_PRM_VOLTCTRL OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x0060)
|
||||
#define OMAP3430_PRM_SRAM_PCHARGE OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x0064)
|
||||
#define OMAP3430_PRM_CLKSRC_CTRL OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x0070)
|
||||
#define OMAP3430_PRM_VOLTSETUP1 OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x0090)
|
||||
#define OMAP3430_PRM_VOLTOFFSET OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x0094)
|
||||
#define OMAP3430_PRM_CLKSETUP OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x0098)
|
||||
#define OMAP3430_PRM_POLCTRL OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x009c)
|
||||
#define OMAP3430_PRM_VOLTSETUP2 OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x00a0)
|
||||
#define OMAP3430_PRM_VP1_CONFIG OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x00b0)
|
||||
#define OMAP3430_PRM_VP1_VSTEPMIN OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x00b4)
|
||||
#define OMAP3430_PRM_VP1_VSTEPMAX OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x00b8)
|
||||
#define OMAP3430_PRM_VP1_VLIMITTO OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x00bc)
|
||||
#define OMAP3430_PRM_VP1_VOLTAGE OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x00c0)
|
||||
#define OMAP3430_PRM_VP1_STATUS OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x00c4)
|
||||
#define OMAP3430_PRM_VP2_CONFIG OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x00d0)
|
||||
#define OMAP3430_PRM_VP2_VSTEPMIN OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x00d4)
|
||||
#define OMAP3430_PRM_VP2_VSTEPMAX OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x00d8)
|
||||
#define OMAP3430_PRM_VP2_VLIMITTO OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x00dc)
|
||||
#define OMAP3430_PRM_VP2_VOLTAGE OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x00e0)
|
||||
#define OMAP3430_PRM_VP2_STATUS OMAP_PRM_REGADDR(OMAP3430_GR_MOD, 0x00e4)
|
||||
|
||||
#define OMAP3430_PRM_CLKSEL OMAP_PRM_REGADDR(OMAP3430_CCR_MOD, 0x0040)
|
||||
#define OMAP3430_PRM_CLKOUT_CTRL OMAP_PRM_REGADDR(OMAP3430_CCR_MOD, 0x0070)
|
||||
|
||||
/*
|
||||
* Module specific PRM registers from PRM_BASE + domain offset
|
||||
*
|
||||
* Use prm_{read,write}_mod_reg() with these registers.
|
||||
*
|
||||
* With a few exceptions, these are the register names beginning with
|
||||
* {PM,RM}_* on both architectures. (The exceptions are the IRQSTATUS
|
||||
* and IRQENABLE bits.)
|
||||
*
|
||||
*/
|
||||
|
||||
/* Registers appearing on both 24xx and 34xx */
|
||||
|
||||
#define RM_RSTCTRL 0x0050
|
||||
#define RM_RSTTIME 0x0054
|
||||
#define RM_RSTST 0x0058
|
||||
|
||||
#define PM_WKEN 0x00a0
|
||||
#define PM_WKEN1 PM_WKEN
|
||||
#define PM_WKST 0x00b0
|
||||
#define PM_WKST1 PM_WKST
|
||||
#define PM_WKDEP 0x00c8
|
||||
#define PM_EVGENCTRL 0x00d4
|
||||
#define PM_EVGENONTIM 0x00d8
|
||||
#define PM_EVGENOFFTIM 0x00dc
|
||||
#define PM_PWSTCTRL 0x00e0
|
||||
#define PM_PWSTST 0x00e4
|
||||
|
||||
#define OMAP3430_PM_MPUGRPSEL 0x00a4
|
||||
#define OMAP3430_PM_MPUGRPSEL1 OMAP3430_PM_MPUGRPSEL
|
||||
|
||||
#define OMAP3430_PM_IVAGRPSEL 0x00a8
|
||||
#define OMAP3430_PM_IVAGRPSEL1 OMAP3430_PM_IVAGRPSEL
|
||||
|
||||
#define OMAP3430_PM_PREPWSTST 0x00e8
|
||||
|
||||
#define OMAP3430_PRM_IRQSTATUS_IVA2 0x00f8
|
||||
#define OMAP3430_PRM_IRQENABLE_IVA2 0x00fc
|
||||
|
||||
|
||||
/* Architecture-specific registers */
|
||||
|
||||
#define OMAP24XX_PM_WKEN2 0x00a4
|
||||
#define OMAP24XX_PM_WKST2 0x00b4
|
||||
|
||||
#define OMAP24XX_PRCM_IRQSTATUS_DSP 0x00f0 /* IVA mod */
|
||||
#define OMAP24XX_PRCM_IRQENABLE_DSP 0x00f4 /* IVA mod */
|
||||
#define OMAP24XX_PRCM_IRQSTATUS_IVA 0x00f8
|
||||
#define OMAP24XX_PRCM_IRQENABLE_IVA 0x00fc
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
/* Power/reset management domain register get/set */
|
||||
|
||||
static inline void prm_write_mod_reg(u32 val, s16 module, s16 idx)
|
||||
{
|
||||
__raw_writel(val, OMAP_PRM_REGADDR(module, idx));
|
||||
}
|
||||
|
||||
static inline u32 prm_read_mod_reg(s16 module, s16 idx)
|
||||
{
|
||||
return __raw_readl(OMAP_PRM_REGADDR(module, idx));
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Bits common to specific registers
|
||||
*
|
||||
* The 3430 register and bit names are generally used,
|
||||
* since they tend to make more sense
|
||||
*/
|
||||
|
||||
/* PM_EVGENONTIM_MPU */
|
||||
/* Named PM_EVEGENONTIM_MPU on the 24XX */
|
||||
#define OMAP_ONTIMEVAL_SHIFT 0
|
||||
#define OMAP_ONTIMEVAL_MASK (0xffffffff << 0)
|
||||
|
||||
/* PM_EVGENOFFTIM_MPU */
|
||||
/* Named PM_EVEGENOFFTIM_MPU on the 24XX */
|
||||
#define OMAP_OFFTIMEVAL_SHIFT 0
|
||||
#define OMAP_OFFTIMEVAL_MASK (0xffffffff << 0)
|
||||
|
||||
/* PRM_CLKSETUP and PRCM_VOLTSETUP */
|
||||
/* Named PRCM_CLKSSETUP on the 24XX */
|
||||
#define OMAP_SETUP_TIME_SHIFT 0
|
||||
#define OMAP_SETUP_TIME_MASK (0xffff << 0)
|
||||
|
||||
/* PRM_CLKSRC_CTRL */
|
||||
/* Named PRCM_CLKSRC_CTRL on the 24XX */
|
||||
#define OMAP_SYSCLKDIV_SHIFT 6
|
||||
#define OMAP_SYSCLKDIV_MASK (0x3 << 6)
|
||||
#define OMAP_AUTOEXTCLKMODE_SHIFT 3
|
||||
#define OMAP_AUTOEXTCLKMODE_MASK (0x3 << 3)
|
||||
#define OMAP_SYSCLKSEL_SHIFT 0
|
||||
#define OMAP_SYSCLKSEL_MASK (0x3 << 0)
|
||||
|
||||
/* PM_EVGENCTRL_MPU */
|
||||
#define OMAP_OFFLOADMODE_SHIFT 3
|
||||
#define OMAP_OFFLOADMODE_MASK (0x3 << 3)
|
||||
#define OMAP_ONLOADMODE_SHIFT 1
|
||||
#define OMAP_ONLOADMODE_MASK (0x3 << 1)
|
||||
#define OMAP_ENABLE (1 << 0)
|
||||
|
||||
/* PRM_RSTTIME */
|
||||
/* Named RM_RSTTIME_WKUP on the 24xx */
|
||||
#define OMAP_RSTTIME2_SHIFT 8
|
||||
#define OMAP_RSTTIME2_MASK (0x1f << 8)
|
||||
#define OMAP_RSTTIME1_SHIFT 0
|
||||
#define OMAP_RSTTIME1_MASK (0xff << 0)
|
||||
|
||||
|
||||
/* PRM_RSTCTRL */
|
||||
/* Named RM_RSTCTRL_WKUP on the 24xx */
|
||||
/* 2420 calls RST_DPLL3 'RST_DPLL' */
|
||||
#define OMAP_RST_DPLL3 (1 << 2)
|
||||
#define OMAP_RST_GS (1 << 1)
|
||||
|
||||
|
||||
/*
|
||||
* Bits common to module-shared registers
|
||||
*
|
||||
* Not all registers of a particular type support all of these bits -
|
||||
* check TRM if you are unsure
|
||||
*/
|
||||
|
||||
/*
|
||||
* 24XX: PM_PWSTST_CORE, PM_PWSTST_GFX, PM_PWSTST_MPU, PM_PWSTST_DSP
|
||||
*
|
||||
* 2430: PM_PWSTST_MDM
|
||||
*
|
||||
* 3430: PM_PWSTST_IVA2, PM_PWSTST_MPU, PM_PWSTST_CORE, PM_PWSTST_GFX,
|
||||
* PM_PWSTST_DSS, PM_PWSTST_CAM, PM_PWSTST_PER, PM_PWSTST_EMU,
|
||||
* PM_PWSTST_NEON
|
||||
*/
|
||||
#define OMAP_INTRANSITION (1 << 20)
|
||||
|
||||
|
||||
/*
|
||||
* 24XX: PM_PWSTST_GFX, PM_PWSTST_DSP
|
||||
*
|
||||
* 2430: PM_PWSTST_MDM
|
||||
*
|
||||
* 3430: PM_PWSTST_IVA2, PM_PWSTST_MPU, PM_PWSTST_CORE, PM_PWSTST_GFX,
|
||||
* PM_PWSTST_DSS, PM_PWSTST_CAM, PM_PWSTST_PER, PM_PWSTST_EMU,
|
||||
* PM_PWSTST_NEON
|
||||
*/
|
||||
#define OMAP_POWERSTATEST_SHIFT 0
|
||||
#define OMAP_POWERSTATEST_MASK (0x3 << 0)
|
||||
|
||||
/*
|
||||
* 24XX: RM_RSTST_MPU and RM_RSTST_DSP - on 24XX, 'COREDOMAINWKUP_RST' is
|
||||
* called 'COREWKUP_RST'
|
||||
*
|
||||
* 3430: RM_RSTST_IVA2, RM_RSTST_MPU, RM_RSTST_GFX, RM_RSTST_DSS,
|
||||
* RM_RSTST_CAM, RM_RSTST_PER, RM_RSTST_NEON
|
||||
*/
|
||||
#define OMAP_COREDOMAINWKUP_RST (1 << 3)
|
||||
|
||||
/*
|
||||
* 24XX: RM_RSTST_MPU, RM_RSTST_GFX, RM_RSTST_DSP
|
||||
*
|
||||
* 2430: RM_RSTST_MDM
|
||||
*
|
||||
* 3430: RM_RSTST_CORE, RM_RSTST_EMU
|
||||
*/
|
||||
#define OMAP_DOMAINWKUP_RST (1 << 2)
|
||||
|
||||
/*
|
||||
* 24XX: RM_RSTST_MPU, RM_RSTST_WKUP, RM_RSTST_DSP
|
||||
* On 24XX, 'GLOBALWARM_RST' is called 'GLOBALWMPU_RST'.
|
||||
*
|
||||
* 2430: RM_RSTST_MDM
|
||||
*
|
||||
* 3430: RM_RSTST_CORE, RM_RSTST_EMU
|
||||
*/
|
||||
#define OMAP_GLOBALWARM_RST (1 << 1)
|
||||
#define OMAP_GLOBALCOLD_RST (1 << 0)
|
||||
|
||||
/*
|
||||
* 24XX: PM_WKDEP_GFX, PM_WKDEP_MPU, PM_WKDEP_CORE, PM_WKDEP_DSP
|
||||
* 2420 TRM sometimes uses "EN_WAKEUP" instead of "EN_WKUP"
|
||||
*
|
||||
* 2430: PM_WKDEP_MDM
|
||||
*
|
||||
* 3430: PM_WKDEP_IVA2, PM_WKDEP_GFX, PM_WKDEP_DSS, PM_WKDEP_CAM,
|
||||
* PM_WKDEP_PER
|
||||
*/
|
||||
#define OMAP_EN_WKUP (1 << 4)
|
||||
|
||||
/*
|
||||
* 24XX: PM_PWSTCTRL_MPU, PM_PWSTCTRL_CORE, PM_PWSTCTRL_GFX,
|
||||
* PM_PWSTCTRL_DSP
|
||||
*
|
||||
* 2430: PM_PWSTCTRL_MDM
|
||||
*
|
||||
* 3430: PM_PWSTCTRL_IVA2, PM_PWSTCTRL_CORE, PM_PWSTCTRL_GFX,
|
||||
* PM_PWSTCTRL_DSS, PM_PWSTCTRL_CAM, PM_PWSTCTRL_PER,
|
||||
* PM_PWSTCTRL_NEON
|
||||
*/
|
||||
#define OMAP_LOGICRETSTATE (1 << 2)
|
||||
|
||||
/*
|
||||
* 24XX: PM_PWSTCTRL_MPU, PM_PWSTCTRL_CORE, PM_PWSTCTRL_GFX,
|
||||
* PM_PWSTCTRL_DSP, PM_PWSTST_MPU
|
||||
*
|
||||
* 2430: PM_PWSTCTRL_MDM shared bits
|
||||
*
|
||||
* 3430: PM_PWSTCTRL_IVA2, PM_PWSTCTRL_MPU, PM_PWSTCTRL_CORE,
|
||||
* PM_PWSTCTRL_GFX, PM_PWSTCTRL_DSS, PM_PWSTCTRL_CAM, PM_PWSTCTRL_PER,
|
||||
* PM_PWSTCTRL_NEON shared bits
|
||||
*/
|
||||
#define OMAP_POWERSTATE_SHIFT 0
|
||||
#define OMAP_POWERSTATE_MASK (0x3 << 0)
|
||||
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,58 @@
|
||||
#ifndef __ARCH_ARM_MACH_OMAP2_SDRC_H
|
||||
#define __ARCH_ARM_MACH_OMAP2_SDRC_H
|
||||
|
||||
/*
|
||||
* OMAP2 SDRC register definitions
|
||||
*
|
||||
* Copyright (C) 2007 Texas Instruments, Inc.
|
||||
* Copyright (C) 2007 Nokia Corporation
|
||||
*
|
||||
* Written by Paul Walmsley
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#undef DEBUG
|
||||
|
||||
#include <asm/arch/sdrc.h>
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
extern unsigned long omap2_sdrc_base;
|
||||
extern unsigned long omap2_sms_base;
|
||||
|
||||
#define OMAP_SDRC_REGADDR(reg) \
|
||||
(void __iomem *)IO_ADDRESS(omap2_sdrc_base + (reg))
|
||||
#define OMAP_SMS_REGADDR(reg) \
|
||||
(void __iomem *)IO_ADDRESS(omap2_sms_base + (reg))
|
||||
|
||||
/* SDRC global register get/set */
|
||||
|
||||
static inline void sdrc_write_reg(u32 val, u16 reg)
|
||||
{
|
||||
__raw_writel(val, OMAP_SDRC_REGADDR(reg));
|
||||
}
|
||||
|
||||
static inline u32 sdrc_read_reg(u16 reg)
|
||||
{
|
||||
return __raw_readl(OMAP_SDRC_REGADDR(reg));
|
||||
}
|
||||
|
||||
/* SMS global register get/set */
|
||||
|
||||
static inline void sms_write_reg(u32 val, u16 reg)
|
||||
{
|
||||
__raw_writel(val, OMAP_SMS_REGADDR(reg));
|
||||
}
|
||||
|
||||
static inline u32 sms_read_reg(u16 reg)
|
||||
{
|
||||
return __raw_readl(OMAP_SMS_REGADDR(reg));
|
||||
}
|
||||
#else
|
||||
#define OMAP242X_SDRC_REGADDR(reg) IO_ADDRESS(OMAP2420_SDRC_BASE + (reg))
|
||||
#define OMAP243X_SDRC_REGADDR(reg) IO_ADDRESS(OMAP243X_SDRC_BASE + (reg))
|
||||
#define OMAP34XX_SDRC_REGADDR(reg) IO_ADDRESS(OMAP343X_SDRC_BASE + (reg))
|
||||
#endif /* __ASSEMBLER__ */
|
||||
|
||||
#endif
|
||||
@@ -26,19 +26,10 @@
|
||||
#include <asm/arch/io.h>
|
||||
#include <asm/arch/pm.h>
|
||||
|
||||
#define A_32KSYNC_CR_V IO_ADDRESS(OMAP_TIMER32K_BASE+0x10)
|
||||
#define A_PRCM_VOLTCTRL_V IO_ADDRESS(OMAP24XX_PRCM_BASE+0x50)
|
||||
#define A_PRCM_CLKCFG_CTRL_V IO_ADDRESS(OMAP24XX_PRCM_BASE+0x80)
|
||||
#define A_CM_CLKEN_PLL_V IO_ADDRESS(OMAP24XX_PRCM_BASE+0x500)
|
||||
#define A_CM_IDLEST_CKGEN_V IO_ADDRESS(OMAP24XX_PRCM_BASE+0x520)
|
||||
#define A_CM_CLKSEL1_PLL_V IO_ADDRESS(OMAP24XX_PRCM_BASE+0x540)
|
||||
#define A_CM_CLKSEL2_PLL_V IO_ADDRESS(OMAP24XX_PRCM_BASE+0x544)
|
||||
#include "sdrc.h"
|
||||
|
||||
#define A_SDRC_DLLA_CTRL_V IO_ADDRESS(OMAP24XX_SDRC_BASE+0x60)
|
||||
#define A_SDRC_POWER_V IO_ADDRESS(OMAP24XX_SDRC_BASE+0x70)
|
||||
#define A_SDRC_RFR_CTRL_V IO_ADDRESS(OMAP24XX_SDRC_BASE+0xA4)
|
||||
/* First address of reserved address space? apparently valid for OMAP2 & 3 */
|
||||
#define A_SDRC0_V (0xC0000000)
|
||||
#define A_SDRC_MANUAL_V IO_ADDRESS(OMAP24XX_SDRC_BASE+0xA8)
|
||||
|
||||
.text
|
||||
|
||||
@@ -126,17 +117,11 @@ loop2:
|
||||
ldmfd sp!, {r0 - r12, pc} @ restore regs and return
|
||||
|
||||
A_SDRC_POWER:
|
||||
.word A_SDRC_POWER_V
|
||||
.word OMAP242X_SDRC_REGADDR(SDRC_POWER)
|
||||
A_SDRC0:
|
||||
.word A_SDRC0_V
|
||||
A_CM_CLKSEL2_PLL_S:
|
||||
.word A_CM_CLKSEL2_PLL_V
|
||||
A_CM_CLKEN_PLL:
|
||||
.word A_CM_CLKEN_PLL_V
|
||||
A_SDRC_DLLA_CTRL_S:
|
||||
.word A_SDRC_DLLA_CTRL_V
|
||||
A_SDRC_MANUAL_S:
|
||||
.word A_SDRC_MANUAL_V
|
||||
.word OMAP242X_SDRC_REGADDR(SDRC_DLLA_CTRL)
|
||||
|
||||
ENTRY(omap24xx_cpu_suspend_sz)
|
||||
.word . - omap24xx_cpu_suspend
|
||||
|
||||
@@ -27,19 +27,11 @@
|
||||
#include <asm/arch/io.h>
|
||||
#include <asm/hardware.h>
|
||||
|
||||
#include "prcm-regs.h"
|
||||
#include "sdrc.h"
|
||||
#include "prm.h"
|
||||
#include "cm.h"
|
||||
|
||||
#define TIMER_32KSYNCT_CR_V IO_ADDRESS(OMAP24XX_32KSYNCT_BASE + 0x010)
|
||||
|
||||
#define CM_CLKSEL2_PLL_V IO_ADDRESS(OMAP24XX_PRCM_BASE + 0x544)
|
||||
#define PRCM_VOLTCTRL_V IO_ADDRESS(OMAP24XX_PRCM_BASE + 0x050)
|
||||
#define PRCM_CLKCFG_CTRL_V IO_ADDRESS(OMAP24XX_PRCM_BASE + 0x080)
|
||||
#define CM_CLKEN_PLL_V IO_ADDRESS(OMAP24XX_PRCM_BASE + 0x500)
|
||||
#define CM_IDLEST_CKGEN_V IO_ADDRESS(OMAP24XX_PRCM_BASE + 0x520)
|
||||
#define CM_CLKSEL1_PLL_V IO_ADDRESS(OMAP24XX_PRCM_BASE + 0x540)
|
||||
|
||||
#define SDRC_DLLA_CTRL_V IO_ADDRESS(OMAP24XX_SDRC_BASE + 0x060)
|
||||
#define SDRC_RFR_CTRL_V IO_ADDRESS(OMAP24XX_SDRC_BASE + 0x0a4)
|
||||
#define TIMER_32KSYNCT_CR_V IO_ADDRESS(OMAP2420_32KSYNCT_BASE + 0x010)
|
||||
|
||||
.text
|
||||
|
||||
@@ -131,11 +123,11 @@ volt_delay:
|
||||
|
||||
/* relative load constants */
|
||||
cm_clksel2_pll:
|
||||
.word CM_CLKSEL2_PLL_V
|
||||
.word OMAP2420_CM_REGADDR(PLL_MOD, CM_CLKSEL2)
|
||||
sdrc_dlla_ctrl:
|
||||
.word SDRC_DLLA_CTRL_V
|
||||
.word OMAP242X_SDRC_REGADDR(SDRC_DLLA_CTRL)
|
||||
prcm_voltctrl:
|
||||
.word PRCM_VOLTCTRL_V
|
||||
.word OMAP2420_PRM_REGADDR(OCP_MOD, 0x50)
|
||||
prcm_mask_val:
|
||||
.word 0xFFFF3FFC
|
||||
timer_32ksynct_cr:
|
||||
@@ -225,13 +217,13 @@ volt_delay_c:
|
||||
mov pc, lr @ back to caller
|
||||
|
||||
ddr_cm_clksel2_pll:
|
||||
.word CM_CLKSEL2_PLL_V
|
||||
.word OMAP2420_CM_REGADDR(PLL_MOD, CM_CLKSEL2)
|
||||
ddr_sdrc_dlla_ctrl:
|
||||
.word SDRC_DLLA_CTRL_V
|
||||
.word OMAP242X_SDRC_REGADDR(SDRC_DLLA_CTRL)
|
||||
ddr_sdrc_rfr_ctrl:
|
||||
.word SDRC_RFR_CTRL_V
|
||||
.word OMAP242X_SDRC_REGADDR(SDRC_RFR_CTRL_0)
|
||||
ddr_prcm_voltctrl:
|
||||
.word PRCM_VOLTCTRL_V
|
||||
.word OMAP2420_PRM_REGADDR(OCP_MOD, 0x50)
|
||||
ddr_prcm_mask_val:
|
||||
.word 0xFFFF3FFC
|
||||
ddr_timer_32ksynct:
|
||||
@@ -316,17 +308,17 @@ wait_dll_lock:
|
||||
ldmfd sp!, {r0-r12, pc} @ restore regs and return
|
||||
|
||||
set_config:
|
||||
.word PRCM_CLKCFG_CTRL_V
|
||||
.word OMAP2420_PRM_REGADDR(OCP_MOD, 0x80)
|
||||
pll_ctl:
|
||||
.word CM_CLKEN_PLL_V
|
||||
.word OMAP2420_CM_REGADDR(PLL_MOD, CM_FCLKEN1)
|
||||
pll_stat:
|
||||
.word CM_IDLEST_CKGEN_V
|
||||
.word OMAP2420_CM_REGADDR(PLL_MOD, CM_IDLEST1)
|
||||
pll_div:
|
||||
.word CM_CLKSEL1_PLL_V
|
||||
.word OMAP2420_CM_REGADDR(PLL_MOD, CM_CLKSEL)
|
||||
sdrc_rfr:
|
||||
.word SDRC_RFR_CTRL_V
|
||||
.word OMAP242X_SDRC_REGADDR(SDRC_RFR_CTRL_0)
|
||||
dlla_ctrl:
|
||||
.word SDRC_DLLA_CTRL_V
|
||||
.word OMAP242X_SDRC_REGADDR(SDRC_DLLA_CTRL)
|
||||
|
||||
ENTRY(sram_set_prcm_sz)
|
||||
.word . - sram_set_prcm
|
||||
|
||||
+137
-15
@@ -3,6 +3,11 @@
|
||||
*
|
||||
* OMAP2 GP timer support.
|
||||
*
|
||||
* Update to use new clocksource/clockevent layers
|
||||
* Author: Kevin Hilman, MontaVista Software, Inc. <source@mvista.com>
|
||||
* Copyright (C) 2007 MontaVista Software, Inc.
|
||||
*
|
||||
* Original driver:
|
||||
* Copyright (C) 2005 Nokia Corporation
|
||||
* Author: Paul Mundt <paul.mundt@nokia.com>
|
||||
* Juha Yrjölä <juha.yrjola@nokia.com>
|
||||
@@ -25,24 +30,23 @@
|
||||
#include <linux/clk.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/clocksource.h>
|
||||
#include <linux/clockchips.h>
|
||||
|
||||
#include <asm/mach/time.h>
|
||||
#include <asm/arch/dmtimer.h>
|
||||
|
||||
static struct omap_dm_timer *gptimer;
|
||||
|
||||
static inline void omap2_gp_timer_start(unsigned long load_val)
|
||||
{
|
||||
omap_dm_timer_set_load(gptimer, 1, 0xffffffff - load_val);
|
||||
omap_dm_timer_set_int_enable(gptimer, OMAP_TIMER_INT_OVERFLOW);
|
||||
omap_dm_timer_start(gptimer);
|
||||
}
|
||||
static struct clock_event_device clockevent_gpt;
|
||||
|
||||
static irqreturn_t omap2_gp_timer_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
omap_dm_timer_write_status(gptimer, OMAP_TIMER_INT_OVERFLOW);
|
||||
timer_tick();
|
||||
struct omap_dm_timer *gpt = (struct omap_dm_timer *)dev_id;
|
||||
struct clock_event_device *evt = &clockevent_gpt;
|
||||
|
||||
omap_dm_timer_write_status(gpt, OMAP_TIMER_INT_OVERFLOW);
|
||||
|
||||
evt->event_handler(evt);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
@@ -52,20 +56,138 @@ static struct irqaction omap2_gp_timer_irq = {
|
||||
.handler = omap2_gp_timer_interrupt,
|
||||
};
|
||||
|
||||
static void __init omap2_gp_timer_init(void)
|
||||
static int omap2_gp_timer_set_next_event(unsigned long cycles,
|
||||
struct clock_event_device *evt)
|
||||
{
|
||||
u32 tick_period;
|
||||
omap_dm_timer_set_load(gptimer, 0, 0xffffffff - cycles);
|
||||
omap_dm_timer_start(gptimer);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void omap2_gp_timer_set_mode(enum clock_event_mode mode,
|
||||
struct clock_event_device *evt)
|
||||
{
|
||||
u32 period;
|
||||
|
||||
omap_dm_timer_stop(gptimer);
|
||||
|
||||
switch (mode) {
|
||||
case CLOCK_EVT_MODE_PERIODIC:
|
||||
period = clk_get_rate(omap_dm_timer_get_fclk(gptimer)) / HZ;
|
||||
period -= 1;
|
||||
|
||||
omap_dm_timer_set_load(gptimer, 1, 0xffffffff - period);
|
||||
omap_dm_timer_start(gptimer);
|
||||
break;
|
||||
case CLOCK_EVT_MODE_ONESHOT:
|
||||
break;
|
||||
case CLOCK_EVT_MODE_UNUSED:
|
||||
case CLOCK_EVT_MODE_SHUTDOWN:
|
||||
case CLOCK_EVT_MODE_RESUME:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static struct clock_event_device clockevent_gpt = {
|
||||
.name = "gp timer",
|
||||
.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
|
||||
.shift = 32,
|
||||
.set_next_event = omap2_gp_timer_set_next_event,
|
||||
.set_mode = omap2_gp_timer_set_mode,
|
||||
};
|
||||
|
||||
static void __init omap2_gp_clockevent_init(void)
|
||||
{
|
||||
u32 tick_rate;
|
||||
|
||||
omap_dm_timer_init();
|
||||
gptimer = omap_dm_timer_request_specific(1);
|
||||
BUG_ON(gptimer == NULL);
|
||||
|
||||
#if defined(CONFIG_OMAP_32K_TIMER)
|
||||
omap_dm_timer_set_source(gptimer, OMAP_TIMER_SRC_32_KHZ);
|
||||
#else
|
||||
omap_dm_timer_set_source(gptimer, OMAP_TIMER_SRC_SYS_CLK);
|
||||
tick_period = clk_get_rate(omap_dm_timer_get_fclk(gptimer)) / HZ;
|
||||
tick_period -= 1;
|
||||
#endif
|
||||
tick_rate = clk_get_rate(omap_dm_timer_get_fclk(gptimer));
|
||||
|
||||
omap2_gp_timer_irq.dev_id = (void *)gptimer;
|
||||
setup_irq(omap_dm_timer_get_irq(gptimer), &omap2_gp_timer_irq);
|
||||
omap2_gp_timer_start(tick_period);
|
||||
omap_dm_timer_set_int_enable(gptimer, OMAP_TIMER_INT_OVERFLOW);
|
||||
|
||||
clockevent_gpt.mult = div_sc(tick_rate, NSEC_PER_SEC,
|
||||
clockevent_gpt.shift);
|
||||
clockevent_gpt.max_delta_ns =
|
||||
clockevent_delta2ns(0xffffffff, &clockevent_gpt);
|
||||
clockevent_gpt.min_delta_ns =
|
||||
clockevent_delta2ns(1, &clockevent_gpt);
|
||||
|
||||
clockevent_gpt.cpumask = cpumask_of_cpu(0);
|
||||
clockevents_register_device(&clockevent_gpt);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OMAP_32K_TIMER
|
||||
/*
|
||||
* When 32k-timer is enabled, don't use GPTimer for clocksource
|
||||
* instead, just leave default clocksource which uses the 32k
|
||||
* sync counter. See clocksource setup in see plat-omap/common.c.
|
||||
*/
|
||||
|
||||
static inline void __init omap2_gp_clocksource_init(void) {}
|
||||
#else
|
||||
/*
|
||||
* clocksource
|
||||
*/
|
||||
static struct omap_dm_timer *gpt_clocksource;
|
||||
static cycle_t clocksource_read_cycles(void)
|
||||
{
|
||||
return (cycle_t)omap_dm_timer_read_counter(gpt_clocksource);
|
||||
}
|
||||
|
||||
static struct clocksource clocksource_gpt = {
|
||||
.name = "gp timer",
|
||||
.rating = 300,
|
||||
.read = clocksource_read_cycles,
|
||||
.mask = CLOCKSOURCE_MASK(32),
|
||||
.shift = 24,
|
||||
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
|
||||
};
|
||||
|
||||
/* Setup free-running counter for clocksource */
|
||||
static void __init omap2_gp_clocksource_init(void)
|
||||
{
|
||||
static struct omap_dm_timer *gpt;
|
||||
u32 tick_rate, tick_period;
|
||||
static char err1[] __initdata = KERN_ERR
|
||||
"%s: failed to request dm-timer\n";
|
||||
static char err2[] __initdata = KERN_ERR
|
||||
"%s: can't register clocksource!\n";
|
||||
|
||||
gpt = omap_dm_timer_request();
|
||||
if (!gpt)
|
||||
printk(err1, clocksource_gpt.name);
|
||||
gpt_clocksource = gpt;
|
||||
|
||||
omap_dm_timer_set_source(gpt, OMAP_TIMER_SRC_SYS_CLK);
|
||||
tick_rate = clk_get_rate(omap_dm_timer_get_fclk(gpt));
|
||||
tick_period = (tick_rate / HZ) - 1;
|
||||
|
||||
omap_dm_timer_set_load(gpt, 1, 0);
|
||||
omap_dm_timer_start(gpt);
|
||||
|
||||
clocksource_gpt.mult =
|
||||
clocksource_khz2mult(tick_rate/1000, clocksource_gpt.shift);
|
||||
if (clocksource_register(&clocksource_gpt))
|
||||
printk(err2, clocksource_gpt.name);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void __init omap2_gp_timer_init(void)
|
||||
{
|
||||
omap_dm_timer_init();
|
||||
|
||||
omap2_gp_clockevent_init();
|
||||
omap2_gp_clocksource_init();
|
||||
}
|
||||
|
||||
struct sys_timer omap_timer = {
|
||||
|
||||
@@ -9,8 +9,6 @@ obj-m :=
|
||||
obj-n :=
|
||||
obj- :=
|
||||
|
||||
obj-$(CONFIG_OMAP_32K_TIMER) += timer32k.o
|
||||
|
||||
# OCPI interconnect support for 1710, 1610 and 5912
|
||||
obj-$(CONFIG_ARCH_OMAP16XX) += ocpi.o
|
||||
|
||||
|
||||
@@ -304,6 +304,23 @@ void propagate_rate(struct clk * tclk)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* recalculate_root_clocks - recalculate and propagate all root clocks
|
||||
*
|
||||
* Recalculates all root clocks (clocks with no parent), which if the
|
||||
* clock's .recalc is set correctly, should also propagate their rates.
|
||||
* Called at init.
|
||||
*/
|
||||
void recalculate_root_clocks(void)
|
||||
{
|
||||
struct clk *clkp;
|
||||
|
||||
list_for_each_entry(clkp, &clocks, node) {
|
||||
if (unlikely(!clkp->parent) && likely((u32)clkp->recalc))
|
||||
clkp->recalc(clkp);
|
||||
}
|
||||
}
|
||||
|
||||
int clk_register(struct clk *clk)
|
||||
{
|
||||
if (clk == NULL || IS_ERR(clk))
|
||||
@@ -358,6 +375,30 @@ void clk_allow_idle(struct clk *clk)
|
||||
}
|
||||
EXPORT_SYMBOL(clk_allow_idle);
|
||||
|
||||
void clk_enable_init_clocks(void)
|
||||
{
|
||||
struct clk *clkp;
|
||||
|
||||
list_for_each_entry(clkp, &clocks, node) {
|
||||
if (clkp->flags & ENABLE_ON_INIT)
|
||||
clk_enable(clkp);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(clk_enable_init_clocks);
|
||||
|
||||
#ifdef CONFIG_CPU_FREQ
|
||||
void clk_init_cpufreq_table(struct cpufreq_frequency_table **table)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&clockfw_lock, flags);
|
||||
if (arch_clock->clk_init_cpufreq_table)
|
||||
arch_clock->clk_init_cpufreq_table(table);
|
||||
spin_unlock_irqrestore(&clockfw_lock, flags);
|
||||
}
|
||||
EXPORT_SYMBOL(clk_init_cpufreq_table);
|
||||
#endif
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
#ifdef CONFIG_OMAP_RESET_CLOCKS
|
||||
@@ -396,3 +437,4 @@ int __init clk_init(struct clk_functions * custom_clocks)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -27,11 +27,16 @@
|
||||
#include <asm/setup.h>
|
||||
|
||||
#include <asm/arch/board.h>
|
||||
#include <asm/arch/control.h>
|
||||
#include <asm/arch/mux.h>
|
||||
#include <asm/arch/fpga.h>
|
||||
|
||||
#include <asm/arch/clock.h>
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
|
||||
# include "../mach-omap2/sdrc.h"
|
||||
#endif
|
||||
|
||||
#define NO_LENGTH_CHECK 0xffffffff
|
||||
|
||||
unsigned char omap_bootloader_tag[512];
|
||||
@@ -171,8 +176,8 @@ console_initcall(omap_add_serial_console);
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP16XX)
|
||||
#define TIMER_32K_SYNCHRONIZED 0xfffbc410
|
||||
#elif defined(CONFIG_ARCH_OMAP24XX)
|
||||
#define TIMER_32K_SYNCHRONIZED (OMAP24XX_32KSYNCT_BASE + 0x10)
|
||||
#elif defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX)
|
||||
#define TIMER_32K_SYNCHRONIZED (OMAP2_32KSYNCT_BASE + 0x10)
|
||||
#endif
|
||||
|
||||
#ifdef TIMER_32K_SYNCHRONIZED
|
||||
@@ -193,12 +198,35 @@ static struct clocksource clocksource_32k = {
|
||||
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
|
||||
};
|
||||
|
||||
/*
|
||||
* Rounds down to nearest nsec.
|
||||
*/
|
||||
unsigned long long omap_32k_ticks_to_nsecs(unsigned long ticks_32k)
|
||||
{
|
||||
return cyc2ns(&clocksource_32k, ticks_32k);
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns current time from boot in nsecs. It's OK for this to wrap
|
||||
* around for now, as it's just a relative time stamp.
|
||||
*/
|
||||
unsigned long long sched_clock(void)
|
||||
{
|
||||
return omap_32k_ticks_to_nsecs(omap_32k_read());
|
||||
}
|
||||
|
||||
static int __init omap_init_clocksource_32k(void)
|
||||
{
|
||||
static char err[] __initdata = KERN_ERR
|
||||
"%s: can't register clocksource!\n";
|
||||
|
||||
if (cpu_is_omap16xx() || cpu_is_omap24xx()) {
|
||||
if (cpu_is_omap16xx() || cpu_class_is_omap2()) {
|
||||
struct clk *sync_32k_ick;
|
||||
|
||||
sync_32k_ick = clk_get(NULL, "omap_32ksync_ick");
|
||||
if (sync_32k_ick)
|
||||
clk_enable(sync_32k_ick);
|
||||
|
||||
clocksource_32k.mult = clocksource_hz2mult(32768,
|
||||
clocksource_32k.shift);
|
||||
|
||||
@@ -210,3 +238,33 @@ static int __init omap_init_clocksource_32k(void)
|
||||
arch_initcall(omap_init_clocksource_32k);
|
||||
|
||||
#endif /* TIMER_32K_SYNCHRONIZED */
|
||||
|
||||
/* Global address base setup code */
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP2420)
|
||||
void __init omap2_set_globals_242x(void)
|
||||
{
|
||||
omap2_sdrc_base = OMAP2420_SDRC_BASE;
|
||||
omap2_sms_base = OMAP2420_SMS_BASE;
|
||||
omap_ctrl_base_set(OMAP2420_CTRL_BASE);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP2430)
|
||||
void __init omap2_set_globals_243x(void)
|
||||
{
|
||||
omap2_sdrc_base = OMAP243X_SDRC_BASE;
|
||||
omap2_sms_base = OMAP243X_SMS_BASE;
|
||||
omap_ctrl_base_set(OMAP243X_CTRL_BASE);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP3430)
|
||||
void __init omap2_set_globals_343x(void)
|
||||
{
|
||||
omap2_sdrc_base = OMAP343X_SDRC_BASE;
|
||||
omap2_sms_base = OMAP343X_SMS_BASE;
|
||||
omap_ctrl_base_set(OMAP343X_CTRL_BASE);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
+109
-67
@@ -136,7 +136,6 @@ struct gpio_bank {
|
||||
u16 irq;
|
||||
u16 virtual_irq_start;
|
||||
int method;
|
||||
u32 reserved_map;
|
||||
#if defined(CONFIG_ARCH_OMAP16XX) || defined(CONFIG_ARCH_OMAP24XX) || defined(CONFIG_ARCH_OMAP34XX)
|
||||
u32 suspend_wakeup;
|
||||
u32 saved_wakeup;
|
||||
@@ -149,7 +148,9 @@ struct gpio_bank {
|
||||
u32 saved_fallingdetect;
|
||||
u32 saved_risingdetect;
|
||||
#endif
|
||||
u32 level_mask;
|
||||
spinlock_t lock;
|
||||
struct gpio_chip chip;
|
||||
};
|
||||
|
||||
#define METHOD_MPUIO 0
|
||||
@@ -538,10 +539,9 @@ static inline void set_24xx_gpio_triggering(struct gpio_bank *bank, int gpio,
|
||||
bank->enabled_non_wakeup_gpios &= ~gpio_bit;
|
||||
}
|
||||
|
||||
/*
|
||||
* FIXME: Possibly do 'set_irq_handler(j, handle_level_irq)' if only
|
||||
* level triggering requested.
|
||||
*/
|
||||
bank->level_mask =
|
||||
__raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT0) |
|
||||
__raw_readl(bank->base + OMAP24XX_GPIO_LEVELDETECT1);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -652,6 +652,12 @@ static int gpio_irq_type(unsigned irq, unsigned type)
|
||||
irq_desc[irq].status |= type;
|
||||
}
|
||||
spin_unlock_irqrestore(&bank->lock, flags);
|
||||
|
||||
if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH))
|
||||
__set_irq_handler_unlocked(irq, handle_level_irq);
|
||||
else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING))
|
||||
__set_irq_handler_unlocked(irq, handle_edge_irq);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -903,19 +909,17 @@ int omap_request_gpio(int gpio)
|
||||
{
|
||||
struct gpio_bank *bank;
|
||||
unsigned long flags;
|
||||
int status;
|
||||
|
||||
if (check_gpio(gpio) < 0)
|
||||
return -EINVAL;
|
||||
|
||||
status = gpio_request(gpio, NULL);
|
||||
if (status < 0)
|
||||
return status;
|
||||
|
||||
bank = get_gpio_bank(gpio);
|
||||
spin_lock_irqsave(&bank->lock, flags);
|
||||
if (unlikely(bank->reserved_map & (1 << get_gpio_index(gpio)))) {
|
||||
printk(KERN_ERR "omap-gpio: GPIO %d is already reserved!\n", gpio);
|
||||
dump_stack();
|
||||
spin_unlock_irqrestore(&bank->lock, flags);
|
||||
return -1;
|
||||
}
|
||||
bank->reserved_map |= (1 << get_gpio_index(gpio));
|
||||
|
||||
/* Set trigger to none. You need to enable the desired trigger with
|
||||
* request_irq() or set_irq_type().
|
||||
@@ -945,10 +949,11 @@ void omap_free_gpio(int gpio)
|
||||
return;
|
||||
bank = get_gpio_bank(gpio);
|
||||
spin_lock_irqsave(&bank->lock, flags);
|
||||
if (unlikely(!(bank->reserved_map & (1 << get_gpio_index(gpio))))) {
|
||||
if (unlikely(!gpiochip_is_requested(&bank->chip,
|
||||
get_gpio_index(gpio)))) {
|
||||
spin_unlock_irqrestore(&bank->lock, flags);
|
||||
printk(KERN_ERR "omap-gpio: GPIO %d wasn't reserved!\n", gpio);
|
||||
dump_stack();
|
||||
spin_unlock_irqrestore(&bank->lock, flags);
|
||||
return;
|
||||
}
|
||||
#ifdef CONFIG_ARCH_OMAP16XX
|
||||
@@ -965,9 +970,9 @@ void omap_free_gpio(int gpio)
|
||||
__raw_writel(1 << get_gpio_index(gpio), reg);
|
||||
}
|
||||
#endif
|
||||
bank->reserved_map &= ~(1 << get_gpio_index(gpio));
|
||||
_reset_gpio(bank, gpio);
|
||||
spin_unlock_irqrestore(&bank->lock, flags);
|
||||
gpio_free(gpio);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1022,12 +1027,7 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
|
||||
isr &= 0x0000ffff;
|
||||
|
||||
if (cpu_class_is_omap2()) {
|
||||
level_mask =
|
||||
__raw_readl(bank->base +
|
||||
OMAP24XX_GPIO_LEVELDETECT0) |
|
||||
__raw_readl(bank->base +
|
||||
OMAP24XX_GPIO_LEVELDETECT1);
|
||||
level_mask &= enabled;
|
||||
level_mask = bank->level_mask & enabled;
|
||||
}
|
||||
|
||||
/* clear edge sensitive interrupts before handler(s) are
|
||||
@@ -1052,51 +1052,13 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
|
||||
gpio_irq = bank->virtual_irq_start;
|
||||
for (; isr != 0; isr >>= 1, gpio_irq++) {
|
||||
struct irq_desc *d;
|
||||
int irq_mask;
|
||||
|
||||
if (!(isr & 1))
|
||||
continue;
|
||||
d = irq_desc + gpio_irq;
|
||||
/* Don't run the handler if it's already running
|
||||
* or was disabled lazely.
|
||||
*/
|
||||
if (unlikely((d->depth ||
|
||||
(d->status & IRQ_INPROGRESS)))) {
|
||||
irq_mask = 1 <<
|
||||
(gpio_irq - bank->virtual_irq_start);
|
||||
/* The unmasking will be done by
|
||||
* enable_irq in case it is disabled or
|
||||
* after returning from the handler if
|
||||
* it's already running.
|
||||
*/
|
||||
_enable_gpio_irqbank(bank, irq_mask, 0);
|
||||
if (!d->depth) {
|
||||
/* Level triggered interrupts
|
||||
* won't ever be reentered
|
||||
*/
|
||||
BUG_ON(level_mask & irq_mask);
|
||||
d->status |= IRQ_PENDING;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
desc_handle_irq(gpio_irq, d);
|
||||
|
||||
if (unlikely((d->status & IRQ_PENDING) && !d->depth)) {
|
||||
irq_mask = 1 <<
|
||||
(gpio_irq - bank->virtual_irq_start);
|
||||
d->status &= ~IRQ_PENDING;
|
||||
_enable_gpio_irqbank(bank, irq_mask, 1);
|
||||
retrigger |= irq_mask;
|
||||
}
|
||||
}
|
||||
|
||||
if (cpu_class_is_omap2()) {
|
||||
/* clear level sensitive interrupts after handler(s) */
|
||||
_enable_gpio_irqbank(bank, isr_saved & level_mask, 0);
|
||||
_clear_gpio_irqbank(bank, isr_saved & level_mask);
|
||||
_enable_gpio_irqbank(bank, isr_saved & level_mask, 1);
|
||||
}
|
||||
|
||||
}
|
||||
/* if bank has any level sensitive GPIO pin interrupt
|
||||
configured, we must unmask the bank interrupt only after
|
||||
@@ -1135,6 +1097,14 @@ static void gpio_unmask_irq(unsigned int irq)
|
||||
{
|
||||
unsigned int gpio = irq - IH_GPIO_BASE;
|
||||
struct gpio_bank *bank = get_irq_chip_data(irq);
|
||||
unsigned int irq_mask = 1 << get_gpio_index(gpio);
|
||||
|
||||
/* For level-triggered GPIOs, the clearing must be done after
|
||||
* the HW source is cleared, thus after the handler has run */
|
||||
if (bank->level_mask & irq_mask) {
|
||||
_set_gpio_irqenable(bank, gpio, 0);
|
||||
_clear_gpio_irqstatus(bank, gpio);
|
||||
}
|
||||
|
||||
_set_gpio_irqenable(bank, gpio, 1);
|
||||
}
|
||||
@@ -1266,6 +1236,53 @@ static inline void mpuio_init(void) {}
|
||||
|
||||
/*---------------------------------------------------------------------*/
|
||||
|
||||
/* REVISIT these are stupid implementations! replace by ones that
|
||||
* don't switch on METHOD_* and which mostly avoid spinlocks
|
||||
*/
|
||||
|
||||
static int gpio_input(struct gpio_chip *chip, unsigned offset)
|
||||
{
|
||||
struct gpio_bank *bank;
|
||||
unsigned long flags;
|
||||
|
||||
bank = container_of(chip, struct gpio_bank, chip);
|
||||
spin_lock_irqsave(&bank->lock, flags);
|
||||
_set_gpio_direction(bank, offset, 1);
|
||||
spin_unlock_irqrestore(&bank->lock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int gpio_get(struct gpio_chip *chip, unsigned offset)
|
||||
{
|
||||
return omap_get_gpio_datain(chip->base + offset);
|
||||
}
|
||||
|
||||
static int gpio_output(struct gpio_chip *chip, unsigned offset, int value)
|
||||
{
|
||||
struct gpio_bank *bank;
|
||||
unsigned long flags;
|
||||
|
||||
bank = container_of(chip, struct gpio_bank, chip);
|
||||
spin_lock_irqsave(&bank->lock, flags);
|
||||
_set_gpio_dataout(bank, offset, value);
|
||||
_set_gpio_direction(bank, offset, 0);
|
||||
spin_unlock_irqrestore(&bank->lock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void gpio_set(struct gpio_chip *chip, unsigned offset, int value)
|
||||
{
|
||||
struct gpio_bank *bank;
|
||||
unsigned long flags;
|
||||
|
||||
bank = container_of(chip, struct gpio_bank, chip);
|
||||
spin_lock_irqsave(&bank->lock, flags);
|
||||
_set_gpio_dataout(bank, offset, value);
|
||||
spin_unlock_irqrestore(&bank->lock, flags);
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------*/
|
||||
|
||||
static int initialized;
|
||||
#if !defined(CONFIG_ARCH_OMAP3)
|
||||
static struct clk * gpio_ick;
|
||||
@@ -1293,6 +1310,7 @@ static struct lock_class_key gpio_lock_class;
|
||||
static int __init _omap_gpio_init(void)
|
||||
{
|
||||
int i;
|
||||
int gpio = 0;
|
||||
struct gpio_bank *bank;
|
||||
#if defined(CONFIG_ARCH_OMAP3)
|
||||
char clk_name[11];
|
||||
@@ -1423,7 +1441,6 @@ static int __init _omap_gpio_init(void)
|
||||
int j, gpio_count = 16;
|
||||
|
||||
bank = &gpio_bank[i];
|
||||
bank->reserved_map = 0;
|
||||
bank->base = IO_ADDRESS(bank->base);
|
||||
spin_lock_init(&bank->lock);
|
||||
if (bank_is_mpuio(bank))
|
||||
@@ -1461,6 +1478,26 @@ static int __init _omap_gpio_init(void)
|
||||
gpio_count = 32;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* REVISIT eventually switch from OMAP-specific gpio structs
|
||||
* over to the generic ones
|
||||
*/
|
||||
bank->chip.direction_input = gpio_input;
|
||||
bank->chip.get = gpio_get;
|
||||
bank->chip.direction_output = gpio_output;
|
||||
bank->chip.set = gpio_set;
|
||||
if (bank_is_mpuio(bank)) {
|
||||
bank->chip.label = "mpuio";
|
||||
bank->chip.base = OMAP_MPUIO(0);
|
||||
} else {
|
||||
bank->chip.label = "gpio";
|
||||
bank->chip.base = gpio;
|
||||
gpio += gpio_count;
|
||||
}
|
||||
bank->chip.ngpio = gpio_count;
|
||||
|
||||
gpiochip_add(&bank->chip);
|
||||
|
||||
for (j = bank->virtual_irq_start;
|
||||
j < bank->virtual_irq_start + gpio_count; j++) {
|
||||
lockdep_set_class(&irq_desc[j].lock, &gpio_lock_class);
|
||||
@@ -1757,8 +1794,10 @@ static int dbg_gpio_show(struct seq_file *s, void *unused)
|
||||
|
||||
for (j = 0; j < bankwidth; j++, gpio++, mask <<= 1) {
|
||||
unsigned irq, value, is_in, irqstat;
|
||||
const char *label;
|
||||
|
||||
if (!(bank->reserved_map & mask))
|
||||
label = gpiochip_is_requested(&bank->chip, j);
|
||||
if (!label)
|
||||
continue;
|
||||
|
||||
irq = bank->virtual_irq_start + j;
|
||||
@@ -1766,13 +1805,16 @@ static int dbg_gpio_show(struct seq_file *s, void *unused)
|
||||
is_in = gpio_is_input(bank, mask);
|
||||
|
||||
if (bank_is_mpuio(bank))
|
||||
seq_printf(s, "MPUIO %2d: ", j);
|
||||
seq_printf(s, "MPUIO %2d ", j);
|
||||
else
|
||||
seq_printf(s, "GPIO %3d: ", gpio);
|
||||
seq_printf(s, "%s %s",
|
||||
seq_printf(s, "GPIO %3d ", gpio);
|
||||
seq_printf(s, "(%10s): %s %s",
|
||||
label,
|
||||
is_in ? "in " : "out",
|
||||
value ? "hi" : "lo");
|
||||
|
||||
/* FIXME for at least omap2, show pullup/pulldown state */
|
||||
|
||||
irqstat = irq_desc[irq].status;
|
||||
if (is_in && ((bank->suspend_wakeup & mask)
|
||||
|| irqstat & IRQ_TYPE_SENSE_MASK)) {
|
||||
@@ -1795,10 +1837,10 @@ static int dbg_gpio_show(struct seq_file *s, void *unused)
|
||||
trigger = "high";
|
||||
break;
|
||||
case IRQ_TYPE_NONE:
|
||||
trigger = "(unspecified)";
|
||||
trigger = "(?)";
|
||||
break;
|
||||
}
|
||||
seq_printf(s, ", irq-%d %s%s",
|
||||
seq_printf(s, ", irq-%d %-8s%s",
|
||||
irq, trigger,
|
||||
(bank->suspend_wakeup & mask)
|
||||
? " wakeup" : "");
|
||||
|
||||
+22
-152
@@ -3,9 +3,9 @@
|
||||
*
|
||||
* Utility to set the Omap MUX and PULL_DWN registers from a table in mux.h
|
||||
*
|
||||
* Copyright (C) 2003 - 2005 Nokia Corporation
|
||||
* Copyright (C) 2003 - 2008 Nokia Corporation
|
||||
*
|
||||
* Written by Tony Lindgren <tony.lindgren@nokia.com>
|
||||
* Written by Tony Lindgren
|
||||
*
|
||||
* 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
|
||||
@@ -32,21 +32,17 @@
|
||||
|
||||
#ifdef CONFIG_OMAP_MUX
|
||||
|
||||
#define OMAP24XX_L4_BASE 0x48000000
|
||||
#define OMAP24XX_PULL_ENA (1 << 3)
|
||||
#define OMAP24XX_PULL_UP (1 << 4)
|
||||
static struct omap_mux_cfg *mux_cfg;
|
||||
|
||||
static struct pin_config * pin_table;
|
||||
static unsigned long pin_table_sz;
|
||||
|
||||
extern struct pin_config * omap730_pins;
|
||||
extern struct pin_config * omap1xxx_pins;
|
||||
extern struct pin_config * omap24xx_pins;
|
||||
|
||||
int __init omap_mux_register(struct pin_config * pins, unsigned long size)
|
||||
int __init omap_mux_register(struct omap_mux_cfg *arch_mux_cfg)
|
||||
{
|
||||
pin_table = pins;
|
||||
pin_table_sz = size;
|
||||
if (!arch_mux_cfg || !arch_mux_cfg->pins || arch_mux_cfg->size == 0
|
||||
|| !arch_mux_cfg->cfg_reg) {
|
||||
printk(KERN_ERR "Invalid pin table\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
mux_cfg = arch_mux_cfg;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -56,152 +52,26 @@ int __init omap_mux_register(struct pin_config * pins, unsigned long size)
|
||||
*/
|
||||
int __init_or_module omap_cfg_reg(const unsigned long index)
|
||||
{
|
||||
static DEFINE_SPINLOCK(mux_spin_lock);
|
||||
struct pin_config *reg;
|
||||
|
||||
unsigned long flags;
|
||||
struct pin_config *cfg;
|
||||
unsigned int reg_orig = 0, reg = 0, pu_pd_orig = 0, pu_pd = 0,
|
||||
pull_orig = 0, pull = 0;
|
||||
unsigned int mask, warn = 0;
|
||||
if (mux_cfg == NULL) {
|
||||
printk(KERN_ERR "Pin mux table not initialized\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (!pin_table)
|
||||
BUG();
|
||||
|
||||
if (index >= pin_table_sz) {
|
||||
if (index >= mux_cfg->size) {
|
||||
printk(KERN_ERR "Invalid pin mux index: %lu (%lu)\n",
|
||||
index, pin_table_sz);
|
||||
index, mux_cfg->size);
|
||||
dump_stack();
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
cfg = (struct pin_config *)&pin_table[index];
|
||||
if (cpu_is_omap24xx()) {
|
||||
u8 reg = 0;
|
||||
reg = (struct pin_config *)&mux_cfg->pins[index];
|
||||
|
||||
reg |= cfg->mask & 0x7;
|
||||
if (cfg->pull_val)
|
||||
reg |= OMAP24XX_PULL_ENA;
|
||||
if(cfg->pu_pd_val)
|
||||
reg |= OMAP24XX_PULL_UP;
|
||||
#if defined(CONFIG_OMAP_MUX_DEBUG) || defined(CONFIG_OMAP_MUX_WARNINGS)
|
||||
{
|
||||
u8 orig = omap_readb(OMAP24XX_L4_BASE + cfg->mux_reg);
|
||||
u8 debug = 0;
|
||||
if (!mux_cfg->cfg_reg)
|
||||
return -ENODEV;
|
||||
|
||||
#ifdef CONFIG_OMAP_MUX_DEBUG
|
||||
debug = cfg->debug;
|
||||
#endif
|
||||
warn = (orig != reg);
|
||||
if (debug || warn)
|
||||
printk("MUX: setup %s (0x%08x): 0x%02x -> 0x%02x\n",
|
||||
cfg->name,
|
||||
OMAP24XX_L4_BASE + cfg->mux_reg,
|
||||
orig, reg);
|
||||
}
|
||||
#endif
|
||||
omap_writeb(reg, OMAP24XX_L4_BASE + cfg->mux_reg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Check the mux register in question */
|
||||
if (cfg->mux_reg) {
|
||||
unsigned tmp1, tmp2;
|
||||
|
||||
spin_lock_irqsave(&mux_spin_lock, flags);
|
||||
reg_orig = omap_readl(cfg->mux_reg);
|
||||
|
||||
/* The mux registers always seem to be 3 bits long */
|
||||
mask = (0x7 << cfg->mask_offset);
|
||||
tmp1 = reg_orig & mask;
|
||||
reg = reg_orig & ~mask;
|
||||
|
||||
tmp2 = (cfg->mask << cfg->mask_offset);
|
||||
reg |= tmp2;
|
||||
|
||||
if (tmp1 != tmp2)
|
||||
warn = 1;
|
||||
|
||||
omap_writel(reg, cfg->mux_reg);
|
||||
spin_unlock_irqrestore(&mux_spin_lock, flags);
|
||||
}
|
||||
|
||||
/* Check for pull up or pull down selection on 1610 */
|
||||
if (!cpu_is_omap15xx()) {
|
||||
if (cfg->pu_pd_reg && cfg->pull_val) {
|
||||
spin_lock_irqsave(&mux_spin_lock, flags);
|
||||
pu_pd_orig = omap_readl(cfg->pu_pd_reg);
|
||||
mask = 1 << cfg->pull_bit;
|
||||
|
||||
if (cfg->pu_pd_val) {
|
||||
if (!(pu_pd_orig & mask))
|
||||
warn = 1;
|
||||
/* Use pull up */
|
||||
pu_pd = pu_pd_orig | mask;
|
||||
} else {
|
||||
if (pu_pd_orig & mask)
|
||||
warn = 1;
|
||||
/* Use pull down */
|
||||
pu_pd = pu_pd_orig & ~mask;
|
||||
}
|
||||
omap_writel(pu_pd, cfg->pu_pd_reg);
|
||||
spin_unlock_irqrestore(&mux_spin_lock, flags);
|
||||
}
|
||||
}
|
||||
|
||||
/* Check for an associated pull down register */
|
||||
if (cfg->pull_reg) {
|
||||
spin_lock_irqsave(&mux_spin_lock, flags);
|
||||
pull_orig = omap_readl(cfg->pull_reg);
|
||||
mask = 1 << cfg->pull_bit;
|
||||
|
||||
if (cfg->pull_val) {
|
||||
if (pull_orig & mask)
|
||||
warn = 1;
|
||||
/* Low bit = pull enabled */
|
||||
pull = pull_orig & ~mask;
|
||||
} else {
|
||||
if (!(pull_orig & mask))
|
||||
warn = 1;
|
||||
/* High bit = pull disabled */
|
||||
pull = pull_orig | mask;
|
||||
}
|
||||
|
||||
omap_writel(pull, cfg->pull_reg);
|
||||
spin_unlock_irqrestore(&mux_spin_lock, flags);
|
||||
}
|
||||
|
||||
if (warn) {
|
||||
#ifdef CONFIG_OMAP_MUX_WARNINGS
|
||||
printk(KERN_WARNING "MUX: initialized %s\n", cfg->name);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OMAP_MUX_DEBUG
|
||||
if (cfg->debug || warn) {
|
||||
printk("MUX: Setting register %s\n", cfg->name);
|
||||
printk(" %s (0x%08x) = 0x%08x -> 0x%08x\n",
|
||||
cfg->mux_reg_name, cfg->mux_reg, reg_orig, reg);
|
||||
|
||||
if (!cpu_is_omap15xx()) {
|
||||
if (cfg->pu_pd_reg && cfg->pull_val) {
|
||||
printk(" %s (0x%08x) = 0x%08x -> 0x%08x\n",
|
||||
cfg->pu_pd_name, cfg->pu_pd_reg,
|
||||
pu_pd_orig, pu_pd);
|
||||
}
|
||||
}
|
||||
|
||||
if (cfg->pull_reg)
|
||||
printk(" %s (0x%08x) = 0x%08x -> 0x%08x\n",
|
||||
cfg->pull_name, cfg->pull_reg, pull_orig, pull);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_OMAP_MUX_ERRORS
|
||||
return warn ? -ETXTBSY : 0;
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
return mux_cfg->cfg_reg(reg);
|
||||
}
|
||||
EXPORT_SYMBOL(omap_cfg_reg);
|
||||
#else
|
||||
|
||||
+51
-16
@@ -33,6 +33,7 @@
|
||||
#include <asm/system.h>
|
||||
#include <asm/hardware.h>
|
||||
|
||||
#include <asm/arch/control.h>
|
||||
#include <asm/arch/mux.h>
|
||||
#include <asm/arch/usb.h>
|
||||
#include <asm/arch/board.h>
|
||||
@@ -76,7 +77,7 @@
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP_OTG
|
||||
#if defined(CONFIG_ARCH_OMAP_OTG) || defined(CONFIG_USB_MUSB_OTG)
|
||||
|
||||
static struct otg_transceiver *xceiv;
|
||||
|
||||
@@ -110,12 +111,48 @@ EXPORT_SYMBOL(otg_set_transceiver);
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP_OTG) || defined(CONFIG_ARCH_OMAP15XX)
|
||||
|
||||
static void omap2_usb_devconf_clear(u8 port, u32 mask)
|
||||
{
|
||||
u32 r;
|
||||
|
||||
r = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
|
||||
r &= ~USBTXWRMODEI(port, mask);
|
||||
omap_ctrl_writel(r, OMAP2_CONTROL_DEVCONF0);
|
||||
}
|
||||
|
||||
static void omap2_usb_devconf_set(u8 port, u32 mask)
|
||||
{
|
||||
u32 r;
|
||||
|
||||
r = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
|
||||
r |= USBTXWRMODEI(port, mask);
|
||||
omap_ctrl_writel(r, OMAP2_CONTROL_DEVCONF0);
|
||||
}
|
||||
|
||||
static void omap2_usb2_disable_5pinbitll(void)
|
||||
{
|
||||
u32 r;
|
||||
|
||||
r = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
|
||||
r &= ~(USBTXWRMODEI(2, USB_BIDIR_TLL) | USBT2TLL5PI);
|
||||
omap_ctrl_writel(r, OMAP2_CONTROL_DEVCONF0);
|
||||
}
|
||||
|
||||
static void omap2_usb2_enable_5pinunitll(void)
|
||||
{
|
||||
u32 r;
|
||||
|
||||
r = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
|
||||
r |= USBTXWRMODEI(2, USB_UNIDIR_TLL) | USBT2TLL5PI;
|
||||
omap_ctrl_writel(r, OMAP2_CONTROL_DEVCONF0);
|
||||
}
|
||||
|
||||
static u32 __init omap_usb0_init(unsigned nwires, unsigned is_device)
|
||||
{
|
||||
u32 syscon1 = 0;
|
||||
|
||||
if (cpu_is_omap24xx())
|
||||
CONTROL_DEVCONF_REG &= ~USBT0WRMODEI(USB_BIDIR_TLL);
|
||||
omap2_usb_devconf_clear(0, USB_BIDIR_TLL);
|
||||
|
||||
if (nwires == 0) {
|
||||
if (cpu_class_is_omap1() && !cpu_is_omap15xx()) {
|
||||
@@ -187,19 +224,19 @@ static u32 __init omap_usb0_init(unsigned nwires, unsigned is_device)
|
||||
case 3:
|
||||
syscon1 = 2;
|
||||
if (cpu_is_omap24xx())
|
||||
CONTROL_DEVCONF_REG |= USBT0WRMODEI(USB_BIDIR);
|
||||
omap2_usb_devconf_set(0, USB_BIDIR);
|
||||
break;
|
||||
case 4:
|
||||
syscon1 = 1;
|
||||
if (cpu_is_omap24xx())
|
||||
CONTROL_DEVCONF_REG |= USBT0WRMODEI(USB_BIDIR);
|
||||
omap2_usb_devconf_set(0, USB_BIDIR);
|
||||
break;
|
||||
case 6:
|
||||
syscon1 = 3;
|
||||
if (cpu_is_omap24xx()) {
|
||||
omap_cfg_reg(J19_24XX_USB0_VP);
|
||||
omap_cfg_reg(K20_24XX_USB0_VM);
|
||||
CONTROL_DEVCONF_REG |= USBT0WRMODEI(USB_UNIDIR);
|
||||
omap2_usb_devconf_set(0, USB_UNIDIR);
|
||||
} else {
|
||||
omap_cfg_reg(AA9_USB0_VP);
|
||||
omap_cfg_reg(R9_USB0_VM);
|
||||
@@ -220,7 +257,7 @@ static u32 __init omap_usb1_init(unsigned nwires)
|
||||
if (cpu_class_is_omap1() && !cpu_is_omap15xx() && nwires != 6)
|
||||
USB_TRANSCEIVER_CTRL_REG &= ~CONF_USB1_UNI_R;
|
||||
if (cpu_is_omap24xx())
|
||||
CONTROL_DEVCONF_REG &= ~USBT1WRMODEI(USB_BIDIR_TLL);
|
||||
omap2_usb_devconf_clear(1, USB_BIDIR_TLL);
|
||||
|
||||
if (nwires == 0)
|
||||
return 0;
|
||||
@@ -261,17 +298,17 @@ static u32 __init omap_usb1_init(unsigned nwires)
|
||||
* this TLL link is not using DP/DM
|
||||
*/
|
||||
syscon1 = 1;
|
||||
CONTROL_DEVCONF_REG |= USBT1WRMODEI(USB_BIDIR_TLL);
|
||||
omap2_usb_devconf_set(1, USB_BIDIR_TLL);
|
||||
break;
|
||||
case 3:
|
||||
syscon1 = 2;
|
||||
if (cpu_is_omap24xx())
|
||||
CONTROL_DEVCONF_REG |= USBT1WRMODEI(USB_BIDIR);
|
||||
omap2_usb_devconf_set(1, USB_BIDIR);
|
||||
break;
|
||||
case 4:
|
||||
syscon1 = 1;
|
||||
if (cpu_is_omap24xx())
|
||||
CONTROL_DEVCONF_REG |= USBT1WRMODEI(USB_BIDIR);
|
||||
omap2_usb_devconf_set(1, USB_BIDIR);
|
||||
break;
|
||||
case 6:
|
||||
if (cpu_is_omap24xx())
|
||||
@@ -295,8 +332,7 @@ static u32 __init omap_usb2_init(unsigned nwires, unsigned alt_pingroup)
|
||||
u32 syscon1 = 0;
|
||||
|
||||
if (cpu_is_omap24xx()) {
|
||||
CONTROL_DEVCONF_REG &= ~(USBT2WRMODEI(USB_BIDIR_TLL)
|
||||
| USBT2TLL5PI);
|
||||
omap2_usb2_disable_5pinbitll();
|
||||
alt_pingroup = 0;
|
||||
}
|
||||
|
||||
@@ -343,17 +379,17 @@ static u32 __init omap_usb2_init(unsigned nwires, unsigned alt_pingroup)
|
||||
* this TLL link is not using DP/DM
|
||||
*/
|
||||
syscon1 = 1;
|
||||
CONTROL_DEVCONF_REG |= USBT2WRMODEI(USB_BIDIR_TLL);
|
||||
omap2_usb_devconf_set(2, USB_BIDIR_TLL);
|
||||
break;
|
||||
case 3:
|
||||
syscon1 = 2;
|
||||
if (cpu_is_omap24xx())
|
||||
CONTROL_DEVCONF_REG |= USBT2WRMODEI(USB_BIDIR);
|
||||
omap2_usb_devconf_set(2, USB_BIDIR);
|
||||
break;
|
||||
case 4:
|
||||
syscon1 = 1;
|
||||
if (cpu_is_omap24xx())
|
||||
CONTROL_DEVCONF_REG |= USBT2WRMODEI(USB_BIDIR);
|
||||
omap2_usb_devconf_set(2, USB_BIDIR);
|
||||
break;
|
||||
case 5:
|
||||
if (!cpu_is_omap24xx())
|
||||
@@ -364,8 +400,7 @@ static u32 __init omap_usb2_init(unsigned nwires, unsigned alt_pingroup)
|
||||
* set up OTG_SYSCON2.HMC_TLL{ATTACH,SPEED}
|
||||
*/
|
||||
syscon1 = 3;
|
||||
CONTROL_DEVCONF_REG |= USBT2WRMODEI(USB_UNIDIR_TLL)
|
||||
| USBT2TLL5PI;
|
||||
omap2_usb2_enable_5pinunitll();
|
||||
break;
|
||||
case 6:
|
||||
if (cpu_is_omap24xx())
|
||||
|
||||
@@ -163,6 +163,7 @@ add_reserved_region(resource_size_t start, resource_size_t end,
|
||||
new->start = start;
|
||||
new->end = end;
|
||||
new->name = name;
|
||||
new->sibling = next;
|
||||
new->flags = IORESOURCE_MEM;
|
||||
|
||||
*pprev = new;
|
||||
|
||||
@@ -178,6 +178,7 @@ static int do_cop_absent(u32 insn)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BUG
|
||||
int is_valid_bugaddr(unsigned long pc)
|
||||
{
|
||||
unsigned short opcode;
|
||||
@@ -189,6 +190,7 @@ int is_valid_bugaddr(unsigned long pc)
|
||||
|
||||
return opcode == AVR32_BUG_OPCODE;
|
||||
}
|
||||
#endif
|
||||
|
||||
asmlinkage void do_illegal_opcode(unsigned long ecr, struct pt_regs *regs)
|
||||
{
|
||||
@@ -197,6 +199,7 @@ asmlinkage void do_illegal_opcode(unsigned long ecr, struct pt_regs *regs)
|
||||
void __user *pc;
|
||||
long code;
|
||||
|
||||
#ifdef CONFIG_BUG
|
||||
if (!user_mode(regs) && (ecr == ECR_ILLEGAL_OPCODE)) {
|
||||
enum bug_trap_type type;
|
||||
|
||||
@@ -211,6 +214,7 @@ asmlinkage void do_illegal_opcode(unsigned long ecr, struct pt_regs *regs)
|
||||
die("Kernel BUG", regs, SIGKILL);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
local_irq_enable();
|
||||
|
||||
|
||||
@@ -316,8 +316,14 @@ __trap_fixup_kernel_data_tlb_miss:
|
||||
.section .trap.vector
|
||||
.org TBR_TT_TRAP0 >> 2
|
||||
.long system_call
|
||||
.rept 126
|
||||
.rept 119
|
||||
.long __entry_unsupported_trap
|
||||
.endr
|
||||
|
||||
# userspace atomic op emulation, traps 120-126
|
||||
.rept 7
|
||||
.long __entry_atomic_op
|
||||
.endr
|
||||
|
||||
.org TBR_TT_BREAK >> 2
|
||||
.long __entry_debug_exception
|
||||
|
||||
@@ -654,6 +654,26 @@ __entry_debug_exception:
|
||||
movgs gr4,psr
|
||||
jmpl @(gr5,gr0) ; call ill_insn(esfr1,epcr0,esr0)
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# handle atomic operation emulation for userspace
|
||||
#
|
||||
###############################################################################
|
||||
.globl __entry_atomic_op
|
||||
__entry_atomic_op:
|
||||
LEDS 0x6012
|
||||
sethi.p %hi(atomic_operation),gr5
|
||||
setlo %lo(atomic_operation),gr5
|
||||
movsg esfr1,gr8
|
||||
movsg epcr0,gr9
|
||||
movsg esr0,gr10
|
||||
|
||||
# now that we've accessed the exception regs, we can enable exceptions
|
||||
movsg psr,gr4
|
||||
ori gr4,#PSR_ET,gr4
|
||||
movgs gr4,psr
|
||||
jmpl @(gr5,gr0) ; call atomic_operation(esfr1,epcr0,esr0)
|
||||
|
||||
###############################################################################
|
||||
#
|
||||
# handle media exception
|
||||
|
||||
@@ -46,5 +46,5 @@
|
||||
#ifdef CONFIG_MMU
|
||||
__sdram_base = 0x00000000 /* base address to which SDRAM relocated */
|
||||
#else
|
||||
__sdram_base = 0xc0000000 /* base address to which SDRAM relocated */
|
||||
__sdram_base = __page_offset /* base address to which SDRAM relocated */
|
||||
#endif
|
||||
|
||||
@@ -102,13 +102,6 @@ __switch_to:
|
||||
movgs gr14,lr
|
||||
bar
|
||||
|
||||
srli gr15,#28,gr5
|
||||
subicc gr5,#0xc,gr0,icc0
|
||||
beq icc0,#0,111f
|
||||
break
|
||||
nop
|
||||
111:
|
||||
|
||||
# jump to __switch_back or ret_from_fork as appropriate
|
||||
# - move prev to GR8
|
||||
movgs gr4,psr
|
||||
|
||||
@@ -100,6 +100,233 @@ asmlinkage void illegal_instruction(unsigned long esfr1, unsigned long epcr0, un
|
||||
force_sig_info(info.si_signo, &info, current);
|
||||
} /* end illegal_instruction() */
|
||||
|
||||
/*****************************************************************************/
|
||||
/*
|
||||
* handle atomic operations with errors
|
||||
* - arguments in gr8, gr9, gr10
|
||||
* - original memory value placed in gr5
|
||||
* - replacement memory value placed in gr9
|
||||
*/
|
||||
asmlinkage void atomic_operation(unsigned long esfr1, unsigned long epcr0,
|
||||
unsigned long esr0)
|
||||
{
|
||||
static DEFINE_SPINLOCK(atomic_op_lock);
|
||||
unsigned long x, y, z, *p;
|
||||
mm_segment_t oldfs;
|
||||
siginfo_t info;
|
||||
int ret;
|
||||
|
||||
y = 0;
|
||||
z = 0;
|
||||
|
||||
oldfs = get_fs();
|
||||
if (!user_mode(__frame))
|
||||
set_fs(KERNEL_DS);
|
||||
|
||||
switch (__frame->tbr & TBR_TT) {
|
||||
/* TIRA gr0,#120
|
||||
* u32 __atomic_user_cmpxchg32(u32 *ptr, u32 test, u32 new)
|
||||
*/
|
||||
case TBR_TT_ATOMIC_CMPXCHG32:
|
||||
p = (unsigned long *) __frame->gr8;
|
||||
x = __frame->gr9;
|
||||
y = __frame->gr10;
|
||||
|
||||
for (;;) {
|
||||
ret = get_user(z, p);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
|
||||
if (z != x)
|
||||
goto done;
|
||||
|
||||
spin_lock_irq(&atomic_op_lock);
|
||||
|
||||
if (__get_user(z, p) == 0) {
|
||||
if (z != x)
|
||||
goto done2;
|
||||
|
||||
if (__put_user(y, p) == 0)
|
||||
goto done2;
|
||||
goto error2;
|
||||
}
|
||||
|
||||
spin_unlock_irq(&atomic_op_lock);
|
||||
}
|
||||
|
||||
/* TIRA gr0,#121
|
||||
* u32 __atomic_kernel_xchg32(void *v, u32 new)
|
||||
*/
|
||||
case TBR_TT_ATOMIC_XCHG32:
|
||||
p = (unsigned long *) __frame->gr8;
|
||||
y = __frame->gr9;
|
||||
|
||||
for (;;) {
|
||||
ret = get_user(z, p);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
|
||||
spin_lock_irq(&atomic_op_lock);
|
||||
|
||||
if (__get_user(z, p) == 0) {
|
||||
if (__put_user(y, p) == 0)
|
||||
goto done2;
|
||||
goto error2;
|
||||
}
|
||||
|
||||
spin_unlock_irq(&atomic_op_lock);
|
||||
}
|
||||
|
||||
/* TIRA gr0,#122
|
||||
* ulong __atomic_kernel_XOR_return(ulong i, ulong *v)
|
||||
*/
|
||||
case TBR_TT_ATOMIC_XOR:
|
||||
p = (unsigned long *) __frame->gr8;
|
||||
x = __frame->gr9;
|
||||
|
||||
for (;;) {
|
||||
ret = get_user(z, p);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
|
||||
spin_lock_irq(&atomic_op_lock);
|
||||
|
||||
if (__get_user(z, p) == 0) {
|
||||
y = x ^ z;
|
||||
if (__put_user(y, p) == 0)
|
||||
goto done2;
|
||||
goto error2;
|
||||
}
|
||||
|
||||
spin_unlock_irq(&atomic_op_lock);
|
||||
}
|
||||
|
||||
/* TIRA gr0,#123
|
||||
* ulong __atomic_kernel_OR_return(ulong i, ulong *v)
|
||||
*/
|
||||
case TBR_TT_ATOMIC_OR:
|
||||
p = (unsigned long *) __frame->gr8;
|
||||
x = __frame->gr9;
|
||||
|
||||
for (;;) {
|
||||
ret = get_user(z, p);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
|
||||
spin_lock_irq(&atomic_op_lock);
|
||||
|
||||
if (__get_user(z, p) == 0) {
|
||||
y = x ^ z;
|
||||
if (__put_user(y, p) == 0)
|
||||
goto done2;
|
||||
goto error2;
|
||||
}
|
||||
|
||||
spin_unlock_irq(&atomic_op_lock);
|
||||
}
|
||||
|
||||
/* TIRA gr0,#124
|
||||
* ulong __atomic_kernel_AND_return(ulong i, ulong *v)
|
||||
*/
|
||||
case TBR_TT_ATOMIC_AND:
|
||||
p = (unsigned long *) __frame->gr8;
|
||||
x = __frame->gr9;
|
||||
|
||||
for (;;) {
|
||||
ret = get_user(z, p);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
|
||||
spin_lock_irq(&atomic_op_lock);
|
||||
|
||||
if (__get_user(z, p) == 0) {
|
||||
y = x & z;
|
||||
if (__put_user(y, p) == 0)
|
||||
goto done2;
|
||||
goto error2;
|
||||
}
|
||||
|
||||
spin_unlock_irq(&atomic_op_lock);
|
||||
}
|
||||
|
||||
/* TIRA gr0,#125
|
||||
* int __atomic_user_sub_return(atomic_t *v, int i)
|
||||
*/
|
||||
case TBR_TT_ATOMIC_SUB:
|
||||
p = (unsigned long *) __frame->gr8;
|
||||
x = __frame->gr9;
|
||||
|
||||
for (;;) {
|
||||
ret = get_user(z, p);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
|
||||
spin_lock_irq(&atomic_op_lock);
|
||||
|
||||
if (__get_user(z, p) == 0) {
|
||||
y = z - x;
|
||||
if (__put_user(y, p) == 0)
|
||||
goto done2;
|
||||
goto error2;
|
||||
}
|
||||
|
||||
spin_unlock_irq(&atomic_op_lock);
|
||||
}
|
||||
|
||||
/* TIRA gr0,#126
|
||||
* int __atomic_user_add_return(atomic_t *v, int i)
|
||||
*/
|
||||
case TBR_TT_ATOMIC_ADD:
|
||||
p = (unsigned long *) __frame->gr8;
|
||||
x = __frame->gr9;
|
||||
|
||||
for (;;) {
|
||||
ret = get_user(z, p);
|
||||
if (ret < 0)
|
||||
goto error;
|
||||
|
||||
spin_lock_irq(&atomic_op_lock);
|
||||
|
||||
if (__get_user(z, p) == 0) {
|
||||
y = z + x;
|
||||
if (__put_user(y, p) == 0)
|
||||
goto done2;
|
||||
goto error2;
|
||||
}
|
||||
|
||||
spin_unlock_irq(&atomic_op_lock);
|
||||
}
|
||||
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
|
||||
done2:
|
||||
spin_unlock_irq(&atomic_op_lock);
|
||||
done:
|
||||
if (!user_mode(__frame))
|
||||
set_fs(oldfs);
|
||||
__frame->gr5 = z;
|
||||
__frame->gr9 = y;
|
||||
return;
|
||||
|
||||
error2:
|
||||
spin_unlock_irq(&atomic_op_lock);
|
||||
error:
|
||||
if (!user_mode(__frame))
|
||||
set_fs(oldfs);
|
||||
__frame->pc -= 4;
|
||||
|
||||
die_if_kernel("-- Atomic Op Error --\n");
|
||||
|
||||
info.si_signo = SIGSEGV;
|
||||
info.si_code = SEGV_ACCERR;
|
||||
info.si_errno = 0;
|
||||
info.si_addr = (void *) __frame->pc;
|
||||
|
||||
force_sig_info(info.si_signo, &info, current);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
/*
|
||||
*
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
# Copyright (C) 1994 by Hamish Macdonald
|
||||
#
|
||||
|
||||
KBUILD_DEFCONFIG := amiga_defconfig
|
||||
|
||||
# override top level makefile
|
||||
AS += -m68020
|
||||
LDFLAGS := -m m68kelf
|
||||
|
||||
+576
-435
File diff suppressed because it is too large
Load Diff
+530
-361
File diff suppressed because it is too large
Load Diff
+565
-408
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+540
-363
File diff suppressed because it is too large
Load Diff
+566
-434
File diff suppressed because it is too large
Load Diff
+496
-382
File diff suppressed because it is too large
Load Diff
+498
-381
File diff suppressed because it is too large
Load Diff
+576
-425
File diff suppressed because it is too large
Load Diff
+514
-370
File diff suppressed because it is too large
Load Diff
+515
-371
File diff suppressed because it is too large
Load Diff
@@ -1,657 +0,0 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.12-rc6-m68k
|
||||
# Tue Jun 7 20:34:17 2005
|
||||
#
|
||||
CONFIG_M68K=y
|
||||
CONFIG_MMU=y
|
||||
CONFIG_UID16=y
|
||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
|
||||
#
|
||||
# Code maturity level options
|
||||
#
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_CLEAN_COMPILE=y
|
||||
CONFIG_BROKEN_ON_SMP=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
|
||||
#
|
||||
# General setup
|
||||
#
|
||||
CONFIG_LOCALVERSION=""
|
||||
CONFIG_SWAP=y
|
||||
CONFIG_SYSVIPC=y
|
||||
# CONFIG_POSIX_MQUEUE is not set
|
||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||
CONFIG_SYSCTL=y
|
||||
# CONFIG_AUDIT is not set
|
||||
# CONFIG_HOTPLUG is not set
|
||||
CONFIG_KOBJECT_UEVENT=y
|
||||
# CONFIG_IKCONFIG is not set
|
||||
# CONFIG_EMBEDDED is not set
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_BUG=y
|
||||
CONFIG_BASE_FULL=y
|
||||
CONFIG_FUTEX=y
|
||||
CONFIG_EPOLL=y
|
||||
CONFIG_SHMEM=y
|
||||
CONFIG_CC_ALIGN_FUNCTIONS=0
|
||||
CONFIG_CC_ALIGN_LABELS=0
|
||||
CONFIG_CC_ALIGN_LOOPS=0
|
||||
CONFIG_CC_ALIGN_JUMPS=0
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
CONFIG_BASE_SMALL=0
|
||||
|
||||
#
|
||||
# Loadable module support
|
||||
#
|
||||
# CONFIG_MODULES is not set
|
||||
|
||||
#
|
||||
# Platform dependent setup
|
||||
#
|
||||
# CONFIG_SUN3 is not set
|
||||
CONFIG_AMIGA=y
|
||||
# CONFIG_ATARI is not set
|
||||
# CONFIG_MAC is not set
|
||||
# CONFIG_APOLLO is not set
|
||||
# CONFIG_VME is not set
|
||||
# CONFIG_HP300 is not set
|
||||
# CONFIG_SUN3X is not set
|
||||
# CONFIG_Q40 is not set
|
||||
|
||||
#
|
||||
# Processor type
|
||||
#
|
||||
CONFIG_M68020=y
|
||||
CONFIG_M68030=y
|
||||
CONFIG_M68040=y
|
||||
# CONFIG_M68060 is not set
|
||||
CONFIG_MMU_MOTOROLA=y
|
||||
# CONFIG_M68KFPU_EMU is not set
|
||||
# CONFIG_ADVANCED is not set
|
||||
|
||||
#
|
||||
# General setup
|
||||
#
|
||||
CONFIG_BINFMT_ELF=y
|
||||
CONFIG_BINFMT_AOUT=y
|
||||
# CONFIG_BINFMT_MISC is not set
|
||||
CONFIG_ZORRO=y
|
||||
# CONFIG_AMIGA_PCMCIA is not set
|
||||
# CONFIG_HEARTBEAT is not set
|
||||
CONFIG_PROC_HARDWARE=y
|
||||
# CONFIG_ZORRO_NAMES is not set
|
||||
|
||||
#
|
||||
# Device Drivers
|
||||
#
|
||||
|
||||
#
|
||||
# Generic Driver Options
|
||||
#
|
||||
CONFIG_STANDALONE=y
|
||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
# CONFIG_FW_LOADER is not set
|
||||
|
||||
#
|
||||
# Memory Technology Devices (MTD)
|
||||
#
|
||||
# CONFIG_MTD is not set
|
||||
|
||||
#
|
||||
# Parallel port support
|
||||
#
|
||||
# CONFIG_PARPORT is not set
|
||||
|
||||
#
|
||||
# Plug and Play support
|
||||
#
|
||||
|
||||
#
|
||||
# Block devices
|
||||
#
|
||||
CONFIG_AMIGA_FLOPPY=y
|
||||
# CONFIG_AMIGA_Z2RAM is not set
|
||||
# CONFIG_BLK_DEV_COW_COMMON is not set
|
||||
# CONFIG_BLK_DEV_LOOP is not set
|
||||
# CONFIG_BLK_DEV_NBD is not set
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
CONFIG_BLK_DEV_RAM_SIZE=4096
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_CDROM_PKTCDVD=y
|
||||
CONFIG_CDROM_PKTCDVD_BUFFERS=8
|
||||
# CONFIG_CDROM_PKTCDVD_WCACHE is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
CONFIG_IOSCHED_DEADLINE=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
|
||||
#
|
||||
# ATA/ATAPI/MFM/RLL support
|
||||
#
|
||||
# CONFIG_IDE is not set
|
||||
|
||||
#
|
||||
# SCSI device support
|
||||
#
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_SCSI_PROC_FS=y
|
||||
|
||||
#
|
||||
# SCSI support type (disk, tape, CD-ROM)
|
||||
#
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_ST=y
|
||||
# CONFIG_CHR_DEV_OSST is not set
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
# CONFIG_BLK_DEV_SR_VENDOR is not set
|
||||
# CONFIG_CHR_DEV_SG is not set
|
||||
|
||||
#
|
||||
# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
|
||||
#
|
||||
# CONFIG_SCSI_MULTI_LUN is not set
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
# CONFIG_SCSI_LOGGING is not set
|
||||
|
||||
#
|
||||
# SCSI Transport Attributes
|
||||
#
|
||||
# CONFIG_SCSI_SPI_ATTRS is not set
|
||||
# CONFIG_SCSI_FC_ATTRS is not set
|
||||
# CONFIG_SCSI_ISCSI_ATTRS is not set
|
||||
|
||||
#
|
||||
# SCSI low-level drivers
|
||||
#
|
||||
# CONFIG_SCSI_SATA is not set
|
||||
# CONFIG_SCSI_DEBUG is not set
|
||||
CONFIG_A3000_SCSI=y
|
||||
CONFIG_A2091_SCSI=y
|
||||
CONFIG_GVP11_SCSI=y
|
||||
# CONFIG_CYBERSTORM_SCSI is not set
|
||||
# CONFIG_CYBERSTORMII_SCSI is not set
|
||||
# CONFIG_BLZ2060_SCSI is not set
|
||||
# CONFIG_BLZ1230_SCSI is not set
|
||||
# CONFIG_FASTLANE_SCSI is not set
|
||||
# CONFIG_OKTAGON_SCSI is not set
|
||||
|
||||
#
|
||||
# Multi-device support (RAID and LVM)
|
||||
#
|
||||
# CONFIG_MD is not set
|
||||
|
||||
#
|
||||
# Fusion MPT device support
|
||||
#
|
||||
|
||||
#
|
||||
# IEEE 1394 (FireWire) support
|
||||
#
|
||||
|
||||
#
|
||||
# I2O device support
|
||||
#
|
||||
|
||||
#
|
||||
# Networking support
|
||||
#
|
||||
CONFIG_NET=y
|
||||
|
||||
#
|
||||
# Networking options
|
||||
#
|
||||
CONFIG_PACKET=y
|
||||
# CONFIG_PACKET_MMAP is not set
|
||||
CONFIG_UNIX=y
|
||||
# CONFIG_NET_KEY is not set
|
||||
CONFIG_INET=y
|
||||
# CONFIG_IP_MULTICAST is not set
|
||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
||||
# CONFIG_IP_PNP is not set
|
||||
# CONFIG_NET_IPIP is not set
|
||||
# CONFIG_NET_IPGRE is not set
|
||||
# CONFIG_ARPD is not set
|
||||
# CONFIG_SYN_COOKIES is not set
|
||||
# CONFIG_INET_AH is not set
|
||||
# CONFIG_INET_ESP is not set
|
||||
# CONFIG_INET_IPCOMP is not set
|
||||
# CONFIG_INET_TUNNEL is not set
|
||||
CONFIG_IP_TCPDIAG=y
|
||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
#
|
||||
# SCTP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_SCTP is not set
|
||||
# CONFIG_ATM is not set
|
||||
# CONFIG_BRIDGE is not set
|
||||
# CONFIG_VLAN_8021Q is not set
|
||||
# CONFIG_DECNET is not set
|
||||
# CONFIG_LLC2 is not set
|
||||
# CONFIG_IPX is not set
|
||||
# CONFIG_ATALK is not set
|
||||
# CONFIG_X25 is not set
|
||||
# CONFIG_LAPB is not set
|
||||
# CONFIG_NET_DIVERT is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
|
||||
#
|
||||
# QoS and/or fair queueing
|
||||
#
|
||||
# CONFIG_NET_SCHED is not set
|
||||
# CONFIG_NET_CLS_ROUTE is not set
|
||||
|
||||
#
|
||||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
CONFIG_NETDEVICES=y
|
||||
# CONFIG_DUMMY is not set
|
||||
# CONFIG_BONDING is not set
|
||||
# CONFIG_EQUALIZER is not set
|
||||
# CONFIG_TUN is not set
|
||||
|
||||
#
|
||||
# Ethernet (10 or 100Mbit)
|
||||
#
|
||||
# CONFIG_NET_ETHERNET is not set
|
||||
|
||||
#
|
||||
# Ethernet (1000 Mbit)
|
||||
#
|
||||
|
||||
#
|
||||
# Ethernet (10000 Mbit)
|
||||
#
|
||||
|
||||
#
|
||||
# Token Ring devices
|
||||
#
|
||||
|
||||
#
|
||||
# Wireless LAN (non-hamradio)
|
||||
#
|
||||
# CONFIG_NET_RADIO is not set
|
||||
|
||||
#
|
||||
# Wan interfaces
|
||||
#
|
||||
# CONFIG_WAN is not set
|
||||
# CONFIG_PPP is not set
|
||||
# CONFIG_SLIP is not set
|
||||
# CONFIG_SHAPER is not set
|
||||
# CONFIG_NETCONSOLE is not set
|
||||
|
||||
#
|
||||
# ISDN subsystem
|
||||
#
|
||||
# CONFIG_ISDN is not set
|
||||
|
||||
#
|
||||
# Telephony Support
|
||||
#
|
||||
# CONFIG_PHONE is not set
|
||||
|
||||
#
|
||||
# Input device support
|
||||
#
|
||||
CONFIG_INPUT=y
|
||||
|
||||
#
|
||||
# Userland interfaces
|
||||
#
|
||||
CONFIG_INPUT_MOUSEDEV=y
|
||||
CONFIG_INPUT_MOUSEDEV_PSAUX=y
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
||||
# CONFIG_INPUT_JOYDEV is not set
|
||||
# CONFIG_INPUT_TSDEV is not set
|
||||
# CONFIG_INPUT_EVDEV is not set
|
||||
# CONFIG_INPUT_EVBUG is not set
|
||||
|
||||
#
|
||||
# Input Device Drivers
|
||||
#
|
||||
CONFIG_INPUT_KEYBOARD=y
|
||||
CONFIG_KEYBOARD_ATKBD=y
|
||||
# CONFIG_KEYBOARD_SUNKBD is not set
|
||||
# CONFIG_KEYBOARD_LKKBD is not set
|
||||
# CONFIG_KEYBOARD_XTKBD is not set
|
||||
# CONFIG_KEYBOARD_NEWTON is not set
|
||||
# CONFIG_KEYBOARD_AMIGA is not set
|
||||
CONFIG_INPUT_MOUSE=y
|
||||
CONFIG_MOUSE_PS2=y
|
||||
# CONFIG_MOUSE_SERIAL is not set
|
||||
# CONFIG_MOUSE_AMIGA is not set
|
||||
# CONFIG_MOUSE_VSXXXAA is not set
|
||||
# CONFIG_INPUT_JOYSTICK is not set
|
||||
# CONFIG_INPUT_TOUCHSCREEN is not set
|
||||
# CONFIG_INPUT_MISC is not set
|
||||
|
||||
#
|
||||
# Hardware I/O ports
|
||||
#
|
||||
CONFIG_SERIO=y
|
||||
CONFIG_SERIO_SERPORT=y
|
||||
CONFIG_SERIO_LIBPS2=y
|
||||
# CONFIG_SERIO_RAW is not set
|
||||
# CONFIG_GAMEPORT is not set
|
||||
|
||||
#
|
||||
# Character devices
|
||||
#
|
||||
CONFIG_VT=y
|
||||
CONFIG_VT_CONSOLE=y
|
||||
CONFIG_HW_CONSOLE=y
|
||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||
# CONFIG_A2232 is not set
|
||||
|
||||
#
|
||||
# Serial drivers
|
||||
#
|
||||
# CONFIG_SERIAL_8250 is not set
|
||||
|
||||
#
|
||||
# Non-8250 serial port support
|
||||
#
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
CONFIG_LEGACY_PTYS=y
|
||||
CONFIG_LEGACY_PTY_COUNT=256
|
||||
|
||||
#
|
||||
# IPMI
|
||||
#
|
||||
# CONFIG_IPMI_HANDLER is not set
|
||||
|
||||
#
|
||||
# Watchdog Cards
|
||||
#
|
||||
# CONFIG_WATCHDOG is not set
|
||||
# CONFIG_GEN_RTC is not set
|
||||
# CONFIG_DTLK is not set
|
||||
# CONFIG_R3964 is not set
|
||||
|
||||
#
|
||||
# Ftape, the floppy tape device driver
|
||||
#
|
||||
# CONFIG_DRM is not set
|
||||
# CONFIG_RAW_DRIVER is not set
|
||||
|
||||
#
|
||||
# TPM devices
|
||||
#
|
||||
|
||||
#
|
||||
# I2C support
|
||||
#
|
||||
# CONFIG_I2C is not set
|
||||
|
||||
#
|
||||
# Dallas's 1-wire bus
|
||||
#
|
||||
# CONFIG_W1 is not set
|
||||
|
||||
#
|
||||
# Misc devices
|
||||
#
|
||||
|
||||
#
|
||||
# Multimedia devices
|
||||
#
|
||||
# CONFIG_VIDEO_DEV is not set
|
||||
|
||||
#
|
||||
# Digital Video Broadcasting Devices
|
||||
#
|
||||
# CONFIG_DVB is not set
|
||||
|
||||
#
|
||||
# Graphics support
|
||||
#
|
||||
CONFIG_FB=y
|
||||
# CONFIG_FB_CFB_FILLRECT is not set
|
||||
# CONFIG_FB_CFB_COPYAREA is not set
|
||||
# CONFIG_FB_CFB_IMAGEBLIT is not set
|
||||
CONFIG_FB_SOFT_CURSOR=y
|
||||
# CONFIG_FB_MACMODES is not set
|
||||
CONFIG_FB_MODE_HELPERS=y
|
||||
# CONFIG_FB_TILEBLITTING is not set
|
||||
# CONFIG_FB_CIRRUS is not set
|
||||
CONFIG_FB_AMIGA=y
|
||||
CONFIG_FB_AMIGA_OCS=y
|
||||
CONFIG_FB_AMIGA_ECS=y
|
||||
CONFIG_FB_AMIGA_AGA=y
|
||||
# CONFIG_FB_FM2 is not set
|
||||
# CONFIG_FB_S1D13XXX is not set
|
||||
# CONFIG_FB_VIRTUAL is not set
|
||||
|
||||
#
|
||||
# Console display driver support
|
||||
#
|
||||
CONFIG_DUMMY_CONSOLE=y
|
||||
# CONFIG_FRAMEBUFFER_CONSOLE is not set
|
||||
|
||||
#
|
||||
# Logo configuration
|
||||
#
|
||||
# CONFIG_LOGO is not set
|
||||
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
||||
|
||||
#
|
||||
# Sound
|
||||
#
|
||||
# CONFIG_SOUND is not set
|
||||
|
||||
#
|
||||
# USB support
|
||||
#
|
||||
# CONFIG_USB_ARCH_HAS_HCD is not set
|
||||
# CONFIG_USB_ARCH_HAS_OHCI is not set
|
||||
|
||||
#
|
||||
# USB Gadget Support
|
||||
#
|
||||
# CONFIG_USB_GADGET is not set
|
||||
|
||||
#
|
||||
# MMC/SD Card support
|
||||
#
|
||||
# CONFIG_MMC is not set
|
||||
|
||||
#
|
||||
# InfiniBand support
|
||||
#
|
||||
# CONFIG_INFINIBAND is not set
|
||||
|
||||
#
|
||||
# Character devices
|
||||
#
|
||||
CONFIG_AMIGA_BUILTIN_SERIAL=y
|
||||
# CONFIG_MULTIFACE_III_TTY is not set
|
||||
# CONFIG_GVPIOEXT is not set
|
||||
# CONFIG_SERIAL_CONSOLE is not set
|
||||
|
||||
#
|
||||
# File systems
|
||||
#
|
||||
CONFIG_EXT2_FS=y
|
||||
# CONFIG_EXT2_FS_XATTR is not set
|
||||
# CONFIG_EXT3_FS is not set
|
||||
# CONFIG_JBD is not set
|
||||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
|
||||
#
|
||||
# XFS support
|
||||
#
|
||||
# CONFIG_XFS_FS is not set
|
||||
CONFIG_MINIX_FS=y
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
# CONFIG_QUOTA is not set
|
||||
CONFIG_DNOTIFY=y
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
# CONFIG_AUTOFS4_FS is not set
|
||||
|
||||
#
|
||||
# CD-ROM/DVD Filesystems
|
||||
#
|
||||
# CONFIG_ISO9660_FS is not set
|
||||
# CONFIG_UDF_FS is not set
|
||||
|
||||
#
|
||||
# DOS/FAT/NT Filesystems
|
||||
#
|
||||
CONFIG_FAT_FS=y
|
||||
CONFIG_MSDOS_FS=y
|
||||
# CONFIG_VFAT_FS is not set
|
||||
CONFIG_FAT_DEFAULT_CODEPAGE=437
|
||||
# CONFIG_NTFS_FS is not set
|
||||
|
||||
#
|
||||
# Pseudo filesystems
|
||||
#
|
||||
CONFIG_PROC_FS=y
|
||||
CONFIG_PROC_KCORE=y
|
||||
CONFIG_SYSFS=y
|
||||
# CONFIG_DEVFS_FS is not set
|
||||
# CONFIG_DEVPTS_FS_XATTR is not set
|
||||
# CONFIG_TMPFS is not set
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
|
||||
#
|
||||
# Miscellaneous filesystems
|
||||
#
|
||||
# CONFIG_ADFS_FS is not set
|
||||
# CONFIG_AFFS_FS is not set
|
||||
# CONFIG_HFS_FS is not set
|
||||
# CONFIG_HFSPLUS_FS is not set
|
||||
# CONFIG_BEFS_FS is not set
|
||||
# CONFIG_BFS_FS is not set
|
||||
# CONFIG_EFS_FS is not set
|
||||
# CONFIG_CRAMFS is not set
|
||||
# CONFIG_VXFS_FS is not set
|
||||
# CONFIG_HPFS_FS is not set
|
||||
# CONFIG_QNX4FS_FS is not set
|
||||
# CONFIG_SYSV_FS is not set
|
||||
# CONFIG_UFS_FS is not set
|
||||
|
||||
#
|
||||
# Network File Systems
|
||||
#
|
||||
CONFIG_NFS_FS=y
|
||||
# CONFIG_NFS_V3 is not set
|
||||
# CONFIG_NFS_V4 is not set
|
||||
# CONFIG_NFS_DIRECTIO is not set
|
||||
# CONFIG_NFSD is not set
|
||||
CONFIG_LOCKD=y
|
||||
CONFIG_SUNRPC=y
|
||||
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||
# CONFIG_SMB_FS is not set
|
||||
# CONFIG_CIFS is not set
|
||||
# CONFIG_NCP_FS is not set
|
||||
# CONFIG_CODA_FS is not set
|
||||
# CONFIG_AFS_FS is not set
|
||||
|
||||
#
|
||||
# Partition Types
|
||||
#
|
||||
# CONFIG_PARTITION_ADVANCED is not set
|
||||
CONFIG_AMIGA_PARTITION=y
|
||||
CONFIG_MSDOS_PARTITION=y
|
||||
|
||||
#
|
||||
# Native Language Support
|
||||
#
|
||||
CONFIG_NLS=y
|
||||
CONFIG_NLS_DEFAULT="iso8859-1"
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
# CONFIG_NLS_CODEPAGE_737 is not set
|
||||
# CONFIG_NLS_CODEPAGE_775 is not set
|
||||
# CONFIG_NLS_CODEPAGE_850 is not set
|
||||
# CONFIG_NLS_CODEPAGE_852 is not set
|
||||
# CONFIG_NLS_CODEPAGE_855 is not set
|
||||
# CONFIG_NLS_CODEPAGE_857 is not set
|
||||
# CONFIG_NLS_CODEPAGE_860 is not set
|
||||
# CONFIG_NLS_CODEPAGE_861 is not set
|
||||
# CONFIG_NLS_CODEPAGE_862 is not set
|
||||
# CONFIG_NLS_CODEPAGE_863 is not set
|
||||
# CONFIG_NLS_CODEPAGE_864 is not set
|
||||
# CONFIG_NLS_CODEPAGE_865 is not set
|
||||
# CONFIG_NLS_CODEPAGE_866 is not set
|
||||
# CONFIG_NLS_CODEPAGE_869 is not set
|
||||
# CONFIG_NLS_CODEPAGE_936 is not set
|
||||
# CONFIG_NLS_CODEPAGE_950 is not set
|
||||
# CONFIG_NLS_CODEPAGE_932 is not set
|
||||
# CONFIG_NLS_CODEPAGE_949 is not set
|
||||
# CONFIG_NLS_CODEPAGE_874 is not set
|
||||
# CONFIG_NLS_ISO8859_8 is not set
|
||||
# CONFIG_NLS_CODEPAGE_1250 is not set
|
||||
# CONFIG_NLS_CODEPAGE_1251 is not set
|
||||
# CONFIG_NLS_ASCII is not set
|
||||
# CONFIG_NLS_ISO8859_1 is not set
|
||||
# CONFIG_NLS_ISO8859_2 is not set
|
||||
# CONFIG_NLS_ISO8859_3 is not set
|
||||
# CONFIG_NLS_ISO8859_4 is not set
|
||||
# CONFIG_NLS_ISO8859_5 is not set
|
||||
# CONFIG_NLS_ISO8859_6 is not set
|
||||
# CONFIG_NLS_ISO8859_7 is not set
|
||||
# CONFIG_NLS_ISO8859_9 is not set
|
||||
# CONFIG_NLS_ISO8859_13 is not set
|
||||
# CONFIG_NLS_ISO8859_14 is not set
|
||||
# CONFIG_NLS_ISO8859_15 is not set
|
||||
# CONFIG_NLS_KOI8_R is not set
|
||||
# CONFIG_NLS_KOI8_U is not set
|
||||
# CONFIG_NLS_UTF8 is not set
|
||||
|
||||
#
|
||||
# Kernel hacking
|
||||
#
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
# CONFIG_DEBUG_KERNEL is not set
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
CONFIG_DEBUG_BUGVERBOSE=y
|
||||
|
||||
#
|
||||
# Security options
|
||||
#
|
||||
# CONFIG_KEYS is not set
|
||||
# CONFIG_SECURITY is not set
|
||||
|
||||
#
|
||||
# Cryptographic options
|
||||
#
|
||||
# CONFIG_CRYPTO is not set
|
||||
|
||||
#
|
||||
# Hardware crypto devices
|
||||
#
|
||||
|
||||
#
|
||||
# Library routines
|
||||
#
|
||||
# CONFIG_CRC_CCITT is not set
|
||||
CONFIG_CRC32=y
|
||||
# CONFIG_LIBCRC32C is not set
|
||||
+5
-2
@@ -482,10 +482,13 @@ endif
|
||||
# be 16kb aligned or the handling of the current variable will break.
|
||||
# Simplified: what IP22 does at 128MB+ in ksegN, IP28 does at 512MB+ in xkphys
|
||||
#
|
||||
#core-$(CONFIG_SGI_IP28) += arch/mips/sgi-ip22/ arch/mips/arc/arc_con.o
|
||||
ifdef CONFIG_SGI_IP28
|
||||
ifeq ($(call cc-option-yn,-mr10k-cache-barrier=1), n)
|
||||
$(error gcc doesn't support needed option -mr10k-cache-barrier=1)
|
||||
endif
|
||||
endif
|
||||
core-$(CONFIG_SGI_IP28) += arch/mips/sgi-ip22/
|
||||
cflags-$(CONFIG_SGI_IP28) += -mr10k-cache-barrier=1 -Iinclude/asm-mips/mach-ip28
|
||||
#cflags-$(CONFIG_SGI_IP28) += -Iinclude/asm-mips/mach-ip28
|
||||
load-$(CONFIG_SGI_IP28) += 0xa800000020004000
|
||||
|
||||
#
|
||||
|
||||
@@ -22,24 +22,24 @@ struct cpu_spec* cur_cpu_spec[NR_CPUS];
|
||||
/* With some thought, we can probably use the mask to reduce the
|
||||
* size of the table.
|
||||
*/
|
||||
struct cpu_spec cpu_specs[] = {
|
||||
{ 0xffffffff, 0x00030100, "Au1000 DA", 1, 0 },
|
||||
{ 0xffffffff, 0x00030201, "Au1000 HA", 1, 0 },
|
||||
{ 0xffffffff, 0x00030202, "Au1000 HB", 1, 0 },
|
||||
{ 0xffffffff, 0x00030203, "Au1000 HC", 1, 1 },
|
||||
{ 0xffffffff, 0x00030204, "Au1000 HD", 1, 1 },
|
||||
{ 0xffffffff, 0x01030200, "Au1500 AB", 1, 1 },
|
||||
{ 0xffffffff, 0x01030201, "Au1500 AC", 0, 1 },
|
||||
{ 0xffffffff, 0x01030202, "Au1500 AD", 0, 1 },
|
||||
{ 0xffffffff, 0x02030200, "Au1100 AB", 1, 1 },
|
||||
{ 0xffffffff, 0x02030201, "Au1100 BA", 1, 1 },
|
||||
{ 0xffffffff, 0x02030202, "Au1100 BC", 1, 1 },
|
||||
{ 0xffffffff, 0x02030203, "Au1100 BD", 0, 1 },
|
||||
{ 0xffffffff, 0x02030204, "Au1100 BE", 0, 1 },
|
||||
{ 0xffffffff, 0x03030200, "Au1550 AA", 0, 1 },
|
||||
{ 0xffffffff, 0x04030200, "Au1200 AB", 0, 0 },
|
||||
{ 0xffffffff, 0x04030201, "Au1200 AC", 1, 0 },
|
||||
{ 0x00000000, 0x00000000, "Unknown Au1xxx", 1, 0 },
|
||||
struct cpu_spec cpu_specs[] = {
|
||||
{ 0xffffffff, 0x00030100, "Au1000 DA", 1, 0, 1 },
|
||||
{ 0xffffffff, 0x00030201, "Au1000 HA", 1, 0, 1 },
|
||||
{ 0xffffffff, 0x00030202, "Au1000 HB", 1, 0, 1 },
|
||||
{ 0xffffffff, 0x00030203, "Au1000 HC", 1, 1, 0 },
|
||||
{ 0xffffffff, 0x00030204, "Au1000 HD", 1, 1, 0 },
|
||||
{ 0xffffffff, 0x01030200, "Au1500 AB", 1, 1, 0 },
|
||||
{ 0xffffffff, 0x01030201, "Au1500 AC", 0, 1, 0 },
|
||||
{ 0xffffffff, 0x01030202, "Au1500 AD", 0, 1, 0 },
|
||||
{ 0xffffffff, 0x02030200, "Au1100 AB", 1, 1, 0 },
|
||||
{ 0xffffffff, 0x02030201, "Au1100 BA", 1, 1, 0 },
|
||||
{ 0xffffffff, 0x02030202, "Au1100 BC", 1, 1, 0 },
|
||||
{ 0xffffffff, 0x02030203, "Au1100 BD", 0, 1, 0 },
|
||||
{ 0xffffffff, 0x02030204, "Au1100 BE", 0, 1, 0 },
|
||||
{ 0xffffffff, 0x03030200, "Au1550 AA", 0, 1, 0 },
|
||||
{ 0xffffffff, 0x04030200, "Au1200 AB", 0, 0, 0 },
|
||||
{ 0xffffffff, 0x04030201, "Au1200 AC", 1, 0, 0 },
|
||||
{ 0x00000000, 0x00000000, "Unknown Au1xxx", 1, 0, 0 }
|
||||
};
|
||||
|
||||
void
|
||||
|
||||
@@ -57,7 +57,7 @@ void __init plat_mem_setup(void)
|
||||
{
|
||||
struct cpu_spec *sp;
|
||||
char *argptr;
|
||||
unsigned long prid, cpupll, bclk = 1;
|
||||
unsigned long prid, cpufreq, bclk = 1;
|
||||
|
||||
set_cpuspec();
|
||||
sp = cur_cpu_spec[0];
|
||||
@@ -65,8 +65,15 @@ void __init plat_mem_setup(void)
|
||||
board_setup(); /* board specific setup */
|
||||
|
||||
prid = read_c0_prid();
|
||||
cpupll = (au_readl(0xB1900060) & 0x3F) * 12;
|
||||
printk("(PRId %08lx) @ %ldMHZ\n", prid, cpupll);
|
||||
if (sp->cpu_pll_wo)
|
||||
#ifdef CONFIG_SOC_AU1000_FREQUENCY
|
||||
cpufreq = CONFIG_SOC_AU1000_FREQUENCY / 1000000;
|
||||
#else
|
||||
cpufreq = 396;
|
||||
#endif
|
||||
else
|
||||
cpufreq = (au_readl(SYS_CPUPLL) & 0x3F) * 12;
|
||||
printk(KERN_INFO "(PRID %08lx) @ %ld MHz\n", prid, cpufreq);
|
||||
|
||||
bclk = sp->cpu_bclk;
|
||||
if (bclk)
|
||||
|
||||
@@ -209,18 +209,22 @@ unsigned long cal_r4koff(void)
|
||||
while (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_C1S);
|
||||
au_writel(0, SYS_TOYWRITE);
|
||||
while (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_C1S);
|
||||
|
||||
cpu_speed = (au_readl(SYS_CPUPLL) & 0x0000003f) *
|
||||
AU1000_SRC_CLK;
|
||||
}
|
||||
else {
|
||||
/* The 32KHz oscillator isn't running, so assume there
|
||||
* isn't one and grab the processor speed from the PLL.
|
||||
* NOTE: some old silicon doesn't allow reading the PLL.
|
||||
*/
|
||||
cpu_speed = (au_readl(SYS_CPUPLL) & 0x0000003f) * AU1000_SRC_CLK;
|
||||
} else
|
||||
no_au1xxx_32khz = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* On early Au1000, sys_cpupll was write-only. Since these
|
||||
* silicon versions of Au1000 are not sold by AMD, we don't bend
|
||||
* over backwards trying to determine the frequency.
|
||||
*/
|
||||
if (cur_cpu_spec[0]->cpu_pll_wo)
|
||||
#ifdef CONFIG_SOC_AU1000_FREQUENCY
|
||||
cpu_speed = CONFIG_SOC_AU1000_FREQUENCY;
|
||||
#else
|
||||
cpu_speed = 396000000;
|
||||
#endif
|
||||
else
|
||||
cpu_speed = (au_readl(SYS_CPUPLL) & 0x0000003f) * AU1000_SRC_CLK;
|
||||
mips_hpt_frequency = cpu_speed;
|
||||
// Equation: Baudrate = CPU / (SD * 2 * CLKDIV * 16)
|
||||
set_au1x00_uart_baud_base(cpu_speed / (2 * ((int)(au_readl(SYS_POWERCTRL)&0x03) + 2) * 16));
|
||||
|
||||
@@ -33,11 +33,10 @@
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/keyboard.h>
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/reboot.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/au1000.h>
|
||||
#include <asm/mach-au1x00/au1000.h>
|
||||
|
||||
void board_reset(void)
|
||||
{
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
#include <asm/io.h>
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/au1000.h>
|
||||
#include <asm/mach-au1x00/au1000.h>
|
||||
|
||||
struct au1xxx_irqmap __initdata au1xxx_irq_map[] = {
|
||||
{ AU1500_GPIO_204, INTC_INT_HIGH_LEVEL, 0},
|
||||
|
||||
+566
-355
File diff suppressed because it is too large
Load Diff
@@ -139,7 +139,6 @@
|
||||
#include <asm/system.h>
|
||||
#include <asm/gdb-stub.h>
|
||||
#include <asm/inst.h>
|
||||
#include <asm/smp.h>
|
||||
|
||||
/*
|
||||
* external low-level support routines
|
||||
@@ -656,6 +655,7 @@ void set_async_breakpoint(unsigned long *epc)
|
||||
*epc = (unsigned long)async_breakpoint;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
static void kgdb_wait(void *arg)
|
||||
{
|
||||
unsigned flags;
|
||||
@@ -668,6 +668,7 @@ static void kgdb_wait(void *arg)
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* GDB stub needs to call kgdb_wait on all processor with interrupts
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#include <asm/time.h>
|
||||
|
||||
DEFINE_SPINLOCK(i8253_lock);
|
||||
EXPORT_SYMBOL(i8253_lock);
|
||||
|
||||
/*
|
||||
* Initialize the PIT timer.
|
||||
|
||||
@@ -157,6 +157,6 @@ void __init time_init(void)
|
||||
{
|
||||
plat_time_init();
|
||||
|
||||
if (mips_clockevent_init() || !cpu_has_mfc0_count_bug())
|
||||
if (!mips_clockevent_init() || !cpu_has_mfc0_count_bug())
|
||||
init_mips_clocksource();
|
||||
}
|
||||
|
||||
+15
-6
@@ -262,13 +262,21 @@ void dump_mtregs(void)
|
||||
/* Find some VPE program space */
|
||||
static void *alloc_progmem(unsigned long len)
|
||||
{
|
||||
void *addr;
|
||||
|
||||
#ifdef CONFIG_MIPS_VPE_LOADER_TOM
|
||||
/* this means you must tell linux to use less memory than you physically have */
|
||||
return pfn_to_kaddr(max_pfn);
|
||||
/*
|
||||
* This means you must tell Linux to use less memory than you
|
||||
* physically have, for example by passing a mem= boot argument.
|
||||
*/
|
||||
addr = pfn_to_kaddr(max_pfn);
|
||||
memset(addr, 0, len);
|
||||
#else
|
||||
// simple grab some mem for now
|
||||
return kmalloc(len, GFP_KERNEL);
|
||||
/* simple grab some mem for now */
|
||||
addr = kzalloc(len, GFP_KERNEL);
|
||||
#endif
|
||||
|
||||
return addr;
|
||||
}
|
||||
|
||||
static void release_progmem(void *ptr)
|
||||
@@ -884,9 +892,10 @@ static int vpe_elfload(struct vpe * v)
|
||||
}
|
||||
|
||||
v->load_addr = alloc_progmem(mod.core_size);
|
||||
memset(v->load_addr, 0, mod.core_size);
|
||||
if (!v->load_addr)
|
||||
return -ENOMEM;
|
||||
|
||||
printk("VPE loader: loading to %p\n", v->load_addr);
|
||||
pr_info("VPE loader: loading to %p\n", v->load_addr);
|
||||
|
||||
if (relocate) {
|
||||
for (i = 0; i < hdr->e_shnum; i++) {
|
||||
|
||||
@@ -361,6 +361,16 @@ static inline int has_valid_asid(const struct mm_struct *mm)
|
||||
#endif
|
||||
}
|
||||
|
||||
static void r4k__flush_cache_vmap(void)
|
||||
{
|
||||
r4k_blast_dcache();
|
||||
}
|
||||
|
||||
static void r4k__flush_cache_vunmap(void)
|
||||
{
|
||||
r4k_blast_dcache();
|
||||
}
|
||||
|
||||
static inline void local_r4k_flush_cache_range(void * args)
|
||||
{
|
||||
struct vm_area_struct *vma = args;
|
||||
@@ -1281,6 +1291,10 @@ void __cpuinit r4k_cache_init(void)
|
||||
PAGE_SIZE - 1);
|
||||
else
|
||||
shm_align_mask = PAGE_SIZE-1;
|
||||
|
||||
__flush_cache_vmap = r4k__flush_cache_vmap;
|
||||
__flush_cache_vunmap = r4k__flush_cache_vunmap;
|
||||
|
||||
flush_cache_all = cache_noop;
|
||||
__flush_cache_all = r4k___flush_cache_all;
|
||||
flush_cache_mm = r4k_flush_cache_mm;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user