mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-27 03:10:12 +00:00
Merge branch 'linus' into tracing/ftrace
This commit is contained in:
commit
e1e302d8a9
371 changed files with 5981 additions and 2453 deletions
|
@ -24,7 +24,7 @@
|
||||||
<surname>Cox</surname>
|
<surname>Cox</surname>
|
||||||
<affiliation>
|
<affiliation>
|
||||||
<address>
|
<address>
|
||||||
<email>alan@redhat.com</email>
|
<email>alan@lxorguk.ukuu.org.uk</email>
|
||||||
</address>
|
</address>
|
||||||
</affiliation>
|
</affiliation>
|
||||||
</author>
|
</author>
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
<surname>Cox</surname>
|
<surname>Cox</surname>
|
||||||
<affiliation>
|
<affiliation>
|
||||||
<address>
|
<address>
|
||||||
<email>alan@redhat.com</email>
|
<email>alan@lxorguk.ukuu.org.uk</email>
|
||||||
</address>
|
</address>
|
||||||
</affiliation>
|
</affiliation>
|
||||||
</author>
|
</author>
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
<surname>Cox</surname>
|
<surname>Cox</surname>
|
||||||
<affiliation>
|
<affiliation>
|
||||||
<address>
|
<address>
|
||||||
<email>alan@redhat.com</email>
|
<email>alan@lxorguk.ukuu.org.uk</email>
|
||||||
</address>
|
</address>
|
||||||
</affiliation>
|
</affiliation>
|
||||||
</author>
|
</author>
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
<surname>Cox</surname>
|
<surname>Cox</surname>
|
||||||
<affiliation>
|
<affiliation>
|
||||||
<address>
|
<address>
|
||||||
<email>alan@redhat.com</email>
|
<email>alan@lxorguk.ukuu.org.uk</email>
|
||||||
</address>
|
</address>
|
||||||
</affiliation>
|
</affiliation>
|
||||||
</author>
|
</author>
|
||||||
|
|
|
@ -17,7 +17,7 @@ companies. If you sign purchase orders or you have any clue about the
|
||||||
budget of your group, you're almost certainly not a kernel manager.
|
budget of your group, you're almost certainly not a kernel manager.
|
||||||
These suggestions may or may not apply to you.
|
These suggestions may or may not apply to you.
|
||||||
|
|
||||||
First off, I'd suggest buying "Seven Habits of Highly Successful
|
First off, I'd suggest buying "Seven Habits of Highly Effective
|
||||||
People", and NOT read it. Burn it, it's a great symbolic gesture.
|
People", and NOT read it. Burn it, it's a great symbolic gesture.
|
||||||
|
|
||||||
(*) This document does so not so much by answering the question, but by
|
(*) This document does so not so much by answering the question, but by
|
||||||
|
|
1
Documentation/accounting/.gitignore
vendored
Normal file
1
Documentation/accounting/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
getdelays
|
1
Documentation/auxdisplay/.gitignore
vendored
Normal file
1
Documentation/auxdisplay/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
cfag12864b-example
|
1
Documentation/connector/.gitignore
vendored
Normal file
1
Documentation/connector/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
ucon
|
|
@ -161,8 +161,12 @@ prototypes:
|
||||||
int (*set_page_dirty)(struct page *page);
|
int (*set_page_dirty)(struct page *page);
|
||||||
int (*readpages)(struct file *filp, struct address_space *mapping,
|
int (*readpages)(struct file *filp, struct address_space *mapping,
|
||||||
struct list_head *pages, unsigned nr_pages);
|
struct list_head *pages, unsigned nr_pages);
|
||||||
int (*prepare_write)(struct file *, struct page *, unsigned, unsigned);
|
int (*write_begin)(struct file *, struct address_space *mapping,
|
||||||
int (*commit_write)(struct file *, struct page *, unsigned, unsigned);
|
loff_t pos, unsigned len, unsigned flags,
|
||||||
|
struct page **pagep, void **fsdata);
|
||||||
|
int (*write_end)(struct file *, struct address_space *mapping,
|
||||||
|
loff_t pos, unsigned len, unsigned copied,
|
||||||
|
struct page *page, void *fsdata);
|
||||||
sector_t (*bmap)(struct address_space *, sector_t);
|
sector_t (*bmap)(struct address_space *, sector_t);
|
||||||
int (*invalidatepage) (struct page *, unsigned long);
|
int (*invalidatepage) (struct page *, unsigned long);
|
||||||
int (*releasepage) (struct page *, int);
|
int (*releasepage) (struct page *, int);
|
||||||
|
@ -180,8 +184,6 @@ sync_page: no maybe
|
||||||
writepages: no
|
writepages: no
|
||||||
set_page_dirty no no
|
set_page_dirty no no
|
||||||
readpages: no
|
readpages: no
|
||||||
prepare_write: no yes yes
|
|
||||||
commit_write: no yes yes
|
|
||||||
write_begin: no locks the page yes
|
write_begin: no locks the page yes
|
||||||
write_end: no yes, unlocks yes
|
write_end: no yes, unlocks yes
|
||||||
perform_write: no n/a yes
|
perform_write: no n/a yes
|
||||||
|
@ -191,7 +193,7 @@ releasepage: no yes
|
||||||
direct_IO: no
|
direct_IO: no
|
||||||
launder_page: no yes
|
launder_page: no yes
|
||||||
|
|
||||||
->prepare_write(), ->commit_write(), ->sync_page() and ->readpage()
|
->write_begin(), ->write_end(), ->sync_page() and ->readpage()
|
||||||
may be called from the request handler (/dev/loop).
|
may be called from the request handler (/dev/loop).
|
||||||
|
|
||||||
->readpage() unlocks the page, either synchronously or via I/O
|
->readpage() unlocks the page, either synchronously or via I/O
|
||||||
|
|
|
@ -492,7 +492,7 @@ written-back to storage typically in whole pages, however the
|
||||||
address_space has finer control of write sizes.
|
address_space has finer control of write sizes.
|
||||||
|
|
||||||
The read process essentially only requires 'readpage'. The write
|
The read process essentially only requires 'readpage'. The write
|
||||||
process is more complicated and uses prepare_write/commit_write or
|
process is more complicated and uses write_begin/write_end or
|
||||||
set_page_dirty to write data into the address_space, and writepage,
|
set_page_dirty to write data into the address_space, and writepage,
|
||||||
sync_page, and writepages to writeback data to storage.
|
sync_page, and writepages to writeback data to storage.
|
||||||
|
|
||||||
|
@ -521,8 +521,6 @@ struct address_space_operations {
|
||||||
int (*set_page_dirty)(struct page *page);
|
int (*set_page_dirty)(struct page *page);
|
||||||
int (*readpages)(struct file *filp, struct address_space *mapping,
|
int (*readpages)(struct file *filp, struct address_space *mapping,
|
||||||
struct list_head *pages, unsigned nr_pages);
|
struct list_head *pages, unsigned nr_pages);
|
||||||
int (*prepare_write)(struct file *, struct page *, unsigned, unsigned);
|
|
||||||
int (*commit_write)(struct file *, struct page *, unsigned, unsigned);
|
|
||||||
int (*write_begin)(struct file *, struct address_space *mapping,
|
int (*write_begin)(struct file *, struct address_space *mapping,
|
||||||
loff_t pos, unsigned len, unsigned flags,
|
loff_t pos, unsigned len, unsigned flags,
|
||||||
struct page **pagep, void **fsdata);
|
struct page **pagep, void **fsdata);
|
||||||
|
@ -598,37 +596,7 @@ struct address_space_operations {
|
||||||
readpages is only used for read-ahead, so read errors are
|
readpages is only used for read-ahead, so read errors are
|
||||||
ignored. If anything goes wrong, feel free to give up.
|
ignored. If anything goes wrong, feel free to give up.
|
||||||
|
|
||||||
prepare_write: called by the generic write path in VM to set up a write
|
write_begin:
|
||||||
request for a page. This indicates to the address space that
|
|
||||||
the given range of bytes is about to be written. The
|
|
||||||
address_space should check that the write will be able to
|
|
||||||
complete, by allocating space if necessary and doing any other
|
|
||||||
internal housekeeping. If the write will update parts of
|
|
||||||
any basic-blocks on storage, then those blocks should be
|
|
||||||
pre-read (if they haven't been read already) so that the
|
|
||||||
updated blocks can be written out properly.
|
|
||||||
The page will be locked.
|
|
||||||
|
|
||||||
Note: the page _must not_ be marked uptodate in this function
|
|
||||||
(or anywhere else) unless it actually is uptodate right now. As
|
|
||||||
soon as a page is marked uptodate, it is possible for a concurrent
|
|
||||||
read(2) to copy it to userspace.
|
|
||||||
|
|
||||||
commit_write: If prepare_write succeeds, new data will be copied
|
|
||||||
into the page and then commit_write will be called. It will
|
|
||||||
typically update the size of the file (if appropriate) and
|
|
||||||
mark the inode as dirty, and do any other related housekeeping
|
|
||||||
operations. It should avoid returning an error if possible -
|
|
||||||
errors should have been handled by prepare_write.
|
|
||||||
|
|
||||||
write_begin: This is intended as a replacement for prepare_write. The
|
|
||||||
key differences being that:
|
|
||||||
- it returns a locked page (in *pagep) rather than being
|
|
||||||
given a pre locked page;
|
|
||||||
- it must be able to cope with short writes (where the
|
|
||||||
length passed to write_begin is greater than the number
|
|
||||||
of bytes copied into the page).
|
|
||||||
|
|
||||||
Called by the generic buffered write code to ask the filesystem to
|
Called by the generic buffered write code to ask the filesystem to
|
||||||
prepare to write len bytes at the given offset in the file. The
|
prepare to write len bytes at the given offset in the file. The
|
||||||
address_space should check that the write will be able to complete,
|
address_space should check that the write will be able to complete,
|
||||||
|
@ -640,6 +608,9 @@ struct address_space_operations {
|
||||||
The filesystem must return the locked pagecache page for the specified
|
The filesystem must return the locked pagecache page for the specified
|
||||||
offset, in *pagep, for the caller to write into.
|
offset, in *pagep, for the caller to write into.
|
||||||
|
|
||||||
|
It must be able to cope with short writes (where the length passed to
|
||||||
|
write_begin is greater than the number of bytes copied into the page).
|
||||||
|
|
||||||
flags is a field for AOP_FLAG_xxx flags, described in
|
flags is a field for AOP_FLAG_xxx flags, described in
|
||||||
include/linux/fs.h.
|
include/linux/fs.h.
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,7 @@ I suspect that this driver could be made to work for the following SiS
|
||||||
chipsets as well: 635, and 635T. If anyone owns a board with those chips
|
chipsets as well: 635, and 635T. If anyone owns a board with those chips
|
||||||
AND is willing to risk crashing & burning an otherwise well-behaved kernel
|
AND is willing to risk crashing & burning an otherwise well-behaved kernel
|
||||||
in the name of progress... please contact me at <mhoffman@lightlink.com> or
|
in the name of progress... please contact me at <mhoffman@lightlink.com> or
|
||||||
via the project's mailing list: <i2c@lm-sensors.org>. Please send bug
|
via the linux-i2c mailing list: <linux-i2c@vger.kernel.org>. Please send bug
|
||||||
reports and/or success stories as well.
|
reports and/or success stories as well.
|
||||||
|
|
||||||
|
|
||||||
|
|
1
Documentation/ia64/.gitignore
vendored
Normal file
1
Documentation/ia64/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
aliasing-test
|
|
@ -5,7 +5,7 @@ I want to thank all who contributed to this project and especially to:
|
||||||
Thomas Bogendörfer (tsbogend@bigbug.franken.de)
|
Thomas Bogendörfer (tsbogend@bigbug.franken.de)
|
||||||
Tester, lots of bugfixes and hints.
|
Tester, lots of bugfixes and hints.
|
||||||
|
|
||||||
Alan Cox (alan@redhat.com)
|
Alan Cox (alan@lxorguk.ukuu.org.uk)
|
||||||
For help getting into standard-kernel.
|
For help getting into standard-kernel.
|
||||||
|
|
||||||
Henner Eisen (eis@baty.hanse.de)
|
Henner Eisen (eis@baty.hanse.de)
|
||||||
|
|
|
@ -11,14 +11,14 @@ for non English (read: Japanese) speakers and is not intended as a
|
||||||
fork. So if you have any comments or updates for this file, please try
|
fork. So if you have any comments or updates for this file, please try
|
||||||
to update the original English file first.
|
to update the original English file first.
|
||||||
|
|
||||||
Last Updated: 2008/08/21
|
Last Updated: 2008/10/24
|
||||||
==================================
|
==================================
|
||||||
これは、
|
これは、
|
||||||
linux-2.6.27/Documentation/HOWTO
|
linux-2.6.28/Documentation/HOWTO
|
||||||
の和訳です。
|
の和訳です。
|
||||||
|
|
||||||
翻訳団体: JF プロジェクト < http://www.linux.or.jp/JF/ >
|
翻訳団体: JF プロジェクト < http://www.linux.or.jp/JF/ >
|
||||||
翻訳日: 2008/8/5
|
翻訳日: 2008/10/24
|
||||||
翻訳者: Tsugikazu Shibata <tshibata at ab dot jp dot nec dot com>
|
翻訳者: Tsugikazu Shibata <tshibata at ab dot jp dot nec dot com>
|
||||||
校正者: 松倉さん <nbh--mats at nifty dot com>
|
校正者: 松倉さん <nbh--mats at nifty dot com>
|
||||||
小林 雅典さん (Masanori Kobayasi) <zap03216 at nifty dot ne dot jp>
|
小林 雅典さん (Masanori Kobayasi) <zap03216 at nifty dot ne dot jp>
|
||||||
|
@ -110,8 +110,8 @@ Linux カーネルソースツリーは幅広い範囲のドキュメントを
|
||||||
新しいドキュメントファイルも追加することを勧めます。
|
新しいドキュメントファイルも追加することを勧めます。
|
||||||
カーネルの変更が、カーネルがユーザ空間に公開しているインターフェイスの
|
カーネルの変更が、カーネルがユーザ空間に公開しているインターフェイスの
|
||||||
変更を引き起こす場合、その変更を説明するマニュアルページのパッチや情報
|
変更を引き起こす場合、その変更を説明するマニュアルページのパッチや情報
|
||||||
をマニュアルページのメンテナ mtk.manpages@gmail.com に送ることを勧めま
|
をマニュアルページのメンテナ mtk.manpages@gmail.com に送り、CC を
|
||||||
す。
|
linux-api@ver.kernel.org に送ることを勧めます。
|
||||||
|
|
||||||
以下はカーネルソースツリーに含まれている読んでおくべきファイルの一覧で
|
以下はカーネルソースツリーに含まれている読んでおくべきファイルの一覧で
|
||||||
す-
|
す-
|
||||||
|
@ -149,7 +149,7 @@ Linux カーネルソースツリーは幅広い範囲のドキュメントを
|
||||||
この他にパッチを作る方法についてのよくできた記述は-
|
この他にパッチを作る方法についてのよくできた記述は-
|
||||||
|
|
||||||
"The Perfect Patch"
|
"The Perfect Patch"
|
||||||
http://www.zip.com.au/~akpm/linux/patches/stuff/tpp.txt
|
http://userweb.kernel.org/~akpm/stuff/tpp.txt
|
||||||
"Linux kernel patch submission format"
|
"Linux kernel patch submission format"
|
||||||
http://linux.yyz.us/patch-format.html
|
http://linux.yyz.us/patch-format.html
|
||||||
|
|
||||||
|
@ -664,7 +664,7 @@ Linux カーネルコミュニティは、一度に大量のコードの塊を
|
||||||
これについて全てがどのようにあるべきかについての詳細は、以下のドキュメ
|
これについて全てがどのようにあるべきかについての詳細は、以下のドキュメ
|
||||||
ントの ChangeLog セクションを見てください-
|
ントの ChangeLog セクションを見てください-
|
||||||
"The Perfect Patch"
|
"The Perfect Patch"
|
||||||
http://www.zip.com.au/~akpm/linux/patches/stuff/tpp.txt
|
http://userweb.kernel.org/~akpm/stuff/tpp.txt
|
||||||
|
|
||||||
これらのどれもが、時にはとても困難です。これらの慣例を完璧に実施するに
|
これらのどれもが、時にはとても困難です。これらの慣例を完璧に実施するに
|
||||||
は数年かかるかもしれません。これは継続的な改善のプロセスであり、そのた
|
は数年かかるかもしれません。これは継続的な改善のプロセスであり、そのた
|
||||||
|
|
1
Documentation/networking/.gitignore
vendored
Normal file
1
Documentation/networking/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
ifenslave
|
|
@ -60,6 +60,6 @@ Tobias Ringstrom <tori@unhappy.mine.nu> : Current Maintainer
|
||||||
Contributors:
|
Contributors:
|
||||||
|
|
||||||
Marcelo Tosatti <marcelo@conectiva.com.br>
|
Marcelo Tosatti <marcelo@conectiva.com.br>
|
||||||
Alan Cox <alan@redhat.com>
|
Alan Cox <alan@lxorguk.ukuu.org.uk>
|
||||||
Jeff Garzik <jgarzik@pobox.com>
|
Jeff Garzik <jgarzik@pobox.com>
|
||||||
Vojtech Pavlik <vojtech@suse.cz>
|
Vojtech Pavlik <vojtech@suse.cz>
|
||||||
|
|
1
Documentation/pcmcia/.gitignore
vendored
Normal file
1
Documentation/pcmcia/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
crc32hash
|
|
@ -92,7 +92,7 @@ other HZ detail. Thus the CFS scheduler has no notion of "timeslices" in the
|
||||||
way the previous scheduler had, and has no heuristics whatsoever. There is
|
way the previous scheduler had, and has no heuristics whatsoever. There is
|
||||||
only one central tunable (you have to switch on CONFIG_SCHED_DEBUG):
|
only one central tunable (you have to switch on CONFIG_SCHED_DEBUG):
|
||||||
|
|
||||||
/proc/sys/kernel/sched_granularity_ns
|
/proc/sys/kernel/sched_min_granularity_ns
|
||||||
|
|
||||||
which can be used to tune the scheduler from "desktop" (i.e., low latencies) to
|
which can be used to tune the scheduler from "desktop" (i.e., low latencies) to
|
||||||
"server" (i.e., good batching) workloads. It defaults to a setting suitable
|
"server" (i.e., good batching) workloads. It defaults to a setting suitable
|
||||||
|
|
|
@ -128,7 +128,7 @@ Supported Cards/Chipsets
|
||||||
|
|
||||||
People
|
People
|
||||||
-------------------------
|
-------------------------
|
||||||
Alan Cox <alan@redhat.com>
|
Alan Cox <alan@lxorguk.ukuu.org.uk>
|
||||||
Christoph Hellwig <hch@infradead.org> (updates for new-style PCI probing and SCSI host registration,
|
Christoph Hellwig <hch@infradead.org> (updates for new-style PCI probing and SCSI host registration,
|
||||||
small cleanups/fixes)
|
small cleanups/fixes)
|
||||||
Matt Domsch <matt_domsch@dell.com> (revision ioctl, adapter messages)
|
Matt Domsch <matt_domsch@dell.com> (revision ioctl, adapter messages)
|
||||||
|
|
2
Documentation/spi/.gitignore
vendored
Normal file
2
Documentation/spi/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
spidev_fdx
|
||||||
|
spidev_test
|
|
@ -12,6 +12,7 @@ Rules on what kind of patches are accepted, and which ones are not, into the
|
||||||
marked CONFIG_BROKEN), an oops, a hang, data corruption, a real
|
marked CONFIG_BROKEN), an oops, a hang, data corruption, a real
|
||||||
security issue, or some "oh, that's not good" issue. In short, something
|
security issue, or some "oh, that's not good" issue. In short, something
|
||||||
critical.
|
critical.
|
||||||
|
- New device IDs and quirks are also accepted.
|
||||||
- No "theoretical race condition" issues, unless an explanation of how the
|
- No "theoretical race condition" issues, unless an explanation of how the
|
||||||
race can be exploited is also provided.
|
race can be exploited is also provided.
|
||||||
- It cannot contain any "trivial" fixes in it (spelling changes,
|
- It cannot contain any "trivial" fixes in it (spelling changes,
|
||||||
|
|
|
@ -369,5 +369,15 @@ can be ORed together:
|
||||||
2 - A module was force loaded by insmod -f.
|
2 - A module was force loaded by insmod -f.
|
||||||
Set by modutils >= 2.4.9 and module-init-tools.
|
Set by modutils >= 2.4.9 and module-init-tools.
|
||||||
4 - Unsafe SMP processors: SMP with CPUs not designed for SMP.
|
4 - Unsafe SMP processors: SMP with CPUs not designed for SMP.
|
||||||
64 - A module from drivers/staging was loaded.
|
8 - A module was forcibly unloaded from the system by rmmod -f.
|
||||||
|
16 - A hardware machine check error occurred on the system.
|
||||||
|
32 - A bad page was discovered on the system.
|
||||||
|
64 - The user has asked that the system be marked "tainted". This
|
||||||
|
could be because they are running software that directly modifies
|
||||||
|
the hardware, or for other reasons.
|
||||||
|
128 - The system has died.
|
||||||
|
256 - The ACPI DSDT has been overridden with one supplied by the user
|
||||||
|
instead of using the one provided by the hardware.
|
||||||
|
512 - A kernel warning has occurred.
|
||||||
|
1024 - A module from drivers/staging was loaded.
|
||||||
|
|
||||||
|
|
1
Documentation/video4linux/.gitignore
vendored
Normal file
1
Documentation/video4linux/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
v4lgrab
|
|
@ -3,7 +3,7 @@ Contributors to bttv:
|
||||||
Michael Chu <mmchu@pobox.com>
|
Michael Chu <mmchu@pobox.com>
|
||||||
AverMedia fix and more flexible card recognition
|
AverMedia fix and more flexible card recognition
|
||||||
|
|
||||||
Alan Cox <alan@redhat.com>
|
Alan Cox <alan@lxorguk.ukuu.org.uk>
|
||||||
Video4Linux interface and 2.1.x kernel adaptation
|
Video4Linux interface and 2.1.x kernel adaptation
|
||||||
|
|
||||||
Chris Kleitsch
|
Chris Kleitsch
|
||||||
|
|
1
Documentation/vm/.gitignore
vendored
Normal file
1
Documentation/vm/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
slabinfo
|
2
Documentation/watchdog/src/.gitignore
vendored
Normal file
2
Documentation/watchdog/src/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
watchdog-simple
|
||||||
|
watchdog-test
|
30
MAINTAINERS
30
MAINTAINERS
|
@ -347,7 +347,7 @@ S: Maintained
|
||||||
ALI1563 I2C DRIVER
|
ALI1563 I2C DRIVER
|
||||||
P: Rudolf Marek
|
P: Rudolf Marek
|
||||||
M: r.marek@assembler.cz
|
M: r.marek@assembler.cz
|
||||||
L: i2c@lm-sensors.org
|
L: linux-i2c@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
ALPHA PORT
|
ALPHA PORT
|
||||||
|
@ -1749,7 +1749,7 @@ FREESCALE I2C CPM DRIVER
|
||||||
P: Jochen Friedrich
|
P: Jochen Friedrich
|
||||||
M: jochen@scram.de
|
M: jochen@scram.de
|
||||||
L: linuxppc-dev@ozlabs.org
|
L: linuxppc-dev@ozlabs.org
|
||||||
L: i2c@lm-sensors.org
|
L: linux-i2c@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
FREESCALE SOC FS_ENET DRIVER
|
FREESCALE SOC FS_ENET DRIVER
|
||||||
|
@ -2022,7 +2022,7 @@ S: Maintained
|
||||||
I2C/SMBUS STUB DRIVER
|
I2C/SMBUS STUB DRIVER
|
||||||
P: Mark M. Hoffman
|
P: Mark M. Hoffman
|
||||||
M: mhoffman@lightlink.com
|
M: mhoffman@lightlink.com
|
||||||
L: i2c@lm-sensors.org
|
L: linux-i2c@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
I2C SUBSYSTEM
|
I2C SUBSYSTEM
|
||||||
|
@ -2030,14 +2030,14 @@ P: Jean Delvare (PC drivers, core)
|
||||||
M: khali@linux-fr.org
|
M: khali@linux-fr.org
|
||||||
P: Ben Dooks (embedded platforms)
|
P: Ben Dooks (embedded platforms)
|
||||||
M: ben-linux@fluff.org
|
M: ben-linux@fluff.org
|
||||||
L: i2c@lm-sensors.org
|
L: linux-i2c@vger.kernel.org
|
||||||
T: quilt http://khali.linux-fr.org/devel/linux-2.6/jdelvare-i2c/
|
T: quilt http://khali.linux-fr.org/devel/linux-2.6/jdelvare-i2c/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
I2C-TINY-USB DRIVER
|
I2C-TINY-USB DRIVER
|
||||||
P: Till Harbaum
|
P: Till Harbaum
|
||||||
M: till@harbaum.org
|
M: till@harbaum.org
|
||||||
L: i2c@lm-sensors.org
|
L: linux-i2c@vger.kernel.org
|
||||||
T: http://www.harbaum.org/till/i2c_tiny_usb
|
T: http://www.harbaum.org/till/i2c_tiny_usb
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
@ -2701,6 +2701,16 @@ M: matthew@wil.cx
|
||||||
L: linux-scsi@vger.kernel.org
|
L: linux-scsi@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
LTP (Linux Test Project)
|
||||||
|
P: Subrata Modak
|
||||||
|
M: subrata@linux.vnet.ibm.com
|
||||||
|
P: Mike Frysinger
|
||||||
|
M: vapier@gentoo.org
|
||||||
|
L: ltp-list@lists.sourceforge.net (subscribers-only)
|
||||||
|
W: http://ltp.sourceforge.net/
|
||||||
|
T: git kernel.org/pub/scm/linux/kernel/git/galak/ltp.git
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
M32R ARCHITECTURE
|
M32R ARCHITECTURE
|
||||||
P: Hirokazu Takata
|
P: Hirokazu Takata
|
||||||
M: takata@linux-m32r.org
|
M: takata@linux-m32r.org
|
||||||
|
@ -3143,7 +3153,7 @@ S: Maintained
|
||||||
OPENCORES I2C BUS DRIVER
|
OPENCORES I2C BUS DRIVER
|
||||||
P: Peter Korsgaard
|
P: Peter Korsgaard
|
||||||
M: jacmet@sunsite.dk
|
M: jacmet@sunsite.dk
|
||||||
L: i2c@lm-sensors.org
|
L: linux-i2c@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
OPROFILE
|
OPROFILE
|
||||||
|
@ -3190,7 +3200,7 @@ S: Maintained
|
||||||
PA SEMI SMBUS DRIVER
|
PA SEMI SMBUS DRIVER
|
||||||
P: Olof Johansson
|
P: Olof Johansson
|
||||||
M: olof@lixom.net
|
M: olof@lixom.net
|
||||||
L: i2c@lm-sensors.org
|
L: linux-i2c@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
PANASONIC LAPTOP ACPI EXTRAS DRIVER
|
PANASONIC LAPTOP ACPI EXTRAS DRIVER
|
||||||
|
@ -3335,7 +3345,7 @@ S: Maintained
|
||||||
PNXxxxx I2C DRIVER
|
PNXxxxx I2C DRIVER
|
||||||
P: Vitaly Wool
|
P: Vitaly Wool
|
||||||
M: vitalywool@gmail.com
|
M: vitalywool@gmail.com
|
||||||
L: i2c@lm-sensors.org
|
L: linux-i2c@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
PPP PROTOCOL DRIVERS AND COMPRESSORS
|
PPP PROTOCOL DRIVERS AND COMPRESSORS
|
||||||
|
@ -3799,7 +3809,7 @@ S: Maintained
|
||||||
SIS 96X I2C/SMBUS DRIVER
|
SIS 96X I2C/SMBUS DRIVER
|
||||||
P: Mark M. Hoffman
|
P: Mark M. Hoffman
|
||||||
M: mhoffman@lightlink.com
|
M: mhoffman@lightlink.com
|
||||||
L: i2c@lm-sensors.org
|
L: linux-i2c@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
SIS FRAMEBUFFER DRIVER
|
SIS FRAMEBUFFER DRIVER
|
||||||
|
@ -4546,7 +4556,7 @@ S: Maintained
|
||||||
VIAPRO SMBUS DRIVER
|
VIAPRO SMBUS DRIVER
|
||||||
P: Jean Delvare
|
P: Jean Delvare
|
||||||
M: khali@linux-fr.org
|
M: khali@linux-fr.org
|
||||||
L: i2c@lm-sensors.org
|
L: linux-i2c@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
VIA UNICHROME(PRO)/CHROME9 FRAMEBUFFER DRIVER
|
VIA UNICHROME(PRO)/CHROME9 FRAMEBUFFER DRIVER
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -536,7 +536,7 @@ KBUILD_CFLAGS += -g
|
||||||
KBUILD_AFLAGS += -gdwarf-2
|
KBUILD_AFLAGS += -gdwarf-2
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifdef CONFIG_FTRACE
|
ifdef CONFIG_FUNCTION_TRACER
|
||||||
KBUILD_CFLAGS += -pg
|
KBUILD_CFLAGS += -pg
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
|
@ -16,8 +16,7 @@ config ARM
|
||||||
select HAVE_ARCH_KGDB
|
select HAVE_ARCH_KGDB
|
||||||
select HAVE_KPROBES if (!XIP_KERNEL)
|
select HAVE_KPROBES if (!XIP_KERNEL)
|
||||||
select HAVE_KRETPROBES if (HAVE_KPROBES)
|
select HAVE_KRETPROBES if (HAVE_KPROBES)
|
||||||
select HAVE_FTRACE if (!XIP_KERNEL)
|
select HAVE_FUNCTION_TRACER if (!XIP_KERNEL)
|
||||||
select HAVE_DYNAMIC_FTRACE if (HAVE_FTRACE)
|
|
||||||
select HAVE_GENERIC_DMA_COHERENT
|
select HAVE_GENERIC_DMA_COHERENT
|
||||||
help
|
help
|
||||||
The ARM series is a line of low-power-consumption RISC chip designs
|
The ARM series is a line of low-power-consumption RISC chip designs
|
||||||
|
|
|
@ -70,7 +70,7 @@ SEDFLAGS = s/TEXT_START/$(ZTEXTADDR)/;s/BSS_START/$(ZBSSADDR)/
|
||||||
targets := vmlinux vmlinux.lds piggy.gz piggy.o font.o font.c \
|
targets := vmlinux vmlinux.lds piggy.gz piggy.o font.o font.c \
|
||||||
head.o misc.o $(OBJS)
|
head.o misc.o $(OBJS)
|
||||||
|
|
||||||
ifeq ($(CONFIG_FTRACE),y)
|
ifeq ($(CONFIG_FUNCTION_TRACER),y)
|
||||||
ORIG_CFLAGS := $(KBUILD_CFLAGS)
|
ORIG_CFLAGS := $(KBUILD_CFLAGS)
|
||||||
KBUILD_CFLAGS = $(subst -pg, , $(ORIG_CFLAGS))
|
KBUILD_CFLAGS = $(subst -pg, , $(ORIG_CFLAGS))
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#ifndef _ASM_ARM_FTRACE
|
#ifndef _ASM_ARM_FTRACE
|
||||||
#define _ASM_ARM_FTRACE
|
#define _ASM_ARM_FTRACE
|
||||||
|
|
||||||
#ifdef CONFIG_FTRACE
|
#ifdef CONFIG_FUNCTION_TRACER
|
||||||
#define MCOUNT_ADDR ((long)(mcount))
|
#define MCOUNT_ADDR ((long)(mcount))
|
||||||
#define MCOUNT_INSN_SIZE 4 /* sizeof mcount call */
|
#define MCOUNT_INSN_SIZE 4 /* sizeof mcount call */
|
||||||
|
|
||||||
|
|
|
@ -183,6 +183,6 @@ EXPORT_SYMBOL(_find_next_bit_be);
|
||||||
|
|
||||||
EXPORT_SYMBOL(copy_page);
|
EXPORT_SYMBOL(copy_page);
|
||||||
|
|
||||||
#ifdef CONFIG_FTRACE
|
#ifdef CONFIG_FUNCTION_TRACER
|
||||||
EXPORT_SYMBOL(mcount);
|
EXPORT_SYMBOL(mcount);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -101,7 +101,7 @@ ENDPROC(ret_from_fork)
|
||||||
#undef CALL
|
#undef CALL
|
||||||
#define CALL(x) .long x
|
#define CALL(x) .long x
|
||||||
|
|
||||||
#ifdef CONFIG_FTRACE
|
#ifdef CONFIG_FUNCTION_TRACER
|
||||||
#ifdef CONFIG_DYNAMIC_FTRACE
|
#ifdef CONFIG_DYNAMIC_FTRACE
|
||||||
ENTRY(mcount)
|
ENTRY(mcount)
|
||||||
stmdb sp!, {r0-r3, lr}
|
stmdb sp!, {r0-r3, lr}
|
||||||
|
@ -149,7 +149,7 @@ trace:
|
||||||
ftrace_stub:
|
ftrace_stub:
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
|
|
||||||
#endif /* CONFIG_FTRACE */
|
#endif /* CONFIG_FUNCTION_TRACER */
|
||||||
|
|
||||||
/*=============================================================================
|
/*=============================================================================
|
||||||
* SWI handler
|
* SWI handler
|
||||||
|
|
|
@ -95,19 +95,6 @@ int ftrace_update_ftrace_func(ftrace_func_t func)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ftrace_mcount_set(unsigned long *data)
|
|
||||||
{
|
|
||||||
unsigned long pc, old;
|
|
||||||
unsigned long *addr = data;
|
|
||||||
unsigned char *new;
|
|
||||||
|
|
||||||
pc = (unsigned long)&mcount_call;
|
|
||||||
memcpy(&old, &mcount_call, MCOUNT_INSN_SIZE);
|
|
||||||
new = ftrace_call_replace(pc, *addr);
|
|
||||||
*addr = ftrace_modify_code(pc, (unsigned char *)&old, new);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* run from kstop_machine */
|
/* run from kstop_machine */
|
||||||
int __init ftrace_dyn_arch_init(void *data)
|
int __init ftrace_dyn_arch_init(void *data)
|
||||||
{
|
{
|
||||||
|
|
|
@ -11,6 +11,5 @@ extern int force_iommu, no_iommu;
|
||||||
extern int iommu_detected;
|
extern int iommu_detected;
|
||||||
extern void iommu_dma_init(void);
|
extern void iommu_dma_init(void);
|
||||||
extern void machvec_init(const char *name);
|
extern void machvec_init(const char *name);
|
||||||
extern int forbid_dac;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -365,7 +365,8 @@ struct kvm_vcpu_arch {
|
||||||
long itc_offset;
|
long itc_offset;
|
||||||
unsigned long itc_check;
|
unsigned long itc_check;
|
||||||
unsigned long timer_check;
|
unsigned long timer_check;
|
||||||
unsigned long timer_pending;
|
unsigned int timer_pending;
|
||||||
|
unsigned int timer_fired;
|
||||||
|
|
||||||
unsigned long vrr[8];
|
unsigned long vrr[8];
|
||||||
unsigned long ibr[8];
|
unsigned long ibr[8];
|
||||||
|
@ -417,6 +418,9 @@ struct kvm_arch {
|
||||||
struct list_head assigned_dev_head;
|
struct list_head assigned_dev_head;
|
||||||
struct dmar_domain *intel_iommu_domain;
|
struct dmar_domain *intel_iommu_domain;
|
||||||
struct hlist_head irq_ack_notifier_list;
|
struct hlist_head irq_ack_notifier_list;
|
||||||
|
|
||||||
|
unsigned long irq_sources_bitmap;
|
||||||
|
unsigned long irq_states[KVM_IOAPIC_NUM_PINS];
|
||||||
};
|
};
|
||||||
|
|
||||||
union cpuid3_t {
|
union cpuid3_t {
|
||||||
|
|
|
@ -89,13 +89,6 @@ int iommu_dma_supported(struct device *dev, u64 mask)
|
||||||
{
|
{
|
||||||
struct dma_mapping_ops *ops = get_dma_ops(dev);
|
struct dma_mapping_ops *ops = get_dma_ops(dev);
|
||||||
|
|
||||||
#ifdef CONFIG_PCI
|
|
||||||
if (mask > 0xffffffff && forbid_dac > 0) {
|
|
||||||
dev_info(dev, "Disallowing DAC for device\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (ops->dma_supported_op)
|
if (ops->dma_supported_op)
|
||||||
return ops->dma_supported_op(dev, mask);
|
return ops->dma_supported_op(dev, mask);
|
||||||
|
|
||||||
|
|
|
@ -29,13 +29,18 @@ define cmd_offsets
|
||||||
echo ""; \
|
echo ""; \
|
||||||
echo "#endif" ) > $@
|
echo "#endif" ) > $@
|
||||||
endef
|
endef
|
||||||
|
|
||||||
# We use internal rules to avoid the "is up to date" message from make
|
# We use internal rules to avoid the "is up to date" message from make
|
||||||
arch/ia64/kvm/asm-offsets.s: arch/ia64/kvm/asm-offsets.c
|
arch/ia64/kvm/asm-offsets.s: arch/ia64/kvm/asm-offsets.c \
|
||||||
|
$(wildcard $(srctree)/arch/ia64/include/asm/*.h)\
|
||||||
|
$(wildcard $(srctree)/include/linux/*.h)
|
||||||
$(call if_changed_dep,cc_s_c)
|
$(call if_changed_dep,cc_s_c)
|
||||||
|
|
||||||
$(obj)/$(offsets-file): arch/ia64/kvm/asm-offsets.s
|
$(obj)/$(offsets-file): arch/ia64/kvm/asm-offsets.s
|
||||||
$(call cmd,offsets)
|
$(call cmd,offsets)
|
||||||
|
|
||||||
|
FORCE : $(obj)/$(offsets-file)
|
||||||
|
|
||||||
#
|
#
|
||||||
# Makefile for Kernel-based Virtual Machine module
|
# Makefile for Kernel-based Virtual Machine module
|
||||||
#
|
#
|
||||||
|
@ -53,7 +58,6 @@ endif
|
||||||
kvm-objs := $(common-objs) kvm-ia64.o kvm_fw.o
|
kvm-objs := $(common-objs) kvm-ia64.o kvm_fw.o
|
||||||
obj-$(CONFIG_KVM) += kvm.o
|
obj-$(CONFIG_KVM) += kvm.o
|
||||||
|
|
||||||
FORCE : $(obj)/$(offsets-file)
|
|
||||||
EXTRA_CFLAGS_vcpu.o += -mfixed-range=f2-f5,f12-f127
|
EXTRA_CFLAGS_vcpu.o += -mfixed-range=f2-f5,f12-f127
|
||||||
kvm-intel-objs = vmm.o vmm_ivt.o trampoline.o vcpu.o optvfault.o mmio.o \
|
kvm-intel-objs = vmm.o vmm_ivt.o trampoline.o vcpu.o optvfault.o mmio.o \
|
||||||
vtlb.o process.o
|
vtlb.o process.o
|
||||||
|
|
|
@ -385,6 +385,7 @@ static int handle_global_purge(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
|
||||||
struct kvm *kvm = vcpu->kvm;
|
struct kvm *kvm = vcpu->kvm;
|
||||||
struct call_data call_data;
|
struct call_data call_data;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
call_data.ptc_g_data = p->u.ptc_g_data;
|
call_data.ptc_g_data = p->u.ptc_g_data;
|
||||||
|
|
||||||
for (i = 0; i < KVM_MAX_VCPUS; i++) {
|
for (i = 0; i < KVM_MAX_VCPUS; i++) {
|
||||||
|
@ -418,12 +419,13 @@ int kvm_emulate_halt(struct kvm_vcpu *vcpu)
|
||||||
ktime_t kt;
|
ktime_t kt;
|
||||||
long itc_diff;
|
long itc_diff;
|
||||||
unsigned long vcpu_now_itc;
|
unsigned long vcpu_now_itc;
|
||||||
|
|
||||||
unsigned long expires;
|
unsigned long expires;
|
||||||
struct hrtimer *p_ht = &vcpu->arch.hlt_timer;
|
struct hrtimer *p_ht = &vcpu->arch.hlt_timer;
|
||||||
unsigned long cyc_per_usec = local_cpu_data->cyc_per_usec;
|
unsigned long cyc_per_usec = local_cpu_data->cyc_per_usec;
|
||||||
struct vpd *vpd = to_host(vcpu->kvm, vcpu->arch.vpd);
|
struct vpd *vpd = to_host(vcpu->kvm, vcpu->arch.vpd);
|
||||||
|
|
||||||
|
if (irqchip_in_kernel(vcpu->kvm)) {
|
||||||
|
|
||||||
vcpu_now_itc = ia64_getreg(_IA64_REG_AR_ITC) + vcpu->arch.itc_offset;
|
vcpu_now_itc = ia64_getreg(_IA64_REG_AR_ITC) + vcpu->arch.itc_offset;
|
||||||
|
|
||||||
if (time_after(vcpu_now_itc, vpd->itm)) {
|
if (time_after(vcpu_now_itc, vpd->itm)) {
|
||||||
|
@ -436,15 +438,22 @@ int kvm_emulate_halt(struct kvm_vcpu *vcpu)
|
||||||
|
|
||||||
expires = div64_u64(itc_diff, cyc_per_usec);
|
expires = div64_u64(itc_diff, cyc_per_usec);
|
||||||
kt = ktime_set(0, 1000 * expires);
|
kt = ktime_set(0, 1000 * expires);
|
||||||
|
|
||||||
|
down_read(&vcpu->kvm->slots_lock);
|
||||||
vcpu->arch.ht_active = 1;
|
vcpu->arch.ht_active = 1;
|
||||||
hrtimer_start(p_ht, kt, HRTIMER_MODE_ABS);
|
hrtimer_start(p_ht, kt, HRTIMER_MODE_ABS);
|
||||||
|
|
||||||
if (irqchip_in_kernel(vcpu->kvm)) {
|
|
||||||
vcpu->arch.mp_state = KVM_MP_STATE_HALTED;
|
vcpu->arch.mp_state = KVM_MP_STATE_HALTED;
|
||||||
kvm_vcpu_block(vcpu);
|
kvm_vcpu_block(vcpu);
|
||||||
hrtimer_cancel(p_ht);
|
hrtimer_cancel(p_ht);
|
||||||
vcpu->arch.ht_active = 0;
|
vcpu->arch.ht_active = 0;
|
||||||
|
|
||||||
|
if (test_and_clear_bit(KVM_REQ_UNHALT, &vcpu->requests))
|
||||||
|
if (vcpu->arch.mp_state == KVM_MP_STATE_HALTED)
|
||||||
|
vcpu->arch.mp_state =
|
||||||
|
KVM_MP_STATE_RUNNABLE;
|
||||||
|
up_read(&vcpu->kvm->slots_lock);
|
||||||
|
|
||||||
if (vcpu->arch.mp_state != KVM_MP_STATE_RUNNABLE)
|
if (vcpu->arch.mp_state != KVM_MP_STATE_RUNNABLE)
|
||||||
return -EINTR;
|
return -EINTR;
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -484,10 +493,6 @@ static int (*kvm_vti_exit_handlers[])(struct kvm_vcpu *vcpu,
|
||||||
static const int kvm_vti_max_exit_handlers =
|
static const int kvm_vti_max_exit_handlers =
|
||||||
sizeof(kvm_vti_exit_handlers)/sizeof(*kvm_vti_exit_handlers);
|
sizeof(kvm_vti_exit_handlers)/sizeof(*kvm_vti_exit_handlers);
|
||||||
|
|
||||||
static void kvm_prepare_guest_switch(struct kvm_vcpu *vcpu)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint32_t kvm_get_exit_reason(struct kvm_vcpu *vcpu)
|
static uint32_t kvm_get_exit_reason(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
struct exit_ctl_data *p_exit_data;
|
struct exit_ctl_data *p_exit_data;
|
||||||
|
@ -600,8 +605,6 @@ static int __vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
|
||||||
|
|
||||||
again:
|
again:
|
||||||
preempt_disable();
|
preempt_disable();
|
||||||
|
|
||||||
kvm_prepare_guest_switch(vcpu);
|
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
|
|
||||||
if (signal_pending(current)) {
|
if (signal_pending(current)) {
|
||||||
|
@ -614,7 +617,7 @@ static int __vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
|
||||||
|
|
||||||
vcpu->guest_mode = 1;
|
vcpu->guest_mode = 1;
|
||||||
kvm_guest_enter();
|
kvm_guest_enter();
|
||||||
|
down_read(&vcpu->kvm->slots_lock);
|
||||||
r = vti_vcpu_run(vcpu, kvm_run);
|
r = vti_vcpu_run(vcpu, kvm_run);
|
||||||
if (r < 0) {
|
if (r < 0) {
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
|
@ -634,9 +637,8 @@ static int __vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
|
||||||
* But we need to prevent reordering, hence this barrier():
|
* But we need to prevent reordering, hence this barrier():
|
||||||
*/
|
*/
|
||||||
barrier();
|
barrier();
|
||||||
|
|
||||||
kvm_guest_exit();
|
kvm_guest_exit();
|
||||||
|
up_read(&vcpu->kvm->slots_lock);
|
||||||
preempt_enable();
|
preempt_enable();
|
||||||
|
|
||||||
r = kvm_handle_exit(kvm_run, vcpu);
|
r = kvm_handle_exit(kvm_run, vcpu);
|
||||||
|
@ -673,6 +675,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
|
||||||
|
|
||||||
if (unlikely(vcpu->arch.mp_state == KVM_MP_STATE_UNINITIALIZED)) {
|
if (unlikely(vcpu->arch.mp_state == KVM_MP_STATE_UNINITIALIZED)) {
|
||||||
kvm_vcpu_block(vcpu);
|
kvm_vcpu_block(vcpu);
|
||||||
|
clear_bit(KVM_REQ_UNHALT, &vcpu->requests);
|
||||||
vcpu_put(vcpu);
|
vcpu_put(vcpu);
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
}
|
}
|
||||||
|
@ -778,6 +781,9 @@ static void kvm_init_vm(struct kvm *kvm)
|
||||||
kvm_build_io_pmt(kvm);
|
kvm_build_io_pmt(kvm);
|
||||||
|
|
||||||
INIT_LIST_HEAD(&kvm->arch.assigned_dev_head);
|
INIT_LIST_HEAD(&kvm->arch.assigned_dev_head);
|
||||||
|
|
||||||
|
/* Reserve bit 0 of irq_sources_bitmap for userspace irq source */
|
||||||
|
set_bit(KVM_USERSPACE_IRQ_SOURCE_ID, &kvm->arch.irq_sources_bitmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct kvm *kvm_arch_create_vm(void)
|
struct kvm *kvm_arch_create_vm(void)
|
||||||
|
@ -941,9 +947,8 @@ long kvm_arch_vm_ioctl(struct file *filp,
|
||||||
goto out;
|
goto out;
|
||||||
if (irqchip_in_kernel(kvm)) {
|
if (irqchip_in_kernel(kvm)) {
|
||||||
mutex_lock(&kvm->lock);
|
mutex_lock(&kvm->lock);
|
||||||
kvm_ioapic_set_irq(kvm->arch.vioapic,
|
kvm_set_irq(kvm, KVM_USERSPACE_IRQ_SOURCE_ID,
|
||||||
irq_event.irq,
|
irq_event.irq, irq_event.level);
|
||||||
irq_event.level);
|
|
||||||
mutex_unlock(&kvm->lock);
|
mutex_unlock(&kvm->lock);
|
||||||
r = 0;
|
r = 0;
|
||||||
}
|
}
|
||||||
|
@ -1123,15 +1128,16 @@ static enum hrtimer_restart hlt_timer_fn(struct hrtimer *data)
|
||||||
wait_queue_head_t *q;
|
wait_queue_head_t *q;
|
||||||
|
|
||||||
vcpu = container_of(data, struct kvm_vcpu, arch.hlt_timer);
|
vcpu = container_of(data, struct kvm_vcpu, arch.hlt_timer);
|
||||||
|
q = &vcpu->wq;
|
||||||
|
|
||||||
if (vcpu->arch.mp_state != KVM_MP_STATE_HALTED)
|
if (vcpu->arch.mp_state != KVM_MP_STATE_HALTED)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
q = &vcpu->wq;
|
if (waitqueue_active(q))
|
||||||
if (waitqueue_active(q)) {
|
|
||||||
vcpu->arch.mp_state = KVM_MP_STATE_RUNNABLE;
|
|
||||||
wake_up_interruptible(q);
|
wake_up_interruptible(q);
|
||||||
}
|
|
||||||
out:
|
out:
|
||||||
|
vcpu->arch.timer_fired = 1;
|
||||||
vcpu->arch.timer_check = 1;
|
vcpu->arch.timer_check = 1;
|
||||||
return HRTIMER_NORESTART;
|
return HRTIMER_NORESTART;
|
||||||
}
|
}
|
||||||
|
@ -1700,12 +1706,14 @@ static void vcpu_kick_intr(void *info)
|
||||||
void kvm_vcpu_kick(struct kvm_vcpu *vcpu)
|
void kvm_vcpu_kick(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
int ipi_pcpu = vcpu->cpu;
|
int ipi_pcpu = vcpu->cpu;
|
||||||
|
int cpu = get_cpu();
|
||||||
|
|
||||||
if (waitqueue_active(&vcpu->wq))
|
if (waitqueue_active(&vcpu->wq))
|
||||||
wake_up_interruptible(&vcpu->wq);
|
wake_up_interruptible(&vcpu->wq);
|
||||||
|
|
||||||
if (vcpu->guest_mode)
|
if (vcpu->guest_mode && cpu != ipi_pcpu)
|
||||||
smp_call_function_single(ipi_pcpu, vcpu_kick_intr, vcpu, 0);
|
smp_call_function_single(ipi_pcpu, vcpu_kick_intr, vcpu, 0);
|
||||||
|
put_cpu();
|
||||||
}
|
}
|
||||||
|
|
||||||
int kvm_apic_set_irq(struct kvm_vcpu *vcpu, u8 vec, u8 trig)
|
int kvm_apic_set_irq(struct kvm_vcpu *vcpu, u8 vec, u8 trig)
|
||||||
|
@ -1715,13 +1723,7 @@ int kvm_apic_set_irq(struct kvm_vcpu *vcpu, u8 vec, u8 trig)
|
||||||
|
|
||||||
if (!test_and_set_bit(vec, &vpd->irr[0])) {
|
if (!test_and_set_bit(vec, &vpd->irr[0])) {
|
||||||
vcpu->arch.irq_new_pending = 1;
|
vcpu->arch.irq_new_pending = 1;
|
||||||
if (vcpu->arch.mp_state == KVM_MP_STATE_RUNNABLE)
|
|
||||||
kvm_vcpu_kick(vcpu);
|
kvm_vcpu_kick(vcpu);
|
||||||
else if (vcpu->arch.mp_state == KVM_MP_STATE_HALTED) {
|
|
||||||
vcpu->arch.mp_state = KVM_MP_STATE_RUNNABLE;
|
|
||||||
if (waitqueue_active(&vcpu->wq))
|
|
||||||
wake_up_interruptible(&vcpu->wq);
|
|
||||||
}
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1791,7 +1793,7 @@ int kvm_cpu_has_interrupt(struct kvm_vcpu *vcpu)
|
||||||
|
|
||||||
int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu)
|
int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
return 0;
|
return vcpu->arch.timer_fired;
|
||||||
}
|
}
|
||||||
|
|
||||||
gfn_t unalias_gfn(struct kvm *kvm, gfn_t gfn)
|
gfn_t unalias_gfn(struct kvm *kvm, gfn_t gfn)
|
||||||
|
|
|
@ -286,6 +286,12 @@ static u64 kvm_get_pal_call_index(struct kvm_vcpu *vcpu)
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void prepare_for_halt(struct kvm_vcpu *vcpu)
|
||||||
|
{
|
||||||
|
vcpu->arch.timer_pending = 1;
|
||||||
|
vcpu->arch.timer_fired = 0;
|
||||||
|
}
|
||||||
|
|
||||||
int kvm_pal_emul(struct kvm_vcpu *vcpu, struct kvm_run *run)
|
int kvm_pal_emul(struct kvm_vcpu *vcpu, struct kvm_run *run)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -304,11 +310,10 @@ int kvm_pal_emul(struct kvm_vcpu *vcpu, struct kvm_run *run)
|
||||||
break;
|
break;
|
||||||
case PAL_HALT_LIGHT:
|
case PAL_HALT_LIGHT:
|
||||||
{
|
{
|
||||||
vcpu->arch.timer_pending = 1;
|
|
||||||
INIT_PAL_STATUS_SUCCESS(result);
|
INIT_PAL_STATUS_SUCCESS(result);
|
||||||
|
prepare_for_halt(vcpu);
|
||||||
if (kvm_highest_pending_irq(vcpu) == -1)
|
if (kvm_highest_pending_irq(vcpu) == -1)
|
||||||
ret = kvm_emulate_halt(vcpu);
|
ret = kvm_emulate_halt(vcpu);
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -238,21 +238,8 @@ config MIPS_SIM
|
||||||
This option enables support for MIPS Technologies MIPSsim software
|
This option enables support for MIPS Technologies MIPSsim software
|
||||||
emulator.
|
emulator.
|
||||||
|
|
||||||
config MARKEINS
|
config MACH_EMMA
|
||||||
bool "NEC EMMA2RH Mark-eins"
|
bool "NEC EMMA series based machines"
|
||||||
select CEVT_R4K
|
|
||||||
select CSRC_R4K
|
|
||||||
select DMA_NONCOHERENT
|
|
||||||
select HW_HAS_PCI
|
|
||||||
select IRQ_CPU
|
|
||||||
select SWAP_IO_SPACE
|
|
||||||
select SYS_SUPPORTS_32BIT_KERNEL
|
|
||||||
select SYS_SUPPORTS_BIG_ENDIAN
|
|
||||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
|
||||||
select SYS_HAS_CPU_R5000
|
|
||||||
help
|
|
||||||
This enables support for the R5432-based NEC Mark-eins
|
|
||||||
boards with R5500 CPU.
|
|
||||||
|
|
||||||
config MACH_VR41XX
|
config MACH_VR41XX
|
||||||
bool "NEC VR4100 series based machines"
|
bool "NEC VR4100 series based machines"
|
||||||
|
@ -261,6 +248,19 @@ config MACH_VR41XX
|
||||||
select SYS_HAS_CPU_VR41XX
|
select SYS_HAS_CPU_VR41XX
|
||||||
select GENERIC_HARDIRQS_NO__DO_IRQ
|
select GENERIC_HARDIRQS_NO__DO_IRQ
|
||||||
|
|
||||||
|
config NXP_STB220
|
||||||
|
bool "NXP STB220 board"
|
||||||
|
select SOC_PNX833X
|
||||||
|
help
|
||||||
|
Support for NXP Semiconductors STB220 Development Board.
|
||||||
|
|
||||||
|
config NXP_STB225
|
||||||
|
bool "NXP 225 board"
|
||||||
|
select SOC_PNX833X
|
||||||
|
select SOC_PNX8335
|
||||||
|
help
|
||||||
|
Support for NXP Semiconductors STB225 Development Board.
|
||||||
|
|
||||||
config PNX8550_JBS
|
config PNX8550_JBS
|
||||||
bool "NXP PNX8550 based JBS board"
|
bool "NXP PNX8550 based JBS board"
|
||||||
select PNX8550
|
select PNX8550
|
||||||
|
@ -601,6 +601,7 @@ endchoice
|
||||||
|
|
||||||
source "arch/mips/alchemy/Kconfig"
|
source "arch/mips/alchemy/Kconfig"
|
||||||
source "arch/mips/basler/excite/Kconfig"
|
source "arch/mips/basler/excite/Kconfig"
|
||||||
|
source "arch/mips/emma/Kconfig"
|
||||||
source "arch/mips/jazz/Kconfig"
|
source "arch/mips/jazz/Kconfig"
|
||||||
source "arch/mips/lasat/Kconfig"
|
source "arch/mips/lasat/Kconfig"
|
||||||
source "arch/mips/pmc-sierra/Kconfig"
|
source "arch/mips/pmc-sierra/Kconfig"
|
||||||
|
@ -849,6 +850,24 @@ config MIPS_RM9122
|
||||||
bool
|
bool
|
||||||
select SERIAL_RM9000
|
select SERIAL_RM9000
|
||||||
|
|
||||||
|
config SOC_PNX833X
|
||||||
|
bool
|
||||||
|
select CEVT_R4K
|
||||||
|
select CSRC_R4K
|
||||||
|
select IRQ_CPU
|
||||||
|
select DMA_NONCOHERENT
|
||||||
|
select SYS_HAS_CPU_MIPS32_R2
|
||||||
|
select SYS_SUPPORTS_32BIT_KERNEL
|
||||||
|
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||||
|
select SYS_SUPPORTS_BIG_ENDIAN
|
||||||
|
select GENERIC_HARDIRQS_NO__DO_IRQ
|
||||||
|
select GENERIC_GPIO
|
||||||
|
select CPU_MIPSR2_IRQ_VI
|
||||||
|
|
||||||
|
config SOC_PNX8335
|
||||||
|
bool
|
||||||
|
select SOC_PNX833X
|
||||||
|
|
||||||
config PNX8550
|
config PNX8550
|
||||||
bool
|
bool
|
||||||
select SOC_PNX8550
|
select SOC_PNX8550
|
||||||
|
@ -1092,6 +1111,16 @@ config CPU_R5432
|
||||||
select CPU_SUPPORTS_32BIT_KERNEL
|
select CPU_SUPPORTS_32BIT_KERNEL
|
||||||
select CPU_SUPPORTS_64BIT_KERNEL
|
select CPU_SUPPORTS_64BIT_KERNEL
|
||||||
|
|
||||||
|
config CPU_R5500
|
||||||
|
bool "R5500"
|
||||||
|
depends on SYS_HAS_CPU_R5500
|
||||||
|
select CPU_HAS_LLSC
|
||||||
|
select CPU_SUPPORTS_32BIT_KERNEL
|
||||||
|
select CPU_SUPPORTS_64BIT_KERNEL
|
||||||
|
help
|
||||||
|
NEC VR5500 and VR5500A series processors implement 64-bit MIPS IV
|
||||||
|
instruction set.
|
||||||
|
|
||||||
config CPU_R6000
|
config CPU_R6000
|
||||||
bool "R6000"
|
bool "R6000"
|
||||||
depends on EXPERIMENTAL
|
depends on EXPERIMENTAL
|
||||||
|
@ -1202,6 +1231,9 @@ config SYS_HAS_CPU_R5000
|
||||||
config SYS_HAS_CPU_R5432
|
config SYS_HAS_CPU_R5432
|
||||||
bool
|
bool
|
||||||
|
|
||||||
|
config SYS_HAS_CPU_R5500
|
||||||
|
bool
|
||||||
|
|
||||||
config SYS_HAS_CPU_R6000
|
config SYS_HAS_CPU_R6000
|
||||||
bool
|
bool
|
||||||
|
|
||||||
|
|
|
@ -131,6 +131,8 @@ cflags-$(CONFIG_CPU_MIPS64_R2) += $(call cc-option,-march=mips64r2,-mips64r2 -U_
|
||||||
cflags-$(CONFIG_CPU_R5000) += -march=r5000 -Wa,--trap
|
cflags-$(CONFIG_CPU_R5000) += -march=r5000 -Wa,--trap
|
||||||
cflags-$(CONFIG_CPU_R5432) += $(call cc-option,-march=r5400,-march=r5000) \
|
cflags-$(CONFIG_CPU_R5432) += $(call cc-option,-march=r5400,-march=r5000) \
|
||||||
-Wa,--trap
|
-Wa,--trap
|
||||||
|
cflags-$(CONFIG_CPU_R5500) += $(call cc-option,-march=r5500,-march=r5000) \
|
||||||
|
-Wa,--trap
|
||||||
cflags-$(CONFIG_CPU_NEVADA) += $(call cc-option,-march=rm5200,-march=r5000) \
|
cflags-$(CONFIG_CPU_NEVADA) += $(call cc-option,-march=rm5200,-march=r5000) \
|
||||||
-Wa,--trap
|
-Wa,--trap
|
||||||
cflags-$(CONFIG_CPU_RM7000) += $(call cc-option,-march=rm7000,-march=r5000) \
|
cflags-$(CONFIG_CPU_RM7000) += $(call cc-option,-march=rm7000,-march=r5000) \
|
||||||
|
@ -381,6 +383,14 @@ load-$(CONFIG_CASIO_E55) += 0xffffffff80004000
|
||||||
#
|
#
|
||||||
load-$(CONFIG_TANBAC_TB022X) += 0xffffffff80000000
|
load-$(CONFIG_TANBAC_TB022X) += 0xffffffff80000000
|
||||||
|
|
||||||
|
# NXP STB225
|
||||||
|
core-$(CONFIG_SOC_PNX833X) += arch/mips/nxp/pnx833x/common/
|
||||||
|
cflags-$(CONFIG_SOC_PNX833X) += -Iarch/mips/include/asm/mach-pnx833x
|
||||||
|
libs-$(CONFIG_NXP_STB220) += arch/mips/nxp/pnx833x/stb22x/
|
||||||
|
load-$(CONFIG_NXP_STB220) += 0xffffffff80001000
|
||||||
|
libs-$(CONFIG_NXP_STB225) += arch/mips/nxp/pnx833x/stb22x/
|
||||||
|
load-$(CONFIG_NXP_STB225) += 0xffffffff80001000
|
||||||
|
|
||||||
#
|
#
|
||||||
# Common NXP PNX8550
|
# Common NXP PNX8550
|
||||||
#
|
#
|
||||||
|
@ -399,14 +409,17 @@ load-$(CONFIG_PNX8550_JBS) += 0xffffffff80060000
|
||||||
libs-$(CONFIG_PNX8550_STB810) += arch/mips/nxp/pnx8550/stb810/
|
libs-$(CONFIG_PNX8550_STB810) += arch/mips/nxp/pnx8550/stb810/
|
||||||
load-$(CONFIG_PNX8550_STB810) += 0xffffffff80060000
|
load-$(CONFIG_PNX8550_STB810) += 0xffffffff80060000
|
||||||
|
|
||||||
# NEC EMMA2RH boards
|
|
||||||
#
|
#
|
||||||
core-$(CONFIG_EMMA2RH) += arch/mips/emma2rh/common/
|
# Common NEC EMMAXXX
|
||||||
cflags-$(CONFIG_EMMA2RH) += -I$(srctree)/arch/mips/include/asm/mach-emma2rh
|
#
|
||||||
|
core-$(CONFIG_SOC_EMMA) += arch/mips/emma/common/
|
||||||
|
cflags-$(CONFIG_SOC_EMMA2RH) += -I$(srctree)/arch/mips/include/asm/mach-emma2rh
|
||||||
|
|
||||||
|
#
|
||||||
# NEC EMMA2RH Mark-eins
|
# NEC EMMA2RH Mark-eins
|
||||||
core-$(CONFIG_MARKEINS) += arch/mips/emma2rh/markeins/
|
#
|
||||||
load-$(CONFIG_MARKEINS) += 0xffffffff88100000
|
core-$(CONFIG_NEC_MARKEINS) += arch/mips/emma/markeins/
|
||||||
|
load-$(CONFIG_NEC_MARKEINS) += 0xffffffff88100000
|
||||||
|
|
||||||
#
|
#
|
||||||
# SGI IP22 (Indy/Indigo2)
|
# SGI IP22 (Indy/Indigo2)
|
||||||
|
|
|
@ -17,6 +17,8 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
|
||||||
#include <asm/mach-au1x00/au1xxx.h>
|
#include <asm/mach-au1x00/au1xxx.h>
|
||||||
|
#include <asm/mach-au1x00/au1xxx_dbdma.h>
|
||||||
|
#include <asm/mach-au1x00/au1100_mmc.h>
|
||||||
|
|
||||||
#define PORT(_base, _irq) \
|
#define PORT(_base, _irq) \
|
||||||
{ \
|
{ \
|
||||||
|
@ -163,24 +165,6 @@ static struct resource au1xxx_usb_gdt_resources[] = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct resource au1xxx_mmc_resources[] = {
|
|
||||||
[0] = {
|
|
||||||
.start = SD0_PHYS_ADDR,
|
|
||||||
.end = SD0_PHYS_ADDR + 0x7ffff,
|
|
||||||
.flags = IORESOURCE_MEM,
|
|
||||||
},
|
|
||||||
[1] = {
|
|
||||||
.start = SD1_PHYS_ADDR,
|
|
||||||
.end = SD1_PHYS_ADDR + 0x7ffff,
|
|
||||||
.flags = IORESOURCE_MEM,
|
|
||||||
},
|
|
||||||
[2] = {
|
|
||||||
.start = AU1200_SD_INT,
|
|
||||||
.end = AU1200_SD_INT,
|
|
||||||
.flags = IORESOURCE_IRQ,
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static u64 udc_dmamask = DMA_32BIT_MASK;
|
static u64 udc_dmamask = DMA_32BIT_MASK;
|
||||||
|
|
||||||
static struct platform_device au1xxx_usb_gdt_device = {
|
static struct platform_device au1xxx_usb_gdt_device = {
|
||||||
|
@ -249,16 +233,79 @@ static struct platform_device au1200_lcd_device = {
|
||||||
|
|
||||||
static u64 au1xxx_mmc_dmamask = DMA_32BIT_MASK;
|
static u64 au1xxx_mmc_dmamask = DMA_32BIT_MASK;
|
||||||
|
|
||||||
static struct platform_device au1xxx_mmc_device = {
|
extern struct au1xmmc_platform_data au1xmmc_platdata[2];
|
||||||
|
|
||||||
|
static struct resource au1200_mmc0_resources[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = SD0_PHYS_ADDR,
|
||||||
|
.end = SD0_PHYS_ADDR + 0x7ffff,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.start = AU1200_SD_INT,
|
||||||
|
.end = AU1200_SD_INT,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
[2] = {
|
||||||
|
.start = DSCR_CMD0_SDMS_TX0,
|
||||||
|
.end = DSCR_CMD0_SDMS_TX0,
|
||||||
|
.flags = IORESOURCE_DMA,
|
||||||
|
},
|
||||||
|
[3] = {
|
||||||
|
.start = DSCR_CMD0_SDMS_RX0,
|
||||||
|
.end = DSCR_CMD0_SDMS_RX0,
|
||||||
|
.flags = IORESOURCE_DMA,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device au1200_mmc0_device = {
|
||||||
.name = "au1xxx-mmc",
|
.name = "au1xxx-mmc",
|
||||||
.id = 0,
|
.id = 0,
|
||||||
.dev = {
|
.dev = {
|
||||||
.dma_mask = &au1xxx_mmc_dmamask,
|
.dma_mask = &au1xxx_mmc_dmamask,
|
||||||
.coherent_dma_mask = DMA_32BIT_MASK,
|
.coherent_dma_mask = DMA_32BIT_MASK,
|
||||||
|
.platform_data = &au1xmmc_platdata[0],
|
||||||
},
|
},
|
||||||
.num_resources = ARRAY_SIZE(au1xxx_mmc_resources),
|
.num_resources = ARRAY_SIZE(au1200_mmc0_resources),
|
||||||
.resource = au1xxx_mmc_resources,
|
.resource = au1200_mmc0_resources,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifndef CONFIG_MIPS_DB1200
|
||||||
|
static struct resource au1200_mmc1_resources[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = SD1_PHYS_ADDR,
|
||||||
|
.end = SD1_PHYS_ADDR + 0x7ffff,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.start = AU1200_SD_INT,
|
||||||
|
.end = AU1200_SD_INT,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
[2] = {
|
||||||
|
.start = DSCR_CMD0_SDMS_TX1,
|
||||||
|
.end = DSCR_CMD0_SDMS_TX1,
|
||||||
|
.flags = IORESOURCE_DMA,
|
||||||
|
},
|
||||||
|
[3] = {
|
||||||
|
.start = DSCR_CMD0_SDMS_RX1,
|
||||||
|
.end = DSCR_CMD0_SDMS_RX1,
|
||||||
|
.flags = IORESOURCE_DMA,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device au1200_mmc1_device = {
|
||||||
|
.name = "au1xxx-mmc",
|
||||||
|
.id = 1,
|
||||||
|
.dev = {
|
||||||
|
.dma_mask = &au1xxx_mmc_dmamask,
|
||||||
|
.coherent_dma_mask = DMA_32BIT_MASK,
|
||||||
|
.platform_data = &au1xmmc_platdata[1],
|
||||||
|
},
|
||||||
|
.num_resources = ARRAY_SIZE(au1200_mmc1_resources),
|
||||||
|
.resource = au1200_mmc1_resources,
|
||||||
|
};
|
||||||
|
#endif /* #ifndef CONFIG_MIPS_DB1200 */
|
||||||
#endif /* #ifdef CONFIG_SOC_AU1200 */
|
#endif /* #ifdef CONFIG_SOC_AU1200 */
|
||||||
|
|
||||||
static struct platform_device au1x00_pcmcia_device = {
|
static struct platform_device au1x00_pcmcia_device = {
|
||||||
|
@ -296,7 +343,10 @@ static struct platform_device *au1xxx_platform_devices[] __initdata = {
|
||||||
&au1xxx_usb_gdt_device,
|
&au1xxx_usb_gdt_device,
|
||||||
&au1xxx_usb_otg_device,
|
&au1xxx_usb_otg_device,
|
||||||
&au1200_lcd_device,
|
&au1200_lcd_device,
|
||||||
&au1xxx_mmc_device,
|
&au1200_mmc0_device,
|
||||||
|
#ifndef CONFIG_MIPS_DB1200
|
||||||
|
&au1200_mmc1_device,
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#ifdef SMBUS_PSC_BASE
|
#ifdef SMBUS_PSC_BASE
|
||||||
&pbdb_smbus_device,
|
&pbdb_smbus_device,
|
||||||
|
|
|
@ -20,9 +20,90 @@
|
||||||
|
|
||||||
#include <linux/dma-mapping.h>
|
#include <linux/dma-mapping.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
#include <linux/leds.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
|
||||||
#include <asm/mach-au1x00/au1xxx.h>
|
#include <asm/mach-au1x00/au1xxx.h>
|
||||||
|
#include <asm/mach-au1x00/au1100_mmc.h>
|
||||||
|
|
||||||
|
static int mmc_activity;
|
||||||
|
|
||||||
|
static void pb1200mmc0_set_power(void *mmc_host, int state)
|
||||||
|
{
|
||||||
|
if (state)
|
||||||
|
bcsr->board |= BCSR_BOARD_SD0PWR;
|
||||||
|
else
|
||||||
|
bcsr->board &= ~BCSR_BOARD_SD0PWR;
|
||||||
|
|
||||||
|
au_sync_delay(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int pb1200mmc0_card_readonly(void *mmc_host)
|
||||||
|
{
|
||||||
|
return (bcsr->status & BCSR_STATUS_SD0WP) ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int pb1200mmc0_card_inserted(void *mmc_host)
|
||||||
|
{
|
||||||
|
return (bcsr->sig_status & BCSR_INT_SD0INSERT) ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pb1200_mmcled_set(struct led_classdev *led,
|
||||||
|
enum led_brightness brightness)
|
||||||
|
{
|
||||||
|
if (brightness != LED_OFF) {
|
||||||
|
if (++mmc_activity == 1)
|
||||||
|
bcsr->disk_leds &= ~(1 << 8);
|
||||||
|
} else {
|
||||||
|
if (--mmc_activity == 0)
|
||||||
|
bcsr->disk_leds |= (1 << 8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct led_classdev pb1200mmc_led = {
|
||||||
|
.brightness_set = pb1200_mmcled_set,
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifndef CONFIG_MIPS_DB1200
|
||||||
|
static void pb1200mmc1_set_power(void *mmc_host, int state)
|
||||||
|
{
|
||||||
|
if (state)
|
||||||
|
bcsr->board |= BCSR_BOARD_SD1PWR;
|
||||||
|
else
|
||||||
|
bcsr->board &= ~BCSR_BOARD_SD1PWR;
|
||||||
|
|
||||||
|
au_sync_delay(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int pb1200mmc1_card_readonly(void *mmc_host)
|
||||||
|
{
|
||||||
|
return (bcsr->status & BCSR_STATUS_SD1WP) ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int pb1200mmc1_card_inserted(void *mmc_host)
|
||||||
|
{
|
||||||
|
return (bcsr->sig_status & BCSR_INT_SD1INSERT) ? 1 : 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const struct au1xmmc_platform_data au1xmmc_platdata[2] = {
|
||||||
|
[0] = {
|
||||||
|
.set_power = pb1200mmc0_set_power,
|
||||||
|
.card_inserted = pb1200mmc0_card_inserted,
|
||||||
|
.card_readonly = pb1200mmc0_card_readonly,
|
||||||
|
.cd_setup = NULL, /* use poll-timer in driver */
|
||||||
|
.led = &pb1200mmc_led,
|
||||||
|
},
|
||||||
|
#ifndef CONFIG_MIPS_DB1200
|
||||||
|
[1] = {
|
||||||
|
.set_power = pb1200mmc1_set_power,
|
||||||
|
.card_inserted = pb1200mmc1_card_inserted,
|
||||||
|
.card_readonly = pb1200mmc1_card_readonly,
|
||||||
|
.cd_setup = NULL, /* use poll-timer in driver */
|
||||||
|
.led = &pb1200mmc_led,
|
||||||
|
},
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
static struct resource ide_resources[] = {
|
static struct resource ide_resources[] = {
|
||||||
[0] = {
|
[0] = {
|
||||||
|
|
1149
arch/mips/configs/pnx8335-stb225_defconfig
Normal file
1149
arch/mips/configs/pnx8335-stb225_defconfig
Normal file
File diff suppressed because it is too large
Load diff
29
arch/mips/emma/Kconfig
Normal file
29
arch/mips/emma/Kconfig
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
choice
|
||||||
|
prompt "Machine type"
|
||||||
|
depends on MACH_EMMA
|
||||||
|
default NEC_MARKEINS
|
||||||
|
|
||||||
|
config NEC_MARKEINS
|
||||||
|
bool "NEC EMMA2RH Mark-eins board"
|
||||||
|
select SOC_EMMA2RH
|
||||||
|
select HW_HAS_PCI
|
||||||
|
help
|
||||||
|
This enables support for the NEC Electronics Mark-eins boards.
|
||||||
|
|
||||||
|
endchoice
|
||||||
|
|
||||||
|
config SOC_EMMA2RH
|
||||||
|
bool
|
||||||
|
select SOC_EMMA
|
||||||
|
select SYS_HAS_CPU_R5500
|
||||||
|
select SYS_SUPPORTS_32BIT_KERNEL
|
||||||
|
select SYS_SUPPORTS_64BIT_KERNEL
|
||||||
|
|
||||||
|
config SOC_EMMA
|
||||||
|
bool
|
||||||
|
select CEVT_R4K
|
||||||
|
select CSRC_R4K
|
||||||
|
select DMA_NONCOHERENT
|
||||||
|
select IRQ_CPU
|
||||||
|
select SWAP_IO_SPACE
|
||||||
|
select SYS_SUPPORTS_BIG_ENDIAN
|
|
@ -10,4 +10,4 @@
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
|
|
||||||
obj-$(CONFIG_MARKEINS) += irq.o irq_emma2rh.o prom.o
|
obj-$(CONFIG_NEC_MARKEINS) += prom.o
|
|
@ -29,11 +29,11 @@
|
||||||
|
|
||||||
#include <asm/addrspace.h>
|
#include <asm/addrspace.h>
|
||||||
#include <asm/bootinfo.h>
|
#include <asm/bootinfo.h>
|
||||||
#include <asm/emma2rh/emma2rh.h>
|
#include <asm/emma/emma2rh.h>
|
||||||
|
|
||||||
const char *get_system_type(void)
|
const char *get_system_type(void)
|
||||||
{
|
{
|
||||||
#if defined(CONFIG_MARKEINS)
|
#ifdef CONFIG_NEC_MARKEINS
|
||||||
return "NEC EMMA2RH Mark-eins";
|
return "NEC EMMA2RH Mark-eins";
|
||||||
#else
|
#else
|
||||||
#error Unknown NEC board
|
#error Unknown NEC board
|
||||||
|
@ -60,7 +60,7 @@ void __init prom_init(void)
|
||||||
strcat(arcs_cmdline, " ");
|
strcat(arcs_cmdline, " ");
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(CONFIG_MARKEINS)
|
#ifdef CONFIG_NEC_MARKEINS
|
||||||
add_memory_region(0, EMMA2RH_RAM_SIZE, BOOT_MEM_RAM);
|
add_memory_region(0, EMMA2RH_RAM_SIZE, BOOT_MEM_RAM);
|
||||||
#else
|
#else
|
||||||
#error Unknown NEC board
|
#error Unknown NEC board
|
|
@ -10,4 +10,4 @@
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
#
|
#
|
||||||
|
|
||||||
obj-$(CONFIG_MARKEINS) += irq.o irq_markeins.o setup.o led.o platform.o
|
obj-$(CONFIG_NEC_MARKEINS) += irq.o setup.o led.o platform.o
|
331
arch/mips/emma/markeins/irq.c
Normal file
331
arch/mips/emma/markeins/irq.c
Normal file
|
@ -0,0 +1,331 @@
|
||||||
|
/*
|
||||||
|
* arch/mips/emma2rh/markeins/irq.c
|
||||||
|
* This file defines the irq handler for EMMA2RH.
|
||||||
|
*
|
||||||
|
* Copyright (C) NEC Electronics Corporation 2004-2006
|
||||||
|
*
|
||||||
|
* This file is based on the arch/mips/ddb5xxx/ddb5477/irq.c
|
||||||
|
*
|
||||||
|
* Copyright 2001 MontaVista Software 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
|
||||||
|
*/
|
||||||
|
#include <linux/init.h>
|
||||||
|
#include <linux/interrupt.h>
|
||||||
|
#include <linux/irq.h>
|
||||||
|
#include <linux/types.h>
|
||||||
|
#include <linux/ptrace.h>
|
||||||
|
#include <linux/delay.h>
|
||||||
|
|
||||||
|
#include <asm/irq_cpu.h>
|
||||||
|
#include <asm/system.h>
|
||||||
|
#include <asm/mipsregs.h>
|
||||||
|
#include <asm/addrspace.h>
|
||||||
|
#include <asm/bootinfo.h>
|
||||||
|
|
||||||
|
#include <asm/emma/emma2rh.h>
|
||||||
|
|
||||||
|
static void emma2rh_irq_enable(unsigned int irq)
|
||||||
|
{
|
||||||
|
u32 reg_value;
|
||||||
|
u32 reg_bitmask;
|
||||||
|
u32 reg_index;
|
||||||
|
|
||||||
|
irq -= EMMA2RH_IRQ_BASE;
|
||||||
|
|
||||||
|
reg_index = EMMA2RH_BHIF_INT_EN_0 +
|
||||||
|
(EMMA2RH_BHIF_INT_EN_1 - EMMA2RH_BHIF_INT_EN_0) * (irq / 32);
|
||||||
|
reg_value = emma2rh_in32(reg_index);
|
||||||
|
reg_bitmask = 0x1 << (irq % 32);
|
||||||
|
emma2rh_out32(reg_index, reg_value | reg_bitmask);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void emma2rh_irq_disable(unsigned int irq)
|
||||||
|
{
|
||||||
|
u32 reg_value;
|
||||||
|
u32 reg_bitmask;
|
||||||
|
u32 reg_index;
|
||||||
|
|
||||||
|
irq -= EMMA2RH_IRQ_BASE;
|
||||||
|
|
||||||
|
reg_index = EMMA2RH_BHIF_INT_EN_0 +
|
||||||
|
(EMMA2RH_BHIF_INT_EN_1 - EMMA2RH_BHIF_INT_EN_0) * (irq / 32);
|
||||||
|
reg_value = emma2rh_in32(reg_index);
|
||||||
|
reg_bitmask = 0x1 << (irq % 32);
|
||||||
|
emma2rh_out32(reg_index, reg_value & ~reg_bitmask);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct irq_chip emma2rh_irq_controller = {
|
||||||
|
.name = "emma2rh_irq",
|
||||||
|
.ack = emma2rh_irq_disable,
|
||||||
|
.mask = emma2rh_irq_disable,
|
||||||
|
.mask_ack = emma2rh_irq_disable,
|
||||||
|
.unmask = emma2rh_irq_enable,
|
||||||
|
};
|
||||||
|
|
||||||
|
void emma2rh_irq_init(void)
|
||||||
|
{
|
||||||
|
u32 i;
|
||||||
|
|
||||||
|
for (i = 0; i < NUM_EMMA2RH_IRQ; i++)
|
||||||
|
set_irq_chip_and_handler(EMMA2RH_IRQ_BASE + i,
|
||||||
|
&emma2rh_irq_controller,
|
||||||
|
handle_level_irq);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void emma2rh_sw_irq_enable(unsigned int irq)
|
||||||
|
{
|
||||||
|
u32 reg;
|
||||||
|
|
||||||
|
irq -= EMMA2RH_SW_IRQ_BASE;
|
||||||
|
|
||||||
|
reg = emma2rh_in32(EMMA2RH_BHIF_SW_INT_EN);
|
||||||
|
reg |= 1 << irq;
|
||||||
|
emma2rh_out32(EMMA2RH_BHIF_SW_INT_EN, reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void emma2rh_sw_irq_disable(unsigned int irq)
|
||||||
|
{
|
||||||
|
u32 reg;
|
||||||
|
|
||||||
|
irq -= EMMA2RH_SW_IRQ_BASE;
|
||||||
|
|
||||||
|
reg = emma2rh_in32(EMMA2RH_BHIF_SW_INT_EN);
|
||||||
|
reg &= ~(1 << irq);
|
||||||
|
emma2rh_out32(EMMA2RH_BHIF_SW_INT_EN, reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct irq_chip emma2rh_sw_irq_controller = {
|
||||||
|
.name = "emma2rh_sw_irq",
|
||||||
|
.ack = emma2rh_sw_irq_disable,
|
||||||
|
.mask = emma2rh_sw_irq_disable,
|
||||||
|
.mask_ack = emma2rh_sw_irq_disable,
|
||||||
|
.unmask = emma2rh_sw_irq_enable,
|
||||||
|
};
|
||||||
|
|
||||||
|
void emma2rh_sw_irq_init(void)
|
||||||
|
{
|
||||||
|
u32 i;
|
||||||
|
|
||||||
|
for (i = 0; i < NUM_EMMA2RH_IRQ_SW; i++)
|
||||||
|
set_irq_chip_and_handler(EMMA2RH_SW_IRQ_BASE + i,
|
||||||
|
&emma2rh_sw_irq_controller,
|
||||||
|
handle_level_irq);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void emma2rh_gpio_irq_enable(unsigned int irq)
|
||||||
|
{
|
||||||
|
u32 reg;
|
||||||
|
|
||||||
|
irq -= EMMA2RH_GPIO_IRQ_BASE;
|
||||||
|
|
||||||
|
reg = emma2rh_in32(EMMA2RH_GPIO_INT_MASK);
|
||||||
|
reg |= 1 << irq;
|
||||||
|
emma2rh_out32(EMMA2RH_GPIO_INT_MASK, reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void emma2rh_gpio_irq_disable(unsigned int irq)
|
||||||
|
{
|
||||||
|
u32 reg;
|
||||||
|
|
||||||
|
irq -= EMMA2RH_GPIO_IRQ_BASE;
|
||||||
|
|
||||||
|
reg = emma2rh_in32(EMMA2RH_GPIO_INT_MASK);
|
||||||
|
reg &= ~(1 << irq);
|
||||||
|
emma2rh_out32(EMMA2RH_GPIO_INT_MASK, reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void emma2rh_gpio_irq_ack(unsigned int irq)
|
||||||
|
{
|
||||||
|
u32 reg;
|
||||||
|
|
||||||
|
irq -= EMMA2RH_GPIO_IRQ_BASE;
|
||||||
|
emma2rh_out32(EMMA2RH_GPIO_INT_ST, ~(1 << irq));
|
||||||
|
|
||||||
|
reg = emma2rh_in32(EMMA2RH_GPIO_INT_MASK);
|
||||||
|
reg &= ~(1 << irq);
|
||||||
|
emma2rh_out32(EMMA2RH_GPIO_INT_MASK, reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void emma2rh_gpio_irq_end(unsigned int irq)
|
||||||
|
{
|
||||||
|
u32 reg;
|
||||||
|
|
||||||
|
if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS))) {
|
||||||
|
|
||||||
|
irq -= EMMA2RH_GPIO_IRQ_BASE;
|
||||||
|
|
||||||
|
reg = emma2rh_in32(EMMA2RH_GPIO_INT_MASK);
|
||||||
|
reg |= 1 << irq;
|
||||||
|
emma2rh_out32(EMMA2RH_GPIO_INT_MASK, reg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct irq_chip emma2rh_gpio_irq_controller = {
|
||||||
|
.name = "emma2rh_gpio_irq",
|
||||||
|
.ack = emma2rh_gpio_irq_ack,
|
||||||
|
.mask = emma2rh_gpio_irq_disable,
|
||||||
|
.mask_ack = emma2rh_gpio_irq_ack,
|
||||||
|
.unmask = emma2rh_gpio_irq_enable,
|
||||||
|
.end = emma2rh_gpio_irq_end,
|
||||||
|
};
|
||||||
|
|
||||||
|
void emma2rh_gpio_irq_init(void)
|
||||||
|
{
|
||||||
|
u32 i;
|
||||||
|
|
||||||
|
for (i = 0; i < NUM_EMMA2RH_IRQ_GPIO; i++)
|
||||||
|
set_irq_chip(EMMA2RH_GPIO_IRQ_BASE + i,
|
||||||
|
&emma2rh_gpio_irq_controller);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct irqaction irq_cascade = {
|
||||||
|
.handler = no_action,
|
||||||
|
.flags = 0,
|
||||||
|
.mask = CPU_MASK_NONE,
|
||||||
|
.name = "cascade",
|
||||||
|
.dev_id = NULL,
|
||||||
|
.next = NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* the first level int-handler will jump here if it is a emma2rh irq
|
||||||
|
*/
|
||||||
|
void emma2rh_irq_dispatch(void)
|
||||||
|
{
|
||||||
|
u32 intStatus;
|
||||||
|
u32 bitmask;
|
||||||
|
u32 i;
|
||||||
|
|
||||||
|
intStatus = emma2rh_in32(EMMA2RH_BHIF_INT_ST_0) &
|
||||||
|
emma2rh_in32(EMMA2RH_BHIF_INT_EN_0);
|
||||||
|
|
||||||
|
#ifdef EMMA2RH_SW_CASCADE
|
||||||
|
if (intStatus &
|
||||||
|
(1 << ((EMMA2RH_SW_CASCADE - EMMA2RH_IRQ_INT0) & (32 - 1)))) {
|
||||||
|
u32 swIntStatus;
|
||||||
|
swIntStatus = emma2rh_in32(EMMA2RH_BHIF_SW_INT)
|
||||||
|
& emma2rh_in32(EMMA2RH_BHIF_SW_INT_EN);
|
||||||
|
for (i = 0, bitmask = 1; i < 32; i++, bitmask <<= 1) {
|
||||||
|
if (swIntStatus & bitmask) {
|
||||||
|
do_IRQ(EMMA2RH_SW_IRQ_BASE + i);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (i = 0, bitmask = 1; i < 32; i++, bitmask <<= 1) {
|
||||||
|
if (intStatus & bitmask) {
|
||||||
|
do_IRQ(EMMA2RH_IRQ_BASE + i);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
intStatus = emma2rh_in32(EMMA2RH_BHIF_INT_ST_1) &
|
||||||
|
emma2rh_in32(EMMA2RH_BHIF_INT_EN_1);
|
||||||
|
|
||||||
|
#ifdef EMMA2RH_GPIO_CASCADE
|
||||||
|
if (intStatus &
|
||||||
|
(1 << ((EMMA2RH_GPIO_CASCADE - EMMA2RH_IRQ_INT0) & (32 - 1)))) {
|
||||||
|
u32 gpioIntStatus;
|
||||||
|
gpioIntStatus = emma2rh_in32(EMMA2RH_GPIO_INT_ST)
|
||||||
|
& emma2rh_in32(EMMA2RH_GPIO_INT_MASK);
|
||||||
|
for (i = 0, bitmask = 1; i < 32; i++, bitmask <<= 1) {
|
||||||
|
if (gpioIntStatus & bitmask) {
|
||||||
|
do_IRQ(EMMA2RH_GPIO_IRQ_BASE + i);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
for (i = 32, bitmask = 1; i < 64; i++, bitmask <<= 1) {
|
||||||
|
if (intStatus & bitmask) {
|
||||||
|
do_IRQ(EMMA2RH_IRQ_BASE + i);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
intStatus = emma2rh_in32(EMMA2RH_BHIF_INT_ST_2) &
|
||||||
|
emma2rh_in32(EMMA2RH_BHIF_INT_EN_2);
|
||||||
|
|
||||||
|
for (i = 64, bitmask = 1; i < 96; i++, bitmask <<= 1) {
|
||||||
|
if (intStatus & bitmask) {
|
||||||
|
do_IRQ(EMMA2RH_IRQ_BASE + i);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void __init arch_init_irq(void)
|
||||||
|
{
|
||||||
|
u32 reg;
|
||||||
|
|
||||||
|
/* by default, interrupts are disabled. */
|
||||||
|
emma2rh_out32(EMMA2RH_BHIF_INT_EN_0, 0);
|
||||||
|
emma2rh_out32(EMMA2RH_BHIF_INT_EN_1, 0);
|
||||||
|
emma2rh_out32(EMMA2RH_BHIF_INT_EN_2, 0);
|
||||||
|
emma2rh_out32(EMMA2RH_BHIF_INT1_EN_0, 0);
|
||||||
|
emma2rh_out32(EMMA2RH_BHIF_INT1_EN_1, 0);
|
||||||
|
emma2rh_out32(EMMA2RH_BHIF_INT1_EN_2, 0);
|
||||||
|
emma2rh_out32(EMMA2RH_BHIF_SW_INT_EN, 0);
|
||||||
|
|
||||||
|
clear_c0_status(0xff00);
|
||||||
|
set_c0_status(0x0400);
|
||||||
|
|
||||||
|
#define GPIO_PCI (0xf<<15)
|
||||||
|
/* setup GPIO interrupt for PCI interface */
|
||||||
|
/* direction input */
|
||||||
|
reg = emma2rh_in32(EMMA2RH_GPIO_DIR);
|
||||||
|
emma2rh_out32(EMMA2RH_GPIO_DIR, reg & ~GPIO_PCI);
|
||||||
|
/* disable interrupt */
|
||||||
|
reg = emma2rh_in32(EMMA2RH_GPIO_INT_MASK);
|
||||||
|
emma2rh_out32(EMMA2RH_GPIO_INT_MASK, reg & ~GPIO_PCI);
|
||||||
|
/* level triggerd */
|
||||||
|
reg = emma2rh_in32(EMMA2RH_GPIO_INT_MODE);
|
||||||
|
emma2rh_out32(EMMA2RH_GPIO_INT_MODE, reg | GPIO_PCI);
|
||||||
|
reg = emma2rh_in32(EMMA2RH_GPIO_INT_CND_A);
|
||||||
|
emma2rh_out32(EMMA2RH_GPIO_INT_CND_A, reg & (~GPIO_PCI));
|
||||||
|
/* interrupt clear */
|
||||||
|
emma2rh_out32(EMMA2RH_GPIO_INT_ST, ~GPIO_PCI);
|
||||||
|
|
||||||
|
/* init all controllers */
|
||||||
|
emma2rh_irq_init();
|
||||||
|
emma2rh_sw_irq_init();
|
||||||
|
emma2rh_gpio_irq_init();
|
||||||
|
mips_cpu_irq_init();
|
||||||
|
|
||||||
|
/* setup cascade interrupts */
|
||||||
|
setup_irq(EMMA2RH_IRQ_BASE + EMMA2RH_SW_CASCADE, &irq_cascade);
|
||||||
|
setup_irq(EMMA2RH_IRQ_BASE + EMMA2RH_GPIO_CASCADE, &irq_cascade);
|
||||||
|
setup_irq(CPU_IRQ_BASE + CPU_EMMA2RH_CASCADE, &irq_cascade);
|
||||||
|
}
|
||||||
|
|
||||||
|
asmlinkage void plat_irq_dispatch(void)
|
||||||
|
{
|
||||||
|
unsigned int pending = read_c0_status() & read_c0_cause() & ST0_IM;
|
||||||
|
|
||||||
|
if (pending & STATUSF_IP7)
|
||||||
|
do_IRQ(CPU_IRQ_BASE + 7);
|
||||||
|
else if (pending & STATUSF_IP2)
|
||||||
|
emma2rh_irq_dispatch();
|
||||||
|
else if (pending & STATUSF_IP1)
|
||||||
|
do_IRQ(CPU_IRQ_BASE + 1);
|
||||||
|
else if (pending & STATUSF_IP0)
|
||||||
|
do_IRQ(CPU_IRQ_BASE + 0);
|
||||||
|
else
|
||||||
|
spurious_interrupt();
|
||||||
|
}
|
|
@ -21,7 +21,7 @@
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
#include <asm/emma2rh/emma2rh.h>
|
#include <asm/emma/emma2rh.h>
|
||||||
|
|
||||||
const unsigned long clear = 0x20202020;
|
const unsigned long clear = 0x20202020;
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
#include <asm/reboot.h>
|
#include <asm/reboot.h>
|
||||||
#include <asm/traps.h>
|
#include <asm/traps.h>
|
||||||
|
|
||||||
#include <asm/emma2rh/emma2rh.h>
|
#include <asm/emma/emma2rh.h>
|
||||||
|
|
||||||
|
|
||||||
#define I2C_EMMA2RH "emma2rh-iic" /* must be in sync with IIC driver */
|
#define I2C_EMMA2RH "emma2rh-iic" /* must be in sync with IIC driver */
|
|
@ -29,7 +29,7 @@
|
||||||
#include <asm/time.h>
|
#include <asm/time.h>
|
||||||
#include <asm/reboot.h>
|
#include <asm/reboot.h>
|
||||||
|
|
||||||
#include <asm/emma2rh/emma2rh.h>
|
#include <asm/emma/emma2rh.h>
|
||||||
|
|
||||||
#define USE_CPU_COUNTER_TIMER /* whether we use cpu counter */
|
#define USE_CPU_COUNTER_TIMER /* whether we use cpu counter */
|
||||||
|
|
|
@ -1,105 +0,0 @@
|
||||||
/*
|
|
||||||
* arch/mips/emma2rh/common/irq.c
|
|
||||||
* This file is common irq dispatcher.
|
|
||||||
*
|
|
||||||
* Copyright (C) NEC Electronics Corporation 2005-2006
|
|
||||||
*
|
|
||||||
* This file is based on the arch/mips/ddb5xxx/ddb5477/irq.c
|
|
||||||
*
|
|
||||||
* Copyright 2001 MontaVista Software 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
|
|
||||||
*/
|
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/interrupt.h>
|
|
||||||
#include <linux/irq.h>
|
|
||||||
#include <linux/types.h>
|
|
||||||
|
|
||||||
#include <asm/system.h>
|
|
||||||
#include <asm/mipsregs.h>
|
|
||||||
#include <asm/addrspace.h>
|
|
||||||
#include <asm/bootinfo.h>
|
|
||||||
|
|
||||||
#include <asm/emma2rh/emma2rh.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* the first level int-handler will jump here if it is a emma2rh irq
|
|
||||||
*/
|
|
||||||
void emma2rh_irq_dispatch(void)
|
|
||||||
{
|
|
||||||
u32 intStatus;
|
|
||||||
u32 bitmask;
|
|
||||||
u32 i;
|
|
||||||
|
|
||||||
intStatus = emma2rh_in32(EMMA2RH_BHIF_INT_ST_0)
|
|
||||||
& emma2rh_in32(EMMA2RH_BHIF_INT_EN_0);
|
|
||||||
|
|
||||||
#ifdef EMMA2RH_SW_CASCADE
|
|
||||||
if (intStatus &
|
|
||||||
(1 << ((EMMA2RH_SW_CASCADE - EMMA2RH_IRQ_INT0) & (32 - 1)))) {
|
|
||||||
u32 swIntStatus;
|
|
||||||
swIntStatus = emma2rh_in32(EMMA2RH_BHIF_SW_INT)
|
|
||||||
& emma2rh_in32(EMMA2RH_BHIF_SW_INT_EN);
|
|
||||||
for (i = 0, bitmask = 1; i < 32; i++, bitmask <<= 1) {
|
|
||||||
if (swIntStatus & bitmask) {
|
|
||||||
do_IRQ(EMMA2RH_SW_IRQ_BASE + i);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (i = 0, bitmask = 1; i < 32; i++, bitmask <<= 1) {
|
|
||||||
if (intStatus & bitmask) {
|
|
||||||
do_IRQ(EMMA2RH_IRQ_BASE + i);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
intStatus = emma2rh_in32(EMMA2RH_BHIF_INT_ST_1)
|
|
||||||
& emma2rh_in32(EMMA2RH_BHIF_INT_EN_1);
|
|
||||||
|
|
||||||
#ifdef EMMA2RH_GPIO_CASCADE
|
|
||||||
if (intStatus &
|
|
||||||
(1 << ((EMMA2RH_GPIO_CASCADE - EMMA2RH_IRQ_INT0) & (32 - 1)))) {
|
|
||||||
u32 gpioIntStatus;
|
|
||||||
gpioIntStatus = emma2rh_in32(EMMA2RH_GPIO_INT_ST)
|
|
||||||
& emma2rh_in32(EMMA2RH_GPIO_INT_MASK);
|
|
||||||
for (i = 0, bitmask = 1; i < 32; i++, bitmask <<= 1) {
|
|
||||||
if (gpioIntStatus & bitmask) {
|
|
||||||
do_IRQ(EMMA2RH_GPIO_IRQ_BASE + i);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
for (i = 32, bitmask = 1; i < 64; i++, bitmask <<= 1) {
|
|
||||||
if (intStatus & bitmask) {
|
|
||||||
do_IRQ(EMMA2RH_IRQ_BASE + i);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
intStatus = emma2rh_in32(EMMA2RH_BHIF_INT_ST_2)
|
|
||||||
& emma2rh_in32(EMMA2RH_BHIF_INT_EN_2);
|
|
||||||
|
|
||||||
for (i = 64, bitmask = 1; i < 96; i++, bitmask <<= 1) {
|
|
||||||
if (intStatus & bitmask) {
|
|
||||||
do_IRQ(EMMA2RH_IRQ_BASE + i);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,106 +0,0 @@
|
||||||
/*
|
|
||||||
* arch/mips/emma2rh/common/irq_emma2rh.c
|
|
||||||
* This file defines the irq handler for EMMA2RH.
|
|
||||||
*
|
|
||||||
* Copyright (C) NEC Electronics Corporation 2005-2006
|
|
||||||
*
|
|
||||||
* This file is based on the arch/mips/ddb5xxx/ddb5477/irq_5477.c
|
|
||||||
*
|
|
||||||
* Copyright 2001 MontaVista Software 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
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* EMMA2RH defines 64 IRQs.
|
|
||||||
*
|
|
||||||
* This file exports one function:
|
|
||||||
* emma2rh_irq_init(u32 irq_base);
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/interrupt.h>
|
|
||||||
#include <linux/types.h>
|
|
||||||
#include <linux/ptrace.h>
|
|
||||||
|
|
||||||
#include <asm/debug.h>
|
|
||||||
|
|
||||||
#include <asm/emma2rh/emma2rh.h>
|
|
||||||
|
|
||||||
/* number of total irqs supported by EMMA2RH */
|
|
||||||
#define NUM_EMMA2RH_IRQ 96
|
|
||||||
|
|
||||||
static int emma2rh_irq_base = -1;
|
|
||||||
|
|
||||||
void ll_emma2rh_irq_enable(int);
|
|
||||||
void ll_emma2rh_irq_disable(int);
|
|
||||||
|
|
||||||
static void emma2rh_irq_enable(unsigned int irq)
|
|
||||||
{
|
|
||||||
ll_emma2rh_irq_enable(irq - emma2rh_irq_base);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void emma2rh_irq_disable(unsigned int irq)
|
|
||||||
{
|
|
||||||
ll_emma2rh_irq_disable(irq - emma2rh_irq_base);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct irq_chip emma2rh_irq_controller = {
|
|
||||||
.name = "emma2rh_irq",
|
|
||||||
.ack = emma2rh_irq_disable,
|
|
||||||
.mask = emma2rh_irq_disable,
|
|
||||||
.mask_ack = emma2rh_irq_disable,
|
|
||||||
.unmask = emma2rh_irq_enable,
|
|
||||||
};
|
|
||||||
|
|
||||||
void emma2rh_irq_init(u32 irq_base)
|
|
||||||
{
|
|
||||||
u32 i;
|
|
||||||
|
|
||||||
for (i = irq_base; i < irq_base + NUM_EMMA2RH_IRQ; i++)
|
|
||||||
set_irq_chip_and_handler(i, &emma2rh_irq_controller,
|
|
||||||
handle_level_irq);
|
|
||||||
|
|
||||||
emma2rh_irq_base = irq_base;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ll_emma2rh_irq_enable(int emma2rh_irq)
|
|
||||||
{
|
|
||||||
u32 reg_value;
|
|
||||||
u32 reg_bitmask;
|
|
||||||
u32 reg_index;
|
|
||||||
|
|
||||||
reg_index = EMMA2RH_BHIF_INT_EN_0
|
|
||||||
+ (EMMA2RH_BHIF_INT_EN_1 - EMMA2RH_BHIF_INT_EN_0)
|
|
||||||
* (emma2rh_irq / 32);
|
|
||||||
reg_value = emma2rh_in32(reg_index);
|
|
||||||
reg_bitmask = 0x1 << (emma2rh_irq % 32);
|
|
||||||
db_assert((reg_value & reg_bitmask) == 0);
|
|
||||||
emma2rh_out32(reg_index, reg_value | reg_bitmask);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ll_emma2rh_irq_disable(int emma2rh_irq)
|
|
||||||
{
|
|
||||||
u32 reg_value;
|
|
||||||
u32 reg_bitmask;
|
|
||||||
u32 reg_index;
|
|
||||||
|
|
||||||
reg_index = EMMA2RH_BHIF_INT_EN_0
|
|
||||||
+ (EMMA2RH_BHIF_INT_EN_1 - EMMA2RH_BHIF_INT_EN_0)
|
|
||||||
* (emma2rh_irq / 32);
|
|
||||||
reg_value = emma2rh_in32(reg_index);
|
|
||||||
reg_bitmask = 0x1 << (emma2rh_irq % 32);
|
|
||||||
db_assert((reg_value & reg_bitmask) != 0);
|
|
||||||
emma2rh_out32(reg_index, reg_value & ~reg_bitmask);
|
|
||||||
}
|
|
|
@ -1,132 +0,0 @@
|
||||||
/*
|
|
||||||
* arch/mips/emma2rh/markeins/irq.c
|
|
||||||
* This file defines the irq handler for EMMA2RH.
|
|
||||||
*
|
|
||||||
* Copyright (C) NEC Electronics Corporation 2004-2006
|
|
||||||
*
|
|
||||||
* This file is based on the arch/mips/ddb5xxx/ddb5477/irq.c
|
|
||||||
*
|
|
||||||
* Copyright 2001 MontaVista Software 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
|
|
||||||
*/
|
|
||||||
#include <linux/init.h>
|
|
||||||
#include <linux/interrupt.h>
|
|
||||||
#include <linux/irq.h>
|
|
||||||
#include <linux/types.h>
|
|
||||||
#include <linux/ptrace.h>
|
|
||||||
#include <linux/delay.h>
|
|
||||||
|
|
||||||
#include <asm/irq_cpu.h>
|
|
||||||
#include <asm/system.h>
|
|
||||||
#include <asm/mipsregs.h>
|
|
||||||
#include <asm/debug.h>
|
|
||||||
#include <asm/addrspace.h>
|
|
||||||
#include <asm/bootinfo.h>
|
|
||||||
|
|
||||||
#include <asm/emma2rh/emma2rh.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* IRQ mapping
|
|
||||||
*
|
|
||||||
* 0-7: 8 CPU interrupts
|
|
||||||
* 0 - software interrupt 0
|
|
||||||
* 1 - software interrupt 1
|
|
||||||
* 2 - most Vrc5477 interrupts are routed to this pin
|
|
||||||
* 3 - (optional) some other interrupts routed to this pin for debugg
|
|
||||||
* 4 - not used
|
|
||||||
* 5 - not used
|
|
||||||
* 6 - not used
|
|
||||||
* 7 - cpu timer (used by default)
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern void emma2rh_sw_irq_init(u32 base);
|
|
||||||
extern void emma2rh_gpio_irq_init(u32 base);
|
|
||||||
extern void emma2rh_irq_init(u32 base);
|
|
||||||
extern void emma2rh_irq_dispatch(void);
|
|
||||||
|
|
||||||
static struct irqaction irq_cascade = {
|
|
||||||
.handler = no_action,
|
|
||||||
.flags = 0,
|
|
||||||
.mask = CPU_MASK_NONE,
|
|
||||||
.name = "cascade",
|
|
||||||
.dev_id = NULL,
|
|
||||||
.next = NULL,
|
|
||||||
};
|
|
||||||
|
|
||||||
void __init arch_init_irq(void)
|
|
||||||
{
|
|
||||||
u32 reg;
|
|
||||||
|
|
||||||
db_run(printk("markeins_irq_setup invoked.\n"));
|
|
||||||
|
|
||||||
/* by default, interrupts are disabled. */
|
|
||||||
emma2rh_out32(EMMA2RH_BHIF_INT_EN_0, 0);
|
|
||||||
emma2rh_out32(EMMA2RH_BHIF_INT_EN_1, 0);
|
|
||||||
emma2rh_out32(EMMA2RH_BHIF_INT_EN_2, 0);
|
|
||||||
emma2rh_out32(EMMA2RH_BHIF_INT1_EN_0, 0);
|
|
||||||
emma2rh_out32(EMMA2RH_BHIF_INT1_EN_1, 0);
|
|
||||||
emma2rh_out32(EMMA2RH_BHIF_INT1_EN_2, 0);
|
|
||||||
emma2rh_out32(EMMA2RH_BHIF_SW_INT_EN, 0);
|
|
||||||
|
|
||||||
clear_c0_status(0xff00);
|
|
||||||
set_c0_status(0x0400);
|
|
||||||
|
|
||||||
#define GPIO_PCI (0xf<<15)
|
|
||||||
/* setup GPIO interrupt for PCI interface */
|
|
||||||
/* direction input */
|
|
||||||
reg = emma2rh_in32(EMMA2RH_GPIO_DIR);
|
|
||||||
emma2rh_out32(EMMA2RH_GPIO_DIR, reg & ~GPIO_PCI);
|
|
||||||
/* disable interrupt */
|
|
||||||
reg = emma2rh_in32(EMMA2RH_GPIO_INT_MASK);
|
|
||||||
emma2rh_out32(EMMA2RH_GPIO_INT_MASK, reg & ~GPIO_PCI);
|
|
||||||
/* level triggerd */
|
|
||||||
reg = emma2rh_in32(EMMA2RH_GPIO_INT_MODE);
|
|
||||||
emma2rh_out32(EMMA2RH_GPIO_INT_MODE, reg | GPIO_PCI);
|
|
||||||
reg = emma2rh_in32(EMMA2RH_GPIO_INT_CND_A);
|
|
||||||
emma2rh_out32(EMMA2RH_GPIO_INT_CND_A, reg & (~GPIO_PCI));
|
|
||||||
/* interrupt clear */
|
|
||||||
emma2rh_out32(EMMA2RH_GPIO_INT_ST, ~GPIO_PCI);
|
|
||||||
|
|
||||||
/* init all controllers */
|
|
||||||
emma2rh_irq_init(EMMA2RH_IRQ_BASE);
|
|
||||||
emma2rh_sw_irq_init(EMMA2RH_SW_IRQ_BASE);
|
|
||||||
emma2rh_gpio_irq_init(EMMA2RH_GPIO_IRQ_BASE);
|
|
||||||
mips_cpu_irq_init();
|
|
||||||
|
|
||||||
/* setup cascade interrupts */
|
|
||||||
setup_irq(EMMA2RH_IRQ_BASE + EMMA2RH_SW_CASCADE, &irq_cascade);
|
|
||||||
setup_irq(EMMA2RH_IRQ_BASE + EMMA2RH_GPIO_CASCADE, &irq_cascade);
|
|
||||||
setup_irq(CPU_IRQ_BASE + CPU_EMMA2RH_CASCADE, &irq_cascade);
|
|
||||||
}
|
|
||||||
|
|
||||||
asmlinkage void plat_irq_dispatch(void)
|
|
||||||
{
|
|
||||||
unsigned int pending = read_c0_status() & read_c0_cause() & ST0_IM;
|
|
||||||
|
|
||||||
if (pending & STATUSF_IP7)
|
|
||||||
do_IRQ(CPU_IRQ_BASE + 7);
|
|
||||||
else if (pending & STATUSF_IP2)
|
|
||||||
emma2rh_irq_dispatch();
|
|
||||||
else if (pending & STATUSF_IP1)
|
|
||||||
do_IRQ(CPU_IRQ_BASE + 1);
|
|
||||||
else if (pending & STATUSF_IP0)
|
|
||||||
do_IRQ(CPU_IRQ_BASE + 0);
|
|
||||||
else
|
|
||||||
spurious_interrupt();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -1,158 +0,0 @@
|
||||||
/*
|
|
||||||
* arch/mips/emma2rh/markeins/irq_markeins.c
|
|
||||||
* This file defines the irq handler for Mark-eins.
|
|
||||||
*
|
|
||||||
* Copyright (C) NEC Electronics Corporation 2004-2006
|
|
||||||
*
|
|
||||||
* This file is based on the arch/mips/ddb5xxx/ddb5477/irq_5477.c
|
|
||||||
*
|
|
||||||
* Copyright 2001 MontaVista Software 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
|
|
||||||
*/
|
|
||||||
#include <linux/interrupt.h>
|
|
||||||
#include <linux/irq.h>
|
|
||||||
#include <linux/types.h>
|
|
||||||
#include <linux/ptrace.h>
|
|
||||||
|
|
||||||
#include <asm/debug.h>
|
|
||||||
#include <asm/emma2rh/emma2rh.h>
|
|
||||||
|
|
||||||
static int emma2rh_sw_irq_base = -1;
|
|
||||||
static int emma2rh_gpio_irq_base = -1;
|
|
||||||
|
|
||||||
void ll_emma2rh_sw_irq_enable(int reg);
|
|
||||||
void ll_emma2rh_sw_irq_disable(int reg);
|
|
||||||
void ll_emma2rh_gpio_irq_enable(int reg);
|
|
||||||
void ll_emma2rh_gpio_irq_disable(int reg);
|
|
||||||
|
|
||||||
static void emma2rh_sw_irq_enable(unsigned int irq)
|
|
||||||
{
|
|
||||||
ll_emma2rh_sw_irq_enable(irq - emma2rh_sw_irq_base);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void emma2rh_sw_irq_disable(unsigned int irq)
|
|
||||||
{
|
|
||||||
ll_emma2rh_sw_irq_disable(irq - emma2rh_sw_irq_base);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct irq_chip emma2rh_sw_irq_controller = {
|
|
||||||
.name = "emma2rh_sw_irq",
|
|
||||||
.ack = emma2rh_sw_irq_disable,
|
|
||||||
.mask = emma2rh_sw_irq_disable,
|
|
||||||
.mask_ack = emma2rh_sw_irq_disable,
|
|
||||||
.unmask = emma2rh_sw_irq_enable,
|
|
||||||
};
|
|
||||||
|
|
||||||
void emma2rh_sw_irq_init(u32 irq_base)
|
|
||||||
{
|
|
||||||
u32 i;
|
|
||||||
|
|
||||||
for (i = irq_base; i < irq_base + NUM_EMMA2RH_IRQ_SW; i++)
|
|
||||||
set_irq_chip_and_handler(i, &emma2rh_sw_irq_controller,
|
|
||||||
handle_level_irq);
|
|
||||||
|
|
||||||
emma2rh_sw_irq_base = irq_base;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ll_emma2rh_sw_irq_enable(int irq)
|
|
||||||
{
|
|
||||||
u32 reg;
|
|
||||||
|
|
||||||
db_assert(irq >= 0);
|
|
||||||
db_assert(irq < NUM_EMMA2RH_IRQ_SW);
|
|
||||||
|
|
||||||
reg = emma2rh_in32(EMMA2RH_BHIF_SW_INT_EN);
|
|
||||||
reg |= 1 << irq;
|
|
||||||
emma2rh_out32(EMMA2RH_BHIF_SW_INT_EN, reg);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ll_emma2rh_sw_irq_disable(int irq)
|
|
||||||
{
|
|
||||||
u32 reg;
|
|
||||||
|
|
||||||
db_assert(irq >= 0);
|
|
||||||
db_assert(irq < 32);
|
|
||||||
|
|
||||||
reg = emma2rh_in32(EMMA2RH_BHIF_SW_INT_EN);
|
|
||||||
reg &= ~(1 << irq);
|
|
||||||
emma2rh_out32(EMMA2RH_BHIF_SW_INT_EN, reg);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void emma2rh_gpio_irq_enable(unsigned int irq)
|
|
||||||
{
|
|
||||||
ll_emma2rh_gpio_irq_enable(irq - emma2rh_gpio_irq_base);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void emma2rh_gpio_irq_disable(unsigned int irq)
|
|
||||||
{
|
|
||||||
ll_emma2rh_gpio_irq_disable(irq - emma2rh_gpio_irq_base);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void emma2rh_gpio_irq_ack(unsigned int irq)
|
|
||||||
{
|
|
||||||
irq -= emma2rh_gpio_irq_base;
|
|
||||||
emma2rh_out32(EMMA2RH_GPIO_INT_ST, ~(1 << irq));
|
|
||||||
ll_emma2rh_gpio_irq_disable(irq);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void emma2rh_gpio_irq_end(unsigned int irq)
|
|
||||||
{
|
|
||||||
if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS)))
|
|
||||||
ll_emma2rh_gpio_irq_enable(irq - emma2rh_gpio_irq_base);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct irq_chip emma2rh_gpio_irq_controller = {
|
|
||||||
.name = "emma2rh_gpio_irq",
|
|
||||||
.ack = emma2rh_gpio_irq_ack,
|
|
||||||
.mask = emma2rh_gpio_irq_disable,
|
|
||||||
.mask_ack = emma2rh_gpio_irq_ack,
|
|
||||||
.unmask = emma2rh_gpio_irq_enable,
|
|
||||||
.end = emma2rh_gpio_irq_end,
|
|
||||||
};
|
|
||||||
|
|
||||||
void emma2rh_gpio_irq_init(u32 irq_base)
|
|
||||||
{
|
|
||||||
u32 i;
|
|
||||||
|
|
||||||
for (i = irq_base; i < irq_base + NUM_EMMA2RH_IRQ_GPIO; i++)
|
|
||||||
set_irq_chip(i, &emma2rh_gpio_irq_controller);
|
|
||||||
|
|
||||||
emma2rh_gpio_irq_base = irq_base;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ll_emma2rh_gpio_irq_enable(int irq)
|
|
||||||
{
|
|
||||||
u32 reg;
|
|
||||||
|
|
||||||
db_assert(irq >= 0);
|
|
||||||
db_assert(irq < NUM_EMMA2RH_IRQ_GPIO);
|
|
||||||
|
|
||||||
reg = emma2rh_in32(EMMA2RH_GPIO_INT_MASK);
|
|
||||||
reg |= 1 << irq;
|
|
||||||
emma2rh_out32(EMMA2RH_GPIO_INT_MASK, reg);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ll_emma2rh_gpio_irq_disable(int irq)
|
|
||||||
{
|
|
||||||
u32 reg;
|
|
||||||
|
|
||||||
db_assert(irq >= 0);
|
|
||||||
db_assert(irq < NUM_EMMA2RH_IRQ_GPIO);
|
|
||||||
|
|
||||||
reg = emma2rh_in32(EMMA2RH_GPIO_INT_MASK);
|
|
||||||
reg &= ~(1 << irq);
|
|
||||||
emma2rh_out32(EMMA2RH_GPIO_INT_MASK, reg);
|
|
||||||
}
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* include/asm-mips/emma2rh/emma2rh.h
|
* arch/mips/include/asm/emma/emma2rh.h
|
||||||
* This file is EMMA2RH common header.
|
* This file is EMMA2RH common header.
|
||||||
*
|
*
|
||||||
* Copyright (C) NEC Electronics Corporation 2005-2006
|
* Copyright (C) NEC Electronics Corporation 2005-2006
|
||||||
|
@ -21,8 +21,8 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
*/
|
*/
|
||||||
#ifndef __ASM_EMMA2RH_EMMA2RH_H
|
#ifndef __ASM_EMMA_EMMA2RH_H
|
||||||
#define __ASM_EMMA2RH_EMMA2RH_H
|
#define __ASM_EMMA_EMMA2RH_H
|
||||||
|
|
||||||
#include <irq.h>
|
#include <irq.h>
|
||||||
|
|
||||||
|
@ -206,7 +206,6 @@ static inline void emma2rh_out32(u32 offset, u32 val)
|
||||||
static inline u32 emma2rh_in32(u32 offset)
|
static inline u32 emma2rh_in32(u32 offset)
|
||||||
{
|
{
|
||||||
u32 val = *(volatile u32 *)(EMMA2RH_BASE | offset);
|
u32 val = *(volatile u32 *)(EMMA2RH_BASE | offset);
|
||||||
emma2rh_sync();
|
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,7 +218,6 @@ static inline void emma2rh_out16(u32 offset, u16 val)
|
||||||
static inline u16 emma2rh_in16(u32 offset)
|
static inline u16 emma2rh_in16(u32 offset)
|
||||||
{
|
{
|
||||||
u16 val = *(volatile u16 *)(EMMA2RH_BASE | offset);
|
u16 val = *(volatile u16 *)(EMMA2RH_BASE | offset);
|
||||||
emma2rh_sync();
|
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -232,7 +230,6 @@ static inline void emma2rh_out8(u32 offset, u8 val)
|
||||||
static inline u8 emma2rh_in8(u32 offset)
|
static inline u8 emma2rh_in8(u32 offset)
|
||||||
{
|
{
|
||||||
u8 val = *(volatile u8 *)(EMMA2RH_BASE | offset);
|
u8 val = *(volatile u8 *)(EMMA2RH_BASE | offset);
|
||||||
emma2rh_sync();
|
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -324,10 +321,10 @@ static inline u8 emma2rh_in8(u32 offset)
|
||||||
/*
|
/*
|
||||||
* include the board dependent part
|
* include the board dependent part
|
||||||
*/
|
*/
|
||||||
#if defined(CONFIG_MARKEINS)
|
#ifdef CONFIG_NEC_MARKEINS
|
||||||
#include <asm/emma2rh/markeins.h>
|
#include <asm/emma/markeins.h>
|
||||||
#else
|
#else
|
||||||
#error "Unknown EMMA2RH board!"
|
#error "Unknown EMMA2RH board!"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* __ASM_EMMA2RH_EMMA2RH_H */
|
#endif /* __ASM_EMMA_EMMA2RH_H */
|
30
arch/mips/include/asm/mach-lemote/pci.h
Normal file
30
arch/mips/include/asm/mach-lemote/pci.h
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008 Zhang Le <r0bertz@gentoo.org>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it
|
||||||
|
* and/or modify it under the terms of the GNU General
|
||||||
|
* Public License as published by the Free Software
|
||||||
|
* Foundation; either version 2 of the License, or (at your
|
||||||
|
* option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be
|
||||||
|
* useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||||
|
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
||||||
|
* PURPOSE. See the GNU General Public License for more
|
||||||
|
* details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public
|
||||||
|
* License along with this program; if not, write to the Free
|
||||||
|
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA
|
||||||
|
* 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _LEMOTE_PCI_H_
|
||||||
|
#define _LEMOTE_PCI_H_
|
||||||
|
|
||||||
|
#define LOONGSON2E_PCI_MEM_START 0x14000000UL
|
||||||
|
#define LOONGSON2E_PCI_MEM_END 0x1fffffffUL
|
||||||
|
#define LOONGSON2E_PCI_IO_START 0x00004000UL
|
||||||
|
#define LOONGSON2E_IO_PORT_BASE 0x1fd00000UL
|
||||||
|
|
||||||
|
#endif /* !_LEMOTE_PCI_H_ */
|
172
arch/mips/include/asm/mach-pnx833x/gpio.h
Normal file
172
arch/mips/include/asm/mach-pnx833x/gpio.h
Normal file
|
@ -0,0 +1,172 @@
|
||||||
|
/*
|
||||||
|
* gpio.h: GPIO Support for PNX833X.
|
||||||
|
*
|
||||||
|
* Copyright 2008 NXP Semiconductors
|
||||||
|
* Chris Steel <chris.steel@nxp.com>
|
||||||
|
* Daniel Laird <daniel.j.laird@nxp.com>
|
||||||
|
*
|
||||||
|
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
#ifndef __ASM_MIPS_MACH_PNX833X_GPIO_H
|
||||||
|
#define __ASM_MIPS_MACH_PNX833X_GPIO_H
|
||||||
|
|
||||||
|
/* BIG FAT WARNING: races danger!
|
||||||
|
No protections exist here. Current users are only early init code,
|
||||||
|
when locking is not needed because no cuncurency yet exists there,
|
||||||
|
and GPIO IRQ dispatcher, which does locking.
|
||||||
|
However, if many uses will ever happen, proper locking will be needed
|
||||||
|
- including locking between different uses
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "pnx833x.h"
|
||||||
|
|
||||||
|
#define SET_REG_BIT(reg, bit) do { (reg |= (1 << (bit))); } while (0)
|
||||||
|
#define CLEAR_REG_BIT(reg, bit) do { (reg &= ~(1 << (bit))); } while (0)
|
||||||
|
|
||||||
|
/* Initialize GPIO to a known state */
|
||||||
|
static inline void pnx833x_gpio_init(void)
|
||||||
|
{
|
||||||
|
PNX833X_PIO_DIR = 0;
|
||||||
|
PNX833X_PIO_DIR2 = 0;
|
||||||
|
PNX833X_PIO_SEL = 0;
|
||||||
|
PNX833X_PIO_SEL2 = 0;
|
||||||
|
PNX833X_PIO_INT_EDGE = 0;
|
||||||
|
PNX833X_PIO_INT_HI = 0;
|
||||||
|
PNX833X_PIO_INT_LO = 0;
|
||||||
|
|
||||||
|
/* clear any GPIO interrupt requests */
|
||||||
|
PNX833X_PIO_INT_CLEAR = 0xffff;
|
||||||
|
PNX833X_PIO_INT_CLEAR = 0;
|
||||||
|
PNX833X_PIO_INT_ENABLE = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Select GPIO direction for a pin */
|
||||||
|
static inline void pnx833x_gpio_select_input(unsigned int pin)
|
||||||
|
{
|
||||||
|
if (pin < 32)
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_DIR, pin);
|
||||||
|
else
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_DIR2, pin & 31);
|
||||||
|
}
|
||||||
|
static inline void pnx833x_gpio_select_output(unsigned int pin)
|
||||||
|
{
|
||||||
|
if (pin < 32)
|
||||||
|
SET_REG_BIT(PNX833X_PIO_DIR, pin);
|
||||||
|
else
|
||||||
|
SET_REG_BIT(PNX833X_PIO_DIR2, pin & 31);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Select GPIO or alternate function for a pin */
|
||||||
|
static inline void pnx833x_gpio_select_function_io(unsigned int pin)
|
||||||
|
{
|
||||||
|
if (pin < 32)
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_SEL, pin);
|
||||||
|
else
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_SEL2, pin & 31);
|
||||||
|
}
|
||||||
|
static inline void pnx833x_gpio_select_function_alt(unsigned int pin)
|
||||||
|
{
|
||||||
|
if (pin < 32)
|
||||||
|
SET_REG_BIT(PNX833X_PIO_SEL, pin);
|
||||||
|
else
|
||||||
|
SET_REG_BIT(PNX833X_PIO_SEL2, pin & 31);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read GPIO pin */
|
||||||
|
static inline int pnx833x_gpio_read(unsigned int pin)
|
||||||
|
{
|
||||||
|
if (pin < 32)
|
||||||
|
return (PNX833X_PIO_IN >> pin) & 1;
|
||||||
|
else
|
||||||
|
return (PNX833X_PIO_IN2 >> (pin & 31)) & 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Write GPIO pin */
|
||||||
|
static inline void pnx833x_gpio_write(unsigned int val, unsigned int pin)
|
||||||
|
{
|
||||||
|
if (pin < 32) {
|
||||||
|
if (val)
|
||||||
|
SET_REG_BIT(PNX833X_PIO_OUT, pin);
|
||||||
|
else
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_OUT, pin);
|
||||||
|
} else {
|
||||||
|
if (val)
|
||||||
|
SET_REG_BIT(PNX833X_PIO_OUT2, pin & 31);
|
||||||
|
else
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_OUT2, pin & 31);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Configure GPIO interrupt */
|
||||||
|
#define GPIO_INT_NONE 0
|
||||||
|
#define GPIO_INT_LEVEL_LOW 1
|
||||||
|
#define GPIO_INT_LEVEL_HIGH 2
|
||||||
|
#define GPIO_INT_EDGE_RISING 3
|
||||||
|
#define GPIO_INT_EDGE_FALLING 4
|
||||||
|
#define GPIO_INT_EDGE_BOTH 5
|
||||||
|
static inline void pnx833x_gpio_setup_irq(int when, unsigned int pin)
|
||||||
|
{
|
||||||
|
switch (when) {
|
||||||
|
case GPIO_INT_LEVEL_LOW:
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_INT_EDGE, pin);
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_INT_HI, pin);
|
||||||
|
SET_REG_BIT(PNX833X_PIO_INT_LO, pin);
|
||||||
|
break;
|
||||||
|
case GPIO_INT_LEVEL_HIGH:
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_INT_EDGE, pin);
|
||||||
|
SET_REG_BIT(PNX833X_PIO_INT_HI, pin);
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_INT_LO, pin);
|
||||||
|
break;
|
||||||
|
case GPIO_INT_EDGE_RISING:
|
||||||
|
SET_REG_BIT(PNX833X_PIO_INT_EDGE, pin);
|
||||||
|
SET_REG_BIT(PNX833X_PIO_INT_HI, pin);
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_INT_LO, pin);
|
||||||
|
break;
|
||||||
|
case GPIO_INT_EDGE_FALLING:
|
||||||
|
SET_REG_BIT(PNX833X_PIO_INT_EDGE, pin);
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_INT_HI, pin);
|
||||||
|
SET_REG_BIT(PNX833X_PIO_INT_LO, pin);
|
||||||
|
break;
|
||||||
|
case GPIO_INT_EDGE_BOTH:
|
||||||
|
SET_REG_BIT(PNX833X_PIO_INT_EDGE, pin);
|
||||||
|
SET_REG_BIT(PNX833X_PIO_INT_HI, pin);
|
||||||
|
SET_REG_BIT(PNX833X_PIO_INT_LO, pin);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_INT_EDGE, pin);
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_INT_HI, pin);
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_INT_LO, pin);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Enable/disable GPIO interrupt */
|
||||||
|
static inline void pnx833x_gpio_enable_irq(unsigned int pin)
|
||||||
|
{
|
||||||
|
SET_REG_BIT(PNX833X_PIO_INT_ENABLE, pin);
|
||||||
|
}
|
||||||
|
static inline void pnx833x_gpio_disable_irq(unsigned int pin)
|
||||||
|
{
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_INT_ENABLE, pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Clear GPIO interrupt request */
|
||||||
|
static inline void pnx833x_gpio_clear_irq(unsigned int pin)
|
||||||
|
{
|
||||||
|
SET_REG_BIT(PNX833X_PIO_INT_CLEAR, pin);
|
||||||
|
CLEAR_REG_BIT(PNX833X_PIO_INT_CLEAR, pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
126
arch/mips/include/asm/mach-pnx833x/irq-mapping.h
Normal file
126
arch/mips/include/asm/mach-pnx833x/irq-mapping.h
Normal file
|
@ -0,0 +1,126 @@
|
||||||
|
|
||||||
|
/*
|
||||||
|
* irq.h: IRQ mappings for PNX833X.
|
||||||
|
*
|
||||||
|
* Copyright 2008 NXP Semiconductors
|
||||||
|
* Chris Steel <chris.steel@nxp.com>
|
||||||
|
* Daniel Laird <daniel.j.laird@nxp.com>
|
||||||
|
*
|
||||||
|
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __ASM_MIPS_MACH_PNX833X_IRQ_MAPPING_H
|
||||||
|
#define __ASM_MIPS_MACH_PNX833X_IRQ_MAPPING_H
|
||||||
|
/*
|
||||||
|
* The "IRQ numbers" are completely virtual.
|
||||||
|
*
|
||||||
|
* In PNX8330/1, we have 48 interrupt lines, numbered from 1 to 48.
|
||||||
|
* Let's use numbers 1..48 for PIC interrupts, number 0 for timer interrupt,
|
||||||
|
* numbers 49..64 for (virtual) GPIO interrupts.
|
||||||
|
*
|
||||||
|
* In PNX8335, we have 57 interrupt lines, numbered from 1 to 57,
|
||||||
|
* connected to PIC, which uses core hardware interrupt 2, and also
|
||||||
|
* a timer interrupt through hardware interrupt 5.
|
||||||
|
* Let's use numbers 1..64 for PIC interrupts, number 0 for timer interrupt,
|
||||||
|
* numbers 65..80 for (virtual) GPIO interrupts.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#include <irq.h>
|
||||||
|
|
||||||
|
#define PNX833X_TIMER_IRQ (MIPS_CPU_IRQ_BASE + 7)
|
||||||
|
|
||||||
|
/* Interrupts supported by PIC */
|
||||||
|
#define PNX833X_PIC_I2C0_INT (PNX833X_PIC_IRQ_BASE + 1)
|
||||||
|
#define PNX833X_PIC_I2C1_INT (PNX833X_PIC_IRQ_BASE + 2)
|
||||||
|
#define PNX833X_PIC_UART0_INT (PNX833X_PIC_IRQ_BASE + 3)
|
||||||
|
#define PNX833X_PIC_UART1_INT (PNX833X_PIC_IRQ_BASE + 4)
|
||||||
|
#define PNX833X_PIC_TS_IN0_DV_INT (PNX833X_PIC_IRQ_BASE + 5)
|
||||||
|
#define PNX833X_PIC_TS_IN0_DMA_INT (PNX833X_PIC_IRQ_BASE + 6)
|
||||||
|
#define PNX833X_PIC_GPIO_INT (PNX833X_PIC_IRQ_BASE + 7)
|
||||||
|
#define PNX833X_PIC_AUDIO_DEC_INT (PNX833X_PIC_IRQ_BASE + 8)
|
||||||
|
#define PNX833X_PIC_VIDEO_DEC_INT (PNX833X_PIC_IRQ_BASE + 9)
|
||||||
|
#define PNX833X_PIC_CONFIG_INT (PNX833X_PIC_IRQ_BASE + 10)
|
||||||
|
#define PNX833X_PIC_AOI_INT (PNX833X_PIC_IRQ_BASE + 11)
|
||||||
|
#define PNX833X_PIC_SYNC_INT (PNX833X_PIC_IRQ_BASE + 12)
|
||||||
|
#define PNX8330_PIC_SPU_INT (PNX833X_PIC_IRQ_BASE + 13)
|
||||||
|
#define PNX8335_PIC_SATA_INT (PNX833X_PIC_IRQ_BASE + 13)
|
||||||
|
#define PNX833X_PIC_OSD_INT (PNX833X_PIC_IRQ_BASE + 14)
|
||||||
|
#define PNX833X_PIC_DISP1_INT (PNX833X_PIC_IRQ_BASE + 15)
|
||||||
|
#define PNX833X_PIC_DEINTERLACER_INT (PNX833X_PIC_IRQ_BASE + 16)
|
||||||
|
#define PNX833X_PIC_DISPLAY2_INT (PNX833X_PIC_IRQ_BASE + 17)
|
||||||
|
#define PNX833X_PIC_VC_INT (PNX833X_PIC_IRQ_BASE + 18)
|
||||||
|
#define PNX833X_PIC_SC_INT (PNX833X_PIC_IRQ_BASE + 19)
|
||||||
|
#define PNX833X_PIC_IDE_INT (PNX833X_PIC_IRQ_BASE + 20)
|
||||||
|
#define PNX833X_PIC_IDE_DMA_INT (PNX833X_PIC_IRQ_BASE + 21)
|
||||||
|
#define PNX833X_PIC_TS_IN1_DV_INT (PNX833X_PIC_IRQ_BASE + 22)
|
||||||
|
#define PNX833X_PIC_TS_IN1_DMA_INT (PNX833X_PIC_IRQ_BASE + 23)
|
||||||
|
#define PNX833X_PIC_SGDX_DMA_INT (PNX833X_PIC_IRQ_BASE + 24)
|
||||||
|
#define PNX833X_PIC_TS_OUT_INT (PNX833X_PIC_IRQ_BASE + 25)
|
||||||
|
#define PNX833X_PIC_IR_INT (PNX833X_PIC_IRQ_BASE + 26)
|
||||||
|
#define PNX833X_PIC_VMSP1_INT (PNX833X_PIC_IRQ_BASE + 27)
|
||||||
|
#define PNX833X_PIC_VMSP2_INT (PNX833X_PIC_IRQ_BASE + 28)
|
||||||
|
#define PNX833X_PIC_PIBC_INT (PNX833X_PIC_IRQ_BASE + 29)
|
||||||
|
#define PNX833X_PIC_TS_IN0_TRD_INT (PNX833X_PIC_IRQ_BASE + 30)
|
||||||
|
#define PNX833X_PIC_SGDX_TPD_INT (PNX833X_PIC_IRQ_BASE + 31)
|
||||||
|
#define PNX833X_PIC_USB_INT (PNX833X_PIC_IRQ_BASE + 32)
|
||||||
|
#define PNX833X_PIC_TS_IN1_TRD_INT (PNX833X_PIC_IRQ_BASE + 33)
|
||||||
|
#define PNX833X_PIC_CLOCK_INT (PNX833X_PIC_IRQ_BASE + 34)
|
||||||
|
#define PNX833X_PIC_SGDX_PARSER_INT (PNX833X_PIC_IRQ_BASE + 35)
|
||||||
|
#define PNX833X_PIC_VMSP_DMA_INT (PNX833X_PIC_IRQ_BASE + 36)
|
||||||
|
|
||||||
|
#if defined(CONFIG_SOC_PNX8335)
|
||||||
|
#define PNX8335_PIC_MIU_INT (PNX833X_PIC_IRQ_BASE + 37)
|
||||||
|
#define PNX8335_PIC_AVCHIP_IRQ_INT (PNX833X_PIC_IRQ_BASE + 38)
|
||||||
|
#define PNX8335_PIC_SYNC_HD_INT (PNX833X_PIC_IRQ_BASE + 39)
|
||||||
|
#define PNX8335_PIC_DISP_HD_INT (PNX833X_PIC_IRQ_BASE + 40)
|
||||||
|
#define PNX8335_PIC_DISP_SCALER_INT (PNX833X_PIC_IRQ_BASE + 41)
|
||||||
|
#define PNX8335_PIC_OSD_HD1_INT (PNX833X_PIC_IRQ_BASE + 42)
|
||||||
|
#define PNX8335_PIC_DTL_WRITER_Y_INT (PNX833X_PIC_IRQ_BASE + 43)
|
||||||
|
#define PNX8335_PIC_DTL_WRITER_C_INT (PNX833X_PIC_IRQ_BASE + 44)
|
||||||
|
#define PNX8335_PIC_DTL_EMULATOR_Y_IR_INT (PNX833X_PIC_IRQ_BASE + 45)
|
||||||
|
#define PNX8335_PIC_DTL_EMULATOR_C_IR_INT (PNX833X_PIC_IRQ_BASE + 46)
|
||||||
|
#define PNX8335_PIC_DENC_TTX_INT (PNX833X_PIC_IRQ_BASE + 47)
|
||||||
|
#define PNX8335_PIC_MMI_SIF0_INT (PNX833X_PIC_IRQ_BASE + 48)
|
||||||
|
#define PNX8335_PIC_MMI_SIF1_INT (PNX833X_PIC_IRQ_BASE + 49)
|
||||||
|
#define PNX8335_PIC_MMI_CDMMU_INT (PNX833X_PIC_IRQ_BASE + 50)
|
||||||
|
#define PNX8335_PIC_PIBCS_INT (PNX833X_PIC_IRQ_BASE + 51)
|
||||||
|
#define PNX8335_PIC_ETHERNET_INT (PNX833X_PIC_IRQ_BASE + 52)
|
||||||
|
#define PNX8335_PIC_VMSP1_0_INT (PNX833X_PIC_IRQ_BASE + 53)
|
||||||
|
#define PNX8335_PIC_VMSP1_1_INT (PNX833X_PIC_IRQ_BASE + 54)
|
||||||
|
#define PNX8335_PIC_VMSP1_DMA_INT (PNX833X_PIC_IRQ_BASE + 55)
|
||||||
|
#define PNX8335_PIC_TDGR_DE_INT (PNX833X_PIC_IRQ_BASE + 56)
|
||||||
|
#define PNX8335_PIC_IR1_IRQ_INT (PNX833X_PIC_IRQ_BASE + 57)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* GPIO interrupts */
|
||||||
|
#define PNX833X_GPIO_0_INT (PNX833X_GPIO_IRQ_BASE + 0)
|
||||||
|
#define PNX833X_GPIO_1_INT (PNX833X_GPIO_IRQ_BASE + 1)
|
||||||
|
#define PNX833X_GPIO_2_INT (PNX833X_GPIO_IRQ_BASE + 2)
|
||||||
|
#define PNX833X_GPIO_3_INT (PNX833X_GPIO_IRQ_BASE + 3)
|
||||||
|
#define PNX833X_GPIO_4_INT (PNX833X_GPIO_IRQ_BASE + 4)
|
||||||
|
#define PNX833X_GPIO_5_INT (PNX833X_GPIO_IRQ_BASE + 5)
|
||||||
|
#define PNX833X_GPIO_6_INT (PNX833X_GPIO_IRQ_BASE + 6)
|
||||||
|
#define PNX833X_GPIO_7_INT (PNX833X_GPIO_IRQ_BASE + 7)
|
||||||
|
#define PNX833X_GPIO_8_INT (PNX833X_GPIO_IRQ_BASE + 8)
|
||||||
|
#define PNX833X_GPIO_9_INT (PNX833X_GPIO_IRQ_BASE + 9)
|
||||||
|
#define PNX833X_GPIO_10_INT (PNX833X_GPIO_IRQ_BASE + 10)
|
||||||
|
#define PNX833X_GPIO_11_INT (PNX833X_GPIO_IRQ_BASE + 11)
|
||||||
|
#define PNX833X_GPIO_12_INT (PNX833X_GPIO_IRQ_BASE + 12)
|
||||||
|
#define PNX833X_GPIO_13_INT (PNX833X_GPIO_IRQ_BASE + 13)
|
||||||
|
#define PNX833X_GPIO_14_INT (PNX833X_GPIO_IRQ_BASE + 14)
|
||||||
|
#define PNX833X_GPIO_15_INT (PNX833X_GPIO_IRQ_BASE + 15)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
53
arch/mips/include/asm/mach-pnx833x/irq.h
Normal file
53
arch/mips/include/asm/mach-pnx833x/irq.h
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
/*
|
||||||
|
* irq.h: IRQ mappings for PNX833X.
|
||||||
|
*
|
||||||
|
* Copyright 2008 NXP Semiconductors
|
||||||
|
* Chris Steel <chris.steel@nxp.com>
|
||||||
|
* Daniel Laird <daniel.j.laird@nxp.com>
|
||||||
|
*
|
||||||
|
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __ASM_MIPS_MACH_PNX833X_IRQ_H
|
||||||
|
#define __ASM_MIPS_MACH_PNX833X_IRQ_H
|
||||||
|
/*
|
||||||
|
* The "IRQ numbers" are completely virtual.
|
||||||
|
*
|
||||||
|
* In PNX8330/1, we have 48 interrupt lines, numbered from 1 to 48.
|
||||||
|
* Let's use numbers 1..48 for PIC interrupts, number 0 for timer interrupt,
|
||||||
|
* numbers 49..64 for (virtual) GPIO interrupts.
|
||||||
|
*
|
||||||
|
* In PNX8335, we have 57 interrupt lines, numbered from 1 to 57,
|
||||||
|
* connected to PIC, which uses core hardware interrupt 2, and also
|
||||||
|
* a timer interrupt through hardware interrupt 5.
|
||||||
|
* Let's use numbers 1..64 for PIC interrupts, number 0 for timer interrupt,
|
||||||
|
* numbers 65..80 for (virtual) GPIO interrupts.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#if defined(CONFIG_SOC_PNX8335)
|
||||||
|
#define PNX833X_PIC_NUM_IRQ 58
|
||||||
|
#else
|
||||||
|
#define PNX833X_PIC_NUM_IRQ 37
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define MIPS_CPU_NUM_IRQ 8
|
||||||
|
#define PNX833X_GPIO_NUM_IRQ 16
|
||||||
|
|
||||||
|
#define MIPS_CPU_IRQ_BASE 0
|
||||||
|
#define PNX833X_PIC_IRQ_BASE (MIPS_CPU_IRQ_BASE + MIPS_CPU_NUM_IRQ)
|
||||||
|
#define PNX833X_GPIO_IRQ_BASE (PNX833X_PIC_IRQ_BASE + PNX833X_PIC_NUM_IRQ)
|
||||||
|
#define NR_IRQS (MIPS_CPU_NUM_IRQ + PNX833X_PIC_NUM_IRQ + PNX833X_GPIO_NUM_IRQ)
|
||||||
|
|
||||||
|
#endif
|
202
arch/mips/include/asm/mach-pnx833x/pnx833x.h
Normal file
202
arch/mips/include/asm/mach-pnx833x/pnx833x.h
Normal file
|
@ -0,0 +1,202 @@
|
||||||
|
/*
|
||||||
|
* pnx833x.h: Register mappings for PNX833X.
|
||||||
|
*
|
||||||
|
* Copyright 2008 NXP Semiconductors
|
||||||
|
* Chris Steel <chris.steel@nxp.com>
|
||||||
|
* Daniel Laird <daniel.j.laird@nxp.com>
|
||||||
|
*
|
||||||
|
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
#ifndef __ASM_MIPS_MACH_PNX833X_PNX833X_H
|
||||||
|
#define __ASM_MIPS_MACH_PNX833X_PNX833X_H
|
||||||
|
|
||||||
|
/* All regs are accessed in KSEG1 */
|
||||||
|
#define PNX833X_BASE (0xa0000000ul + 0x17E00000ul)
|
||||||
|
|
||||||
|
#define PNX833X_REG(offs) (*((volatile unsigned long *)(PNX833X_BASE + offs)))
|
||||||
|
|
||||||
|
/* Registers are named exactly as in PNX833X docs, just with PNX833X_ prefix */
|
||||||
|
|
||||||
|
/* Read access to multibit fields */
|
||||||
|
#define PNX833X_BIT(val, reg, field) ((val) & PNX833X_##reg##_##field)
|
||||||
|
#define PNX833X_REGBIT(reg, field) PNX833X_BIT(PNX833X_##reg, reg, field)
|
||||||
|
|
||||||
|
/* Use PNX833X_FIELD to extract a field from val */
|
||||||
|
#define PNX_FIELD(cpu, val, reg, field) \
|
||||||
|
(((val) & PNX##cpu##_##reg##_##field##_MASK) >> \
|
||||||
|
PNX##cpu##_##reg##_##field##_SHIFT)
|
||||||
|
#define PNX833X_FIELD(val, reg, field) PNX_FIELD(833X, val, reg, field)
|
||||||
|
#define PNX8330_FIELD(val, reg, field) PNX_FIELD(8330, val, reg, field)
|
||||||
|
#define PNX8335_FIELD(val, reg, field) PNX_FIELD(8335, val, reg, field)
|
||||||
|
|
||||||
|
/* Use PNX833X_REGFIELD to extract a field from a register */
|
||||||
|
#define PNX833X_REGFIELD(reg, field) PNX833X_FIELD(PNX833X_##reg, reg, field)
|
||||||
|
#define PNX8330_REGFIELD(reg, field) PNX8330_FIELD(PNX8330_##reg, reg, field)
|
||||||
|
#define PNX8335_REGFIELD(reg, field) PNX8335_FIELD(PNX8335_##reg, reg, field)
|
||||||
|
|
||||||
|
|
||||||
|
#define PNX_WRITEFIELD(cpu, val, reg, field) \
|
||||||
|
(PNX##cpu##_##reg = (PNX##cpu##_##reg & ~(PNX##cpu##_##reg##_##field##_MASK)) | \
|
||||||
|
((val) << PNX##cpu##_##reg##_##field##_SHIFT))
|
||||||
|
#define PNX833X_WRITEFIELD(val, reg, field) \
|
||||||
|
PNX_WRITEFIELD(833X, val, reg, field)
|
||||||
|
#define PNX8330_WRITEFIELD(val, reg, field) \
|
||||||
|
PNX_WRITEFIELD(8330, val, reg, field)
|
||||||
|
#define PNX8335_WRITEFIELD(val, reg, field) \
|
||||||
|
PNX_WRITEFIELD(8335, val, reg, field)
|
||||||
|
|
||||||
|
|
||||||
|
/* Macros to detect CPU type */
|
||||||
|
|
||||||
|
#define PNX833X_CONFIG_MODULE_ID PNX833X_REG(0x7FFC)
|
||||||
|
#define PNX833X_CONFIG_MODULE_ID_MAJREV_MASK 0x0000f000
|
||||||
|
#define PNX833X_CONFIG_MODULE_ID_MAJREV_SHIFT 12
|
||||||
|
#define PNX8330_CONFIG_MODULE_MAJREV 4
|
||||||
|
#define PNX8335_CONFIG_MODULE_MAJREV 5
|
||||||
|
#define CPU_IS_PNX8330 (PNX833X_REGFIELD(CONFIG_MODULE_ID, MAJREV) == \
|
||||||
|
PNX8330_CONFIG_MODULE_MAJREV)
|
||||||
|
#define CPU_IS_PNX8335 (PNX833X_REGFIELD(CONFIG_MODULE_ID, MAJREV) == \
|
||||||
|
PNX8335_CONFIG_MODULE_MAJREV)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define PNX833X_RESET_CONTROL PNX833X_REG(0x8004)
|
||||||
|
#define PNX833X_RESET_CONTROL_2 PNX833X_REG(0x8014)
|
||||||
|
|
||||||
|
#define PNX833X_PIC_REG(offs) PNX833X_REG(0x01000 + (offs))
|
||||||
|
#define PNX833X_PIC_INT_PRIORITY PNX833X_PIC_REG(0x0)
|
||||||
|
#define PNX833X_PIC_INT_SRC PNX833X_PIC_REG(0x4)
|
||||||
|
#define PNX833X_PIC_INT_SRC_INT_SRC_MASK 0x00000FF8ul /* bits 11:3 */
|
||||||
|
#define PNX833X_PIC_INT_SRC_INT_SRC_SHIFT 3
|
||||||
|
#define PNX833X_PIC_INT_REG(irq) PNX833X_PIC_REG(0x10 + 4*(irq))
|
||||||
|
|
||||||
|
#define PNX833X_CLOCK_CPUCP_CTL PNX833X_REG(0x9228)
|
||||||
|
#define PNX833X_CLOCK_CPUCP_CTL_EXIT_RESET 0x00000002ul /* bit 1 */
|
||||||
|
#define PNX833X_CLOCK_CPUCP_CTL_DIV_CLOCK_MASK 0x00000018ul /* bits 4:3 */
|
||||||
|
#define PNX833X_CLOCK_CPUCP_CTL_DIV_CLOCK_SHIFT 3
|
||||||
|
|
||||||
|
#define PNX8335_CLOCK_PLL_CPU_CTL PNX833X_REG(0x9020)
|
||||||
|
#define PNX8335_CLOCK_PLL_CPU_CTL_FREQ_MASK 0x1f
|
||||||
|
#define PNX8335_CLOCK_PLL_CPU_CTL_FREQ_SHIFT 0
|
||||||
|
|
||||||
|
#define PNX833X_CONFIG_MUX PNX833X_REG(0x7004)
|
||||||
|
#define PNX833X_CONFIG_MUX_IDE_MUX 0x00000080 /* bit 7 */
|
||||||
|
|
||||||
|
#define PNX8330_CONFIG_POLYFUSE_7 PNX833X_REG(0x7040)
|
||||||
|
#define PNX8330_CONFIG_POLYFUSE_7_BOOT_MODE_MASK 0x00180000
|
||||||
|
#define PNX8330_CONFIG_POLYFUSE_7_BOOT_MODE_SHIFT 19
|
||||||
|
|
||||||
|
#define PNX833X_PIO_IN PNX833X_REG(0xF000)
|
||||||
|
#define PNX833X_PIO_OUT PNX833X_REG(0xF004)
|
||||||
|
#define PNX833X_PIO_DIR PNX833X_REG(0xF008)
|
||||||
|
#define PNX833X_PIO_SEL PNX833X_REG(0xF014)
|
||||||
|
#define PNX833X_PIO_INT_EDGE PNX833X_REG(0xF020)
|
||||||
|
#define PNX833X_PIO_INT_HI PNX833X_REG(0xF024)
|
||||||
|
#define PNX833X_PIO_INT_LO PNX833X_REG(0xF028)
|
||||||
|
#define PNX833X_PIO_INT_STATUS PNX833X_REG(0xFFE0)
|
||||||
|
#define PNX833X_PIO_INT_ENABLE PNX833X_REG(0xFFE4)
|
||||||
|
#define PNX833X_PIO_INT_CLEAR PNX833X_REG(0xFFE8)
|
||||||
|
#define PNX833X_PIO_IN2 PNX833X_REG(0xF05C)
|
||||||
|
#define PNX833X_PIO_OUT2 PNX833X_REG(0xF060)
|
||||||
|
#define PNX833X_PIO_DIR2 PNX833X_REG(0xF064)
|
||||||
|
#define PNX833X_PIO_SEL2 PNX833X_REG(0xF068)
|
||||||
|
|
||||||
|
#define PNX833X_UART0_PORTS_START (PNX833X_BASE + 0xB000)
|
||||||
|
#define PNX833X_UART0_PORTS_END (PNX833X_BASE + 0xBFFF)
|
||||||
|
#define PNX833X_UART1_PORTS_START (PNX833X_BASE + 0xC000)
|
||||||
|
#define PNX833X_UART1_PORTS_END (PNX833X_BASE + 0xCFFF)
|
||||||
|
|
||||||
|
#define PNX833X_USB_PORTS_START (PNX833X_BASE + 0x19000)
|
||||||
|
#define PNX833X_USB_PORTS_END (PNX833X_BASE + 0x19FFF)
|
||||||
|
|
||||||
|
#define PNX833X_CONFIG_USB PNX833X_REG(0x7008)
|
||||||
|
|
||||||
|
#define PNX833X_I2C0_PORTS_START (PNX833X_BASE + 0xD000)
|
||||||
|
#define PNX833X_I2C0_PORTS_END (PNX833X_BASE + 0xDFFF)
|
||||||
|
#define PNX833X_I2C1_PORTS_START (PNX833X_BASE + 0xE000)
|
||||||
|
#define PNX833X_I2C1_PORTS_END (PNX833X_BASE + 0xEFFF)
|
||||||
|
|
||||||
|
#define PNX833X_IDE_PORTS_START (PNX833X_BASE + 0x1A000)
|
||||||
|
#define PNX833X_IDE_PORTS_END (PNX833X_BASE + 0x1AFFF)
|
||||||
|
#define PNX833X_IDE_MODULE_ID PNX833X_REG(0x1AFFC)
|
||||||
|
|
||||||
|
#define PNX833X_IDE_MODULE_ID_MODULE_ID_MASK 0xFFFF0000
|
||||||
|
#define PNX833X_IDE_MODULE_ID_MODULE_ID_SHIFT 16
|
||||||
|
#define PNX833X_IDE_MODULE_ID_VALUE 0xA009
|
||||||
|
|
||||||
|
|
||||||
|
#define PNX833X_MIU_SEL0 PNX833X_REG(0x2004)
|
||||||
|
#define PNX833X_MIU_SEL0_TIMING PNX833X_REG(0x2008)
|
||||||
|
#define PNX833X_MIU_SEL1 PNX833X_REG(0x200C)
|
||||||
|
#define PNX833X_MIU_SEL1_TIMING PNX833X_REG(0x2010)
|
||||||
|
#define PNX833X_MIU_SEL2 PNX833X_REG(0x2014)
|
||||||
|
#define PNX833X_MIU_SEL2_TIMING PNX833X_REG(0x2018)
|
||||||
|
#define PNX833X_MIU_SEL3 PNX833X_REG(0x201C)
|
||||||
|
#define PNX833X_MIU_SEL3_TIMING PNX833X_REG(0x2020)
|
||||||
|
|
||||||
|
#define PNX833X_MIU_SEL0_SPI_MODE_ENABLE_MASK (1 << 14)
|
||||||
|
#define PNX833X_MIU_SEL0_SPI_MODE_ENABLE_SHIFT 14
|
||||||
|
|
||||||
|
#define PNX833X_MIU_SEL0_BURST_MODE_ENABLE_MASK (1 << 7)
|
||||||
|
#define PNX833X_MIU_SEL0_BURST_MODE_ENABLE_SHIFT 7
|
||||||
|
|
||||||
|
#define PNX833X_MIU_SEL0_BURST_PAGE_LEN_MASK (0xF << 9)
|
||||||
|
#define PNX833X_MIU_SEL0_BURST_PAGE_LEN_SHIFT 9
|
||||||
|
|
||||||
|
#define PNX833X_MIU_CONFIG_SPI PNX833X_REG(0x2000)
|
||||||
|
|
||||||
|
#define PNX833X_MIU_CONFIG_SPI_OPCODE_MASK (0xFF << 3)
|
||||||
|
#define PNX833X_MIU_CONFIG_SPI_OPCODE_SHIFT 3
|
||||||
|
|
||||||
|
#define PNX833X_MIU_CONFIG_SPI_DATA_ENABLE_MASK (1 << 2)
|
||||||
|
#define PNX833X_MIU_CONFIG_SPI_DATA_ENABLE_SHIFT 2
|
||||||
|
|
||||||
|
#define PNX833X_MIU_CONFIG_SPI_ADDR_ENABLE_MASK (1 << 1)
|
||||||
|
#define PNX833X_MIU_CONFIG_SPI_ADDR_ENABLE_SHIFT 1
|
||||||
|
|
||||||
|
#define PNX833X_MIU_CONFIG_SPI_SYNC_MASK (1 << 0)
|
||||||
|
#define PNX833X_MIU_CONFIG_SPI_SYNC_SHIFT 0
|
||||||
|
|
||||||
|
#define PNX833X_WRITE_CONFIG_SPI(opcode, data_enable, addr_enable, sync) \
|
||||||
|
(PNX833X_MIU_CONFIG_SPI = \
|
||||||
|
((opcode) << PNX833X_MIU_CONFIG_SPI_OPCODE_SHIFT) | \
|
||||||
|
((data_enable) << PNX833X_MIU_CONFIG_SPI_DATA_ENABLE_SHIFT) | \
|
||||||
|
((addr_enable) << PNX833X_MIU_CONFIG_SPI_ADDR_ENABLE_SHIFT) | \
|
||||||
|
((sync) << PNX833X_MIU_CONFIG_SPI_SYNC_SHIFT))
|
||||||
|
|
||||||
|
#define PNX8335_IP3902_PORTS_START (PNX833X_BASE + 0x2F000)
|
||||||
|
#define PNX8335_IP3902_PORTS_END (PNX833X_BASE + 0x2FFFF)
|
||||||
|
#define PNX8335_IP3902_MODULE_ID PNX833X_REG(0x2FFFC)
|
||||||
|
|
||||||
|
#define PNX8335_IP3902_MODULE_ID_MODULE_ID_MASK 0xFFFF0000
|
||||||
|
#define PNX8335_IP3902_MODULE_ID_MODULE_ID_SHIFT 16
|
||||||
|
#define PNX8335_IP3902_MODULE_ID_VALUE 0x3902
|
||||||
|
|
||||||
|
/* I/O location(gets remapped)*/
|
||||||
|
#define PNX8335_NAND_BASE 0x18000000
|
||||||
|
/* I/O location with CLE high */
|
||||||
|
#define PNX8335_NAND_CLE_MASK 0x00100000
|
||||||
|
/* I/O location with ALE high */
|
||||||
|
#define PNX8335_NAND_ALE_MASK 0x00010000
|
||||||
|
|
||||||
|
#define PNX8335_SATA_PORTS_START (PNX833X_BASE + 0x2E000)
|
||||||
|
#define PNX8335_SATA_PORTS_END (PNX833X_BASE + 0x2EFFF)
|
||||||
|
#define PNX8335_SATA_MODULE_ID PNX833X_REG(0x2EFFC)
|
||||||
|
|
||||||
|
#define PNX8335_SATA_MODULE_ID_MODULE_ID_MASK 0xFFFF0000
|
||||||
|
#define PNX8335_SATA_MODULE_ID_MODULE_ID_SHIFT 16
|
||||||
|
#define PNX8335_SATA_MODULE_ID_VALUE 0xA099
|
||||||
|
|
||||||
|
#endif
|
25
arch/mips/include/asm/mach-pnx833x/war.h
Normal file
25
arch/mips/include/asm/mach-pnx833x/war.h
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
/*
|
||||||
|
* This file is subject to the terms and conditions of the GNU General Public
|
||||||
|
* License. See the file "COPYING" in the main directory of this archive
|
||||||
|
* for more details.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2002, 2004, 2007 by Ralf Baechle <ralf@linux-mips.org>
|
||||||
|
*/
|
||||||
|
#ifndef __ASM_MIPS_MACH_PNX833X_WAR_H
|
||||||
|
#define __ASM_MIPS_MACH_PNX833X_WAR_H
|
||||||
|
|
||||||
|
#define R4600_V1_INDEX_ICACHEOP_WAR 0
|
||||||
|
#define R4600_V1_HIT_CACHEOP_WAR 0
|
||||||
|
#define R4600_V2_HIT_CACHEOP_WAR 0
|
||||||
|
#define R5432_CP0_INTERRUPT_WAR 0
|
||||||
|
#define BCM1250_M3_WAR 0
|
||||||
|
#define SIBYTE_1956_WAR 0
|
||||||
|
#define MIPS4K_ICACHE_REFILL_WAR 0
|
||||||
|
#define MIPS_CACHE_SYNC_WAR 0
|
||||||
|
#define TX49XX_ICACHE_INDEX_INV_WAR 0
|
||||||
|
#define RM9000_CDEX_SMP_WAR 0
|
||||||
|
#define ICACHE_REFILLS_WORKAROUND_WAR 0
|
||||||
|
#define R10000_LLSC_WAR 0
|
||||||
|
#define MIPS34K_MISSED_ITLB_WAR 0
|
||||||
|
|
||||||
|
#endif /* __ASM_MIPS_MACH_PNX8550_WAR_H */
|
26
arch/mips/include/asm/mach-tx49xx/mangle-port.h
Normal file
26
arch/mips/include/asm/mach-tx49xx/mangle-port.h
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
#ifndef __ASM_MACH_TX49XX_MANGLE_PORT_H
|
||||||
|
#define __ASM_MACH_TX49XX_MANGLE_PORT_H
|
||||||
|
|
||||||
|
#define __swizzle_addr_b(port) (port)
|
||||||
|
#define __swizzle_addr_w(port) (port)
|
||||||
|
#define __swizzle_addr_l(port) (port)
|
||||||
|
#define __swizzle_addr_q(port) (port)
|
||||||
|
|
||||||
|
#define ioswabb(a, x) (x)
|
||||||
|
#define __mem_ioswabb(a, x) (x)
|
||||||
|
#if defined(CONFIG_TOSHIBA_RBTX4939) && \
|
||||||
|
(defined(CONFIG_SMC91X) || defined(CONFIG_SMC91X_MODULE)) && \
|
||||||
|
defined(__BIG_ENDIAN)
|
||||||
|
#define NEEDS_TXX9_IOSWABW
|
||||||
|
extern u16 (*ioswabw)(volatile u16 *a, u16 x);
|
||||||
|
extern u16 (*__mem_ioswabw)(volatile u16 *a, u16 x);
|
||||||
|
#else
|
||||||
|
#define ioswabw(a, x) le16_to_cpu(x)
|
||||||
|
#define __mem_ioswabw(a, x) (x)
|
||||||
|
#endif
|
||||||
|
#define ioswabl(a, x) le32_to_cpu(x)
|
||||||
|
#define __mem_ioswabl(a, x) (x)
|
||||||
|
#define ioswabq(a, x) le64_to_cpu(x)
|
||||||
|
#define __mem_ioswabq(a, x) (x)
|
||||||
|
|
||||||
|
#endif /* __ASM_MACH_TX49XX_MANGLE_PORT_H */
|
|
@ -192,6 +192,7 @@
|
||||||
#define PM_16M 0x01ffe000
|
#define PM_16M 0x01ffe000
|
||||||
#define PM_64M 0x07ffe000
|
#define PM_64M 0x07ffe000
|
||||||
#define PM_256M 0x1fffe000
|
#define PM_256M 0x1fffe000
|
||||||
|
#define PM_1G 0x7fffe000
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -98,6 +98,8 @@ search_module_dbetables(unsigned long addr)
|
||||||
#define MODULE_PROC_FAMILY "R5000 "
|
#define MODULE_PROC_FAMILY "R5000 "
|
||||||
#elif defined CONFIG_CPU_R5432
|
#elif defined CONFIG_CPU_R5432
|
||||||
#define MODULE_PROC_FAMILY "R5432 "
|
#define MODULE_PROC_FAMILY "R5432 "
|
||||||
|
#elif defined CONFIG_CPU_R5500
|
||||||
|
#define MODULE_PROC_FAMILY "R5500 "
|
||||||
#elif defined CONFIG_CPU_R6000
|
#elif defined CONFIG_CPU_R6000
|
||||||
#define MODULE_PROC_FAMILY "R6000 "
|
#define MODULE_PROC_FAMILY "R6000 "
|
||||||
#elif defined CONFIG_CPU_NEVADA
|
#elif defined CONFIG_CPU_NEVADA
|
||||||
|
|
|
@ -80,25 +80,25 @@ enum pt_watch_style {
|
||||||
pt_watch_style_mips64
|
pt_watch_style_mips64
|
||||||
};
|
};
|
||||||
struct mips32_watch_regs {
|
struct mips32_watch_regs {
|
||||||
uint32_t watchlo[8];
|
unsigned int watchlo[8];
|
||||||
/* Lower 16 bits of watchhi. */
|
/* Lower 16 bits of watchhi. */
|
||||||
uint16_t watchhi[8];
|
unsigned short watchhi[8];
|
||||||
/* Valid mask and I R W bits.
|
/* Valid mask and I R W bits.
|
||||||
* bit 0 -- 1 if W bit is usable.
|
* bit 0 -- 1 if W bit is usable.
|
||||||
* bit 1 -- 1 if R bit is usable.
|
* bit 1 -- 1 if R bit is usable.
|
||||||
* bit 2 -- 1 if I bit is usable.
|
* bit 2 -- 1 if I bit is usable.
|
||||||
* bits 3 - 11 -- Valid watchhi mask bits.
|
* bits 3 - 11 -- Valid watchhi mask bits.
|
||||||
*/
|
*/
|
||||||
uint16_t watch_masks[8];
|
unsigned short watch_masks[8];
|
||||||
/* The number of valid watch register pairs. */
|
/* The number of valid watch register pairs. */
|
||||||
uint32_t num_valid;
|
unsigned int num_valid;
|
||||||
} __attribute__((aligned(8)));
|
} __attribute__((aligned(8)));
|
||||||
|
|
||||||
struct mips64_watch_regs {
|
struct mips64_watch_regs {
|
||||||
uint64_t watchlo[8];
|
unsigned long long watchlo[8];
|
||||||
uint16_t watchhi[8];
|
unsigned short watchhi[8];
|
||||||
uint16_t watch_masks[8];
|
unsigned short watch_masks[8];
|
||||||
uint32_t num_valid;
|
unsigned int num_valid;
|
||||||
} __attribute__((aligned(8)));
|
} __attribute__((aligned(8)));
|
||||||
|
|
||||||
struct pt_watch_regs {
|
struct pt_watch_regs {
|
||||||
|
@ -116,6 +116,7 @@ struct pt_watch_regs {
|
||||||
|
|
||||||
#include <linux/compiler.h>
|
#include <linux/compiler.h>
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
|
#include <linux/types.h>
|
||||||
#include <asm/isadep.h>
|
#include <asm/isadep.h>
|
||||||
|
|
||||||
struct task_struct;
|
struct task_struct;
|
||||||
|
|
|
@ -86,4 +86,9 @@ void txx9_iocled_init(unsigned long baseaddr,
|
||||||
int basenum, unsigned int num, int lowactive,
|
int basenum, unsigned int num, int lowactive,
|
||||||
const char *color, char **deftriggers);
|
const char *color, char **deftriggers);
|
||||||
|
|
||||||
|
/* 7SEG LED */
|
||||||
|
void txx9_7segled_init(unsigned int num,
|
||||||
|
void (*putc)(unsigned int pos, unsigned char val));
|
||||||
|
int txx9_7segled_putc(unsigned int pos, char c);
|
||||||
|
|
||||||
#endif /* __ASM_TXX9_GENERIC_H */
|
#endif /* __ASM_TXX9_GENERIC_H */
|
||||||
|
|
|
@ -33,6 +33,7 @@ obj-$(CONFIG_CPU_R4X00) += r4k_fpu.o r4k_switch.o
|
||||||
obj-$(CONFIG_CPU_R5000) += r4k_fpu.o r4k_switch.o
|
obj-$(CONFIG_CPU_R5000) += r4k_fpu.o r4k_switch.o
|
||||||
obj-$(CONFIG_CPU_R6000) += r6000_fpu.o r4k_switch.o
|
obj-$(CONFIG_CPU_R6000) += r6000_fpu.o r4k_switch.o
|
||||||
obj-$(CONFIG_CPU_R5432) += r4k_fpu.o r4k_switch.o
|
obj-$(CONFIG_CPU_R5432) += r4k_fpu.o r4k_switch.o
|
||||||
|
obj-$(CONFIG_CPU_R5500) += r4k_fpu.o r4k_switch.o
|
||||||
obj-$(CONFIG_CPU_R8000) += r4k_fpu.o r4k_switch.o
|
obj-$(CONFIG_CPU_R8000) += r4k_fpu.o r4k_switch.o
|
||||||
obj-$(CONFIG_CPU_RM7000) += r4k_fpu.o r4k_switch.o
|
obj-$(CONFIG_CPU_RM7000) += r4k_fpu.o r4k_switch.o
|
||||||
obj-$(CONFIG_CPU_RM9000) += r4k_fpu.o r4k_switch.o
|
obj-$(CONFIG_CPU_RM9000) += r4k_fpu.o r4k_switch.o
|
||||||
|
|
|
@ -180,7 +180,7 @@ bad_stack:
|
||||||
* The system call does not exist in this kernel
|
* The system call does not exist in this kernel
|
||||||
*/
|
*/
|
||||||
illegal_syscall:
|
illegal_syscall:
|
||||||
li v0, -ENOSYS # error
|
li v0, ENOSYS # error
|
||||||
sw v0, PT_R2(sp)
|
sw v0, PT_R2(sp)
|
||||||
li t0, 1 # set error flag
|
li t0, 1 # set error flag
|
||||||
sw t0, PT_R7(sp)
|
sw t0, PT_R7(sp)
|
||||||
|
@ -293,7 +293,7 @@ bad_alignment:
|
||||||
jr t2
|
jr t2
|
||||||
/* Unreached */
|
/* Unreached */
|
||||||
|
|
||||||
einval: li v0, -EINVAL
|
einval: li v0, -ENOSYS
|
||||||
jr ra
|
jr ra
|
||||||
END(sys_syscall)
|
END(sys_syscall)
|
||||||
|
|
||||||
|
|
|
@ -117,7 +117,7 @@ syscall_trace_entry:
|
||||||
|
|
||||||
illegal_syscall:
|
illegal_syscall:
|
||||||
/* This also isn't a 64-bit syscall, throw an error. */
|
/* This also isn't a 64-bit syscall, throw an error. */
|
||||||
li v0, -ENOSYS # error
|
li v0, ENOSYS # error
|
||||||
sd v0, PT_R2(sp)
|
sd v0, PT_R2(sp)
|
||||||
li t0, 1 # set error flag
|
li t0, 1 # set error flag
|
||||||
sd t0, PT_R7(sp)
|
sd t0, PT_R7(sp)
|
||||||
|
|
|
@ -601,8 +601,8 @@ static int __init debugfs_mips(void)
|
||||||
struct dentry *d;
|
struct dentry *d;
|
||||||
|
|
||||||
d = debugfs_create_dir("mips", NULL);
|
d = debugfs_create_dir("mips", NULL);
|
||||||
if (IS_ERR(d))
|
if (!d)
|
||||||
return PTR_ERR(d);
|
return -ENOMEM;
|
||||||
mips_debugfs_dir = d;
|
mips_debugfs_dir = d;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -163,8 +163,10 @@ static void stop_this_cpu(void *dummy)
|
||||||
* Remove this CPU:
|
* Remove this CPU:
|
||||||
*/
|
*/
|
||||||
cpu_clear(smp_processor_id(), cpu_online_map);
|
cpu_clear(smp_processor_id(), cpu_online_map);
|
||||||
local_irq_enable(); /* May need to service _machine_restart IPI */
|
for (;;) {
|
||||||
for (;;); /* Wait if available. */
|
if (cpu_wait)
|
||||||
|
(*cpu_wait)(); /* Wait if available. */
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void smp_send_stop(void)
|
void smp_send_stop(void)
|
||||||
|
|
|
@ -560,12 +560,12 @@ static int __init debugfs_unaligned(void)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
d = debugfs_create_u32("unaligned_instructions", S_IRUGO,
|
d = debugfs_create_u32("unaligned_instructions", S_IRUGO,
|
||||||
mips_debugfs_dir, &unaligned_instructions);
|
mips_debugfs_dir, &unaligned_instructions);
|
||||||
if (IS_ERR(d))
|
if (!d)
|
||||||
return PTR_ERR(d);
|
return -ENOMEM;
|
||||||
d = debugfs_create_u32("unaligned_action", S_IRUGO | S_IWUSR,
|
d = debugfs_create_u32("unaligned_action", S_IRUGO | S_IWUSR,
|
||||||
mips_debugfs_dir, &unaligned_action);
|
mips_debugfs_dir, &unaligned_action);
|
||||||
if (IS_ERR(d))
|
if (!d)
|
||||||
return PTR_ERR(d);
|
return -ENOMEM;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
__initcall(debugfs_unaligned);
|
__initcall(debugfs_unaligned);
|
||||||
|
|
|
@ -30,19 +30,20 @@
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <asm/mips-boards/bonito64.h>
|
#include <asm/mips-boards/bonito64.h>
|
||||||
|
#include <asm/mach-lemote/pci.h>
|
||||||
|
|
||||||
extern struct pci_ops bonito64_pci_ops;
|
extern struct pci_ops bonito64_pci_ops;
|
||||||
|
|
||||||
static struct resource loongson2e_pci_mem_resource = {
|
static struct resource loongson2e_pci_mem_resource = {
|
||||||
.name = "LOONGSON2E PCI MEM",
|
.name = "LOONGSON2E PCI MEM",
|
||||||
.start = 0x14000000UL,
|
.start = LOONGSON2E_PCI_MEM_START,
|
||||||
.end = 0x1fffffffUL,
|
.end = LOONGSON2E_PCI_MEM_END,
|
||||||
.flags = IORESOURCE_MEM,
|
.flags = IORESOURCE_MEM,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct resource loongson2e_pci_io_resource = {
|
static struct resource loongson2e_pci_io_resource = {
|
||||||
.name = "LOONGSON2E PCI IO MEM",
|
.name = "LOONGSON2E PCI IO MEM",
|
||||||
.start = 0x00004000UL,
|
.start = LOONGSON2E_PCI_IO_START,
|
||||||
.end = IO_SPACE_LIMIT,
|
.end = IO_SPACE_LIMIT,
|
||||||
.flags = IORESOURCE_IO,
|
.flags = IORESOURCE_IO,
|
||||||
};
|
};
|
||||||
|
@ -82,6 +83,12 @@ static void __init ict_pcimap(void)
|
||||||
static int __init pcibios_init(void)
|
static int __init pcibios_init(void)
|
||||||
{
|
{
|
||||||
ict_pcimap();
|
ict_pcimap();
|
||||||
|
|
||||||
|
loongson2e_pci_controller.io_map_base =
|
||||||
|
(unsigned long) ioremap(LOONGSON2E_IO_PORT_BASE,
|
||||||
|
loongson2e_pci_io_resource.end -
|
||||||
|
loongson2e_pci_io_resource.start + 1);
|
||||||
|
|
||||||
register_pci_controller(&loongson2e_pci_controller);
|
register_pci_controller(&loongson2e_pci_controller);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
#include <asm/mc146818-time.h>
|
#include <asm/mc146818-time.h>
|
||||||
#include <asm/time.h>
|
#include <asm/time.h>
|
||||||
#include <asm/wbflush.h>
|
#include <asm/wbflush.h>
|
||||||
|
#include <asm/mach-lemote/pci.h>
|
||||||
|
|
||||||
#ifdef CONFIG_VT
|
#ifdef CONFIG_VT
|
||||||
#include <linux/console.h>
|
#include <linux/console.h>
|
||||||
|
@ -42,12 +43,6 @@
|
||||||
|
|
||||||
extern void mips_reboot_setup(void);
|
extern void mips_reboot_setup(void);
|
||||||
|
|
||||||
#ifdef CONFIG_64BIT
|
|
||||||
#define PTR_PAD(p) ((0xffffffff00000000)|((unsigned long long)(p)))
|
|
||||||
#else
|
|
||||||
#define PTR_PAD(p) (p)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
unsigned long cpu_clock_freq;
|
unsigned long cpu_clock_freq;
|
||||||
unsigned long bus_clock;
|
unsigned long bus_clock;
|
||||||
unsigned int memsize;
|
unsigned int memsize;
|
||||||
|
@ -80,8 +75,8 @@ static void wbflush_loongson2e(void)
|
||||||
|
|
||||||
void __init plat_mem_setup(void)
|
void __init plat_mem_setup(void)
|
||||||
{
|
{
|
||||||
set_io_port_base(PTR_PAD(0xbfd00000));
|
set_io_port_base((unsigned long)ioremap(LOONGSON2E_IO_PORT_BASE,
|
||||||
|
IO_SPACE_LIMIT - LOONGSON2E_PCI_IO_START + 1));
|
||||||
mips_reboot_setup();
|
mips_reboot_setup();
|
||||||
|
|
||||||
__wbflush = wbflush_loongson2e;
|
__wbflush = wbflush_loongson2e;
|
||||||
|
|
|
@ -18,6 +18,7 @@ obj-$(CONFIG_CPU_R4300) += dump_tlb.o
|
||||||
obj-$(CONFIG_CPU_R4X00) += dump_tlb.o
|
obj-$(CONFIG_CPU_R4X00) += dump_tlb.o
|
||||||
obj-$(CONFIG_CPU_R5000) += dump_tlb.o
|
obj-$(CONFIG_CPU_R5000) += dump_tlb.o
|
||||||
obj-$(CONFIG_CPU_R5432) += dump_tlb.o
|
obj-$(CONFIG_CPU_R5432) += dump_tlb.o
|
||||||
|
obj-$(CONFIG_CPU_R5500) += dump_tlb.o
|
||||||
obj-$(CONFIG_CPU_R6000) +=
|
obj-$(CONFIG_CPU_R6000) +=
|
||||||
obj-$(CONFIG_CPU_R8000) +=
|
obj-$(CONFIG_CPU_R8000) +=
|
||||||
obj-$(CONFIG_CPU_RM7000) += dump_tlb.o
|
obj-$(CONFIG_CPU_RM7000) += dump_tlb.o
|
||||||
|
|
|
@ -25,6 +25,7 @@ static inline const char *msk2str(unsigned int mask)
|
||||||
case PM_16M: return "16Mb";
|
case PM_16M: return "16Mb";
|
||||||
case PM_64M: return "64Mb";
|
case PM_64M: return "64Mb";
|
||||||
case PM_256M: return "256Mb";
|
case PM_256M: return "256Mb";
|
||||||
|
case PM_1G: return "1Gb";
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
return "";
|
return "";
|
||||||
|
|
|
@ -1299,12 +1299,12 @@ static int __init debugfs_fpuemu(void)
|
||||||
if (!mips_debugfs_dir)
|
if (!mips_debugfs_dir)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
dir = debugfs_create_dir("fpuemustats", mips_debugfs_dir);
|
dir = debugfs_create_dir("fpuemustats", mips_debugfs_dir);
|
||||||
if (IS_ERR(dir))
|
if (!dir)
|
||||||
return PTR_ERR(dir);
|
return -ENOMEM;
|
||||||
for (i = 0; i < ARRAY_SIZE(vars); i++) {
|
for (i = 0; i < ARRAY_SIZE(vars); i++) {
|
||||||
d = debugfs_create_u32(vars[i].name, S_IRUGO, dir, vars[i].v);
|
d = debugfs_create_u32(vars[i].name, S_IRUGO, dir, vars[i].v);
|
||||||
if (IS_ERR(d))
|
if (!d)
|
||||||
return PTR_ERR(d);
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,6 +19,7 @@ obj-$(CONFIG_CPU_R4300) += c-r4k.o cex-gen.o tlb-r4k.o
|
||||||
obj-$(CONFIG_CPU_R4X00) += c-r4k.o cex-gen.o tlb-r4k.o
|
obj-$(CONFIG_CPU_R4X00) += c-r4k.o cex-gen.o tlb-r4k.o
|
||||||
obj-$(CONFIG_CPU_R5000) += c-r4k.o cex-gen.o tlb-r4k.o
|
obj-$(CONFIG_CPU_R5000) += c-r4k.o cex-gen.o tlb-r4k.o
|
||||||
obj-$(CONFIG_CPU_R5432) += c-r4k.o cex-gen.o tlb-r4k.o
|
obj-$(CONFIG_CPU_R5432) += c-r4k.o cex-gen.o tlb-r4k.o
|
||||||
|
obj-$(CONFIG_CPU_R5500) += c-r4k.o cex-gen.o tlb-r4k.o
|
||||||
obj-$(CONFIG_CPU_R8000) += c-r4k.o cex-gen.o tlb-r8k.o
|
obj-$(CONFIG_CPU_R8000) += c-r4k.o cex-gen.o tlb-r8k.o
|
||||||
obj-$(CONFIG_CPU_RM7000) += c-r4k.o cex-gen.o tlb-r4k.o
|
obj-$(CONFIG_CPU_RM7000) += c-r4k.o cex-gen.o tlb-r4k.o
|
||||||
obj-$(CONFIG_CPU_RM9000) += c-r4k.o cex-gen.o tlb-r4k.o
|
obj-$(CONFIG_CPU_RM9000) += c-r4k.o cex-gen.o tlb-r4k.o
|
||||||
|
|
|
@ -324,7 +324,6 @@ void dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems,
|
||||||
if (cpu_is_noncoherent_r10000(dev))
|
if (cpu_is_noncoherent_r10000(dev))
|
||||||
__dma_sync((unsigned long)page_address(sg_page(sg)),
|
__dma_sync((unsigned long)page_address(sg_page(sg)),
|
||||||
sg->length, direction);
|
sg->length, direction);
|
||||||
plat_unmap_dma_mem(sg->dma_address);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -342,7 +341,6 @@ void dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nele
|
||||||
if (!plat_device_is_coherent(dev))
|
if (!plat_device_is_coherent(dev))
|
||||||
__dma_sync((unsigned long)page_address(sg_page(sg)),
|
__dma_sync((unsigned long)page_address(sg_page(sg)),
|
||||||
sg->length, direction);
|
sg->length, direction);
|
||||||
plat_unmap_dma_mem(sg->dma_address);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
3
arch/mips/nxp/pnx833x/common/Makefile
Normal file
3
arch/mips/nxp/pnx833x/common/Makefile
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
obj-y := interrupts.o platform.o prom.o setup.o reset.o
|
||||||
|
|
||||||
|
EXTRA_CFLAGS += -Werror
|
380
arch/mips/nxp/pnx833x/common/interrupts.c
Normal file
380
arch/mips/nxp/pnx833x/common/interrupts.c
Normal file
|
@ -0,0 +1,380 @@
|
||||||
|
/*
|
||||||
|
* interrupts.c: Interrupt mappings for PNX833X.
|
||||||
|
*
|
||||||
|
* Copyright 2008 NXP Semiconductors
|
||||||
|
* Chris Steel <chris.steel@nxp.com>
|
||||||
|
* Daniel Laird <daniel.j.laird@nxp.com>
|
||||||
|
*
|
||||||
|
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/irq.h>
|
||||||
|
#include <linux/hardirq.h>
|
||||||
|
#include <linux/interrupt.h>
|
||||||
|
#include <asm/mipsregs.h>
|
||||||
|
#include <asm/irq_cpu.h>
|
||||||
|
#include <irq.h>
|
||||||
|
#include <irq-mapping.h>
|
||||||
|
#include <gpio.h>
|
||||||
|
|
||||||
|
static int mips_cpu_timer_irq;
|
||||||
|
|
||||||
|
static const unsigned int irq_prio[PNX833X_PIC_NUM_IRQ] =
|
||||||
|
{
|
||||||
|
0, /* unused */
|
||||||
|
4, /* PNX833X_PIC_I2C0_INT 1 */
|
||||||
|
4, /* PNX833X_PIC_I2C1_INT 2 */
|
||||||
|
1, /* PNX833X_PIC_UART0_INT 3 */
|
||||||
|
1, /* PNX833X_PIC_UART1_INT 4 */
|
||||||
|
6, /* PNX833X_PIC_TS_IN0_DV_INT 5 */
|
||||||
|
6, /* PNX833X_PIC_TS_IN0_DMA_INT 6 */
|
||||||
|
7, /* PNX833X_PIC_GPIO_INT 7 */
|
||||||
|
4, /* PNX833X_PIC_AUDIO_DEC_INT 8 */
|
||||||
|
5, /* PNX833X_PIC_VIDEO_DEC_INT 9 */
|
||||||
|
4, /* PNX833X_PIC_CONFIG_INT 10 */
|
||||||
|
4, /* PNX833X_PIC_AOI_INT 11 */
|
||||||
|
9, /* PNX833X_PIC_SYNC_INT 12 */
|
||||||
|
9, /* PNX8335_PIC_SATA_INT 13 */
|
||||||
|
4, /* PNX833X_PIC_OSD_INT 14 */
|
||||||
|
9, /* PNX833X_PIC_DISP1_INT 15 */
|
||||||
|
4, /* PNX833X_PIC_DEINTERLACER_INT 16 */
|
||||||
|
9, /* PNX833X_PIC_DISPLAY2_INT 17 */
|
||||||
|
4, /* PNX833X_PIC_VC_INT 18 */
|
||||||
|
4, /* PNX833X_PIC_SC_INT 19 */
|
||||||
|
9, /* PNX833X_PIC_IDE_INT 20 */
|
||||||
|
9, /* PNX833X_PIC_IDE_DMA_INT 21 */
|
||||||
|
6, /* PNX833X_PIC_TS_IN1_DV_INT 22 */
|
||||||
|
6, /* PNX833X_PIC_TS_IN1_DMA_INT 23 */
|
||||||
|
4, /* PNX833X_PIC_SGDX_DMA_INT 24 */
|
||||||
|
4, /* PNX833X_PIC_TS_OUT_INT 25 */
|
||||||
|
4, /* PNX833X_PIC_IR_INT 26 */
|
||||||
|
3, /* PNX833X_PIC_VMSP1_INT 27 */
|
||||||
|
3, /* PNX833X_PIC_VMSP2_INT 28 */
|
||||||
|
4, /* PNX833X_PIC_PIBC_INT 29 */
|
||||||
|
4, /* PNX833X_PIC_TS_IN0_TRD_INT 30 */
|
||||||
|
4, /* PNX833X_PIC_SGDX_TPD_INT 31 */
|
||||||
|
5, /* PNX833X_PIC_USB_INT 32 */
|
||||||
|
4, /* PNX833X_PIC_TS_IN1_TRD_INT 33 */
|
||||||
|
4, /* PNX833X_PIC_CLOCK_INT 34 */
|
||||||
|
4, /* PNX833X_PIC_SGDX_PARSER_INT 35 */
|
||||||
|
4, /* PNX833X_PIC_VMSP_DMA_INT 36 */
|
||||||
|
#if defined(CONFIG_SOC_PNX8335)
|
||||||
|
4, /* PNX8335_PIC_MIU_INT 37 */
|
||||||
|
4, /* PNX8335_PIC_AVCHIP_IRQ_INT 38 */
|
||||||
|
9, /* PNX8335_PIC_SYNC_HD_INT 39 */
|
||||||
|
9, /* PNX8335_PIC_DISP_HD_INT 40 */
|
||||||
|
9, /* PNX8335_PIC_DISP_SCALER_INT 41 */
|
||||||
|
4, /* PNX8335_PIC_OSD_HD1_INT 42 */
|
||||||
|
4, /* PNX8335_PIC_DTL_WRITER_Y_INT 43 */
|
||||||
|
4, /* PNX8335_PIC_DTL_WRITER_C_INT 44 */
|
||||||
|
4, /* PNX8335_PIC_DTL_EMULATOR_Y_IR_INT 45 */
|
||||||
|
4, /* PNX8335_PIC_DTL_EMULATOR_C_IR_INT 46 */
|
||||||
|
4, /* PNX8335_PIC_DENC_TTX_INT 47 */
|
||||||
|
4, /* PNX8335_PIC_MMI_SIF0_INT 48 */
|
||||||
|
4, /* PNX8335_PIC_MMI_SIF1_INT 49 */
|
||||||
|
4, /* PNX8335_PIC_MMI_CDMMU_INT 50 */
|
||||||
|
4, /* PNX8335_PIC_PIBCS_INT 51 */
|
||||||
|
12, /* PNX8335_PIC_ETHERNET_INT 52 */
|
||||||
|
3, /* PNX8335_PIC_VMSP1_0_INT 53 */
|
||||||
|
3, /* PNX8335_PIC_VMSP1_1_INT 54 */
|
||||||
|
4, /* PNX8335_PIC_VMSP1_DMA_INT 55 */
|
||||||
|
4, /* PNX8335_PIC_TDGR_DE_INT 56 */
|
||||||
|
4, /* PNX8335_PIC_IR1_IRQ_INT 57 */
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
static void pnx833x_timer_dispatch(void)
|
||||||
|
{
|
||||||
|
do_IRQ(mips_cpu_timer_irq);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pic_dispatch(void)
|
||||||
|
{
|
||||||
|
unsigned int irq = PNX833X_REGFIELD(PIC_INT_SRC, INT_SRC);
|
||||||
|
|
||||||
|
if ((irq >= 1) && (irq < (PNX833X_PIC_NUM_IRQ))) {
|
||||||
|
unsigned long priority = PNX833X_PIC_INT_PRIORITY;
|
||||||
|
PNX833X_PIC_INT_PRIORITY = irq_prio[irq];
|
||||||
|
|
||||||
|
if (irq == PNX833X_PIC_GPIO_INT) {
|
||||||
|
unsigned long mask = PNX833X_PIO_INT_STATUS & PNX833X_PIO_INT_ENABLE;
|
||||||
|
int pin;
|
||||||
|
while ((pin = ffs(mask & 0xffff))) {
|
||||||
|
pin -= 1;
|
||||||
|
do_IRQ(PNX833X_GPIO_IRQ_BASE + pin);
|
||||||
|
mask &= ~(1 << pin);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
do_IRQ(irq + PNX833X_PIC_IRQ_BASE);
|
||||||
|
}
|
||||||
|
|
||||||
|
PNX833X_PIC_INT_PRIORITY = priority;
|
||||||
|
} else {
|
||||||
|
printk(KERN_ERR "plat_irq_dispatch: unexpected irq %u\n", irq);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
asmlinkage void plat_irq_dispatch(void)
|
||||||
|
{
|
||||||
|
unsigned int pending = read_c0_status() & read_c0_cause();
|
||||||
|
|
||||||
|
if (pending & STATUSF_IP4)
|
||||||
|
pic_dispatch();
|
||||||
|
else if (pending & STATUSF_IP7)
|
||||||
|
do_IRQ(PNX833X_TIMER_IRQ);
|
||||||
|
else
|
||||||
|
spurious_interrupt();
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void pnx833x_hard_enable_pic_irq(unsigned int irq)
|
||||||
|
{
|
||||||
|
/* Currently we do this by setting IRQ priority to 1.
|
||||||
|
If priority support is being implemented, 1 should be repalced
|
||||||
|
by a better value. */
|
||||||
|
PNX833X_PIC_INT_REG(irq) = irq_prio[irq];
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void pnx833x_hard_disable_pic_irq(unsigned int irq)
|
||||||
|
{
|
||||||
|
/* Disable IRQ by writing setting it's priority to 0 */
|
||||||
|
PNX833X_PIC_INT_REG(irq) = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int irqflags[PNX833X_PIC_NUM_IRQ]; /* initialized by zeroes */
|
||||||
|
#define IRQFLAG_STARTED 1
|
||||||
|
#define IRQFLAG_DISABLED 2
|
||||||
|
|
||||||
|
static DEFINE_SPINLOCK(pnx833x_irq_lock);
|
||||||
|
|
||||||
|
static unsigned int pnx833x_startup_pic_irq(unsigned int irq)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
unsigned int pic_irq = irq - PNX833X_PIC_IRQ_BASE;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&pnx833x_irq_lock, flags);
|
||||||
|
|
||||||
|
irqflags[pic_irq] = IRQFLAG_STARTED; /* started, not disabled */
|
||||||
|
pnx833x_hard_enable_pic_irq(pic_irq);
|
||||||
|
|
||||||
|
spin_unlock_irqrestore(&pnx833x_irq_lock, flags);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pnx833x_shutdown_pic_irq(unsigned int irq)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
unsigned int pic_irq = irq - PNX833X_PIC_IRQ_BASE;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&pnx833x_irq_lock, flags);
|
||||||
|
|
||||||
|
irqflags[pic_irq] = 0; /* not started */
|
||||||
|
pnx833x_hard_disable_pic_irq(pic_irq);
|
||||||
|
|
||||||
|
spin_unlock_irqrestore(&pnx833x_irq_lock, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pnx833x_enable_pic_irq(unsigned int irq)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
unsigned int pic_irq = irq - PNX833X_PIC_IRQ_BASE;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&pnx833x_irq_lock, flags);
|
||||||
|
|
||||||
|
irqflags[pic_irq] &= ~IRQFLAG_DISABLED;
|
||||||
|
if (irqflags[pic_irq] == IRQFLAG_STARTED)
|
||||||
|
pnx833x_hard_enable_pic_irq(pic_irq);
|
||||||
|
|
||||||
|
spin_unlock_irqrestore(&pnx833x_irq_lock, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pnx833x_disable_pic_irq(unsigned int irq)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
unsigned int pic_irq = irq - PNX833X_PIC_IRQ_BASE;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&pnx833x_irq_lock, flags);
|
||||||
|
|
||||||
|
irqflags[pic_irq] |= IRQFLAG_DISABLED;
|
||||||
|
pnx833x_hard_disable_pic_irq(pic_irq);
|
||||||
|
|
||||||
|
spin_unlock_irqrestore(&pnx833x_irq_lock, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pnx833x_ack_pic_irq(unsigned int irq)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pnx833x_end_pic_irq(unsigned int irq)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static DEFINE_SPINLOCK(pnx833x_gpio_pnx833x_irq_lock);
|
||||||
|
|
||||||
|
static unsigned int pnx833x_startup_gpio_irq(unsigned int irq)
|
||||||
|
{
|
||||||
|
int pin = irq - PNX833X_GPIO_IRQ_BASE;
|
||||||
|
unsigned long flags;
|
||||||
|
spin_lock_irqsave(&pnx833x_gpio_pnx833x_irq_lock, flags);
|
||||||
|
pnx833x_gpio_enable_irq(pin);
|
||||||
|
spin_unlock_irqrestore(&pnx833x_gpio_pnx833x_irq_lock, flags);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pnx833x_enable_gpio_irq(unsigned int irq)
|
||||||
|
{
|
||||||
|
int pin = irq - PNX833X_GPIO_IRQ_BASE;
|
||||||
|
unsigned long flags;
|
||||||
|
spin_lock_irqsave(&pnx833x_gpio_pnx833x_irq_lock, flags);
|
||||||
|
pnx833x_gpio_enable_irq(pin);
|
||||||
|
spin_unlock_irqrestore(&pnx833x_gpio_pnx833x_irq_lock, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pnx833x_disable_gpio_irq(unsigned int irq)
|
||||||
|
{
|
||||||
|
int pin = irq - PNX833X_GPIO_IRQ_BASE;
|
||||||
|
unsigned long flags;
|
||||||
|
spin_lock_irqsave(&pnx833x_gpio_pnx833x_irq_lock, flags);
|
||||||
|
pnx833x_gpio_disable_irq(pin);
|
||||||
|
spin_unlock_irqrestore(&pnx833x_gpio_pnx833x_irq_lock, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pnx833x_ack_gpio_irq(unsigned int irq)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pnx833x_end_gpio_irq(unsigned int irq)
|
||||||
|
{
|
||||||
|
int pin = irq - PNX833X_GPIO_IRQ_BASE;
|
||||||
|
unsigned long flags;
|
||||||
|
spin_lock_irqsave(&pnx833x_gpio_pnx833x_irq_lock, flags);
|
||||||
|
pnx833x_gpio_clear_irq(pin);
|
||||||
|
spin_unlock_irqrestore(&pnx833x_gpio_pnx833x_irq_lock, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int pnx833x_set_type_gpio_irq(unsigned int irq, unsigned int flow_type)
|
||||||
|
{
|
||||||
|
int pin = irq - PNX833X_GPIO_IRQ_BASE;
|
||||||
|
int gpio_mode;
|
||||||
|
|
||||||
|
switch (flow_type) {
|
||||||
|
case IRQ_TYPE_EDGE_RISING:
|
||||||
|
gpio_mode = GPIO_INT_EDGE_RISING;
|
||||||
|
break;
|
||||||
|
case IRQ_TYPE_EDGE_FALLING:
|
||||||
|
gpio_mode = GPIO_INT_EDGE_FALLING;
|
||||||
|
break;
|
||||||
|
case IRQ_TYPE_EDGE_BOTH:
|
||||||
|
gpio_mode = GPIO_INT_EDGE_BOTH;
|
||||||
|
break;
|
||||||
|
case IRQ_TYPE_LEVEL_HIGH:
|
||||||
|
gpio_mode = GPIO_INT_LEVEL_HIGH;
|
||||||
|
break;
|
||||||
|
case IRQ_TYPE_LEVEL_LOW:
|
||||||
|
gpio_mode = GPIO_INT_LEVEL_LOW;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
gpio_mode = GPIO_INT_NONE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
pnx833x_gpio_setup_irq(gpio_mode, pin);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct irq_chip pnx833x_pic_irq_type = {
|
||||||
|
.typename = "PNX-PIC",
|
||||||
|
.startup = pnx833x_startup_pic_irq,
|
||||||
|
.shutdown = pnx833x_shutdown_pic_irq,
|
||||||
|
.enable = pnx833x_enable_pic_irq,
|
||||||
|
.disable = pnx833x_disable_pic_irq,
|
||||||
|
.ack = pnx833x_ack_pic_irq,
|
||||||
|
.end = pnx833x_end_pic_irq
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct irq_chip pnx833x_gpio_irq_type = {
|
||||||
|
.typename = "PNX-GPIO",
|
||||||
|
.startup = pnx833x_startup_gpio_irq,
|
||||||
|
.shutdown = pnx833x_disable_gpio_irq,
|
||||||
|
.enable = pnx833x_enable_gpio_irq,
|
||||||
|
.disable = pnx833x_disable_gpio_irq,
|
||||||
|
.ack = pnx833x_ack_gpio_irq,
|
||||||
|
.end = pnx833x_end_gpio_irq,
|
||||||
|
.set_type = pnx833x_set_type_gpio_irq
|
||||||
|
};
|
||||||
|
|
||||||
|
void __init arch_init_irq(void)
|
||||||
|
{
|
||||||
|
unsigned int irq;
|
||||||
|
|
||||||
|
/* setup standard internal cpu irqs */
|
||||||
|
mips_cpu_irq_init();
|
||||||
|
|
||||||
|
/* Set IRQ information in irq_desc */
|
||||||
|
for (irq = PNX833X_PIC_IRQ_BASE; irq < (PNX833X_PIC_IRQ_BASE + PNX833X_PIC_NUM_IRQ); irq++) {
|
||||||
|
pnx833x_hard_disable_pic_irq(irq);
|
||||||
|
set_irq_chip_and_handler(irq, &pnx833x_pic_irq_type, handle_simple_irq);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (irq = PNX833X_GPIO_IRQ_BASE; irq < (PNX833X_GPIO_IRQ_BASE + PNX833X_GPIO_NUM_IRQ); irq++)
|
||||||
|
set_irq_chip_and_handler(irq, &pnx833x_gpio_irq_type, handle_simple_irq);
|
||||||
|
|
||||||
|
/* Set PIC priority limiter register to 0 */
|
||||||
|
PNX833X_PIC_INT_PRIORITY = 0;
|
||||||
|
|
||||||
|
/* Setup GPIO IRQ dispatching */
|
||||||
|
pnx833x_startup_pic_irq(PNX833X_PIC_GPIO_INT);
|
||||||
|
|
||||||
|
/* Enable PIC IRQs (HWIRQ2) */
|
||||||
|
if (cpu_has_vint)
|
||||||
|
set_vi_handler(4, pic_dispatch);
|
||||||
|
|
||||||
|
write_c0_status(read_c0_status() | IE_IRQ2);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int __cpuinit get_c0_compare_int(void)
|
||||||
|
{
|
||||||
|
if (cpu_has_vint)
|
||||||
|
set_vi_handler(cp0_compare_irq, pnx833x_timer_dispatch);
|
||||||
|
|
||||||
|
mips_cpu_timer_irq = MIPS_CPU_IRQ_BASE + cp0_compare_irq;
|
||||||
|
return mips_cpu_timer_irq;
|
||||||
|
}
|
||||||
|
|
||||||
|
void __init plat_time_init(void)
|
||||||
|
{
|
||||||
|
/* calculate mips_hpt_frequency based on PNX833X_CLOCK_CPUCP_CTL reg */
|
||||||
|
|
||||||
|
extern unsigned long mips_hpt_frequency;
|
||||||
|
unsigned long reg = PNX833X_CLOCK_CPUCP_CTL;
|
||||||
|
|
||||||
|
if (!(PNX833X_BIT(reg, CLOCK_CPUCP_CTL, EXIT_RESET))) {
|
||||||
|
/* Functional clock is disabled so use crystal frequency */
|
||||||
|
mips_hpt_frequency = 25;
|
||||||
|
} else {
|
||||||
|
#if defined(CONFIG_SOC_PNX8335)
|
||||||
|
/* Functional clock is enabled, so get clock multiplier */
|
||||||
|
mips_hpt_frequency = 90 + (10 * PNX8335_REGFIELD(CLOCK_PLL_CPU_CTL, FREQ));
|
||||||
|
#else
|
||||||
|
static const unsigned long int freq[4] = {240, 160, 120, 80};
|
||||||
|
mips_hpt_frequency = freq[PNX833X_FIELD(reg, CLOCK_CPUCP_CTL, DIV_CLOCK)];
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
printk(KERN_INFO "CPU clock is %ld MHz\n", mips_hpt_frequency);
|
||||||
|
|
||||||
|
mips_hpt_frequency *= 500000;
|
||||||
|
}
|
||||||
|
|
319
arch/mips/nxp/pnx833x/common/platform.c
Normal file
319
arch/mips/nxp/pnx833x/common/platform.c
Normal file
|
@ -0,0 +1,319 @@
|
||||||
|
/*
|
||||||
|
* platform.c: platform support for PNX833X.
|
||||||
|
*
|
||||||
|
* Copyright 2008 NXP Semiconductors
|
||||||
|
* Chris Steel <chris.steel@nxp.com>
|
||||||
|
* Daniel Laird <daniel.j.laird@nxp.com>
|
||||||
|
*
|
||||||
|
* Based on software written by:
|
||||||
|
* Nikita Youshchenko <yoush@debian.org>, based on PNX8550 code.
|
||||||
|
*
|
||||||
|
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
#include <linux/device.h>
|
||||||
|
#include <linux/dma-mapping.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/init.h>
|
||||||
|
#include <linux/resource.h>
|
||||||
|
#include <linux/serial.h>
|
||||||
|
#include <linux/serial_pnx8xxx.h>
|
||||||
|
#include <linux/mtd/nand.h>
|
||||||
|
#include <linux/mtd/partitions.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_I2C_PNX0105
|
||||||
|
/* Until i2c driver available in kernel.*/
|
||||||
|
#include <linux/i2c-pnx0105.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <irq.h>
|
||||||
|
#include <irq-mapping.h>
|
||||||
|
#include <pnx833x.h>
|
||||||
|
|
||||||
|
static u64 uart_dmamask = DMA_32BIT_MASK;
|
||||||
|
|
||||||
|
static struct resource pnx833x_uart_resources[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = PNX833X_UART0_PORTS_START,
|
||||||
|
.end = PNX833X_UART0_PORTS_END,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.start = PNX833X_PIC_UART0_INT,
|
||||||
|
.end = PNX833X_PIC_UART0_INT,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
[2] = {
|
||||||
|
.start = PNX833X_UART1_PORTS_START,
|
||||||
|
.end = PNX833X_UART1_PORTS_END,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[3] = {
|
||||||
|
.start = PNX833X_PIC_UART1_INT,
|
||||||
|
.end = PNX833X_PIC_UART1_INT,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
struct pnx8xxx_port pnx8xxx_ports[] = {
|
||||||
|
[0] = {
|
||||||
|
.port = {
|
||||||
|
.type = PORT_PNX8XXX,
|
||||||
|
.iotype = UPIO_MEM,
|
||||||
|
.membase = (void __iomem *)PNX833X_UART0_PORTS_START,
|
||||||
|
.mapbase = PNX833X_UART0_PORTS_START,
|
||||||
|
.irq = PNX833X_PIC_UART0_INT,
|
||||||
|
.uartclk = 3692300,
|
||||||
|
.fifosize = 16,
|
||||||
|
.flags = UPF_BOOT_AUTOCONF,
|
||||||
|
.line = 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.port = {
|
||||||
|
.type = PORT_PNX8XXX,
|
||||||
|
.iotype = UPIO_MEM,
|
||||||
|
.membase = (void __iomem *)PNX833X_UART1_PORTS_START,
|
||||||
|
.mapbase = PNX833X_UART1_PORTS_START,
|
||||||
|
.irq = PNX833X_PIC_UART1_INT,
|
||||||
|
.uartclk = 3692300,
|
||||||
|
.fifosize = 16,
|
||||||
|
.flags = UPF_BOOT_AUTOCONF,
|
||||||
|
.line = 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device pnx833x_uart_device = {
|
||||||
|
.name = "pnx8xxx-uart",
|
||||||
|
.id = -1,
|
||||||
|
.dev = {
|
||||||
|
.dma_mask = &uart_dmamask,
|
||||||
|
.coherent_dma_mask = DMA_32BIT_MASK,
|
||||||
|
.platform_data = pnx8xxx_ports,
|
||||||
|
},
|
||||||
|
.num_resources = ARRAY_SIZE(pnx833x_uart_resources),
|
||||||
|
.resource = pnx833x_uart_resources,
|
||||||
|
};
|
||||||
|
|
||||||
|
static u64 ehci_dmamask = DMA_32BIT_MASK;
|
||||||
|
|
||||||
|
static struct resource pnx833x_usb_ehci_resources[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = PNX833X_USB_PORTS_START,
|
||||||
|
.end = PNX833X_USB_PORTS_END,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.start = PNX833X_PIC_USB_INT,
|
||||||
|
.end = PNX833X_PIC_USB_INT,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device pnx833x_usb_ehci_device = {
|
||||||
|
.name = "pnx833x-ehci",
|
||||||
|
.id = -1,
|
||||||
|
.dev = {
|
||||||
|
.dma_mask = &ehci_dmamask,
|
||||||
|
.coherent_dma_mask = DMA_32BIT_MASK,
|
||||||
|
},
|
||||||
|
.num_resources = ARRAY_SIZE(pnx833x_usb_ehci_resources),
|
||||||
|
.resource = pnx833x_usb_ehci_resources,
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_I2C_PNX0105
|
||||||
|
static struct resource pnx833x_i2c0_resources[] = {
|
||||||
|
{
|
||||||
|
.start = PNX833X_I2C0_PORTS_START,
|
||||||
|
.end = PNX833X_I2C0_PORTS_END,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = PNX833X_PIC_I2C0_INT,
|
||||||
|
.end = PNX833X_PIC_I2C0_INT,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct resource pnx833x_i2c1_resources[] = {
|
||||||
|
{
|
||||||
|
.start = PNX833X_I2C1_PORTS_START,
|
||||||
|
.end = PNX833X_I2C1_PORTS_END,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.start = PNX833X_PIC_I2C1_INT,
|
||||||
|
.end = PNX833X_PIC_I2C1_INT,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct i2c_pnx0105_dev pnx833x_i2c_dev[] = {
|
||||||
|
{
|
||||||
|
.base = PNX833X_I2C0_PORTS_START,
|
||||||
|
.irq = -1, /* should be PNX833X_PIC_I2C0_INT but polling is faster */
|
||||||
|
.clock = 6, /* 0 == 400 kHz, 4 == 100 kHz(Maximum HDMI), 6 = 50kHz(Prefered HDCP) */
|
||||||
|
.bus_addr = 0, /* no slave support */
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.base = PNX833X_I2C1_PORTS_START,
|
||||||
|
.irq = -1, /* on high freq, polling is faster */
|
||||||
|
/*.irq = PNX833X_PIC_I2C1_INT,*/
|
||||||
|
.clock = 4, /* 0 == 400 kHz, 4 == 100 kHz. 100 kHz seems a safe default for now */
|
||||||
|
.bus_addr = 0, /* no slave support */
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device pnx833x_i2c0_device = {
|
||||||
|
.name = "i2c-pnx0105",
|
||||||
|
.id = 0,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &pnx833x_i2c_dev[0],
|
||||||
|
},
|
||||||
|
.num_resources = ARRAY_SIZE(pnx833x_i2c0_resources),
|
||||||
|
.resource = pnx833x_i2c0_resources,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device pnx833x_i2c1_device = {
|
||||||
|
.name = "i2c-pnx0105",
|
||||||
|
.id = 1,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &pnx833x_i2c_dev[1],
|
||||||
|
},
|
||||||
|
.num_resources = ARRAY_SIZE(pnx833x_i2c1_resources),
|
||||||
|
.resource = pnx833x_i2c1_resources,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static u64 ethernet_dmamask = DMA_32BIT_MASK;
|
||||||
|
|
||||||
|
static struct resource pnx833x_ethernet_resources[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = PNX8335_IP3902_PORTS_START,
|
||||||
|
.end = PNX8335_IP3902_PORTS_END,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.start = PNX8335_PIC_ETHERNET_INT,
|
||||||
|
.end = PNX8335_PIC_ETHERNET_INT,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device pnx833x_ethernet_device = {
|
||||||
|
.name = "ip3902-eth",
|
||||||
|
.id = -1,
|
||||||
|
.dev = {
|
||||||
|
.dma_mask = ðernet_dmamask,
|
||||||
|
.coherent_dma_mask = DMA_32BIT_MASK,
|
||||||
|
},
|
||||||
|
.num_resources = ARRAY_SIZE(pnx833x_ethernet_resources),
|
||||||
|
.resource = pnx833x_ethernet_resources,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct resource pnx833x_sata_resources[] = {
|
||||||
|
[0] = {
|
||||||
|
.start = PNX8335_SATA_PORTS_START,
|
||||||
|
.end = PNX8335_SATA_PORTS_END,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
[1] = {
|
||||||
|
.start = PNX8335_PIC_SATA_INT,
|
||||||
|
.end = PNX8335_PIC_SATA_INT,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device pnx833x_sata_device = {
|
||||||
|
.name = "pnx833x-sata",
|
||||||
|
.id = -1,
|
||||||
|
.num_resources = ARRAY_SIZE(pnx833x_sata_resources),
|
||||||
|
.resource = pnx833x_sata_resources,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *part_probes[] = {
|
||||||
|
"cmdlinepart",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
pnx833x_flash_nand_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl)
|
||||||
|
{
|
||||||
|
struct nand_chip *this = mtd->priv;
|
||||||
|
unsigned long nandaddr = (unsigned long)this->IO_ADDR_W;
|
||||||
|
|
||||||
|
if (cmd == NAND_CMD_NONE)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (ctrl & NAND_CLE)
|
||||||
|
writeb(cmd, (void __iomem *)(nandaddr + PNX8335_NAND_CLE_MASK));
|
||||||
|
else
|
||||||
|
writeb(cmd, (void __iomem *)(nandaddr + PNX8335_NAND_ALE_MASK));
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct platform_nand_data pnx833x_flash_nand_data = {
|
||||||
|
.chip = {
|
||||||
|
.chip_delay = 25,
|
||||||
|
.part_probe_types = part_probes,
|
||||||
|
},
|
||||||
|
.ctrl = {
|
||||||
|
.cmd_ctrl = pnx833x_flash_nand_cmd_ctrl
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set start to be the correct address (PNX8335_NAND_BASE with no 0xb!!),
|
||||||
|
* 12 bytes more seems to be the standard that allows for NAND access.
|
||||||
|
*/
|
||||||
|
static struct resource pnx833x_flash_nand_resource = {
|
||||||
|
.start = PNX8335_NAND_BASE,
|
||||||
|
.end = PNX8335_NAND_BASE + 12,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device pnx833x_flash_nand = {
|
||||||
|
.name = "gen_nand",
|
||||||
|
.id = -1,
|
||||||
|
.num_resources = 1,
|
||||||
|
.resource = &pnx833x_flash_nand_resource,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &pnx833x_flash_nand_data,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device *pnx833x_platform_devices[] __initdata = {
|
||||||
|
&pnx833x_uart_device,
|
||||||
|
&pnx833x_usb_ehci_device,
|
||||||
|
#ifdef CONFIG_I2C_PNX0105
|
||||||
|
&pnx833x_i2c0_device,
|
||||||
|
&pnx833x_i2c1_device,
|
||||||
|
#endif
|
||||||
|
&pnx833x_ethernet_device,
|
||||||
|
&pnx833x_sata_device,
|
||||||
|
&pnx833x_flash_nand,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __init pnx833x_platform_init(void)
|
||||||
|
{
|
||||||
|
int res;
|
||||||
|
|
||||||
|
res = platform_add_devices(pnx833x_platform_devices,
|
||||||
|
ARRAY_SIZE(pnx833x_platform_devices));
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
arch_initcall(pnx833x_platform_init);
|
70
arch/mips/nxp/pnx833x/common/prom.c
Normal file
70
arch/mips/nxp/pnx833x/common/prom.c
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
/*
|
||||||
|
* prom.c:
|
||||||
|
*
|
||||||
|
* Copyright 2008 NXP Semiconductors
|
||||||
|
* Chris Steel <chris.steel@nxp.com>
|
||||||
|
* Daniel Laird <daniel.j.laird@nxp.com>
|
||||||
|
*
|
||||||
|
* Based on software written by:
|
||||||
|
* Nikita Youshchenko <yoush@debian.org>, based on PNX8550 code.
|
||||||
|
*
|
||||||
|
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
#include <linux/init.h>
|
||||||
|
#include <asm/bootinfo.h>
|
||||||
|
#include <linux/string.h>
|
||||||
|
|
||||||
|
void __init prom_init_cmdline(void)
|
||||||
|
{
|
||||||
|
int argc = fw_arg0;
|
||||||
|
char **argv = (char **)fw_arg1;
|
||||||
|
char *c = &(arcs_cmdline[0]);
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 1; i < argc; i++) {
|
||||||
|
strcpy(c, argv[i]);
|
||||||
|
c += strlen(argv[i]);
|
||||||
|
if (i < argc-1)
|
||||||
|
*c++ = ' ';
|
||||||
|
}
|
||||||
|
*c = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
char __init *prom_getenv(char *envname)
|
||||||
|
{
|
||||||
|
extern char **prom_envp;
|
||||||
|
char **env = prom_envp;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
i = strlen(envname);
|
||||||
|
|
||||||
|
while (*env) {
|
||||||
|
if (strncmp(envname, *env, i) == 0 && *(*env+i) == '=')
|
||||||
|
return *env + i + 1;
|
||||||
|
env++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void __init prom_free_prom_memory(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
char * __init prom_getcmdline(void)
|
||||||
|
{
|
||||||
|
return arcs_cmdline;
|
||||||
|
}
|
||||||
|
|
45
arch/mips/nxp/pnx833x/common/reset.c
Normal file
45
arch/mips/nxp/pnx833x/common/reset.c
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
* reset.c: reset support for PNX833X.
|
||||||
|
*
|
||||||
|
* Copyright 2008 NXP Semiconductors
|
||||||
|
* Chris Steel <chris.steel@nxp.com>
|
||||||
|
* Daniel Laird <daniel.j.laird@nxp.com>
|
||||||
|
*
|
||||||
|
* Based on software written by:
|
||||||
|
* Nikita Youshchenko <yoush@debian.org>, based on PNX8550 code.
|
||||||
|
*
|
||||||
|
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
#include <linux/slab.h>
|
||||||
|
#include <linux/reboot.h>
|
||||||
|
#include <pnx833x.h>
|
||||||
|
|
||||||
|
void pnx833x_machine_restart(char *command)
|
||||||
|
{
|
||||||
|
PNX833X_RESET_CONTROL_2 = 0;
|
||||||
|
PNX833X_RESET_CONTROL = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void pnx833x_machine_halt(void)
|
||||||
|
{
|
||||||
|
while (1)
|
||||||
|
__asm__ __volatile__ ("wait");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void pnx833x_machine_power_off(void)
|
||||||
|
{
|
||||||
|
pnx833x_machine_halt();
|
||||||
|
}
|
64
arch/mips/nxp/pnx833x/common/setup.c
Normal file
64
arch/mips/nxp/pnx833x/common/setup.c
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
/*
|
||||||
|
* setup.c: Setup PNX833X Soc.
|
||||||
|
*
|
||||||
|
* Copyright 2008 NXP Semiconductors
|
||||||
|
* Chris Steel <chris.steel@nxp.com>
|
||||||
|
* Daniel Laird <daniel.j.laird@nxp.com>
|
||||||
|
*
|
||||||
|
* Based on software written by:
|
||||||
|
* Nikita Youshchenko <yoush@debian.org>, based on PNX8550 code.
|
||||||
|
*
|
||||||
|
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
#include <linux/init.h>
|
||||||
|
#include <linux/interrupt.h>
|
||||||
|
#include <linux/ioport.h>
|
||||||
|
#include <linux/io.h>
|
||||||
|
#include <linux/pci.h>
|
||||||
|
#include <asm/reboot.h>
|
||||||
|
#include <pnx833x.h>
|
||||||
|
#include <gpio.h>
|
||||||
|
|
||||||
|
extern void pnx833x_board_setup(void);
|
||||||
|
extern void pnx833x_machine_restart(char *);
|
||||||
|
extern void pnx833x_machine_halt(void);
|
||||||
|
extern void pnx833x_machine_power_off(void);
|
||||||
|
|
||||||
|
int __init plat_mem_setup(void)
|
||||||
|
{
|
||||||
|
/* fake pci bus to avoid bounce buffers */
|
||||||
|
PCI_DMA_BUS_IS_PHYS = 1;
|
||||||
|
|
||||||
|
/* set mips clock to 320MHz */
|
||||||
|
#if defined(CONFIG_SOC_PNX8335)
|
||||||
|
PNX8335_WRITEFIELD(0x17, CLOCK_PLL_CPU_CTL, FREQ);
|
||||||
|
#endif
|
||||||
|
pnx833x_gpio_init(); /* so it will be ready in board_setup() */
|
||||||
|
|
||||||
|
pnx833x_board_setup();
|
||||||
|
|
||||||
|
_machine_restart = pnx833x_machine_restart;
|
||||||
|
_machine_halt = pnx833x_machine_halt;
|
||||||
|
pm_power_off = pnx833x_machine_power_off;
|
||||||
|
|
||||||
|
/* IO/MEM resources. */
|
||||||
|
set_io_port_base(KSEG1);
|
||||||
|
ioport_resource.start = 0;
|
||||||
|
ioport_resource.end = ~0;
|
||||||
|
iomem_resource.start = 0;
|
||||||
|
iomem_resource.end = ~0;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
3
arch/mips/nxp/pnx833x/stb22x/Makefile
Normal file
3
arch/mips/nxp/pnx833x/stb22x/Makefile
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
lib-y := board.o
|
||||||
|
|
||||||
|
EXTRA_CFLAGS += -Werror
|
133
arch/mips/nxp/pnx833x/stb22x/board.c
Normal file
133
arch/mips/nxp/pnx833x/stb22x/board.c
Normal file
|
@ -0,0 +1,133 @@
|
||||||
|
/*
|
||||||
|
* board.c: STB225 board support.
|
||||||
|
*
|
||||||
|
* Copyright 2008 NXP Semiconductors
|
||||||
|
* Chris Steel <chris.steel@nxp.com>
|
||||||
|
* Daniel Laird <daniel.j.laird@nxp.com>
|
||||||
|
*
|
||||||
|
* Based on software written by:
|
||||||
|
* Nikita Youshchenko <yoush@debian.org>, based on PNX8550 code.
|
||||||
|
*
|
||||||
|
* 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., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
#include <linux/init.h>
|
||||||
|
#include <asm/bootinfo.h>
|
||||||
|
#include <linux/mm.h>
|
||||||
|
#include <pnx833x.h>
|
||||||
|
#include <gpio.h>
|
||||||
|
|
||||||
|
/* endianess twiddlers */
|
||||||
|
#define PNX8335_DEBUG0 0x4400
|
||||||
|
#define PNX8335_DEBUG1 0x4404
|
||||||
|
#define PNX8335_DEBUG2 0x4408
|
||||||
|
#define PNX8335_DEBUG3 0x440c
|
||||||
|
#define PNX8335_DEBUG4 0x4410
|
||||||
|
#define PNX8335_DEBUG5 0x4414
|
||||||
|
#define PNX8335_DEBUG6 0x4418
|
||||||
|
#define PNX8335_DEBUG7 0x441c
|
||||||
|
|
||||||
|
int prom_argc;
|
||||||
|
char **prom_argv = 0, **prom_envp = 0;
|
||||||
|
|
||||||
|
extern void prom_init_cmdline(void);
|
||||||
|
extern char *prom_getenv(char *envname);
|
||||||
|
|
||||||
|
const char *get_system_type(void)
|
||||||
|
{
|
||||||
|
return "NXP STB22x";
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline unsigned long env_or_default(char *env, unsigned long dfl)
|
||||||
|
{
|
||||||
|
char *str = prom_getenv(env);
|
||||||
|
return str ? simple_strtol(str, 0, 0) : dfl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void __init prom_init(void)
|
||||||
|
{
|
||||||
|
unsigned long memsize;
|
||||||
|
|
||||||
|
prom_argc = fw_arg0;
|
||||||
|
prom_argv = (char **)fw_arg1;
|
||||||
|
prom_envp = (char **)fw_arg2;
|
||||||
|
|
||||||
|
prom_init_cmdline();
|
||||||
|
|
||||||
|
memsize = env_or_default("memsize", 0x02000000);
|
||||||
|
add_memory_region(0, memsize, BOOT_MEM_RAM);
|
||||||
|
}
|
||||||
|
|
||||||
|
void __init pnx833x_board_setup(void)
|
||||||
|
{
|
||||||
|
pnx833x_gpio_select_function_alt(4);
|
||||||
|
pnx833x_gpio_select_output(4);
|
||||||
|
pnx833x_gpio_select_function_alt(5);
|
||||||
|
pnx833x_gpio_select_input(5);
|
||||||
|
pnx833x_gpio_select_function_alt(6);
|
||||||
|
pnx833x_gpio_select_input(6);
|
||||||
|
pnx833x_gpio_select_function_alt(7);
|
||||||
|
pnx833x_gpio_select_output(7);
|
||||||
|
|
||||||
|
pnx833x_gpio_select_function_alt(25);
|
||||||
|
pnx833x_gpio_select_function_alt(26);
|
||||||
|
|
||||||
|
pnx833x_gpio_select_function_alt(27);
|
||||||
|
pnx833x_gpio_select_function_alt(28);
|
||||||
|
pnx833x_gpio_select_function_alt(29);
|
||||||
|
pnx833x_gpio_select_function_alt(30);
|
||||||
|
pnx833x_gpio_select_function_alt(31);
|
||||||
|
pnx833x_gpio_select_function_alt(32);
|
||||||
|
pnx833x_gpio_select_function_alt(33);
|
||||||
|
|
||||||
|
#if defined(CONFIG_MTD_NAND_PLATFORM) || defined(CONFIG_MTD_NAND_PLATFORM_MODULE)
|
||||||
|
/* Setup MIU for NAND access on CS0...
|
||||||
|
*
|
||||||
|
* (it seems that we must also configure CS1 for reliable operation,
|
||||||
|
* otherwise the first read ID command will fail if it's read as 4 bytes
|
||||||
|
* but pass if it's read as 1 word.)
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Setup MIU CS0 & CS1 timing */
|
||||||
|
PNX833X_MIU_SEL0 = 0;
|
||||||
|
PNX833X_MIU_SEL1 = 0;
|
||||||
|
PNX833X_MIU_SEL0_TIMING = 0x50003081;
|
||||||
|
PNX833X_MIU_SEL1_TIMING = 0x50003081;
|
||||||
|
|
||||||
|
/* Setup GPIO 00 for use as MIU CS1 (CS0 is not multiplexed, so does not need this) */
|
||||||
|
pnx833x_gpio_select_function_alt(0);
|
||||||
|
|
||||||
|
/* Setup GPIO 04 to input NAND read/busy signal */
|
||||||
|
pnx833x_gpio_select_function_io(4);
|
||||||
|
pnx833x_gpio_select_input(4);
|
||||||
|
|
||||||
|
/* Setup GPIO 05 to disable NAND write protect */
|
||||||
|
pnx833x_gpio_select_function_io(5);
|
||||||
|
pnx833x_gpio_select_output(5);
|
||||||
|
pnx833x_gpio_write(1, 5);
|
||||||
|
|
||||||
|
#elif defined(CONFIG_MTD_CFI) || defined(CONFIG_MTD_CFI_MODULE)
|
||||||
|
|
||||||
|
/* Set up MIU for 16-bit NOR access on CS0 and CS1... */
|
||||||
|
|
||||||
|
/* Setup MIU CS0 & CS1 timing */
|
||||||
|
PNX833X_MIU_SEL0 = 1;
|
||||||
|
PNX833X_MIU_SEL1 = 1;
|
||||||
|
PNX833X_MIU_SEL0_TIMING = 0x6A08D082;
|
||||||
|
PNX833X_MIU_SEL1_TIMING = 0x6A08D082;
|
||||||
|
|
||||||
|
/* Setup GPIO 00 for use as MIU CS1 (CS0 is not multiplexed, so does not need this) */
|
||||||
|
pnx833x_gpio_select_function_alt(0);
|
||||||
|
#endif
|
||||||
|
}
|
|
@ -13,7 +13,7 @@ obj-$(CONFIG_MIPS_MSC) += ops-msc.o
|
||||||
obj-$(CONFIG_MIPS_NILE4) += ops-nile4.o
|
obj-$(CONFIG_MIPS_NILE4) += ops-nile4.o
|
||||||
obj-$(CONFIG_SOC_TX3927) += ops-tx3927.o
|
obj-$(CONFIG_SOC_TX3927) += ops-tx3927.o
|
||||||
obj-$(CONFIG_PCI_VR41XX) += ops-vr41xx.o pci-vr41xx.o
|
obj-$(CONFIG_PCI_VR41XX) += ops-vr41xx.o pci-vr41xx.o
|
||||||
obj-$(CONFIG_MARKEINS) += ops-emma2rh.o pci-emma2rh.o fixup-emma2rh.o
|
obj-$(CONFIG_NEC_MARKEINS) += ops-emma2rh.o pci-emma2rh.o fixup-emma2rh.o
|
||||||
obj-$(CONFIG_PCI_TX4927) += ops-tx4927.o
|
obj-$(CONFIG_PCI_TX4927) += ops-tx4927.o
|
||||||
obj-$(CONFIG_BCM47XX) += pci-bcm47xx.o
|
obj-$(CONFIG_BCM47XX) += pci-bcm47xx.o
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
|
|
||||||
#include <asm/bootinfo.h>
|
#include <asm/bootinfo.h>
|
||||||
|
|
||||||
#include <asm/emma2rh/emma2rh.h>
|
#include <asm/emma/emma2rh.h>
|
||||||
|
|
||||||
#define EMMA2RH_PCI_HOST_SLOT 0x09
|
#define EMMA2RH_PCI_HOST_SLOT 0x09
|
||||||
#define EMMA2RH_USB_SLOT 0x03
|
#define EMMA2RH_USB_SLOT 0x03
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
|
||||||
#include <asm/mach-rc32434/rc32434.h>
|
#include <asm/mach-rc32434/rc32434.h>
|
||||||
|
#include <asm/mach-rc32434/irq.h>
|
||||||
|
|
||||||
static int __devinitdata irq_map[2][12] = {
|
static int __devinitdata irq_map[2][12] = {
|
||||||
{0, 0, 2, 3, 2, 3, 0, 0, 0, 0, 0, 1},
|
{0, 0, 2, 3, 2, 3, 0, 0, 0, 0, 0, 1},
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
#include <asm/addrspace.h>
|
#include <asm/addrspace.h>
|
||||||
#include <asm/debug.h>
|
#include <asm/debug.h>
|
||||||
|
|
||||||
#include <asm/emma2rh/emma2rh.h>
|
#include <asm/emma/emma2rh.h>
|
||||||
|
|
||||||
#define RTABORT (0x1<<9)
|
#define RTABORT (0x1<<9)
|
||||||
#define RMABORT (0x1<<10)
|
#define RMABORT (0x1<<10)
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
|
|
||||||
#include <asm/bootinfo.h>
|
#include <asm/bootinfo.h>
|
||||||
|
|
||||||
#include <asm/emma2rh/emma2rh.h>
|
#include <asm/emma/emma2rh.h>
|
||||||
|
|
||||||
static struct resource pci_io_resource = {
|
static struct resource pci_io_resource = {
|
||||||
.name = "pci IO space",
|
.name = "pci IO space",
|
||||||
|
|
|
@ -280,7 +280,7 @@ static int __init plat_setup_devices(void)
|
||||||
{
|
{
|
||||||
/* Look for the CF card reader */
|
/* Look for the CF card reader */
|
||||||
if (!readl(IDT434_REG_BASE + DEV1MASK))
|
if (!readl(IDT434_REG_BASE + DEV1MASK))
|
||||||
rb532_devs[1] = NULL;
|
rb532_devs[2] = NULL; /* disable cf_slot0 at index 2 */
|
||||||
else {
|
else {
|
||||||
cf_slot0_res[0].start =
|
cf_slot0_res[0].start =
|
||||||
readl(IDT434_REG_BASE + DEV1BASE);
|
readl(IDT434_REG_BASE + DEV1BASE);
|
||||||
|
|
|
@ -310,6 +310,10 @@ int __init rb532_gpio_init(void)
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set the interrupt status and level for the CF pin */
|
||||||
|
rb532_gpio_set_int_level(&rb532_gpio_chip->chip, CF_GPIO_NUM, 1);
|
||||||
|
rb532_gpio_set_int_status(&rb532_gpio_chip->chip, CF_GPIO_NUM, 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
arch_initcall(rb532_gpio_init);
|
arch_initcall(rb532_gpio_init);
|
||||||
|
|
|
@ -12,20 +12,11 @@
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/kernel_stat.h>
|
#include <linux/kernel_stat.h>
|
||||||
#include <linux/signal.h>
|
|
||||||
#include <linux/sched.h>
|
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/irq.h>
|
|
||||||
|
|
||||||
#include <asm/mipsregs.h>
|
|
||||||
#include <asm/addrspace.h>
|
|
||||||
#include <asm/irq_cpu.h>
|
#include <asm/irq_cpu.h>
|
||||||
#include <asm/sgi/ioc.h>
|
|
||||||
#include <asm/sgi/hpc3.h>
|
#include <asm/sgi/hpc3.h>
|
||||||
#include <asm/sgi/ip22.h>
|
#include <asm/sgi/ip22.h>
|
||||||
#include <asm/time.h>
|
|
||||||
|
|
||||||
/* #define DEBUG_SGINT */
|
|
||||||
|
|
||||||
/* So far nothing hangs here */
|
/* So far nothing hangs here */
|
||||||
#undef USE_LIO3_IRQ
|
#undef USE_LIO3_IRQ
|
||||||
|
@ -68,7 +59,7 @@ static void enable_local1_irq(unsigned int irq)
|
||||||
sgint->imask1 |= (1 << (irq - SGINT_LOCAL1));
|
sgint->imask1 |= (1 << (irq - SGINT_LOCAL1));
|
||||||
}
|
}
|
||||||
|
|
||||||
void disable_local1_irq(unsigned int irq)
|
static void disable_local1_irq(unsigned int irq)
|
||||||
{
|
{
|
||||||
sgint->imask1 &= ~(1 << (irq - SGINT_LOCAL1));
|
sgint->imask1 &= ~(1 << (irq - SGINT_LOCAL1));
|
||||||
}
|
}
|
||||||
|
@ -87,7 +78,7 @@ static void enable_local2_irq(unsigned int irq)
|
||||||
sgint->cmeimask0 |= (1 << (irq - SGINT_LOCAL2));
|
sgint->cmeimask0 |= (1 << (irq - SGINT_LOCAL2));
|
||||||
}
|
}
|
||||||
|
|
||||||
void disable_local2_irq(unsigned int irq)
|
static void disable_local2_irq(unsigned int irq)
|
||||||
{
|
{
|
||||||
sgint->cmeimask0 &= ~(1 << (irq - SGINT_LOCAL2));
|
sgint->cmeimask0 &= ~(1 << (irq - SGINT_LOCAL2));
|
||||||
if (!sgint->cmeimask0)
|
if (!sgint->cmeimask0)
|
||||||
|
@ -108,7 +99,7 @@ static void enable_local3_irq(unsigned int irq)
|
||||||
sgint->cmeimask1 |= (1 << (irq - SGINT_LOCAL3));
|
sgint->cmeimask1 |= (1 << (irq - SGINT_LOCAL3));
|
||||||
}
|
}
|
||||||
|
|
||||||
void disable_local3_irq(unsigned int irq)
|
static void disable_local3_irq(unsigned int irq)
|
||||||
{
|
{
|
||||||
sgint->cmeimask1 &= ~(1 << (irq - SGINT_LOCAL3));
|
sgint->cmeimask1 &= ~(1 << (irq - SGINT_LOCAL3));
|
||||||
if (!sgint->cmeimask1)
|
if (!sgint->cmeimask1)
|
||||||
|
|
|
@ -46,9 +46,10 @@ config TOSHIBA_RBTX4938
|
||||||
support this machine type
|
support this machine type
|
||||||
|
|
||||||
config TOSHIBA_RBTX4939
|
config TOSHIBA_RBTX4939
|
||||||
bool "Toshiba RBTX4939 bobard"
|
bool "Toshiba RBTX4939 board"
|
||||||
depends on MACH_TX49XX
|
depends on MACH_TX49XX
|
||||||
select SOC_TX4939
|
select SOC_TX4939
|
||||||
|
select TXX9_7SEGLED
|
||||||
help
|
help
|
||||||
This Toshiba board is based on the TX4939 processor. Say Y here to
|
This Toshiba board is based on the TX4939 processor. Say Y here to
|
||||||
support this machine type
|
support this machine type
|
||||||
|
@ -86,6 +87,9 @@ config SOC_TX4939
|
||||||
select HW_HAS_PCI
|
select HW_HAS_PCI
|
||||||
select PCI_TX4927
|
select PCI_TX4927
|
||||||
|
|
||||||
|
config TXX9_7SEGLED
|
||||||
|
bool
|
||||||
|
|
||||||
config TOSHIBA_FPCIB0
|
config TOSHIBA_FPCIB0
|
||||||
bool "FPCIB0 Backplane Support"
|
bool "FPCIB0 Backplane Support"
|
||||||
depends on PCI && MACH_TXX9
|
depends on PCI && MACH_TXX9
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue