Merge branch 'linus' into core/rcu
Merge reason: Backmerge latest upstream to queue up dependent fix in the scheduler. Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
commit
e2f4699ac1
|
@ -0,0 +1,79 @@
|
|||
What: /sys/devices/.../power/
|
||||
Date: January 2009
|
||||
Contact: Rafael J. Wysocki <rjw@sisk.pl>
|
||||
Description:
|
||||
The /sys/devices/.../power directory contains attributes
|
||||
allowing the user space to check and modify some power
|
||||
management related properties of given device.
|
||||
|
||||
What: /sys/devices/.../power/wakeup
|
||||
Date: January 2009
|
||||
Contact: Rafael J. Wysocki <rjw@sisk.pl>
|
||||
Description:
|
||||
The /sys/devices/.../power/wakeup attribute allows the user
|
||||
space to check if the device is enabled to wake up the system
|
||||
from sleep states, such as the memory sleep state (suspend to
|
||||
RAM) and hibernation (suspend to disk), and to enable or disable
|
||||
it to do that as desired.
|
||||
|
||||
Some devices support "wakeup" events, which are hardware signals
|
||||
used to activate the system from a sleep state. Such devices
|
||||
have one of the following two values for the sysfs power/wakeup
|
||||
file:
|
||||
|
||||
+ "enabled\n" to issue the events;
|
||||
+ "disabled\n" not to do so;
|
||||
|
||||
In that cases the user space can change the setting represented
|
||||
by the contents of this file by writing either "enabled", or
|
||||
"disabled" to it.
|
||||
|
||||
For the devices that are not capable of generating system wakeup
|
||||
events this file contains "\n". In that cases the user space
|
||||
cannot modify the contents of this file and the device cannot be
|
||||
enabled to wake up the system.
|
||||
|
||||
What: /sys/devices/.../power/control
|
||||
Date: January 2009
|
||||
Contact: Rafael J. Wysocki <rjw@sisk.pl>
|
||||
Description:
|
||||
The /sys/devices/.../power/control attribute allows the user
|
||||
space to control the run-time power management of the device.
|
||||
|
||||
All devices have one of the following two values for the
|
||||
power/control file:
|
||||
|
||||
+ "auto\n" to allow the device to be power managed at run time;
|
||||
+ "on\n" to prevent the device from being power managed;
|
||||
|
||||
The default for all devices is "auto", which means that they may
|
||||
be subject to automatic power management, depending on their
|
||||
drivers. Changing this attribute to "on" prevents the driver
|
||||
from power managing the device at run time. Doing that while
|
||||
the device is suspended causes it to be woken up.
|
||||
|
||||
What: /sys/devices/.../power/async
|
||||
Date: January 2009
|
||||
Contact: Rafael J. Wysocki <rjw@sisk.pl>
|
||||
Description:
|
||||
The /sys/devices/.../async attribute allows the user space to
|
||||
enable or diasble the device's suspend and resume callbacks to
|
||||
be executed asynchronously (ie. in separate threads, in parallel
|
||||
with the main suspend/resume thread) during system-wide power
|
||||
transitions (eg. suspend to RAM, hibernation).
|
||||
|
||||
All devices have one of the following two values for the
|
||||
power/async file:
|
||||
|
||||
+ "enabled\n" to permit the asynchronous suspend/resume;
|
||||
+ "disabled\n" to forbid it;
|
||||
|
||||
The value of this attribute may be changed by writing either
|
||||
"enabled", or "disabled" to it.
|
||||
|
||||
It generally is unsafe to permit the asynchronous suspend/resume
|
||||
of a device unless it is certain that all of the PM dependencies
|
||||
of the device are known to the PM core. However, for some
|
||||
devices this attribute is set to "enabled" by bus type code or
|
||||
device drivers and in that cases it should be safe to leave the
|
||||
default value.
|
|
@ -101,3 +101,16 @@ Description:
|
|||
|
||||
CAUTION: Using it will cause your machine's real-time (CMOS)
|
||||
clock to be set to a random invalid time after a resume.
|
||||
|
||||
What: /sys/power/pm_async
|
||||
Date: January 2009
|
||||
Contact: Rafael J. Wysocki <rjw@sisk.pl>
|
||||
Description:
|
||||
The /sys/power/pm_async file controls the switch allowing the
|
||||
user space to enable or disable asynchronous suspend and resume
|
||||
of devices. If enabled, this feature will cause some device
|
||||
drivers' suspend and resume callbacks to be executed in parallel
|
||||
with each other and with the main suspend thread. It is enabled
|
||||
if this file contains "1", which is the default. It may be
|
||||
disabled by writing "0" to this file, in which case all devices
|
||||
will be suspended and resumed synchronously.
|
||||
|
|
|
@ -589,7 +589,8 @@ number of a video input as in &v4l2-input; field
|
|||
<entry></entry>
|
||||
<entry>A place holder for future extensions and custom
|
||||
(driver defined) buffer types
|
||||
<constant>V4L2_BUF_TYPE_PRIVATE</constant> and higher.</entry>
|
||||
<constant>V4L2_BUF_TYPE_PRIVATE</constant> and higher. Applications
|
||||
should set this to 0.</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
|
|
|
@ -54,12 +54,10 @@ to enqueue an empty (capturing) or filled (output) buffer in the
|
|||
driver's incoming queue. The semantics depend on the selected I/O
|
||||
method.</para>
|
||||
|
||||
<para>To enqueue a <link linkend="mmap">memory mapped</link>
|
||||
buffer applications set the <structfield>type</structfield> field of a
|
||||
&v4l2-buffer; to the same buffer type as previously &v4l2-format;
|
||||
<structfield>type</structfield> and &v4l2-requestbuffers;
|
||||
<structfield>type</structfield>, the <structfield>memory</structfield>
|
||||
field to <constant>V4L2_MEMORY_MMAP</constant> and the
|
||||
<para>To enqueue a buffer applications set the <structfield>type</structfield>
|
||||
field of a &v4l2-buffer; to the same buffer type as was previously used
|
||||
with &v4l2-format; <structfield>type</structfield> and &v4l2-requestbuffers;
|
||||
<structfield>type</structfield>. Applications must also set the
|
||||
<structfield>index</structfield> field. Valid index numbers range from
|
||||
zero to the number of buffers allocated with &VIDIOC-REQBUFS;
|
||||
(&v4l2-requestbuffers; <structfield>count</structfield>) minus one. The
|
||||
|
@ -70,8 +68,19 @@ intended for output (<structfield>type</structfield> is
|
|||
<constant>V4L2_BUF_TYPE_VBI_OUTPUT</constant>) applications must also
|
||||
initialize the <structfield>bytesused</structfield>,
|
||||
<structfield>field</structfield> and
|
||||
<structfield>timestamp</structfield> fields. See <xref
|
||||
linkend="buffer" /> for details. When
|
||||
<structfield>timestamp</structfield> fields, see <xref
|
||||
linkend="buffer" /> for details.
|
||||
Applications must also set <structfield>flags</structfield> to 0. If a driver
|
||||
supports capturing from specific video inputs and you want to specify a video
|
||||
input, then <structfield>flags</structfield> should be set to
|
||||
<constant>V4L2_BUF_FLAG_INPUT</constant> and the field
|
||||
<structfield>input</structfield> must be initialized to the desired input.
|
||||
The <structfield>reserved</structfield> field must be set to 0.
|
||||
</para>
|
||||
|
||||
<para>To enqueue a <link linkend="mmap">memory mapped</link>
|
||||
buffer applications set the <structfield>memory</structfield>
|
||||
field to <constant>V4L2_MEMORY_MMAP</constant>. When
|
||||
<constant>VIDIOC_QBUF</constant> is called with a pointer to this
|
||||
structure the driver sets the
|
||||
<constant>V4L2_BUF_FLAG_MAPPED</constant> and
|
||||
|
@ -81,14 +90,10 @@ structure the driver sets the
|
|||
&EINVAL;.</para>
|
||||
|
||||
<para>To enqueue a <link linkend="userp">user pointer</link>
|
||||
buffer applications set the <structfield>type</structfield> field of a
|
||||
&v4l2-buffer; to the same buffer type as previously &v4l2-format;
|
||||
<structfield>type</structfield> and &v4l2-requestbuffers;
|
||||
<structfield>type</structfield>, the <structfield>memory</structfield>
|
||||
field to <constant>V4L2_MEMORY_USERPTR</constant> and the
|
||||
buffer applications set the <structfield>memory</structfield>
|
||||
field to <constant>V4L2_MEMORY_USERPTR</constant>, the
|
||||
<structfield>m.userptr</structfield> field to the address of the
|
||||
buffer and <structfield>length</structfield> to its size. When the
|
||||
buffer is intended for output additional fields must be set as above.
|
||||
buffer and <structfield>length</structfield> to its size.
|
||||
When <constant>VIDIOC_QBUF</constant> is called with a pointer to this
|
||||
structure the driver sets the <constant>V4L2_BUF_FLAG_QUEUED</constant>
|
||||
flag and clears the <constant>V4L2_BUF_FLAG_MAPPED</constant> and
|
||||
|
@ -96,13 +101,14 @@ flag and clears the <constant>V4L2_BUF_FLAG_MAPPED</constant> and
|
|||
<structfield>flags</structfield> field, or it returns an error code.
|
||||
This ioctl locks the memory pages of the buffer in physical memory,
|
||||
they cannot be swapped out to disk. Buffers remain locked until
|
||||
dequeued, until the &VIDIOC-STREAMOFF; or &VIDIOC-REQBUFS; ioctl are
|
||||
dequeued, until the &VIDIOC-STREAMOFF; or &VIDIOC-REQBUFS; ioctl is
|
||||
called, or until the device is closed.</para>
|
||||
|
||||
<para>Applications call the <constant>VIDIOC_DQBUF</constant>
|
||||
ioctl to dequeue a filled (capturing) or displayed (output) buffer
|
||||
from the driver's outgoing queue. They just set the
|
||||
<structfield>type</structfield> and <structfield>memory</structfield>
|
||||
<structfield>type</structfield>, <structfield>memory</structfield>
|
||||
and <structfield>reserved</structfield>
|
||||
fields of a &v4l2-buffer; as above, when <constant>VIDIOC_DQBUF</constant>
|
||||
is called with a pointer to this structure the driver fills the
|
||||
remaining fields or returns an error code.</para>
|
||||
|
|
|
@ -54,12 +54,13 @@ buffer at any time after buffers have been allocated with the
|
|||
&VIDIOC-REQBUFS; ioctl.</para>
|
||||
|
||||
<para>Applications set the <structfield>type</structfield> field
|
||||
of a &v4l2-buffer; to the same buffer type as previously
|
||||
of a &v4l2-buffer; to the same buffer type as was previously used with
|
||||
&v4l2-format; <structfield>type</structfield> and &v4l2-requestbuffers;
|
||||
<structfield>type</structfield>, and the <structfield>index</structfield>
|
||||
field. Valid index numbers range from zero
|
||||
to the number of buffers allocated with &VIDIOC-REQBUFS;
|
||||
(&v4l2-requestbuffers; <structfield>count</structfield>) minus one.
|
||||
The <structfield>reserved</structfield> field should to set to 0.
|
||||
After calling <constant>VIDIOC_QUERYBUF</constant> with a pointer to
|
||||
this structure drivers return an error code or fill the rest of
|
||||
the structure.</para>
|
||||
|
@ -68,8 +69,8 @@ the structure.</para>
|
|||
<constant>V4L2_BUF_FLAG_MAPPED</constant>,
|
||||
<constant>V4L2_BUF_FLAG_QUEUED</constant> and
|
||||
<constant>V4L2_BUF_FLAG_DONE</constant> flags will be valid. The
|
||||
<structfield>memory</structfield> field will be set to
|
||||
<constant>V4L2_MEMORY_MMAP</constant>, the <structfield>m.offset</structfield>
|
||||
<structfield>memory</structfield> field will be set to the current
|
||||
I/O method, the <structfield>m.offset</structfield>
|
||||
contains the offset of the buffer from the start of the device memory,
|
||||
the <structfield>length</structfield> field its size. The driver may
|
||||
or may not set the remaining fields and flags, they are meaningless in
|
||||
|
|
|
@ -54,23 +54,23 @@ I/O. Memory mapped buffers are located in device memory and must be
|
|||
allocated with this ioctl before they can be mapped into the
|
||||
application's address space. User buffers are allocated by
|
||||
applications themselves, and this ioctl is merely used to switch the
|
||||
driver into user pointer I/O mode.</para>
|
||||
driver into user pointer I/O mode and to setup some internal structures.</para>
|
||||
|
||||
<para>To allocate device buffers applications initialize three
|
||||
fields of a <structname>v4l2_requestbuffers</structname> structure.
|
||||
<para>To allocate device buffers applications initialize all
|
||||
fields of the <structname>v4l2_requestbuffers</structname> structure.
|
||||
They set the <structfield>type</structfield> field to the respective
|
||||
stream or buffer type, the <structfield>count</structfield> field to
|
||||
the desired number of buffers, and <structfield>memory</structfield>
|
||||
must be set to <constant>V4L2_MEMORY_MMAP</constant>. When the ioctl
|
||||
is called with a pointer to this structure the driver attempts to
|
||||
allocate the requested number of buffers and stores the actual number
|
||||
the desired number of buffers, <structfield>memory</structfield>
|
||||
must be set to the requested I/O method and the reserved array
|
||||
must be zeroed. When the ioctl
|
||||
is called with a pointer to this structure the driver will attempt to allocate
|
||||
the requested number of buffers and it stores the actual number
|
||||
allocated in the <structfield>count</structfield> field. It can be
|
||||
smaller than the number requested, even zero, when the driver runs out
|
||||
of free memory. A larger number is possible when the driver requires
|
||||
more buffers to function correctly.<footnote>
|
||||
<para>For example video output requires at least two buffers,
|
||||
of free memory. A larger number is also possible when the driver requires
|
||||
more buffers to function correctly. For example video output requires at least two buffers,
|
||||
one displayed and one filled by the application.</para>
|
||||
</footnote> When memory mapping I/O is not supported the ioctl
|
||||
<para>When the I/O method is not supported the ioctl
|
||||
returns an &EINVAL;.</para>
|
||||
|
||||
<para>Applications can call <constant>VIDIOC_REQBUFS</constant>
|
||||
|
@ -81,14 +81,6 @@ in progress, an implicit &VIDIOC-STREAMOFF;. <!-- mhs: I see no
|
|||
reason why munmap()ping one or even all buffers must imply
|
||||
streamoff.--></para>
|
||||
|
||||
<para>To negotiate user pointer I/O, applications initialize only
|
||||
the <structfield>type</structfield> field and set
|
||||
<structfield>memory</structfield> to
|
||||
<constant>V4L2_MEMORY_USERPTR</constant>. When the ioctl is called
|
||||
with a pointer to this structure the driver prepares for user pointer
|
||||
I/O, when this I/O method is not supported the ioctl returns an
|
||||
&EINVAL;.</para>
|
||||
|
||||
<table pgwide="1" frame="none" id="v4l2-requestbuffers">
|
||||
<title>struct <structname>v4l2_requestbuffers</structname></title>
|
||||
<tgroup cols="3">
|
||||
|
@ -97,9 +89,7 @@ I/O, when this I/O method is not supported the ioctl returns an
|
|||
<row>
|
||||
<entry>__u32</entry>
|
||||
<entry><structfield>count</structfield></entry>
|
||||
<entry>The number of buffers requested or granted. This
|
||||
field is only used when <structfield>memory</structfield> is set to
|
||||
<constant>V4L2_MEMORY_MMAP</constant>.</entry>
|
||||
<entry>The number of buffers requested or granted.</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>&v4l2-buf-type;</entry>
|
||||
|
@ -120,7 +110,7 @@ as the &v4l2-format; <structfield>type</structfield> field. See <xref
|
|||
<entry><structfield>reserved</structfield>[2]</entry>
|
||||
<entry>A place holder for future extensions and custom
|
||||
(driver defined) buffer types <constant>V4L2_BUF_TYPE_PRIVATE</constant> and
|
||||
higher.</entry>
|
||||
higher. This array should be zeroed by applications.</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
</tgroup>
|
||||
|
|
|
@ -377,3 +377,27 @@ maps this page at its virtual address.
|
|||
All the functionality of flush_icache_page can be implemented in
|
||||
flush_dcache_page and update_mmu_cache. In 2.7 the hope is to
|
||||
remove this interface completely.
|
||||
|
||||
The final category of APIs is for I/O to deliberately aliased address
|
||||
ranges inside the kernel. Such aliases are set up by use of the
|
||||
vmap/vmalloc API. Since kernel I/O goes via physical pages, the I/O
|
||||
subsystem assumes that the user mapping and kernel offset mapping are
|
||||
the only aliases. This isn't true for vmap aliases, so anything in
|
||||
the kernel trying to do I/O to vmap areas must manually manage
|
||||
coherency. It must do this by flushing the vmap range before doing
|
||||
I/O and invalidating it after the I/O returns.
|
||||
|
||||
void flush_kernel_vmap_range(void *vaddr, int size)
|
||||
flushes the kernel cache for a given virtual address range in
|
||||
the vmap area. This is to make sure that any data the kernel
|
||||
modified in the vmap range is made visible to the physical
|
||||
page. The design is to make this area safe to perform I/O on.
|
||||
Note that this API does *not* also flush the offset map alias
|
||||
of the area.
|
||||
|
||||
void invalidate_kernel_vmap_range(void *vaddr, int size) invalidates
|
||||
the cache for a given virtual address range in the vmap area
|
||||
which prevents the processor from making the cache stale by
|
||||
speculatively reading data while the I/O was occurring to the
|
||||
physical pages. This is only necessary for data reads into the
|
||||
vmap area.
|
||||
|
|
|
@ -69,7 +69,6 @@ av_permissions.h
|
|||
bbootsect
|
||||
bin2c
|
||||
binkernel.spec
|
||||
binoffset
|
||||
bootsect
|
||||
bounds.h
|
||||
bsetup
|
||||
|
|
|
@ -26,7 +26,7 @@ use IO::Handle;
|
|||
"dec3000s", "vp7041", "dibusb", "nxt2002", "nxt2004",
|
||||
"or51211", "or51132_qam", "or51132_vsb", "bluebird",
|
||||
"opera1", "cx231xx", "cx18", "cx23885", "pvrusb2", "mpc718",
|
||||
"af9015");
|
||||
"af9015", "ngene");
|
||||
|
||||
# Check args
|
||||
syntax() if (scalar(@ARGV) != 1);
|
||||
|
@ -39,7 +39,7 @@ for ($i=0; $i < scalar(@components); $i++) {
|
|||
die $@ if $@;
|
||||
print STDERR <<EOF;
|
||||
Firmware(s) $outfile extracted successfully.
|
||||
Now copy it(they) to either /usr/lib/hotplug/firmware or /lib/firmware
|
||||
Now copy it(them) to either /usr/lib/hotplug/firmware or /lib/firmware
|
||||
(depending on configuration of firmware hotplug).
|
||||
EOF
|
||||
exit(0);
|
||||
|
@ -549,6 +549,24 @@ sub af9015 {
|
|||
close INFILE;
|
||||
}
|
||||
|
||||
sub ngene {
|
||||
my $url = "http://www.digitaldevices.de/download/";
|
||||
my $file1 = "ngene_15.fw";
|
||||
my $hash1 = "d798d5a757121174f0dbc5f2833c0c85";
|
||||
my $file2 = "ngene_17.fw";
|
||||
my $hash2 = "26b687136e127b8ac24b81e0eeafc20b";
|
||||
|
||||
checkstandard();
|
||||
|
||||
wgetfile($file1, $url . $file1);
|
||||
verify($file1, $hash1);
|
||||
|
||||
wgetfile($file2, $url . $file2);
|
||||
verify($file2, $hash2);
|
||||
|
||||
"$file1, $file2";
|
||||
}
|
||||
|
||||
# ---------------------------------------------------------------
|
||||
# Utilities
|
||||
|
||||
|
@ -667,6 +685,7 @@ sub delzero{
|
|||
sub syntax() {
|
||||
print STDERR "syntax: get_dvb_firmware <component>\n";
|
||||
print STDERR "Supported components:\n";
|
||||
@components = sort @components;
|
||||
for($i=0; $i < scalar(@components); $i++) {
|
||||
print STDERR "\t" . $components[$i] . "\n";
|
||||
}
|
||||
|
|
|
@ -6,21 +6,6 @@ be removed from this file.
|
|||
|
||||
---------------------------
|
||||
|
||||
What: USER_SCHED
|
||||
When: 2.6.34
|
||||
|
||||
Why: USER_SCHED was implemented as a proof of concept for group scheduling.
|
||||
The effect of USER_SCHED can already be achieved from userspace with
|
||||
the help of libcgroup. The removal of USER_SCHED will also simplify
|
||||
the scheduler code with the removal of one major ifdef. There are also
|
||||
issues USER_SCHED has with USER_NS. A decision was taken not to fix
|
||||
those and instead remove USER_SCHED. Also new group scheduling
|
||||
features will not be implemented for USER_SCHED.
|
||||
|
||||
Who: Dhaval Giani <dhaval@linux.vnet.ibm.com>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: PRISM54
|
||||
When: 2.6.34
|
||||
|
||||
|
@ -64,6 +49,17 @@ Who: Robin Getz <rgetz@blackfin.uclinux.org> & Matt Mackall <mpm@selenic.com>
|
|||
|
||||
---------------------------
|
||||
|
||||
What: Deprecated snapshot ioctls
|
||||
When: 2.6.36
|
||||
|
||||
Why: The ioctls in kernel/power/user.c were marked as deprecated long time
|
||||
ago. Now they notify users about that so that they need to replace
|
||||
their userspace. After some more time, remove them completely.
|
||||
|
||||
Who: Jiri Slaby <jirislaby@gmail.com>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: The ieee80211_regdom module parameter
|
||||
When: March 2010 / desktop catchup
|
||||
|
||||
|
|
|
@ -1738,6 +1738,9 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
nomfgpt [X86-32] Disable Multi-Function General Purpose
|
||||
Timer usage (for AMD Geode machines).
|
||||
|
||||
nopat [X86] Disable PAT (page attribute table extension of
|
||||
pagetables) support.
|
||||
|
||||
norandmaps Don't use address space randomization. Equivalent to
|
||||
echo 0 > /proc/sys/kernel/randomize_va_space
|
||||
|
||||
|
@ -1948,8 +1951,12 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
IRQ routing is enabled.
|
||||
noacpi [X86] Do not use ACPI for IRQ routing
|
||||
or for PCI scanning.
|
||||
use_crs [X86] Use _CRS for PCI resource
|
||||
allocation.
|
||||
use_crs [X86] Use PCI host bridge window information
|
||||
from ACPI. On BIOSes from 2008 or later, this
|
||||
is enabled by default. If you need to use this,
|
||||
please report a bug.
|
||||
nocrs [X86] Ignore PCI host bridge windows from ACPI.
|
||||
If you need to use this, please report a bug.
|
||||
routeirq Do IRQ routing for all PCI devices.
|
||||
This is normally done in pci_enable_device(),
|
||||
so this option is a temporary workaround
|
||||
|
@ -1998,6 +2005,14 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
force Enable ASPM even on devices that claim not to support it.
|
||||
WARNING: Forcing ASPM on may cause system lockups.
|
||||
|
||||
pcie_pme= [PCIE,PM] Native PCIe PME signaling options:
|
||||
off Do not use native PCIe PME signaling.
|
||||
force Use native PCIe PME signaling even if the BIOS refuses
|
||||
to allow the kernel to control the relevant PCIe config
|
||||
registers.
|
||||
nomsi Do not use MSI for native PCIe PME signaling (this makes
|
||||
all PCIe root ports use INTx for everything).
|
||||
|
||||
pcmv= [HW,PCMCIA] BadgePAD 4
|
||||
|
||||
pd. [PARIDE]
|
||||
|
@ -2703,6 +2718,13 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
medium is write-protected).
|
||||
Example: quirks=0419:aaf5:rl,0421:0433:rc
|
||||
|
||||
userpte=
|
||||
[X86] Flags controlling user PTE allocations.
|
||||
|
||||
nohigh = do not allocate PTE pages in
|
||||
HIGHMEM regardless of setting
|
||||
of CONFIG_HIGHPTE.
|
||||
|
||||
vdso= [X86,SH]
|
||||
vdso=2: enable compat VDSO (default with COMPAT_VDSO)
|
||||
vdso=1: enable VDSO (default)
|
||||
|
|
|
@ -34,7 +34,6 @@
|
|||
#include <sys/uio.h>
|
||||
#include <termios.h>
|
||||
#include <getopt.h>
|
||||
#include <zlib.h>
|
||||
#include <assert.h>
|
||||
#include <sched.h>
|
||||
#include <limits.h>
|
||||
|
|
|
@ -0,0 +1,118 @@
|
|||
This file explains the locking and exclusion scheme used in the PCCARD
|
||||
and PCMCIA subsystems.
|
||||
|
||||
|
||||
A) Overview, Locking Hierarchy:
|
||||
===============================
|
||||
|
||||
pcmcia_socket_list_rwsem - protects only the list of sockets
|
||||
- skt_mutex - serializes card insert / ejection
|
||||
- ops_mutex - serializes socket operation
|
||||
|
||||
|
||||
B) Exclusion
|
||||
============
|
||||
|
||||
The following functions and callbacks to struct pcmcia_socket must
|
||||
be called with "skt_mutex" held:
|
||||
|
||||
socket_detect_change()
|
||||
send_event()
|
||||
socket_reset()
|
||||
socket_shutdown()
|
||||
socket_setup()
|
||||
socket_remove()
|
||||
socket_insert()
|
||||
socket_early_resume()
|
||||
socket_late_resume()
|
||||
socket_resume()
|
||||
socket_suspend()
|
||||
|
||||
struct pcmcia_callback *callback
|
||||
|
||||
The following functions and callbacks to struct pcmcia_socket must
|
||||
be called with "ops_mutex" held:
|
||||
|
||||
socket_reset()
|
||||
socket_setup()
|
||||
|
||||
struct pccard_operations *ops
|
||||
struct pccard_resource_ops *resource_ops;
|
||||
|
||||
Note that send_event() and struct pcmcia_callback *callback must not be
|
||||
called with "ops_mutex" held.
|
||||
|
||||
|
||||
C) Protection
|
||||
=============
|
||||
|
||||
1. Global Data:
|
||||
---------------
|
||||
struct list_head pcmcia_socket_list;
|
||||
|
||||
protected by pcmcia_socket_list_rwsem;
|
||||
|
||||
|
||||
2. Per-Socket Data:
|
||||
-------------------
|
||||
The resource_ops and their data are protected by ops_mutex.
|
||||
|
||||
The "main" struct pcmcia_socket is protected as follows (read-only fields
|
||||
or single-use fields not mentioned):
|
||||
|
||||
- by pcmcia_socket_list_rwsem:
|
||||
struct list_head socket_list;
|
||||
|
||||
- by thread_lock:
|
||||
unsigned int thread_events;
|
||||
|
||||
- by skt_mutex:
|
||||
u_int suspended_state;
|
||||
void (*tune_bridge);
|
||||
struct pcmcia_callback *callback;
|
||||
int resume_status;
|
||||
|
||||
- by ops_mutex:
|
||||
socket_state_t socket;
|
||||
u_int state;
|
||||
u_short lock_count;
|
||||
pccard_mem_map cis_mem;
|
||||
void __iomem *cis_virt;
|
||||
struct { } irq;
|
||||
io_window_t io[];
|
||||
pccard_mem_map win[];
|
||||
struct list_head cis_cache;
|
||||
size_t fake_cis_len;
|
||||
u8 *fake_cis;
|
||||
u_int irq_mask;
|
||||
void (*zoom_video);
|
||||
int (*power_hook);
|
||||
u8 resource...;
|
||||
struct list_head devices_list;
|
||||
u8 device_count;
|
||||
struct pcmcia_state;
|
||||
|
||||
|
||||
3. Per PCMCIA-device Data:
|
||||
--------------------------
|
||||
|
||||
The "main" struct pcmcia_devie is protected as follows (read-only fields
|
||||
or single-use fields not mentioned):
|
||||
|
||||
|
||||
- by pcmcia_socket->ops_mutex:
|
||||
struct list_head socket_device_list;
|
||||
struct config_t *function_config;
|
||||
u16 _irq:1;
|
||||
u16 _io:1;
|
||||
u16 _win:4;
|
||||
u16 _locked:1;
|
||||
u16 allow_func_id_match:1;
|
||||
u16 suspended:1;
|
||||
u16 _removed:1;
|
||||
|
||||
- by the PCMCIA driver:
|
||||
io_req_t io;
|
||||
irq_req_t irq;
|
||||
config_req_t conf;
|
||||
window_handle_t win;
|
|
@ -0,0 +1,70 @@
|
|||
MPC5121 PSC Device Tree Bindings
|
||||
|
||||
PSC in UART mode
|
||||
----------------
|
||||
|
||||
For PSC in UART mode the needed PSC serial devices
|
||||
are specified by fsl,mpc5121-psc-uart nodes in the
|
||||
fsl,mpc5121-immr SoC node. Additionally the PSC FIFO
|
||||
Controller node fsl,mpc5121-psc-fifo is requered there:
|
||||
|
||||
fsl,mpc5121-psc-uart nodes
|
||||
--------------------------
|
||||
|
||||
Required properties :
|
||||
- compatible : Should contain "fsl,mpc5121-psc-uart" and "fsl,mpc5121-psc"
|
||||
- cell-index : Index of the PSC in hardware
|
||||
- reg : Offset and length of the register set for the PSC device
|
||||
- interrupts : <a b> where a is the interrupt number of the
|
||||
PSC FIFO Controller and b is a field that represents an
|
||||
encoding of the sense and level information for the interrupt.
|
||||
- interrupt-parent : the phandle for the interrupt controller that
|
||||
services interrupts for this device.
|
||||
|
||||
Recommended properties :
|
||||
- fsl,rx-fifo-size : the size of the RX fifo slice (a multiple of 4)
|
||||
- fsl,tx-fifo-size : the size of the TX fifo slice (a multiple of 4)
|
||||
|
||||
|
||||
fsl,mpc5121-psc-fifo node
|
||||
-------------------------
|
||||
|
||||
Required properties :
|
||||
- compatible : Should be "fsl,mpc5121-psc-fifo"
|
||||
- reg : Offset and length of the register set for the PSC
|
||||
FIFO Controller
|
||||
- interrupts : <a b> where a is the interrupt number of the
|
||||
PSC FIFO Controller and b is a field that represents an
|
||||
encoding of the sense and level information for the interrupt.
|
||||
- interrupt-parent : the phandle for the interrupt controller that
|
||||
services interrupts for this device.
|
||||
|
||||
|
||||
Example for a board using PSC0 and PSC1 devices in serial mode:
|
||||
|
||||
serial@11000 {
|
||||
compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc";
|
||||
cell-index = <0>;
|
||||
reg = <0x11000 0x100>;
|
||||
interrupts = <40 0x8>;
|
||||
interrupt-parent = < &ipic >;
|
||||
fsl,rx-fifo-size = <16>;
|
||||
fsl,tx-fifo-size = <16>;
|
||||
};
|
||||
|
||||
serial@11100 {
|
||||
compatible = "fsl,mpc5121-psc-uart", "fsl,mpc5121-psc";
|
||||
cell-index = <1>;
|
||||
reg = <0x11100 0x100>;
|
||||
interrupts = <40 0x8>;
|
||||
interrupt-parent = < &ipic >;
|
||||
fsl,rx-fifo-size = <16>;
|
||||
fsl,tx-fifo-size = <16>;
|
||||
};
|
||||
|
||||
pscfifo@11f00 {
|
||||
compatible = "fsl,mpc5121-psc-fifo";
|
||||
reg = <0x11f00 0x100>;
|
||||
interrupts = <40 0x8>;
|
||||
interrupt-parent = < &ipic >;
|
||||
};
|
|
@ -13,6 +13,11 @@ Required properties:
|
|||
- interrupt-parent : the phandle for the interrupt controller that
|
||||
services interrupts for this device.
|
||||
|
||||
Optional properties:
|
||||
- gpios : specifies the gpio pins to be used for chipselects.
|
||||
The gpios will be referred to as reg = <index> in the SPI child nodes.
|
||||
If unspecified, a single SPI device without a chip select can be used.
|
||||
|
||||
Example:
|
||||
spi@4c0 {
|
||||
cell-index = <0>;
|
||||
|
@ -21,4 +26,6 @@ Example:
|
|||
interrupts = <82 0>;
|
||||
interrupt-parent = <700>;
|
||||
mode = "cpu";
|
||||
gpios = <&gpio 18 1 // device reg=<0>
|
||||
&gpio 19 1>; // device reg=<1>
|
||||
};
|
||||
|
|
|
@ -0,0 +1,134 @@
|
|||
GDB intends to support the following hardware debug features of BookE
|
||||
processors:
|
||||
|
||||
4 hardware breakpoints (IAC)
|
||||
2 hardware watchpoints (read, write and read-write) (DAC)
|
||||
2 value conditions for the hardware watchpoints (DVC)
|
||||
|
||||
For that, we need to extend ptrace so that GDB can query and set these
|
||||
resources. Since we're extending, we're trying to create an interface
|
||||
that's extendable and that covers both BookE and server processors, so
|
||||
that GDB doesn't need to special-case each of them. We added the
|
||||
following 3 new ptrace requests.
|
||||
|
||||
1. PTRACE_PPC_GETHWDEBUGINFO
|
||||
|
||||
Query for GDB to discover the hardware debug features. The main info to
|
||||
be returned here is the minimum alignment for the hardware watchpoints.
|
||||
BookE processors don't have restrictions here, but server processors have
|
||||
an 8-byte alignment restriction for hardware watchpoints. We'd like to avoid
|
||||
adding special cases to GDB based on what it sees in AUXV.
|
||||
|
||||
Since we're at it, we added other useful info that the kernel can return to
|
||||
GDB: this query will return the number of hardware breakpoints, hardware
|
||||
watchpoints and whether it supports a range of addresses and a condition.
|
||||
The query will fill the following structure provided by the requesting process:
|
||||
|
||||
struct ppc_debug_info {
|
||||
unit32_t version;
|
||||
unit32_t num_instruction_bps;
|
||||
unit32_t num_data_bps;
|
||||
unit32_t num_condition_regs;
|
||||
unit32_t data_bp_alignment;
|
||||
unit32_t sizeof_condition; /* size of the DVC register */
|
||||
uint64_t features; /* bitmask of the individual flags */
|
||||
};
|
||||
|
||||
features will have bits indicating whether there is support for:
|
||||
|
||||
#define PPC_DEBUG_FEATURE_INSN_BP_RANGE 0x1
|
||||
#define PPC_DEBUG_FEATURE_INSN_BP_MASK 0x2
|
||||
#define PPC_DEBUG_FEATURE_DATA_BP_RANGE 0x4
|
||||
#define PPC_DEBUG_FEATURE_DATA_BP_MASK 0x8
|
||||
|
||||
2. PTRACE_SETHWDEBUG
|
||||
|
||||
Sets a hardware breakpoint or watchpoint, according to the provided structure:
|
||||
|
||||
struct ppc_hw_breakpoint {
|
||||
uint32_t version;
|
||||
#define PPC_BREAKPOINT_TRIGGER_EXECUTE 0x1
|
||||
#define PPC_BREAKPOINT_TRIGGER_READ 0x2
|
||||
#define PPC_BREAKPOINT_TRIGGER_WRITE 0x4
|
||||
uint32_t trigger_type; /* only some combinations allowed */
|
||||
#define PPC_BREAKPOINT_MODE_EXACT 0x0
|
||||
#define PPC_BREAKPOINT_MODE_RANGE_INCLUSIVE 0x1
|
||||
#define PPC_BREAKPOINT_MODE_RANGE_EXCLUSIVE 0x2
|
||||
#define PPC_BREAKPOINT_MODE_MASK 0x3
|
||||
uint32_t addr_mode; /* address match mode */
|
||||
|
||||
#define PPC_BREAKPOINT_CONDITION_MODE 0x3
|
||||
#define PPC_BREAKPOINT_CONDITION_NONE 0x0
|
||||
#define PPC_BREAKPOINT_CONDITION_AND 0x1
|
||||
#define PPC_BREAKPOINT_CONDITION_EXACT 0x1 /* different name for the same thing as above */
|
||||
#define PPC_BREAKPOINT_CONDITION_OR 0x2
|
||||
#define PPC_BREAKPOINT_CONDITION_AND_OR 0x3
|
||||
#define PPC_BREAKPOINT_CONDITION_BE_ALL 0x00ff0000 /* byte enable bits */
|
||||
#define PPC_BREAKPOINT_CONDITION_BE(n) (1<<((n)+16))
|
||||
uint32_t condition_mode; /* break/watchpoint condition flags */
|
||||
|
||||
uint64_t addr;
|
||||
uint64_t addr2;
|
||||
uint64_t condition_value;
|
||||
};
|
||||
|
||||
A request specifies one event, not necessarily just one register to be set.
|
||||
For instance, if the request is for a watchpoint with a condition, both the
|
||||
DAC and DVC registers will be set in the same request.
|
||||
|
||||
With this GDB can ask for all kinds of hardware breakpoints and watchpoints
|
||||
that the BookE supports. COMEFROM breakpoints available in server processors
|
||||
are not contemplated, but that is out of the scope of this work.
|
||||
|
||||
ptrace will return an integer (handle) uniquely identifying the breakpoint or
|
||||
watchpoint just created. This integer will be used in the PTRACE_DELHWDEBUG
|
||||
request to ask for its removal. Return -ENOSPC if the requested breakpoint
|
||||
can't be allocated on the registers.
|
||||
|
||||
Some examples of using the structure to:
|
||||
|
||||
- set a breakpoint in the first breakpoint register
|
||||
|
||||
p.version = PPC_DEBUG_CURRENT_VERSION;
|
||||
p.trigger_type = PPC_BREAKPOINT_TRIGGER_EXECUTE;
|
||||
p.addr_mode = PPC_BREAKPOINT_MODE_EXACT;
|
||||
p.condition_mode = PPC_BREAKPOINT_CONDITION_NONE;
|
||||
p.addr = (uint64_t) address;
|
||||
p.addr2 = 0;
|
||||
p.condition_value = 0;
|
||||
|
||||
- set a watchpoint which triggers on reads in the second watchpoint register
|
||||
|
||||
p.version = PPC_DEBUG_CURRENT_VERSION;
|
||||
p.trigger_type = PPC_BREAKPOINT_TRIGGER_READ;
|
||||
p.addr_mode = PPC_BREAKPOINT_MODE_EXACT;
|
||||
p.condition_mode = PPC_BREAKPOINT_CONDITION_NONE;
|
||||
p.addr = (uint64_t) address;
|
||||
p.addr2 = 0;
|
||||
p.condition_value = 0;
|
||||
|
||||
- set a watchpoint which triggers only with a specific value
|
||||
|
||||
p.version = PPC_DEBUG_CURRENT_VERSION;
|
||||
p.trigger_type = PPC_BREAKPOINT_TRIGGER_READ;
|
||||
p.addr_mode = PPC_BREAKPOINT_MODE_EXACT;
|
||||
p.condition_mode = PPC_BREAKPOINT_CONDITION_AND | PPC_BREAKPOINT_CONDITION_BE_ALL;
|
||||
p.addr = (uint64_t) address;
|
||||
p.addr2 = 0;
|
||||
p.condition_value = (uint64_t) condition;
|
||||
|
||||
- set a ranged hardware breakpoint
|
||||
|
||||
p.version = PPC_DEBUG_CURRENT_VERSION;
|
||||
p.trigger_type = PPC_BREAKPOINT_TRIGGER_EXECUTE;
|
||||
p.addr_mode = PPC_BREAKPOINT_MODE_RANGE_INCLUSIVE;
|
||||
p.condition_mode = PPC_BREAKPOINT_CONDITION_NONE;
|
||||
p.addr = (uint64_t) begin_range;
|
||||
p.addr2 = (uint64_t) end_range;
|
||||
p.condition_value = 0;
|
||||
|
||||
3. PTRACE_DELHWDEBUG
|
||||
|
||||
Takes an integer which identifies an existing breakpoint or watchpoint
|
||||
(i.e., the value returned from PTRACE_SETHWDEBUG), and deletes the
|
||||
corresponding breakpoint or watchpoint..
|
|
@ -87,6 +87,12 @@ Command line parameters
|
|||
compatibility, by the device number in hexadecimal (0xabcd or abcd). Device
|
||||
numbers given as 0xabcd will be interpreted as 0.0.abcd.
|
||||
|
||||
* /proc/cio_settle
|
||||
|
||||
A write request to this file is blocked until all queued cio actions are
|
||||
handled. This will allow userspace to wait for pending work affecting
|
||||
device availability after changing cio_ignore or the hardware configuration.
|
||||
|
||||
* For some of the information present in the /proc filesystem in 2.4 (namely,
|
||||
/proc/subchannels and /proc/chpids), see driver-model.txt.
|
||||
Information formerly in /proc/irq_count is now in /proc/interrupts.
|
||||
|
|
|
@ -223,8 +223,8 @@ touched by the driver - it should use the ccwgroup device's driver_data for its
|
|||
private data.
|
||||
|
||||
To implement a ccwgroup driver, please refer to include/asm/ccwgroup.h. Keep in
|
||||
mind that most drivers will need to implement both a ccwgroup and a ccw driver
|
||||
(unless you have a meta ccw driver, like cu3088 for lcs and ctc).
|
||||
mind that most drivers will need to implement both a ccwgroup and a ccw
|
||||
driver.
|
||||
|
||||
|
||||
2. Channel paths
|
||||
|
|
|
@ -1,3 +1,19 @@
|
|||
1 Release Date : Thur. Oct 29, 2009 09:12:45 PST 2009 -
|
||||
(emaild-id:megaraidlinux@lsi.com)
|
||||
Bo Yang
|
||||
|
||||
2 Current Version : 00.00.04.17.1-rc1
|
||||
3 Older Version : 00.00.04.12
|
||||
|
||||
1. Add the pad_0 in mfi frame structure to 0 to fix the
|
||||
context value larger than 32bit value issue.
|
||||
|
||||
2. Add the logic drive list to the driver. Driver will
|
||||
keep the logic drive list internal after driver load.
|
||||
|
||||
3. driver fixed the device update issue after get the AEN
|
||||
PD delete/ADD, LD add/delete from FW.
|
||||
|
||||
1 Release Date : Tues. July 28, 2009 10:12:45 PST 2009 -
|
||||
(emaild-id:megaraidlinux@lsi.com)
|
||||
Bo Yang
|
||||
|
|
|
@ -238,11 +238,10 @@ HAVE_SYSCALL_TRACEPOINTS
|
|||
|
||||
You need very few things to get the syscalls tracing in an arch.
|
||||
|
||||
- Support HAVE_ARCH_TRACEHOOK (see arch/Kconfig).
|
||||
- Have a NR_syscalls variable in <asm/unistd.h> that provides the number
|
||||
of syscalls supported by the arch.
|
||||
- Implement arch_syscall_addr() that resolves a syscall address from a
|
||||
syscall number.
|
||||
- Support the TIF_SYSCALL_TRACEPOINT thread flags
|
||||
- Support the TIF_SYSCALL_TRACEPOINT thread flags.
|
||||
- Put the trace_sys_enter() and trace_sys_exit() tracepoints calls from ptrace
|
||||
in the ptrace syscalls tracing path.
|
||||
- Tag this arch as HAVE_SYSCALL_TRACEPOINTS.
|
||||
|
|
|
@ -24,6 +24,7 @@ Synopsis of kprobe_events
|
|||
-------------------------
|
||||
p[:[GRP/]EVENT] SYMBOL[+offs]|MEMADDR [FETCHARGS] : Set a probe
|
||||
r[:[GRP/]EVENT] SYMBOL[+0] [FETCHARGS] : Set a return probe
|
||||
-:[GRP/]EVENT : Clear a probe
|
||||
|
||||
GRP : Group name. If omitted, use "kprobes" for it.
|
||||
EVENT : Event name. If omitted, the event name is generated
|
||||
|
@ -37,15 +38,12 @@ Synopsis of kprobe_events
|
|||
@SYM[+|-offs] : Fetch memory at SYM +|- offs (SYM should be a data symbol)
|
||||
$stackN : Fetch Nth entry of stack (N >= 0)
|
||||
$stack : Fetch stack address.
|
||||
$argN : Fetch function argument. (N >= 0)(*)
|
||||
$retval : Fetch return value.(**)
|
||||
+|-offs(FETCHARG) : Fetch memory at FETCHARG +|- offs address.(***)
|
||||
$retval : Fetch return value.(*)
|
||||
+|-offs(FETCHARG) : Fetch memory at FETCHARG +|- offs address.(**)
|
||||
NAME=FETCHARG: Set NAME as the argument name of FETCHARG.
|
||||
|
||||
(*) aN may not correct on asmlinkaged functions and at the middle of
|
||||
function body.
|
||||
(**) only for return probe.
|
||||
(***) this is useful for fetching a field of data structures.
|
||||
(*) only for return probe.
|
||||
(**) this is useful for fetching a field of data structures.
|
||||
|
||||
|
||||
Per-Probe Event Filtering
|
||||
|
@ -82,13 +80,16 @@ Usage examples
|
|||
To add a probe as a new event, write a new definition to kprobe_events
|
||||
as below.
|
||||
|
||||
echo p:myprobe do_sys_open dfd=$arg0 filename=$arg1 flags=$arg2 mode=$arg3 > /sys/kernel/debug/tracing/kprobe_events
|
||||
echo 'p:myprobe do_sys_open dfd=%ax filename=%dx flags=%cx mode=+4($stack)' > /sys/kernel/debug/tracing/kprobe_events
|
||||
|
||||
This sets a kprobe on the top of do_sys_open() function with recording
|
||||
1st to 4th arguments as "myprobe" event. As this example shows, users can
|
||||
choose more familiar names for each arguments.
|
||||
1st to 4th arguments as "myprobe" event. Note, which register/stack entry is
|
||||
assigned to each function argument depends on arch-specific ABI. If you unsure
|
||||
the ABI, please try to use probe subcommand of perf-tools (you can find it
|
||||
under tools/perf/).
|
||||
As this example shows, users can choose more familiar names for each arguments.
|
||||
|
||||
echo r:myretprobe do_sys_open $retval >> /sys/kernel/debug/tracing/kprobe_events
|
||||
echo 'r:myretprobe do_sys_open $retval' >> /sys/kernel/debug/tracing/kprobe_events
|
||||
|
||||
This sets a kretprobe on the return point of do_sys_open() function with
|
||||
recording return value as "myretprobe" event.
|
||||
|
@ -97,23 +98,24 @@ recording return value as "myretprobe" event.
|
|||
|
||||
cat /sys/kernel/debug/tracing/events/kprobes/myprobe/format
|
||||
name: myprobe
|
||||
ID: 75
|
||||
ID: 780
|
||||
format:
|
||||
field:unsigned short common_type; offset:0; size:2;
|
||||
field:unsigned char common_flags; offset:2; size:1;
|
||||
field:unsigned char common_preempt_count; offset:3; size:1;
|
||||
field:int common_pid; offset:4; size:4;
|
||||
field:int common_tgid; offset:8; size:4;
|
||||
field:unsigned short common_type; offset:0; size:2; signed:0;
|
||||
field:unsigned char common_flags; offset:2; size:1; signed:0;
|
||||
field:unsigned char common_preempt_count; offset:3; size:1;signed:0;
|
||||
field:int common_pid; offset:4; size:4; signed:1;
|
||||
field:int common_lock_depth; offset:8; size:4; signed:1;
|
||||
|
||||
field: unsigned long ip; offset:16;tsize:8;
|
||||
field: int nargs; offset:24;tsize:4;
|
||||
field: unsigned long dfd; offset:32;tsize:8;
|
||||
field: unsigned long filename; offset:40;tsize:8;
|
||||
field: unsigned long flags; offset:48;tsize:8;
|
||||
field: unsigned long mode; offset:56;tsize:8;
|
||||
field:unsigned long __probe_ip; offset:12; size:4; signed:0;
|
||||
field:int __probe_nargs; offset:16; size:4; signed:1;
|
||||
field:unsigned long dfd; offset:20; size:4; signed:0;
|
||||
field:unsigned long filename; offset:24; size:4; signed:0;
|
||||
field:unsigned long flags; offset:28; size:4; signed:0;
|
||||
field:unsigned long mode; offset:32; size:4; signed:0;
|
||||
|
||||
print fmt: "(%lx) dfd=%lx filename=%lx flags=%lx mode=%lx", REC->ip, REC->dfd, REC->filename, REC->flags, REC->mode
|
||||
|
||||
print fmt: "(%lx) dfd=%lx filename=%lx flags=%lx mode=%lx", REC->__probe_ip,
|
||||
REC->dfd, REC->filename, REC->flags, REC->mode
|
||||
|
||||
You can see that the event has 4 arguments as in the expressions you specified.
|
||||
|
||||
|
@ -121,6 +123,12 @@ print fmt: "(%lx) dfd=%lx filename=%lx flags=%lx mode=%lx", REC->ip, REC->dfd, R
|
|||
|
||||
This clears all probe points.
|
||||
|
||||
Or,
|
||||
|
||||
echo -:myprobe >> kprobe_events
|
||||
|
||||
This clears probe points selectively.
|
||||
|
||||
Right after definition, each event is disabled by default. For tracing these
|
||||
events, you need to enable it.
|
||||
|
||||
|
@ -146,4 +154,3 @@ events, you need to enable it.
|
|||
returns from SYMBOL(e.g. "sys_open+0x1b/0x1d <- do_sys_open" means kernel
|
||||
returns from do_sys_open to sys_open+0x1b).
|
||||
|
||||
|
||||
|
|
|
@ -26,3 +26,4 @@
|
|||
25 -> Compro VideoMate E800 [1858:e800]
|
||||
26 -> Hauppauge WinTV-HVR1290 [0070:8551]
|
||||
27 -> Mygica X8558 PRO DMB-TH [14f1:8578]
|
||||
28 -> LEADTEK WinFast PxTV1200 [107d:6f22]
|
||||
|
|
|
@ -174,3 +174,4 @@
|
|||
173 -> Zolid Hybrid TV Tuner PCI [1131:2004]
|
||||
174 -> Asus Europa Hybrid OEM [1043:4847]
|
||||
175 -> Leadtek Winfast DTV1000S [107d:6655]
|
||||
176 -> Beholder BeholdTV 505 RDS [0000:5051]
|
||||
|
|
|
@ -81,3 +81,4 @@ tuner=80 - Philips FQ1216LME MK3 PAL/SECAM w/active loopthrough
|
|||
tuner=81 - Partsnic (Daewoo) PTI-5NF05
|
||||
tuner=82 - Philips CU1216L
|
||||
tuner=83 - NXP TDA18271
|
||||
tuner=84 - Sony BTF-Pxn01Z
|
||||
|
|
|
@ -0,0 +1,47 @@
|
|||
tlg2300 release notes
|
||||
====================
|
||||
|
||||
This is a v4l2/dvb device driver for the tlg2300 chip.
|
||||
|
||||
|
||||
current status
|
||||
==============
|
||||
|
||||
video
|
||||
- support mmap and read().(no overlay)
|
||||
|
||||
audio
|
||||
- The driver will register a ALSA card for the audio input.
|
||||
|
||||
vbi
|
||||
- Works for almost TV norms.
|
||||
|
||||
dvb-t
|
||||
- works for DVB-T
|
||||
|
||||
FM
|
||||
- Works for radio.
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
TESTED APPLICATIONS:
|
||||
|
||||
-VLC1.0.4 test the video and dvb. The GUI is friendly to use.
|
||||
|
||||
-Mplayer test the video.
|
||||
|
||||
-Mplayer test the FM. The mplayer should be compiled with --enable-radio and
|
||||
--enable-radio-capture.
|
||||
The command runs as this(The alsa audio registers to card 1):
|
||||
#mplayer radio://103.7/capture/ -radio adevice=hw=1,0:arate=48000 \
|
||||
-rawaudio rate=48000:channels=2
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
KNOWN PROBLEMS:
|
||||
about preemphasis:
|
||||
You can set the preemphasis for radio by the following command:
|
||||
#v4l2-ctl -d /dev/radio0 --set-ctrl=pre_emphasis_settings=1
|
||||
|
||||
"pre_emphasis_settings=1" means that you select the 50us. If you want
|
||||
to select the 75us, please use "pre_emphasis_settings=2"
|
||||
|
||||
|
|
@ -42,6 +42,7 @@ ov519 041e:4064 Creative Live! VISTA VF0420
|
|||
ov519 041e:4067 Creative Live! Cam Video IM (VF0350)
|
||||
ov519 041e:4068 Creative Live! VISTA VF0470
|
||||
spca561 0458:7004 Genius VideoCAM Express V2
|
||||
sn9c2028 0458:7005 Genius Smart 300, version 2
|
||||
sunplus 0458:7006 Genius Dsc 1.3 Smart
|
||||
zc3xx 0458:7007 Genius VideoCam V2
|
||||
zc3xx 0458:700c Genius VideoCam V3
|
||||
|
@ -109,6 +110,7 @@ sunplus 04a5:3003 Benq DC 1300
|
|||
sunplus 04a5:3008 Benq DC 1500
|
||||
sunplus 04a5:300a Benq DC 3410
|
||||
spca500 04a5:300c Benq DC 1016
|
||||
benq 04a5:3035 Benq DC E300
|
||||
finepix 04cb:0104 Fujifilm FinePix 4800
|
||||
finepix 04cb:0109 Fujifilm FinePix A202
|
||||
finepix 04cb:010b Fujifilm FinePix A203
|
||||
|
@ -142,6 +144,7 @@ sunplus 04fc:5360 Sunplus Generic
|
|||
spca500 04fc:7333 PalmPixDC85
|
||||
sunplus 04fc:ffff Pure DigitalDakota
|
||||
spca501 0506:00df 3Com HomeConnect Lite
|
||||
sunplus 052b:1507 Megapixel 5 Pretec DC-1007
|
||||
sunplus 052b:1513 Megapix V4
|
||||
sunplus 052b:1803 MegaImage VI
|
||||
tv8532 0545:808b Veo Stingray
|
||||
|
@ -151,6 +154,7 @@ sunplus 0546:3191 Polaroid Ion 80
|
|||
sunplus 0546:3273 Polaroid PDC2030
|
||||
ov519 054c:0154 Sonny toy4
|
||||
ov519 054c:0155 Sonny toy5
|
||||
cpia1 0553:0002 CPIA CPiA (version1) based cameras
|
||||
zc3xx 055f:c005 Mustek Wcam300A
|
||||
spca500 055f:c200 Mustek Gsmart 300
|
||||
sunplus 055f:c211 Kowa Bs888e Microcamera
|
||||
|
@ -188,8 +192,7 @@ spca500 06bd:0404 Agfa CL20
|
|||
spca500 06be:0800 Optimedia
|
||||
sunplus 06d6:0031 Trust 610 LCD PowerC@m Zoom
|
||||
spca506 06e1:a190 ADS Instant VCD
|
||||
ov534 06f8:3002 Hercules Blog Webcam
|
||||
ov534 06f8:3003 Hercules Dualpix HD Weblog
|
||||
ov534_9 06f8:3003 Hercules Dualpix HD Weblog
|
||||
sonixj 06f8:3004 Hercules Classic Silver
|
||||
sonixj 06f8:3008 Hercules Deluxe Optical Glass
|
||||
pac7302 06f8:3009 Hercules Classic Link
|
||||
|
@ -204,6 +207,7 @@ sunplus 0733:2221 Mercury Digital Pro 3.1p
|
|||
sunplus 0733:3261 Concord 3045 spca536a
|
||||
sunplus 0733:3281 Cyberpix S550V
|
||||
spca506 0734:043b 3DeMon USB Capture aka
|
||||
cpia1 0813:0001 QX3 camera
|
||||
ov519 0813:0002 Dual Mode USB Camera Plus
|
||||
spca500 084d:0003 D-Link DSC-350
|
||||
spca500 08ca:0103 Aiptek PocketDV
|
||||
|
@ -225,7 +229,8 @@ sunplus 08ca:2050 Medion MD 41437
|
|||
sunplus 08ca:2060 Aiptek PocketDV5300
|
||||
tv8532 0923:010f ICM532 cams
|
||||
mars 093a:050f Mars-Semi Pc-Camera
|
||||
mr97310a 093a:010f Sakar Digital no. 77379
|
||||
mr97310a 093a:010e All known CIF cams with this ID
|
||||
mr97310a 093a:010f All known VGA cams with this ID
|
||||
pac207 093a:2460 Qtec Webcam 100
|
||||
pac207 093a:2461 HP Webcam
|
||||
pac207 093a:2463 Philips SPC 220 NC
|
||||
|
@ -302,6 +307,7 @@ sonixj 0c45:613b Surfer SN-206
|
|||
sonixj 0c45:613c Sonix Pccam168
|
||||
sonixj 0c45:6143 Sonix Pccam168
|
||||
sonixj 0c45:6148 Digitus DA-70811/ZSMC USB PC Camera ZS211/Microdia
|
||||
sonixj 0c45:614a Frontech E-Ccam (JIL-2225)
|
||||
sn9c20x 0c45:6240 PC Camera (SN9C201 + MT9M001)
|
||||
sn9c20x 0c45:6242 PC Camera (SN9C201 + MT9M111)
|
||||
sn9c20x 0c45:6248 PC Camera (SN9C201 + OV9655)
|
||||
|
@ -324,6 +330,10 @@ sn9c20x 0c45:62b0 PC Camera (SN9C202 + MT9V011/MT9V111/MT9V112)
|
|||
sn9c20x 0c45:62b3 PC Camera (SN9C202 + OV9655)
|
||||
sn9c20x 0c45:62bb PC Camera (SN9C202 + OV7660)
|
||||
sn9c20x 0c45:62bc PC Camera (SN9C202 + HV7131R)
|
||||
sn9c2028 0c45:8001 Wild Planet Digital Spy Camera
|
||||
sn9c2028 0c45:8003 Sakar #11199, #6637x, #67480 keychain cams
|
||||
sn9c2028 0c45:8008 Mini-Shotz ms-350
|
||||
sn9c2028 0c45:800a Vivitar Vivicam 3350B
|
||||
sunplus 0d64:0303 Sunplus FashionCam DXG
|
||||
ov519 0e96:c001 TRUST 380 USB2 SPACEC@M
|
||||
etoms 102c:6151 Qcam Sangha CIF
|
||||
|
@ -341,10 +351,11 @@ spca501 1776:501c Arowana 300K CMOS Camera
|
|||
t613 17a1:0128 TASCORP JPEG Webcam, NGS Cyclops
|
||||
vc032x 17ef:4802 Lenovo Vc0323+MI1310_SOC
|
||||
pac207 2001:f115 D-Link DSB-C120
|
||||
sq905c 2770:9050 sq905c
|
||||
sq905c 2770:905c DualCamera
|
||||
sq905 2770:9120 Argus Digital Camera DC1512
|
||||
sq905c 2770:913d sq905c
|
||||
sq905c 2770:9050 Disney pix micro (CIF)
|
||||
sq905c 2770:9052 Disney pix micro 2 (VGA)
|
||||
sq905c 2770:905c All 11 known cameras with this ID
|
||||
sq905 2770:9120 All 24 known cameras with this ID
|
||||
sq905c 2770:913d All 4 known cameras with this ID
|
||||
spca500 2899:012c Toptro Industrial
|
||||
ov519 8020:ef04 ov519
|
||||
spca508 8086:0110 Intel Easy PC Camera
|
||||
|
|
|
@ -599,99 +599,13 @@ video_device::minor fields.
|
|||
video buffer helper functions
|
||||
-----------------------------
|
||||
|
||||
The v4l2 core API provides a standard method for dealing with video
|
||||
buffers. Those methods allow a driver to implement read(), mmap() and
|
||||
overlay() on a consistent way.
|
||||
The v4l2 core API provides a set of standard methods (called "videobuf")
|
||||
for dealing with video buffers. Those methods allow a driver to implement
|
||||
read(), mmap() and overlay() in a consistent way. There are currently
|
||||
methods for using video buffers on devices that supports DMA with
|
||||
scatter/gather method (videobuf-dma-sg), DMA with linear access
|
||||
(videobuf-dma-contig), and vmalloced buffers, mostly used on USB drivers
|
||||
(videobuf-vmalloc).
|
||||
|
||||
There are currently methods for using video buffers on devices that
|
||||
supports DMA with scatter/gather method (videobuf-dma-sg), DMA with
|
||||
linear access (videobuf-dma-contig), and vmalloced buffers, mostly
|
||||
used on USB drivers (videobuf-vmalloc).
|
||||
|
||||
Any driver using videobuf should provide operations (callbacks) for
|
||||
four handlers:
|
||||
|
||||
ops->buf_setup - calculates the size of the video buffers and avoid they
|
||||
to waste more than some maximum limit of RAM;
|
||||
ops->buf_prepare - fills the video buffer structs and calls
|
||||
videobuf_iolock() to alloc and prepare mmaped memory;
|
||||
ops->buf_queue - advices the driver that another buffer were
|
||||
requested (by read() or by QBUF);
|
||||
ops->buf_release - frees any buffer that were allocated.
|
||||
|
||||
In order to use it, the driver need to have a code (generally called at
|
||||
interrupt context) that will properly handle the buffer request lists,
|
||||
announcing that a new buffer were filled.
|
||||
|
||||
The irq handling code should handle the videobuf task lists, in order
|
||||
to advice videobuf that a new frame were filled, in order to honor to a
|
||||
request. The code is generally like this one:
|
||||
if (list_empty(&dma_q->active))
|
||||
return;
|
||||
|
||||
buf = list_entry(dma_q->active.next, struct vbuffer, vb.queue);
|
||||
|
||||
if (!waitqueue_active(&buf->vb.done))
|
||||
return;
|
||||
|
||||
/* Some logic to handle the buf may be needed here */
|
||||
|
||||
list_del(&buf->vb.queue);
|
||||
do_gettimeofday(&buf->vb.ts);
|
||||
wake_up(&buf->vb.done);
|
||||
|
||||
Those are the videobuffer functions used on drivers, implemented on
|
||||
videobuf-core:
|
||||
|
||||
- Videobuf init functions
|
||||
videobuf_queue_sg_init()
|
||||
Initializes the videobuf infrastructure. This function should be
|
||||
called before any other videobuf function on drivers that uses DMA
|
||||
Scatter/Gather buffers.
|
||||
|
||||
videobuf_queue_dma_contig_init
|
||||
Initializes the videobuf infrastructure. This function should be
|
||||
called before any other videobuf function on drivers that need DMA
|
||||
contiguous buffers.
|
||||
|
||||
videobuf_queue_vmalloc_init()
|
||||
Initializes the videobuf infrastructure. This function should be
|
||||
called before any other videobuf function on USB (and other drivers)
|
||||
that need a vmalloced type of videobuf.
|
||||
|
||||
- videobuf_iolock()
|
||||
Prepares the videobuf memory for the proper method (read, mmap, overlay).
|
||||
|
||||
- videobuf_queue_is_busy()
|
||||
Checks if a videobuf is streaming.
|
||||
|
||||
- videobuf_queue_cancel()
|
||||
Stops video handling.
|
||||
|
||||
- videobuf_mmap_free()
|
||||
frees mmap buffers.
|
||||
|
||||
- videobuf_stop()
|
||||
Stops video handling, ends mmap and frees mmap and other buffers.
|
||||
|
||||
- V4L2 api functions. Those functions correspond to VIDIOC_foo ioctls:
|
||||
videobuf_reqbufs(), videobuf_querybuf(), videobuf_qbuf(),
|
||||
videobuf_dqbuf(), videobuf_streamon(), videobuf_streamoff().
|
||||
|
||||
- V4L1 api function (corresponds to VIDIOCMBUF ioctl):
|
||||
videobuf_cgmbuf()
|
||||
This function is used to provide backward compatibility with V4L1
|
||||
API.
|
||||
|
||||
- Some help functions for read()/poll() operations:
|
||||
videobuf_read_stream()
|
||||
For continuous stream read()
|
||||
videobuf_read_one()
|
||||
For snapshot read()
|
||||
videobuf_poll_stream()
|
||||
polling help function
|
||||
|
||||
The better way to understand it is to take a look at vivi driver. One
|
||||
of the main reasons for vivi is to be a videobuf usage example. the
|
||||
vivi_thread_tick() does the task that the IRQ callback would do on PCI
|
||||
drivers (or the irq callback on USB).
|
||||
Please see Documentation/video4linux/videobuf for more information on how
|
||||
to use the videobuf layer.
|
||||
|
|
|
@ -0,0 +1,360 @@
|
|||
An introduction to the videobuf layer
|
||||
Jonathan Corbet <corbet@lwn.net>
|
||||
Current as of 2.6.33
|
||||
|
||||
The videobuf layer functions as a sort of glue layer between a V4L2 driver
|
||||
and user space. It handles the allocation and management of buffers for
|
||||
the storage of video frames. There is a set of functions which can be used
|
||||
to implement many of the standard POSIX I/O system calls, including read(),
|
||||
poll(), and, happily, mmap(). Another set of functions can be used to
|
||||
implement the bulk of the V4L2 ioctl() calls related to streaming I/O,
|
||||
including buffer allocation, queueing and dequeueing, and streaming
|
||||
control. Using videobuf imposes a few design decisions on the driver
|
||||
author, but the payback comes in the form of reduced code in the driver and
|
||||
a consistent implementation of the V4L2 user-space API.
|
||||
|
||||
Buffer types
|
||||
|
||||
Not all video devices use the same kind of buffers. In fact, there are (at
|
||||
least) three common variations:
|
||||
|
||||
- Buffers which are scattered in both the physical and (kernel) virtual
|
||||
address spaces. (Almost) all user-space buffers are like this, but it
|
||||
makes great sense to allocate kernel-space buffers this way as well when
|
||||
it is possible. Unfortunately, it is not always possible; working with
|
||||
this kind of buffer normally requires hardware which can do
|
||||
scatter/gather DMA operations.
|
||||
|
||||
- Buffers which are physically scattered, but which are virtually
|
||||
contiguous; buffers allocated with vmalloc(), in other words. These
|
||||
buffers are just as hard to use for DMA operations, but they can be
|
||||
useful in situations where DMA is not available but virtually-contiguous
|
||||
buffers are convenient.
|
||||
|
||||
- Buffers which are physically contiguous. Allocation of this kind of
|
||||
buffer can be unreliable on fragmented systems, but simpler DMA
|
||||
controllers cannot deal with anything else.
|
||||
|
||||
Videobuf can work with all three types of buffers, but the driver author
|
||||
must pick one at the outset and design the driver around that decision.
|
||||
|
||||
[It's worth noting that there's a fourth kind of buffer: "overlay" buffers
|
||||
which are located within the system's video memory. The overlay
|
||||
functionality is considered to be deprecated for most use, but it still
|
||||
shows up occasionally in system-on-chip drivers where the performance
|
||||
benefits merit the use of this technique. Overlay buffers can be handled
|
||||
as a form of scattered buffer, but there are very few implementations in
|
||||
the kernel and a description of this technique is currently beyond the
|
||||
scope of this document.]
|
||||
|
||||
Data structures, callbacks, and initialization
|
||||
|
||||
Depending on which type of buffers are being used, the driver should
|
||||
include one of the following files:
|
||||
|
||||
<media/videobuf-dma-sg.h> /* Physically scattered */
|
||||
<media/videobuf-vmalloc.h> /* vmalloc() buffers */
|
||||
<media/videobuf-dma-contig.h> /* Physically contiguous */
|
||||
|
||||
The driver's data structure describing a V4L2 device should include a
|
||||
struct videobuf_queue instance for the management of the buffer queue,
|
||||
along with a list_head for the queue of available buffers. There will also
|
||||
need to be an interrupt-safe spinlock which is used to protect (at least)
|
||||
the queue.
|
||||
|
||||
The next step is to write four simple callbacks to help videobuf deal with
|
||||
the management of buffers:
|
||||
|
||||
struct videobuf_queue_ops {
|
||||
int (*buf_setup)(struct videobuf_queue *q,
|
||||
unsigned int *count, unsigned int *size);
|
||||
int (*buf_prepare)(struct videobuf_queue *q,
|
||||
struct videobuf_buffer *vb,
|
||||
enum v4l2_field field);
|
||||
void (*buf_queue)(struct videobuf_queue *q,
|
||||
struct videobuf_buffer *vb);
|
||||
void (*buf_release)(struct videobuf_queue *q,
|
||||
struct videobuf_buffer *vb);
|
||||
};
|
||||
|
||||
buf_setup() is called early in the I/O process, when streaming is being
|
||||
initiated; its purpose is to tell videobuf about the I/O stream. The count
|
||||
parameter will be a suggested number of buffers to use; the driver should
|
||||
check it for rationality and adjust it if need be. As a practical rule, a
|
||||
minimum of two buffers are needed for proper streaming, and there is
|
||||
usually a maximum (which cannot exceed 32) which makes sense for each
|
||||
device. The size parameter should be set to the expected (maximum) size
|
||||
for each frame of data.
|
||||
|
||||
Each buffer (in the form of a struct videobuf_buffer pointer) will be
|
||||
passed to buf_prepare(), which should set the buffer's size, width, height,
|
||||
and field fields properly. If the buffer's state field is
|
||||
VIDEOBUF_NEEDS_INIT, the driver should pass it to:
|
||||
|
||||
int videobuf_iolock(struct videobuf_queue* q, struct videobuf_buffer *vb,
|
||||
struct v4l2_framebuffer *fbuf);
|
||||
|
||||
Among other things, this call will usually allocate memory for the buffer.
|
||||
Finally, the buf_prepare() function should set the buffer's state to
|
||||
VIDEOBUF_PREPARED.
|
||||
|
||||
When a buffer is queued for I/O, it is passed to buf_queue(), which should
|
||||
put it onto the driver's list of available buffers and set its state to
|
||||
VIDEOBUF_QUEUED. Note that this function is called with the queue spinlock
|
||||
held; if it tries to acquire it as well things will come to a screeching
|
||||
halt. Yes, this is the voice of experience. Note also that videobuf may
|
||||
wait on the first buffer in the queue; placing other buffers in front of it
|
||||
could again gum up the works. So use list_add_tail() to enqueue buffers.
|
||||
|
||||
Finally, buf_release() is called when a buffer is no longer intended to be
|
||||
used. The driver should ensure that there is no I/O active on the buffer,
|
||||
then pass it to the appropriate free routine(s):
|
||||
|
||||
/* Scatter/gather drivers */
|
||||
int videobuf_dma_unmap(struct videobuf_queue *q,
|
||||
struct videobuf_dmabuf *dma);
|
||||
int videobuf_dma_free(struct videobuf_dmabuf *dma);
|
||||
|
||||
/* vmalloc drivers */
|
||||
void videobuf_vmalloc_free (struct videobuf_buffer *buf);
|
||||
|
||||
/* Contiguous drivers */
|
||||
void videobuf_dma_contig_free(struct videobuf_queue *q,
|
||||
struct videobuf_buffer *buf);
|
||||
|
||||
One way to ensure that a buffer is no longer under I/O is to pass it to:
|
||||
|
||||
int videobuf_waiton(struct videobuf_buffer *vb, int non_blocking, int intr);
|
||||
|
||||
Here, vb is the buffer, non_blocking indicates whether non-blocking I/O
|
||||
should be used (it should be zero in the buf_release() case), and intr
|
||||
controls whether an interruptible wait is used.
|
||||
|
||||
File operations
|
||||
|
||||
At this point, much of the work is done; much of the rest is slipping
|
||||
videobuf calls into the implementation of the other driver callbacks. The
|
||||
first step is in the open() function, which must initialize the
|
||||
videobuf queue. The function to use depends on the type of buffer used:
|
||||
|
||||
void videobuf_queue_sg_init(struct videobuf_queue *q,
|
||||
struct videobuf_queue_ops *ops,
|
||||
struct device *dev,
|
||||
spinlock_t *irqlock,
|
||||
enum v4l2_buf_type type,
|
||||
enum v4l2_field field,
|
||||
unsigned int msize,
|
||||
void *priv);
|
||||
|
||||
void videobuf_queue_vmalloc_init(struct videobuf_queue *q,
|
||||
struct videobuf_queue_ops *ops,
|
||||
struct device *dev,
|
||||
spinlock_t *irqlock,
|
||||
enum v4l2_buf_type type,
|
||||
enum v4l2_field field,
|
||||
unsigned int msize,
|
||||
void *priv);
|
||||
|
||||
void videobuf_queue_dma_contig_init(struct videobuf_queue *q,
|
||||
struct videobuf_queue_ops *ops,
|
||||
struct device *dev,
|
||||
spinlock_t *irqlock,
|
||||
enum v4l2_buf_type type,
|
||||
enum v4l2_field field,
|
||||
unsigned int msize,
|
||||
void *priv);
|
||||
|
||||
In each case, the parameters are the same: q is the queue structure for the
|
||||
device, ops is the set of callbacks as described above, dev is the device
|
||||
structure for this video device, irqlock is an interrupt-safe spinlock to
|
||||
protect access to the data structures, type is the buffer type used by the
|
||||
device (cameras will use V4L2_BUF_TYPE_VIDEO_CAPTURE, for example), field
|
||||
describes which field is being captured (often V4L2_FIELD_NONE for
|
||||
progressive devices), msize is the size of any containing structure used
|
||||
around struct videobuf_buffer, and priv is a private data pointer which
|
||||
shows up in the priv_data field of struct videobuf_queue. Note that these
|
||||
are void functions which, evidently, are immune to failure.
|
||||
|
||||
V4L2 capture drivers can be written to support either of two APIs: the
|
||||
read() system call and the rather more complicated streaming mechanism. As
|
||||
a general rule, it is necessary to support both to ensure that all
|
||||
applications have a chance of working with the device. Videobuf makes it
|
||||
easy to do that with the same code. To implement read(), the driver need
|
||||
only make a call to one of:
|
||||
|
||||
ssize_t videobuf_read_one(struct videobuf_queue *q,
|
||||
char __user *data, size_t count,
|
||||
loff_t *ppos, int nonblocking);
|
||||
|
||||
ssize_t videobuf_read_stream(struct videobuf_queue *q,
|
||||
char __user *data, size_t count,
|
||||
loff_t *ppos, int vbihack, int nonblocking);
|
||||
|
||||
Either one of these functions will read frame data into data, returning the
|
||||
amount actually read; the difference is that videobuf_read_one() will only
|
||||
read a single frame, while videobuf_read_stream() will read multiple frames
|
||||
if they are needed to satisfy the count requested by the application. A
|
||||
typical driver read() implementation will start the capture engine, call
|
||||
one of the above functions, then stop the engine before returning (though a
|
||||
smarter implementation might leave the engine running for a little while in
|
||||
anticipation of another read() call happening in the near future).
|
||||
|
||||
The poll() function can usually be implemented with a direct call to:
|
||||
|
||||
unsigned int videobuf_poll_stream(struct file *file,
|
||||
struct videobuf_queue *q,
|
||||
poll_table *wait);
|
||||
|
||||
Note that the actual wait queue eventually used will be the one associated
|
||||
with the first available buffer.
|
||||
|
||||
When streaming I/O is done to kernel-space buffers, the driver must support
|
||||
the mmap() system call to enable user space to access the data. In many
|
||||
V4L2 drivers, the often-complex mmap() implementation simplifies to a
|
||||
single call to:
|
||||
|
||||
int videobuf_mmap_mapper(struct videobuf_queue *q,
|
||||
struct vm_area_struct *vma);
|
||||
|
||||
Everything else is handled by the videobuf code.
|
||||
|
||||
The release() function requires two separate videobuf calls:
|
||||
|
||||
void videobuf_stop(struct videobuf_queue *q);
|
||||
int videobuf_mmap_free(struct videobuf_queue *q);
|
||||
|
||||
The call to videobuf_stop() terminates any I/O in progress - though it is
|
||||
still up to the driver to stop the capture engine. The call to
|
||||
videobuf_mmap_free() will ensure that all buffers have been unmapped; if
|
||||
so, they will all be passed to the buf_release() callback. If buffers
|
||||
remain mapped, videobuf_mmap_free() returns an error code instead. The
|
||||
purpose is clearly to cause the closing of the file descriptor to fail if
|
||||
buffers are still mapped, but every driver in the 2.6.32 kernel cheerfully
|
||||
ignores its return value.
|
||||
|
||||
ioctl() operations
|
||||
|
||||
The V4L2 API includes a very long list of driver callbacks to respond to
|
||||
the many ioctl() commands made available to user space. A number of these
|
||||
- those associated with streaming I/O - turn almost directly into videobuf
|
||||
calls. The relevant helper functions are:
|
||||
|
||||
int videobuf_reqbufs(struct videobuf_queue *q,
|
||||
struct v4l2_requestbuffers *req);
|
||||
int videobuf_querybuf(struct videobuf_queue *q, struct v4l2_buffer *b);
|
||||
int videobuf_qbuf(struct videobuf_queue *q, struct v4l2_buffer *b);
|
||||
int videobuf_dqbuf(struct videobuf_queue *q, struct v4l2_buffer *b,
|
||||
int nonblocking);
|
||||
int videobuf_streamon(struct videobuf_queue *q);
|
||||
int videobuf_streamoff(struct videobuf_queue *q);
|
||||
int videobuf_cgmbuf(struct videobuf_queue *q, struct video_mbuf *mbuf,
|
||||
int count);
|
||||
|
||||
So, for example, a VIDIOC_REQBUFS call turns into a call to the driver's
|
||||
vidioc_reqbufs() callback which, in turn, usually only needs to locate the
|
||||
proper struct videobuf_queue pointer and pass it to videobuf_reqbufs().
|
||||
These support functions can replace a great deal of buffer management
|
||||
boilerplate in a lot of V4L2 drivers.
|
||||
|
||||
The vidioc_streamon() and vidioc_streamoff() functions will be a bit more
|
||||
complex, of course, since they will also need to deal with starting and
|
||||
stopping the capture engine. videobuf_cgmbuf(), called from the driver's
|
||||
vidiocgmbuf() function, only exists if the V4L1 compatibility module has
|
||||
been selected with CONFIG_VIDEO_V4L1_COMPAT, so its use must be surrounded
|
||||
with #ifdef directives.
|
||||
|
||||
Buffer allocation
|
||||
|
||||
Thus far, we have talked about buffers, but have not looked at how they are
|
||||
allocated. The scatter/gather case is the most complex on this front. For
|
||||
allocation, the driver can leave buffer allocation entirely up to the
|
||||
videobuf layer; in this case, buffers will be allocated as anonymous
|
||||
user-space pages and will be very scattered indeed. If the application is
|
||||
using user-space buffers, no allocation is needed; the videobuf layer will
|
||||
take care of calling get_user_pages() and filling in the scatterlist array.
|
||||
|
||||
If the driver needs to do its own memory allocation, it should be done in
|
||||
the vidioc_reqbufs() function, *after* calling videobuf_reqbufs(). The
|
||||
first step is a call to:
|
||||
|
||||
struct videobuf_dmabuf *videobuf_to_dma(struct videobuf_buffer *buf);
|
||||
|
||||
The returned videobuf_dmabuf structure (defined in
|
||||
<media/videobuf-dma-sg.h>) includes a couple of relevant fields:
|
||||
|
||||
struct scatterlist *sglist;
|
||||
int sglen;
|
||||
|
||||
The driver must allocate an appropriately-sized scatterlist array and
|
||||
populate it with pointers to the pieces of the allocated buffer; sglen
|
||||
should be set to the length of the array.
|
||||
|
||||
Drivers using the vmalloc() method need not (and cannot) concern themselves
|
||||
with buffer allocation at all; videobuf will handle those details. The
|
||||
same is normally true of contiguous-DMA drivers as well; videobuf will
|
||||
allocate the buffers (with dma_alloc_coherent()) when it sees fit. That
|
||||
means that these drivers may be trying to do high-order allocations at any
|
||||
time, an operation which is not always guaranteed to work. Some drivers
|
||||
play tricks by allocating DMA space at system boot time; videobuf does not
|
||||
currently play well with those drivers.
|
||||
|
||||
As of 2.6.31, contiguous-DMA drivers can work with a user-supplied buffer,
|
||||
as long as that buffer is physically contiguous. Normal user-space
|
||||
allocations will not meet that criterion, but buffers obtained from other
|
||||
kernel drivers, or those contained within huge pages, will work with these
|
||||
drivers.
|
||||
|
||||
Filling the buffers
|
||||
|
||||
The final part of a videobuf implementation has no direct callback - it's
|
||||
the portion of the code which actually puts frame data into the buffers,
|
||||
usually in response to interrupts from the device. For all types of
|
||||
drivers, this process works approximately as follows:
|
||||
|
||||
- Obtain the next available buffer and make sure that somebody is actually
|
||||
waiting for it.
|
||||
|
||||
- Get a pointer to the memory and put video data there.
|
||||
|
||||
- Mark the buffer as done and wake up the process waiting for it.
|
||||
|
||||
Step (1) above is done by looking at the driver-managed list_head structure
|
||||
- the one which is filled in the buf_queue() callback. Because starting
|
||||
the engine and enqueueing buffers are done in separate steps, it's possible
|
||||
for the engine to be running without any buffers available - in the
|
||||
vmalloc() case especially. So the driver should be prepared for the list
|
||||
to be empty. It is equally possible that nobody is yet interested in the
|
||||
buffer; the driver should not remove it from the list or fill it until a
|
||||
process is waiting on it. That test can be done by examining the buffer's
|
||||
done field (a wait_queue_head_t structure) with waitqueue_active().
|
||||
|
||||
A buffer's state should be set to VIDEOBUF_ACTIVE before being mapped for
|
||||
DMA; that ensures that the videobuf layer will not try to do anything with
|
||||
it while the device is transferring data.
|
||||
|
||||
For scatter/gather drivers, the needed memory pointers will be found in the
|
||||
scatterlist structure described above. Drivers using the vmalloc() method
|
||||
can get a memory pointer with:
|
||||
|
||||
void *videobuf_to_vmalloc(struct videobuf_buffer *buf);
|
||||
|
||||
For contiguous DMA drivers, the function to use is:
|
||||
|
||||
dma_addr_t videobuf_to_dma_contig(struct videobuf_buffer *buf);
|
||||
|
||||
The contiguous DMA API goes out of its way to hide the kernel-space address
|
||||
of the DMA buffer from drivers.
|
||||
|
||||
The final step is to set the size field of the relevant videobuf_buffer
|
||||
structure to the actual size of the captured image, set state to
|
||||
VIDEOBUF_DONE, then call wake_up() on the done queue. At this point, the
|
||||
buffer is owned by the videobuf layer and the driver should not touch it
|
||||
again.
|
||||
|
||||
Developers who are interested in more information can go into the relevant
|
||||
header files; there are a few low-level functions declared there which have
|
||||
not been talked about here. Also worthwhile is the vivi driver
|
||||
(drivers/media/video/vivi.c), which is maintained as an example of how V4L2
|
||||
drivers should be written. Vivi only uses the vmalloc() API, but it's good
|
||||
enough to get started with. Note also that all of these calls are exported
|
||||
GPL-only, so they will not be available to non-GPL kernel modules.
|
|
@ -166,19 +166,13 @@ NUMA
|
|||
|
||||
numa=noacpi Don't parse the SRAT table for NUMA setup
|
||||
|
||||
numa=fake=CMDLINE
|
||||
If a number, fakes CMDLINE nodes and ignores NUMA setup of the
|
||||
actual machine. Otherwise, system memory is configured
|
||||
depending on the sizes and coefficients listed. For example:
|
||||
numa=fake=2*512,1024,4*256,*128
|
||||
gives two 512M nodes, a 1024M node, four 256M nodes, and the
|
||||
rest split into 128M chunks. If the last character of CMDLINE
|
||||
is a *, the remaining memory is divided up equally among its
|
||||
coefficient:
|
||||
numa=fake=2*512,2*
|
||||
gives two 512M nodes and the rest split into two nodes.
|
||||
Otherwise, the remaining system RAM is allocated to an
|
||||
additional node.
|
||||
numa=fake=<size>[MG]
|
||||
If given as a memory unit, fills all system RAM with nodes of
|
||||
size interleaved over physical nodes.
|
||||
|
||||
numa=fake=<N>
|
||||
If given as an integer, fills all system RAM with N fake nodes
|
||||
interleaved over physical nodes.
|
||||
|
||||
ACPI
|
||||
|
||||
|
|
59
MAINTAINERS
59
MAINTAINERS
|
@ -221,6 +221,7 @@ F: drivers/net/acenic*
|
|||
|
||||
ACER ASPIRE ONE TEMPERATURE AND FAN DRIVER
|
||||
M: Peter Feuerer <peter@piie.net>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
W: http://piie.net/?section=acerhdf
|
||||
S: Maintained
|
||||
F: drivers/platform/x86/acerhdf.c
|
||||
|
@ -228,6 +229,7 @@ F: drivers/platform/x86/acerhdf.c
|
|||
ACER WMI LAPTOP EXTRAS
|
||||
M: Carlos Corbacho <carlos@strangeworlds.co.uk>
|
||||
L: aceracpi@googlegroups.com (subscribers-only)
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
W: http://code.google.com/p/aceracpi
|
||||
S: Maintained
|
||||
F: drivers/platform/x86/acer-wmi.c
|
||||
|
@ -288,7 +290,7 @@ F: drivers/acpi/video.c
|
|||
|
||||
ACPI WMI DRIVER
|
||||
M: Carlos Corbacho <carlos@strangeworlds.co.uk>
|
||||
L: linux-acpi@vger.kernel.org
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
W: http://www.lesswatts.org/projects/acpi/
|
||||
S: Maintained
|
||||
F: drivers/platform/x86/wmi.c
|
||||
|
@ -968,6 +970,7 @@ ASUS ACPI EXTRAS DRIVER
|
|||
M: Corentin Chary <corentincj@iksaif.net>
|
||||
M: Karol Kozimor <sziwan@users.sourceforge.net>
|
||||
L: acpi4asus-user@lists.sourceforge.net
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
W: http://acpi4asus.sf.net
|
||||
S: Maintained
|
||||
F: drivers/platform/x86/asus_acpi.c
|
||||
|
@ -981,6 +984,7 @@ F: drivers/hwmon/asb100.c
|
|||
ASUS LAPTOP EXTRAS DRIVER
|
||||
M: Corentin Chary <corentincj@iksaif.net>
|
||||
L: acpi4asus-user@lists.sourceforge.net
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
W: http://acpi4asus.sf.net
|
||||
S: Maintained
|
||||
F: drivers/platform/x86/asus-laptop.c
|
||||
|
@ -1473,6 +1477,7 @@ F: drivers/scsi/fnic/
|
|||
CMPC ACPI DRIVER
|
||||
M: Thadeu Lima de Souza Cascardo <cascardo@holoscopio.com>
|
||||
M: Daniel Oliveira Nascimento <don@syst.com.br>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/platform/x86/classmate-laptop.c
|
||||
|
||||
|
@ -1516,6 +1521,7 @@ F: drivers/pci/hotplug/cpcihp_generic.c
|
|||
|
||||
COMPAL LAPTOP SUPPORT
|
||||
M: Cezary Jackiewicz <cezary.jackiewicz@gmail.com>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/platform/x86/compal-laptop.c
|
||||
|
||||
|
@ -1746,6 +1752,7 @@ F: drivers/net/defxx.*
|
|||
|
||||
DELL LAPTOP DRIVER
|
||||
M: Matthew Garrett <mjg59@srcf.ucam.org>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/platform/x86/dell-laptop.c
|
||||
|
||||
|
@ -2028,6 +2035,7 @@ F: drivers/edac/r82600_edac.c
|
|||
EEEPC LAPTOP EXTRAS DRIVER
|
||||
M: Corentin Chary <corentincj@iksaif.net>
|
||||
L: acpi4asus-user@lists.sourceforge.net
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
W: http://acpi4asus.sf.net
|
||||
S: Maintained
|
||||
F: drivers/platform/x86/eeepc-laptop.c
|
||||
|
@ -2141,6 +2149,17 @@ S: Supported
|
|||
F: Documentation/fault-injection/
|
||||
F: lib/fault-inject.c
|
||||
|
||||
FCOE SUBSYSTEM (libfc, libfcoe, fcoe)
|
||||
M: Robert Love <robert.w.love@intel.com>
|
||||
L: devel@open-fcoe.org
|
||||
W: www.Open-FCoE.org
|
||||
S: Supported
|
||||
F: drivers/scsi/libfc/
|
||||
F: drivers/scsi/fcoe/
|
||||
F: include/scsi/fc/
|
||||
F: include/scsi/libfc.h
|
||||
F: include/scsi/libfcoe.h
|
||||
|
||||
FILE LOCKING (flock() and fcntl()/lockf())
|
||||
M: Matthew Wilcox <matthew@wil.cx>
|
||||
L: linux-fsdevel@vger.kernel.org
|
||||
|
@ -2295,7 +2314,7 @@ F: arch/frv/
|
|||
|
||||
FUJITSU LAPTOP EXTRAS
|
||||
M: Jonathan Woithe <jwoithe@physics.adelaide.edu.au>
|
||||
L: linux-acpi@vger.kernel.org
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/platform/x86/fujitsu-laptop.c
|
||||
|
||||
|
@ -2393,6 +2412,18 @@ L: linuxppc-dev@ozlabs.org
|
|||
S: Odd Fixes
|
||||
F: drivers/char/hvc_*
|
||||
|
||||
VIRTIO CONSOLE DRIVER
|
||||
M: Amit Shah <amit.shah@redhat.com>
|
||||
L: virtualization@lists.linux-foundation.org
|
||||
S: Maintained
|
||||
F: drivers/char/virtio_console.c
|
||||
|
||||
iSCSI BOOT FIRMWARE TABLE (iBFT) DRIVER
|
||||
M: Peter Jones <pjones@redhat.com>
|
||||
M: Konrad Rzeszutek Wilk <konrad@kernel.org>
|
||||
S: Maintained
|
||||
F: drivers/firmware/iscsi_ibft*
|
||||
|
||||
GSPCA FINEPIX SUBDRIVER
|
||||
M: Frank Zago <frank@zago.net>
|
||||
L: linux-media@vger.kernel.org
|
||||
|
@ -2561,6 +2592,7 @@ F: drivers/net/wireless/hostap/
|
|||
|
||||
HP COMPAQ TC1100 TABLET WMI EXTRAS DRIVER
|
||||
M: Carlos Corbacho <carlos@strangeworlds.co.uk>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Odd Fixes
|
||||
F: drivers/platform/x86/tc1100-wmi.c
|
||||
|
||||
|
@ -2771,7 +2803,7 @@ F: drivers/video/i810/
|
|||
|
||||
INTEL MENLOW THERMAL DRIVER
|
||||
M: Sujith Thomas <sujith.thomas@intel.com>
|
||||
L: linux-acpi@vger.kernel.org
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
W: http://www.lesswatts.org/projects/acpi/
|
||||
S: Supported
|
||||
F: drivers/platform/x86/intel_menlow.c
|
||||
|
@ -3637,6 +3669,7 @@ F: drivers/char/mxser.*
|
|||
|
||||
MSI LAPTOP SUPPORT
|
||||
M: Lennart Poettering <mzxreary@0pointer.de>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
W: https://tango.0pointer.de/mailman/listinfo/s270-linux
|
||||
W: http://0pointer.de/lennart/tchibo.html
|
||||
S: Maintained
|
||||
|
@ -3644,6 +3677,7 @@ F: drivers/platform/x86/msi-laptop.c
|
|||
|
||||
MSI WMI SUPPORT
|
||||
M: Anisse Astier <anisse@astier.eu>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/platform/x86/msi-wmi.c
|
||||
|
||||
|
@ -4096,6 +4130,7 @@ F: drivers/i2c/busses/i2c-pasemi.c
|
|||
|
||||
PANASONIC LAPTOP ACPI EXTRAS DRIVER
|
||||
M: Harald Welte <laforge@gnumonks.org>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/platform/x86/panasonic-laptop.c
|
||||
|
||||
|
@ -4677,6 +4712,13 @@ F: drivers/media/common/saa7146*
|
|||
F: drivers/media/video/*7146*
|
||||
F: include/media/*7146*
|
||||
|
||||
TLG2300 VIDEO4LINUX-2 DRIVER
|
||||
M: Huang Shijie <shijie8@gmail.com>
|
||||
M: Kang Yong <kangyong@telegent.com>
|
||||
M: Zhang Xiaobing <xbzhang@telegent.com>
|
||||
S: Supported
|
||||
F: drivers/media/video/tlg2300
|
||||
|
||||
SC1200 WDT DRIVER
|
||||
M: Zwane Mwaikambo <zwane@arm.linux.org.uk>
|
||||
S: Maintained
|
||||
|
@ -5035,7 +5077,7 @@ F: include/linux/ssb/
|
|||
|
||||
SONY VAIO CONTROL DEVICE DRIVER
|
||||
M: Mattia Dongili <malattia@linux.it>
|
||||
L: linux-acpi@vger.kernel.org
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
W: http://www.linux.it/~malattia/wiki/index.php/Sony_drivers
|
||||
S: Maintained
|
||||
F: Documentation/laptops/sony-laptop.txt
|
||||
|
@ -5241,6 +5283,7 @@ F: arch/xtensa/
|
|||
THINKPAD ACPI EXTRAS DRIVER
|
||||
M: Henrique de Moraes Holschuh <ibm-acpi@hmh.eng.br>
|
||||
L: ibm-acpi-devel@lists.sourceforge.net
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
W: http://ibm-acpi.sourceforge.net
|
||||
W: http://thinkwiki.org/wiki/Ibm-acpi
|
||||
T: git git://repo.or.cz/linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git
|
||||
|
@ -5294,10 +5337,12 @@ F: security/tomoyo/
|
|||
|
||||
TOPSTAR LAPTOP EXTRAS DRIVER
|
||||
M: Herton Ronaldo Krzesinski <herton@mandriva.com.br>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/platform/x86/topstar-laptop.c
|
||||
|
||||
TOSHIBA ACPI EXTRAS DRIVER
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Orphan
|
||||
F: drivers/platform/x86/toshiba_acpi.c
|
||||
|
||||
|
@ -6025,6 +6070,12 @@ S: Maintained
|
|||
F: Documentation/x86/
|
||||
F: arch/x86/
|
||||
|
||||
X86 PLATFORM DRIVERS
|
||||
M: Matthew Garrett <mjg@redhat.com>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/platform/x86
|
||||
|
||||
XEN HYPERVISOR INTERFACE
|
||||
M: Jeremy Fitzhardinge <jeremy@xensource.com>
|
||||
M: Chris Wright <chrisw@sous-sol.org>
|
||||
|
|
26
arch/Kconfig
26
arch/Kconfig
|
@ -3,11 +3,9 @@
|
|||
#
|
||||
|
||||
config OPROFILE
|
||||
tristate "OProfile system profiling (EXPERIMENTAL)"
|
||||
tristate "OProfile system profiling"
|
||||
depends on PROFILING
|
||||
depends on HAVE_OPROFILE
|
||||
depends on TRACING_SUPPORT
|
||||
select TRACING
|
||||
select RING_BUFFER
|
||||
select RING_BUFFER_ALLOW_SWAP
|
||||
help
|
||||
|
@ -17,20 +15,6 @@ config OPROFILE
|
|||
|
||||
If unsure, say N.
|
||||
|
||||
config OPROFILE_IBS
|
||||
bool "OProfile AMD IBS support (EXPERIMENTAL)"
|
||||
default n
|
||||
depends on OPROFILE && SMP && X86
|
||||
help
|
||||
Instruction-Based Sampling (IBS) is a new profiling
|
||||
technique that provides rich, precise program performance
|
||||
information. IBS is introduced by AMD Family10h processors
|
||||
(AMD Opteron Quad-Core processor "Barcelona") to overcome
|
||||
the limitations of conventional performance counter
|
||||
sampling.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config OPROFILE_EVENT_MULTIPLEX
|
||||
bool "OProfile multiplexing support (EXPERIMENTAL)"
|
||||
default n
|
||||
|
@ -121,6 +105,14 @@ config HAVE_DMA_ATTRS
|
|||
config USE_GENERIC_SMP_HELPERS
|
||||
bool
|
||||
|
||||
config HAVE_REGS_AND_STACK_ACCESS_API
|
||||
bool
|
||||
help
|
||||
This symbol should be selected by an architecure if it supports
|
||||
the API needed to access registers and stack entries from pt_regs,
|
||||
declared in asm/ptrace.h
|
||||
For example the kprobes-based event tracer needs this API.
|
||||
|
||||
config HAVE_CLK
|
||||
bool
|
||||
help
|
||||
|
|
|
@ -126,8 +126,8 @@ DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, pcibios_fixup_final);
|
|||
#define MB (1024*KB)
|
||||
#define GB (1024*MB)
|
||||
|
||||
void
|
||||
pcibios_align_resource(void *data, struct resource *res,
|
||||
resource_size_t
|
||||
pcibios_align_resource(void *data, const struct resource *res,
|
||||
resource_size_t size, resource_size_t align)
|
||||
{
|
||||
struct pci_dev *dev = data;
|
||||
|
@ -184,7 +184,7 @@ pcibios_align_resource(void *data, struct resource *res,
|
|||
}
|
||||
}
|
||||
|
||||
res->start = start;
|
||||
return start;
|
||||
}
|
||||
#undef KB
|
||||
#undef MB
|
||||
|
|
|
@ -447,6 +447,16 @@ static inline void __flush_icache_all(void)
|
|||
: "r" (0));
|
||||
#endif
|
||||
}
|
||||
static inline void flush_kernel_vmap_range(void *addr, int size)
|
||||
{
|
||||
if ((cache_is_vivt() || cache_is_vipt_aliasing()))
|
||||
__cpuc_flush_dcache_area(addr, (size_t)size);
|
||||
}
|
||||
static inline void invalidate_kernel_vmap_range(void *addr, int size)
|
||||
{
|
||||
if ((cache_is_vivt() || cache_is_vipt_aliasing()))
|
||||
__cpuc_flush_dcache_area(addr, (size_t)size);
|
||||
}
|
||||
|
||||
#define ARCH_HAS_FLUSH_ANON_PAGE
|
||||
static inline void flush_anon_page(struct vm_area_struct *vma,
|
||||
|
|
|
@ -616,15 +616,17 @@ char * __init pcibios_setup(char *str)
|
|||
* but we want to try to avoid allocating at 0x2900-0x2bff
|
||||
* which might be mirrored at 0x0100-0x03ff..
|
||||
*/
|
||||
void pcibios_align_resource(void *data, struct resource *res,
|
||||
resource_size_t size, resource_size_t align)
|
||||
resource_size_t pcibios_align_resource(void *data, const struct resource *res,
|
||||
resource_size_t size, resource_size_t align)
|
||||
{
|
||||
resource_size_t start = res->start;
|
||||
|
||||
if (res->flags & IORESOURCE_IO && start & 0x300)
|
||||
start = (start + 0x3ff) & ~0x3ff;
|
||||
|
||||
res->start = (start + align - 1) & ~(align - 1);
|
||||
start = (start + align - 1) & ~(align - 1);
|
||||
|
||||
return start;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -37,6 +37,8 @@
|
|||
#include <mach/nand.h>
|
||||
#include <mach/keyscan.h>
|
||||
|
||||
#include <media/tvp514x.h>
|
||||
|
||||
static inline int have_imager(void)
|
||||
{
|
||||
/* REVISIT when it's supported, trigger via Kconfig */
|
||||
|
@ -306,6 +308,73 @@ static void dm365evm_mmc_configure(void)
|
|||
davinci_cfg_reg(DM365_SD1_DATA0);
|
||||
}
|
||||
|
||||
static struct tvp514x_platform_data tvp5146_pdata = {
|
||||
.clk_polarity = 0,
|
||||
.hs_polarity = 1,
|
||||
.vs_polarity = 1
|
||||
};
|
||||
|
||||
#define TVP514X_STD_ALL (V4L2_STD_NTSC | V4L2_STD_PAL)
|
||||
/* Inputs available at the TVP5146 */
|
||||
static struct v4l2_input tvp5146_inputs[] = {
|
||||
{
|
||||
.index = 0,
|
||||
.name = "Composite",
|
||||
.type = V4L2_INPUT_TYPE_CAMERA,
|
||||
.std = TVP514X_STD_ALL,
|
||||
},
|
||||
{
|
||||
.index = 1,
|
||||
.name = "S-Video",
|
||||
.type = V4L2_INPUT_TYPE_CAMERA,
|
||||
.std = TVP514X_STD_ALL,
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
* this is the route info for connecting each input to decoder
|
||||
* ouput that goes to vpfe. There is a one to one correspondence
|
||||
* with tvp5146_inputs
|
||||
*/
|
||||
static struct vpfe_route tvp5146_routes[] = {
|
||||
{
|
||||
.input = INPUT_CVBS_VI2B,
|
||||
.output = OUTPUT_10BIT_422_EMBEDDED_SYNC,
|
||||
},
|
||||
{
|
||||
.input = INPUT_SVIDEO_VI2C_VI1C,
|
||||
.output = OUTPUT_10BIT_422_EMBEDDED_SYNC,
|
||||
},
|
||||
};
|
||||
|
||||
static struct vpfe_subdev_info vpfe_sub_devs[] = {
|
||||
{
|
||||
.name = "tvp5146",
|
||||
.grp_id = 0,
|
||||
.num_inputs = ARRAY_SIZE(tvp5146_inputs),
|
||||
.inputs = tvp5146_inputs,
|
||||
.routes = tvp5146_routes,
|
||||
.can_route = 1,
|
||||
.ccdc_if_params = {
|
||||
.if_type = VPFE_BT656,
|
||||
.hdpol = VPFE_PINPOL_POSITIVE,
|
||||
.vdpol = VPFE_PINPOL_POSITIVE,
|
||||
},
|
||||
.board_info = {
|
||||
I2C_BOARD_INFO("tvp5146", 0x5d),
|
||||
.platform_data = &tvp5146_pdata,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
static struct vpfe_config vpfe_cfg = {
|
||||
.num_subdevs = ARRAY_SIZE(vpfe_sub_devs),
|
||||
.sub_devs = vpfe_sub_devs,
|
||||
.i2c_adapter_id = 1,
|
||||
.card_name = "DM365 EVM",
|
||||
.ccdc = "ISIF",
|
||||
};
|
||||
|
||||
static void __init evm_init_i2c(void)
|
||||
{
|
||||
davinci_init_i2c(&i2c_pdata);
|
||||
|
@ -497,6 +566,8 @@ static struct davinci_uart_config uart_config __initdata = {
|
|||
|
||||
static void __init dm365_evm_map_io(void)
|
||||
{
|
||||
/* setup input configuration for VPFE input devices */
|
||||
dm365_set_vpfe_config(&vpfe_cfg);
|
||||
dm365_init();
|
||||
}
|
||||
|
||||
|
|
|
@ -125,7 +125,6 @@ static struct clk vpss_slave_clk = {
|
|||
.lpsc = DAVINCI_LPSC_VPSSSLV,
|
||||
};
|
||||
|
||||
|
||||
static struct clk clkout1_clk = {
|
||||
.name = "clkout1",
|
||||
.parent = &pll1_aux_clk,
|
||||
|
@ -665,6 +664,17 @@ static struct platform_device dm355_asp1_device = {
|
|||
.resource = dm355_asp1_resources,
|
||||
};
|
||||
|
||||
static void dm355_ccdc_setup_pinmux(void)
|
||||
{
|
||||
davinci_cfg_reg(DM355_VIN_PCLK);
|
||||
davinci_cfg_reg(DM355_VIN_CAM_WEN);
|
||||
davinci_cfg_reg(DM355_VIN_CAM_VD);
|
||||
davinci_cfg_reg(DM355_VIN_CAM_HD);
|
||||
davinci_cfg_reg(DM355_VIN_YIN_EN);
|
||||
davinci_cfg_reg(DM355_VIN_CINL_EN);
|
||||
davinci_cfg_reg(DM355_VIN_CINH_EN);
|
||||
}
|
||||
|
||||
static struct resource dm355_vpss_resources[] = {
|
||||
{
|
||||
/* VPSS BL Base address */
|
||||
|
@ -701,6 +711,10 @@ static struct resource vpfe_resources[] = {
|
|||
.end = IRQ_VDINT1,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static u64 vpfe_capture_dma_mask = DMA_BIT_MASK(32);
|
||||
static struct resource dm355_ccdc_resource[] = {
|
||||
/* CCDC Base address */
|
||||
{
|
||||
.flags = IORESOURCE_MEM,
|
||||
|
@ -708,8 +722,18 @@ static struct resource vpfe_resources[] = {
|
|||
.end = 0x01c70600 + 0x1ff,
|
||||
},
|
||||
};
|
||||
static struct platform_device dm355_ccdc_dev = {
|
||||
.name = "dm355_ccdc",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(dm355_ccdc_resource),
|
||||
.resource = dm355_ccdc_resource,
|
||||
.dev = {
|
||||
.dma_mask = &vpfe_capture_dma_mask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = dm355_ccdc_setup_pinmux,
|
||||
},
|
||||
};
|
||||
|
||||
static u64 vpfe_capture_dma_mask = DMA_BIT_MASK(32);
|
||||
static struct platform_device vpfe_capture_dev = {
|
||||
.name = CAPTURE_DRV_NAME,
|
||||
.id = -1,
|
||||
|
@ -857,20 +881,13 @@ static int __init dm355_init_devices(void)
|
|||
if (!cpu_is_davinci_dm355())
|
||||
return 0;
|
||||
|
||||
/* Add ccdc clock aliases */
|
||||
clk_add_alias("master", dm355_ccdc_dev.name, "vpss_master", NULL);
|
||||
clk_add_alias("slave", dm355_ccdc_dev.name, "vpss_master", NULL);
|
||||
davinci_cfg_reg(DM355_INT_EDMA_CC);
|
||||
platform_device_register(&dm355_edma_device);
|
||||
platform_device_register(&dm355_vpss_device);
|
||||
/*
|
||||
* setup Mux configuration for vpfe input and register
|
||||
* vpfe capture platform device
|
||||
*/
|
||||
davinci_cfg_reg(DM355_VIN_PCLK);
|
||||
davinci_cfg_reg(DM355_VIN_CAM_WEN);
|
||||
davinci_cfg_reg(DM355_VIN_CAM_VD);
|
||||
davinci_cfg_reg(DM355_VIN_CAM_HD);
|
||||
davinci_cfg_reg(DM355_VIN_YIN_EN);
|
||||
davinci_cfg_reg(DM355_VIN_CINL_EN);
|
||||
davinci_cfg_reg(DM355_VIN_CINH_EN);
|
||||
platform_device_register(&dm355_ccdc_dev);
|
||||
platform_device_register(&vpfe_capture_dev);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -1008,6 +1008,97 @@ void __init dm365_init(void)
|
|||
davinci_common_init(&davinci_soc_info_dm365);
|
||||
}
|
||||
|
||||
static struct resource dm365_vpss_resources[] = {
|
||||
{
|
||||
/* VPSS ISP5 Base address */
|
||||
.name = "isp5",
|
||||
.start = 0x01c70000,
|
||||
.end = 0x01c70000 + 0xff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
/* VPSS CLK Base address */
|
||||
.name = "vpss",
|
||||
.start = 0x01c70200,
|
||||
.end = 0x01c70200 + 0xff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device dm365_vpss_device = {
|
||||
.name = "vpss",
|
||||
.id = -1,
|
||||
.dev.platform_data = "dm365_vpss",
|
||||
.num_resources = ARRAY_SIZE(dm365_vpss_resources),
|
||||
.resource = dm365_vpss_resources,
|
||||
};
|
||||
|
||||
static struct resource vpfe_resources[] = {
|
||||
{
|
||||
.start = IRQ_VDINT0,
|
||||
.end = IRQ_VDINT0,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
{
|
||||
.start = IRQ_VDINT1,
|
||||
.end = IRQ_VDINT1,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static u64 vpfe_capture_dma_mask = DMA_BIT_MASK(32);
|
||||
static struct platform_device vpfe_capture_dev = {
|
||||
.name = CAPTURE_DRV_NAME,
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(vpfe_resources),
|
||||
.resource = vpfe_resources,
|
||||
.dev = {
|
||||
.dma_mask = &vpfe_capture_dma_mask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
};
|
||||
|
||||
static void dm365_isif_setup_pinmux(void)
|
||||
{
|
||||
davinci_cfg_reg(DM365_VIN_CAM_WEN);
|
||||
davinci_cfg_reg(DM365_VIN_CAM_VD);
|
||||
davinci_cfg_reg(DM365_VIN_CAM_HD);
|
||||
davinci_cfg_reg(DM365_VIN_YIN4_7_EN);
|
||||
davinci_cfg_reg(DM365_VIN_YIN0_3_EN);
|
||||
}
|
||||
|
||||
static struct resource isif_resource[] = {
|
||||
/* ISIF Base address */
|
||||
{
|
||||
.start = 0x01c71000,
|
||||
.end = 0x01c71000 + 0x1ff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
/* ISIF Linearization table 0 */
|
||||
{
|
||||
.start = 0x1C7C000,
|
||||
.end = 0x1C7C000 + 0x2ff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
/* ISIF Linearization table 1 */
|
||||
{
|
||||
.start = 0x1C7C400,
|
||||
.end = 0x1C7C400 + 0x2ff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
static struct platform_device dm365_isif_dev = {
|
||||
.name = "isif",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(isif_resource),
|
||||
.resource = isif_resource,
|
||||
.dev = {
|
||||
.dma_mask = &vpfe_capture_dma_mask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = dm365_isif_setup_pinmux,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init dm365_init_devices(void)
|
||||
{
|
||||
if (!cpu_is_davinci_dm365())
|
||||
|
@ -1016,7 +1107,16 @@ static int __init dm365_init_devices(void)
|
|||
davinci_cfg_reg(DM365_INT_EDMA_CC);
|
||||
platform_device_register(&dm365_edma_device);
|
||||
platform_device_register(&dm365_emac_device);
|
||||
|
||||
/* Add isif clock alias */
|
||||
clk_add_alias("master", dm365_isif_dev.name, "vpss_master", NULL);
|
||||
platform_device_register(&dm365_vpss_device);
|
||||
platform_device_register(&dm365_isif_dev);
|
||||
platform_device_register(&vpfe_capture_dev);
|
||||
return 0;
|
||||
}
|
||||
postcore_initcall(dm365_init_devices);
|
||||
|
||||
void dm365_set_vpfe_config(struct vpfe_config *cfg)
|
||||
{
|
||||
vpfe_capture_dev.dev.platform_data = cfg;
|
||||
}
|
||||
|
|
|
@ -612,6 +612,11 @@ static struct resource vpfe_resources[] = {
|
|||
.end = IRQ_VDINT1,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static u64 vpfe_capture_dma_mask = DMA_BIT_MASK(32);
|
||||
static struct resource dm644x_ccdc_resource[] = {
|
||||
/* CCDC Base address */
|
||||
{
|
||||
.start = 0x01c70400,
|
||||
.end = 0x01c70400 + 0xff,
|
||||
|
@ -619,7 +624,17 @@ static struct resource vpfe_resources[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static u64 vpfe_capture_dma_mask = DMA_BIT_MASK(32);
|
||||
static struct platform_device dm644x_ccdc_dev = {
|
||||
.name = "dm644x_ccdc",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(dm644x_ccdc_resource),
|
||||
.resource = dm644x_ccdc_resource,
|
||||
.dev = {
|
||||
.dma_mask = &vpfe_capture_dma_mask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device vpfe_capture_dev = {
|
||||
.name = CAPTURE_DRV_NAME,
|
||||
.id = -1,
|
||||
|
@ -769,9 +784,13 @@ static int __init dm644x_init_devices(void)
|
|||
if (!cpu_is_davinci_dm644x())
|
||||
return 0;
|
||||
|
||||
/* Add ccdc clock aliases */
|
||||
clk_add_alias("master", dm644x_ccdc_dev.name, "vpss_master", NULL);
|
||||
clk_add_alias("slave", dm644x_ccdc_dev.name, "vpss_slave", NULL);
|
||||
platform_device_register(&dm644x_edma_device);
|
||||
platform_device_register(&dm644x_emac_device);
|
||||
platform_device_register(&dm644x_vpss_device);
|
||||
platform_device_register(&dm644x_ccdc_dev);
|
||||
platform_device_register(&vpfe_capture_dev);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include <mach/emac.h>
|
||||
#include <mach/asp.h>
|
||||
#include <mach/keyscan.h>
|
||||
#include <media/davinci/vpfe_capture.h>
|
||||
|
||||
#define DM365_EMAC_BASE (0x01D07000)
|
||||
#define DM365_EMAC_CNTRL_OFFSET (0x0000)
|
||||
|
@ -36,4 +37,5 @@ void __init dm365_init_asp(struct snd_platform_data *pdata);
|
|||
void __init dm365_init_ks(struct davinci_ks_platform_data *pdata);
|
||||
void __init dm365_init_rtc(void);
|
||||
|
||||
void dm365_set_vpfe_config(struct vpfe_config *cfg);
|
||||
#endif /* __ASM_ARCH_DM365_H */
|
||||
|
|
|
@ -86,11 +86,19 @@ static struct amba_device cpu8815_amba_gpio[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static struct amba_device cpu8815_amba_rng = {
|
||||
.dev = {
|
||||
.init_name = "rng",
|
||||
},
|
||||
__MEM_4K_RESOURCE(NOMADIK_RNG_BASE),
|
||||
};
|
||||
|
||||
static struct amba_device *amba_devs[] __initdata = {
|
||||
cpu8815_amba_gpio + 0,
|
||||
cpu8815_amba_gpio + 1,
|
||||
cpu8815_amba_gpio + 2,
|
||||
cpu8815_amba_gpio + 3,
|
||||
&cpu8815_amba_rng
|
||||
};
|
||||
|
||||
static int __init cpu8815_init(void)
|
||||
|
|
|
@ -35,8 +35,6 @@
|
|||
#define PXA_CAMERA_VSP 0x400
|
||||
|
||||
struct pxacamera_platform_data {
|
||||
int (*init)(struct device *);
|
||||
|
||||
unsigned long flags;
|
||||
unsigned long mclk_10khz;
|
||||
};
|
||||
|
|
|
@ -41,18 +41,16 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
|
|||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
pcibios_align_resource(void *data, struct resource *res,
|
||||
resource_size_t
|
||||
pcibios_align_resource(void *data, const struct resource *res,
|
||||
resource_size_t size, resource_size_t align)
|
||||
{
|
||||
if (res->flags & IORESOURCE_IO) {
|
||||
resource_size_t start = res->start;
|
||||
resource_size_t start = res->start;
|
||||
|
||||
if (start & 0x300) {
|
||||
start = (start + 0x3ff) & ~0x3ff;
|
||||
res->start = start;
|
||||
}
|
||||
}
|
||||
if ((res->flags & IORESOURCE_IO) && (start & 0x300))
|
||||
start = (start + 0x3ff) & ~0x3ff;
|
||||
|
||||
return start
|
||||
}
|
||||
|
||||
int pcibios_enable_resources(struct pci_dev *dev, int mask)
|
||||
|
|
|
@ -32,18 +32,16 @@
|
|||
* but we want to try to avoid allocating at 0x2900-0x2bff
|
||||
* which might have be mirrored at 0x0100-0x03ff..
|
||||
*/
|
||||
void
|
||||
pcibios_align_resource(void *data, struct resource *res,
|
||||
resource_size_t
|
||||
pcibios_align_resource(void *data, const struct resource *res,
|
||||
resource_size_t size, resource_size_t align)
|
||||
{
|
||||
if (res->flags & IORESOURCE_IO) {
|
||||
resource_size_t start = res->start;
|
||||
resource_size_t start = res->start;
|
||||
|
||||
if (start & 0x300) {
|
||||
start = (start + 0x3ff) & ~0x3ff;
|
||||
res->start = start;
|
||||
}
|
||||
}
|
||||
if ((res->flags & IORESOURCE_IO) && (start & 0x300))
|
||||
start = (start + 0x3ff) & ~0x3ff;
|
||||
|
||||
return start
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -44,8 +44,8 @@ void cache_push_v (unsigned long vaddr, int len)
|
|||
{
|
||||
}
|
||||
|
||||
/* Map some physical address range into the kernel address space. The
|
||||
* code is copied and adapted from map_chunk().
|
||||
/*
|
||||
* Map some physical address range into the kernel address space.
|
||||
*/
|
||||
|
||||
unsigned long kernel_map(unsigned long paddr, unsigned long size,
|
||||
|
|
|
@ -98,6 +98,7 @@ ia64_acpi_release_global_lock (unsigned int *lock)
|
|||
#endif
|
||||
#define acpi_processor_cstate_check(x) (x) /* no idle limits on IA64 :) */
|
||||
static inline void disable_acpi(void) { }
|
||||
static inline void pci_acpi_crs_quirks(void) { }
|
||||
|
||||
const char *acpi_get_sysname (void);
|
||||
int acpi_request_vector (u32 int_type);
|
||||
|
|
|
@ -870,7 +870,7 @@ static int __kprobes pre_kprobes_handler(struct die_args *args)
|
|||
return 1;
|
||||
|
||||
ss_probe:
|
||||
#if !defined(CONFIG_PREEMPT) || defined(CONFIG_FREEZER)
|
||||
#if !defined(CONFIG_PREEMPT)
|
||||
if (p->ainsn.inst_flag == INST_FLAG_BOOSTABLE && !p->post_handler) {
|
||||
/* Boost up -- we can execute copied instructions directly */
|
||||
ia64_psr(regs)->ri = p->ainsn.slot;
|
||||
|
|
|
@ -320,9 +320,9 @@ static __devinit acpi_status add_window(struct acpi_resource *res, void *data)
|
|||
static void __devinit
|
||||
pcibios_setup_root_windows(struct pci_bus *bus, struct pci_controller *ctrl)
|
||||
{
|
||||
int i, j;
|
||||
int i;
|
||||
|
||||
j = 0;
|
||||
pci_bus_remove_resources(bus);
|
||||
for (i = 0; i < ctrl->windows; i++) {
|
||||
struct resource *res = &ctrl->window[i].resource;
|
||||
/* HP's firmware has a hack to work around a Windows bug.
|
||||
|
@ -330,13 +330,7 @@ pcibios_setup_root_windows(struct pci_bus *bus, struct pci_controller *ctrl)
|
|||
if ((res->flags & IORESOURCE_MEM) &&
|
||||
(res->end - res->start < 16))
|
||||
continue;
|
||||
if (j >= PCI_BUS_NUM_RESOURCES) {
|
||||
dev_warn(&bus->dev,
|
||||
"ignoring host bridge window %pR (no space)\n",
|
||||
res);
|
||||
continue;
|
||||
}
|
||||
bus->resource[j++] = res;
|
||||
pci_bus_add_resource(bus, res, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -452,13 +446,12 @@ EXPORT_SYMBOL(pcibios_bus_to_resource);
|
|||
static int __devinit is_valid_resource(struct pci_dev *dev, int idx)
|
||||
{
|
||||
unsigned int i, type_mask = IORESOURCE_IO | IORESOURCE_MEM;
|
||||
struct resource *devr = &dev->resource[idx];
|
||||
struct resource *devr = &dev->resource[idx], *busr;
|
||||
|
||||
if (!dev->bus)
|
||||
return 0;
|
||||
for (i=0; i<PCI_BUS_NUM_RESOURCES; i++) {
|
||||
struct resource *busr = dev->bus->resource[i];
|
||||
|
||||
pci_bus_for_each_resource(dev->bus, busr, i) {
|
||||
if (!busr || ((busr->flags ^ devr->flags) & type_mask))
|
||||
continue;
|
||||
if ((devr->start) && (devr->start >= busr->start) &&
|
||||
|
@ -547,10 +540,11 @@ pcibios_disable_device (struct pci_dev *dev)
|
|||
acpi_pci_irq_disable(dev);
|
||||
}
|
||||
|
||||
void
|
||||
pcibios_align_resource (void *data, struct resource *res,
|
||||
resource_size_t
|
||||
pcibios_align_resource (void *data, const struct resource *res,
|
||||
resource_size_t size, resource_size_t align)
|
||||
{
|
||||
return res->start;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -536,10 +536,6 @@ config GVPIOEXT_PLIP
|
|||
Say Y to enable doing IP over the parallel port on your GVP
|
||||
IO-Extender card, N otherwise.
|
||||
|
||||
config MAC_SCC
|
||||
tristate "Macintosh serial support"
|
||||
depends on MAC
|
||||
|
||||
config MAC_HID
|
||||
bool
|
||||
depends on INPUT_ADBHID
|
||||
|
@ -595,7 +591,7 @@ config DN_SERIAL
|
|||
|
||||
config SERIAL_CONSOLE
|
||||
bool "Support for serial port console"
|
||||
depends on (AMIGA || ATARI || MAC || SUN3 || SUN3X || VME || APOLLO) && (ATARI_MFPSER=y || ATARI_MIDI=y || MAC_SCC=y || AMIGA_BUILTIN_SERIAL=y || GVPIOEXT=y || MULTIFACE_III_TTY=y || SERIAL=y || MVME147_SCC || SERIAL167 || MVME162_SCC || BVME6000_SCC || DN_SERIAL)
|
||||
depends on (AMIGA || ATARI || SUN3 || SUN3X || VME || APOLLO) && (ATARI_MFPSER=y || ATARI_MIDI=y || AMIGA_BUILTIN_SERIAL=y || GVPIOEXT=y || MULTIFACE_III_TTY=y || SERIAL=y || MVME147_SCC || SERIAL167 || MVME162_SCC || BVME6000_SCC || DN_SERIAL)
|
||||
---help---
|
||||
If you say Y here, it will be possible to use a serial port as the
|
||||
system console (the system console is the device which receives all
|
||||
|
|
|
@ -480,7 +480,7 @@ static void __init amiga_sched_init(irq_handler_t timer_routine)
|
|||
static struct resource sched_res = {
|
||||
.name = "timer", .start = 0x00bfd400, .end = 0x00bfd5ff,
|
||||
};
|
||||
jiffy_ticks = (amiga_eclock+HZ/2)/HZ;
|
||||
jiffy_ticks = DIV_ROUND_CLOSEST(amiga_eclock, HZ);
|
||||
|
||||
if (request_resource(&mb_resources._ciab, &sched_res))
|
||||
printk("Cannot allocate ciab.ta{lo,hi}\n");
|
||||
|
|
|
@ -701,6 +701,11 @@ CONFIG_VT_HW_CONSOLE_BINDING=y
|
|||
#
|
||||
# Non-8250 serial port support
|
||||
#
|
||||
CONFIG_SERIAL_CORE=y
|
||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||
CONFIG_SERIAL_PMACZILOG=y
|
||||
CONFIG_SERIAL_PMACZILOG_TTYS=y
|
||||
CONFIG_SERIAL_PMACZILOG_CONSOLE=y
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
|
||||
CONFIG_LEGACY_PTYS=y
|
||||
|
@ -834,9 +839,7 @@ CONFIG_HIDRAW=y
|
|||
#
|
||||
# Character devices
|
||||
#
|
||||
CONFIG_MAC_SCC=y
|
||||
CONFIG_MAC_HID=y
|
||||
CONFIG_SERIAL_CONSOLE=y
|
||||
|
||||
#
|
||||
# File systems
|
||||
|
|
|
@ -822,6 +822,11 @@ CONFIG_A2232=y
|
|||
#
|
||||
# Non-8250 serial port support
|
||||
#
|
||||
CONFIG_SERIAL_CORE=y
|
||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||
CONFIG_SERIAL_PMACZILOG=y
|
||||
CONFIG_SERIAL_PMACZILOG_TTYS=y
|
||||
CONFIG_SERIAL_PMACZILOG_CONSOLE=y
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
|
||||
CONFIG_LEGACY_PTYS=y
|
||||
|
@ -982,7 +987,6 @@ CONFIG_ATARI_MIDI=y
|
|||
CONFIG_ATARI_DSP56K=m
|
||||
CONFIG_AMIGA_BUILTIN_SERIAL=y
|
||||
CONFIG_MULTIFACE_III_TTY=m
|
||||
CONFIG_MAC_SCC=y
|
||||
CONFIG_MAC_HID=y
|
||||
CONFIG_MVME147_SCC=y
|
||||
CONFIG_SERIAL167=y
|
||||
|
|
|
@ -21,29 +21,4 @@
|
|||
#define VIDEOMEMSIZE (4096*1024)
|
||||
#define VIDEOMEMMASK (-4096*1024)
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#if 0
|
||||
/*
|
||||
** SCC Z8530
|
||||
*/
|
||||
|
||||
#define MAC_SCC_BAS (0x50F04000)
|
||||
struct MAC_SCC
|
||||
{
|
||||
u_char cha_a_ctrl;
|
||||
u_char char_dummy1;
|
||||
u_char cha_a_data;
|
||||
u_char char_dummy2;
|
||||
u_char cha_b_ctrl;
|
||||
u_char char_dummy3;
|
||||
u_char cha_b_data;
|
||||
};
|
||||
# define mac_scc ((*(volatile struct SCC*)MAC_SCC_BAS))
|
||||
#endif
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif /* linux/machw.h */
|
||||
|
|
|
@ -37,7 +37,6 @@
|
|||
|
||||
#define VIA1_SOURCE_BASE 8
|
||||
#define VIA2_SOURCE_BASE 16
|
||||
#define MAC_SCC_SOURCE_BASE 24
|
||||
#define PSC3_SOURCE_BASE 24
|
||||
#define PSC4_SOURCE_BASE 32
|
||||
#define PSC5_SOURCE_BASE 40
|
||||
|
@ -96,26 +95,12 @@
|
|||
#define IRQ_PSC3_2 (26)
|
||||
#define IRQ_PSC3_3 (27)
|
||||
|
||||
/* Level 4 (SCC) interrupts */
|
||||
#define IRQ_SCC (32)
|
||||
#define IRQ_SCCA (33)
|
||||
#define IRQ_SCCB (34)
|
||||
#if 0 /* FIXME: are there multiple interrupt conditions on the SCC ?? */
|
||||
/* SCC interrupts */
|
||||
#define IRQ_SCCB_TX (32)
|
||||
#define IRQ_SCCB_STAT (33)
|
||||
#define IRQ_SCCB_RX (34)
|
||||
#define IRQ_SCCB_SPCOND (35)
|
||||
#define IRQ_SCCA_TX (36)
|
||||
#define IRQ_SCCA_STAT (37)
|
||||
#define IRQ_SCCA_RX (38)
|
||||
#define IRQ_SCCA_SPCOND (39)
|
||||
#endif
|
||||
|
||||
/* Level 4 (PSC, AV Macs only) interrupts */
|
||||
#define IRQ_PSC4_0 (32)
|
||||
#define IRQ_PSC4_1 (33)
|
||||
#define IRQ_MAC_SCC_A IRQ_PSC4_1
|
||||
#define IRQ_PSC4_2 (34)
|
||||
#define IRQ_MAC_SCC_B IRQ_PSC4_2
|
||||
#define IRQ_PSC4_3 (35)
|
||||
#define IRQ_MAC_MACE_DMA IRQ_PSC4_3
|
||||
|
||||
|
@ -146,6 +131,9 @@
|
|||
#define IRQ_BABOON_2 (66)
|
||||
#define IRQ_BABOON_3 (67)
|
||||
|
||||
/* On non-PSC machines, the serial ports share an IRQ */
|
||||
#define IRQ_MAC_SCC IRQ_AUTO_4
|
||||
|
||||
#define SLOT2IRQ(x) (x + 47)
|
||||
#define IRQ2SLOT(x) (x - 47)
|
||||
|
||||
|
|
|
@ -71,6 +71,8 @@ struct switch_stack {
|
|||
#define PTRACE_GETFPREGS 14
|
||||
#define PTRACE_SETFPREGS 15
|
||||
|
||||
#define PTRACE_GET_THREAD_AREA 25
|
||||
|
||||
#define PTRACE_SINGLEBLOCK 33 /* resume execution until next branch */
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
|
|
@ -15,9 +15,15 @@ struct sigcontext {
|
|||
unsigned long sc_pc;
|
||||
unsigned short sc_formatvec;
|
||||
#ifndef __uClinux__
|
||||
# ifdef __mcoldfire__
|
||||
unsigned long sc_fpregs[2][2]; /* room for two fp registers */
|
||||
unsigned long sc_fpcntl[3];
|
||||
unsigned char sc_fpstate[16+6*8];
|
||||
# else
|
||||
unsigned long sc_fpregs[2*3]; /* room for two fp registers */
|
||||
unsigned long sc_fpcntl[3];
|
||||
unsigned char sc_fpstate[216];
|
||||
# endif
|
||||
#endif
|
||||
};
|
||||
|
||||
|
|
|
@ -1,97 +1,6 @@
|
|||
#ifndef _M68K_SIGINFO_H
|
||||
#define _M68K_SIGINFO_H
|
||||
|
||||
#ifndef __uClinux__
|
||||
#define HAVE_ARCH_SIGINFO_T
|
||||
#define HAVE_ARCH_COPY_SIGINFO
|
||||
#endif
|
||||
|
||||
#include <asm-generic/siginfo.h>
|
||||
|
||||
#ifndef __uClinux__
|
||||
|
||||
typedef struct siginfo {
|
||||
int si_signo;
|
||||
int si_errno;
|
||||
int si_code;
|
||||
|
||||
union {
|
||||
int _pad[SI_PAD_SIZE];
|
||||
|
||||
/* kill() */
|
||||
struct {
|
||||
__kernel_pid_t _pid; /* sender's pid */
|
||||
__kernel_uid_t _uid; /* backwards compatibility */
|
||||
__kernel_uid32_t _uid32; /* sender's uid */
|
||||
} _kill;
|
||||
|
||||
/* POSIX.1b timers */
|
||||
struct {
|
||||
timer_t _tid; /* timer id */
|
||||
int _overrun; /* overrun count */
|
||||
char _pad[sizeof( __ARCH_SI_UID_T) - sizeof(int)];
|
||||
sigval_t _sigval; /* same as below */
|
||||
int _sys_private; /* not to be passed to user */
|
||||
} _timer;
|
||||
|
||||
/* POSIX.1b signals */
|
||||
struct {
|
||||
__kernel_pid_t _pid; /* sender's pid */
|
||||
__kernel_uid_t _uid; /* backwards compatibility */
|
||||
sigval_t _sigval;
|
||||
__kernel_uid32_t _uid32; /* sender's uid */
|
||||
} _rt;
|
||||
|
||||
/* SIGCHLD */
|
||||
struct {
|
||||
__kernel_pid_t _pid; /* which child */
|
||||
__kernel_uid_t _uid; /* backwards compatibility */
|
||||
int _status; /* exit code */
|
||||
clock_t _utime;
|
||||
clock_t _stime;
|
||||
__kernel_uid32_t _uid32; /* sender's uid */
|
||||
} _sigchld;
|
||||
|
||||
/* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
|
||||
struct {
|
||||
void *_addr; /* faulting insn/memory ref. */
|
||||
} _sigfault;
|
||||
|
||||
/* SIGPOLL */
|
||||
struct {
|
||||
int _band; /* POLL_IN, POLL_OUT, POLL_MSG */
|
||||
int _fd;
|
||||
} _sigpoll;
|
||||
} _sifields;
|
||||
} siginfo_t;
|
||||
|
||||
#define UID16_SIGINFO_COMPAT_NEEDED
|
||||
|
||||
/*
|
||||
* How these fields are to be accessed.
|
||||
*/
|
||||
#undef si_uid
|
||||
#ifdef __KERNEL__
|
||||
#define si_uid _sifields._kill._uid32
|
||||
#define si_uid16 _sifields._kill._uid
|
||||
#else
|
||||
#define si_uid _sifields._kill._uid
|
||||
#endif
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#include <linux/string.h>
|
||||
|
||||
static inline void copy_siginfo(struct siginfo *to, struct siginfo *from)
|
||||
{
|
||||
if (from->si_code < 0)
|
||||
memcpy(to, from, sizeof(*to));
|
||||
else
|
||||
/* _sigchld is currently the largest know union member */
|
||||
memcpy(to, from, 3*sizeof(int) + sizeof(from->_sifields._sigchld));
|
||||
}
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* !__uClinux__ */
|
||||
|
||||
#endif
|
||||
|
|
|
@ -14,7 +14,7 @@ static inline __attribute_const__ __u32 __arch_swab32(__u32 val)
|
|||
}
|
||||
|
||||
#define __arch_swab32 __arch_swab32
|
||||
#elif !defined(__uClinux__)
|
||||
#elif !defined(__mcoldfire__)
|
||||
|
||||
static inline __attribute_const__ __u32 __arch_swab32(__u32 val)
|
||||
{
|
||||
|
|
|
@ -16,6 +16,7 @@ struct thread_info {
|
|||
struct exec_domain *exec_domain; /* execution domain */
|
||||
int preempt_count; /* 0 => preemptable, <0 => BUG */
|
||||
__u32 cpu; /* should always be 0 on m68k */
|
||||
unsigned long tp_value; /* thread pointer */
|
||||
struct restart_block restart_block;
|
||||
};
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
|
|
@ -37,6 +37,7 @@ struct thread_info {
|
|||
unsigned long flags; /* low level flags */
|
||||
int cpu; /* cpu we're on */
|
||||
int preempt_count; /* 0 => preemptable, <0 => BUG */
|
||||
unsigned long tp_value; /* thread pointer */
|
||||
struct restart_block restart_block;
|
||||
};
|
||||
|
||||
|
|
|
@ -7,7 +7,11 @@ typedef greg_t gregset_t[NGREG];
|
|||
|
||||
typedef struct fpregset {
|
||||
int f_fpcntl[3];
|
||||
#ifdef __mcoldfire__
|
||||
int f_fpregs[8][2];
|
||||
#else
|
||||
int f_fpregs[8*3];
|
||||
#endif
|
||||
} fpregset_t;
|
||||
|
||||
struct mcontext {
|
||||
|
|
|
@ -336,10 +336,14 @@
|
|||
#define __NR_pwritev 330
|
||||
#define __NR_rt_tgsigqueueinfo 331
|
||||
#define __NR_perf_event_open 332
|
||||
#define __NR_get_thread_area 333
|
||||
#define __NR_set_thread_area 334
|
||||
#define __NR_atomic_cmpxchg_32 335
|
||||
#define __NR_atomic_barrier 336
|
||||
|
||||
#ifdef __KERNEL__
|
||||
|
||||
#define NR_syscalls 333
|
||||
#define NR_syscalls 337
|
||||
|
||||
#define __ARCH_WANT_IPC_PARSE_VERSION
|
||||
#define __ARCH_WANT_OLD_READDIR
|
||||
|
|
|
@ -31,12 +31,7 @@ static inline void *phys_to_virt(unsigned long address)
|
|||
#define page_to_phys(page) \
|
||||
__pa(PAGE_OFFSET + (((page) - pg_data_map[0].node_mem_map) << PAGE_SHIFT))
|
||||
#else
|
||||
#define page_to_phys(_page) ({ \
|
||||
struct page *__page = _page; \
|
||||
struct pglist_data *pgdat; \
|
||||
pgdat = pg_data_table[page_to_nid(__page)]; \
|
||||
page_to_pfn(__page) << PAGE_SHIFT; \
|
||||
})
|
||||
#define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT)
|
||||
#endif
|
||||
#else
|
||||
#define page_to_phys(page) (((page) - mem_map) << PAGE_SHIFT)
|
||||
|
|
|
@ -761,4 +761,8 @@ sys_call_table:
|
|||
.long sys_pwritev /* 330 */
|
||||
.long sys_rt_tgsigqueueinfo
|
||||
.long sys_perf_event_open
|
||||
.long sys_get_thread_area
|
||||
.long sys_set_thread_area
|
||||
.long sys_atomic_cmpxchg_32 /* 335 */
|
||||
.long sys_atomic_barrier
|
||||
|
||||
|
|
|
@ -251,6 +251,10 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
|
|||
|
||||
p->thread.usp = usp;
|
||||
p->thread.ksp = (unsigned long)childstack;
|
||||
|
||||
if (clone_flags & CLONE_SETTLS)
|
||||
task_thread_info(p)->tp_value = regs->d5;
|
||||
|
||||
/*
|
||||
* Must save the current SFC/DFC value, NOT the value when
|
||||
* the parent was last descheduled - RGH 10-08-96
|
||||
|
|
|
@ -245,6 +245,11 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
|||
ret = -EFAULT;
|
||||
break;
|
||||
|
||||
case PTRACE_GET_THREAD_AREA:
|
||||
ret = put_user(task_thread_info(child)->tp_value,
|
||||
(unsigned long __user *)data);
|
||||
break;
|
||||
|
||||
default:
|
||||
ret = ptrace_request(child, request, addr, data);
|
||||
break;
|
||||
|
|
|
@ -897,10 +897,17 @@ static void setup_rt_frame (int sig, struct k_sigaction *ka, siginfo_t *info,
|
|||
|
||||
/* Set up to return from userspace. */
|
||||
err |= __put_user(frame->retcode, &frame->pretcode);
|
||||
#ifdef __mcoldfire__
|
||||
/* movel #__NR_rt_sigreturn,d0; trap #0 */
|
||||
err |= __put_user(0x203c0000, (long __user *)(frame->retcode + 0));
|
||||
err |= __put_user(0x00004e40 + (__NR_rt_sigreturn << 16),
|
||||
(long __user *)(frame->retcode + 4));
|
||||
#else
|
||||
/* moveq #,d0; notb d0; trap #0 */
|
||||
err |= __put_user(0x70004600 + ((__NR_rt_sigreturn ^ 0xff) << 16),
|
||||
(long __user *)(frame->retcode + 0));
|
||||
err |= __put_user(0x4e40, (short __user *)(frame->retcode + 4));
|
||||
#endif
|
||||
|
||||
if (err)
|
||||
goto give_sigsegv;
|
||||
|
|
|
@ -28,6 +28,11 @@
|
|||
#include <asm/traps.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/unistd.h>
|
||||
#include <linux/elf.h>
|
||||
#include <asm/tlb.h>
|
||||
|
||||
asmlinkage int do_page_fault(struct pt_regs *regs, unsigned long address,
|
||||
unsigned long error_code);
|
||||
|
||||
asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,
|
||||
unsigned long prot, unsigned long flags,
|
||||
|
@ -595,3 +600,79 @@ int kernel_execve(const char *filename, char *const argv[], char *const envp[])
|
|||
: "d" (__a), "d" (__b), "d" (__c));
|
||||
return __res;
|
||||
}
|
||||
|
||||
asmlinkage unsigned long sys_get_thread_area(void)
|
||||
{
|
||||
return current_thread_info()->tp_value;
|
||||
}
|
||||
|
||||
asmlinkage int sys_set_thread_area(unsigned long tp)
|
||||
{
|
||||
current_thread_info()->tp_value = tp;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* This syscall gets its arguments in A0 (mem), D2 (oldval) and
|
||||
D1 (newval). */
|
||||
asmlinkage int
|
||||
sys_atomic_cmpxchg_32(unsigned long newval, int oldval, int d3, int d4, int d5,
|
||||
unsigned long __user * mem)
|
||||
{
|
||||
/* This was borrowed from ARM's implementation. */
|
||||
for (;;) {
|
||||
struct mm_struct *mm = current->mm;
|
||||
pgd_t *pgd;
|
||||
pmd_t *pmd;
|
||||
pte_t *pte;
|
||||
spinlock_t *ptl;
|
||||
unsigned long mem_value;
|
||||
|
||||
down_read(&mm->mmap_sem);
|
||||
pgd = pgd_offset(mm, (unsigned long)mem);
|
||||
if (!pgd_present(*pgd))
|
||||
goto bad_access;
|
||||
pmd = pmd_offset(pgd, (unsigned long)mem);
|
||||
if (!pmd_present(*pmd))
|
||||
goto bad_access;
|
||||
pte = pte_offset_map_lock(mm, pmd, (unsigned long)mem, &ptl);
|
||||
if (!pte_present(*pte) || !pte_dirty(*pte)
|
||||
|| !pte_write(*pte)) {
|
||||
pte_unmap_unlock(pte, ptl);
|
||||
goto bad_access;
|
||||
}
|
||||
|
||||
mem_value = *mem;
|
||||
if (mem_value == oldval)
|
||||
*mem = newval;
|
||||
|
||||
pte_unmap_unlock(pte, ptl);
|
||||
up_read(&mm->mmap_sem);
|
||||
return mem_value;
|
||||
|
||||
bad_access:
|
||||
up_read(&mm->mmap_sem);
|
||||
/* This is not necessarily a bad access, we can get here if
|
||||
a memory we're trying to write to should be copied-on-write.
|
||||
Make the kernel do the necessary page stuff, then re-iterate.
|
||||
Simulate a write access fault to do that. */
|
||||
{
|
||||
/* The first argument of the function corresponds to
|
||||
D1, which is the first field of struct pt_regs. */
|
||||
struct pt_regs *fp = (struct pt_regs *)&newval;
|
||||
|
||||
/* '3' is an RMW flag. */
|
||||
if (do_page_fault(fp, (unsigned long)mem, 3))
|
||||
/* If the do_page_fault() failed, we don't
|
||||
have anything meaningful to return.
|
||||
There should be a SIGSEGV pending for
|
||||
the process. */
|
||||
return 0xdeadbeef;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
asmlinkage int sys_atomic_barrier(void)
|
||||
{
|
||||
/* no code needed for uniprocs */
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -3,4 +3,4 @@
|
|||
#
|
||||
|
||||
obj-y := config.o macints.o iop.o via.o oss.o psc.o \
|
||||
baboon.o macboing.o debug.o misc.o
|
||||
baboon.o macboing.o misc.o
|
||||
|
|
|
@ -23,6 +23,8 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/vt_kern.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/adb.h>
|
||||
#include <linux/cuda.h>
|
||||
|
||||
#define BOOTINFO_COMPAT_1_0
|
||||
#include <asm/setup.h>
|
||||
|
@ -44,12 +46,7 @@
|
|||
#include <asm/mac_oss.h>
|
||||
#include <asm/mac_psc.h>
|
||||
|
||||
/* platform device info */
|
||||
|
||||
#define SWIM_IO_SIZE 0x2000 /* SWIM IO resource size */
|
||||
|
||||
/* Mac bootinfo struct */
|
||||
|
||||
struct mac_booter_data mac_bi_data;
|
||||
|
||||
/* The phys. video addr. - might be bogus on some machines */
|
||||
|
@ -70,8 +67,6 @@ extern void baboon_init(void);
|
|||
|
||||
extern void mac_mksound(unsigned int, unsigned int);
|
||||
|
||||
extern void nubus_sweep_video(void);
|
||||
|
||||
static void mac_get_model(char *str);
|
||||
static void mac_identify(void);
|
||||
static void mac_report_hardware(void);
|
||||
|
@ -167,12 +162,6 @@ void __init config_mac(void)
|
|||
mach_max_dma_address = 0xffffffff;
|
||||
#if defined(CONFIG_INPUT_M68K_BEEP) || defined(CONFIG_INPUT_M68K_BEEP_MODULE)
|
||||
mach_beep = mac_mksound;
|
||||
#endif
|
||||
#ifdef CONFIG_HEARTBEAT
|
||||
#if 0
|
||||
mach_heartbeat = mac_heartbeat;
|
||||
mach_heartbeat_irq = IRQ_MAC_TIMER;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@ -191,27 +180,19 @@ void __init config_mac(void)
|
|||
if (macintosh_config->ident == MAC_MODEL_IICI
|
||||
|| macintosh_config->ident == MAC_MODEL_IIFX)
|
||||
mach_l2_flush = mac_cache_card_flush;
|
||||
|
||||
/*
|
||||
* Check for machine specific fixups.
|
||||
*/
|
||||
|
||||
#ifdef OLD_NUBUS_CODE
|
||||
nubus_sweep_video();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Macintosh Table: hardcoded model configuration data.
|
||||
* Macintosh Table: hardcoded model configuration data.
|
||||
*
|
||||
* Much of this was defined by Alan, based on who knows what docs.
|
||||
* I've added a lot more, and some of that was pure guesswork based
|
||||
* on hardware pages present on the Mac web site. Possibly wildly
|
||||
* inaccurate, so look here if a new Mac model won't run. Example: if
|
||||
* a Mac crashes immediately after the VIA1 registers have been dumped
|
||||
* to the screen, it probably died attempting to read DirB on a RBV.
|
||||
* Meaning it should have MAC_VIA_IIci here :-)
|
||||
* Much of this was defined by Alan, based on who knows what docs.
|
||||
* I've added a lot more, and some of that was pure guesswork based
|
||||
* on hardware pages present on the Mac web site. Possibly wildly
|
||||
* inaccurate, so look here if a new Mac model won't run. Example: if
|
||||
* a Mac crashes immediately after the VIA1 registers have been dumped
|
||||
* to the screen, it probably died attempting to read DirB on a RBV.
|
||||
* Meaning it should have MAC_VIA_IIci here :-)
|
||||
*/
|
||||
|
||||
struct mac_model *macintosh_config;
|
||||
|
@ -219,7 +200,7 @@ EXPORT_SYMBOL(macintosh_config);
|
|||
|
||||
static struct mac_model mac_data_table[] = {
|
||||
/*
|
||||
* We'll pretend to be a Macintosh II, that's pretty safe.
|
||||
* We'll pretend to be a Macintosh II, that's pretty safe.
|
||||
*/
|
||||
|
||||
{
|
||||
|
@ -230,12 +211,11 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_IWM
|
||||
.floppy_type = MAC_FLOPPY_IWM,
|
||||
},
|
||||
|
||||
/*
|
||||
* Original MacII hardware
|
||||
*
|
||||
* Original Mac II hardware
|
||||
*/
|
||||
|
||||
{
|
||||
|
@ -246,7 +226,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_IWM
|
||||
.floppy_type = MAC_FLOPPY_IWM,
|
||||
}, {
|
||||
.ident = MAC_MODEL_IIX,
|
||||
.name = "IIx",
|
||||
|
@ -255,7 +235,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_IICX,
|
||||
.name = "IIcx",
|
||||
|
@ -264,7 +244,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_SE30,
|
||||
.name = "SE/30",
|
||||
|
@ -273,13 +253,13 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
},
|
||||
|
||||
/*
|
||||
* Weirdified MacII hardware - all subtly different. Gee thanks
|
||||
* Apple. All these boxes seem to have VIA2 in a different place to
|
||||
* the MacII (+1A000 rather than +4000)
|
||||
* Weirdified Mac II hardware - all subtly different. Gee thanks
|
||||
* Apple. All these boxes seem to have VIA2 in a different place to
|
||||
* the Mac II (+1A000 rather than +4000)
|
||||
* CSA: see http://developer.apple.com/technotes/hw/hw_09.html
|
||||
*/
|
||||
|
||||
|
@ -291,7 +271,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_IIFX,
|
||||
.name = "IIfx",
|
||||
|
@ -300,7 +280,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_IOP,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_IOP
|
||||
.floppy_type = MAC_FLOPPY_SWIM_IOP,
|
||||
}, {
|
||||
.ident = MAC_MODEL_IISI,
|
||||
.name = "IIsi",
|
||||
|
@ -309,7 +289,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_IIVI,
|
||||
.name = "IIvi",
|
||||
|
@ -318,7 +298,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_IIVX,
|
||||
.name = "IIvx",
|
||||
|
@ -327,11 +307,11 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
},
|
||||
|
||||
/*
|
||||
* Classic models (guessing: similar to SE/30 ?? Nope, similar to LC ...)
|
||||
* Classic models (guessing: similar to SE/30? Nope, similar to LC...)
|
||||
*/
|
||||
|
||||
{
|
||||
|
@ -342,7 +322,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_CCL,
|
||||
.name = "Color Classic",
|
||||
|
@ -351,11 +331,11 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
},
|
||||
|
||||
/*
|
||||
* Some Mac LC machines. Basically the same as the IIci, ADB like IIsi
|
||||
* Some Mac LC machines. Basically the same as the IIci, ADB like IIsi
|
||||
*/
|
||||
|
||||
{
|
||||
|
@ -366,7 +346,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_LCII,
|
||||
.name = "LC II",
|
||||
|
@ -375,7 +355,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_LCIII,
|
||||
.name = "LC III",
|
||||
|
@ -384,17 +364,17 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
},
|
||||
|
||||
/*
|
||||
* Quadra. Video is at 0xF9000000, via is like a MacII. We label it differently
|
||||
* as some of the stuff connected to VIA2 seems different. Better SCSI chip and
|
||||
* onboard ethernet using a NatSemi SONIC except the 660AV and 840AV which use an
|
||||
* AMD 79C940 (MACE).
|
||||
* The 700, 900 and 950 have some I/O chips in the wrong place to
|
||||
* confuse us. The 840AV has a SCSI location of its own (same as
|
||||
* the 660AV).
|
||||
* Quadra. Video is at 0xF9000000, via is like a MacII. We label it
|
||||
* differently as some of the stuff connected to VIA2 seems different.
|
||||
* Better SCSI chip and onboard ethernet using a NatSemi SONIC except
|
||||
* the 660AV and 840AV which use an AMD 79C940 (MACE).
|
||||
* The 700, 900 and 950 have some I/O chips in the wrong place to
|
||||
* confuse us. The 840AV has a SCSI location of its own (same as
|
||||
* the 660AV).
|
||||
*/
|
||||
|
||||
{
|
||||
|
@ -405,7 +385,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_QUADRA,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
|
||||
}, {
|
||||
.ident = MAC_MODEL_Q605_ACC,
|
||||
.name = "Quadra 605",
|
||||
|
@ -414,7 +394,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_QUADRA,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
|
||||
}, {
|
||||
.ident = MAC_MODEL_Q610,
|
||||
.name = "Quadra 610",
|
||||
|
@ -424,7 +404,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scc_type = MAC_SCC_QUADRA,
|
||||
.ether_type = MAC_ETHER_SONIC,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
|
||||
}, {
|
||||
.ident = MAC_MODEL_Q630,
|
||||
.name = "Quadra 630",
|
||||
|
@ -435,7 +415,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scc_type = MAC_SCC_QUADRA,
|
||||
.ether_type = MAC_ETHER_SONIC,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
|
||||
}, {
|
||||
.ident = MAC_MODEL_Q650,
|
||||
.name = "Quadra 650",
|
||||
|
@ -445,9 +425,9 @@ static struct mac_model mac_data_table[] = {
|
|||
.scc_type = MAC_SCC_QUADRA,
|
||||
.ether_type = MAC_ETHER_SONIC,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
|
||||
},
|
||||
/* The Q700 does have a NS Sonic */
|
||||
/* The Q700 does have a NS Sonic */
|
||||
{
|
||||
.ident = MAC_MODEL_Q700,
|
||||
.name = "Quadra 700",
|
||||
|
@ -457,7 +437,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scc_type = MAC_SCC_QUADRA,
|
||||
.ether_type = MAC_ETHER_SONIC,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
|
||||
}, {
|
||||
.ident = MAC_MODEL_Q800,
|
||||
.name = "Quadra 800",
|
||||
|
@ -467,7 +447,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scc_type = MAC_SCC_QUADRA,
|
||||
.ether_type = MAC_ETHER_SONIC,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
|
||||
}, {
|
||||
.ident = MAC_MODEL_Q840,
|
||||
.name = "Quadra 840AV",
|
||||
|
@ -477,7 +457,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scc_type = MAC_SCC_PSC,
|
||||
.ether_type = MAC_ETHER_MACE,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_AV
|
||||
.floppy_type = MAC_FLOPPY_AV,
|
||||
}, {
|
||||
.ident = MAC_MODEL_Q900,
|
||||
.name = "Quadra 900",
|
||||
|
@ -487,7 +467,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scc_type = MAC_SCC_IOP,
|
||||
.ether_type = MAC_ETHER_SONIC,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_IOP
|
||||
.floppy_type = MAC_FLOPPY_SWIM_IOP,
|
||||
}, {
|
||||
.ident = MAC_MODEL_Q950,
|
||||
.name = "Quadra 950",
|
||||
|
@ -497,60 +477,60 @@ static struct mac_model mac_data_table[] = {
|
|||
.scc_type = MAC_SCC_IOP,
|
||||
.ether_type = MAC_ETHER_SONIC,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_IOP
|
||||
.floppy_type = MAC_FLOPPY_SWIM_IOP,
|
||||
},
|
||||
|
||||
/*
|
||||
* Performa - more LC type machines
|
||||
* Performa - more LC type machines
|
||||
*/
|
||||
|
||||
{
|
||||
.ident = MAC_MODEL_P460,
|
||||
.name = "Performa 460",
|
||||
.name = "Performa 460",
|
||||
.adb_type = MAC_ADB_IISI,
|
||||
.via_type = MAC_VIA_IIci,
|
||||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_P475,
|
||||
.name = "Performa 475",
|
||||
.name = "Performa 475",
|
||||
.adb_type = MAC_ADB_CUDA,
|
||||
.via_type = MAC_VIA_QUADRA,
|
||||
.scsi_type = MAC_SCSI_QUADRA,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
|
||||
}, {
|
||||
.ident = MAC_MODEL_P475F,
|
||||
.name = "Performa 475",
|
||||
.name = "Performa 475",
|
||||
.adb_type = MAC_ADB_CUDA,
|
||||
.via_type = MAC_VIA_QUADRA,
|
||||
.scsi_type = MAC_SCSI_QUADRA,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
|
||||
}, {
|
||||
.ident = MAC_MODEL_P520,
|
||||
.name = "Performa 520",
|
||||
.name = "Performa 520",
|
||||
.adb_type = MAC_ADB_CUDA,
|
||||
.via_type = MAC_VIA_IIci,
|
||||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_P550,
|
||||
.name = "Performa 550",
|
||||
.name = "Performa 550",
|
||||
.adb_type = MAC_ADB_CUDA,
|
||||
.via_type = MAC_VIA_IIci,
|
||||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
},
|
||||
/* These have the comm slot, and therefore the possibility of SONIC ethernet */
|
||||
/* These have the comm slot, and therefore possibly SONIC ethernet */
|
||||
{
|
||||
.ident = MAC_MODEL_P575,
|
||||
.name = "Performa 575",
|
||||
|
@ -560,7 +540,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scc_type = MAC_SCC_II,
|
||||
.ether_type = MAC_ETHER_SONIC,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
|
||||
}, {
|
||||
.ident = MAC_MODEL_P588,
|
||||
.name = "Performa 588",
|
||||
|
@ -571,7 +551,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scc_type = MAC_SCC_II,
|
||||
.ether_type = MAC_ETHER_SONIC,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
|
||||
}, {
|
||||
.ident = MAC_MODEL_TV,
|
||||
.name = "TV",
|
||||
|
@ -580,7 +560,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_P600,
|
||||
.name = "Performa 600",
|
||||
|
@ -589,14 +569,14 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_II,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
},
|
||||
|
||||
/*
|
||||
* Centris - just guessing again; maybe like Quadra
|
||||
* Centris - just guessing again; maybe like Quadra.
|
||||
* The C610 may or may not have SONIC. We probe to make sure.
|
||||
*/
|
||||
|
||||
/* The C610 may or may not have SONIC. We probe to make sure */
|
||||
{
|
||||
.ident = MAC_MODEL_C610,
|
||||
.name = "Centris 610",
|
||||
|
@ -606,7 +586,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scc_type = MAC_SCC_QUADRA,
|
||||
.ether_type = MAC_ETHER_SONIC,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
|
||||
}, {
|
||||
.ident = MAC_MODEL_C650,
|
||||
.name = "Centris 650",
|
||||
|
@ -616,7 +596,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scc_type = MAC_SCC_QUADRA,
|
||||
.ether_type = MAC_ETHER_SONIC,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR1,
|
||||
}, {
|
||||
.ident = MAC_MODEL_C660,
|
||||
.name = "Centris 660AV",
|
||||
|
@ -626,7 +606,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scc_type = MAC_SCC_PSC,
|
||||
.ether_type = MAC_ETHER_MACE,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_AV
|
||||
.floppy_type = MAC_FLOPPY_AV,
|
||||
},
|
||||
|
||||
/*
|
||||
|
@ -643,7 +623,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_PB145,
|
||||
.name = "PowerBook 145",
|
||||
|
@ -652,7 +632,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_PB150,
|
||||
.name = "PowerBook 150",
|
||||
|
@ -662,7 +642,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.ide_type = MAC_IDE_PB,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_PB160,
|
||||
.name = "PowerBook 160",
|
||||
|
@ -671,7 +651,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_PB165,
|
||||
.name = "PowerBook 165",
|
||||
|
@ -680,7 +660,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_PB165C,
|
||||
.name = "PowerBook 165c",
|
||||
|
@ -689,7 +669,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_PB170,
|
||||
.name = "PowerBook 170",
|
||||
|
@ -698,7 +678,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_PB180,
|
||||
.name = "PowerBook 180",
|
||||
|
@ -707,7 +687,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_PB180C,
|
||||
.name = "PowerBook 180c",
|
||||
|
@ -716,7 +696,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_PB190,
|
||||
.name = "PowerBook 190",
|
||||
|
@ -726,7 +706,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.ide_type = MAC_IDE_BABOON,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_PB520,
|
||||
.name = "PowerBook 520",
|
||||
|
@ -736,7 +716,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scc_type = MAC_SCC_QUADRA,
|
||||
.ether_type = MAC_ETHER_SONIC,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
},
|
||||
|
||||
/*
|
||||
|
@ -757,7 +737,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_PB230,
|
||||
.name = "PowerBook Duo 230",
|
||||
|
@ -766,7 +746,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_PB250,
|
||||
.name = "PowerBook Duo 250",
|
||||
|
@ -775,7 +755,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_PB270C,
|
||||
.name = "PowerBook Duo 270c",
|
||||
|
@ -784,7 +764,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_PB280,
|
||||
.name = "PowerBook Duo 280",
|
||||
|
@ -793,7 +773,7 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
}, {
|
||||
.ident = MAC_MODEL_PB280C,
|
||||
.name = "PowerBook Duo 280c",
|
||||
|
@ -802,17 +782,44 @@ static struct mac_model mac_data_table[] = {
|
|||
.scsi_type = MAC_SCSI_OLD,
|
||||
.scc_type = MAC_SCC_QUADRA,
|
||||
.nubus_type = MAC_NUBUS,
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2
|
||||
.floppy_type = MAC_FLOPPY_SWIM_ADDR2,
|
||||
},
|
||||
|
||||
/*
|
||||
* Other stuff ??
|
||||
* Other stuff?
|
||||
*/
|
||||
|
||||
{
|
||||
.ident = -1
|
||||
}
|
||||
};
|
||||
|
||||
static struct resource scc_a_rsrcs[] = {
|
||||
{ .flags = IORESOURCE_MEM },
|
||||
{ .flags = IORESOURCE_IRQ },
|
||||
};
|
||||
|
||||
static struct resource scc_b_rsrcs[] = {
|
||||
{ .flags = IORESOURCE_MEM },
|
||||
{ .flags = IORESOURCE_IRQ },
|
||||
};
|
||||
|
||||
struct platform_device scc_a_pdev = {
|
||||
.name = "scc",
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(scc_a_rsrcs),
|
||||
.resource = scc_a_rsrcs,
|
||||
};
|
||||
EXPORT_SYMBOL(scc_a_pdev);
|
||||
|
||||
struct platform_device scc_b_pdev = {
|
||||
.name = "scc",
|
||||
.id = 1,
|
||||
.num_resources = ARRAY_SIZE(scc_b_rsrcs),
|
||||
.resource = scc_b_rsrcs,
|
||||
};
|
||||
EXPORT_SYMBOL(scc_b_pdev);
|
||||
|
||||
static void __init mac_identify(void)
|
||||
{
|
||||
struct mac_model *m;
|
||||
|
@ -823,7 +830,8 @@ static void __init mac_identify(void)
|
|||
/* no bootinfo model id -> NetBSD booter was used! */
|
||||
/* XXX FIXME: breaks for model > 31 */
|
||||
model = (mac_bi_data.cpuid >> 2) & 63;
|
||||
printk(KERN_WARNING "No bootinfo model ID, using cpuid instead (hey, use Penguin!)\n");
|
||||
printk(KERN_WARNING "No bootinfo model ID, using cpuid instead "
|
||||
"(obsolete bootloader?)\n");
|
||||
}
|
||||
|
||||
macintosh_config = mac_data_table;
|
||||
|
@ -834,10 +842,29 @@ static void __init mac_identify(void)
|
|||
}
|
||||
}
|
||||
|
||||
/* We need to pre-init the IOPs, if any. Otherwise */
|
||||
/* the serial console won't work if the user had */
|
||||
/* the serial ports set to "Faster" mode in MacOS. */
|
||||
/* Set up serial port resources for the console initcall. */
|
||||
|
||||
scc_a_rsrcs[0].start = (resource_size_t) mac_bi_data.sccbase + 2;
|
||||
scc_a_rsrcs[0].end = scc_a_rsrcs[0].start;
|
||||
scc_b_rsrcs[0].start = (resource_size_t) mac_bi_data.sccbase;
|
||||
scc_b_rsrcs[0].end = scc_b_rsrcs[0].start;
|
||||
|
||||
switch (macintosh_config->scc_type) {
|
||||
case MAC_SCC_PSC:
|
||||
scc_a_rsrcs[1].start = scc_a_rsrcs[1].end = IRQ_MAC_SCC_A;
|
||||
scc_b_rsrcs[1].start = scc_b_rsrcs[1].end = IRQ_MAC_SCC_B;
|
||||
break;
|
||||
default:
|
||||
scc_a_rsrcs[1].start = scc_a_rsrcs[1].end = IRQ_MAC_SCC;
|
||||
scc_b_rsrcs[1].start = scc_b_rsrcs[1].end = IRQ_MAC_SCC;
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* We need to pre-init the IOPs, if any. Otherwise
|
||||
* the serial console won't work if the user had
|
||||
* the serial ports set to "Faster" mode in MacOS.
|
||||
*/
|
||||
iop_preinit();
|
||||
|
||||
printk(KERN_INFO "Detected Macintosh model: %d \n", model);
|
||||
|
@ -846,7 +873,8 @@ static void __init mac_identify(void)
|
|||
* Report booter data:
|
||||
*/
|
||||
printk(KERN_DEBUG " Penguin bootinfo data:\n");
|
||||
printk(KERN_DEBUG " Video: addr 0x%lx row 0x%lx depth %lx dimensions %ld x %ld\n",
|
||||
printk(KERN_DEBUG " Video: addr 0x%lx "
|
||||
"row 0x%lx depth %lx dimensions %ld x %ld\n",
|
||||
mac_bi_data.videoaddr, mac_bi_data.videorow,
|
||||
mac_bi_data.videodepth, mac_bi_data.dimensions & 0xFFFF,
|
||||
mac_bi_data.dimensions >> 16);
|
||||
|
@ -863,6 +891,10 @@ static void __init mac_identify(void)
|
|||
oss_init();
|
||||
psc_init();
|
||||
baboon_init();
|
||||
|
||||
#ifdef CONFIG_ADB_CUDA
|
||||
find_via_cuda();
|
||||
#endif
|
||||
}
|
||||
|
||||
static void __init mac_report_hardware(void)
|
||||
|
@ -876,23 +908,50 @@ static void mac_get_model(char *str)
|
|||
strcat(str, macintosh_config->name);
|
||||
}
|
||||
|
||||
static struct resource swim_resources[1];
|
||||
static struct resource swim_rsrc = { .flags = IORESOURCE_MEM };
|
||||
|
||||
static struct platform_device swim_device = {
|
||||
static struct platform_device swim_pdev = {
|
||||
.name = "swim",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(swim_resources),
|
||||
.resource = swim_resources,
|
||||
.num_resources = 1,
|
||||
.resource = &swim_rsrc,
|
||||
};
|
||||
|
||||
static struct platform_device *mac_platform_devices[] __initdata = {
|
||||
&swim_device
|
||||
static struct platform_device esp_0_pdev = {
|
||||
.name = "mac_esp",
|
||||
.id = 0,
|
||||
};
|
||||
|
||||
static struct platform_device esp_1_pdev = {
|
||||
.name = "mac_esp",
|
||||
.id = 1,
|
||||
};
|
||||
|
||||
static struct platform_device sonic_pdev = {
|
||||
.name = "macsonic",
|
||||
.id = -1,
|
||||
};
|
||||
|
||||
static struct platform_device mace_pdev = {
|
||||
.name = "macmace",
|
||||
.id = -1,
|
||||
};
|
||||
|
||||
int __init mac_platform_init(void)
|
||||
{
|
||||
u8 *swim_base;
|
||||
|
||||
/*
|
||||
* Serial devices
|
||||
*/
|
||||
|
||||
platform_device_register(&scc_a_pdev);
|
||||
platform_device_register(&scc_b_pdev);
|
||||
|
||||
/*
|
||||
* Floppy device
|
||||
*/
|
||||
|
||||
switch (macintosh_config->floppy_type) {
|
||||
case MAC_FLOPPY_SWIM_ADDR1:
|
||||
swim_base = (u8 *)(VIA1_BASE + 0x1E000);
|
||||
|
@ -901,16 +960,47 @@ int __init mac_platform_init(void)
|
|||
swim_base = (u8 *)(VIA1_BASE + 0x16000);
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
swim_base = NULL;
|
||||
break;
|
||||
}
|
||||
|
||||
swim_resources[0].name = "swim-regs";
|
||||
swim_resources[0].start = (resource_size_t)swim_base;
|
||||
swim_resources[0].end = (resource_size_t)(swim_base + SWIM_IO_SIZE);
|
||||
swim_resources[0].flags = IORESOURCE_MEM;
|
||||
if (swim_base) {
|
||||
swim_rsrc.start = (resource_size_t) swim_base,
|
||||
swim_rsrc.end = (resource_size_t) swim_base + 0x2000,
|
||||
platform_device_register(&swim_pdev);
|
||||
}
|
||||
|
||||
return platform_add_devices(mac_platform_devices,
|
||||
ARRAY_SIZE(mac_platform_devices));
|
||||
/*
|
||||
* SCSI device(s)
|
||||
*/
|
||||
|
||||
switch (macintosh_config->scsi_type) {
|
||||
case MAC_SCSI_QUADRA:
|
||||
case MAC_SCSI_QUADRA3:
|
||||
platform_device_register(&esp_0_pdev);
|
||||
break;
|
||||
case MAC_SCSI_QUADRA2:
|
||||
platform_device_register(&esp_0_pdev);
|
||||
if ((macintosh_config->ident == MAC_MODEL_Q900) ||
|
||||
(macintosh_config->ident == MAC_MODEL_Q950))
|
||||
platform_device_register(&esp_1_pdev);
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Ethernet device
|
||||
*/
|
||||
|
||||
switch (macintosh_config->ether_type) {
|
||||
case MAC_ETHER_SONIC:
|
||||
platform_device_register(&sonic_pdev);
|
||||
break;
|
||||
case MAC_ETHER_MACE:
|
||||
platform_device_register(&mace_pdev);
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
arch_initcall(mac_platform_init);
|
||||
|
|
|
@ -1,365 +0,0 @@
|
|||
/*
|
||||
* linux/arch/m68k/mac/debug.c
|
||||
*
|
||||
* Shamelessly stolen (SCC code and general framework) from:
|
||||
*
|
||||
* linux/arch/m68k/atari/debug.c
|
||||
*
|
||||
* Atari debugging and serial console stuff
|
||||
*
|
||||
* Assembled of parts of former atari/config.c 97-12-18 by Roman Hodek
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#define BOOTINFO_COMPAT_1_0
|
||||
#include <asm/setup.h>
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/macints.h>
|
||||
|
||||
extern unsigned long mac_videobase;
|
||||
extern unsigned long mac_rowbytes;
|
||||
|
||||
extern void mac_serial_print(const char *);
|
||||
|
||||
#define DEBUG_HEADS
|
||||
#undef DEBUG_SCREEN
|
||||
#define DEBUG_SERIAL
|
||||
|
||||
/*
|
||||
* These two auxiliary debug functions should go away ASAP. Only usage:
|
||||
* before the console output is up (after head.S come some other crucial
|
||||
* setup routines :-) it permits writing 'data' to the screen as bit patterns
|
||||
* (good luck reading those). Helped to figure that the bootinfo contained
|
||||
* garbage data on the amount and size of memory chunks ...
|
||||
*
|
||||
* The 'pos' argument now simply means 'linefeed after print' ...
|
||||
*/
|
||||
|
||||
#ifdef DEBUG_SCREEN
|
||||
static int peng, line;
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
|
||||
void mac_debugging_short(int pos, short num)
|
||||
{
|
||||
#ifdef DEBUG_SCREEN
|
||||
unsigned char *pengoffset;
|
||||
unsigned char *pptr;
|
||||
int i;
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG_SERIAL
|
||||
printk("debug: %d !\n", num);
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG_SCREEN
|
||||
if (!MACH_IS_MAC) {
|
||||
/* printk("debug: %d !\n", num); */
|
||||
return;
|
||||
}
|
||||
|
||||
/* calculate current offset */
|
||||
pengoffset = (unsigned char *)mac_videobase +
|
||||
(150+line*2) * mac_rowbytes + 80 * peng;
|
||||
|
||||
pptr = pengoffset;
|
||||
|
||||
for (i = 0; i < 8 * sizeof(short); i++) { /* # of bits */
|
||||
/* value mask for bit i, reverse order */
|
||||
*pptr++ = (num & (1 << (8*sizeof(short)-i-1)) ? 0xFF : 0x00);
|
||||
}
|
||||
|
||||
peng++;
|
||||
|
||||
if (pos) {
|
||||
line++;
|
||||
peng = 0;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void mac_debugging_long(int pos, long addr)
|
||||
{
|
||||
#ifdef DEBUG_SCREEN
|
||||
unsigned char *pengoffset;
|
||||
unsigned char *pptr;
|
||||
int i;
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG_SERIAL
|
||||
printk("debug: #%ld !\n", addr);
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG_SCREEN
|
||||
if (!MACH_IS_MAC) {
|
||||
/* printk("debug: #%ld !\n", addr); */
|
||||
return;
|
||||
}
|
||||
|
||||
pengoffset=(unsigned char *)(mac_videobase+(150+line*2)*mac_rowbytes)
|
||||
+80*peng;
|
||||
|
||||
pptr = pengoffset;
|
||||
|
||||
for (i = 0; i < 8 * sizeof(long); i++) { /* # of bits */
|
||||
*pptr++ = (addr & (1 << (8*sizeof(long)-i-1)) ? 0xFF : 0x00);
|
||||
}
|
||||
|
||||
peng++;
|
||||
|
||||
if (pos) {
|
||||
line++;
|
||||
peng = 0;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* 0 */
|
||||
|
||||
#ifdef DEBUG_SERIAL
|
||||
/*
|
||||
* TODO: serial debug code
|
||||
*/
|
||||
|
||||
struct mac_SCC {
|
||||
u_char cha_b_ctrl;
|
||||
u_char char_dummy1;
|
||||
u_char cha_a_ctrl;
|
||||
u_char char_dummy2;
|
||||
u_char cha_b_data;
|
||||
u_char char_dummy3;
|
||||
u_char cha_a_data;
|
||||
};
|
||||
|
||||
# define scc (*((volatile struct mac_SCC*)mac_bi_data.sccbase))
|
||||
|
||||
static int scc_port = -1;
|
||||
|
||||
static struct console mac_console_driver = {
|
||||
.name = "debug",
|
||||
.flags = CON_PRINTBUFFER,
|
||||
.index = -1,
|
||||
};
|
||||
|
||||
/*
|
||||
* Crude hack to get console output to the screen before the framebuffer
|
||||
* is initialized (happens a lot later in 2.1!).
|
||||
* We just use the console routines declared in head.S, this will interfere
|
||||
* with regular framebuffer console output and should be used exclusively
|
||||
* to debug kernel problems manifesting before framebuffer init (aka WSOD)
|
||||
*
|
||||
* To keep this hack from interfering with the regular console driver, either
|
||||
* deregister this driver before/on framebuffer console init, or silence this
|
||||
* function after the fbcon driver is running (will lose console messages!?).
|
||||
* To debug real early bugs, need to write a 'mac_register_console_hack()'
|
||||
* that is called from start_kernel() before setup_arch() and just registers
|
||||
* this driver if Mac.
|
||||
*/
|
||||
|
||||
static void mac_debug_console_write(struct console *co, const char *str,
|
||||
unsigned int count)
|
||||
{
|
||||
mac_serial_print(str);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Mac: loops_per_jiffy min. 19000 ^= .5 us; MFPDELAY was 0.6 us*/
|
||||
|
||||
#define uSEC 1
|
||||
|
||||
static inline void mac_sccb_out(char c)
|
||||
{
|
||||
int i;
|
||||
|
||||
do {
|
||||
for (i = uSEC; i > 0; --i)
|
||||
barrier();
|
||||
} while (!(scc.cha_b_ctrl & 0x04)); /* wait for tx buf empty */
|
||||
for (i = uSEC; i > 0; --i)
|
||||
barrier();
|
||||
scc.cha_b_data = c;
|
||||
}
|
||||
|
||||
static inline void mac_scca_out(char c)
|
||||
{
|
||||
int i;
|
||||
|
||||
do {
|
||||
for (i = uSEC; i > 0; --i)
|
||||
barrier();
|
||||
} while (!(scc.cha_a_ctrl & 0x04)); /* wait for tx buf empty */
|
||||
for (i = uSEC; i > 0; --i)
|
||||
barrier();
|
||||
scc.cha_a_data = c;
|
||||
}
|
||||
|
||||
static void mac_sccb_console_write(struct console *co, const char *str,
|
||||
unsigned int count)
|
||||
{
|
||||
while (count--) {
|
||||
if (*str == '\n')
|
||||
mac_sccb_out('\r');
|
||||
mac_sccb_out(*str++);
|
||||
}
|
||||
}
|
||||
|
||||
static void mac_scca_console_write(struct console *co, const char *str,
|
||||
unsigned int count)
|
||||
{
|
||||
while (count--) {
|
||||
if (*str == '\n')
|
||||
mac_scca_out('\r');
|
||||
mac_scca_out(*str++);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* The following two functions do a quick'n'dirty initialization of the MFP or
|
||||
* SCC serial ports. They're used by the debugging interface, kgdb, and the
|
||||
* serial console code. */
|
||||
#define SCCB_WRITE(reg,val) \
|
||||
do { \
|
||||
int i; \
|
||||
scc.cha_b_ctrl = (reg); \
|
||||
for (i = uSEC; i > 0; --i) \
|
||||
barrier(); \
|
||||
scc.cha_b_ctrl = (val); \
|
||||
for (i = uSEC; i > 0; --i) \
|
||||
barrier(); \
|
||||
} while(0)
|
||||
|
||||
#define SCCA_WRITE(reg,val) \
|
||||
do { \
|
||||
int i; \
|
||||
scc.cha_a_ctrl = (reg); \
|
||||
for (i = uSEC; i > 0; --i) \
|
||||
barrier(); \
|
||||
scc.cha_a_ctrl = (val); \
|
||||
for (i = uSEC; i > 0; --i) \
|
||||
barrier(); \
|
||||
} while(0)
|
||||
|
||||
/* loops_per_jiffy isn't initialized yet, so we can't use udelay(). This does a
|
||||
* delay of ~ 60us. */
|
||||
/* Mac: loops_per_jiffy min. 19000 ^= .5 us; MFPDELAY was 0.6 us*/
|
||||
#define LONG_DELAY() \
|
||||
do { \
|
||||
int i; \
|
||||
for (i = 60*uSEC; i > 0; --i) \
|
||||
barrier(); \
|
||||
} while(0)
|
||||
|
||||
static void __init mac_init_scc_port(int cflag, int port)
|
||||
{
|
||||
/*
|
||||
* baud rates: 1200, 1800, 2400, 4800, 9600, 19.2k, 38.4k, 57.6k, 115.2k
|
||||
*/
|
||||
|
||||
static int clksrc_table[9] =
|
||||
/* reg 11: 0x50 = BRG, 0x00 = RTxC, 0x28 = TRxC */
|
||||
{ 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x00, 0x00 };
|
||||
static int clkmode_table[9] =
|
||||
/* reg 4: 0x40 = x16, 0x80 = x32, 0xc0 = x64 */
|
||||
{ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0xc0, 0x80 };
|
||||
static int div_table[9] =
|
||||
/* reg12 (BRG low) */
|
||||
{ 94, 62, 46, 22, 10, 4, 1, 0, 0 };
|
||||
|
||||
int baud = cflag & CBAUD;
|
||||
int clksrc, clkmode, div, reg3, reg5;
|
||||
|
||||
if (cflag & CBAUDEX)
|
||||
baud += B38400;
|
||||
if (baud < B1200 || baud > B38400+2)
|
||||
baud = B9600; /* use default 9600bps for non-implemented rates */
|
||||
baud -= B1200; /* tables starts at 1200bps */
|
||||
|
||||
clksrc = clksrc_table[baud];
|
||||
clkmode = clkmode_table[baud];
|
||||
div = div_table[baud];
|
||||
|
||||
reg3 = (((cflag & CSIZE) == CS8) ? 0xc0 : 0x40);
|
||||
reg5 = (((cflag & CSIZE) == CS8) ? 0x60 : 0x20) | 0x82 /* assert DTR/RTS */;
|
||||
|
||||
if (port == 1) {
|
||||
(void)scc.cha_b_ctrl; /* reset reg pointer */
|
||||
SCCB_WRITE(9, 0xc0); /* reset */
|
||||
LONG_DELAY(); /* extra delay after WR9 access */
|
||||
SCCB_WRITE(4, (cflag & PARENB) ? ((cflag & PARODD) ? 0x01 : 0x03) : 0 |
|
||||
0x04 /* 1 stopbit */ |
|
||||
clkmode);
|
||||
SCCB_WRITE(3, reg3);
|
||||
SCCB_WRITE(5, reg5);
|
||||
SCCB_WRITE(9, 0); /* no interrupts */
|
||||
LONG_DELAY(); /* extra delay after WR9 access */
|
||||
SCCB_WRITE(10, 0); /* NRZ mode */
|
||||
SCCB_WRITE(11, clksrc); /* main clock source */
|
||||
SCCB_WRITE(12, div); /* BRG value */
|
||||
SCCB_WRITE(13, 0); /* BRG high byte */
|
||||
SCCB_WRITE(14, 1);
|
||||
SCCB_WRITE(3, reg3 | 1);
|
||||
SCCB_WRITE(5, reg5 | 8);
|
||||
} else if (port == 0) {
|
||||
(void)scc.cha_a_ctrl; /* reset reg pointer */
|
||||
SCCA_WRITE(9, 0xc0); /* reset */
|
||||
LONG_DELAY(); /* extra delay after WR9 access */
|
||||
SCCA_WRITE(4, (cflag & PARENB) ? ((cflag & PARODD) ? 0x01 : 0x03) : 0 |
|
||||
0x04 /* 1 stopbit */ |
|
||||
clkmode);
|
||||
SCCA_WRITE(3, reg3);
|
||||
SCCA_WRITE(5, reg5);
|
||||
SCCA_WRITE(9, 0); /* no interrupts */
|
||||
LONG_DELAY(); /* extra delay after WR9 access */
|
||||
SCCA_WRITE(10, 0); /* NRZ mode */
|
||||
SCCA_WRITE(11, clksrc); /* main clock source */
|
||||
SCCA_WRITE(12, div); /* BRG value */
|
||||
SCCA_WRITE(13, 0); /* BRG high byte */
|
||||
SCCA_WRITE(14, 1);
|
||||
SCCA_WRITE(3, reg3 | 1);
|
||||
SCCA_WRITE(5, reg5 | 8);
|
||||
}
|
||||
}
|
||||
#endif /* DEBUG_SERIAL */
|
||||
|
||||
static int __init mac_debug_setup(char *arg)
|
||||
{
|
||||
if (!MACH_IS_MAC)
|
||||
return 0;
|
||||
|
||||
#ifdef DEBUG_SERIAL
|
||||
if (!strcmp(arg, "ser") || !strcmp(arg, "ser1")) {
|
||||
/* Mac modem port */
|
||||
mac_init_scc_port(B9600|CS8, 0);
|
||||
mac_console_driver.write = mac_scca_console_write;
|
||||
scc_port = 0;
|
||||
} else if (!strcmp(arg, "ser2")) {
|
||||
/* Mac printer port */
|
||||
mac_init_scc_port(B9600|CS8, 1);
|
||||
mac_console_driver.write = mac_sccb_console_write;
|
||||
scc_port = 1;
|
||||
}
|
||||
#endif
|
||||
#ifdef DEBUG_HEADS
|
||||
if (!strcmp(arg, "scn") || !strcmp(arg, "con")) {
|
||||
/* display, using head.S console routines */
|
||||
mac_console_driver.write = mac_debug_console_write;
|
||||
}
|
||||
#endif
|
||||
if (mac_console_driver.write)
|
||||
register_console(&mac_console_driver);
|
||||
return 0;
|
||||
}
|
||||
|
||||
early_param("debug", mac_debug_setup);
|
|
@ -34,9 +34,7 @@
|
|||
*
|
||||
* 3 - unused (?)
|
||||
*
|
||||
* 4 - SCC (slot number determined by reading RR3 on the SSC itself)
|
||||
* - slot 1: SCC channel A
|
||||
* - slot 2: SCC channel B
|
||||
* 4 - SCC
|
||||
*
|
||||
* 5 - unused (?)
|
||||
* [serial errors or special conditions seem to raise level 6
|
||||
|
@ -55,8 +53,6 @@
|
|||
* - slot 5: Slot $E
|
||||
*
|
||||
* 4 - SCC IOP
|
||||
* - slot 1: SCC channel A
|
||||
* - slot 2: SCC channel B
|
||||
*
|
||||
* 5 - ISM IOP (ADB?)
|
||||
*
|
||||
|
@ -136,13 +132,8 @@
|
|||
#include <asm/irq_regs.h>
|
||||
#include <asm/mac_oss.h>
|
||||
|
||||
#define DEBUG_SPURIOUS
|
||||
#define SHUTUP_SONIC
|
||||
|
||||
/* SCC interrupt mask */
|
||||
|
||||
static int scc_mask;
|
||||
|
||||
/*
|
||||
* VIA/RBV hooks
|
||||
*/
|
||||
|
@ -190,13 +181,6 @@ extern void baboon_irq_enable(int);
|
|||
extern void baboon_irq_disable(int);
|
||||
extern void baboon_irq_clear(int);
|
||||
|
||||
/*
|
||||
* SCC interrupt routines
|
||||
*/
|
||||
|
||||
static void scc_irq_enable(unsigned int);
|
||||
static void scc_irq_disable(unsigned int);
|
||||
|
||||
/*
|
||||
* console_loglevel determines NMI handler function
|
||||
*/
|
||||
|
@ -221,8 +205,6 @@ void __init mac_init_IRQ(void)
|
|||
#ifdef DEBUG_MACINTS
|
||||
printk("mac_init_IRQ(): Setting things up...\n");
|
||||
#endif
|
||||
scc_mask = 0;
|
||||
|
||||
m68k_setup_irq_controller(&mac_irq_controller, IRQ_USER,
|
||||
NUM_MAC_SOURCES - IRQ_USER);
|
||||
/* Make sure the SONIC interrupt is cleared or things get ugly */
|
||||
|
@ -283,15 +265,16 @@ void mac_enable_irq(unsigned int irq)
|
|||
via_irq_enable(irq);
|
||||
break;
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
if (psc_present)
|
||||
psc_irq_enable(irq);
|
||||
else if (oss_present)
|
||||
oss_irq_enable(irq);
|
||||
else if (irq_src == 4)
|
||||
scc_irq_enable(irq);
|
||||
break;
|
||||
case 4:
|
||||
if (psc_present)
|
||||
psc_irq_enable(irq);
|
||||
break;
|
||||
case 8:
|
||||
if (baboon_present)
|
||||
|
@ -316,15 +299,16 @@ void mac_disable_irq(unsigned int irq)
|
|||
via_irq_disable(irq);
|
||||
break;
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
if (psc_present)
|
||||
psc_irq_disable(irq);
|
||||
else if (oss_present)
|
||||
oss_irq_disable(irq);
|
||||
else if (irq_src == 4)
|
||||
scc_irq_disable(irq);
|
||||
break;
|
||||
case 4:
|
||||
if (psc_present)
|
||||
psc_irq_disable(irq);
|
||||
break;
|
||||
case 8:
|
||||
if (baboon_present)
|
||||
|
@ -347,7 +331,6 @@ void mac_clear_irq(unsigned int irq)
|
|||
via_irq_clear(irq);
|
||||
break;
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
if (psc_present)
|
||||
|
@ -355,6 +338,10 @@ void mac_clear_irq(unsigned int irq)
|
|||
else if (oss_present)
|
||||
oss_irq_clear(irq);
|
||||
break;
|
||||
case 4:
|
||||
if (psc_present)
|
||||
psc_irq_clear(irq);
|
||||
break;
|
||||
case 8:
|
||||
if (baboon_present)
|
||||
baboon_irq_clear(irq);
|
||||
|
@ -374,13 +361,17 @@ int mac_irq_pending(unsigned int irq)
|
|||
else
|
||||
return via_irq_pending(irq);
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
if (psc_present)
|
||||
return psc_irq_pending(irq);
|
||||
else if (oss_present)
|
||||
return oss_irq_pending(irq);
|
||||
break;
|
||||
case 4:
|
||||
if (psc_present)
|
||||
psc_irq_pending(irq);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -448,59 +439,3 @@ irqreturn_t mac_nmi_handler(int irq, void *dev_id)
|
|||
in_nmi--;
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
/*
|
||||
* Simple routines for masking and unmasking
|
||||
* SCC interrupts in cases where this can't be
|
||||
* done in hardware (only the PSC can do that.)
|
||||
*/
|
||||
|
||||
static void scc_irq_enable(unsigned int irq)
|
||||
{
|
||||
int irq_idx = IRQ_IDX(irq);
|
||||
|
||||
scc_mask |= (1 << irq_idx);
|
||||
}
|
||||
|
||||
static void scc_irq_disable(unsigned int irq)
|
||||
{
|
||||
int irq_idx = IRQ_IDX(irq);
|
||||
|
||||
scc_mask &= ~(1 << irq_idx);
|
||||
}
|
||||
|
||||
/*
|
||||
* SCC master interrupt handler. We have to do a bit of magic here
|
||||
* to figure out what channel gave us the interrupt; putting this
|
||||
* here is cleaner than hacking it into drivers/char/macserial.c.
|
||||
*/
|
||||
|
||||
void mac_scc_dispatch(int irq, void *dev_id)
|
||||
{
|
||||
volatile unsigned char *scc = (unsigned char *) mac_bi_data.sccbase + 2;
|
||||
unsigned char reg;
|
||||
unsigned long flags;
|
||||
|
||||
/* Read RR3 from the chip. Always do this on channel A */
|
||||
/* This must be an atomic operation so disable irqs. */
|
||||
|
||||
local_irq_save(flags);
|
||||
*scc = 3;
|
||||
reg = *scc;
|
||||
local_irq_restore(flags);
|
||||
|
||||
/* Now dispatch. Bits 0-2 are for channel B and */
|
||||
/* bits 3-5 are for channel A. We can safely */
|
||||
/* ignore the remaining bits here. */
|
||||
/* */
|
||||
/* Note that we're ignoring scc_mask for now. */
|
||||
/* If we actually mask the ints then we tend to */
|
||||
/* get hammered by very persistent SCC irqs, */
|
||||
/* and since they're autovector interrupts they */
|
||||
/* pretty much kill the system. */
|
||||
|
||||
if (reg & 0x38)
|
||||
m68k_handle_int(IRQ_SCCA);
|
||||
if (reg & 0x07)
|
||||
m68k_handle_int(IRQ_SCCB);
|
||||
}
|
||||
|
|
|
@ -33,7 +33,6 @@ static irqreturn_t oss_irq(int, void *);
|
|||
static irqreturn_t oss_nubus_irq(int, void *);
|
||||
|
||||
extern irqreturn_t via1_irq(int, void *);
|
||||
extern irqreturn_t mac_scc_dispatch(int, void *);
|
||||
|
||||
/*
|
||||
* Initialize the OSS
|
||||
|
@ -69,9 +68,6 @@ void __init oss_register_interrupts(void)
|
|||
if (request_irq(OSS_IRQLEV_SCSI, oss_irq, IRQ_FLG_LOCK,
|
||||
"scsi", (void *) oss))
|
||||
pr_err("Couldn't register %s interrupt\n", "scsi");
|
||||
if (request_irq(OSS_IRQLEV_IOPSCC, mac_scc_dispatch, IRQ_FLG_LOCK,
|
||||
"scc", mac_scc_dispatch))
|
||||
pr_err("Couldn't register %s interrupt\n", "scc");
|
||||
if (request_irq(OSS_IRQLEV_NUBUS, oss_nubus_irq, IRQ_FLG_LOCK,
|
||||
"nubus", (void *) oss))
|
||||
pr_err("Couldn't register %s interrupt\n", "nubus");
|
||||
|
@ -172,9 +168,7 @@ void oss_irq_enable(int irq) {
|
|||
printk("oss_irq_enable(%d)\n", irq);
|
||||
#endif
|
||||
switch(irq) {
|
||||
case IRQ_SCC:
|
||||
case IRQ_SCCA:
|
||||
case IRQ_SCCB:
|
||||
case IRQ_MAC_SCC:
|
||||
oss->irq_level[OSS_IOPSCC] = OSS_IRQLEV_IOPSCC;
|
||||
break;
|
||||
case IRQ_MAC_ADB:
|
||||
|
@ -212,9 +206,7 @@ void oss_irq_disable(int irq) {
|
|||
printk("oss_irq_disable(%d)\n", irq);
|
||||
#endif
|
||||
switch(irq) {
|
||||
case IRQ_SCC:
|
||||
case IRQ_SCCA:
|
||||
case IRQ_SCCB:
|
||||
case IRQ_MAC_SCC:
|
||||
oss->irq_level[OSS_IOPSCC] = OSS_IRQLEV_DISABLED;
|
||||
break;
|
||||
case IRQ_MAC_ADB:
|
||||
|
@ -250,9 +242,7 @@ void oss_irq_disable(int irq) {
|
|||
void oss_irq_clear(int irq) {
|
||||
/* FIXME: how to do this on OSS? */
|
||||
switch(irq) {
|
||||
case IRQ_SCC:
|
||||
case IRQ_SCCA:
|
||||
case IRQ_SCCB:
|
||||
case IRQ_MAC_SCC:
|
||||
oss->irq_pending &= ~OSS_IP_IOPSCC;
|
||||
break;
|
||||
case IRQ_MAC_ADB:
|
||||
|
@ -280,9 +270,7 @@ void oss_irq_clear(int irq) {
|
|||
int oss_irq_pending(int irq)
|
||||
{
|
||||
switch(irq) {
|
||||
case IRQ_SCC:
|
||||
case IRQ_SCCA:
|
||||
case IRQ_SCCB:
|
||||
case IRQ_MAC_SCC:
|
||||
return oss->irq_pending & OSS_IP_IOPSCC;
|
||||
break;
|
||||
case IRQ_MAC_ADB:
|
||||
|
|
|
@ -84,8 +84,6 @@ void via_irq_enable(int irq);
|
|||
void via_irq_disable(int irq);
|
||||
void via_irq_clear(int irq);
|
||||
|
||||
extern irqreturn_t mac_scc_dispatch(int, void *);
|
||||
|
||||
/*
|
||||
* Initialize the VIAs
|
||||
*
|
||||
|
@ -311,11 +309,6 @@ void __init via_register_interrupts(void)
|
|||
if (request_irq(IRQ_AUTO_2, via2_irq, IRQ_FLG_LOCK|IRQ_FLG_FAST,
|
||||
"via2", (void *) via2))
|
||||
pr_err("Couldn't register %s interrupt\n", "via2");
|
||||
if (!psc_present) {
|
||||
if (request_irq(IRQ_AUTO_4, mac_scc_dispatch, IRQ_FLG_LOCK,
|
||||
"scc", mac_scc_dispatch))
|
||||
pr_err("Couldn't register %s interrupt\n", "scc");
|
||||
}
|
||||
if (request_irq(IRQ_MAC_NUBUS, via_nubus_irq,
|
||||
IRQ_FLG_LOCK|IRQ_FLG_FAST, "nubus", (void *) via2))
|
||||
pr_err("Couldn't register %s interrupt\n", "nubus");
|
||||
|
|
|
@ -99,8 +99,7 @@ static inline void free_io_area(void *addr)
|
|||
#endif
|
||||
|
||||
/*
|
||||
* Map some physical address range into the kernel address space. The
|
||||
* code is copied and adapted from map_chunk().
|
||||
* Map some physical address range into the kernel address space.
|
||||
*/
|
||||
/* Rewritten by Andreas Schwab to remove all races. */
|
||||
|
||||
|
@ -116,7 +115,7 @@ void __iomem *__ioremap(unsigned long physaddr, unsigned long size, int cachefla
|
|||
/*
|
||||
* Don't allow mappings that wrap..
|
||||
*/
|
||||
if (!size || size > physaddr + size)
|
||||
if (!size || physaddr > (unsigned long)(-size))
|
||||
return NULL;
|
||||
|
||||
#ifdef CONFIG_AMIGA
|
||||
|
|
|
@ -221,6 +221,10 @@ int copy_thread(unsigned long clone_flags,
|
|||
|
||||
p->thread.usp = usp;
|
||||
p->thread.ksp = (unsigned long)childstack;
|
||||
|
||||
if (clone_flags & CLONE_SETTLS)
|
||||
task_thread_info(p)->tp_value = regs->d5;
|
||||
|
||||
/*
|
||||
* Must save the current SFC/DFC value, NOT the value when
|
||||
* the parent was last descheduled - RGH 10-08-96
|
||||
|
|
|
@ -319,6 +319,11 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
|
|||
}
|
||||
#endif
|
||||
|
||||
case PTRACE_GET_THREAD_AREA:
|
||||
ret = put_user(task_thread_info(child)->tp_value,
|
||||
(unsigned long __user *)data);
|
||||
break;
|
||||
|
||||
default:
|
||||
ret = -EIO;
|
||||
break;
|
||||
|
|
|
@ -190,3 +190,39 @@ int kernel_execve(const char *filename, char *const argv[], char *const envp[])
|
|||
: "d" (__a), "d" (__b), "d" (__c));
|
||||
return __res;
|
||||
}
|
||||
|
||||
asmlinkage unsigned long sys_get_thread_area(void)
|
||||
{
|
||||
return current_thread_info()->tp_value;
|
||||
}
|
||||
|
||||
asmlinkage int sys_set_thread_area(unsigned long tp)
|
||||
{
|
||||
current_thread_info()->tp_value = tp;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* This syscall gets its arguments in A0 (mem), D2 (oldval) and
|
||||
D1 (newval). */
|
||||
asmlinkage int
|
||||
sys_atomic_cmpxchg_32(unsigned long newval, int oldval, int d3, int d4, int d5,
|
||||
unsigned long __user * mem)
|
||||
{
|
||||
struct mm_struct *mm = current->mm;
|
||||
unsigned long mem_value;
|
||||
|
||||
down_read(&mm->mmap_sem);
|
||||
|
||||
mem_value = *mem;
|
||||
if (mem_value == oldval)
|
||||
*mem = newval;
|
||||
|
||||
up_read(&mm->mmap_sem);
|
||||
return mem_value;
|
||||
}
|
||||
|
||||
asmlinkage int sys_atomic_barrier(void)
|
||||
{
|
||||
/* no code needed for uniprocs */
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -351,6 +351,10 @@ ENTRY(sys_call_table)
|
|||
.long sys_pwritev /* 330 */
|
||||
.long sys_rt_tgsigqueueinfo
|
||||
.long sys_perf_event_open
|
||||
.long sys_get_thread_area
|
||||
.long sys_set_thread_area
|
||||
.long sys_atomic_cmpxchg_32 /* 335 */
|
||||
.long sys_atomic_barrier
|
||||
|
||||
.rept NR_syscalls-(.-sys_call_table)/4
|
||||
.long sys_ni_syscall
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
|
||||
/*
|
||||
* Map some physical address range into the kernel address space.
|
||||
* The code is copied and adapted from map_chunk().
|
||||
*/
|
||||
|
||||
unsigned long kernel_map(unsigned long paddr, unsigned long size,
|
||||
|
|
|
@ -130,6 +130,7 @@ config CMDLINE_FORCE
|
|||
|
||||
config OF
|
||||
def_bool y
|
||||
select OF_FLATTREE
|
||||
|
||||
config PROC_DEVICETREE
|
||||
bool "Support for device tree in /proc"
|
||||
|
|
|
@ -26,31 +26,11 @@
|
|||
#include <asm/irq.h>
|
||||
#include <asm/atomic.h>
|
||||
|
||||
#define OF_ROOT_NODE_ADDR_CELLS_DEFAULT 1
|
||||
#define OF_ROOT_NODE_SIZE_CELLS_DEFAULT 1
|
||||
|
||||
#define of_compat_cmp(s1, s2, l) strncasecmp((s1), (s2), (l))
|
||||
#define of_prop_cmp(s1, s2) strcmp((s1), (s2))
|
||||
#define of_node_cmp(s1, s2) strcasecmp((s1), (s2))
|
||||
|
||||
extern struct device_node *of_chosen;
|
||||
|
||||
#define HAVE_ARCH_DEVTREE_FIXUPS
|
||||
|
||||
extern struct device_node *allnodes; /* temporary while merging */
|
||||
extern rwlock_t devtree_lock; /* temporary while merging */
|
||||
|
||||
/* For updating the device tree at runtime */
|
||||
extern void of_attach_node(struct device_node *);
|
||||
extern void of_detach_node(struct device_node *);
|
||||
|
||||
/* Other Prototypes */
|
||||
extern int early_uartlite_console(void);
|
||||
|
||||
extern struct resource *request_OF_resource(struct device_node *node,
|
||||
int index, const char *name_postfix);
|
||||
extern int release_OF_resource(struct device_node *node, int index);
|
||||
|
||||
/*
|
||||
* OF address retreival & translation
|
||||
*/
|
||||
|
|
|
@ -185,7 +185,7 @@ EXPORT_SYMBOL(of_find_device_by_node);
|
|||
static int of_dev_phandle_match(struct device *dev, void *data)
|
||||
{
|
||||
phandle *ph = data;
|
||||
return to_of_device(dev)->node->linux_phandle == *ph;
|
||||
return to_of_device(dev)->node->phandle == *ph;
|
||||
}
|
||||
|
||||
struct of_device *of_find_device_by_phandle(phandle ph)
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -41,7 +41,7 @@ config AR7
|
|||
select SYS_SUPPORTS_32BIT_KERNEL
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
select SYS_SUPPORTS_ZBOOT_UART16550
|
||||
select GENERIC_GPIO
|
||||
select ARCH_REQUIRE_GPIOLIB
|
||||
select GCD
|
||||
select VLYNQ
|
||||
help
|
||||
|
@ -180,7 +180,7 @@ config LASAT
|
|||
|
||||
config MACH_LOONGSON
|
||||
bool "Loongson family of machines"
|
||||
select SYS_SUPPORTS_ZBOOT_UART16550
|
||||
select SYS_SUPPORTS_ZBOOT
|
||||
help
|
||||
This enables the support of Loongson family of machines.
|
||||
|
||||
|
@ -1295,7 +1295,6 @@ config CPU_CAVIUM_OCTEON
|
|||
select SYS_SUPPORTS_SMP
|
||||
select NR_CPUS_DEFAULT_16
|
||||
select WEAK_ORDERING
|
||||
select WEAK_REORDERING_BEYOND_LLSC
|
||||
select CPU_SUPPORTS_HIGHMEM
|
||||
select CPU_SUPPORTS_HUGEPAGES
|
||||
help
|
||||
|
@ -1726,6 +1725,9 @@ config SB1_PASS_2_1_WORKAROUNDS
|
|||
config 64BIT_PHYS_ADDR
|
||||
bool
|
||||
|
||||
config ARCH_PHYS_ADDR_T_64BIT
|
||||
def_bool 64BIT_PHYS_ADDR
|
||||
|
||||
config CPU_HAS_SMARTMIPS
|
||||
depends on SYS_SUPPORTS_SMARTMIPS
|
||||
bool "Support for the SmartMIPS ASE"
|
||||
|
|
|
@ -102,4 +102,30 @@ config RUNTIME_DEBUG
|
|||
arch/mips/include/asm/debug.h for debugging macros.
|
||||
If unsure, say N.
|
||||
|
||||
config DEBUG_ZBOOT
|
||||
bool "Enable compressed kernel support debugging"
|
||||
depends on DEBUG_KERNEL && SYS_SUPPORTS_ZBOOT
|
||||
default n
|
||||
help
|
||||
If you want to add compressed kernel support to a new board, and the
|
||||
board supports uart16550 compatible serial port, please select
|
||||
SYS_SUPPORTS_ZBOOT_UART16550 for your board and enable this option to
|
||||
debug it.
|
||||
|
||||
If your board doesn't support uart16550 compatible serial port, you
|
||||
can try to select SYS_SUPPORTS_ZBOOT and use the other methods to
|
||||
debug it. for example, add a new serial port support just as
|
||||
arch/mips/boot/compressed/uart-16550.c does.
|
||||
|
||||
After the compressed kernel support works, please disable this option
|
||||
to reduce the kernel image size and speed up the booting procedure a
|
||||
little.
|
||||
|
||||
config SPINLOCK_TEST
|
||||
bool "Enable spinlock timing tests in debugfs"
|
||||
depends on DEBUG_FS
|
||||
default n
|
||||
help
|
||||
Add several files to the debugfs to test spinlock speed.
|
||||
|
||||
endmenu
|
||||
|
|
|
@ -184,6 +184,15 @@ libs-$(CONFIG_CFE) += arch/mips/fw/cfe/
|
|||
libs-$(CONFIG_SNIPROM) += arch/mips/fw/sni/
|
||||
libs-y += arch/mips/fw/lib/
|
||||
|
||||
#
|
||||
# Kernel compression
|
||||
#
|
||||
ifdef SYS_SUPPORTS_ZBOOT
|
||||
COMPRESSION_FNAME = vmlinuz
|
||||
else
|
||||
COMPRESSION_FNAME = vmlinux
|
||||
endif
|
||||
|
||||
#
|
||||
# Board-dependent options and extra files
|
||||
#
|
||||
|
@ -332,11 +341,11 @@ load-$(CONFIG_WR_PPMC) += 0xffffffff80100000
|
|||
#
|
||||
# Loongson family
|
||||
#
|
||||
core-$(CONFIG_MACH_LOONGSON) +=arch/mips/loongson/
|
||||
core-$(CONFIG_MACH_LOONGSON) += arch/mips/loongson/
|
||||
cflags-$(CONFIG_MACH_LOONGSON) += -I$(srctree)/arch/mips/include/asm/mach-loongson \
|
||||
-mno-branch-likely
|
||||
load-$(CONFIG_LEMOTE_FULOONG2E) +=0xffffffff80100000
|
||||
load-$(CONFIG_LEMOTE_MACH2F) +=0xffffffff80200000
|
||||
load-$(CONFIG_LEMOTE_FULOONG2E) += 0xffffffff80100000
|
||||
load-$(CONFIG_LEMOTE_MACH2F) += 0xffffffff80200000
|
||||
|
||||
#
|
||||
# MIPS Malta board
|
||||
|
@ -344,7 +353,7 @@ load-$(CONFIG_LEMOTE_MACH2F) +=0xffffffff80200000
|
|||
core-$(CONFIG_MIPS_MALTA) += arch/mips/mti-malta/
|
||||
cflags-$(CONFIG_MIPS_MALTA) += -I$(srctree)/arch/mips/include/asm/mach-malta
|
||||
load-$(CONFIG_MIPS_MALTA) += 0xffffffff80100000
|
||||
all-$(CONFIG_MIPS_MALTA) := vmlinuz.bin
|
||||
all-$(CONFIG_MIPS_MALTA) := $(COMPRESSION_FNAME).bin
|
||||
|
||||
#
|
||||
# MIPS SIM
|
||||
|
@ -594,7 +603,7 @@ load-$(CONFIG_SNI_RM) += 0xffffffff80600000
|
|||
else
|
||||
load-$(CONFIG_SNI_RM) += 0xffffffff80030000
|
||||
endif
|
||||
all-$(CONFIG_SNI_RM) := vmlinuz.ecoff
|
||||
all-$(CONFIG_SNI_RM) := $(COMPRESSION_FNAME).ecoff
|
||||
|
||||
#
|
||||
# Common TXx9
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
# au1000-style gpio
|
||||
config ALCHEMY_GPIO_AU1000
|
||||
# au1000-style gpio and interrupt controllers
|
||||
config ALCHEMY_GPIOINT_AU1000
|
||||
bool
|
||||
|
||||
# select this in your board config if you don't want to use the gpio
|
||||
|
@ -20,12 +20,14 @@ config MIPS_MTX1
|
|||
select HW_HAS_PCI
|
||||
select SOC_AU1500
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
select SYS_HAS_EARLY_PRINTK
|
||||
|
||||
config MIPS_BOSPORUS
|
||||
bool "Alchemy Bosporus board"
|
||||
select SOC_AU1500
|
||||
select DMA_NONCOHERENT
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
select SYS_HAS_EARLY_PRINTK
|
||||
|
||||
config MIPS_DB1000
|
||||
bool "Alchemy DB1000 board"
|
||||
|
@ -33,12 +35,14 @@ config MIPS_DB1000
|
|||
select DMA_NONCOHERENT
|
||||
select HW_HAS_PCI
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
select SYS_HAS_EARLY_PRINTK
|
||||
|
||||
config MIPS_DB1100
|
||||
bool "Alchemy DB1100 board"
|
||||
select SOC_AU1100
|
||||
select DMA_NONCOHERENT
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
select SYS_HAS_EARLY_PRINTK
|
||||
|
||||
config MIPS_DB1200
|
||||
bool "Alchemy DB1200 board"
|
||||
|
@ -46,6 +50,7 @@ config MIPS_DB1200
|
|||
select DMA_COHERENT
|
||||
select MIPS_DISABLE_OBSOLETE_IDE
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
select SYS_HAS_EARLY_PRINTK
|
||||
|
||||
config MIPS_DB1500
|
||||
bool "Alchemy DB1500 board"
|
||||
|
@ -55,6 +60,7 @@ config MIPS_DB1500
|
|||
select MIPS_DISABLE_OBSOLETE_IDE
|
||||
select SYS_SUPPORTS_BIG_ENDIAN
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
select SYS_HAS_EARLY_PRINTK
|
||||
|
||||
config MIPS_DB1550
|
||||
bool "Alchemy DB1550 board"
|
||||
|
@ -63,12 +69,14 @@ config MIPS_DB1550
|
|||
select DMA_NONCOHERENT
|
||||
select MIPS_DISABLE_OBSOLETE_IDE
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
select SYS_HAS_EARLY_PRINTK
|
||||
|
||||
config MIPS_MIRAGE
|
||||
bool "Alchemy Mirage board"
|
||||
select DMA_NONCOHERENT
|
||||
select SOC_AU1500
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
select SYS_HAS_EARLY_PRINTK
|
||||
|
||||
config MIPS_PB1000
|
||||
bool "Alchemy PB1000 board"
|
||||
|
@ -77,6 +85,7 @@ config MIPS_PB1000
|
|||
select HW_HAS_PCI
|
||||
select SWAP_IO_SPACE
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
select SYS_HAS_EARLY_PRINTK
|
||||
|
||||
config MIPS_PB1100
|
||||
bool "Alchemy PB1100 board"
|
||||
|
@ -85,6 +94,7 @@ config MIPS_PB1100
|
|||
select HW_HAS_PCI
|
||||
select SWAP_IO_SPACE
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
select SYS_HAS_EARLY_PRINTK
|
||||
|
||||
config MIPS_PB1200
|
||||
bool "Alchemy PB1200 board"
|
||||
|
@ -92,6 +102,7 @@ config MIPS_PB1200
|
|||
select DMA_NONCOHERENT
|
||||
select MIPS_DISABLE_OBSOLETE_IDE
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
select SYS_HAS_EARLY_PRINTK
|
||||
|
||||
config MIPS_PB1500
|
||||
bool "Alchemy PB1500 board"
|
||||
|
@ -99,6 +110,7 @@ config MIPS_PB1500
|
|||
select DMA_NONCOHERENT
|
||||
select HW_HAS_PCI
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
select SYS_HAS_EARLY_PRINTK
|
||||
|
||||
config MIPS_PB1550
|
||||
bool "Alchemy PB1550 board"
|
||||
|
@ -107,39 +119,41 @@ config MIPS_PB1550
|
|||
select HW_HAS_PCI
|
||||
select MIPS_DISABLE_OBSOLETE_IDE
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
select SYS_HAS_EARLY_PRINTK
|
||||
|
||||
config MIPS_XXS1500
|
||||
bool "MyCable XXS1500 board"
|
||||
select DMA_NONCOHERENT
|
||||
select SOC_AU1500
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
select SYS_HAS_EARLY_PRINTK
|
||||
|
||||
endchoice
|
||||
|
||||
config SOC_AU1000
|
||||
bool
|
||||
select SOC_AU1X00
|
||||
select ALCHEMY_GPIO_AU1000
|
||||
select ALCHEMY_GPIOINT_AU1000
|
||||
|
||||
config SOC_AU1100
|
||||
bool
|
||||
select SOC_AU1X00
|
||||
select ALCHEMY_GPIO_AU1000
|
||||
select ALCHEMY_GPIOINT_AU1000
|
||||
|
||||
config SOC_AU1500
|
||||
bool
|
||||
select SOC_AU1X00
|
||||
select ALCHEMY_GPIO_AU1000
|
||||
select ALCHEMY_GPIOINT_AU1000
|
||||
|
||||
config SOC_AU1550
|
||||
bool
|
||||
select SOC_AU1X00
|
||||
select ALCHEMY_GPIO_AU1000
|
||||
select ALCHEMY_GPIOINT_AU1000
|
||||
|
||||
config SOC_AU1200
|
||||
bool
|
||||
select SOC_AU1X00
|
||||
select ALCHEMY_GPIO_AU1000
|
||||
select ALCHEMY_GPIOINT_AU1000
|
||||
|
||||
config SOC_AU1X00
|
||||
bool
|
||||
|
|
|
@ -5,14 +5,15 @@
|
|||
# Makefile for the Alchemy Au1xx0 CPUs, generic files.
|
||||
#
|
||||
|
||||
obj-y += prom.o irq.o puts.o time.o reset.o \
|
||||
clocks.o platform.o power.o setup.o \
|
||||
obj-y += prom.o time.o clocks.o platform.o power.o setup.o \
|
||||
sleeper.o dma.o dbdma.o
|
||||
|
||||
obj-$(CONFIG_ALCHEMY_GPIOINT_AU1000) += irq.o
|
||||
|
||||
# optional gpiolib support
|
||||
ifeq ($(CONFIG_ALCHEMY_GPIO_INDIRECT),)
|
||||
ifeq ($(CONFIG_GPIOLIB),y)
|
||||
obj-$(CONFIG_ALCHEMY_GPIO_AU1000) += gpiolib-au1000.o
|
||||
obj-$(CONFIG_ALCHEMY_GPIOINT_AU1000) += gpiolib-au1000.o
|
||||
endif
|
||||
endif
|
||||
|
||||
|
|
|
@ -40,8 +40,6 @@
|
|||
static unsigned int au1x00_clock; /* Hz */
|
||||
static unsigned long uart_baud_base;
|
||||
|
||||
static DEFINE_SPINLOCK(time_lock);
|
||||
|
||||
/*
|
||||
* Set the au1000_clock
|
||||
*/
|
||||
|
@ -84,9 +82,6 @@ void set_au1x00_uart_baud_base(unsigned long new_baud_base)
|
|||
unsigned long au1xxx_calc_clock(void)
|
||||
{
|
||||
unsigned long cpu_speed;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&time_lock, flags);
|
||||
|
||||
/*
|
||||
* On early Au1000, sys_cpupll was write-only. Since these
|
||||
|
@ -108,8 +103,6 @@ unsigned long au1xxx_calc_clock(void)
|
|||
set_au1x00_uart_baud_base(cpu_speed / (2 * ((int)(au_readl(SYS_POWERCTRL)
|
||||
& 0x03) + 2) * 16));
|
||||
|
||||
spin_unlock_irqrestore(&time_lock, flags);
|
||||
|
||||
set_au1x00_speed(cpu_speed);
|
||||
|
||||
return cpu_speed;
|
||||
|
|
|
@ -30,6 +30,7 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
@ -58,7 +59,6 @@ static DEFINE_SPINLOCK(au1xxx_dbdma_spin_lock);
|
|||
|
||||
static dbdma_global_t *dbdma_gptr = (dbdma_global_t *)DDMA_GLOBAL_BASE;
|
||||
static int dbdma_initialized;
|
||||
static void au1xxx_dbdma_init(void);
|
||||
|
||||
static dbdev_tab_t dbdev_tab[] = {
|
||||
#ifdef CONFIG_SOC_AU1550
|
||||
|
@ -237,7 +237,7 @@ u32 au1xxx_dbdma_chan_alloc(u32 srcid, u32 destid,
|
|||
void (*callback)(int, void *), void *callparam)
|
||||
{
|
||||
unsigned long flags;
|
||||
u32 used, chan, rv;
|
||||
u32 used, chan;
|
||||
u32 dcp;
|
||||
int i;
|
||||
dbdev_tab_t *stp, *dtp;
|
||||
|
@ -250,8 +250,7 @@ u32 au1xxx_dbdma_chan_alloc(u32 srcid, u32 destid,
|
|||
* which can't be done successfully during board set up.
|
||||
*/
|
||||
if (!dbdma_initialized)
|
||||
au1xxx_dbdma_init();
|
||||
dbdma_initialized = 1;
|
||||
return 0;
|
||||
|
||||
stp = find_dbdev_id(srcid);
|
||||
if (stp == NULL)
|
||||
|
@ -261,7 +260,6 @@ u32 au1xxx_dbdma_chan_alloc(u32 srcid, u32 destid,
|
|||
return 0;
|
||||
|
||||
used = 0;
|
||||
rv = 0;
|
||||
|
||||
/* Check to see if we can get both channels. */
|
||||
spin_lock_irqsave(&au1xxx_dbdma_spin_lock, flags);
|
||||
|
@ -282,63 +280,65 @@ u32 au1xxx_dbdma_chan_alloc(u32 srcid, u32 destid,
|
|||
used++;
|
||||
spin_unlock_irqrestore(&au1xxx_dbdma_spin_lock, flags);
|
||||
|
||||
if (!used) {
|
||||
/* Let's see if we can allocate a channel for it. */
|
||||
ctp = NULL;
|
||||
chan = 0;
|
||||
spin_lock_irqsave(&au1xxx_dbdma_spin_lock, flags);
|
||||
for (i = 0; i < NUM_DBDMA_CHANS; i++)
|
||||
if (chan_tab_ptr[i] == NULL) {
|
||||
/*
|
||||
* If kmalloc fails, it is caught below same
|
||||
* as a channel not available.
|
||||
*/
|
||||
ctp = kmalloc(sizeof(chan_tab_t), GFP_ATOMIC);
|
||||
chan_tab_ptr[i] = ctp;
|
||||
break;
|
||||
}
|
||||
spin_unlock_irqrestore(&au1xxx_dbdma_spin_lock, flags);
|
||||
if (used)
|
||||
return 0;
|
||||
|
||||
if (ctp != NULL) {
|
||||
memset(ctp, 0, sizeof(chan_tab_t));
|
||||
ctp->chan_index = chan = i;
|
||||
dcp = DDMA_CHANNEL_BASE;
|
||||
dcp += (0x0100 * chan);
|
||||
ctp->chan_ptr = (au1x_dma_chan_t *)dcp;
|
||||
cp = (au1x_dma_chan_t *)dcp;
|
||||
ctp->chan_src = stp;
|
||||
ctp->chan_dest = dtp;
|
||||
ctp->chan_callback = callback;
|
||||
ctp->chan_callparam = callparam;
|
||||
|
||||
/* Initialize channel configuration. */
|
||||
i = 0;
|
||||
if (stp->dev_intlevel)
|
||||
i |= DDMA_CFG_SED;
|
||||
if (stp->dev_intpolarity)
|
||||
i |= DDMA_CFG_SP;
|
||||
if (dtp->dev_intlevel)
|
||||
i |= DDMA_CFG_DED;
|
||||
if (dtp->dev_intpolarity)
|
||||
i |= DDMA_CFG_DP;
|
||||
if ((stp->dev_flags & DEV_FLAGS_SYNC) ||
|
||||
(dtp->dev_flags & DEV_FLAGS_SYNC))
|
||||
i |= DDMA_CFG_SYNC;
|
||||
cp->ddma_cfg = i;
|
||||
au_sync();
|
||||
|
||||
/* Return a non-zero value that can be used to
|
||||
* find the channel information in subsequent
|
||||
* operations.
|
||||
/* Let's see if we can allocate a channel for it. */
|
||||
ctp = NULL;
|
||||
chan = 0;
|
||||
spin_lock_irqsave(&au1xxx_dbdma_spin_lock, flags);
|
||||
for (i = 0; i < NUM_DBDMA_CHANS; i++)
|
||||
if (chan_tab_ptr[i] == NULL) {
|
||||
/*
|
||||
* If kmalloc fails, it is caught below same
|
||||
* as a channel not available.
|
||||
*/
|
||||
rv = (u32)(&chan_tab_ptr[chan]);
|
||||
} else {
|
||||
/* Release devices */
|
||||
stp->dev_flags &= ~DEV_FLAGS_INUSE;
|
||||
dtp->dev_flags &= ~DEV_FLAGS_INUSE;
|
||||
ctp = kmalloc(sizeof(chan_tab_t), GFP_ATOMIC);
|
||||
chan_tab_ptr[i] = ctp;
|
||||
break;
|
||||
}
|
||||
spin_unlock_irqrestore(&au1xxx_dbdma_spin_lock, flags);
|
||||
|
||||
if (ctp != NULL) {
|
||||
memset(ctp, 0, sizeof(chan_tab_t));
|
||||
ctp->chan_index = chan = i;
|
||||
dcp = DDMA_CHANNEL_BASE;
|
||||
dcp += (0x0100 * chan);
|
||||
ctp->chan_ptr = (au1x_dma_chan_t *)dcp;
|
||||
cp = (au1x_dma_chan_t *)dcp;
|
||||
ctp->chan_src = stp;
|
||||
ctp->chan_dest = dtp;
|
||||
ctp->chan_callback = callback;
|
||||
ctp->chan_callparam = callparam;
|
||||
|
||||
/* Initialize channel configuration. */
|
||||
i = 0;
|
||||
if (stp->dev_intlevel)
|
||||
i |= DDMA_CFG_SED;
|
||||
if (stp->dev_intpolarity)
|
||||
i |= DDMA_CFG_SP;
|
||||
if (dtp->dev_intlevel)
|
||||
i |= DDMA_CFG_DED;
|
||||
if (dtp->dev_intpolarity)
|
||||
i |= DDMA_CFG_DP;
|
||||
if ((stp->dev_flags & DEV_FLAGS_SYNC) ||
|
||||
(dtp->dev_flags & DEV_FLAGS_SYNC))
|
||||
i |= DDMA_CFG_SYNC;
|
||||
cp->ddma_cfg = i;
|
||||
au_sync();
|
||||
|
||||
/*
|
||||
* Return a non-zero value that can be used to find the channel
|
||||
* information in subsequent operations.
|
||||
*/
|
||||
return (u32)(&chan_tab_ptr[chan]);
|
||||
}
|
||||
return rv;
|
||||
|
||||
/* Release devices */
|
||||
stp->dev_flags &= ~DEV_FLAGS_INUSE;
|
||||
dtp->dev_flags &= ~DEV_FLAGS_INUSE;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(au1xxx_dbdma_chan_alloc);
|
||||
|
||||
|
@ -572,7 +572,7 @@ EXPORT_SYMBOL(au1xxx_dbdma_ring_alloc);
|
|||
* This updates the source pointer and byte count. Normally used
|
||||
* for memory to fifo transfers.
|
||||
*/
|
||||
u32 _au1xxx_dbdma_put_source(u32 chanid, void *buf, int nbytes, u32 flags)
|
||||
u32 au1xxx_dbdma_put_source(u32 chanid, dma_addr_t buf, int nbytes, u32 flags)
|
||||
{
|
||||
chan_tab_t *ctp;
|
||||
au1x_ddma_desc_t *dp;
|
||||
|
@ -598,7 +598,7 @@ u32 _au1xxx_dbdma_put_source(u32 chanid, void *buf, int nbytes, u32 flags)
|
|||
return 0;
|
||||
|
||||
/* Load up buffer address and byte count. */
|
||||
dp->dscr_source0 = virt_to_phys(buf);
|
||||
dp->dscr_source0 = buf & ~0UL;
|
||||
dp->dscr_cmd1 = nbytes;
|
||||
/* Check flags */
|
||||
if (flags & DDMA_FLAGS_IE)
|
||||
|
@ -625,14 +625,13 @@ u32 _au1xxx_dbdma_put_source(u32 chanid, void *buf, int nbytes, u32 flags)
|
|||
/* Return something non-zero. */
|
||||
return nbytes;
|
||||
}
|
||||
EXPORT_SYMBOL(_au1xxx_dbdma_put_source);
|
||||
EXPORT_SYMBOL(au1xxx_dbdma_put_source);
|
||||
|
||||
/* Put a destination buffer into the DMA ring.
|
||||
* This updates the destination pointer and byte count. Normally used
|
||||
* to place an empty buffer into the ring for fifo to memory transfers.
|
||||
*/
|
||||
u32
|
||||
_au1xxx_dbdma_put_dest(u32 chanid, void *buf, int nbytes, u32 flags)
|
||||
u32 au1xxx_dbdma_put_dest(u32 chanid, dma_addr_t buf, int nbytes, u32 flags)
|
||||
{
|
||||
chan_tab_t *ctp;
|
||||
au1x_ddma_desc_t *dp;
|
||||
|
@ -662,7 +661,7 @@ _au1xxx_dbdma_put_dest(u32 chanid, void *buf, int nbytes, u32 flags)
|
|||
if (flags & DDMA_FLAGS_NOIE)
|
||||
dp->dscr_cmd0 &= ~DSCR_CMD0_IE;
|
||||
|
||||
dp->dscr_dest0 = virt_to_phys(buf);
|
||||
dp->dscr_dest0 = buf & ~0UL;
|
||||
dp->dscr_cmd1 = nbytes;
|
||||
#if 0
|
||||
printk(KERN_DEBUG "cmd0:%x cmd1:%x source0:%x source1:%x dest0:%x dest1:%x\n",
|
||||
|
@ -688,7 +687,7 @@ _au1xxx_dbdma_put_dest(u32 chanid, void *buf, int nbytes, u32 flags)
|
|||
/* Return something non-zero. */
|
||||
return nbytes;
|
||||
}
|
||||
EXPORT_SYMBOL(_au1xxx_dbdma_put_dest);
|
||||
EXPORT_SYMBOL(au1xxx_dbdma_put_dest);
|
||||
|
||||
/*
|
||||
* Get a destination buffer into the DMA ring.
|
||||
|
@ -871,28 +870,6 @@ static irqreturn_t dbdma_interrupt(int irq, void *dev_id)
|
|||
return IRQ_RETVAL(1);
|
||||
}
|
||||
|
||||
static void au1xxx_dbdma_init(void)
|
||||
{
|
||||
int irq_nr;
|
||||
|
||||
dbdma_gptr->ddma_config = 0;
|
||||
dbdma_gptr->ddma_throttle = 0;
|
||||
dbdma_gptr->ddma_inten = 0xffff;
|
||||
au_sync();
|
||||
|
||||
#if defined(CONFIG_SOC_AU1550)
|
||||
irq_nr = AU1550_DDMA_INT;
|
||||
#elif defined(CONFIG_SOC_AU1200)
|
||||
irq_nr = AU1200_DDMA_INT;
|
||||
#else
|
||||
#error Unknown Au1x00 SOC
|
||||
#endif
|
||||
|
||||
if (request_irq(irq_nr, dbdma_interrupt, IRQF_DISABLED,
|
||||
"Au1xxx dbdma", (void *)dbdma_gptr))
|
||||
printk(KERN_ERR "Can't get 1550 dbdma irq");
|
||||
}
|
||||
|
||||
void au1xxx_dbdma_dump(u32 chanid)
|
||||
{
|
||||
chan_tab_t *ctp;
|
||||
|
@ -906,7 +883,7 @@ void au1xxx_dbdma_dump(u32 chanid)
|
|||
dtp = ctp->chan_dest;
|
||||
cp = ctp->chan_ptr;
|
||||
|
||||
printk(KERN_DEBUG "Chan %x, stp %x (dev %d) dtp %x (dev %d) \n",
|
||||
printk(KERN_DEBUG "Chan %x, stp %x (dev %d) dtp %x (dev %d)\n",
|
||||
(u32)ctp, (u32)stp, stp - dbdev_tab, (u32)dtp,
|
||||
dtp - dbdev_tab);
|
||||
printk(KERN_DEBUG "desc base %x, get %x, put %x, cur %x\n",
|
||||
|
@ -1041,4 +1018,38 @@ void au1xxx_dbdma_resume(void)
|
|||
}
|
||||
}
|
||||
#endif /* CONFIG_PM */
|
||||
|
||||
static int __init au1xxx_dbdma_init(void)
|
||||
{
|
||||
int irq_nr, ret;
|
||||
|
||||
dbdma_gptr->ddma_config = 0;
|
||||
dbdma_gptr->ddma_throttle = 0;
|
||||
dbdma_gptr->ddma_inten = 0xffff;
|
||||
au_sync();
|
||||
|
||||
switch (alchemy_get_cputype()) {
|
||||
case ALCHEMY_CPU_AU1550:
|
||||
irq_nr = AU1550_DDMA_INT;
|
||||
break;
|
||||
case ALCHEMY_CPU_AU1200:
|
||||
irq_nr = AU1200_DDMA_INT;
|
||||
break;
|
||||
default:
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
ret = request_irq(irq_nr, dbdma_interrupt, IRQF_DISABLED,
|
||||
"Au1xxx dbdma", (void *)dbdma_gptr);
|
||||
if (ret)
|
||||
printk(KERN_ERR "Cannot grab DBDMA interrupt!\n");
|
||||
else {
|
||||
dbdma_initialized = 1;
|
||||
printk(KERN_INFO "Alchemy DBDMA initialized\n");
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
subsys_initcall(au1xxx_dbdma_init);
|
||||
|
||||
#endif /* defined(CONFIG_SOC_AU1550) || defined(CONFIG_SOC_AU1200) */
|
||||
|
|
|
@ -29,6 +29,8 @@
|
|||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/errno.h>
|
||||
|
@ -188,17 +190,14 @@ int request_au1000_dma(int dev_id, const char *dev_str,
|
|||
dev = &dma_dev_table[dev_id];
|
||||
|
||||
if (irqhandler) {
|
||||
chan->irq = AU1000_DMA_INT_BASE + i;
|
||||
chan->irq_dev = irq_dev_id;
|
||||
ret = request_irq(chan->irq, irqhandler, irqflags, dev_str,
|
||||
chan->irq_dev);
|
||||
if (ret) {
|
||||
chan->irq = 0;
|
||||
chan->irq_dev = NULL;
|
||||
return ret;
|
||||
}
|
||||
} else {
|
||||
chan->irq = 0;
|
||||
chan->irq_dev = NULL;
|
||||
}
|
||||
|
||||
|
@ -226,13 +225,40 @@ void free_au1000_dma(unsigned int dmanr)
|
|||
}
|
||||
|
||||
disable_dma(dmanr);
|
||||
if (chan->irq)
|
||||
if (chan->irq_dev)
|
||||
free_irq(chan->irq, chan->irq_dev);
|
||||
|
||||
chan->irq = 0;
|
||||
chan->irq_dev = NULL;
|
||||
chan->dev_id = -1;
|
||||
}
|
||||
EXPORT_SYMBOL(free_au1000_dma);
|
||||
|
||||
static int __init au1000_dma_init(void)
|
||||
{
|
||||
int base, i;
|
||||
|
||||
switch (alchemy_get_cputype()) {
|
||||
case ALCHEMY_CPU_AU1000:
|
||||
base = AU1000_DMA_INT_BASE;
|
||||
break;
|
||||
case ALCHEMY_CPU_AU1500:
|
||||
base = AU1500_DMA_INT_BASE;
|
||||
break;
|
||||
case ALCHEMY_CPU_AU1100:
|
||||
base = AU1100_DMA_INT_BASE;
|
||||
break;
|
||||
default:
|
||||
goto out;
|
||||
}
|
||||
|
||||
for (i = 0; i < NUM_AU1000_DMA_CHANNELS; i++)
|
||||
au1000_dma_table[i].irq = base + i;
|
||||
|
||||
printk(KERN_INFO "Alchemy DMA initialized\n");
|
||||
|
||||
out:
|
||||
return 0;
|
||||
}
|
||||
arch_initcall(au1000_dma_init);
|
||||
|
||||
#endif /* AU1000 AU1500 AU1100 */
|
||||
|
|
|
@ -36,7 +36,6 @@
|
|||
#include <asm/mach-au1x00/au1000.h>
|
||||
#include <asm/mach-au1x00/gpio.h>
|
||||
|
||||
#if !defined(CONFIG_SOC_AU1000)
|
||||
static int gpio2_get(struct gpio_chip *chip, unsigned offset)
|
||||
{
|
||||
return alchemy_gpio2_get_value(offset + ALCHEMY_GPIO2_BASE);
|
||||
|
@ -63,7 +62,7 @@ static int gpio2_to_irq(struct gpio_chip *chip, unsigned offset)
|
|||
{
|
||||
return alchemy_gpio2_to_irq(offset + ALCHEMY_GPIO2_BASE);
|
||||
}
|
||||
#endif /* !defined(CONFIG_SOC_AU1000) */
|
||||
|
||||
|
||||
static int gpio1_get(struct gpio_chip *chip, unsigned offset)
|
||||
{
|
||||
|
@ -104,7 +103,6 @@ struct gpio_chip alchemy_gpio_chip[] = {
|
|||
.base = ALCHEMY_GPIO1_BASE,
|
||||
.ngpio = ALCHEMY_GPIO1_NUM,
|
||||
},
|
||||
#if !defined(CONFIG_SOC_AU1000)
|
||||
[1] = {
|
||||
.label = "alchemy-gpio2",
|
||||
.direction_input = gpio2_direction_input,
|
||||
|
@ -115,15 +113,13 @@ struct gpio_chip alchemy_gpio_chip[] = {
|
|||
.base = ALCHEMY_GPIO2_BASE,
|
||||
.ngpio = ALCHEMY_GPIO2_NUM,
|
||||
},
|
||||
#endif
|
||||
};
|
||||
|
||||
static int __init alchemy_gpiolib_init(void)
|
||||
{
|
||||
gpiochip_add(&alchemy_gpio_chip[0]);
|
||||
#if !defined(CONFIG_SOC_AU1000)
|
||||
gpiochip_add(&alchemy_gpio_chip[1]);
|
||||
#endif
|
||||
if (alchemy_get_cputype() != ALCHEMY_CPU_AU1000)
|
||||
gpiochip_add(&alchemy_gpio_chip[1]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -39,168 +39,180 @@
|
|||
|
||||
static int au1x_ic_settype(unsigned int irq, unsigned int flow_type);
|
||||
|
||||
/* NOTE on interrupt priorities: The original writers of this code said:
|
||||
*
|
||||
* Because of the tight timing of SETUP token to reply transactions,
|
||||
* the USB devices-side packet complete interrupt (USB_DEV_REQ_INT)
|
||||
* needs the highest priority.
|
||||
*/
|
||||
|
||||
/* per-processor fixed function irqs */
|
||||
struct au1xxx_irqmap au1xxx_ic0_map[] __initdata = {
|
||||
struct au1xxx_irqmap {
|
||||
int im_irq;
|
||||
int im_type;
|
||||
int im_request; /* set 1 to get higher priority */
|
||||
};
|
||||
|
||||
#if defined(CONFIG_SOC_AU1000)
|
||||
{ AU1000_UART0_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_UART1_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_UART2_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_UART3_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_SSI0_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_SSI1_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_DMA_INT_BASE, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_DMA_INT_BASE+1, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_DMA_INT_BASE+2, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_DMA_INT_BASE+3, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_DMA_INT_BASE+4, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_DMA_INT_BASE+5, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_DMA_INT_BASE+6, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_DMA_INT_BASE+7, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_TOY_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_TOY_MATCH0_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_TOY_MATCH1_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_TOY_MATCH2_INT, IRQ_TYPE_EDGE_RISING, 1 },
|
||||
{ AU1000_RTC_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_RTC_MATCH0_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_RTC_MATCH1_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_RTC_MATCH2_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_IRDA_TX_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_IRDA_RX_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_USB_DEV_REQ_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
struct au1xxx_irqmap au1000_irqmap[] __initdata = {
|
||||
{ AU1000_UART0_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_UART1_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_UART2_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_UART3_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_SSI0_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_SSI1_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_DMA_INT_BASE, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_DMA_INT_BASE+1, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_DMA_INT_BASE+2, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_DMA_INT_BASE+3, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_DMA_INT_BASE+4, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_DMA_INT_BASE+5, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_DMA_INT_BASE+6, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_DMA_INT_BASE+7, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_TOY_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_TOY_MATCH0_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_TOY_MATCH1_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_TOY_MATCH2_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_RTC_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_RTC_MATCH0_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_RTC_MATCH1_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_RTC_MATCH2_INT, IRQ_TYPE_EDGE_RISING, 1 },
|
||||
{ AU1000_IRDA_TX_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_IRDA_RX_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_USB_DEV_REQ_INT, IRQ_TYPE_LEVEL_HIGH, 1 },
|
||||
{ AU1000_USB_DEV_SUS_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_USB_HOST_INT, IRQ_TYPE_LEVEL_LOW, 0 },
|
||||
{ AU1000_ACSYNC_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_MAC0_DMA_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_MAC1_DMA_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_AC97C_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_USB_HOST_INT, IRQ_TYPE_LEVEL_LOW, 0 },
|
||||
{ AU1000_ACSYNC_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_MAC0_DMA_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_MAC1_DMA_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_AC97C_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ -1, },
|
||||
};
|
||||
|
||||
#elif defined(CONFIG_SOC_AU1500)
|
||||
struct au1xxx_irqmap au1500_irqmap[] __initdata = {
|
||||
{ AU1500_UART0_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1500_PCI_INTA, IRQ_TYPE_LEVEL_LOW, 0 },
|
||||
{ AU1500_PCI_INTB, IRQ_TYPE_LEVEL_LOW, 0 },
|
||||
{ AU1500_UART3_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1500_PCI_INTC, IRQ_TYPE_LEVEL_LOW, 0 },
|
||||
{ AU1500_PCI_INTD, IRQ_TYPE_LEVEL_LOW, 0 },
|
||||
{ AU1500_DMA_INT_BASE, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1500_DMA_INT_BASE+1, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1500_DMA_INT_BASE+2, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1500_DMA_INT_BASE+3, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1500_DMA_INT_BASE+4, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1500_DMA_INT_BASE+5, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1500_DMA_INT_BASE+6, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1500_DMA_INT_BASE+7, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1500_TOY_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1500_TOY_MATCH0_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1500_TOY_MATCH1_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1500_TOY_MATCH2_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1500_RTC_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1500_RTC_MATCH0_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1500_RTC_MATCH1_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1500_RTC_MATCH2_INT, IRQ_TYPE_EDGE_RISING, 1 },
|
||||
{ AU1500_USB_DEV_REQ_INT, IRQ_TYPE_LEVEL_HIGH, 1 },
|
||||
{ AU1500_USB_DEV_SUS_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1500_USB_HOST_INT, IRQ_TYPE_LEVEL_LOW, 0 },
|
||||
{ AU1500_ACSYNC_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1500_MAC0_DMA_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1500_MAC1_DMA_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1500_AC97C_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ -1, },
|
||||
};
|
||||
|
||||
{ AU1500_UART0_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_PCI_INTA, IRQ_TYPE_LEVEL_LOW, 0 },
|
||||
{ AU1000_PCI_INTB, IRQ_TYPE_LEVEL_LOW, 0 },
|
||||
{ AU1500_UART3_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_PCI_INTC, IRQ_TYPE_LEVEL_LOW, 0 },
|
||||
{ AU1000_PCI_INTD, IRQ_TYPE_LEVEL_LOW, 0 },
|
||||
{ AU1000_DMA_INT_BASE, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_DMA_INT_BASE+1, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_DMA_INT_BASE+2, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_DMA_INT_BASE+3, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_DMA_INT_BASE+4, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_DMA_INT_BASE+5, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_DMA_INT_BASE+6, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_DMA_INT_BASE+7, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_TOY_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_TOY_MATCH0_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_TOY_MATCH1_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_TOY_MATCH2_INT, IRQ_TYPE_EDGE_RISING, 1 },
|
||||
{ AU1000_RTC_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_RTC_MATCH0_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_RTC_MATCH1_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_RTC_MATCH2_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_USB_DEV_REQ_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_USB_DEV_SUS_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_USB_HOST_INT, IRQ_TYPE_LEVEL_LOW, 0 },
|
||||
{ AU1000_ACSYNC_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1500_MAC0_DMA_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1500_MAC1_DMA_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_AC97C_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
struct au1xxx_irqmap au1100_irqmap[] __initdata = {
|
||||
{ AU1100_UART0_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1100_UART1_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1100_SD_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1100_UART3_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1100_SSI0_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1100_SSI1_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1100_DMA_INT_BASE, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1100_DMA_INT_BASE+1, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1100_DMA_INT_BASE+2, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1100_DMA_INT_BASE+3, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1100_DMA_INT_BASE+4, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1100_DMA_INT_BASE+5, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1100_DMA_INT_BASE+6, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1100_DMA_INT_BASE+7, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1100_TOY_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1100_TOY_MATCH0_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1100_TOY_MATCH1_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1100_TOY_MATCH2_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1100_RTC_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1100_RTC_MATCH0_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1100_RTC_MATCH1_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1100_RTC_MATCH2_INT, IRQ_TYPE_EDGE_RISING, 1 },
|
||||
{ AU1100_IRDA_TX_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1100_IRDA_RX_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1100_USB_DEV_REQ_INT, IRQ_TYPE_LEVEL_HIGH, 1 },
|
||||
{ AU1100_USB_DEV_SUS_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1100_USB_HOST_INT, IRQ_TYPE_LEVEL_LOW, 0 },
|
||||
{ AU1100_ACSYNC_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1100_MAC0_DMA_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1100_LCD_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1100_AC97C_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ -1, },
|
||||
};
|
||||
|
||||
#elif defined(CONFIG_SOC_AU1100)
|
||||
|
||||
{ AU1100_UART0_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1100_UART1_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1100_SD_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1100_UART3_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_SSI0_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_SSI1_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_DMA_INT_BASE, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_DMA_INT_BASE+1, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_DMA_INT_BASE+2, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_DMA_INT_BASE+3, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_DMA_INT_BASE+4, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_DMA_INT_BASE+5, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_DMA_INT_BASE+6, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_DMA_INT_BASE+7, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_TOY_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_TOY_MATCH0_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_TOY_MATCH1_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_TOY_MATCH2_INT, IRQ_TYPE_EDGE_RISING, 1 },
|
||||
{ AU1000_RTC_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_RTC_MATCH0_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_RTC_MATCH1_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_RTC_MATCH2_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_IRDA_TX_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_IRDA_RX_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_USB_DEV_REQ_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_USB_DEV_SUS_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_USB_HOST_INT, IRQ_TYPE_LEVEL_LOW, 0 },
|
||||
{ AU1000_ACSYNC_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1100_MAC0_DMA_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1100_LCD_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_AC97C_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
|
||||
#elif defined(CONFIG_SOC_AU1550)
|
||||
|
||||
{ AU1550_UART0_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1550_PCI_INTA, IRQ_TYPE_LEVEL_LOW, 0 },
|
||||
{ AU1550_PCI_INTB, IRQ_TYPE_LEVEL_LOW, 0 },
|
||||
{ AU1550_DDMA_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1550_CRYPTO_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1550_PCI_INTC, IRQ_TYPE_LEVEL_LOW, 0 },
|
||||
{ AU1550_PCI_INTD, IRQ_TYPE_LEVEL_LOW, 0 },
|
||||
{ AU1550_PCI_RST_INT, IRQ_TYPE_LEVEL_LOW, 0 },
|
||||
{ AU1550_UART1_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1550_UART3_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1550_PSC0_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1550_PSC1_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1550_PSC2_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1550_PSC3_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_TOY_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_TOY_MATCH0_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_TOY_MATCH1_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_TOY_MATCH2_INT, IRQ_TYPE_EDGE_RISING, 1 },
|
||||
{ AU1000_RTC_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_RTC_MATCH0_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_RTC_MATCH1_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_RTC_MATCH2_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1550_NAND_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1550_USB_DEV_REQ_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
struct au1xxx_irqmap au1550_irqmap[] __initdata = {
|
||||
{ AU1550_UART0_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1550_PCI_INTA, IRQ_TYPE_LEVEL_LOW, 0 },
|
||||
{ AU1550_PCI_INTB, IRQ_TYPE_LEVEL_LOW, 0 },
|
||||
{ AU1550_DDMA_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1550_CRYPTO_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1550_PCI_INTC, IRQ_TYPE_LEVEL_LOW, 0 },
|
||||
{ AU1550_PCI_INTD, IRQ_TYPE_LEVEL_LOW, 0 },
|
||||
{ AU1550_PCI_RST_INT, IRQ_TYPE_LEVEL_LOW, 0 },
|
||||
{ AU1550_UART1_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1550_UART3_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1550_PSC0_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1550_PSC1_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1550_PSC2_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1550_PSC3_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1550_TOY_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1550_TOY_MATCH0_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1550_TOY_MATCH1_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1550_TOY_MATCH2_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1550_RTC_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1550_RTC_MATCH0_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1550_RTC_MATCH1_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1550_RTC_MATCH2_INT, IRQ_TYPE_EDGE_RISING, 1 },
|
||||
{ AU1550_NAND_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1550_USB_DEV_REQ_INT, IRQ_TYPE_LEVEL_HIGH, 1 },
|
||||
{ AU1550_USB_DEV_SUS_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1550_USB_HOST_INT, IRQ_TYPE_LEVEL_LOW, 0 },
|
||||
{ AU1550_MAC0_DMA_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1550_MAC1_DMA_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1550_USB_HOST_INT, IRQ_TYPE_LEVEL_LOW, 0 },
|
||||
{ AU1550_MAC0_DMA_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1550_MAC1_DMA_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ -1, },
|
||||
};
|
||||
|
||||
#elif defined(CONFIG_SOC_AU1200)
|
||||
|
||||
{ AU1200_UART0_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1200_SWT_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1200_SD_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1200_DDMA_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1200_MAE_BE_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1200_UART1_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1200_MAE_FE_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1200_PSC0_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1200_PSC1_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1200_AES_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1200_CAMERA_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1000_TOY_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_TOY_MATCH0_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_TOY_MATCH1_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_TOY_MATCH2_INT, IRQ_TYPE_EDGE_RISING, 1 },
|
||||
{ AU1000_RTC_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_RTC_MATCH0_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_RTC_MATCH1_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1000_RTC_MATCH2_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1200_NAND_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1200_USB_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1200_LCD_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1200_MAE_BOTH_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
|
||||
#else
|
||||
#error "Error: Unknown Alchemy SOC"
|
||||
#endif
|
||||
struct au1xxx_irqmap au1200_irqmap[] __initdata = {
|
||||
{ AU1200_UART0_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1200_SWT_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1200_SD_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1200_DDMA_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1200_MAE_BE_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1200_UART1_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1200_MAE_FE_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1200_PSC0_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1200_PSC1_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1200_AES_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1200_CAMERA_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1200_TOY_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1200_TOY_MATCH0_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1200_TOY_MATCH1_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1200_TOY_MATCH2_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1200_RTC_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1200_RTC_MATCH0_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1200_RTC_MATCH1_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1200_RTC_MATCH2_INT, IRQ_TYPE_EDGE_RISING, 1 },
|
||||
{ AU1200_NAND_INT, IRQ_TYPE_EDGE_RISING, 0 },
|
||||
{ AU1200_USB_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1200_LCD_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ AU1200_MAE_BOTH_INT, IRQ_TYPE_LEVEL_HIGH, 0 },
|
||||
{ -1, },
|
||||
};
|
||||
|
||||
|
||||
|
@ -306,7 +318,7 @@ static void au1x_ic1_unmask(unsigned int irq_nr)
|
|||
* nowhere in the current kernel sources is it disabled. --mlau
|
||||
*/
|
||||
#if defined(CONFIG_MIPS_PB1000)
|
||||
if (irq_nr == AU1000_GPIO_15)
|
||||
if (irq_nr == AU1000_GPIO15_INT)
|
||||
au_writel(0x4000, PB1000_MDR); /* enable int */
|
||||
#endif
|
||||
au_sync();
|
||||
|
@ -378,11 +390,13 @@ static void au1x_ic1_maskack(unsigned int irq_nr)
|
|||
|
||||
static int au1x_ic1_setwake(unsigned int irq, unsigned int on)
|
||||
{
|
||||
unsigned int bit = irq - AU1000_INTC1_INT_BASE;
|
||||
int bit = irq - AU1000_INTC1_INT_BASE;
|
||||
unsigned long wakemsk, flags;
|
||||
|
||||
/* only GPIO 0-7 can act as wakeup source: */
|
||||
if ((irq < AU1000_GPIO_0) || (irq > AU1000_GPIO_7))
|
||||
/* only GPIO 0-7 can act as wakeup source. Fortunately these
|
||||
* are wired up identically on all supported variants.
|
||||
*/
|
||||
if ((bit < 0) || (bit > 7))
|
||||
return -EINVAL;
|
||||
|
||||
local_irq_save(flags);
|
||||
|
@ -504,11 +518,11 @@ static int au1x_ic_settype(unsigned int irq, unsigned int flow_type)
|
|||
asmlinkage void plat_irq_dispatch(void)
|
||||
{
|
||||
unsigned int pending = read_c0_status() & read_c0_cause();
|
||||
unsigned long s, off, bit;
|
||||
unsigned long s, off;
|
||||
|
||||
if (pending & CAUSEF_IP7) {
|
||||
do_IRQ(MIPS_CPU_IRQ_BASE + 7);
|
||||
return;
|
||||
off = MIPS_CPU_IRQ_BASE + 7;
|
||||
goto handle;
|
||||
} else if (pending & CAUSEF_IP2) {
|
||||
s = IC0_REQ0INT;
|
||||
off = AU1000_INTC0_INT_BASE;
|
||||
|
@ -524,58 +538,20 @@ asmlinkage void plat_irq_dispatch(void)
|
|||
} else
|
||||
goto spurious;
|
||||
|
||||
bit = 0;
|
||||
s = au_readl(s);
|
||||
if (unlikely(!s)) {
|
||||
spurious:
|
||||
spurious_interrupt();
|
||||
return;
|
||||
}
|
||||
#ifdef AU1000_USB_DEV_REQ_INT
|
||||
/*
|
||||
* Because of the tight timing of SETUP token to reply
|
||||
* transactions, the USB devices-side packet complete
|
||||
* interrupt needs the highest priority.
|
||||
*/
|
||||
bit = 1 << (AU1000_USB_DEV_REQ_INT - AU1000_INTC0_INT_BASE);
|
||||
if ((pending & CAUSEF_IP2) && (s & bit)) {
|
||||
do_IRQ(AU1000_USB_DEV_REQ_INT);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
do_IRQ(__ffs(s) + off);
|
||||
off += __ffs(s);
|
||||
handle:
|
||||
do_IRQ(off);
|
||||
}
|
||||
|
||||
/* setup edge/level and assign request 0/1 */
|
||||
void __init au1xxx_setup_irqmap(struct au1xxx_irqmap *map, int count)
|
||||
static void __init au1000_init_irq(struct au1xxx_irqmap *map)
|
||||
{
|
||||
unsigned int bit, irq_nr;
|
||||
|
||||
while (count--) {
|
||||
irq_nr = map[count].im_irq;
|
||||
|
||||
if (((irq_nr < AU1000_INTC0_INT_BASE) ||
|
||||
(irq_nr >= AU1000_INTC0_INT_BASE + 32)) &&
|
||||
((irq_nr < AU1000_INTC1_INT_BASE) ||
|
||||
(irq_nr >= AU1000_INTC1_INT_BASE + 32)))
|
||||
continue;
|
||||
|
||||
if (irq_nr >= AU1000_INTC1_INT_BASE) {
|
||||
bit = irq_nr - AU1000_INTC1_INT_BASE;
|
||||
if (map[count].im_request)
|
||||
au_writel(1 << bit, IC1_ASSIGNCLR);
|
||||
} else {
|
||||
bit = irq_nr - AU1000_INTC0_INT_BASE;
|
||||
if (map[count].im_request)
|
||||
au_writel(1 << bit, IC0_ASSIGNCLR);
|
||||
}
|
||||
|
||||
au1x_ic_settype(irq_nr, map[count].im_type);
|
||||
}
|
||||
}
|
||||
|
||||
void __init arch_init_irq(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
/*
|
||||
|
@ -585,7 +561,7 @@ void __init arch_init_irq(void)
|
|||
au_writel(0xffffffff, IC0_CFG1CLR);
|
||||
au_writel(0xffffffff, IC0_CFG2CLR);
|
||||
au_writel(0xffffffff, IC0_MASKCLR);
|
||||
au_writel(0xffffffff, IC0_ASSIGNSET);
|
||||
au_writel(0xffffffff, IC0_ASSIGNCLR);
|
||||
au_writel(0xffffffff, IC0_WAKECLR);
|
||||
au_writel(0xffffffff, IC0_SRCSET);
|
||||
au_writel(0xffffffff, IC0_FALLINGCLR);
|
||||
|
@ -596,7 +572,7 @@ void __init arch_init_irq(void)
|
|||
au_writel(0xffffffff, IC1_CFG1CLR);
|
||||
au_writel(0xffffffff, IC1_CFG2CLR);
|
||||
au_writel(0xffffffff, IC1_MASKCLR);
|
||||
au_writel(0xffffffff, IC1_ASSIGNSET);
|
||||
au_writel(0xffffffff, IC1_ASSIGNCLR);
|
||||
au_writel(0xffffffff, IC1_WAKECLR);
|
||||
au_writel(0xffffffff, IC1_SRCSET);
|
||||
au_writel(0xffffffff, IC1_FALLINGCLR);
|
||||
|
@ -619,11 +595,43 @@ void __init arch_init_irq(void)
|
|||
/*
|
||||
* Initialize IC0, which is fixed per processor.
|
||||
*/
|
||||
au1xxx_setup_irqmap(au1xxx_ic0_map, ARRAY_SIZE(au1xxx_ic0_map));
|
||||
while (map->im_irq != -1) {
|
||||
irq_nr = map->im_irq;
|
||||
|
||||
/* Boards can register additional (GPIO-based) IRQs.
|
||||
*/
|
||||
board_init_irq();
|
||||
if (irq_nr >= AU1000_INTC1_INT_BASE) {
|
||||
bit = irq_nr - AU1000_INTC1_INT_BASE;
|
||||
if (map->im_request)
|
||||
au_writel(1 << bit, IC1_ASSIGNSET);
|
||||
} else {
|
||||
bit = irq_nr - AU1000_INTC0_INT_BASE;
|
||||
if (map->im_request)
|
||||
au_writel(1 << bit, IC0_ASSIGNSET);
|
||||
}
|
||||
|
||||
au1x_ic_settype(irq_nr, map->im_type);
|
||||
++map;
|
||||
}
|
||||
|
||||
set_c0_status(IE_IRQ0 | IE_IRQ1 | IE_IRQ2 | IE_IRQ3);
|
||||
}
|
||||
|
||||
void __init arch_init_irq(void)
|
||||
{
|
||||
switch (alchemy_get_cputype()) {
|
||||
case ALCHEMY_CPU_AU1000:
|
||||
au1000_init_irq(au1000_irqmap);
|
||||
break;
|
||||
case ALCHEMY_CPU_AU1500:
|
||||
au1000_init_irq(au1500_irqmap);
|
||||
break;
|
||||
case ALCHEMY_CPU_AU1100:
|
||||
au1000_init_irq(au1100_irqmap);
|
||||
break;
|
||||
case ALCHEMY_CPU_AU1550:
|
||||
au1000_init_irq(au1550_irqmap);
|
||||
break;
|
||||
case ALCHEMY_CPU_AU1200:
|
||||
au1000_init_irq(au1200_irqmap);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,39 +19,40 @@
|
|||
#include <asm/mach-au1x00/au1xxx.h>
|
||||
#include <asm/mach-au1x00/au1xxx_dbdma.h>
|
||||
#include <asm/mach-au1x00/au1100_mmc.h>
|
||||
#include <asm/mach-au1x00/au1xxx_eth.h>
|
||||
|
||||
#define PORT(_base, _irq) \
|
||||
{ \
|
||||
.iobase = _base, \
|
||||
.membase = (void __iomem *)_base,\
|
||||
.mapbase = CPHYSADDR(_base), \
|
||||
.irq = _irq, \
|
||||
.regshift = 2, \
|
||||
.iotype = UPIO_AU, \
|
||||
.flags = UPF_SKIP_TEST \
|
||||
#define PORT(_base, _irq) \
|
||||
{ \
|
||||
.mapbase = _base, \
|
||||
.irq = _irq, \
|
||||
.regshift = 2, \
|
||||
.iotype = UPIO_AU, \
|
||||
.flags = UPF_SKIP_TEST | UPF_IOREMAP | \
|
||||
UPF_FIXED_TYPE, \
|
||||
.type = PORT_16550A, \
|
||||
}
|
||||
|
||||
static struct plat_serial8250_port au1x00_uart_data[] = {
|
||||
#if defined(CONFIG_SERIAL_8250_AU1X00)
|
||||
#if defined(CONFIG_SOC_AU1000)
|
||||
PORT(UART0_ADDR, AU1000_UART0_INT),
|
||||
PORT(UART1_ADDR, AU1000_UART1_INT),
|
||||
PORT(UART2_ADDR, AU1000_UART2_INT),
|
||||
PORT(UART3_ADDR, AU1000_UART3_INT),
|
||||
PORT(UART0_PHYS_ADDR, AU1000_UART0_INT),
|
||||
PORT(UART1_PHYS_ADDR, AU1000_UART1_INT),
|
||||
PORT(UART2_PHYS_ADDR, AU1000_UART2_INT),
|
||||
PORT(UART3_PHYS_ADDR, AU1000_UART3_INT),
|
||||
#elif defined(CONFIG_SOC_AU1500)
|
||||
PORT(UART0_ADDR, AU1500_UART0_INT),
|
||||
PORT(UART3_ADDR, AU1500_UART3_INT),
|
||||
PORT(UART0_PHYS_ADDR, AU1500_UART0_INT),
|
||||
PORT(UART3_PHYS_ADDR, AU1500_UART3_INT),
|
||||
#elif defined(CONFIG_SOC_AU1100)
|
||||
PORT(UART0_ADDR, AU1100_UART0_INT),
|
||||
PORT(UART1_ADDR, AU1100_UART1_INT),
|
||||
PORT(UART3_ADDR, AU1100_UART3_INT),
|
||||
PORT(UART0_PHYS_ADDR, AU1100_UART0_INT),
|
||||
PORT(UART1_PHYS_ADDR, AU1100_UART1_INT),
|
||||
PORT(UART3_PHYS_ADDR, AU1100_UART3_INT),
|
||||
#elif defined(CONFIG_SOC_AU1550)
|
||||
PORT(UART0_ADDR, AU1550_UART0_INT),
|
||||
PORT(UART1_ADDR, AU1550_UART1_INT),
|
||||
PORT(UART3_ADDR, AU1550_UART3_INT),
|
||||
PORT(UART0_PHYS_ADDR, AU1550_UART0_INT),
|
||||
PORT(UART1_PHYS_ADDR, AU1550_UART1_INT),
|
||||
PORT(UART3_PHYS_ADDR, AU1550_UART3_INT),
|
||||
#elif defined(CONFIG_SOC_AU1200)
|
||||
PORT(UART0_ADDR, AU1200_UART0_INT),
|
||||
PORT(UART1_ADDR, AU1200_UART1_INT),
|
||||
PORT(UART0_PHYS_ADDR, AU1200_UART0_INT),
|
||||
PORT(UART1_PHYS_ADDR, AU1200_UART1_INT),
|
||||
#endif
|
||||
#endif /* CONFIG_SERIAL_8250_AU1X00 */
|
||||
{ },
|
||||
|
@ -73,8 +74,8 @@ static struct resource au1xxx_usb_ohci_resources[] = {
|
|||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = AU1000_USB_HOST_INT,
|
||||
.end = AU1000_USB_HOST_INT,
|
||||
.start = FOR_PLATFORM_C_USB_HOST_INT,
|
||||
.end = FOR_PLATFORM_C_USB_HOST_INT,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
@ -132,8 +133,8 @@ static struct resource au1xxx_usb_ehci_resources[] = {
|
|||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = AU1000_USB_HOST_INT,
|
||||
.end = AU1000_USB_HOST_INT,
|
||||
.start = AU1200_USB_INT,
|
||||
.end = AU1200_USB_INT,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
@ -308,11 +309,6 @@ static struct platform_device au1200_mmc1_device = {
|
|||
#endif /* #ifndef CONFIG_MIPS_DB1200 */
|
||||
#endif /* #ifdef CONFIG_SOC_AU1200 */
|
||||
|
||||
static struct platform_device au1x00_pcmcia_device = {
|
||||
.name = "au1x00-pcmcia",
|
||||
.id = 0,
|
||||
};
|
||||
|
||||
/* All Alchemy demoboards with I2C have this #define in their headers */
|
||||
#ifdef SMBUS_PSC_BASE
|
||||
static struct resource pbdb_smbus_resources[] = {
|
||||
|
@ -331,10 +327,92 @@ static struct platform_device pbdb_smbus_device = {
|
|||
};
|
||||
#endif
|
||||
|
||||
/* Macro to help defining the Ethernet MAC resources */
|
||||
#define MAC_RES(_base, _enable, _irq) \
|
||||
{ \
|
||||
.start = CPHYSADDR(_base), \
|
||||
.end = CPHYSADDR(_base + 0xffff), \
|
||||
.flags = IORESOURCE_MEM, \
|
||||
}, \
|
||||
{ \
|
||||
.start = CPHYSADDR(_enable), \
|
||||
.end = CPHYSADDR(_enable + 0x3), \
|
||||
.flags = IORESOURCE_MEM, \
|
||||
}, \
|
||||
{ \
|
||||
.start = _irq, \
|
||||
.end = _irq, \
|
||||
.flags = IORESOURCE_IRQ \
|
||||
}
|
||||
|
||||
static struct resource au1xxx_eth0_resources[] = {
|
||||
#if defined(CONFIG_SOC_AU1000)
|
||||
MAC_RES(AU1000_ETH0_BASE, AU1000_MAC0_ENABLE, AU1000_MAC0_DMA_INT),
|
||||
#elif defined(CONFIG_SOC_AU1100)
|
||||
MAC_RES(AU1100_ETH0_BASE, AU1100_MAC0_ENABLE, AU1100_MAC0_DMA_INT),
|
||||
#elif defined(CONFIG_SOC_AU1550)
|
||||
MAC_RES(AU1550_ETH0_BASE, AU1550_MAC0_ENABLE, AU1550_MAC0_DMA_INT),
|
||||
#elif defined(CONFIG_SOC_AU1500)
|
||||
MAC_RES(AU1500_ETH0_BASE, AU1500_MAC0_ENABLE, AU1500_MAC0_DMA_INT),
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
static struct au1000_eth_platform_data au1xxx_eth0_platform_data = {
|
||||
.phy1_search_mac0 = 1,
|
||||
};
|
||||
|
||||
static struct platform_device au1xxx_eth0_device = {
|
||||
.name = "au1000-eth",
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(au1xxx_eth0_resources),
|
||||
.resource = au1xxx_eth0_resources,
|
||||
.dev.platform_data = &au1xxx_eth0_platform_data,
|
||||
};
|
||||
|
||||
#ifndef CONFIG_SOC_AU1100
|
||||
static struct resource au1xxx_eth1_resources[] = {
|
||||
#if defined(CONFIG_SOC_AU1000)
|
||||
MAC_RES(AU1000_ETH1_BASE, AU1000_MAC1_ENABLE, AU1000_MAC1_DMA_INT),
|
||||
#elif defined(CONFIG_SOC_AU1550)
|
||||
MAC_RES(AU1550_ETH1_BASE, AU1550_MAC1_ENABLE, AU1550_MAC1_DMA_INT),
|
||||
#elif defined(CONFIG_SOC_AU1500)
|
||||
MAC_RES(AU1500_ETH1_BASE, AU1500_MAC1_ENABLE, AU1500_MAC1_DMA_INT),
|
||||
#endif
|
||||
};
|
||||
|
||||
static struct au1000_eth_platform_data au1xxx_eth1_platform_data = {
|
||||
.phy1_search_mac0 = 1,
|
||||
};
|
||||
|
||||
static struct platform_device au1xxx_eth1_device = {
|
||||
.name = "au1000-eth",
|
||||
.id = 1,
|
||||
.num_resources = ARRAY_SIZE(au1xxx_eth1_resources),
|
||||
.resource = au1xxx_eth1_resources,
|
||||
.dev.platform_data = &au1xxx_eth1_platform_data,
|
||||
};
|
||||
#endif
|
||||
|
||||
void __init au1xxx_override_eth_cfg(unsigned int port,
|
||||
struct au1000_eth_platform_data *eth_data)
|
||||
{
|
||||
if (!eth_data || port > 1)
|
||||
return;
|
||||
|
||||
if (port == 0)
|
||||
memcpy(&au1xxx_eth0_platform_data, eth_data,
|
||||
sizeof(struct au1000_eth_platform_data));
|
||||
#ifndef CONFIG_SOC_AU1100
|
||||
else
|
||||
memcpy(&au1xxx_eth1_platform_data, eth_data,
|
||||
sizeof(struct au1000_eth_platform_data));
|
||||
#endif
|
||||
}
|
||||
|
||||
static struct platform_device *au1xxx_platform_devices[] __initdata = {
|
||||
&au1xx0_uart_device,
|
||||
&au1xxx_usb_ohci_device,
|
||||
&au1x00_pcmcia_device,
|
||||
#ifdef CONFIG_FB_AU1100
|
||||
&au1100_lcd_device,
|
||||
#endif
|
||||
|
@ -351,6 +429,7 @@ static struct platform_device *au1xxx_platform_devices[] __initdata = {
|
|||
#ifdef SMBUS_PSC_BASE
|
||||
&pbdb_smbus_device,
|
||||
#endif
|
||||
&au1xxx_eth0_device,
|
||||
};
|
||||
|
||||
static int __init au1xxx_platform_init(void)
|
||||
|
@ -362,6 +441,12 @@ static int __init au1xxx_platform_init(void)
|
|||
for (i = 0; au1x00_uart_data[i].flags; i++)
|
||||
au1x00_uart_data[i].uartclk = uartclk;
|
||||
|
||||
#ifndef CONFIG_SOC_AU1100
|
||||
/* Register second MAC if enabled in pinfunc */
|
||||
if (!(au_readl(SYS_PINFUNC) & (u32)SYS_PF_NI2))
|
||||
platform_device_register(&au1xxx_eth1_device);
|
||||
#endif
|
||||
|
||||
return platform_add_devices(au1xxx_platform_devices,
|
||||
ARRAY_SIZE(au1xxx_platform_devices));
|
||||
}
|
||||
|
|
|
@ -43,29 +43,15 @@ int prom_argc;
|
|||
char **prom_argv;
|
||||
char **prom_envp;
|
||||
|
||||
char * __init_or_module prom_getcmdline(void)
|
||||
{
|
||||
return &(arcs_cmdline[0]);
|
||||
}
|
||||
|
||||
void prom_init_cmdline(void)
|
||||
{
|
||||
char *cp;
|
||||
int actr;
|
||||
int i;
|
||||
|
||||
actr = 1; /* Always ignore argv[0] */
|
||||
|
||||
cp = &(arcs_cmdline[0]);
|
||||
while (actr < prom_argc) {
|
||||
strcpy(cp, prom_argv[actr]);
|
||||
cp += strlen(prom_argv[actr]);
|
||||
*cp++ = ' ';
|
||||
actr++;
|
||||
for (i = 1; i < prom_argc; i++) {
|
||||
strlcat(arcs_cmdline, prom_argv[i], COMMAND_LINE_SIZE);
|
||||
if (i < (prom_argc - 1))
|
||||
strlcat(arcs_cmdline, " ", COMMAND_LINE_SIZE);
|
||||
}
|
||||
if (cp != &(arcs_cmdline[0])) /* get rid of trailing space */
|
||||
--cp;
|
||||
if (prom_argc > 1)
|
||||
*cp = '\0';
|
||||
}
|
||||
|
||||
char *prom_getenv(char *envname)
|
||||
|
@ -121,14 +107,12 @@ static inline void str2eaddr(unsigned char *ea, unsigned char *str)
|
|||
int prom_get_ethernet_addr(char *ethernet_addr)
|
||||
{
|
||||
char *ethaddr_str;
|
||||
char *argptr;
|
||||
|
||||
/* Check the environment variables first */
|
||||
ethaddr_str = prom_getenv("ethaddr");
|
||||
if (!ethaddr_str) {
|
||||
/* Check command line */
|
||||
argptr = prom_getcmdline();
|
||||
ethaddr_str = strstr(argptr, "ethaddr=");
|
||||
ethaddr_str = strstr(arcs_cmdline, "ethaddr=");
|
||||
if (!ethaddr_str)
|
||||
return -1;
|
||||
|
||||
|
|
|
@ -1,68 +0,0 @@
|
|||
/*
|
||||
*
|
||||
* BRIEF MODULE DESCRIPTION
|
||||
* Low level UART routines to directly access Alchemy UART.
|
||||
*
|
||||
* Copyright 2001, 2008 MontaVista Software Inc.
|
||||
* Author: MontaVista Software, Inc. <source@mvista.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 SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
|
||||
* NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* 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 <asm/mach-au1x00/au1000.h>
|
||||
|
||||
#define SERIAL_BASE UART_BASE
|
||||
#define SER_CMD 0x7
|
||||
#define SER_DATA 0x1
|
||||
#define TX_BUSY 0x20
|
||||
|
||||
#define TIMEOUT 0xffffff
|
||||
#define SLOW_DOWN
|
||||
|
||||
static volatile unsigned long * const com1 = (unsigned long *)SERIAL_BASE;
|
||||
|
||||
#ifdef SLOW_DOWN
|
||||
static inline void slow_down(void)
|
||||
{
|
||||
int k;
|
||||
|
||||
for (k = 0; k < 10000; k++);
|
||||
}
|
||||
#else
|
||||
#define slow_down()
|
||||
#endif
|
||||
|
||||
void
|
||||
prom_putchar(const unsigned char c)
|
||||
{
|
||||
unsigned char ch;
|
||||
int i = 0;
|
||||
|
||||
do {
|
||||
ch = com1[SER_CMD];
|
||||
slow_down();
|
||||
i++;
|
||||
if (i > TIMEOUT)
|
||||
break;
|
||||
} while (0 == (ch & TX_BUSY));
|
||||
|
||||
com1[SER_DATA] = c;
|
||||
}
|
|
@ -1,188 +0,0 @@
|
|||
/*
|
||||
*
|
||||
* BRIEF MODULE DESCRIPTION
|
||||
* Au1xx0 reset routines.
|
||||
*
|
||||
* Copyright 2001, 2006, 2008 MontaVista Software Inc.
|
||||
* Author: MontaVista Software, Inc. <source@mvista.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 SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
|
||||
* NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
||||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* 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/gpio.h>
|
||||
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/mach-au1x00/au1000.h>
|
||||
|
||||
void au1000_restart(char *command)
|
||||
{
|
||||
/* Set all integrated peripherals to disabled states */
|
||||
extern void board_reset(void);
|
||||
u32 prid = read_c0_prid();
|
||||
|
||||
printk(KERN_NOTICE "\n** Resetting Integrated Peripherals\n");
|
||||
|
||||
switch (prid & 0xFF000000) {
|
||||
case 0x00000000: /* Au1000 */
|
||||
au_writel(0x02, 0xb0000010); /* ac97_enable */
|
||||
au_writel(0x08, 0xb017fffc); /* usbh_enable - early errata */
|
||||
asm("sync");
|
||||
au_writel(0x00, 0xb017fffc); /* usbh_enable */
|
||||
au_writel(0x00, 0xb0200058); /* usbd_enable */
|
||||
au_writel(0x00, 0xb0300040); /* ir_enable */
|
||||
au_writel(0x00, 0xb4004104); /* mac dma */
|
||||
au_writel(0x00, 0xb4004114); /* mac dma */
|
||||
au_writel(0x00, 0xb4004124); /* mac dma */
|
||||
au_writel(0x00, 0xb4004134); /* mac dma */
|
||||
au_writel(0x00, 0xb0520000); /* macen0 */
|
||||
au_writel(0x00, 0xb0520004); /* macen1 */
|
||||
au_writel(0x00, 0xb1000008); /* i2s_enable */
|
||||
au_writel(0x00, 0xb1100100); /* uart0_enable */
|
||||
au_writel(0x00, 0xb1200100); /* uart1_enable */
|
||||
au_writel(0x00, 0xb1300100); /* uart2_enable */
|
||||
au_writel(0x00, 0xb1400100); /* uart3_enable */
|
||||
au_writel(0x02, 0xb1600100); /* ssi0_enable */
|
||||
au_writel(0x02, 0xb1680100); /* ssi1_enable */
|
||||
au_writel(0x00, 0xb1900020); /* sys_freqctrl0 */
|
||||
au_writel(0x00, 0xb1900024); /* sys_freqctrl1 */
|
||||
au_writel(0x00, 0xb1900028); /* sys_clksrc */
|
||||
au_writel(0x10, 0xb1900060); /* sys_cpupll */
|
||||
au_writel(0x00, 0xb1900064); /* sys_auxpll */
|
||||
au_writel(0x00, 0xb1900100); /* sys_pininputen */
|
||||
break;
|
||||
case 0x01000000: /* Au1500 */
|
||||
au_writel(0x02, 0xb0000010); /* ac97_enable */
|
||||
au_writel(0x08, 0xb017fffc); /* usbh_enable - early errata */
|
||||
asm("sync");
|
||||
au_writel(0x00, 0xb017fffc); /* usbh_enable */
|
||||
au_writel(0x00, 0xb0200058); /* usbd_enable */
|
||||
au_writel(0x00, 0xb4004104); /* mac dma */
|
||||
au_writel(0x00, 0xb4004114); /* mac dma */
|
||||
au_writel(0x00, 0xb4004124); /* mac dma */
|
||||
au_writel(0x00, 0xb4004134); /* mac dma */
|
||||
au_writel(0x00, 0xb1520000); /* macen0 */
|
||||
au_writel(0x00, 0xb1520004); /* macen1 */
|
||||
au_writel(0x00, 0xb1100100); /* uart0_enable */
|
||||
au_writel(0x00, 0xb1400100); /* uart3_enable */
|
||||
au_writel(0x00, 0xb1900020); /* sys_freqctrl0 */
|
||||
au_writel(0x00, 0xb1900024); /* sys_freqctrl1 */
|
||||
au_writel(0x00, 0xb1900028); /* sys_clksrc */
|
||||
au_writel(0x10, 0xb1900060); /* sys_cpupll */
|
||||
au_writel(0x00, 0xb1900064); /* sys_auxpll */
|
||||
au_writel(0x00, 0xb1900100); /* sys_pininputen */
|
||||
break;
|
||||
case 0x02000000: /* Au1100 */
|
||||
au_writel(0x02, 0xb0000010); /* ac97_enable */
|
||||
au_writel(0x08, 0xb017fffc); /* usbh_enable - early errata */
|
||||
asm("sync");
|
||||
au_writel(0x00, 0xb017fffc); /* usbh_enable */
|
||||
au_writel(0x00, 0xb0200058); /* usbd_enable */
|
||||
au_writel(0x00, 0xb0300040); /* ir_enable */
|
||||
au_writel(0x00, 0xb4004104); /* mac dma */
|
||||
au_writel(0x00, 0xb4004114); /* mac dma */
|
||||
au_writel(0x00, 0xb4004124); /* mac dma */
|
||||
au_writel(0x00, 0xb4004134); /* mac dma */
|
||||
au_writel(0x00, 0xb0520000); /* macen0 */
|
||||
au_writel(0x00, 0xb1000008); /* i2s_enable */
|
||||
au_writel(0x00, 0xb1100100); /* uart0_enable */
|
||||
au_writel(0x00, 0xb1200100); /* uart1_enable */
|
||||
au_writel(0x00, 0xb1400100); /* uart3_enable */
|
||||
au_writel(0x02, 0xb1600100); /* ssi0_enable */
|
||||
au_writel(0x02, 0xb1680100); /* ssi1_enable */
|
||||
au_writel(0x00, 0xb1900020); /* sys_freqctrl0 */
|
||||
au_writel(0x00, 0xb1900024); /* sys_freqctrl1 */
|
||||
au_writel(0x00, 0xb1900028); /* sys_clksrc */
|
||||
au_writel(0x10, 0xb1900060); /* sys_cpupll */
|
||||
au_writel(0x00, 0xb1900064); /* sys_auxpll */
|
||||
au_writel(0x00, 0xb1900100); /* sys_pininputen */
|
||||
break;
|
||||
case 0x03000000: /* Au1550 */
|
||||
au_writel(0x00, 0xb1a00004); /* psc 0 */
|
||||
au_writel(0x00, 0xb1b00004); /* psc 1 */
|
||||
au_writel(0x00, 0xb0a00004); /* psc 2 */
|
||||
au_writel(0x00, 0xb0b00004); /* psc 3 */
|
||||
au_writel(0x00, 0xb017fffc); /* usbh_enable */
|
||||
au_writel(0x00, 0xb0200058); /* usbd_enable */
|
||||
au_writel(0x00, 0xb4004104); /* mac dma */
|
||||
au_writel(0x00, 0xb4004114); /* mac dma */
|
||||
au_writel(0x00, 0xb4004124); /* mac dma */
|
||||
au_writel(0x00, 0xb4004134); /* mac dma */
|
||||
au_writel(0x00, 0xb1520000); /* macen0 */
|
||||
au_writel(0x00, 0xb1520004); /* macen1 */
|
||||
au_writel(0x00, 0xb1100100); /* uart0_enable */
|
||||
au_writel(0x00, 0xb1200100); /* uart1_enable */
|
||||
au_writel(0x00, 0xb1400100); /* uart3_enable */
|
||||
au_writel(0x00, 0xb1900020); /* sys_freqctrl0 */
|
||||
au_writel(0x00, 0xb1900024); /* sys_freqctrl1 */
|
||||
au_writel(0x00, 0xb1900028); /* sys_clksrc */
|
||||
au_writel(0x10, 0xb1900060); /* sys_cpupll */
|
||||
au_writel(0x00, 0xb1900064); /* sys_auxpll */
|
||||
au_writel(0x00, 0xb1900100); /* sys_pininputen */
|
||||
break;
|
||||
}
|
||||
|
||||
set_c0_status(ST0_BEV | ST0_ERL);
|
||||
change_c0_config(CONF_CM_CMASK, CONF_CM_UNCACHED);
|
||||
flush_cache_all();
|
||||
write_c0_wired(0);
|
||||
|
||||
/* Give board a chance to do a hardware reset */
|
||||
board_reset();
|
||||
|
||||
/* Jump to the beggining in case board_reset() is empty */
|
||||
__asm__ __volatile__("jr\t%0"::"r"(0xbfc00000));
|
||||
}
|
||||
|
||||
void au1000_halt(void)
|
||||
{
|
||||
#if defined(CONFIG_MIPS_PB1550) || defined(CONFIG_MIPS_DB1550)
|
||||
/* Power off system */
|
||||
printk(KERN_NOTICE "\n** Powering off...\n");
|
||||
au_writew(au_readw(0xAF00001C) | (3 << 14), 0xAF00001C);
|
||||
au_sync();
|
||||
while (1); /* should not get here */
|
||||
#else
|
||||
printk(KERN_NOTICE "\n** You can safely turn off the power\n");
|
||||
#ifdef CONFIG_MIPS_MIRAGE
|
||||
gpio_direction_output(210, 1);
|
||||
#endif
|
||||
#ifdef CONFIG_MIPS_DB1200
|
||||
au_writew(au_readw(0xB980001C) | (1 << 14), 0xB980001C);
|
||||
#endif
|
||||
#ifdef CONFIG_PM
|
||||
au_sleep();
|
||||
|
||||
/* Should not get here */
|
||||
printk(KERN_ERR "Unable to put CPU in sleep mode\n");
|
||||
while (1);
|
||||
#else
|
||||
while (1)
|
||||
__asm__(".set\tmips3\n\t"
|
||||
"wait\n\t"
|
||||
".set\tmips0");
|
||||
#endif
|
||||
#endif /* defined(CONFIG_MIPS_PB1550) || defined(CONFIG_MIPS_DB1550) */
|
||||
}
|
||||
|
||||
void au1000_power_off(void)
|
||||
{
|
||||
au1000_halt();
|
||||
}
|
|
@ -29,18 +29,13 @@
|
|||
#include <linux/ioport.h>
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/pm.h>
|
||||
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/reboot.h>
|
||||
#include <asm/time.h>
|
||||
|
||||
#include <au1000.h>
|
||||
|
||||
extern void __init board_setup(void);
|
||||
extern void au1000_restart(char *);
|
||||
extern void au1000_halt(void);
|
||||
extern void au1000_power_off(void);
|
||||
extern void set_cpuspec(void);
|
||||
|
||||
void __init plat_mem_setup(void)
|
||||
|
@ -57,10 +52,6 @@ void __init plat_mem_setup(void)
|
|||
/* this is faster than wasting cycles trying to approximate it */
|
||||
preset_lpj = (est_freq >> 1) / HZ;
|
||||
|
||||
_machine_restart = au1000_restart;
|
||||
_machine_halt = au1000_halt;
|
||||
pm_power_off = au1000_power_off;
|
||||
|
||||
board_setup(); /* board specific setup */
|
||||
|
||||
if (au1xxx_cpu_needs_config_od())
|
||||
|
@ -78,37 +69,20 @@ void __init plat_mem_setup(void)
|
|||
iomem_resource.end = IOMEM_RESOURCE_END;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_64BIT_PHYS_ADDR)
|
||||
#if defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_PCI)
|
||||
/* This routine should be valid for all Au1x based boards */
|
||||
phys_t __fixup_bigphys_addr(phys_t phys_addr, phys_t size)
|
||||
{
|
||||
u32 start = (u32)Au1500_PCI_MEM_START;
|
||||
u32 end = (u32)Au1500_PCI_MEM_END;
|
||||
|
||||
/* Don't fixup 36-bit addresses */
|
||||
if ((phys_addr >> 32) != 0)
|
||||
return phys_addr;
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
{
|
||||
u32 start = (u32)Au1500_PCI_MEM_START;
|
||||
u32 end = (u32)Au1500_PCI_MEM_END;
|
||||
|
||||
/* Check for PCI memory window */
|
||||
if (phys_addr >= start && (phys_addr + size - 1) <= end)
|
||||
return (phys_t)
|
||||
((phys_addr - start) + Au1500_PCI_MEM_START);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* All Au1xx0 SOCs have a PCMCIA controller.
|
||||
* We setup our 32-bit pseudo addresses to be equal to the
|
||||
* 36-bit addr >> 4, to make it easier to check the address
|
||||
* and fix it.
|
||||
* The PCMCIA socket 0 physical attribute address is 0xF 4000 0000.
|
||||
* The pseudo address we use is 0xF400 0000. Any address over
|
||||
* 0xF400 0000 is a PCMCIA pseudo address.
|
||||
*/
|
||||
if ((phys_addr >= 0xF4000000) && (phys_addr < 0xFFFFFFFF))
|
||||
return (phys_t)(phys_addr << 4);
|
||||
/* Check for PCI memory window */
|
||||
if (phys_addr >= start && (phys_addr + size - 1) <= end)
|
||||
return (phys_t)((phys_addr - start) + Au1500_PCI_MEM_START);
|
||||
|
||||
/* default nop */
|
||||
return phys_addr;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2008 Manuel Lauss <mano@roarinelk.homelinux.net>
|
||||
* Copyright (C) 2008-2009 Manuel Lauss <manuel.lauss@gmail.com>
|
||||
*
|
||||
* Previous incarnations were:
|
||||
* Copyright (C) 2001, 2006, 2008 MontaVista Software, <source@mvista.com>
|
||||
|
@ -85,7 +85,6 @@ static struct clock_event_device au1x_rtcmatch2_clockdev = {
|
|||
.name = "rtcmatch2",
|
||||
.features = CLOCK_EVT_FEAT_ONESHOT,
|
||||
.rating = 100,
|
||||
.irq = AU1000_RTC_MATCH2_INT,
|
||||
.set_next_event = au1x_rtcmatch2_set_next_event,
|
||||
.set_mode = au1x_rtcmatch2_set_mode,
|
||||
.cpumask = cpu_all_mask,
|
||||
|
@ -98,11 +97,13 @@ static struct irqaction au1x_rtcmatch2_irqaction = {
|
|||
.dev_id = &au1x_rtcmatch2_clockdev,
|
||||
};
|
||||
|
||||
void __init plat_time_init(void)
|
||||
static int __init alchemy_time_init(unsigned int m2int)
|
||||
{
|
||||
struct clock_event_device *cd = &au1x_rtcmatch2_clockdev;
|
||||
unsigned long t;
|
||||
|
||||
au1x_rtcmatch2_clockdev.irq = m2int;
|
||||
|
||||
/* Check if firmware (YAMON, ...) has enabled 32kHz and clock
|
||||
* has been detected. If so install the rtcmatch2 clocksource,
|
||||
* otherwise don't bother. Note that both bits being set is by
|
||||
|
@ -148,13 +149,18 @@ void __init plat_time_init(void)
|
|||
cd->max_delta_ns = clockevent_delta2ns(0xffffffff, cd);
|
||||
cd->min_delta_ns = clockevent_delta2ns(8, cd); /* ~0.25ms */
|
||||
clockevents_register_device(cd);
|
||||
setup_irq(AU1000_RTC_MATCH2_INT, &au1x_rtcmatch2_irqaction);
|
||||
setup_irq(m2int, &au1x_rtcmatch2_irqaction);
|
||||
|
||||
printk(KERN_INFO "Alchemy clocksource installed\n");
|
||||
|
||||
return;
|
||||
return 0;
|
||||
|
||||
cntr_err:
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void __init alchemy_setup_c0timer(void)
|
||||
{
|
||||
/*
|
||||
* MIPS kernel assigns 'au1k_wait' to 'cpu_wait' before this
|
||||
* function is called. Because the Alchemy counters are unusable
|
||||
|
@ -166,3 +172,22 @@ cntr_err:
|
|||
r4k_clockevent_init();
|
||||
init_r4k_clocksource();
|
||||
}
|
||||
|
||||
static int alchemy_m2inttab[] __initdata = {
|
||||
AU1000_RTC_MATCH2_INT,
|
||||
AU1500_RTC_MATCH2_INT,
|
||||
AU1100_RTC_MATCH2_INT,
|
||||
AU1550_RTC_MATCH2_INT,
|
||||
AU1200_RTC_MATCH2_INT,
|
||||
};
|
||||
|
||||
void __init plat_time_init(void)
|
||||
{
|
||||
int t;
|
||||
|
||||
t = alchemy_get_cputype();
|
||||
if (t == ALCHEMY_CPU_UNKNOWN)
|
||||
alchemy_setup_c0timer();
|
||||
else if (alchemy_time_init(alchemy_m2inttab[t]))
|
||||
alchemy_setup_c0timer();
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
# Alchemy Develboards
|
||||
#
|
||||
|
||||
obj-y += prom.o
|
||||
obj-y += prom.o bcsr.o platform.o
|
||||
obj-$(CONFIG_PM) += pm.o
|
||||
obj-$(CONFIG_MIPS_PB1000) += pb1000/
|
||||
obj-$(CONFIG_MIPS_PB1100) += pb1100/
|
||||
|
@ -11,8 +11,10 @@ obj-$(CONFIG_MIPS_PB1500) += pb1500/
|
|||
obj-$(CONFIG_MIPS_PB1550) += pb1550/
|
||||
obj-$(CONFIG_MIPS_DB1000) += db1x00/
|
||||
obj-$(CONFIG_MIPS_DB1100) += db1x00/
|
||||
obj-$(CONFIG_MIPS_DB1200) += pb1200/
|
||||
obj-$(CONFIG_MIPS_DB1200) += db1200/
|
||||
obj-$(CONFIG_MIPS_DB1500) += db1x00/
|
||||
obj-$(CONFIG_MIPS_DB1550) += db1x00/
|
||||
obj-$(CONFIG_MIPS_BOSPORUS) += db1x00/
|
||||
obj-$(CONFIG_MIPS_MIRAGE) += db1x00/
|
||||
|
||||
EXTRA_CFLAGS += -Werror
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue