commit
b3539219c9
|
@ -44,9 +44,9 @@ running, the suggested command should tell you.
|
||||||
|
|
||||||
Again, keep in mind that this list assumes you are already
|
Again, keep in mind that this list assumes you are already
|
||||||
functionally running a Linux 2.4 kernel. Also, not all tools are
|
functionally running a Linux 2.4 kernel. Also, not all tools are
|
||||||
necessary on all systems; obviously, if you don't have any PCMCIA (PC
|
necessary on all systems; obviously, if you don't have any ISDN
|
||||||
Card) hardware, for example, you probably needn't concern yourself
|
hardware, for example, you probably needn't concern yourself with
|
||||||
with pcmcia-cs.
|
isdn4k-utils.
|
||||||
|
|
||||||
o Gnu C 2.95.3 # gcc --version
|
o Gnu C 2.95.3 # gcc --version
|
||||||
o Gnu make 3.79.1 # make --version
|
o Gnu make 3.79.1 # make --version
|
||||||
|
@ -57,6 +57,7 @@ o e2fsprogs 1.29 # tune2fs
|
||||||
o jfsutils 1.1.3 # fsck.jfs -V
|
o jfsutils 1.1.3 # fsck.jfs -V
|
||||||
o reiserfsprogs 3.6.3 # reiserfsck -V 2>&1|grep reiserfsprogs
|
o reiserfsprogs 3.6.3 # reiserfsck -V 2>&1|grep reiserfsprogs
|
||||||
o xfsprogs 2.6.0 # xfs_db -V
|
o xfsprogs 2.6.0 # xfs_db -V
|
||||||
|
o pcmciautils 004
|
||||||
o pcmcia-cs 3.1.21 # cardmgr -V
|
o pcmcia-cs 3.1.21 # cardmgr -V
|
||||||
o quota-tools 3.09 # quota -V
|
o quota-tools 3.09 # quota -V
|
||||||
o PPP 2.4.0 # pppd --version
|
o PPP 2.4.0 # pppd --version
|
||||||
|
@ -186,13 +187,20 @@ architecture independent and any version from 2.0.0 onward should
|
||||||
work correctly with this version of the XFS kernel code (2.6.0 or
|
work correctly with this version of the XFS kernel code (2.6.0 or
|
||||||
later is recommended, due to some significant improvements).
|
later is recommended, due to some significant improvements).
|
||||||
|
|
||||||
|
PCMCIAutils
|
||||||
|
-----------
|
||||||
|
|
||||||
|
PCMCIAutils replaces pcmcia-cs (see below). It properly sets up
|
||||||
|
PCMCIA sockets at system startup and loads the appropriate modules
|
||||||
|
for 16-bit PCMCIA devices if the kernel is modularized and the hotplug
|
||||||
|
subsystem is used.
|
||||||
|
|
||||||
Pcmcia-cs
|
Pcmcia-cs
|
||||||
---------
|
---------
|
||||||
|
|
||||||
PCMCIA (PC Card) support is now partially implemented in the main
|
PCMCIA (PC Card) support is now partially implemented in the main
|
||||||
kernel source. Pay attention when you recompile your kernel ;-).
|
kernel source. The "pcmciautils" package (see above) replaces pcmcia-cs
|
||||||
Also, be sure to upgrade to the latest pcmcia-cs release.
|
for newest kernels.
|
||||||
|
|
||||||
Quota-tools
|
Quota-tools
|
||||||
-----------
|
-----------
|
||||||
|
@ -349,9 +357,13 @@ Xfsprogs
|
||||||
--------
|
--------
|
||||||
o <ftp://oss.sgi.com/projects/xfs/download/>
|
o <ftp://oss.sgi.com/projects/xfs/download/>
|
||||||
|
|
||||||
|
Pcmciautils
|
||||||
|
-----------
|
||||||
|
o <ftp://ftp.kernel.org/pub/linux/utils/kernel/pcmcia/>
|
||||||
|
|
||||||
Pcmcia-cs
|
Pcmcia-cs
|
||||||
---------
|
---------
|
||||||
o <ftp://pcmcia-cs.sourceforge.net/pub/pcmcia-cs/pcmcia-cs-3.1.21.tar.gz>
|
o <http://pcmcia-cs.sourceforge.net/>
|
||||||
|
|
||||||
Quota-tools
|
Quota-tools
|
||||||
----------
|
----------
|
||||||
|
|
|
@ -84,6 +84,14 @@ void (*port_disable) (struct ata_port *);
|
||||||
Called from ata_bus_probe() and ata_bus_reset() error paths,
|
Called from ata_bus_probe() and ata_bus_reset() error paths,
|
||||||
as well as when unregistering from the SCSI module (rmmod, hot
|
as well as when unregistering from the SCSI module (rmmod, hot
|
||||||
unplug).
|
unplug).
|
||||||
|
This function should do whatever needs to be done to take the
|
||||||
|
port out of use. In most cases, ata_port_disable() can be used
|
||||||
|
as this hook.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Called from ata_bus_probe() on a failed probe.
|
||||||
|
Called from ata_bus_reset() on a failed bus reset.
|
||||||
|
Called from ata_scsi_release().
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
</sect2>
|
</sect2>
|
||||||
|
@ -98,6 +106,13 @@ void (*dev_config) (struct ata_port *, struct ata_device *);
|
||||||
found. Typically used to apply device-specific fixups prior to
|
found. Typically used to apply device-specific fixups prior to
|
||||||
issue of SET FEATURES - XFER MODE, and prior to operation.
|
issue of SET FEATURES - XFER MODE, and prior to operation.
|
||||||
</para>
|
</para>
|
||||||
|
<para>
|
||||||
|
Called by ata_device_add() after ata_dev_identify() determines
|
||||||
|
a device is present.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
This entry may be specified as NULL in ata_port_operations.
|
||||||
|
</para>
|
||||||
|
|
||||||
</sect2>
|
</sect2>
|
||||||
|
|
||||||
|
@ -135,6 +150,8 @@ void (*tf_read) (struct ata_port *ap, struct ata_taskfile *tf);
|
||||||
registers / DMA buffers. ->tf_read() is called to read the
|
registers / DMA buffers. ->tf_read() is called to read the
|
||||||
hardware registers / DMA buffers, to obtain the current set of
|
hardware registers / DMA buffers, to obtain the current set of
|
||||||
taskfile register values.
|
taskfile register values.
|
||||||
|
Most drivers for taskfile-based hardware (PIO or MMIO) use
|
||||||
|
ata_tf_load() and ata_tf_read() for these hooks.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
</sect2>
|
</sect2>
|
||||||
|
@ -147,6 +164,8 @@ void (*exec_command)(struct ata_port *ap, struct ata_taskfile *tf);
|
||||||
<para>
|
<para>
|
||||||
causes an ATA command, previously loaded with
|
causes an ATA command, previously loaded with
|
||||||
->tf_load(), to be initiated in hardware.
|
->tf_load(), to be initiated in hardware.
|
||||||
|
Most drivers for taskfile-based hardware use ata_exec_command()
|
||||||
|
for this hook.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
</sect2>
|
</sect2>
|
||||||
|
@ -161,6 +180,10 @@ Allow low-level driver to filter ATA PACKET commands, returning a status
|
||||||
indicating whether or not it is OK to use DMA for the supplied PACKET
|
indicating whether or not it is OK to use DMA for the supplied PACKET
|
||||||
command.
|
command.
|
||||||
</para>
|
</para>
|
||||||
|
<para>
|
||||||
|
This hook may be specified as NULL, in which case libata will
|
||||||
|
assume that atapi dma can be supported.
|
||||||
|
</para>
|
||||||
|
|
||||||
</sect2>
|
</sect2>
|
||||||
|
|
||||||
|
@ -175,6 +198,14 @@ u8 (*check_err)(struct ata_port *ap);
|
||||||
Reads the Status/AltStatus/Error ATA shadow register from
|
Reads the Status/AltStatus/Error ATA shadow register from
|
||||||
hardware. On some hardware, reading the Status register has
|
hardware. On some hardware, reading the Status register has
|
||||||
the side effect of clearing the interrupt condition.
|
the side effect of clearing the interrupt condition.
|
||||||
|
Most drivers for taskfile-based hardware use
|
||||||
|
ata_check_status() for this hook.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Note that because this is called from ata_device_add(), at
|
||||||
|
least a dummy function that clears device interrupts must be
|
||||||
|
provided for all drivers, even if the controller doesn't
|
||||||
|
actually have a taskfile status register.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
</sect2>
|
</sect2>
|
||||||
|
@ -188,7 +219,13 @@ void (*dev_select)(struct ata_port *ap, unsigned int device);
|
||||||
Issues the low-level hardware command(s) that causes one of N
|
Issues the low-level hardware command(s) that causes one of N
|
||||||
hardware devices to be considered 'selected' (active and
|
hardware devices to be considered 'selected' (active and
|
||||||
available for use) on the ATA bus. This generally has no
|
available for use) on the ATA bus. This generally has no
|
||||||
meaning on FIS-based devices.
|
meaning on FIS-based devices.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Most drivers for taskfile-based hardware use
|
||||||
|
ata_std_dev_select() for this hook. Controllers which do not
|
||||||
|
support second drives on a port (such as SATA contollers) will
|
||||||
|
use ata_noop_dev_select().
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
</sect2>
|
</sect2>
|
||||||
|
@ -204,6 +241,8 @@ void (*phy_reset) (struct ata_port *ap);
|
||||||
for device presence (PATA and SATA), typically a soft reset
|
for device presence (PATA and SATA), typically a soft reset
|
||||||
(SRST) will be performed. Drivers typically use the helper
|
(SRST) will be performed. Drivers typically use the helper
|
||||||
functions ata_bus_reset() or sata_phy_reset() for this hook.
|
functions ata_bus_reset() or sata_phy_reset() for this hook.
|
||||||
|
Many SATA drivers use sata_phy_reset() or call it from within
|
||||||
|
their own phy_reset() functions.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
</sect2>
|
</sect2>
|
||||||
|
@ -227,6 +266,25 @@ PCI IDE DMA Status register.
|
||||||
These hooks are typically either no-ops, or simply not implemented, in
|
These hooks are typically either no-ops, or simply not implemented, in
|
||||||
FIS-based drivers.
|
FIS-based drivers.
|
||||||
</para>
|
</para>
|
||||||
|
<para>
|
||||||
|
Most legacy IDE drivers use ata_bmdma_setup() for the bmdma_setup()
|
||||||
|
hook. ata_bmdma_setup() will write the pointer to the PRD table to
|
||||||
|
the IDE PRD Table Address register, enable DMA in the DMA Command
|
||||||
|
register, and call exec_command() to begin the transfer.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Most legacy IDE drivers use ata_bmdma_start() for the bmdma_start()
|
||||||
|
hook. ata_bmdma_start() will write the ATA_DMA_START flag to the DMA
|
||||||
|
Command register.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Many legacy IDE drivers use ata_bmdma_stop() for the bmdma_stop()
|
||||||
|
hook. ata_bmdma_stop() clears the ATA_DMA_START flag in the DMA
|
||||||
|
command register.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Many legacy IDE drivers use ata_bmdma_status() as the bmdma_status() hook.
|
||||||
|
</para>
|
||||||
|
|
||||||
</sect2>
|
</sect2>
|
||||||
|
|
||||||
|
@ -250,6 +308,10 @@ int (*qc_issue) (struct ata_queued_cmd *qc);
|
||||||
helper function ata_qc_issue_prot() for taskfile protocol-based
|
helper function ata_qc_issue_prot() for taskfile protocol-based
|
||||||
dispatch. More advanced drivers implement their own ->qc_issue.
|
dispatch. More advanced drivers implement their own ->qc_issue.
|
||||||
</para>
|
</para>
|
||||||
|
<para>
|
||||||
|
ata_qc_issue_prot() calls ->tf_load(), ->bmdma_setup(), and
|
||||||
|
->bmdma_start() as necessary to initiate a transfer.
|
||||||
|
</para>
|
||||||
|
|
||||||
</sect2>
|
</sect2>
|
||||||
|
|
||||||
|
@ -279,6 +341,21 @@ void (*irq_clear) (struct ata_port *);
|
||||||
before the interrupt handler is registered, to be sure hardware
|
before the interrupt handler is registered, to be sure hardware
|
||||||
is quiet.
|
is quiet.
|
||||||
</para>
|
</para>
|
||||||
|
<para>
|
||||||
|
The second argument, dev_instance, should be cast to a pointer
|
||||||
|
to struct ata_host_set.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Most legacy IDE drivers use ata_interrupt() for the
|
||||||
|
irq_handler hook, which scans all ports in the host_set,
|
||||||
|
determines which queued command was active (if any), and calls
|
||||||
|
ata_host_intr(ap,qc).
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Most legacy IDE drivers use ata_bmdma_irq_clear() for the
|
||||||
|
irq_clear() hook, which simply clears the interrupt and error
|
||||||
|
flags in the DMA status register.
|
||||||
|
</para>
|
||||||
|
|
||||||
</sect2>
|
</sect2>
|
||||||
|
|
||||||
|
@ -292,6 +369,7 @@ void (*scr_write) (struct ata_port *ap, unsigned int sc_reg,
|
||||||
<para>
|
<para>
|
||||||
Read and write standard SATA phy registers. Currently only used
|
Read and write standard SATA phy registers. Currently only used
|
||||||
if ->phy_reset hook called the sata_phy_reset() helper function.
|
if ->phy_reset hook called the sata_phy_reset() helper function.
|
||||||
|
sc_reg is one of SCR_STATUS, SCR_CONTROL, SCR_ERROR, or SCR_ACTIVE.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
</sect2>
|
</sect2>
|
||||||
|
@ -307,17 +385,29 @@ void (*host_stop) (struct ata_host_set *host_set);
|
||||||
->port_start() is called just after the data structures for each
|
->port_start() is called just after the data structures for each
|
||||||
port are initialized. Typically this is used to alloc per-port
|
port are initialized. Typically this is used to alloc per-port
|
||||||
DMA buffers / tables / rings, enable DMA engines, and similar
|
DMA buffers / tables / rings, enable DMA engines, and similar
|
||||||
tasks.
|
tasks. Some drivers also use this entry point as a chance to
|
||||||
|
allocate driver-private memory for ap->private_data.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Many drivers use ata_port_start() as this hook or call
|
||||||
|
it from their own port_start() hooks. ata_port_start()
|
||||||
|
allocates space for a legacy IDE PRD table and returns.
|
||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
->port_stop() is called after ->host_stop(). It's sole function
|
->port_stop() is called after ->host_stop(). It's sole function
|
||||||
is to release DMA/memory resources, now that they are no longer
|
is to release DMA/memory resources, now that they are no longer
|
||||||
actively being used.
|
actively being used. Many drivers also free driver-private
|
||||||
|
data from port at this time.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Many drivers use ata_port_stop() as this hook, which frees the
|
||||||
|
PRD table.
|
||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
->host_stop() is called after all ->port_stop() calls
|
->host_stop() is called after all ->port_stop() calls
|
||||||
have completed. The hook must finalize hardware shutdown, release DMA
|
have completed. The hook must finalize hardware shutdown, release DMA
|
||||||
and other resources, etc.
|
and other resources, etc.
|
||||||
|
This hook may be specified as NULL, in which case it is not called.
|
||||||
</para>
|
</para>
|
||||||
|
|
||||||
</sect2>
|
</sect2>
|
||||||
|
|
|
@ -13,13 +13,14 @@ Allocating Device Numbers
|
||||||
-------------------------
|
-------------------------
|
||||||
|
|
||||||
Major and minor numbers for block and character devices are allocated
|
Major and minor numbers for block and character devices are allocated
|
||||||
by the Linux assigned name and number authority (currently better
|
by the Linux assigned name and number authority (currently this is
|
||||||
known as H Peter Anvin). The site is http://www.lanana.org/. This
|
Torben Mathiasen). The site is http://www.lanana.org/. This
|
||||||
also deals with allocating numbers for devices that are not going to
|
also deals with allocating numbers for devices that are not going to
|
||||||
be submitted to the mainstream kernel.
|
be submitted to the mainstream kernel.
|
||||||
|
See Documentation/devices.txt for more information on this.
|
||||||
|
|
||||||
If you don't use assigned numbers then when you device is submitted it will
|
If you don't use assigned numbers then when your device is submitted it will
|
||||||
get given an assigned number even if that is different from values you may
|
be given an assigned number even if that is different from values you may
|
||||||
have shipped to customers before.
|
have shipped to customers before.
|
||||||
|
|
||||||
Who To Submit Drivers To
|
Who To Submit Drivers To
|
||||||
|
@ -32,7 +33,8 @@ Linux 2.2:
|
||||||
If the code area has a general maintainer then please submit it to
|
If the code area has a general maintainer then please submit it to
|
||||||
the maintainer listed in MAINTAINERS in the kernel file. If the
|
the maintainer listed in MAINTAINERS in the kernel file. If the
|
||||||
maintainer does not respond or you cannot find the appropriate
|
maintainer does not respond or you cannot find the appropriate
|
||||||
maintainer then please contact Alan Cox <alan@lxorguk.ukuu.org.uk>
|
maintainer then please contact the 2.2 kernel maintainer:
|
||||||
|
Marc-Christian Petersen <m.c.p@wolk-project.de>.
|
||||||
|
|
||||||
Linux 2.4:
|
Linux 2.4:
|
||||||
The same rules apply as 2.2. The final contact point for Linux 2.4
|
The same rules apply as 2.2. The final contact point for Linux 2.4
|
||||||
|
@ -48,7 +50,7 @@ What Criteria Determine Acceptance
|
||||||
|
|
||||||
Licensing: The code must be released to us under the
|
Licensing: The code must be released to us under the
|
||||||
GNU General Public License. We don't insist on any kind
|
GNU General Public License. We don't insist on any kind
|
||||||
of exclusively GPL licensing, and if you wish the driver
|
of exclusive GPL licensing, and if you wish the driver
|
||||||
to be useful to other communities such as BSD you may well
|
to be useful to other communities such as BSD you may well
|
||||||
wish to release under multiple licenses.
|
wish to release under multiple licenses.
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@ not in any lower subdirectory.
|
||||||
|
|
||||||
To create a patch for a single file, it is often sufficient to do:
|
To create a patch for a single file, it is often sufficient to do:
|
||||||
|
|
||||||
SRCTREE= linux-2.4
|
SRCTREE= linux-2.6
|
||||||
MYFILE= drivers/net/mydriver.c
|
MYFILE= drivers/net/mydriver.c
|
||||||
|
|
||||||
cd $SRCTREE
|
cd $SRCTREE
|
||||||
|
@ -48,17 +48,18 @@ To create a patch for multiple files, you should unpack a "vanilla",
|
||||||
or unmodified kernel source tree, and generate a diff against your
|
or unmodified kernel source tree, and generate a diff against your
|
||||||
own source tree. For example:
|
own source tree. For example:
|
||||||
|
|
||||||
MYSRC= /devel/linux-2.4
|
MYSRC= /devel/linux-2.6
|
||||||
|
|
||||||
tar xvfz linux-2.4.0-test11.tar.gz
|
tar xvfz linux-2.6.12.tar.gz
|
||||||
mv linux linux-vanilla
|
mv linux-2.6.12 linux-2.6.12-vanilla
|
||||||
wget http://www.moses.uklinux.net/patches/dontdiff
|
diff -uprN -X linux-2.6.12-vanilla/Documentation/dontdiff \
|
||||||
diff -uprN -X dontdiff linux-vanilla $MYSRC > /tmp/patch
|
linux-2.6.12-vanilla $MYSRC > /tmp/patch
|
||||||
rm -f dontdiff
|
|
||||||
|
|
||||||
"dontdiff" is a list of files which are generated by the kernel during
|
"dontdiff" is a list of files which are generated by the kernel during
|
||||||
the build process, and should be ignored in any diff(1)-generated
|
the build process, and should be ignored in any diff(1)-generated
|
||||||
patch. dontdiff is maintained by Tigran Aivazian <tigran@veritas.com>
|
patch. The "dontdiff" file is included in the kernel tree in
|
||||||
|
2.6.12 and later. For earlier kernel versions, you can get it
|
||||||
|
from <http://www.xenotime.net/linux/doc/dontdiff>.
|
||||||
|
|
||||||
Make sure your patch does not include any extra files which do not
|
Make sure your patch does not include any extra files which do not
|
||||||
belong in a patch submission. Make sure to review your patch -after-
|
belong in a patch submission. Make sure to review your patch -after-
|
||||||
|
@ -66,18 +67,20 @@ generated it with diff(1), to ensure accuracy.
|
||||||
|
|
||||||
If your changes produce a lot of deltas, you may want to look into
|
If your changes produce a lot of deltas, you may want to look into
|
||||||
splitting them into individual patches which modify things in
|
splitting them into individual patches which modify things in
|
||||||
logical stages, this will facilitate easier reviewing by other
|
logical stages. This will facilitate easier reviewing by other
|
||||||
kernel developers, very important if you want your patch accepted.
|
kernel developers, very important if you want your patch accepted.
|
||||||
There are a number of scripts which can aid in this;
|
There are a number of scripts which can aid in this:
|
||||||
|
|
||||||
Quilt:
|
Quilt:
|
||||||
http://savannah.nongnu.org/projects/quilt
|
http://savannah.nongnu.org/projects/quilt
|
||||||
|
|
||||||
Randy Dunlap's patch scripts:
|
Randy Dunlap's patch scripts:
|
||||||
http://developer.osdl.org/rddunlap/scripts/patching-scripts.tgz
|
http://www.xenotime.net/linux/scripts/patching-scripts-002.tar.gz
|
||||||
|
|
||||||
Andrew Morton's patch scripts:
|
Andrew Morton's patch scripts:
|
||||||
http://www.zip.com.au/~akpm/linux/patches/patch-scripts-0.16
|
http://www.zip.com.au/~akpm/linux/patches/patch-scripts-0.20
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
2) Describe your changes.
|
2) Describe your changes.
|
||||||
|
|
||||||
|
@ -163,6 +166,8 @@ patches. Trivial patches must qualify for one of the following rules:
|
||||||
since people copy, as long as it's trivial)
|
since people copy, as long as it's trivial)
|
||||||
Any fix by the author/maintainer of the file. (ie. patch monkey
|
Any fix by the author/maintainer of the file. (ie. patch monkey
|
||||||
in re-transmission mode)
|
in re-transmission mode)
|
||||||
|
URL: <http://www.kernel.org/pub/linux/kernel/people/rusty/trivial/>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -291,6 +296,17 @@ now, but you can do this to mark internal company procedures or just
|
||||||
point out some special detail about the sign-off.
|
point out some special detail about the sign-off.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
12) More references for submitting patches
|
||||||
|
|
||||||
|
Andrew Morton, "The perfect patch" (tpp).
|
||||||
|
<http://www.zip.com.au/~akpm/linux/patches/stuff/tpp.txt>
|
||||||
|
|
||||||
|
Jeff Garzik, "Linux kernel patch submission format."
|
||||||
|
<http://linux.yyz.us/patch-format.html>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
SECTION 2 - HINTS, TIPS, AND TRICKS
|
SECTION 2 - HINTS, TIPS, AND TRICKS
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
|
@ -359,7 +375,5 @@ and 'extern __inline__'.
|
||||||
4) Don't over-design.
|
4) Don't over-design.
|
||||||
|
|
||||||
Don't try to anticipate nebulous future cases which may or may not
|
Don't try to anticipate nebulous future cases which may or may not
|
||||||
be useful: "Make it as simple as you can, and no simpler"
|
be useful: "Make it as simple as you can, and no simpler."
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,176 @@
|
||||||
|
Block io priorities
|
||||||
|
===================
|
||||||
|
|
||||||
|
|
||||||
|
Intro
|
||||||
|
-----
|
||||||
|
|
||||||
|
With the introduction of cfq v3 (aka cfq-ts or time sliced cfq), basic io
|
||||||
|
priorities is supported for reads on files. This enables users to io nice
|
||||||
|
processes or process groups, similar to what has been possible to cpu
|
||||||
|
scheduling for ages. This document mainly details the current possibilites
|
||||||
|
with cfq, other io schedulers do not support io priorities so far.
|
||||||
|
|
||||||
|
Scheduling classes
|
||||||
|
------------------
|
||||||
|
|
||||||
|
CFQ implements three generic scheduling classes that determine how io is
|
||||||
|
served for a process.
|
||||||
|
|
||||||
|
IOPRIO_CLASS_RT: This is the realtime io class. This scheduling class is given
|
||||||
|
higher priority than any other in the system, processes from this class are
|
||||||
|
given first access to the disk every time. Thus it needs to be used with some
|
||||||
|
care, one io RT process can starve the entire system. Within the RT class,
|
||||||
|
there are 8 levels of class data that determine exactly how much time this
|
||||||
|
process needs the disk for on each service. In the future this might change
|
||||||
|
to be more directly mappable to performance, by passing in a wanted data
|
||||||
|
rate instead.
|
||||||
|
|
||||||
|
IOPRIO_CLASS_BE: This is the best-effort scheduling class, which is the default
|
||||||
|
for any process that hasn't set a specific io priority. The class data
|
||||||
|
determines how much io bandwidth the process will get, it's directly mappable
|
||||||
|
to the cpu nice levels just more coarsely implemented. 0 is the highest
|
||||||
|
BE prio level, 7 is the lowest. The mapping between cpu nice level and io
|
||||||
|
nice level is determined as: io_nice = (cpu_nice + 20) / 5.
|
||||||
|
|
||||||
|
IOPRIO_CLASS_IDLE: This is the idle scheduling class, processes running at this
|
||||||
|
level only get io time when no one else needs the disk. The idle class has no
|
||||||
|
class data, since it doesn't really apply here.
|
||||||
|
|
||||||
|
Tools
|
||||||
|
-----
|
||||||
|
|
||||||
|
See below for a sample ionice tool. Usage:
|
||||||
|
|
||||||
|
# ionice -c<class> -n<level> -p<pid>
|
||||||
|
|
||||||
|
If pid isn't given, the current process is assumed. IO priority settings
|
||||||
|
are inherited on fork, so you can use ionice to start the process at a given
|
||||||
|
level:
|
||||||
|
|
||||||
|
# ionice -c2 -n0 /bin/ls
|
||||||
|
|
||||||
|
will run ls at the best-effort scheduling class at the highest priority.
|
||||||
|
For a running process, you can give the pid instead:
|
||||||
|
|
||||||
|
# ionice -c1 -n2 -p100
|
||||||
|
|
||||||
|
will change pid 100 to run at the realtime scheduling class, at priority 2.
|
||||||
|
|
||||||
|
---> snip ionice.c tool <---
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <getopt.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/ptrace.h>
|
||||||
|
#include <asm/unistd.h>
|
||||||
|
|
||||||
|
extern int sys_ioprio_set(int, int, int);
|
||||||
|
extern int sys_ioprio_get(int, int);
|
||||||
|
|
||||||
|
#if defined(__i386__)
|
||||||
|
#define __NR_ioprio_set 289
|
||||||
|
#define __NR_ioprio_get 290
|
||||||
|
#elif defined(__ppc__)
|
||||||
|
#define __NR_ioprio_set 273
|
||||||
|
#define __NR_ioprio_get 274
|
||||||
|
#elif defined(__x86_64__)
|
||||||
|
#define __NR_ioprio_set 251
|
||||||
|
#define __NR_ioprio_get 252
|
||||||
|
#elif defined(__ia64__)
|
||||||
|
#define __NR_ioprio_set 1274
|
||||||
|
#define __NR_ioprio_get 1275
|
||||||
|
#else
|
||||||
|
#error "Unsupported arch"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
_syscall3(int, ioprio_set, int, which, int, who, int, ioprio);
|
||||||
|
_syscall2(int, ioprio_get, int, which, int, who);
|
||||||
|
|
||||||
|
enum {
|
||||||
|
IOPRIO_CLASS_NONE,
|
||||||
|
IOPRIO_CLASS_RT,
|
||||||
|
IOPRIO_CLASS_BE,
|
||||||
|
IOPRIO_CLASS_IDLE,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
IOPRIO_WHO_PROCESS = 1,
|
||||||
|
IOPRIO_WHO_PGRP,
|
||||||
|
IOPRIO_WHO_USER,
|
||||||
|
};
|
||||||
|
|
||||||
|
#define IOPRIO_CLASS_SHIFT 13
|
||||||
|
|
||||||
|
const char *to_prio[] = { "none", "realtime", "best-effort", "idle", };
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int ioprio = 4, set = 0, ioprio_class = IOPRIO_CLASS_BE;
|
||||||
|
int c, pid = 0;
|
||||||
|
|
||||||
|
while ((c = getopt(argc, argv, "+n:c:p:")) != EOF) {
|
||||||
|
switch (c) {
|
||||||
|
case 'n':
|
||||||
|
ioprio = strtol(optarg, NULL, 10);
|
||||||
|
set = 1;
|
||||||
|
break;
|
||||||
|
case 'c':
|
||||||
|
ioprio_class = strtol(optarg, NULL, 10);
|
||||||
|
set = 1;
|
||||||
|
break;
|
||||||
|
case 'p':
|
||||||
|
pid = strtol(optarg, NULL, 10);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (ioprio_class) {
|
||||||
|
case IOPRIO_CLASS_NONE:
|
||||||
|
ioprio_class = IOPRIO_CLASS_BE;
|
||||||
|
break;
|
||||||
|
case IOPRIO_CLASS_RT:
|
||||||
|
case IOPRIO_CLASS_BE:
|
||||||
|
break;
|
||||||
|
case IOPRIO_CLASS_IDLE:
|
||||||
|
ioprio = 7;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printf("bad prio class %d\n", ioprio_class);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!set) {
|
||||||
|
if (!pid && argv[optind])
|
||||||
|
pid = strtol(argv[optind], NULL, 10);
|
||||||
|
|
||||||
|
ioprio = ioprio_get(IOPRIO_WHO_PROCESS, pid);
|
||||||
|
|
||||||
|
printf("pid=%d, %d\n", pid, ioprio);
|
||||||
|
|
||||||
|
if (ioprio == -1)
|
||||||
|
perror("ioprio_get");
|
||||||
|
else {
|
||||||
|
ioprio_class = ioprio >> IOPRIO_CLASS_SHIFT;
|
||||||
|
ioprio = ioprio & 0xff;
|
||||||
|
printf("%s: prio %d\n", to_prio[ioprio_class], ioprio);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (ioprio_set(IOPRIO_WHO_PROCESS, pid, ioprio | ioprio_class << IOPRIO_CLASS_SHIFT) == -1) {
|
||||||
|
perror("ioprio_set");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (argv[optind])
|
||||||
|
execvp(argv[optind], &argv[optind]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
---> snip ionice.c tool <---
|
||||||
|
|
||||||
|
|
||||||
|
March 11 2005, Jens Axboe <axboe@suse.de>
|
|
@ -17,6 +17,7 @@ This driver is known to work with the following cards:
|
||||||
* SA P600
|
* SA P600
|
||||||
* SA P800
|
* SA P800
|
||||||
* SA E400
|
* SA E400
|
||||||
|
* SA E300
|
||||||
|
|
||||||
If nodes are not already created in the /dev/cciss directory, run as root:
|
If nodes are not already created in the /dev/cciss directory, run as root:
|
||||||
|
|
||||||
|
|
|
@ -622,6 +622,17 @@ running once the system is up.
|
||||||
ips= [HW,SCSI] Adaptec / IBM ServeRAID controller
|
ips= [HW,SCSI] Adaptec / IBM ServeRAID controller
|
||||||
See header of drivers/scsi/ips.c.
|
See header of drivers/scsi/ips.c.
|
||||||
|
|
||||||
|
irqfixup [HW]
|
||||||
|
When an interrupt is not handled search all handlers
|
||||||
|
for it. Intended to get systems with badly broken
|
||||||
|
firmware running.
|
||||||
|
|
||||||
|
irqpoll [HW]
|
||||||
|
When an interrupt is not handled search all handlers
|
||||||
|
for it. Also check all handlers each timer
|
||||||
|
interrupt. Intended to get systems with badly broken
|
||||||
|
firmware running.
|
||||||
|
|
||||||
isapnp= [ISAPNP]
|
isapnp= [ISAPNP]
|
||||||
Format: <RDP>, <reset>, <pci_scan>, <verbosity>
|
Format: <RDP>, <reset>, <pci_scan>, <verbosity>
|
||||||
|
|
||||||
|
@ -1030,6 +1041,10 @@ running once the system is up.
|
||||||
irqmask=0xMMMM [IA-32] Set a bit mask of IRQs allowed to be assigned
|
irqmask=0xMMMM [IA-32] Set a bit mask of IRQs allowed to be assigned
|
||||||
automatically to PCI devices. You can make the kernel
|
automatically to PCI devices. You can make the kernel
|
||||||
exclude IRQs of your ISA cards this way.
|
exclude IRQs of your ISA cards this way.
|
||||||
|
pirqaddr=0xAAAAA [IA-32] Specify the physical address
|
||||||
|
of the PIRQ table (normally generated
|
||||||
|
by the BIOS) if it is outside the
|
||||||
|
F0000h-100000h range.
|
||||||
lastbus=N [IA-32] Scan all buses till bus #N. Can be useful
|
lastbus=N [IA-32] Scan all buses till bus #N. Can be useful
|
||||||
if the kernel is unable to find your secondary buses
|
if the kernel is unable to find your secondary buses
|
||||||
and you want to tell it explicitly which ones they are.
|
and you want to tell it explicitly which ones they are.
|
||||||
|
@ -1115,7 +1130,7 @@ running once the system is up.
|
||||||
See Documentation/ramdisk.txt.
|
See Documentation/ramdisk.txt.
|
||||||
|
|
||||||
psmouse.proto= [HW,MOUSE] Highest PS2 mouse protocol extension to
|
psmouse.proto= [HW,MOUSE] Highest PS2 mouse protocol extension to
|
||||||
probe for (bare|imps|exps).
|
probe for (bare|imps|exps|lifebook|any).
|
||||||
psmouse.rate= [HW,MOUSE] Set desired mouse report rate, in reports
|
psmouse.rate= [HW,MOUSE] Set desired mouse report rate, in reports
|
||||||
per second.
|
per second.
|
||||||
psmouse.resetafter=
|
psmouse.resetafter=
|
||||||
|
|
|
@ -1,59 +1,65 @@
|
||||||
dmfe.c: Version 1.28 01/18/2000
|
Davicom DM9102(A)/DM9132/DM9801 fast ethernet driver for Linux.
|
||||||
|
|
||||||
A Davicom DM9102(A)/DM9132/DM9801 fast ethernet driver for Linux.
|
This program is free software; you can redistribute it and/or
|
||||||
Copyright (C) 1997 Sten Wang
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; either version 2
|
||||||
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or
|
This program is distributed in the hope that it will be useful,
|
||||||
modify it under the terms of the GNU General Public License
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
as published by the Free Software Foundation; either version 2
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
of the License, or (at your option) any later version.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
|
|
||||||
A. Compiler command:
|
This driver provides kernel support for Davicom DM9102(A)/DM9132/DM9801 ethernet cards ( CNET
|
||||||
|
10/100 ethernet cards uses Davicom chipset too, so this driver supports CNET cards too ).If you
|
||||||
|
didn't compile this driver as a module, it will automatically load itself on boot and print a
|
||||||
|
line similar to :
|
||||||
|
|
||||||
A-1: For normal single or multiple processor kernel
|
dmfe: Davicom DM9xxx net driver, version 1.36.4 (2002-01-17)
|
||||||
"gcc -DMODULE -D__KERNEL__ -I/usr/src/linux/net/inet -Wall
|
|
||||||
-Wstrict-prototypes -O6 -c dmfe.c"
|
|
||||||
|
|
||||||
A-2: For single or multiple processor with kernel module version function
|
If you compiled this driver as a module, you have to load it on boot.You can load it with command :
|
||||||
"gcc -DMODULE -DMODVERSIONS -D__KERNEL__ -I/usr/src/linux/net/inet
|
|
||||||
-Wall -Wstrict-prototypes -O6 -c dmfe.c"
|
insmod dmfe
|
||||||
|
|
||||||
|
This way it will autodetect the device mode.This is the suggested way to load the module.Or you can pass
|
||||||
|
a mode= setting to module while loading, like :
|
||||||
|
|
||||||
|
insmod dmfe mode=0 # Force 10M Half Duplex
|
||||||
|
insmod dmfe mode=1 # Force 100M Half Duplex
|
||||||
|
insmod dmfe mode=4 # Force 10M Full Duplex
|
||||||
|
insmod dmfe mode=5 # Force 100M Full Duplex
|
||||||
|
|
||||||
|
Next you should configure your network interface with a command similar to :
|
||||||
|
|
||||||
|
ifconfig eth0 172.22.3.18
|
||||||
|
^^^^^^^^^^^
|
||||||
|
Your IP Adress
|
||||||
|
|
||||||
|
Then you may have to modify the default routing table with command :
|
||||||
|
|
||||||
|
route add default eth0
|
||||||
|
|
||||||
|
|
||||||
B. The following steps teach you how to activate a DM9102 board:
|
Now your ethernet card should be up and running.
|
||||||
|
|
||||||
1. Used the upper compiler command to compile dmfe.c
|
|
||||||
|
|
||||||
2. Insert dmfe module into kernel
|
|
||||||
"insmod dmfe" ;;Auto Detection Mode (Suggest)
|
|
||||||
"insmod dmfe mode=0" ;;Force 10M Half Duplex
|
|
||||||
"insmod dmfe mode=1" ;;Force 100M Half Duplex
|
|
||||||
"insmod dmfe mode=4" ;;Force 10M Full Duplex
|
|
||||||
"insmod dmfe mode=5" ;;Force 100M Full Duplex
|
|
||||||
|
|
||||||
3. Config a dm9102 network interface
|
|
||||||
"ifconfig eth0 172.22.3.18"
|
|
||||||
^^^^^^^^^^^ Your IP address
|
|
||||||
|
|
||||||
4. Activate the IP routing table. For some distributions, it is not
|
|
||||||
necessary. You can type "route" to check.
|
|
||||||
|
|
||||||
"route add default eth0"
|
|
||||||
|
|
||||||
|
|
||||||
5. Well done. Your DM9102 adapter is now activated.
|
TODO:
|
||||||
|
|
||||||
|
Implement pci_driver::suspend() and pci_driver::resume() power management methods.
|
||||||
|
Check on 64 bit boxes.
|
||||||
|
Check and fix on big endian boxes.
|
||||||
|
Test and make sure PCI latency is now correct for all cases.
|
||||||
|
|
||||||
|
|
||||||
C. Object files description:
|
Authors:
|
||||||
1. dmfe_rh61.o: For Redhat 6.1
|
|
||||||
|
|
||||||
If you can make sure your kernel version, you can rename
|
Sten Wang <sten_wang@davicom.com.tw > : Original Author
|
||||||
to dmfe.o and directly use it without re-compiling.
|
Tobias Ringstrom <tori@unhappy.mine.nu> : Current Maintainer
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
|
||||||
Author: Sten Wang, 886-3-5798797-8517, E-mail: sten_wang@davicom.com.tw
|
Marcelo Tosatti <marcelo@conectiva.com.br>
|
||||||
|
Alan Cox <alan@redhat.com>
|
||||||
|
Jeff Garzik <jgarzik@pobox.com>
|
||||||
|
Vojtech Pavlik <vojtech@suse.cz>
|
||||||
|
|
|
@ -0,0 +1,145 @@
|
||||||
|
LC-trie implementation notes.
|
||||||
|
|
||||||
|
Node types
|
||||||
|
----------
|
||||||
|
leaf
|
||||||
|
An end node with data. This has a copy of the relevant key, along
|
||||||
|
with 'hlist' with routing table entries sorted by prefix length.
|
||||||
|
See struct leaf and struct leaf_info.
|
||||||
|
|
||||||
|
trie node or tnode
|
||||||
|
An internal node, holding an array of child (leaf or tnode) pointers,
|
||||||
|
indexed through a subset of the key. See Level Compression.
|
||||||
|
|
||||||
|
A few concepts explained
|
||||||
|
------------------------
|
||||||
|
Bits (tnode)
|
||||||
|
The number of bits in the key segment used for indexing into the
|
||||||
|
child array - the "child index". See Level Compression.
|
||||||
|
|
||||||
|
Pos (tnode)
|
||||||
|
The position (in the key) of the key segment used for indexing into
|
||||||
|
the child array. See Path Compression.
|
||||||
|
|
||||||
|
Path Compression / skipped bits
|
||||||
|
Any given tnode is linked to from the child array of its parent, using
|
||||||
|
a segment of the key specified by the parent's "pos" and "bits"
|
||||||
|
In certain cases, this tnode's own "pos" will not be immediately
|
||||||
|
adjacent to the parent (pos+bits), but there will be some bits
|
||||||
|
in the key skipped over because they represent a single path with no
|
||||||
|
deviations. These "skipped bits" constitute Path Compression.
|
||||||
|
Note that the search algorithm will simply skip over these bits when
|
||||||
|
searching, making it necessary to save the keys in the leaves to
|
||||||
|
verify that they actually do match the key we are searching for.
|
||||||
|
|
||||||
|
Level Compression / child arrays
|
||||||
|
the trie is kept level balanced moving, under certain conditions, the
|
||||||
|
children of a full child (see "full_children") up one level, so that
|
||||||
|
instead of a pure binary tree, each internal node ("tnode") may
|
||||||
|
contain an arbitrarily large array of links to several children.
|
||||||
|
Conversely, a tnode with a mostly empty child array (see empty_children)
|
||||||
|
may be "halved", having some of its children moved downwards one level,
|
||||||
|
in order to avoid ever-increasing child arrays.
|
||||||
|
|
||||||
|
empty_children
|
||||||
|
the number of positions in the child array of a given tnode that are
|
||||||
|
NULL.
|
||||||
|
|
||||||
|
full_children
|
||||||
|
the number of children of a given tnode that aren't path compressed.
|
||||||
|
(in other words, they aren't NULL or leaves and their "pos" is equal
|
||||||
|
to this tnode's "pos"+"bits").
|
||||||
|
|
||||||
|
(The word "full" here is used more in the sense of "complete" than
|
||||||
|
as the opposite of "empty", which might be a tad confusing.)
|
||||||
|
|
||||||
|
Comments
|
||||||
|
---------
|
||||||
|
|
||||||
|
We have tried to keep the structure of the code as close to fib_hash as
|
||||||
|
possible to allow verification and help up reviewing.
|
||||||
|
|
||||||
|
fib_find_node()
|
||||||
|
A good start for understanding this code. This function implements a
|
||||||
|
straightforward trie lookup.
|
||||||
|
|
||||||
|
fib_insert_node()
|
||||||
|
Inserts a new leaf node in the trie. This is bit more complicated than
|
||||||
|
fib_find_node(). Inserting a new node means we might have to run the
|
||||||
|
level compression algorithm on part of the trie.
|
||||||
|
|
||||||
|
trie_leaf_remove()
|
||||||
|
Looks up a key, deletes it and runs the level compression algorithm.
|
||||||
|
|
||||||
|
trie_rebalance()
|
||||||
|
The key function for the dynamic trie after any change in the trie
|
||||||
|
it is run to optimize and reorganize. Tt will walk the trie upwards
|
||||||
|
towards the root from a given tnode, doing a resize() at each step
|
||||||
|
to implement level compression.
|
||||||
|
|
||||||
|
resize()
|
||||||
|
Analyzes a tnode and optimizes the child array size by either inflating
|
||||||
|
or shrinking it repeatedly until it fullfills the criteria for optimal
|
||||||
|
level compression. This part follows the original paper pretty closely
|
||||||
|
and there may be some room for experimentation here.
|
||||||
|
|
||||||
|
inflate()
|
||||||
|
Doubles the size of the child array within a tnode. Used by resize().
|
||||||
|
|
||||||
|
halve()
|
||||||
|
Halves the size of the child array within a tnode - the inverse of
|
||||||
|
inflate(). Used by resize();
|
||||||
|
|
||||||
|
fn_trie_insert(), fn_trie_delete(), fn_trie_select_default()
|
||||||
|
The route manipulation functions. Should conform pretty closely to the
|
||||||
|
corresponding functions in fib_hash.
|
||||||
|
|
||||||
|
fn_trie_flush()
|
||||||
|
This walks the full trie (using nextleaf()) and searches for empty
|
||||||
|
leaves which have to be removed.
|
||||||
|
|
||||||
|
fn_trie_dump()
|
||||||
|
Dumps the routing table ordered by prefix length. This is somewhat
|
||||||
|
slower than the corresponding fib_hash function, as we have to walk the
|
||||||
|
entire trie for each prefix length. In comparison, fib_hash is organized
|
||||||
|
as one "zone"/hash per prefix length.
|
||||||
|
|
||||||
|
Locking
|
||||||
|
-------
|
||||||
|
|
||||||
|
fib_lock is used for an RW-lock in the same way that this is done in fib_hash.
|
||||||
|
However, the functions are somewhat separated for other possible locking
|
||||||
|
scenarios. It might conceivably be possible to run trie_rebalance via RCU
|
||||||
|
to avoid read_lock in the fn_trie_lookup() function.
|
||||||
|
|
||||||
|
Main lookup mechanism
|
||||||
|
---------------------
|
||||||
|
fn_trie_lookup() is the main lookup function.
|
||||||
|
|
||||||
|
The lookup is in its simplest form just like fib_find_node(). We descend the
|
||||||
|
trie, key segment by key segment, until we find a leaf. check_leaf() does
|
||||||
|
the fib_semantic_match in the leaf's sorted prefix hlist.
|
||||||
|
|
||||||
|
If we find a match, we are done.
|
||||||
|
|
||||||
|
If we don't find a match, we enter prefix matching mode. The prefix length,
|
||||||
|
starting out at the same as the key length, is reduced one step at a time,
|
||||||
|
and we backtrack upwards through the trie trying to find a longest matching
|
||||||
|
prefix. The goal is always to reach a leaf and get a positive result from the
|
||||||
|
fib_semantic_match mechanism.
|
||||||
|
|
||||||
|
Inside each tnode, the search for longest matching prefix consists of searching
|
||||||
|
through the child array, chopping off (zeroing) the least significant "1" of
|
||||||
|
the child index until we find a match or the child index consists of nothing but
|
||||||
|
zeros.
|
||||||
|
|
||||||
|
At this point we backtrack (t->stats.backtrack++) up the trie, continuing to
|
||||||
|
chop off part of the key in order to find the longest matching prefix.
|
||||||
|
|
||||||
|
At this point we will repeatedly descend subtries to look for a match, and there
|
||||||
|
are some optimizations available that can provide us with "shortcuts" to avoid
|
||||||
|
descending into dead ends. Look for "HL_OPTIMIZE" sections in the code.
|
||||||
|
|
||||||
|
To alleviate any doubts about the correctness of the route selection process,
|
||||||
|
a new netlink operation has been added. Look for NETLINK_FIB_LOOKUP, which
|
||||||
|
gives userland access to fib_lookup().
|
|
@ -0,0 +1,63 @@
|
||||||
|
Matching of PCMCIA devices to drivers is done using one or more of the
|
||||||
|
following criteria:
|
||||||
|
|
||||||
|
- manufactor ID
|
||||||
|
- card ID
|
||||||
|
- product ID strings _and_ hashes of these strings
|
||||||
|
- function ID
|
||||||
|
- device function (actual and pseudo)
|
||||||
|
|
||||||
|
You should use the helpers in include/pcmcia/device_id.h for generating the
|
||||||
|
struct pcmcia_device_id[] entries which match devices to drivers.
|
||||||
|
|
||||||
|
If you want to match product ID strings, you also need to pass the crc32
|
||||||
|
hashes of the string to the macro, e.g. if you want to match the product ID
|
||||||
|
string 1, you need to use
|
||||||
|
|
||||||
|
PCMCIA_DEVICE_PROD_ID1("some_string", 0x(hash_of_some_string)),
|
||||||
|
|
||||||
|
If the hash is incorrect, the kernel will inform you about this in "dmesg"
|
||||||
|
upon module initialization, and tell you of the correct hash.
|
||||||
|
|
||||||
|
You can determine the hash of the product ID strings by catting the file
|
||||||
|
"modalias" in the sysfs directory of the PCMCIA device. It generates a string
|
||||||
|
in the following form:
|
||||||
|
pcmcia:m0149cC1ABf06pfn00fn00pa725B842DpbF1EFEE84pc0877B627pd00000000
|
||||||
|
|
||||||
|
The hex value after "pa" is the hash of product ID string 1, after "pb" for
|
||||||
|
string 2 and so on.
|
||||||
|
|
||||||
|
Alternatively, you can use this small tool to determine the crc32 hash.
|
||||||
|
simply pass the string you want to evaluate as argument to this program,
|
||||||
|
e.g.
|
||||||
|
$ ./crc32hash "Dual Speed"
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------
|
||||||
|
/* crc32hash.c - derived from linux/lib/crc32.c, GNU GPL v2 */
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
unsigned int crc32(unsigned char const *p, unsigned int len)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
unsigned int crc = 0;
|
||||||
|
while (len--) {
|
||||||
|
crc ^= *p++;
|
||||||
|
for (i = 0; i < 8; i++)
|
||||||
|
crc = (crc >> 1) ^ ((crc & 1) ? 0xedb88320 : 0);
|
||||||
|
}
|
||||||
|
return crc;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
unsigned int result;
|
||||||
|
if (argc != 2) {
|
||||||
|
printf("no string passed as argument\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
result = crc32(argv[1], strlen(argv[1]));
|
||||||
|
printf("0x%x\n", result);
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,51 @@
|
||||||
|
This file details changes in 2.6 which affect PCMCIA card driver authors:
|
||||||
|
|
||||||
|
* in-kernel device<->driver matching
|
||||||
|
PCMCIA devices and their correct drivers can now be matched in
|
||||||
|
kernelspace. See 'devicetable.txt' for details.
|
||||||
|
|
||||||
|
* Device model integration (as of 2.6.11)
|
||||||
|
A struct pcmcia_device is registered with the device model core,
|
||||||
|
and can be used (e.g. for SET_NETDEV_DEV) by using
|
||||||
|
handle_to_dev(client_handle_t * handle).
|
||||||
|
|
||||||
|
* Convert internal I/O port addresses to unsigned long (as of 2.6.11)
|
||||||
|
ioaddr_t should be replaced by kio_addr_t in PCMCIA card drivers.
|
||||||
|
|
||||||
|
* irq_mask and irq_list parameters (as of 2.6.11)
|
||||||
|
The irq_mask and irq_list parameters should no longer be used in
|
||||||
|
PCMCIA card drivers. Instead, it is the job of the PCMCIA core to
|
||||||
|
determine which IRQ should be used. Therefore, link->irq.IRQInfo2
|
||||||
|
is ignored.
|
||||||
|
|
||||||
|
* client->PendingEvents is gone (as of 2.6.11)
|
||||||
|
client->PendingEvents is no longer available.
|
||||||
|
|
||||||
|
* client->Attributes are gone (as of 2.6.11)
|
||||||
|
client->Attributes is unused, therefore it is removed from all
|
||||||
|
PCMCIA card drivers
|
||||||
|
|
||||||
|
* core functions no longer available (as of 2.6.11)
|
||||||
|
The following functions have been removed from the kernel source
|
||||||
|
because they are unused by all in-kernel drivers, and no external
|
||||||
|
driver was reported to rely on them:
|
||||||
|
pcmcia_get_first_region()
|
||||||
|
pcmcia_get_next_region()
|
||||||
|
pcmcia_modify_window()
|
||||||
|
pcmcia_set_event_mask()
|
||||||
|
pcmcia_get_first_window()
|
||||||
|
pcmcia_get_next_window()
|
||||||
|
|
||||||
|
* device list iteration upon module removal (as of 2.6.10)
|
||||||
|
It is no longer necessary to iterate on the driver's internal
|
||||||
|
client list and call the ->detach() function upon module removal.
|
||||||
|
|
||||||
|
* Resource management. (as of 2.6.8)
|
||||||
|
Although the PCMCIA subsystem will allocate resources for cards,
|
||||||
|
it no longer marks these resources busy. This means that driver
|
||||||
|
authors are now responsible for claiming your resources as per
|
||||||
|
other drivers in Linux. You should use request_region() to mark
|
||||||
|
your IO regions in-use, and request_mem_region() to mark your
|
||||||
|
memory regions in-use. The name argument should be a pointer to
|
||||||
|
your driver name. Eg, for pcnet_cs, name should point to the
|
||||||
|
string "pcnet_cs".
|
|
@ -107,8 +107,8 @@ hardware.
|
||||||
indicate that the signal is permanently active. If RI is
|
indicate that the signal is permanently active. If RI is
|
||||||
not available, the signal should not be indicated as active.
|
not available, the signal should not be indicated as active.
|
||||||
|
|
||||||
Locking: none.
|
Locking: port->lock taken.
|
||||||
Interrupts: caller dependent.
|
Interrupts: locally disabled.
|
||||||
This call must not sleep
|
This call must not sleep
|
||||||
|
|
||||||
stop_tx(port,tty_stop)
|
stop_tx(port,tty_stop)
|
||||||
|
|
|
@ -1,399 +1,16 @@
|
||||||
<HTML><HEAD>
|
<TITLE>V4L API</TITLE>
|
||||||
<TITLE>Video4Linux Kernel API Reference v0.1:19990430</TITLE>
|
<H1>Video For Linux APIs</H1>
|
||||||
</HEAD>
|
<table border=0>
|
||||||
<! Revision History: >
|
<tr>
|
||||||
<! 4/30/1999 - Fred Gleason (fredg@wava.com)>
|
<td>
|
||||||
<! Documented extensions for the Radio Data System (RDS) extensions >
|
<A HREF=http://www.linuxtv.org/downloads/video4linux/API/V4L1_API.html>
|
||||||
<BODY bgcolor="#ffffff">
|
V4L original API</a>
|
||||||
<H3>Devices</H3>
|
</td><td>
|
||||||
Video4Linux provides the following sets of device files. These live on the
|
Obsoleted by V4L2 API
|
||||||
character device formerly known as "/dev/bttv". /dev/bttv should be a
|
</td></tr><tr><td>
|
||||||
symlink to /dev/video0 for most people.
|
<A HREF=http://www.linuxtv.org/downloads/video4linux/API/V4L2_API.html>
|
||||||
<P>
|
V4L2 API</a>
|
||||||
<TABLE>
|
</td><td>
|
||||||
<TR><TH>Device Name</TH><TH>Minor Range</TH><TH>Function</TH>
|
Should be used for new projects
|
||||||
<TR><TD>/dev/video</TD><TD>0-63</TD><TD>Video Capture Interface</TD>
|
</td></tr>
|
||||||
<TR><TD>/dev/radio</TD><TD>64-127</TD><TD>AM/FM Radio Devices</TD>
|
</table>
|
||||||
<TR><TD>/dev/vtx</TD><TD>192-223</TD><TD>Teletext Interface Chips</TD>
|
|
||||||
<TR><TD>/dev/vbi</TD><TD>224-239</TD><TD>Raw VBI Data (Intercast/teletext)</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
Video4Linux programs open and scan the devices to find what they are looking
|
|
||||||
for. Capability queries define what each interface supports. The
|
|
||||||
described API is only defined for video capture cards. The relevant subset
|
|
||||||
applies to radio cards. Teletext interfaces talk the existing VTX API.
|
|
||||||
<P>
|
|
||||||
<H3>Capability Query Ioctl</H3>
|
|
||||||
The <B>VIDIOCGCAP</B> ioctl call is used to obtain the capability
|
|
||||||
information for a video device. The <b>struct video_capability</b> object
|
|
||||||
passed to the ioctl is completed and returned. It contains the following
|
|
||||||
information
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>name[32]</b><TD>Canonical name for this interface</TD>
|
|
||||||
<TR><TD><b>type</b><TD>Type of interface</TD>
|
|
||||||
<TR><TD><b>channels</b><TD>Number of radio/tv channels if appropriate</TD>
|
|
||||||
<TR><TD><b>audios</b><TD>Number of audio devices if appropriate</TD>
|
|
||||||
<TR><TD><b>maxwidth</b><TD>Maximum capture width in pixels</TD>
|
|
||||||
<TR><TD><b>maxheight</b><TD>Maximum capture height in pixels</TD>
|
|
||||||
<TR><TD><b>minwidth</b><TD>Minimum capture width in pixels</TD>
|
|
||||||
<TR><TD><b>minheight</b><TD>Minimum capture height in pixels</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
The type field lists the capability flags for the device. These are
|
|
||||||
as follows
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TH>Name</TH><TH>Description</TH>
|
|
||||||
<TR><TD><b>VID_TYPE_CAPTURE</b><TD>Can capture to memory</TD>
|
|
||||||
<TR><TD><b>VID_TYPE_TUNER</b><TD>Has a tuner of some form</TD>
|
|
||||||
<TR><TD><b>VID_TYPE_TELETEXT</b><TD>Has teletext capability</TD>
|
|
||||||
<TR><TD><b>VID_TYPE_OVERLAY</b><TD>Can overlay its image onto the frame buffer</TD>
|
|
||||||
<TR><TD><b>VID_TYPE_CHROMAKEY</b><TD>Overlay is Chromakeyed</TD>
|
|
||||||
<TR><TD><b>VID_TYPE_CLIPPING</b><TD>Overlay clipping is supported</TD>
|
|
||||||
<TR><TD><b>VID_TYPE_FRAMERAM</b><TD>Overlay overwrites frame buffer memory</TD>
|
|
||||||
<TR><TD><b>VID_TYPE_SCALES</b><TD>The hardware supports image scaling</TD>
|
|
||||||
<TR><TD><b>VID_TYPE_MONOCHROME</b><TD>Image capture is grey scale only</TD>
|
|
||||||
<TR><TD><b>VID_TYPE_SUBCAPTURE</b><TD>Capture can be of only part of the image</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
The minimum and maximum sizes listed for a capture device do not imply all
|
|
||||||
that all height/width ratios or sizes within the range are possible. A
|
|
||||||
request to set a size will be honoured by the largest available capture
|
|
||||||
size whose capture is no large than the requested rectangle in either
|
|
||||||
direction. For example the quickcam has 3 fixed settings.
|
|
||||||
<P>
|
|
||||||
<H3>Frame Buffer</H3>
|
|
||||||
Capture cards that drop data directly onto the frame buffer must be told the
|
|
||||||
base address of the frame buffer, its size and organisation. This is a
|
|
||||||
privileged ioctl and one that eventually X itself should set.
|
|
||||||
<P>
|
|
||||||
The <b>VIDIOCSFBUF</b> ioctl sets the frame buffer parameters for a capture
|
|
||||||
card. If the card does not do direct writes to the frame buffer then this
|
|
||||||
ioctl will be unsupported. The <b>VIDIOCGFBUF</b> ioctl returns the
|
|
||||||
currently used parameters. The structure used in both cases is a
|
|
||||||
<b>struct video_buffer</b>.
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>void *base</b></TD><TD>Base physical address of the buffer</TD>
|
|
||||||
<TR><TD><b>int height</b></TD><TD>Height of the frame buffer</TD>
|
|
||||||
<TR><TD><b>int width</b></TD><TD>Width of the frame buffer</TD>
|
|
||||||
<TR><TD><b>int depth</b></TD><TD>Depth of the frame buffer</TD>
|
|
||||||
<TR><TD><b>int bytesperline</b></TD><TD>Number of bytes of memory between the start of two adjacent lines</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
Note that these values reflect the physical layout of the frame buffer.
|
|
||||||
The visible area may be smaller. In fact under XFree86 this is commonly the
|
|
||||||
case. XFree86 DGA can provide the parameters required to set up this ioctl.
|
|
||||||
Setting the base address to NULL indicates there is no physical frame buffer
|
|
||||||
access.
|
|
||||||
<P>
|
|
||||||
<H3>Capture Windows</H3>
|
|
||||||
The capture area is described by a <b>struct video_window</b>. This defines
|
|
||||||
a capture area and the clipping information if relevant. The
|
|
||||||
<b>VIDIOCGWIN</b> ioctl recovers the current settings and the
|
|
||||||
<b>VIDIOCSWIN</b> sets new values. A successful call to <b>VIDIOCSWIN</b>
|
|
||||||
indicates that a suitable set of parameters have been chosen. They do not
|
|
||||||
indicate that exactly what was requested was granted. The program should
|
|
||||||
call <b>VIDIOCGWIN</b> to check if the nearest match was suitable. The
|
|
||||||
<b>struct video_window</b> contains the following fields.
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>x</b><TD>The X co-ordinate specified in X windows format.</TD>
|
|
||||||
<TR><TD><b>y</b><TD>The Y co-ordinate specified in X windows format.</TD>
|
|
||||||
<TR><TD><b>width</b><TD>The width of the image capture.</TD>
|
|
||||||
<TR><TD><b>height</b><TD>The height of the image capture.</TD>
|
|
||||||
<TR><TD><b>chromakey</b><TD>A host order RGB32 value for the chroma key.</TD>
|
|
||||||
<TR><TD><b>flags</b><TD>Additional capture flags.</TD>
|
|
||||||
<TR><TD><b>clips</b><TD>A list of clipping rectangles. <em>(Set only)</em></TD>
|
|
||||||
<TR><TD><b>clipcount</b><TD>The number of clipping rectangles. <em>(Set only)</em></TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
Clipping rectangles are passed as an array. Each clip consists of the following
|
|
||||||
fields available to the user.
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>x</b></TD><TD>X co-ordinate of rectangle to skip</TD>
|
|
||||||
<TR><TD><b>y</b></TD><TD>Y co-ordinate of rectangle to skip</TD>
|
|
||||||
<TR><TD><b>width</b></TD><TD>Width of rectangle to skip</TD>
|
|
||||||
<TR><TD><b>height</b></TD><TD>Height of rectangle to skip</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
Merely setting the window does not enable capturing. Overlay capturing
|
|
||||||
(i.e. PCI-PCI transfer to the frame buffer of the video card)
|
|
||||||
is activated by passing the <b>VIDIOCCAPTURE</b> ioctl a value of 1, and
|
|
||||||
disabled by passing it a value of 0.
|
|
||||||
<P>
|
|
||||||
Some capture devices can capture a subfield of the image they actually see.
|
|
||||||
This is indicated when VIDEO_TYPE_SUBCAPTURE is defined.
|
|
||||||
The video_capture describes the time and special subfields to capture.
|
|
||||||
The video_capture structure contains the following fields.
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>x</b></TD><TD>X co-ordinate of source rectangle to grab</TD>
|
|
||||||
<TR><TD><b>y</b></TD><TD>Y co-ordinate of source rectangle to grab</TD>
|
|
||||||
<TR><TD><b>width</b></TD><TD>Width of source rectangle to grab</TD>
|
|
||||||
<TR><TD><b>height</b></TD><TD>Height of source rectangle to grab</TD>
|
|
||||||
<TR><TD><b>decimation</b></TD><TD>Decimation to apply</TD>
|
|
||||||
<TR><TD><b>flags</b></TD><TD>Flag settings for grabbing</TD>
|
|
||||||
</TABLE>
|
|
||||||
The available flags are
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TH>Name</TH><TH>Description</TH>
|
|
||||||
<TR><TD><b>VIDEO_CAPTURE_ODD</b><TD>Capture only odd frames</TD>
|
|
||||||
<TR><TD><b>VIDEO_CAPTURE_EVEN</b><TD>Capture only even frames</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
<H3>Video Sources</H3>
|
|
||||||
Each video4linux video or audio device captures from one or more
|
|
||||||
source <b>channels</b>. Each channel can be queries with the
|
|
||||||
<b>VDIOCGCHAN</b> ioctl call. Before invoking this function the caller
|
|
||||||
must set the channel field to the channel that is being queried. On return
|
|
||||||
the <b>struct video_channel</b> is filled in with information about the
|
|
||||||
nature of the channel itself.
|
|
||||||
<P>
|
|
||||||
The <b>VIDIOCSCHAN</b> ioctl takes an integer argument and switches the
|
|
||||||
capture to this input. It is not defined whether parameters such as colour
|
|
||||||
settings or tuning are maintained across a channel switch. The caller should
|
|
||||||
maintain settings as desired for each channel. (This is reasonable as
|
|
||||||
different video inputs may have different properties).
|
|
||||||
<P>
|
|
||||||
The <b>struct video_channel</b> consists of the following
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>channel</b></TD><TD>The channel number</TD>
|
|
||||||
<TR><TD><b>name</b></TD><TD>The input name - preferably reflecting the label
|
|
||||||
on the card input itself</TD>
|
|
||||||
<TR><TD><b>tuners</b></TD><TD>Number of tuners for this input</TD>
|
|
||||||
<TR><TD><b>flags</b></TD><TD>Properties the tuner has</TD>
|
|
||||||
<TR><TD><b>type</b></TD><TD>Input type (if known)</TD>
|
|
||||||
<TR><TD><b>norm</b><TD>The norm for this channel</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
The flags defined are
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>VIDEO_VC_TUNER</b><TD>Channel has tuners.</TD>
|
|
||||||
<TR><TD><b>VIDEO_VC_AUDIO</b><TD>Channel has audio.</TD>
|
|
||||||
<TR><TD><b>VIDEO_VC_NORM</b><TD>Channel has norm setting.</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
The types defined are
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>VIDEO_TYPE_TV</b><TD>The input is a TV input.</TD>
|
|
||||||
<TR><TD><b>VIDEO_TYPE_CAMERA</b><TD>The input is a camera.</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
<H3>Image Properties</H3>
|
|
||||||
The image properties of the picture can be queried with the <b>VIDIOCGPICT</b>
|
|
||||||
ioctl which fills in a <b>struct video_picture</b>. The <b>VIDIOCSPICT</b>
|
|
||||||
ioctl allows values to be changed. All values except for the palette type
|
|
||||||
are scaled between 0-65535.
|
|
||||||
<P>
|
|
||||||
The <b>struct video_picture</b> consists of the following fields
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>brightness</b><TD>Picture brightness</TD>
|
|
||||||
<TR><TD><b>hue</b><TD>Picture hue (colour only)</TD>
|
|
||||||
<TR><TD><b>colour</b><TD>Picture colour (colour only)</TD>
|
|
||||||
<TR><TD><b>contrast</b><TD>Picture contrast</TD>
|
|
||||||
<TR><TD><b>whiteness</b><TD>The whiteness (greyscale only)</TD>
|
|
||||||
<TR><TD><b>depth</b><TD>The capture depth (may need to match the frame buffer depth)</TD>
|
|
||||||
<TR><TD><b>palette</b><TD>Reports the palette that should be used for this image</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
The following palettes are defined
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>VIDEO_PALETTE_GREY</b><TD>Linear intensity grey scale (255 is brightest).</TD>
|
|
||||||
<TR><TD><b>VIDEO_PALETTE_HI240</b><TD>The BT848 8bit colour cube.</TD>
|
|
||||||
<TR><TD><b>VIDEO_PALETTE_RGB565</b><TD>RGB565 packed into 16 bit words.</TD>
|
|
||||||
<TR><TD><b>VIDEO_PALETTE_RGB555</b><TD>RGV555 packed into 16 bit words, top bit undefined.</TD>
|
|
||||||
<TR><TD><b>VIDEO_PALETTE_RGB24</b><TD>RGB888 packed into 24bit words.</TD>
|
|
||||||
<TR><TD><b>VIDEO_PALETTE_RGB32</b><TD>RGB888 packed into the low 3 bytes of 32bit words. The top 8bits are undefined.</TD>
|
|
||||||
<TR><TD><b>VIDEO_PALETTE_YUV422</b><TD>Video style YUV422 - 8bits packed 4bits Y 2bits U 2bits V</TD>
|
|
||||||
<TR><TD><b>VIDEO_PALETTE_YUYV</b><TD>Describe me</TD>
|
|
||||||
<TR><TD><b>VIDEO_PALETTE_UYVY</b><TD>Describe me</TD>
|
|
||||||
<TR><TD><b>VIDEO_PALETTE_YUV420</b><TD>YUV420 capture</TD>
|
|
||||||
<TR><TD><b>VIDEO_PALETTE_YUV411</b><TD>YUV411 capture</TD>
|
|
||||||
<TR><TD><b>VIDEO_PALETTE_RAW</b><TD>RAW capture (BT848)</TD>
|
|
||||||
<TR><TD><b>VIDEO_PALETTE_YUV422P</b><TD>YUV 4:2:2 Planar</TD>
|
|
||||||
<TR><TD><b>VIDEO_PALETTE_YUV411P</b><TD>YUV 4:1:1 Planar</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
<H3>Tuning</H3>
|
|
||||||
Each video input channel can have one or more tuners associated with it. Many
|
|
||||||
devices will not have tuners. TV cards and radio cards will have one or more
|
|
||||||
tuners attached.
|
|
||||||
<P>
|
|
||||||
Tuners are described by a <b>struct video_tuner</b> which can be obtained by
|
|
||||||
the <b>VIDIOCGTUNER</b> ioctl. Fill in the tuner number in the structure
|
|
||||||
then pass the structure to the ioctl to have the data filled in. The
|
|
||||||
tuner can be switched using <b>VIDIOCSTUNER</b> which takes an integer argument
|
|
||||||
giving the tuner to use. A struct tuner has the following fields
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>tuner</b><TD>Number of the tuner</TD>
|
|
||||||
<TR><TD><b>name</b><TD>Canonical name for this tuner (eg FM/AM/TV)</TD>
|
|
||||||
<TR><TD><b>rangelow</b><TD>Lowest tunable frequency</TD>
|
|
||||||
<TR><TD><b>rangehigh</b><TD>Highest tunable frequency</TD>
|
|
||||||
<TR><TD><b>flags</b><TD>Flags describing the tuner</TD>
|
|
||||||
<TR><TD><b>mode</b><TD>The video signal mode if relevant</TD>
|
|
||||||
<TR><TD><b>signal</b><TD>Signal strength if known - between 0-65535</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
The following flags exist
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>VIDEO_TUNER_PAL</b><TD>PAL tuning is supported</TD>
|
|
||||||
<TR><TD><b>VIDEO_TUNER_NTSC</b><TD>NTSC tuning is supported</TD>
|
|
||||||
<TR><TD><b>VIDEO_TUNER_SECAM</b><TD>SECAM tuning is supported</TD>
|
|
||||||
<TR><TD><b>VIDEO_TUNER_LOW</b><TD>Frequency is in a lower range</TD>
|
|
||||||
<TR><TD><b>VIDEO_TUNER_NORM</b><TD>The norm for this tuner is settable</TD>
|
|
||||||
<TR><TD><b>VIDEO_TUNER_STEREO_ON</b><TD>The tuner is seeing stereo audio</TD>
|
|
||||||
<TR><TD><b>VIDEO_TUNER_RDS_ON</b><TD>The tuner is seeing a RDS datastream</TD>
|
|
||||||
<TR><TD><b>VIDEO_TUNER_MBS_ON</b><TD>The tuner is seeing a MBS datastream</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
The following modes are defined
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>VIDEO_MODE_PAL</b><TD>The tuner is in PAL mode</TD>
|
|
||||||
<TR><TD><b>VIDEO_MODE_NTSC</b><TD>The tuner is in NTSC mode</TD>
|
|
||||||
<TR><TD><b>VIDEO_MODE_SECAM</b><TD>The tuner is in SECAM mode</TD>
|
|
||||||
<TR><TD><b>VIDEO_MODE_AUTO</b><TD>The tuner auto switches, or mode does not apply</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
Tuning frequencies are an unsigned 32bit value in 1/16th MHz or if the
|
|
||||||
<b>VIDEO_TUNER_LOW</b> flag is set they are in 1/16th KHz. The current
|
|
||||||
frequency is obtained as an unsigned long via the <b>VIDIOCGFREQ</b> ioctl and
|
|
||||||
set by the <b>VIDIOCSFREQ</b> ioctl.
|
|
||||||
<P>
|
|
||||||
<H3>Audio</H3>
|
|
||||||
TV and Radio devices have one or more audio inputs that may be selected.
|
|
||||||
The audio properties are queried by passing a <b>struct video_audio</b> to <b>VIDIOCGAUDIO</b> ioctl. The
|
|
||||||
<b>VIDIOCSAUDIO</b> ioctl sets audio properties.
|
|
||||||
<P>
|
|
||||||
The structure contains the following fields
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>audio</b><TD>The channel number</TD>
|
|
||||||
<TR><TD><b>volume</b><TD>The volume level</TD>
|
|
||||||
<TR><TD><b>bass</b><TD>The bass level</TD>
|
|
||||||
<TR><TD><b>treble</b><TD>The treble level</TD>
|
|
||||||
<TR><TD><b>flags</b><TD>Flags describing the audio channel</TD>
|
|
||||||
<TR><TD><b>name</b><TD>Canonical name for the audio input</TD>
|
|
||||||
<TR><TD><b>mode</b><TD>The mode the audio input is in</TD>
|
|
||||||
<TR><TD><b>balance</b><TD>The left/right balance</TD>
|
|
||||||
<TR><TD><b>step</b><TD>Actual step used by the hardware</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
The following flags are defined
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>VIDEO_AUDIO_MUTE</b><TD>The audio is muted</TD>
|
|
||||||
<TR><TD><b>VIDEO_AUDIO_MUTABLE</b><TD>Audio muting is supported</TD>
|
|
||||||
<TR><TD><b>VIDEO_AUDIO_VOLUME</b><TD>The volume is controllable</TD>
|
|
||||||
<TR><TD><b>VIDEO_AUDIO_BASS</b><TD>The bass is controllable</TD>
|
|
||||||
<TR><TD><b>VIDEO_AUDIO_TREBLE</b><TD>The treble is controllable</TD>
|
|
||||||
<TR><TD><b>VIDEO_AUDIO_BALANCE</b><TD>The balance is controllable</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
The following decoding modes are defined
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>VIDEO_SOUND_MONO</b><TD>Mono signal</TD>
|
|
||||||
<TR><TD><b>VIDEO_SOUND_STEREO</b><TD>Stereo signal (NICAM for TV)</TD>
|
|
||||||
<TR><TD><b>VIDEO_SOUND_LANG1</b><TD>European TV alternate language 1</TD>
|
|
||||||
<TR><TD><b>VIDEO_SOUND_LANG2</b><TD>European TV alternate language 2</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
<H3>Reading Images</H3>
|
|
||||||
Each call to the <b>read</b> syscall returns the next available image
|
|
||||||
from the device. It is up to the caller to set format and size (using
|
|
||||||
the VIDIOCSPICT and VIDIOCSWIN ioctls) and then to pass a suitable
|
|
||||||
size buffer and length to the function. Not all devices will support
|
|
||||||
read operations.
|
|
||||||
<P>
|
|
||||||
A second way to handle image capture is via the mmap interface if supported.
|
|
||||||
To use the mmap interface a user first sets the desired image size and depth
|
|
||||||
properties. Next the VIDIOCGMBUF ioctl is issued. This reports the size
|
|
||||||
of buffer to mmap and the offset within the buffer for each frame. The
|
|
||||||
number of frames supported is device dependent and may only be one.
|
|
||||||
<P>
|
|
||||||
The video_mbuf structure contains the following fields
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>size</b><TD>The number of bytes to map</TD>
|
|
||||||
<TR><TD><b>frames</b><TD>The number of frames</TD>
|
|
||||||
<TR><TD><b>offsets</b><TD>The offset of each frame</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
Once the mmap has been made the VIDIOCMCAPTURE ioctl starts the
|
|
||||||
capture to a frame using the format and image size specified in the
|
|
||||||
video_mmap (which should match or be below the initial query size).
|
|
||||||
When the VIDIOCMCAPTURE ioctl returns the frame is <em>not</em>
|
|
||||||
captured yet, the driver just instructed the hardware to start the
|
|
||||||
capture. The application has to use the VIDIOCSYNC ioctl to wait
|
|
||||||
until the capture of a frame is finished. VIDIOCSYNC takes the frame
|
|
||||||
number you want to wait for as argument.
|
|
||||||
<p>
|
|
||||||
It is allowed to call VIDIOCMCAPTURE multiple times (with different
|
|
||||||
frame numbers in video_mmap->frame of course) and thus have multiple
|
|
||||||
outstanding capture requests. A simple way do to double-buffering
|
|
||||||
using this feature looks like this:
|
|
||||||
<pre>
|
|
||||||
/* setup everything */
|
|
||||||
VIDIOCMCAPTURE(0)
|
|
||||||
while (whatever) {
|
|
||||||
VIDIOCMCAPTURE(1)
|
|
||||||
VIDIOCSYNC(0)
|
|
||||||
/* process frame 0 while the hardware captures frame 1 */
|
|
||||||
VIDIOCMCAPTURE(0)
|
|
||||||
VIDIOCSYNC(1)
|
|
||||||
/* process frame 1 while the hardware captures frame 0 */
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
Note that you are <em>not</em> limited to only two frames. The API
|
|
||||||
allows up to 32 frames, the VIDIOCGMBUF ioctl returns the number of
|
|
||||||
frames the driver granted. Thus it is possible to build deeper queues
|
|
||||||
to avoid loosing frames on load peaks.
|
|
||||||
<p>
|
|
||||||
While capturing to memory the driver will make a "best effort" attempt
|
|
||||||
to capture to screen as well if requested. This normally means all
|
|
||||||
frames that "miss" memory mapped capture will go to the display.
|
|
||||||
<P>
|
|
||||||
A final ioctl exists to allow a device to obtain related devices if a
|
|
||||||
driver has multiple components (for example video0 may not be associated
|
|
||||||
with vbi0 which would cause an intercast display program to make a bad
|
|
||||||
mistake). The VIDIOCGUNIT ioctl reports the unit numbers of the associated
|
|
||||||
devices if any exist. The video_unit structure has the following fields.
|
|
||||||
<P>
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD><b>video</b><TD>Video capture device</TD>
|
|
||||||
<TR><TD><b>vbi</b><TD>VBI capture device</TD>
|
|
||||||
<TR><TD><b>radio</b><TD>Radio device</TD>
|
|
||||||
<TR><TD><b>audio</b><TD>Audio mixer</TD>
|
|
||||||
<TR><TD><b>teletext</b><TD>Teletext device</TD>
|
|
||||||
</TABLE>
|
|
||||||
<P>
|
|
||||||
<H3>RDS Datastreams</H3>
|
|
||||||
For radio devices that support it, it is possible to receive Radio Data
|
|
||||||
System (RDS) data by means of a read() on the device. The data is packed in
|
|
||||||
groups of three, as follows:
|
|
||||||
<TABLE>
|
|
||||||
<TR><TD>First Octet</TD><TD>Least Significant Byte of RDS Block</TD></TR>
|
|
||||||
<TR><TD>Second Octet</TD><TD>Most Significant Byte of RDS Block
|
|
||||||
<TR><TD>Third Octet</TD><TD>Bit 7:</TD><TD>Error bit. Indicates that
|
|
||||||
an uncorrectable error occurred during reception of this block.</TD></TR>
|
|
||||||
<TR><TD> </TD><TD>Bit 6:</TD><TD>Corrected bit. Indicates that
|
|
||||||
an error was corrected for this data block.</TD></TR>
|
|
||||||
<TR><TD> </TD><TD>Bits 5-3:</TD><TD>Received Offset. Indicates the
|
|
||||||
offset received by the sync system.</TD></TR>
|
|
||||||
<TR><TD> </TD><TD>Bits 2-0:</TD><TD>Offset Name. Indicates the
|
|
||||||
offset applied to this data.</TD></TR>
|
|
||||||
</TABLE>
|
|
||||||
</BODY>
|
|
||||||
</HTML>
|
|
||||||
|
|
|
@ -13,17 +13,17 @@ card=11 - Prolink PlayTV PVR
|
||||||
card=12 - ASUS PVR-416
|
card=12 - ASUS PVR-416
|
||||||
card=13 - MSI TV-@nywhere
|
card=13 - MSI TV-@nywhere
|
||||||
card=14 - KWorld/VStream XPert DVB-T
|
card=14 - KWorld/VStream XPert DVB-T
|
||||||
card=15 - DVICO FusionHDTV DVB-T1
|
card=15 - DViCO FusionHDTV DVB-T1
|
||||||
card=16 - KWorld LTV883RF
|
card=16 - KWorld LTV883RF
|
||||||
card=17 - DViCO - FusionHDTV 3 Gold
|
card=17 - DViCO FusionHDTV 3 Gold-Q
|
||||||
card=18 - Hauppauge Nova-T DVB-T
|
card=18 - Hauppauge Nova-T DVB-T
|
||||||
card=19 - Conexant DVB-T reference design
|
card=19 - Conexant DVB-T reference design
|
||||||
card=20 - Provideo PV259
|
card=20 - Provideo PV259
|
||||||
card=21 - DVICO FusionHDTV DVB-T Plus
|
card=21 - DViCO FusionHDTV DVB-T Plus
|
||||||
card=22 - digitalnow DNTV Live! DVB-T
|
card=22 - digitalnow DNTV Live! DVB-T
|
||||||
card=23 - pcHDTV HD3000 HDTV
|
card=23 - pcHDTV HD3000 HDTV
|
||||||
card=24 - Hauppauge WinTV 28xxx (Roslyn) models
|
card=24 - Hauppauge WinTV 28xxx (Roslyn) models
|
||||||
card=25 - Digital-Logic MICROSPACE Entertainment Center (MEC)
|
card=25 - Digital-Logic MICROSPACE Entertainment Center (MEC)
|
||||||
card=26 - IODATA GV/BCTV7E
|
card=26 - IODATA GV/BCTV7E
|
||||||
card=27 - PixelView PlayTV Ultra Pro (Stereo)
|
card=27 - PixelView PlayTV Ultra Pro (Stereo)
|
||||||
card=28 - DViCO - FusionHDTV 3 Gold-T
|
card=28 - DViCO FusionHDTV 3 Gold-T
|
||||||
|
|
|
@ -54,3 +54,9 @@
|
||||||
55 -> LifeView FlyDVB-T DUO [5168:0306]
|
55 -> LifeView FlyDVB-T DUO [5168:0306]
|
||||||
56 -> Avermedia AVerTV 307 [1461:a70a]
|
56 -> Avermedia AVerTV 307 [1461:a70a]
|
||||||
57 -> Avermedia AVerTV GO 007 FM [1461:f31f]
|
57 -> Avermedia AVerTV GO 007 FM [1461:f31f]
|
||||||
|
58 -> ADS Tech Instant TV (saa7135) [1421:0350,1421:0370]
|
||||||
|
59 -> Kworld/Tevion V-Stream Xpert TV PVR7134
|
||||||
|
60 -> Typhoon DVB-T Duo Digital/Analog Cardbus
|
||||||
|
61 -> Philips TOUGH DVB-T reference design
|
||||||
|
62 -> Compro VideoMate TV Gold+II
|
||||||
|
63 -> Kworld Xpert TV PVR7134
|
||||||
|
|
|
@ -59,3 +59,6 @@ tuner=57 - Philips FQ1236A MK4
|
||||||
tuner=58 - Ymec TVision TVF-8531MF
|
tuner=58 - Ymec TVision TVF-8531MF
|
||||||
tuner=59 - Ymec TVision TVF-5533MF
|
tuner=59 - Ymec TVision TVF-5533MF
|
||||||
tuner=60 - Thomson DDT 7611 (ATSC/NTSC)
|
tuner=60 - Thomson DDT 7611 (ATSC/NTSC)
|
||||||
|
tuner=61 - Tena TNF9533-D/IF
|
||||||
|
tuner=62 - Philips TEA5767HN FM Radio
|
||||||
|
tuner=63 - Philips FMD1216ME MK3 Hybrid Tuner
|
||||||
|
|
|
@ -57,6 +57,15 @@ Cards can use either of these two crystals (xtal):
|
||||||
- 24.576MHz -> .audio_clock=0x200000
|
- 24.576MHz -> .audio_clock=0x200000
|
||||||
(xtal * .audio_clock = 51539600)
|
(xtal * .audio_clock = 51539600)
|
||||||
|
|
||||||
|
Some details about 30/34/35:
|
||||||
|
|
||||||
|
- saa7130 - low-price chip, doesn't have mute, that is why all those
|
||||||
|
cards should have .mute field defined in their tuner structure.
|
||||||
|
|
||||||
|
- saa7134 - usual chip
|
||||||
|
|
||||||
|
- saa7133/35 - saa7135 is probably a marketing decision, since all those
|
||||||
|
chips identifies itself as 33 on pci.
|
||||||
|
|
||||||
Credits
|
Credits
|
||||||
=======
|
=======
|
||||||
|
|
17
MAINTAINERS
17
MAINTAINERS
|
@ -512,11 +512,11 @@ W: http://linuxppc64.org
|
||||||
S: Supported
|
S: Supported
|
||||||
|
|
||||||
BTTV VIDEO4LINUX DRIVER
|
BTTV VIDEO4LINUX DRIVER
|
||||||
P: Gerd Knorr
|
P: Mauro Carvalho Chehab
|
||||||
M: kraxel@bytesex.org
|
M: mchehab@brturbo.com.br
|
||||||
L: video4linux-list@redhat.com
|
L: video4linux-list@redhat.com
|
||||||
W: http://bytesex.org/bttv/
|
W: http://linuxtv.org
|
||||||
S: Orphan
|
S: Maintained
|
||||||
|
|
||||||
BUSLOGIC SCSI DRIVER
|
BUSLOGIC SCSI DRIVER
|
||||||
P: Leonard N. Zubkoff
|
P: Leonard N. Zubkoff
|
||||||
|
@ -1149,7 +1149,7 @@ S: Maintained
|
||||||
|
|
||||||
INFINIBAND SUBSYSTEM
|
INFINIBAND SUBSYSTEM
|
||||||
P: Roland Dreier
|
P: Roland Dreier
|
||||||
M: roland@topspin.com
|
M: rolandd@cisco.com
|
||||||
P: Sean Hefty
|
P: Sean Hefty
|
||||||
M: mshefty@ichips.intel.com
|
M: mshefty@ichips.intel.com
|
||||||
P: Hal Rosenstock
|
P: Hal Rosenstock
|
||||||
|
@ -2625,10 +2625,11 @@ W: http://rio500.sourceforge.net
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
VIDEO FOR LINUX
|
VIDEO FOR LINUX
|
||||||
P: Gerd Knorr
|
P: Mauro Carvalho Chehab
|
||||||
M: kraxel@bytesex.org
|
M: mchehab@brturbo.com.br
|
||||||
L: video4linux-list@redhat.com
|
L: video4linux-list@redhat.com
|
||||||
S: Orphan
|
W: http://linuxtv.org
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
W1 DALLAS'S 1-WIRE BUS
|
W1 DALLAS'S 1-WIRE BUS
|
||||||
P: Evgeniy Polyakov
|
P: Evgeniy Polyakov
|
||||||
|
|
4
Makefile
4
Makefile
|
@ -1,7 +1,7 @@
|
||||||
VERSION = 2
|
VERSION = 2
|
||||||
PATCHLEVEL = 6
|
PATCHLEVEL = 6
|
||||||
SUBLEVEL = 12
|
SUBLEVEL = 13
|
||||||
EXTRAVERSION =
|
EXTRAVERSION =-rc2
|
||||||
NAME=Woozy Numbat
|
NAME=Woozy Numbat
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
|
|
@ -55,6 +55,8 @@ do_entInt(unsigned long type, unsigned long vector,
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
{
|
{
|
||||||
long cpu;
|
long cpu;
|
||||||
|
|
||||||
|
local_irq_disable();
|
||||||
smp_percpu_timer_interrupt(regs);
|
smp_percpu_timer_interrupt(regs);
|
||||||
cpu = smp_processor_id();
|
cpu = smp_processor_id();
|
||||||
if (cpu != boot_cpuid) {
|
if (cpu != boot_cpuid) {
|
||||||
|
|
|
@ -240,7 +240,7 @@ do_entIF(unsigned long type, struct pt_regs *regs)
|
||||||
siginfo_t info;
|
siginfo_t info;
|
||||||
int signo, code;
|
int signo, code;
|
||||||
|
|
||||||
if (regs->ps == 0) {
|
if ((regs->ps & ~IPL_MAX) == 0) {
|
||||||
if (type == 1) {
|
if (type == 1) {
|
||||||
const unsigned int *data
|
const unsigned int *data
|
||||||
= (const unsigned int *) regs->pc;
|
= (const unsigned int *) regs->pc;
|
||||||
|
|
|
@ -361,6 +361,11 @@ config NO_IDLE_HZ
|
||||||
Alternatively, if you want dynamic tick automatically enabled
|
Alternatively, if you want dynamic tick automatically enabled
|
||||||
during boot, pass "dyntick=enable" via the kernel command string.
|
during boot, pass "dyntick=enable" via the kernel command string.
|
||||||
|
|
||||||
|
Please note that dynamic tick may affect the accuracy of
|
||||||
|
timekeeping on some platforms depending on the implementation.
|
||||||
|
Currently at least OMAP platform is known to have accurate
|
||||||
|
timekeeping with dynamic tick.
|
||||||
|
|
||||||
config ARCH_DISCONTIGMEM_ENABLE
|
config ARCH_DISCONTIGMEM_ENABLE
|
||||||
bool
|
bool
|
||||||
default (ARCH_LH7A40X && !LH7A40X_CONTIGMEM)
|
default (ARCH_LH7A40X && !LH7A40X_CONTIGMEM)
|
||||||
|
|
|
@ -56,7 +56,7 @@ tune-$(CONFIG_CPU_XSCALE) :=$(call cc-option,-mtune=xscale,-mtune=strongarm110)
|
||||||
tune-$(CONFIG_CPU_V6) :=-mtune=strongarm
|
tune-$(CONFIG_CPU_V6) :=-mtune=strongarm
|
||||||
|
|
||||||
# Need -Uarm for gcc < 3.x
|
# Need -Uarm for gcc < 3.x
|
||||||
CFLAGS_ABI :=$(call cc-option,-mapcs-32,-mabi=apcs-gnu)
|
CFLAGS_ABI :=$(call cc-option,-mapcs-32,-mabi=apcs-gnu) $(call cc-option,-mno-thumb-interwork,)
|
||||||
CFLAGS +=$(CFLAGS_ABI) $(arch-y) $(tune-y) $(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,)) -msoft-float -Uarm
|
CFLAGS +=$(CFLAGS_ABI) $(arch-y) $(tune-y) $(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,)) -msoft-float -Uarm
|
||||||
AFLAGS +=$(CFLAGS_ABI) $(arch-y) $(tune-y) -msoft-float
|
AFLAGS +=$(CFLAGS_ABI) $(arch-y) $(tune-y) -msoft-float
|
||||||
|
|
||||||
|
|
|
@ -1,803 +0,0 @@
|
||||||
#
|
|
||||||
# Automatically generated make config: don't edit
|
|
||||||
# Linux kernel version: 2.6.12-rc1-bk2
|
|
||||||
# Sun Mar 27 21:31:45 2005
|
|
||||||
#
|
|
||||||
CONFIG_ARM=y
|
|
||||||
CONFIG_MMU=y
|
|
||||||
CONFIG_UID16=y
|
|
||||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
|
||||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
|
||||||
CONFIG_GENERIC_IOMAP=y
|
|
||||||
|
|
||||||
#
|
|
||||||
# Code maturity level options
|
|
||||||
#
|
|
||||||
CONFIG_EXPERIMENTAL=y
|
|
||||||
CONFIG_CLEAN_COMPILE=y
|
|
||||||
CONFIG_BROKEN_ON_SMP=y
|
|
||||||
|
|
||||||
#
|
|
||||||
# General setup
|
|
||||||
#
|
|
||||||
CONFIG_LOCALVERSION=""
|
|
||||||
CONFIG_SWAP=y
|
|
||||||
CONFIG_SYSVIPC=y
|
|
||||||
# CONFIG_POSIX_MQUEUE is not set
|
|
||||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
|
||||||
CONFIG_SYSCTL=y
|
|
||||||
# CONFIG_AUDIT is not set
|
|
||||||
CONFIG_HOTPLUG=y
|
|
||||||
CONFIG_KOBJECT_UEVENT=y
|
|
||||||
# CONFIG_IKCONFIG is not set
|
|
||||||
# CONFIG_EMBEDDED is not set
|
|
||||||
CONFIG_KALLSYMS=y
|
|
||||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
|
||||||
CONFIG_BASE_FULL=y
|
|
||||||
CONFIG_FUTEX=y
|
|
||||||
CONFIG_EPOLL=y
|
|
||||||
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
|
||||||
CONFIG_SHMEM=y
|
|
||||||
CONFIG_CC_ALIGN_FUNCTIONS=0
|
|
||||||
CONFIG_CC_ALIGN_LABELS=0
|
|
||||||
CONFIG_CC_ALIGN_LOOPS=0
|
|
||||||
CONFIG_CC_ALIGN_JUMPS=0
|
|
||||||
# CONFIG_TINY_SHMEM is not set
|
|
||||||
CONFIG_BASE_SMALL=0
|
|
||||||
|
|
||||||
#
|
|
||||||
# Loadable module support
|
|
||||||
#
|
|
||||||
CONFIG_MODULES=y
|
|
||||||
# CONFIG_MODULE_UNLOAD is not set
|
|
||||||
CONFIG_OBSOLETE_MODPARM=y
|
|
||||||
# CONFIG_MODVERSIONS is not set
|
|
||||||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
|
||||||
CONFIG_KMOD=y
|
|
||||||
|
|
||||||
#
|
|
||||||
# System Type
|
|
||||||
#
|
|
||||||
# CONFIG_ARCH_CLPS7500 is not set
|
|
||||||
# CONFIG_ARCH_CLPS711X is not set
|
|
||||||
# CONFIG_ARCH_CO285 is not set
|
|
||||||
# CONFIG_ARCH_EBSA110 is not set
|
|
||||||
# CONFIG_ARCH_CAMELOT is not set
|
|
||||||
# CONFIG_ARCH_FOOTBRIDGE is not set
|
|
||||||
# CONFIG_ARCH_INTEGRATOR is not set
|
|
||||||
# CONFIG_ARCH_IOP3XX is not set
|
|
||||||
# CONFIG_ARCH_IXP4XX is not set
|
|
||||||
# CONFIG_ARCH_IXP2000 is not set
|
|
||||||
# CONFIG_ARCH_L7200 is not set
|
|
||||||
# CONFIG_ARCH_PXA is not set
|
|
||||||
# CONFIG_ARCH_RPC is not set
|
|
||||||
CONFIG_ARCH_SA1100=y
|
|
||||||
# CONFIG_ARCH_S3C2410 is not set
|
|
||||||
# CONFIG_ARCH_SHARK is not set
|
|
||||||
# CONFIG_ARCH_LH7A40X is not set
|
|
||||||
# CONFIG_ARCH_OMAP is not set
|
|
||||||
# CONFIG_ARCH_VERSATILE is not set
|
|
||||||
# CONFIG_ARCH_IMX is not set
|
|
||||||
# CONFIG_ARCH_H720X is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# SA11x0 Implementations
|
|
||||||
#
|
|
||||||
# CONFIG_SA1100_ASSABET is not set
|
|
||||||
# CONFIG_SA1100_CERF is not set
|
|
||||||
# CONFIG_SA1100_COLLIE is not set
|
|
||||||
# CONFIG_SA1100_H3100 is not set
|
|
||||||
# CONFIG_SA1100_H3600 is not set
|
|
||||||
# CONFIG_SA1100_H3800 is not set
|
|
||||||
# CONFIG_SA1100_BADGE4 is not set
|
|
||||||
# CONFIG_SA1100_JORNADA720 is not set
|
|
||||||
# CONFIG_SA1100_HACKKIT is not set
|
|
||||||
# CONFIG_SA1100_LART is not set
|
|
||||||
# CONFIG_SA1100_PLEB is not set
|
|
||||||
# CONFIG_SA1100_SHANNON is not set
|
|
||||||
# CONFIG_SA1100_SIMPAD is not set
|
|
||||||
# CONFIG_SA1100_SSP is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Processor Type
|
|
||||||
#
|
|
||||||
CONFIG_CPU_32=y
|
|
||||||
CONFIG_CPU_SA1100=y
|
|
||||||
CONFIG_CPU_32v4=y
|
|
||||||
CONFIG_CPU_ABRT_EV4=y
|
|
||||||
CONFIG_CPU_CACHE_V4WB=y
|
|
||||||
CONFIG_CPU_CACHE_VIVT=y
|
|
||||||
CONFIG_CPU_TLB_V4WB=y
|
|
||||||
CONFIG_CPU_MINICACHE=y
|
|
||||||
|
|
||||||
#
|
|
||||||
# Processor Features
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# Bus support
|
|
||||||
#
|
|
||||||
CONFIG_ISA=y
|
|
||||||
|
|
||||||
#
|
|
||||||
# PCCARD (PCMCIA/CardBus) support
|
|
||||||
#
|
|
||||||
CONFIG_PCCARD=y
|
|
||||||
# CONFIG_PCMCIA_DEBUG is not set
|
|
||||||
CONFIG_PCMCIA=y
|
|
||||||
|
|
||||||
#
|
|
||||||
# PC-card bridges
|
|
||||||
#
|
|
||||||
CONFIG_I82365=y
|
|
||||||
# CONFIG_TCIC is not set
|
|
||||||
CONFIG_PCMCIA_SA1100=y
|
|
||||||
CONFIG_PCCARD_NONSTATIC=y
|
|
||||||
|
|
||||||
#
|
|
||||||
# Kernel Features
|
|
||||||
#
|
|
||||||
# CONFIG_PREEMPT is not set
|
|
||||||
CONFIG_DISCONTIGMEM=y
|
|
||||||
# CONFIG_LEDS is not set
|
|
||||||
CONFIG_ALIGNMENT_TRAP=y
|
|
||||||
|
|
||||||
#
|
|
||||||
# Boot options
|
|
||||||
#
|
|
||||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
|
||||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
|
||||||
CONFIG_CMDLINE="keepinitrd mem=16M root=/dev/ram ramdisk=8192 initrd=0xd0000000,4M"
|
|
||||||
# CONFIG_XIP_KERNEL is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# CPU Frequency scaling
|
|
||||||
#
|
|
||||||
# CONFIG_CPU_FREQ is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Floating point emulation
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# At least one emulation must be selected
|
|
||||||
#
|
|
||||||
# CONFIG_FPE_NWFPE is not set
|
|
||||||
# CONFIG_FPE_FASTFPE is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Userspace binary formats
|
|
||||||
#
|
|
||||||
CONFIG_BINFMT_ELF=y
|
|
||||||
CONFIG_BINFMT_AOUT=y
|
|
||||||
# CONFIG_BINFMT_MISC is not set
|
|
||||||
# CONFIG_ARTHUR is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Power management options
|
|
||||||
#
|
|
||||||
# CONFIG_PM is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Device Drivers
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# Generic Driver Options
|
|
||||||
#
|
|
||||||
CONFIG_STANDALONE=y
|
|
||||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
|
||||||
# CONFIG_FW_LOADER is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Memory Technology Devices (MTD)
|
|
||||||
#
|
|
||||||
# CONFIG_MTD is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Parallel port support
|
|
||||||
#
|
|
||||||
# CONFIG_PARPORT is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Plug and Play support
|
|
||||||
#
|
|
||||||
# CONFIG_PNP is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Block devices
|
|
||||||
#
|
|
||||||
# CONFIG_BLK_DEV_FD is not set
|
|
||||||
# CONFIG_BLK_DEV_XD is not set
|
|
||||||
# CONFIG_BLK_DEV_COW_COMMON is not set
|
|
||||||
CONFIG_BLK_DEV_LOOP=m
|
|
||||||
# CONFIG_BLK_DEV_CRYPTOLOOP is not set
|
|
||||||
CONFIG_BLK_DEV_NBD=m
|
|
||||||
# CONFIG_BLK_DEV_RAM is not set
|
|
||||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
|
||||||
CONFIG_INITRAMFS_SOURCE=""
|
|
||||||
# CONFIG_CDROM_PKTCDVD is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# IO Schedulers
|
|
||||||
#
|
|
||||||
CONFIG_IOSCHED_NOOP=y
|
|
||||||
CONFIG_IOSCHED_AS=y
|
|
||||||
CONFIG_IOSCHED_DEADLINE=y
|
|
||||||
CONFIG_IOSCHED_CFQ=y
|
|
||||||
# CONFIG_ATA_OVER_ETH is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# ATA/ATAPI/MFM/RLL support
|
|
||||||
#
|
|
||||||
CONFIG_IDE=y
|
|
||||||
CONFIG_BLK_DEV_IDE=y
|
|
||||||
|
|
||||||
#
|
|
||||||
# Please see Documentation/ide.txt for help/info on IDE drives
|
|
||||||
#
|
|
||||||
# CONFIG_BLK_DEV_IDE_SATA is not set
|
|
||||||
CONFIG_BLK_DEV_IDEDISK=y
|
|
||||||
# CONFIG_IDEDISK_MULTI_MODE is not set
|
|
||||||
# CONFIG_BLK_DEV_IDECS is not set
|
|
||||||
# CONFIG_BLK_DEV_IDECD is not set
|
|
||||||
# CONFIG_BLK_DEV_IDETAPE is not set
|
|
||||||
# CONFIG_BLK_DEV_IDEFLOPPY is not set
|
|
||||||
# CONFIG_IDE_TASK_IOCTL is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# IDE chipset support/bugfixes
|
|
||||||
#
|
|
||||||
CONFIG_IDE_GENERIC=y
|
|
||||||
# CONFIG_IDE_ARM is not set
|
|
||||||
# CONFIG_IDE_CHIPSETS is not set
|
|
||||||
# CONFIG_BLK_DEV_IDEDMA is not set
|
|
||||||
# CONFIG_IDEDMA_AUTO is not set
|
|
||||||
# CONFIG_BLK_DEV_HD is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# SCSI device support
|
|
||||||
#
|
|
||||||
# CONFIG_SCSI is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Multi-device support (RAID and LVM)
|
|
||||||
#
|
|
||||||
# CONFIG_MD is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Fusion MPT device support
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# IEEE 1394 (FireWire) support
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# I2O device support
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# Networking support
|
|
||||||
#
|
|
||||||
CONFIG_NET=y
|
|
||||||
|
|
||||||
#
|
|
||||||
# Networking options
|
|
||||||
#
|
|
||||||
CONFIG_PACKET=y
|
|
||||||
CONFIG_PACKET_MMAP=y
|
|
||||||
# CONFIG_NETLINK_DEV is not set
|
|
||||||
CONFIG_UNIX=y
|
|
||||||
# CONFIG_NET_KEY is not set
|
|
||||||
CONFIG_INET=y
|
|
||||||
CONFIG_IP_MULTICAST=y
|
|
||||||
# CONFIG_IP_ADVANCED_ROUTER is not set
|
|
||||||
# CONFIG_IP_PNP is not set
|
|
||||||
# CONFIG_NET_IPIP is not set
|
|
||||||
# CONFIG_NET_IPGRE is not set
|
|
||||||
# CONFIG_IP_MROUTE is not set
|
|
||||||
# CONFIG_ARPD is not set
|
|
||||||
# CONFIG_SYN_COOKIES is not set
|
|
||||||
# CONFIG_INET_AH is not set
|
|
||||||
# CONFIG_INET_ESP is not set
|
|
||||||
# CONFIG_INET_IPCOMP is not set
|
|
||||||
# CONFIG_INET_TUNNEL is not set
|
|
||||||
CONFIG_IP_TCPDIAG=y
|
|
||||||
# CONFIG_IP_TCPDIAG_IPV6 is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# IP: Virtual Server Configuration
|
|
||||||
#
|
|
||||||
# CONFIG_IP_VS is not set
|
|
||||||
# CONFIG_IPV6 is not set
|
|
||||||
CONFIG_NETFILTER=y
|
|
||||||
# CONFIG_NETFILTER_DEBUG is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# IP: Netfilter Configuration
|
|
||||||
#
|
|
||||||
# CONFIG_IP_NF_CONNTRACK is not set
|
|
||||||
# CONFIG_IP_NF_CONNTRACK_MARK is not set
|
|
||||||
# CONFIG_IP_NF_QUEUE is not set
|
|
||||||
# CONFIG_IP_NF_IPTABLES is not set
|
|
||||||
# CONFIG_IP_NF_ARPTABLES is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# SCTP Configuration (EXPERIMENTAL)
|
|
||||||
#
|
|
||||||
# CONFIG_IP_SCTP is not set
|
|
||||||
# CONFIG_ATM is not set
|
|
||||||
# CONFIG_BRIDGE is not set
|
|
||||||
# CONFIG_VLAN_8021Q is not set
|
|
||||||
# CONFIG_DECNET is not set
|
|
||||||
# CONFIG_LLC2 is not set
|
|
||||||
# CONFIG_IPX is not set
|
|
||||||
# CONFIG_ATALK is not set
|
|
||||||
# CONFIG_X25 is not set
|
|
||||||
# CONFIG_LAPB is not set
|
|
||||||
# CONFIG_NET_DIVERT is not set
|
|
||||||
# CONFIG_ECONET is not set
|
|
||||||
# CONFIG_WAN_ROUTER is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# QoS and/or fair queueing
|
|
||||||
#
|
|
||||||
# CONFIG_NET_SCHED is not set
|
|
||||||
# CONFIG_NET_CLS_ROUTE is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Network testing
|
|
||||||
#
|
|
||||||
# CONFIG_NET_PKTGEN is not set
|
|
||||||
# CONFIG_NETPOLL is not set
|
|
||||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
|
||||||
# CONFIG_HAMRADIO is not set
|
|
||||||
# CONFIG_IRDA is not set
|
|
||||||
# CONFIG_BT is not set
|
|
||||||
CONFIG_NETDEVICES=y
|
|
||||||
# CONFIG_DUMMY is not set
|
|
||||||
# CONFIG_BONDING is not set
|
|
||||||
# CONFIG_EQUALIZER is not set
|
|
||||||
# CONFIG_TUN is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# ARCnet devices
|
|
||||||
#
|
|
||||||
# CONFIG_ARCNET is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Ethernet (10 or 100Mbit)
|
|
||||||
#
|
|
||||||
CONFIG_NET_ETHERNET=y
|
|
||||||
# CONFIG_MII is not set
|
|
||||||
# CONFIG_NET_VENDOR_3COM is not set
|
|
||||||
# CONFIG_LANCE is not set
|
|
||||||
# CONFIG_NET_VENDOR_SMC is not set
|
|
||||||
# CONFIG_SMC91X is not set
|
|
||||||
# CONFIG_NET_VENDOR_RACAL is not set
|
|
||||||
# CONFIG_AT1700 is not set
|
|
||||||
# CONFIG_DEPCA is not set
|
|
||||||
# CONFIG_HP100 is not set
|
|
||||||
# CONFIG_NET_ISA is not set
|
|
||||||
# CONFIG_NET_PCI is not set
|
|
||||||
# CONFIG_NET_POCKET is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Ethernet (1000 Mbit)
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# Ethernet (10000 Mbit)
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# Token Ring devices
|
|
||||||
#
|
|
||||||
# CONFIG_TR is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Wireless LAN (non-hamradio)
|
|
||||||
#
|
|
||||||
CONFIG_NET_RADIO=y
|
|
||||||
|
|
||||||
#
|
|
||||||
# Obsolete Wireless cards support (pre-802.11)
|
|
||||||
#
|
|
||||||
# CONFIG_STRIP is not set
|
|
||||||
# CONFIG_ARLAN is not set
|
|
||||||
# CONFIG_WAVELAN is not set
|
|
||||||
CONFIG_PCMCIA_WAVELAN=y
|
|
||||||
# CONFIG_PCMCIA_NETWAVE is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Wireless 802.11 Frequency Hopping cards support
|
|
||||||
#
|
|
||||||
# CONFIG_PCMCIA_RAYCS is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Wireless 802.11b ISA/PCI cards support
|
|
||||||
#
|
|
||||||
# CONFIG_HERMES is not set
|
|
||||||
# CONFIG_ATMEL is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Wireless 802.11b Pcmcia/Cardbus cards support
|
|
||||||
#
|
|
||||||
CONFIG_AIRO_CS=y
|
|
||||||
CONFIG_PCMCIA_WL3501=y
|
|
||||||
CONFIG_NET_WIRELESS=y
|
|
||||||
|
|
||||||
#
|
|
||||||
# PCMCIA network device support
|
|
||||||
#
|
|
||||||
CONFIG_NET_PCMCIA=y
|
|
||||||
CONFIG_PCMCIA_3C589=y
|
|
||||||
# CONFIG_PCMCIA_3C574 is not set
|
|
||||||
# CONFIG_PCMCIA_FMVJ18X is not set
|
|
||||||
CONFIG_PCMCIA_PCNET=y
|
|
||||||
# CONFIG_PCMCIA_NMCLAN is not set
|
|
||||||
# CONFIG_PCMCIA_SMC91C92 is not set
|
|
||||||
# CONFIG_PCMCIA_XIRC2PS is not set
|
|
||||||
# CONFIG_PCMCIA_AXNET is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Wan interfaces
|
|
||||||
#
|
|
||||||
# CONFIG_WAN is not set
|
|
||||||
# CONFIG_PPP is not set
|
|
||||||
# CONFIG_SLIP is not set
|
|
||||||
# CONFIG_SHAPER is not set
|
|
||||||
# CONFIG_NETCONSOLE is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# ISDN subsystem
|
|
||||||
#
|
|
||||||
# CONFIG_ISDN is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Input device support
|
|
||||||
#
|
|
||||||
CONFIG_INPUT=y
|
|
||||||
|
|
||||||
#
|
|
||||||
# Userland interfaces
|
|
||||||
#
|
|
||||||
CONFIG_INPUT_MOUSEDEV=y
|
|
||||||
CONFIG_INPUT_MOUSEDEV_PSAUX=y
|
|
||||||
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
|
|
||||||
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
|
||||||
# CONFIG_INPUT_JOYDEV is not set
|
|
||||||
# CONFIG_INPUT_TSDEV is not set
|
|
||||||
# CONFIG_INPUT_EVDEV is not set
|
|
||||||
# CONFIG_INPUT_EVBUG is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Input Device Drivers
|
|
||||||
#
|
|
||||||
CONFIG_INPUT_KEYBOARD=y
|
|
||||||
CONFIG_KEYBOARD_ATKBD=y
|
|
||||||
# CONFIG_KEYBOARD_SUNKBD is not set
|
|
||||||
# CONFIG_KEYBOARD_LKKBD is not set
|
|
||||||
# CONFIG_KEYBOARD_XTKBD is not set
|
|
||||||
# CONFIG_KEYBOARD_NEWTON is not set
|
|
||||||
CONFIG_INPUT_MOUSE=y
|
|
||||||
CONFIG_MOUSE_PS2=y
|
|
||||||
# CONFIG_MOUSE_SERIAL is not set
|
|
||||||
# CONFIG_MOUSE_INPORT is not set
|
|
||||||
# CONFIG_MOUSE_LOGIBM is not set
|
|
||||||
# CONFIG_MOUSE_PC110PAD is not set
|
|
||||||
# CONFIG_MOUSE_VSXXXAA is not set
|
|
||||||
# CONFIG_INPUT_JOYSTICK is not set
|
|
||||||
# CONFIG_INPUT_TOUCHSCREEN is not set
|
|
||||||
# CONFIG_INPUT_MISC is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Hardware I/O ports
|
|
||||||
#
|
|
||||||
CONFIG_SERIO=y
|
|
||||||
CONFIG_SERIO_SERPORT=y
|
|
||||||
CONFIG_SERIO_LIBPS2=y
|
|
||||||
# CONFIG_SERIO_RAW is not set
|
|
||||||
# CONFIG_GAMEPORT is not set
|
|
||||||
CONFIG_SOUND_GAMEPORT=y
|
|
||||||
|
|
||||||
#
|
|
||||||
# Character devices
|
|
||||||
#
|
|
||||||
CONFIG_VT=y
|
|
||||||
CONFIG_VT_CONSOLE=y
|
|
||||||
CONFIG_HW_CONSOLE=y
|
|
||||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Serial drivers
|
|
||||||
#
|
|
||||||
# CONFIG_SERIAL_8250 is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Non-8250 serial port support
|
|
||||||
#
|
|
||||||
CONFIG_SERIAL_SA1100=y
|
|
||||||
CONFIG_SERIAL_SA1100_CONSOLE=y
|
|
||||||
CONFIG_SERIAL_CORE=y
|
|
||||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
|
||||||
CONFIG_UNIX98_PTYS=y
|
|
||||||
CONFIG_LEGACY_PTYS=y
|
|
||||||
CONFIG_LEGACY_PTY_COUNT=256
|
|
||||||
|
|
||||||
#
|
|
||||||
# IPMI
|
|
||||||
#
|
|
||||||
# CONFIG_IPMI_HANDLER is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Watchdog Cards
|
|
||||||
#
|
|
||||||
# CONFIG_WATCHDOG is not set
|
|
||||||
# CONFIG_NVRAM is not set
|
|
||||||
# CONFIG_RTC is not set
|
|
||||||
# CONFIG_DTLK is not set
|
|
||||||
# CONFIG_R3964 is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Ftape, the floppy tape device driver
|
|
||||||
#
|
|
||||||
# CONFIG_DRM is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# PCMCIA character devices
|
|
||||||
#
|
|
||||||
# CONFIG_SYNCLINK_CS is not set
|
|
||||||
# CONFIG_RAW_DRIVER is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# TPM devices
|
|
||||||
#
|
|
||||||
# CONFIG_TCG_TPM is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# I2C support
|
|
||||||
#
|
|
||||||
# CONFIG_I2C is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Misc devices
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# Multimedia devices
|
|
||||||
#
|
|
||||||
# CONFIG_VIDEO_DEV is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Digital Video Broadcasting Devices
|
|
||||||
#
|
|
||||||
# CONFIG_DVB is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Graphics support
|
|
||||||
#
|
|
||||||
CONFIG_FB=y
|
|
||||||
CONFIG_FB_CFB_FILLRECT=y
|
|
||||||
CONFIG_FB_CFB_COPYAREA=y
|
|
||||||
CONFIG_FB_CFB_IMAGEBLIT=y
|
|
||||||
CONFIG_FB_SOFT_CURSOR=y
|
|
||||||
# CONFIG_FB_MODE_HELPERS is not set
|
|
||||||
# CONFIG_FB_TILEBLITTING is not set
|
|
||||||
CONFIG_FB_SA1100=y
|
|
||||||
# CONFIG_FB_VIRTUAL is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Console display driver support
|
|
||||||
#
|
|
||||||
# CONFIG_VGA_CONSOLE is not set
|
|
||||||
# CONFIG_MDA_CONSOLE is not set
|
|
||||||
CONFIG_DUMMY_CONSOLE=y
|
|
||||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
|
||||||
CONFIG_FONTS=y
|
|
||||||
CONFIG_FONT_8x8=y
|
|
||||||
# CONFIG_FONT_8x16 is not set
|
|
||||||
# CONFIG_FONT_6x11 is not set
|
|
||||||
# CONFIG_FONT_PEARL_8x8 is not set
|
|
||||||
# CONFIG_FONT_ACORN_8x8 is not set
|
|
||||||
# CONFIG_FONT_MINI_4x6 is not set
|
|
||||||
# CONFIG_FONT_SUN8x16 is not set
|
|
||||||
# CONFIG_FONT_SUN12x22 is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Logo configuration
|
|
||||||
#
|
|
||||||
# CONFIG_LOGO is not set
|
|
||||||
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Sound
|
|
||||||
#
|
|
||||||
# CONFIG_SOUND is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# USB support
|
|
||||||
#
|
|
||||||
CONFIG_USB_ARCH_HAS_HCD=y
|
|
||||||
# CONFIG_USB_ARCH_HAS_OHCI is not set
|
|
||||||
# CONFIG_USB is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# USB Gadget Support
|
|
||||||
#
|
|
||||||
# CONFIG_USB_GADGET is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# MMC/SD Card support
|
|
||||||
#
|
|
||||||
# CONFIG_MMC is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# File systems
|
|
||||||
#
|
|
||||||
CONFIG_EXT2_FS=y
|
|
||||||
# CONFIG_EXT2_FS_XATTR is not set
|
|
||||||
# CONFIG_EXT3_FS is not set
|
|
||||||
# CONFIG_JBD is not set
|
|
||||||
# CONFIG_REISERFS_FS is not set
|
|
||||||
# CONFIG_JFS_FS is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# XFS support
|
|
||||||
#
|
|
||||||
# CONFIG_XFS_FS is not set
|
|
||||||
# CONFIG_MINIX_FS is not set
|
|
||||||
# CONFIG_ROMFS_FS is not set
|
|
||||||
# CONFIG_QUOTA is not set
|
|
||||||
CONFIG_DNOTIFY=y
|
|
||||||
# CONFIG_AUTOFS_FS is not set
|
|
||||||
# CONFIG_AUTOFS4_FS is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# CD-ROM/DVD Filesystems
|
|
||||||
#
|
|
||||||
# CONFIG_ISO9660_FS is not set
|
|
||||||
# CONFIG_UDF_FS is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# DOS/FAT/NT Filesystems
|
|
||||||
#
|
|
||||||
CONFIG_FAT_FS=y
|
|
||||||
CONFIG_MSDOS_FS=y
|
|
||||||
# CONFIG_VFAT_FS is not set
|
|
||||||
CONFIG_FAT_DEFAULT_CODEPAGE=437
|
|
||||||
# CONFIG_NTFS_FS is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Pseudo filesystems
|
|
||||||
#
|
|
||||||
CONFIG_PROC_FS=y
|
|
||||||
CONFIG_SYSFS=y
|
|
||||||
# CONFIG_DEVFS_FS is not set
|
|
||||||
# CONFIG_DEVPTS_FS_XATTR is not set
|
|
||||||
# CONFIG_TMPFS is not set
|
|
||||||
# CONFIG_HUGETLB_PAGE is not set
|
|
||||||
CONFIG_RAMFS=y
|
|
||||||
|
|
||||||
#
|
|
||||||
# Miscellaneous filesystems
|
|
||||||
#
|
|
||||||
# CONFIG_ADFS_FS is not set
|
|
||||||
# CONFIG_AFFS_FS is not set
|
|
||||||
# CONFIG_HFS_FS is not set
|
|
||||||
# CONFIG_HFSPLUS_FS is not set
|
|
||||||
# CONFIG_BEFS_FS is not set
|
|
||||||
# CONFIG_BFS_FS is not set
|
|
||||||
# CONFIG_EFS_FS is not set
|
|
||||||
# CONFIG_CRAMFS is not set
|
|
||||||
# CONFIG_VXFS_FS is not set
|
|
||||||
# CONFIG_HPFS_FS is not set
|
|
||||||
# CONFIG_QNX4FS_FS is not set
|
|
||||||
# CONFIG_SYSV_FS is not set
|
|
||||||
# CONFIG_UFS_FS is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Network File Systems
|
|
||||||
#
|
|
||||||
CONFIG_NFS_FS=y
|
|
||||||
# CONFIG_NFS_V3 is not set
|
|
||||||
# CONFIG_NFS_V4 is not set
|
|
||||||
# CONFIG_NFS_DIRECTIO is not set
|
|
||||||
# CONFIG_NFSD is not set
|
|
||||||
CONFIG_LOCKD=y
|
|
||||||
CONFIG_SUNRPC=y
|
|
||||||
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
|
||||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
|
||||||
# CONFIG_SMB_FS is not set
|
|
||||||
# CONFIG_CIFS is not set
|
|
||||||
# CONFIG_NCP_FS is not set
|
|
||||||
# CONFIG_CODA_FS is not set
|
|
||||||
# CONFIG_AFS_FS is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Partition Types
|
|
||||||
#
|
|
||||||
# CONFIG_PARTITION_ADVANCED is not set
|
|
||||||
CONFIG_MSDOS_PARTITION=y
|
|
||||||
|
|
||||||
#
|
|
||||||
# Native Language Support
|
|
||||||
#
|
|
||||||
CONFIG_NLS=y
|
|
||||||
CONFIG_NLS_DEFAULT="iso8859-1"
|
|
||||||
# CONFIG_NLS_CODEPAGE_437 is not set
|
|
||||||
# CONFIG_NLS_CODEPAGE_737 is not set
|
|
||||||
# CONFIG_NLS_CODEPAGE_775 is not set
|
|
||||||
# CONFIG_NLS_CODEPAGE_850 is not set
|
|
||||||
# CONFIG_NLS_CODEPAGE_852 is not set
|
|
||||||
# CONFIG_NLS_CODEPAGE_855 is not set
|
|
||||||
# CONFIG_NLS_CODEPAGE_857 is not set
|
|
||||||
# CONFIG_NLS_CODEPAGE_860 is not set
|
|
||||||
# CONFIG_NLS_CODEPAGE_861 is not set
|
|
||||||
# CONFIG_NLS_CODEPAGE_862 is not set
|
|
||||||
# CONFIG_NLS_CODEPAGE_863 is not set
|
|
||||||
# CONFIG_NLS_CODEPAGE_864 is not set
|
|
||||||
# CONFIG_NLS_CODEPAGE_865 is not set
|
|
||||||
# CONFIG_NLS_CODEPAGE_866 is not set
|
|
||||||
# CONFIG_NLS_CODEPAGE_869 is not set
|
|
||||||
# CONFIG_NLS_CODEPAGE_936 is not set
|
|
||||||
# CONFIG_NLS_CODEPAGE_950 is not set
|
|
||||||
# CONFIG_NLS_CODEPAGE_932 is not set
|
|
||||||
# CONFIG_NLS_CODEPAGE_949 is not set
|
|
||||||
# CONFIG_NLS_CODEPAGE_874 is not set
|
|
||||||
# CONFIG_NLS_ISO8859_8 is not set
|
|
||||||
# CONFIG_NLS_CODEPAGE_1250 is not set
|
|
||||||
# CONFIG_NLS_CODEPAGE_1251 is not set
|
|
||||||
# CONFIG_NLS_ASCII is not set
|
|
||||||
# CONFIG_NLS_ISO8859_1 is not set
|
|
||||||
# CONFIG_NLS_ISO8859_2 is not set
|
|
||||||
# CONFIG_NLS_ISO8859_3 is not set
|
|
||||||
# CONFIG_NLS_ISO8859_4 is not set
|
|
||||||
# CONFIG_NLS_ISO8859_5 is not set
|
|
||||||
# CONFIG_NLS_ISO8859_6 is not set
|
|
||||||
# CONFIG_NLS_ISO8859_7 is not set
|
|
||||||
# CONFIG_NLS_ISO8859_9 is not set
|
|
||||||
# CONFIG_NLS_ISO8859_13 is not set
|
|
||||||
# CONFIG_NLS_ISO8859_14 is not set
|
|
||||||
# CONFIG_NLS_ISO8859_15 is not set
|
|
||||||
# CONFIG_NLS_KOI8_R is not set
|
|
||||||
# CONFIG_NLS_KOI8_U is not set
|
|
||||||
# CONFIG_NLS_UTF8 is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Profiling support
|
|
||||||
#
|
|
||||||
# CONFIG_PROFILING is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Kernel hacking
|
|
||||||
#
|
|
||||||
# CONFIG_PRINTK_TIME is not set
|
|
||||||
# CONFIG_DEBUG_KERNEL is not set
|
|
||||||
CONFIG_LOG_BUF_SHIFT=14
|
|
||||||
CONFIG_DEBUG_BUGVERBOSE=y
|
|
||||||
CONFIG_FRAME_POINTER=y
|
|
||||||
# CONFIG_DEBUG_USER is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Security options
|
|
||||||
#
|
|
||||||
# CONFIG_KEYS is not set
|
|
||||||
# CONFIG_SECURITY is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Cryptographic options
|
|
||||||
#
|
|
||||||
# CONFIG_CRYPTO is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Hardware crypto devices
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# Library routines
|
|
||||||
#
|
|
||||||
# CONFIG_CRC_CCITT is not set
|
|
||||||
CONFIG_CRC32=y
|
|
||||||
# CONFIG_LIBCRC32C is not set
|
|
|
@ -30,9 +30,6 @@ extern void __lshrdi3(void);
|
||||||
extern void __modsi3(void);
|
extern void __modsi3(void);
|
||||||
extern void __muldi3(void);
|
extern void __muldi3(void);
|
||||||
extern void __ucmpdi2(void);
|
extern void __ucmpdi2(void);
|
||||||
extern void __udivdi3(void);
|
|
||||||
extern void __umoddi3(void);
|
|
||||||
extern void __udivmoddi4(void);
|
|
||||||
extern void __udivsi3(void);
|
extern void __udivsi3(void);
|
||||||
extern void __umodsi3(void);
|
extern void __umodsi3(void);
|
||||||
extern void __do_div64(void);
|
extern void __do_div64(void);
|
||||||
|
@ -134,9 +131,6 @@ EXPORT_SYMBOL(__lshrdi3);
|
||||||
EXPORT_SYMBOL(__modsi3);
|
EXPORT_SYMBOL(__modsi3);
|
||||||
EXPORT_SYMBOL(__muldi3);
|
EXPORT_SYMBOL(__muldi3);
|
||||||
EXPORT_SYMBOL(__ucmpdi2);
|
EXPORT_SYMBOL(__ucmpdi2);
|
||||||
EXPORT_SYMBOL(__udivdi3);
|
|
||||||
EXPORT_SYMBOL(__umoddi3);
|
|
||||||
EXPORT_SYMBOL(__udivmoddi4);
|
|
||||||
EXPORT_SYMBOL(__udivsi3);
|
EXPORT_SYMBOL(__udivsi3);
|
||||||
EXPORT_SYMBOL(__umodsi3);
|
EXPORT_SYMBOL(__umodsi3);
|
||||||
EXPORT_SYMBOL(__do_div64);
|
EXPORT_SYMBOL(__do_div64);
|
||||||
|
|
|
@ -344,9 +344,9 @@ __create_page_tables:
|
||||||
str r6, [r0]
|
str r6, [r0]
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_DEBUG_LL
|
||||||
bic r7, r7, #0x0c @ turn off cacheable
|
bic r7, r7, #0x0c @ turn off cacheable
|
||||||
@ and bufferable bits
|
@ and bufferable bits
|
||||||
#ifdef CONFIG_DEBUG_LL
|
|
||||||
/*
|
/*
|
||||||
* Map in IO space for serial debugging.
|
* Map in IO space for serial debugging.
|
||||||
* This allows debug messages to be output
|
* This allows debug messages to be output
|
||||||
|
@ -372,27 +372,23 @@ __create_page_tables:
|
||||||
teq r1, #MACH_TYPE_NETWINDER
|
teq r1, #MACH_TYPE_NETWINDER
|
||||||
teqne r1, #MACH_TYPE_CATS
|
teqne r1, #MACH_TYPE_CATS
|
||||||
bne 1f
|
bne 1f
|
||||||
add r0, r4, #0x3fc0 @ ff000000
|
add r0, r4, #0xff000000 >> 18
|
||||||
mov r3, #0x7c000000
|
orr r3, r7, #0x7c000000
|
||||||
orr r3, r3, r7
|
str r3, [r0]
|
||||||
str r3, [r0], #4
|
|
||||||
add r3, r3, #1 << 20
|
|
||||||
str r3, [r0], #4
|
|
||||||
1:
|
1:
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_ARCH_RPC
|
#ifdef CONFIG_ARCH_RPC
|
||||||
/*
|
/*
|
||||||
* Map in screen at 0x02000000 & SCREEN2_BASE
|
* Map in screen at 0x02000000 & SCREEN2_BASE
|
||||||
* Similar reasons here - for debug. This is
|
* Similar reasons here - for debug. This is
|
||||||
* only for Acorn RiscPC architectures.
|
* only for Acorn RiscPC architectures.
|
||||||
*/
|
*/
|
||||||
add r0, r4, #0x80 @ 02000000
|
add r0, r4, #0x02000000 >> 18
|
||||||
mov r3, #0x02000000
|
orr r3, r7, #0x02000000
|
||||||
orr r3, r3, r7
|
|
||||||
str r3, [r0]
|
str r3, [r0]
|
||||||
add r0, r4, #0x3600 @ d8000000
|
add r0, r4, #0xd8000000 >> 18
|
||||||
str r3, [r0]
|
str r3, [r0]
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
.ltorg
|
.ltorg
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include <asm/leds.h>
|
#include <asm/leds.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
|
#include <asm/mach/time.h>
|
||||||
|
|
||||||
extern const char *processor_modes[];
|
extern const char *processor_modes[];
|
||||||
extern void setup_mm_for_reboot(char mode);
|
extern void setup_mm_for_reboot(char mode);
|
||||||
|
@ -85,8 +86,10 @@ EXPORT_SYMBOL(pm_power_off);
|
||||||
void default_idle(void)
|
void default_idle(void)
|
||||||
{
|
{
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
if (!need_resched() && !hlt_counter)
|
if (!need_resched() && !hlt_counter) {
|
||||||
|
timer_dyn_reprogram();
|
||||||
arch_idle();
|
arch_idle();
|
||||||
|
}
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -359,7 +359,8 @@ void cpu_init(void)
|
||||||
"I" (offsetof(struct stack, abt[0])),
|
"I" (offsetof(struct stack, abt[0])),
|
||||||
"I" (PSR_F_BIT | PSR_I_BIT | UND_MODE),
|
"I" (PSR_F_BIT | PSR_I_BIT | UND_MODE),
|
||||||
"I" (offsetof(struct stack, und[0])),
|
"I" (offsetof(struct stack, und[0])),
|
||||||
"I" (PSR_F_BIT | PSR_I_BIT | SVC_MODE));
|
"I" (PSR_F_BIT | PSR_I_BIT | SVC_MODE)
|
||||||
|
: "r14");
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct machine_desc * __init setup_machine(unsigned int nr)
|
static struct machine_desc * __init setup_machine(unsigned int nr)
|
||||||
|
@ -736,8 +737,8 @@ void __init setup_arch(char **cmdline_p)
|
||||||
if (mdesc->soft_reboot)
|
if (mdesc->soft_reboot)
|
||||||
reboot_setup("s");
|
reboot_setup("s");
|
||||||
|
|
||||||
if (mdesc->param_offset)
|
if (mdesc->boot_params)
|
||||||
tags = phys_to_virt(mdesc->param_offset);
|
tags = phys_to_virt(mdesc->boot_params);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we have the old style parameters, convert them to
|
* If we have the old style parameters, convert them to
|
||||||
|
|
|
@ -502,3 +502,126 @@ int __init setup_profiling_timer(unsigned int multiplier)
|
||||||
{
|
{
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
on_each_cpu_mask(void (*func)(void *), void *info, int retry, int wait,
|
||||||
|
cpumask_t mask)
|
||||||
|
{
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
preempt_disable();
|
||||||
|
|
||||||
|
ret = smp_call_function_on_cpu(func, info, retry, wait, mask);
|
||||||
|
if (cpu_isset(smp_processor_id(), mask))
|
||||||
|
func(info);
|
||||||
|
|
||||||
|
preempt_enable();
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**********************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TLB operations
|
||||||
|
*/
|
||||||
|
struct tlb_args {
|
||||||
|
struct vm_area_struct *ta_vma;
|
||||||
|
unsigned long ta_start;
|
||||||
|
unsigned long ta_end;
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline void ipi_flush_tlb_all(void *ignored)
|
||||||
|
{
|
||||||
|
local_flush_tlb_all();
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void ipi_flush_tlb_mm(void *arg)
|
||||||
|
{
|
||||||
|
struct mm_struct *mm = (struct mm_struct *)arg;
|
||||||
|
|
||||||
|
local_flush_tlb_mm(mm);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void ipi_flush_tlb_page(void *arg)
|
||||||
|
{
|
||||||
|
struct tlb_args *ta = (struct tlb_args *)arg;
|
||||||
|
|
||||||
|
local_flush_tlb_page(ta->ta_vma, ta->ta_start);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void ipi_flush_tlb_kernel_page(void *arg)
|
||||||
|
{
|
||||||
|
struct tlb_args *ta = (struct tlb_args *)arg;
|
||||||
|
|
||||||
|
local_flush_tlb_kernel_page(ta->ta_start);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void ipi_flush_tlb_range(void *arg)
|
||||||
|
{
|
||||||
|
struct tlb_args *ta = (struct tlb_args *)arg;
|
||||||
|
|
||||||
|
local_flush_tlb_range(ta->ta_vma, ta->ta_start, ta->ta_end);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void ipi_flush_tlb_kernel_range(void *arg)
|
||||||
|
{
|
||||||
|
struct tlb_args *ta = (struct tlb_args *)arg;
|
||||||
|
|
||||||
|
local_flush_tlb_kernel_range(ta->ta_start, ta->ta_end);
|
||||||
|
}
|
||||||
|
|
||||||
|
void flush_tlb_all(void)
|
||||||
|
{
|
||||||
|
on_each_cpu(ipi_flush_tlb_all, NULL, 1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void flush_tlb_mm(struct mm_struct *mm)
|
||||||
|
{
|
||||||
|
cpumask_t mask = mm->cpu_vm_mask;
|
||||||
|
|
||||||
|
on_each_cpu_mask(ipi_flush_tlb_mm, mm, 1, 1, mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
void flush_tlb_page(struct vm_area_struct *vma, unsigned long uaddr)
|
||||||
|
{
|
||||||
|
cpumask_t mask = vma->vm_mm->cpu_vm_mask;
|
||||||
|
struct tlb_args ta;
|
||||||
|
|
||||||
|
ta.ta_vma = vma;
|
||||||
|
ta.ta_start = uaddr;
|
||||||
|
|
||||||
|
on_each_cpu_mask(ipi_flush_tlb_page, &ta, 1, 1, mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
void flush_tlb_kernel_page(unsigned long kaddr)
|
||||||
|
{
|
||||||
|
struct tlb_args ta;
|
||||||
|
|
||||||
|
ta.ta_start = kaddr;
|
||||||
|
|
||||||
|
on_each_cpu(ipi_flush_tlb_kernel_page, &ta, 1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void flush_tlb_range(struct vm_area_struct *vma,
|
||||||
|
unsigned long start, unsigned long end)
|
||||||
|
{
|
||||||
|
cpumask_t mask = vma->vm_mm->cpu_vm_mask;
|
||||||
|
struct tlb_args ta;
|
||||||
|
|
||||||
|
ta.ta_vma = vma;
|
||||||
|
ta.ta_start = start;
|
||||||
|
ta.ta_end = end;
|
||||||
|
|
||||||
|
on_each_cpu_mask(ipi_flush_tlb_range, &ta, 1, 1, mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
void flush_tlb_kernel_range(unsigned long start, unsigned long end)
|
||||||
|
{
|
||||||
|
struct tlb_args ta;
|
||||||
|
|
||||||
|
ta.ta_start = start;
|
||||||
|
ta.ta_end = end;
|
||||||
|
|
||||||
|
on_each_cpu(ipi_flush_tlb_kernel_range, &ta, 1, 1);
|
||||||
|
}
|
||||||
|
|
|
@ -424,15 +424,19 @@ static int timer_dyn_tick_disable(void)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Reprogram the system timer for at least the calculated time interval.
|
||||||
|
* This function should be called from the idle thread with IRQs disabled,
|
||||||
|
* immediately before sleeping.
|
||||||
|
*/
|
||||||
void timer_dyn_reprogram(void)
|
void timer_dyn_reprogram(void)
|
||||||
{
|
{
|
||||||
struct dyn_tick_timer *dyn_tick = system_timer->dyn_tick;
|
struct dyn_tick_timer *dyn_tick = system_timer->dyn_tick;
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
write_seqlock_irqsave(&xtime_lock, flags);
|
write_seqlock(&xtime_lock);
|
||||||
if (dyn_tick->state & DYN_TICK_ENABLED)
|
if (dyn_tick->state & DYN_TICK_ENABLED)
|
||||||
dyn_tick->reprogram(next_timer_interrupt() - jiffies);
|
dyn_tick->reprogram(next_timer_interrupt() - jiffies);
|
||||||
write_sequnlock_irqrestore(&xtime_lock, flags);
|
write_sequnlock(&xtime_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t timer_show_dyn_tick(struct sys_device *dev, char *buf)
|
static ssize_t timer_show_dyn_tick(struct sys_device *dev, char *buf)
|
||||||
|
|
|
@ -230,16 +230,8 @@ NORET_TYPE void die(const char *str, struct pt_regs *regs, int err)
|
||||||
do_exit(SIGSEGV);
|
do_exit(SIGSEGV);
|
||||||
}
|
}
|
||||||
|
|
||||||
void die_if_kernel(const char *str, struct pt_regs *regs, int err)
|
void notify_die(const char *str, struct pt_regs *regs, struct siginfo *info,
|
||||||
{
|
unsigned long err, unsigned long trap)
|
||||||
if (user_mode(regs))
|
|
||||||
return;
|
|
||||||
|
|
||||||
die(str, regs, err);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void notify_die(const char *str, struct pt_regs *regs, siginfo_t *info,
|
|
||||||
unsigned long err, unsigned long trap)
|
|
||||||
{
|
{
|
||||||
if (user_mode(regs)) {
|
if (user_mode(regs)) {
|
||||||
current->thread.error_code = err;
|
current->thread.error_code = err;
|
||||||
|
|
|
@ -11,7 +11,7 @@ lib-y := backtrace.o changebit.o csumipv6.o csumpartial.o \
|
||||||
strnlen_user.o strchr.o strrchr.o testchangebit.o \
|
strnlen_user.o strchr.o strrchr.o testchangebit.o \
|
||||||
testclearbit.o testsetbit.o uaccess.o getuser.o \
|
testclearbit.o testsetbit.o uaccess.o getuser.o \
|
||||||
putuser.o ashldi3.o ashrdi3.o lshrdi3.o muldi3.o \
|
putuser.o ashldi3.o ashrdi3.o lshrdi3.o muldi3.o \
|
||||||
ucmpdi2.o udivdi3.o lib1funcs.o div64.o \
|
ucmpdi2.o lib1funcs.o div64.o \
|
||||||
io-readsb.o io-writesb.o io-readsl.o io-writesl.o
|
io-readsb.o io-writesb.o io-readsl.o io-writesl.o
|
||||||
|
|
||||||
ifeq ($(CONFIG_CPU_32v3),y)
|
ifeq ($(CONFIG_CPU_32v3),y)
|
||||||
|
|
|
@ -1,183 +0,0 @@
|
||||||
/* longlong.h -- based on code from gcc-2.95.3
|
|
||||||
|
|
||||||
definitions for mixed size 32/64 bit arithmetic.
|
|
||||||
Copyright (C) 1991, 92, 94, 95, 96, 1997, 1998 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
This definition file is free software; you can redistribute it
|
|
||||||
and/or modify it under the terms of the GNU General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 2, or (at your option) any later version.
|
|
||||||
|
|
||||||
This definition file is distributed in the hope that it will be
|
|
||||||
useful, but WITHOUT ANY WARRANTY; without even the implied
|
|
||||||
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
See the GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to the Free Software
|
|
||||||
Foundation, Inc., 59 Temple Place - Suite 330,
|
|
||||||
Boston, MA 02111-1307, USA. */
|
|
||||||
|
|
||||||
/* Borrowed from GCC 2.95.3, I Molton 29/07/01 */
|
|
||||||
|
|
||||||
#ifndef SI_TYPE_SIZE
|
|
||||||
#define SI_TYPE_SIZE 32
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define __BITS4 (SI_TYPE_SIZE / 4)
|
|
||||||
#define __ll_B (1L << (SI_TYPE_SIZE / 2))
|
|
||||||
#define __ll_lowpart(t) ((u32) (t) % __ll_B)
|
|
||||||
#define __ll_highpart(t) ((u32) (t) / __ll_B)
|
|
||||||
|
|
||||||
/* Define auxiliary asm macros.
|
|
||||||
|
|
||||||
1) umul_ppmm(high_prod, low_prod, multipler, multiplicand)
|
|
||||||
multiplies two u32 integers MULTIPLER and MULTIPLICAND,
|
|
||||||
and generates a two-part u32 product in HIGH_PROD and
|
|
||||||
LOW_PROD.
|
|
||||||
|
|
||||||
2) __umulsidi3(a,b) multiplies two u32 integers A and B,
|
|
||||||
and returns a u64 product. This is just a variant of umul_ppmm.
|
|
||||||
|
|
||||||
3) udiv_qrnnd(quotient, remainder, high_numerator, low_numerator,
|
|
||||||
denominator) divides a two-word unsigned integer, composed by the
|
|
||||||
integers HIGH_NUMERATOR and LOW_NUMERATOR, by DENOMINATOR and
|
|
||||||
places the quotient in QUOTIENT and the remainder in REMAINDER.
|
|
||||||
HIGH_NUMERATOR must be less than DENOMINATOR for correct operation.
|
|
||||||
If, in addition, the most significant bit of DENOMINATOR must be 1,
|
|
||||||
then the pre-processor symbol UDIV_NEEDS_NORMALIZATION is defined to 1.
|
|
||||||
|
|
||||||
4) sdiv_qrnnd(quotient, remainder, high_numerator, low_numerator,
|
|
||||||
denominator). Like udiv_qrnnd but the numbers are signed. The
|
|
||||||
quotient is rounded towards 0.
|
|
||||||
|
|
||||||
5) count_leading_zeros(count, x) counts the number of zero-bits from
|
|
||||||
the msb to the first non-zero bit. This is the number of steps X
|
|
||||||
needs to be shifted left to set the msb. Undefined for X == 0.
|
|
||||||
|
|
||||||
6) add_ssaaaa(high_sum, low_sum, high_addend_1, low_addend_1,
|
|
||||||
high_addend_2, low_addend_2) adds two two-word unsigned integers,
|
|
||||||
composed by HIGH_ADDEND_1 and LOW_ADDEND_1, and HIGH_ADDEND_2 and
|
|
||||||
LOW_ADDEND_2 respectively. The result is placed in HIGH_SUM and
|
|
||||||
LOW_SUM. Overflow (i.e. carry out) is not stored anywhere, and is
|
|
||||||
lost.
|
|
||||||
|
|
||||||
7) sub_ddmmss(high_difference, low_difference, high_minuend,
|
|
||||||
low_minuend, high_subtrahend, low_subtrahend) subtracts two
|
|
||||||
two-word unsigned integers, composed by HIGH_MINUEND_1 and
|
|
||||||
LOW_MINUEND_1, and HIGH_SUBTRAHEND_2 and LOW_SUBTRAHEND_2
|
|
||||||
respectively. The result is placed in HIGH_DIFFERENCE and
|
|
||||||
LOW_DIFFERENCE. Overflow (i.e. carry out) is not stored anywhere,
|
|
||||||
and is lost.
|
|
||||||
|
|
||||||
If any of these macros are left undefined for a particular CPU,
|
|
||||||
C macros are used. */
|
|
||||||
|
|
||||||
#if defined (__arm__)
|
|
||||||
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
|
|
||||||
__asm__ ("adds %1, %4, %5 \n\
|
|
||||||
adc %0, %2, %3" \
|
|
||||||
: "=r" ((u32) (sh)), \
|
|
||||||
"=&r" ((u32) (sl)) \
|
|
||||||
: "%r" ((u32) (ah)), \
|
|
||||||
"rI" ((u32) (bh)), \
|
|
||||||
"%r" ((u32) (al)), \
|
|
||||||
"rI" ((u32) (bl)))
|
|
||||||
#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
|
|
||||||
__asm__ ("subs %1, %4, %5 \n\
|
|
||||||
sbc %0, %2, %3" \
|
|
||||||
: "=r" ((u32) (sh)), \
|
|
||||||
"=&r" ((u32) (sl)) \
|
|
||||||
: "r" ((u32) (ah)), \
|
|
||||||
"rI" ((u32) (bh)), \
|
|
||||||
"r" ((u32) (al)), \
|
|
||||||
"rI" ((u32) (bl)))
|
|
||||||
#define umul_ppmm(xh, xl, a, b) \
|
|
||||||
{register u32 __t0, __t1, __t2; \
|
|
||||||
__asm__ ("%@ Inlined umul_ppmm \n\
|
|
||||||
mov %2, %5, lsr #16 \n\
|
|
||||||
mov %0, %6, lsr #16 \n\
|
|
||||||
bic %3, %5, %2, lsl #16 \n\
|
|
||||||
bic %4, %6, %0, lsl #16 \n\
|
|
||||||
mul %1, %3, %4 \n\
|
|
||||||
mul %4, %2, %4 \n\
|
|
||||||
mul %3, %0, %3 \n\
|
|
||||||
mul %0, %2, %0 \n\
|
|
||||||
adds %3, %4, %3 \n\
|
|
||||||
addcs %0, %0, #65536 \n\
|
|
||||||
adds %1, %1, %3, lsl #16 \n\
|
|
||||||
adc %0, %0, %3, lsr #16" \
|
|
||||||
: "=&r" ((u32) (xh)), \
|
|
||||||
"=r" ((u32) (xl)), \
|
|
||||||
"=&r" (__t0), "=&r" (__t1), "=r" (__t2) \
|
|
||||||
: "r" ((u32) (a)), \
|
|
||||||
"r" ((u32) (b)));}
|
|
||||||
#define UMUL_TIME 20
|
|
||||||
#define UDIV_TIME 100
|
|
||||||
#endif /* __arm__ */
|
|
||||||
|
|
||||||
#define __umulsidi3(u, v) \
|
|
||||||
({DIunion __w; \
|
|
||||||
umul_ppmm (__w.s.high, __w.s.low, u, v); \
|
|
||||||
__w.ll; })
|
|
||||||
|
|
||||||
#define __udiv_qrnnd_c(q, r, n1, n0, d) \
|
|
||||||
do { \
|
|
||||||
u32 __d1, __d0, __q1, __q0; \
|
|
||||||
u32 __r1, __r0, __m; \
|
|
||||||
__d1 = __ll_highpart (d); \
|
|
||||||
__d0 = __ll_lowpart (d); \
|
|
||||||
\
|
|
||||||
__r1 = (n1) % __d1; \
|
|
||||||
__q1 = (n1) / __d1; \
|
|
||||||
__m = (u32) __q1 * __d0; \
|
|
||||||
__r1 = __r1 * __ll_B | __ll_highpart (n0); \
|
|
||||||
if (__r1 < __m) \
|
|
||||||
{ \
|
|
||||||
__q1--, __r1 += (d); \
|
|
||||||
if (__r1 >= (d)) /* i.e. we didn't get carry when adding to __r1 */\
|
|
||||||
if (__r1 < __m) \
|
|
||||||
__q1--, __r1 += (d); \
|
|
||||||
} \
|
|
||||||
__r1 -= __m; \
|
|
||||||
\
|
|
||||||
__r0 = __r1 % __d1; \
|
|
||||||
__q0 = __r1 / __d1; \
|
|
||||||
__m = (u32) __q0 * __d0; \
|
|
||||||
__r0 = __r0 * __ll_B | __ll_lowpart (n0); \
|
|
||||||
if (__r0 < __m) \
|
|
||||||
{ \
|
|
||||||
__q0--, __r0 += (d); \
|
|
||||||
if (__r0 >= (d)) \
|
|
||||||
if (__r0 < __m) \
|
|
||||||
__q0--, __r0 += (d); \
|
|
||||||
} \
|
|
||||||
__r0 -= __m; \
|
|
||||||
\
|
|
||||||
(q) = (u32) __q1 * __ll_B | __q0; \
|
|
||||||
(r) = __r0; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define UDIV_NEEDS_NORMALIZATION 1
|
|
||||||
#define udiv_qrnnd __udiv_qrnnd_c
|
|
||||||
|
|
||||||
#define count_leading_zeros(count, x) \
|
|
||||||
do { \
|
|
||||||
u32 __xr = (x); \
|
|
||||||
u32 __a; \
|
|
||||||
\
|
|
||||||
if (SI_TYPE_SIZE <= 32) \
|
|
||||||
{ \
|
|
||||||
__a = __xr < ((u32)1<<2*__BITS4) \
|
|
||||||
? (__xr < ((u32)1<<__BITS4) ? 0 : __BITS4) \
|
|
||||||
: (__xr < ((u32)1<<3*__BITS4) ? 2*__BITS4 : 3*__BITS4); \
|
|
||||||
} \
|
|
||||||
else \
|
|
||||||
{ \
|
|
||||||
for (__a = SI_TYPE_SIZE - 8; __a > 0; __a -= 8) \
|
|
||||||
if (((__xr >> __a) & 0xff) != 0) \
|
|
||||||
break; \
|
|
||||||
} \
|
|
||||||
\
|
|
||||||
(count) = SI_TYPE_SIZE - (__clz_tab[__xr >> __a] + __a); \
|
|
||||||
} while (0)
|
|
|
@ -1,222 +0,0 @@
|
||||||
/* More subroutines needed by GCC output code on some machines. */
|
|
||||||
/* Compile this one with gcc. */
|
|
||||||
/* Copyright (C) 1989, 92-98, 1999 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
This file is part of GNU CC.
|
|
||||||
|
|
||||||
GNU CC is free software; you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
any later version.
|
|
||||||
|
|
||||||
GNU CC is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with GNU CC; see the file COPYING. If not, write to
|
|
||||||
the Free Software Foundation, 59 Temple Place - Suite 330,
|
|
||||||
Boston, MA 02111-1307, USA. */
|
|
||||||
|
|
||||||
/* As a special exception, if you link this library with other files,
|
|
||||||
some of which are compiled with GCC, to produce an executable,
|
|
||||||
this library does not by itself cause the resulting executable
|
|
||||||
to be covered by the GNU General Public License.
|
|
||||||
This exception does not however invalidate any other reasons why
|
|
||||||
the executable file might be covered by the GNU General Public License.
|
|
||||||
*/
|
|
||||||
/* support functions required by the kernel. based on code from gcc-2.95.3 */
|
|
||||||
/* I Molton 29/07/01 */
|
|
||||||
|
|
||||||
#include "gcclib.h"
|
|
||||||
#include "longlong.h"
|
|
||||||
|
|
||||||
static const u8 __clz_tab[] = {
|
|
||||||
0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5,
|
|
||||||
5, 5, 5, 5, 5, 5, 5, 5,
|
|
||||||
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
|
|
||||||
6, 6, 6, 6, 6, 6, 6, 6,
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7,
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7,
|
|
||||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
|
||||||
8, 8, 8, 8, 8, 8, 8, 8,
|
|
||||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
|
||||||
8, 8, 8, 8, 8, 8, 8, 8,
|
|
||||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
|
||||||
8, 8, 8, 8, 8, 8, 8, 8,
|
|
||||||
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
|
|
||||||
8, 8, 8, 8, 8, 8, 8, 8,
|
|
||||||
};
|
|
||||||
|
|
||||||
u64 __udivmoddi4(u64 n, u64 d, u64 * rp)
|
|
||||||
{
|
|
||||||
DIunion ww;
|
|
||||||
DIunion nn, dd;
|
|
||||||
DIunion rr;
|
|
||||||
u32 d0, d1, n0, n1, n2;
|
|
||||||
u32 q0, q1;
|
|
||||||
u32 b, bm;
|
|
||||||
|
|
||||||
nn.ll = n;
|
|
||||||
dd.ll = d;
|
|
||||||
|
|
||||||
d0 = dd.s.low;
|
|
||||||
d1 = dd.s.high;
|
|
||||||
n0 = nn.s.low;
|
|
||||||
n1 = nn.s.high;
|
|
||||||
|
|
||||||
if (d1 == 0) {
|
|
||||||
if (d0 > n1) {
|
|
||||||
/* 0q = nn / 0D */
|
|
||||||
|
|
||||||
count_leading_zeros(bm, d0);
|
|
||||||
|
|
||||||
if (bm != 0) {
|
|
||||||
/* Normalize, i.e. make the most significant bit of the
|
|
||||||
denominator set. */
|
|
||||||
|
|
||||||
d0 = d0 << bm;
|
|
||||||
n1 = (n1 << bm) | (n0 >> (SI_TYPE_SIZE - bm));
|
|
||||||
n0 = n0 << bm;
|
|
||||||
}
|
|
||||||
|
|
||||||
udiv_qrnnd(q0, n0, n1, n0, d0);
|
|
||||||
q1 = 0;
|
|
||||||
|
|
||||||
/* Remainder in n0 >> bm. */
|
|
||||||
} else {
|
|
||||||
/* qq = NN / 0d */
|
|
||||||
|
|
||||||
if (d0 == 0)
|
|
||||||
d0 = 1 / d0; /* Divide intentionally by zero. */
|
|
||||||
|
|
||||||
count_leading_zeros(bm, d0);
|
|
||||||
|
|
||||||
if (bm == 0) {
|
|
||||||
/* From (n1 >= d0) /\ (the most significant bit of d0 is set),
|
|
||||||
conclude (the most significant bit of n1 is set) /\ (the
|
|
||||||
leading quotient digit q1 = 1).
|
|
||||||
|
|
||||||
This special case is necessary, not an optimization.
|
|
||||||
(Shifts counts of SI_TYPE_SIZE are undefined.) */
|
|
||||||
|
|
||||||
n1 -= d0;
|
|
||||||
q1 = 1;
|
|
||||||
} else {
|
|
||||||
/* Normalize. */
|
|
||||||
|
|
||||||
b = SI_TYPE_SIZE - bm;
|
|
||||||
|
|
||||||
d0 = d0 << bm;
|
|
||||||
n2 = n1 >> b;
|
|
||||||
n1 = (n1 << bm) | (n0 >> b);
|
|
||||||
n0 = n0 << bm;
|
|
||||||
|
|
||||||
udiv_qrnnd(q1, n1, n2, n1, d0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* n1 != d0... */
|
|
||||||
|
|
||||||
udiv_qrnnd(q0, n0, n1, n0, d0);
|
|
||||||
|
|
||||||
/* Remainder in n0 >> bm. */
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rp != 0) {
|
|
||||||
rr.s.low = n0 >> bm;
|
|
||||||
rr.s.high = 0;
|
|
||||||
*rp = rr.ll;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (d1 > n1) {
|
|
||||||
/* 00 = nn / DD */
|
|
||||||
|
|
||||||
q0 = 0;
|
|
||||||
q1 = 0;
|
|
||||||
|
|
||||||
/* Remainder in n1n0. */
|
|
||||||
if (rp != 0) {
|
|
||||||
rr.s.low = n0;
|
|
||||||
rr.s.high = n1;
|
|
||||||
*rp = rr.ll;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* 0q = NN / dd */
|
|
||||||
|
|
||||||
count_leading_zeros(bm, d1);
|
|
||||||
if (bm == 0) {
|
|
||||||
/* From (n1 >= d1) /\ (the most significant bit of d1 is set),
|
|
||||||
conclude (the most significant bit of n1 is set) /\ (the
|
|
||||||
quotient digit q0 = 0 or 1).
|
|
||||||
|
|
||||||
This special case is necessary, not an optimization. */
|
|
||||||
|
|
||||||
/* The condition on the next line takes advantage of that
|
|
||||||
n1 >= d1 (true due to program flow). */
|
|
||||||
if (n1 > d1 || n0 >= d0) {
|
|
||||||
q0 = 1;
|
|
||||||
sub_ddmmss(n1, n0, n1, n0, d1, d0);
|
|
||||||
} else
|
|
||||||
q0 = 0;
|
|
||||||
|
|
||||||
q1 = 0;
|
|
||||||
|
|
||||||
if (rp != 0) {
|
|
||||||
rr.s.low = n0;
|
|
||||||
rr.s.high = n1;
|
|
||||||
*rp = rr.ll;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
u32 m1, m0;
|
|
||||||
/* Normalize. */
|
|
||||||
|
|
||||||
b = SI_TYPE_SIZE - bm;
|
|
||||||
|
|
||||||
d1 = (d1 << bm) | (d0 >> b);
|
|
||||||
d0 = d0 << bm;
|
|
||||||
n2 = n1 >> b;
|
|
||||||
n1 = (n1 << bm) | (n0 >> b);
|
|
||||||
n0 = n0 << bm;
|
|
||||||
|
|
||||||
udiv_qrnnd(q0, n1, n2, n1, d1);
|
|
||||||
umul_ppmm(m1, m0, q0, d0);
|
|
||||||
|
|
||||||
if (m1 > n1 || (m1 == n1 && m0 > n0)) {
|
|
||||||
q0--;
|
|
||||||
sub_ddmmss(m1, m0, m1, m0, d1, d0);
|
|
||||||
}
|
|
||||||
|
|
||||||
q1 = 0;
|
|
||||||
|
|
||||||
/* Remainder in (n1n0 - m1m0) >> bm. */
|
|
||||||
if (rp != 0) {
|
|
||||||
sub_ddmmss(n1, n0, n1, n0, m1, m0);
|
|
||||||
rr.s.low = (n1 << b) | (n0 >> bm);
|
|
||||||
rr.s.high = n1 >> bm;
|
|
||||||
*rp = rr.ll;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ww.s.low = q0;
|
|
||||||
ww.s.high = q1;
|
|
||||||
return ww.ll;
|
|
||||||
}
|
|
||||||
|
|
||||||
u64 __udivdi3(u64 n, u64 d)
|
|
||||||
{
|
|
||||||
return __udivmoddi4(n, d, (u64 *) 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
u64 __umoddi3(u64 u, u64 v)
|
|
||||||
{
|
|
||||||
u64 w;
|
|
||||||
|
|
||||||
(void)__udivmoddi4(u, v, &w);
|
|
||||||
|
|
||||||
return w;
|
|
||||||
}
|
|
|
@ -0,0 +1 @@
|
||||||
|
zreladdr-y := 0xf0008000
|
|
@ -40,9 +40,11 @@ static void __init aaed2000_map_io(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(AAED2000, "Agilent AAED-2000 Development Platform")
|
MACHINE_START(AAED2000, "Agilent AAED-2000 Development Platform")
|
||||||
MAINTAINER("Nicolas Bellido Y Ortega")
|
/* Maintainer: Nicolas Bellido Y Ortega */
|
||||||
BOOT_MEM(0xf0000000, PIO_BASE, VIO_BASE)
|
.phys_ram = 0xf0000000,
|
||||||
MAPIO(aaed2000_map_io)
|
.phys_io = PIO_BASE,
|
||||||
INITIRQ(aaed2000_init_irq)
|
.io_pg_offst = ((VIO_BASE) >> 18) & 0xfffc,
|
||||||
|
.map_io = aaed2000_map_io,
|
||||||
|
.init_irq = aaed2000_init_irq,
|
||||||
.timer = &aaec2000_timer,
|
.timer = &aaec2000_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -128,8 +128,8 @@ aaec2000_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
|
|
||||||
static struct irqaction aaec2000_timer_irq = {
|
static struct irqaction aaec2000_timer_irq = {
|
||||||
.name = "AAEC-2000 Timer Tick",
|
.name = "AAEC-2000 Timer Tick",
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
.handler = aaec2000_timer_interrupt
|
.handler = aaec2000_timer_interrupt,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __init aaec2000_timer_init(void)
|
static void __init aaec2000_timer_init(void)
|
||||||
|
|
|
@ -59,11 +59,13 @@ void __init autcpu12_map_io(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(AUTCPU12, "autronix autcpu12")
|
MACHINE_START(AUTCPU12, "autronix autcpu12")
|
||||||
MAINTAINER("Thomas Gleixner")
|
/* Maintainer: Thomas Gleixner */
|
||||||
BOOT_MEM(0xc0000000, 0x80000000, 0xff000000)
|
.phys_ram = 0xc0000000,
|
||||||
BOOT_PARAMS(0xc0020000)
|
.phys_io = 0x80000000,
|
||||||
MAPIO(autcpu12_map_io)
|
.io_pg_offst = ((0xff000000) >> 18) & 0xfffc,
|
||||||
INITIRQ(clps711x_init_irq)
|
.boot_params = 0xc0020000,
|
||||||
|
.map_io = autcpu12_map_io,
|
||||||
|
.init_irq = clps711x_init_irq,
|
||||||
.timer = &clps711x_timer,
|
.timer = &clps711x_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
||||||
|
|
|
@ -49,10 +49,12 @@ static void __init cdb89712_map_io(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(CDB89712, "Cirrus-CDB89712")
|
MACHINE_START(CDB89712, "Cirrus-CDB89712")
|
||||||
MAINTAINER("Ray Lehtiniemi")
|
/* Maintainer: Ray Lehtiniemi */
|
||||||
BOOT_MEM(0xc0000000, 0x80000000, 0xff000000)
|
.phys_ram = 0xc0000000,
|
||||||
BOOT_PARAMS(0xc0000100)
|
.phys_io = 0x80000000,
|
||||||
MAPIO(cdb89712_map_io)
|
.io_pg_offst = ((0xff000000) >> 18) & 0xfffc,
|
||||||
INITIRQ(clps711x_init_irq)
|
.boot_params = 0xc0000100,
|
||||||
|
.map_io = cdb89712_map_io,
|
||||||
|
.init_irq = clps711x_init_irq,
|
||||||
.timer = &clps711x_timer,
|
.timer = &clps711x_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -53,10 +53,12 @@ static void __init ceiva_map_io(void)
|
||||||
|
|
||||||
|
|
||||||
MACHINE_START(CEIVA, "CEIVA/Polaroid Photo MAX Digital Picture Frame")
|
MACHINE_START(CEIVA, "CEIVA/Polaroid Photo MAX Digital Picture Frame")
|
||||||
MAINTAINER("Rob Scott")
|
/* Maintainer: Rob Scott */
|
||||||
BOOT_MEM(0xc0000000, 0x80000000, 0xff000000)
|
.phys_ram = 0xc0000000,
|
||||||
BOOT_PARAMS(0xc0000100)
|
.phys_io = 0x80000000,
|
||||||
MAPIO(ceiva_map_io)
|
.io_pg_offst = ((0xff000000) >> 18) & 0xfffc,
|
||||||
INITIRQ(clps711x_init_irq)
|
.boot_params = 0xc0000100,
|
||||||
|
.map_io = ceiva_map_io,
|
||||||
|
.init_irq = clps711x_init_irq,
|
||||||
.timer = &clps711x_timer,
|
.timer = &clps711x_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -37,12 +37,14 @@ fixup_clep7312(struct machine_desc *desc, struct tag *tags,
|
||||||
|
|
||||||
|
|
||||||
MACHINE_START(CLEP7212, "Cirrus Logic 7212/7312")
|
MACHINE_START(CLEP7212, "Cirrus Logic 7212/7312")
|
||||||
MAINTAINER("Nobody")
|
/* Maintainer: Nobody */
|
||||||
BOOT_MEM(0xc0000000, 0x80000000, 0xff000000)
|
.phys_ram = 0xc0000000,
|
||||||
BOOT_PARAMS(0xc0000100)
|
.phys_io = 0x80000000,
|
||||||
FIXUP(fixup_clep7312)
|
.io_pg_offst = ((0xff000000) >> 18) & 0xfffc,
|
||||||
MAPIO(clps711x_map_io)
|
.boot_params = 0xc0000100,
|
||||||
INITIRQ(clps711x_init_irq)
|
.fixup = fixup_clep7312,
|
||||||
|
.map_io = clps711x_map_io,
|
||||||
|
.init_irq = clps711x_init_irq,
|
||||||
.timer = &clps711x_timer,
|
.timer = &clps711x_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
||||||
|
|
|
@ -51,11 +51,13 @@ fixup_edb7211(struct machine_desc *desc, struct tag *tags,
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(EDB7211, "CL-EDB7211 (EP7211 eval board)")
|
MACHINE_START(EDB7211, "CL-EDB7211 (EP7211 eval board)")
|
||||||
MAINTAINER("Jon McClintock")
|
/* Maintainer: Jon McClintock */
|
||||||
BOOT_MEM(0xc0000000, 0x80000000, 0xff000000)
|
.phys_ram = 0xc0000000,
|
||||||
BOOT_PARAMS(0xc0020100) /* 0xc0000000 - 0xc001ffff can be video RAM */
|
.phys_io = 0x80000000,
|
||||||
FIXUP(fixup_edb7211)
|
.io_pg_offst = ((0xff000000) >> 18) & 0xfffc,
|
||||||
MAPIO(edb7211_map_io)
|
.boot_params = 0xc0020100, /* 0xc0000000 - 0xc001ffff can be video RAM */
|
||||||
INITIRQ(clps711x_init_irq)
|
.fixup = fixup_edb7211,
|
||||||
|
.map_io = edb7211_map_io,
|
||||||
|
.init_irq = clps711x_init_irq,
|
||||||
.timer = &clps711x_timer,
|
.timer = &clps711x_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -75,11 +75,13 @@ fortunet_fixup(struct machine_desc *desc, struct tag *tags,
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(FORTUNET, "ARM-FortuNet")
|
MACHINE_START(FORTUNET, "ARM-FortuNet")
|
||||||
MAINTAINER("FortuNet Inc.")
|
/* Maintainer: FortuNet Inc. */
|
||||||
BOOT_MEM(0xc0000000, 0x80000000, 0xf0000000)
|
.phys_ram = 0xc0000000,
|
||||||
BOOT_PARAMS(0x00000000)
|
.phys_io = 0x80000000,
|
||||||
FIXUP(fortunet_fixup)
|
.io_pg_offst = ((0xf0000000) >> 18) & 0xfffc,
|
||||||
MAPIO(clps711x_map_io)
|
.boot_params = 0x00000000,
|
||||||
INITIRQ(clps711x_init_irq)
|
.fixup = fortunet_fixup,
|
||||||
|
.map_io = clps711x_map_io,
|
||||||
|
.init_irq = clps711x_init_irq,
|
||||||
.timer = &clps711x_timer,
|
.timer = &clps711x_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -79,12 +79,14 @@ static void __init p720t_map_io(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(P720T, "ARM-Prospector720T")
|
MACHINE_START(P720T, "ARM-Prospector720T")
|
||||||
MAINTAINER("ARM Ltd/Deep Blue Solutions Ltd")
|
/* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */
|
||||||
BOOT_MEM(0xc0000000, 0x80000000, 0xff000000)
|
.phys_ram = 0xc0000000,
|
||||||
BOOT_PARAMS(0xc0000100)
|
.phys_io = 0x80000000,
|
||||||
FIXUP(fixup_p720t)
|
.io_pg_offst = ((0xff000000) >> 18) & 0xfffc,
|
||||||
MAPIO(p720t_map_io)
|
.boot_params = 0xc0000100,
|
||||||
INITIRQ(clps711x_init_irq)
|
.fixup = fixup_p720t,
|
||||||
|
.map_io = p720t_map_io,
|
||||||
|
.init_irq = clps711x_init_irq,
|
||||||
.timer = &clps711x_timer,
|
.timer = &clps711x_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
||||||
|
|
|
@ -57,8 +57,8 @@ p720t_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
|
|
||||||
static struct irqaction clps711x_timer_irq = {
|
static struct irqaction clps711x_timer_irq = {
|
||||||
.name = "CLPS711x Timer Tick",
|
.name = "CLPS711x Timer Tick",
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
.handler = p720t_timer_interrupt
|
.handler = p720t_timer_interrupt,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __init clps711x_timer_init(void)
|
static void __init clps711x_timer_init(void)
|
||||||
|
|
|
@ -298,8 +298,8 @@ clps7500_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
|
|
||||||
static struct irqaction clps7500_timer_irq = {
|
static struct irqaction clps7500_timer_irq = {
|
||||||
.name = "CLPS7500 Timer Tick",
|
.name = "CLPS7500 Timer Tick",
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
.handler = clps7500_timer_interrupt
|
.handler = clps7500_timer_interrupt,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -366,11 +366,13 @@ static void __init clps7500_init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(CLPS7500, "CL-PS7500")
|
MACHINE_START(CLPS7500, "CL-PS7500")
|
||||||
MAINTAINER("Philip Blundell")
|
/* Maintainer: Philip Blundell */
|
||||||
BOOT_MEM(0x10000000, 0x03000000, 0xe0000000)
|
.phys_ram = 0x10000000,
|
||||||
MAPIO(clps7500_map_io)
|
.phys_io = 0x03000000,
|
||||||
INITIRQ(clps7500_init_irq)
|
.io_pg_offst = ((0xe0000000) >> 18) & 0xfffc,
|
||||||
.init_machine = clps7500_init,
|
.map_io = clps7500_map_io,
|
||||||
.timer = &clps7500_timer,
|
.init_irq = clps7500_init_irq,
|
||||||
|
.init_machine = clps7500_init,
|
||||||
|
.timer = &clps7500_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
||||||
|
|
|
@ -173,8 +173,8 @@ ebsa110_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
|
|
||||||
static struct irqaction ebsa110_timer_irq = {
|
static struct irqaction ebsa110_timer_irq = {
|
||||||
.name = "EBSA110 Timer Tick",
|
.name = "EBSA110 Timer Tick",
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
.handler = ebsa110_timer_interrupt
|
.handler = ebsa110_timer_interrupt,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -233,13 +233,15 @@ static int __init ebsa110_init(void)
|
||||||
arch_initcall(ebsa110_init);
|
arch_initcall(ebsa110_init);
|
||||||
|
|
||||||
MACHINE_START(EBSA110, "EBSA110")
|
MACHINE_START(EBSA110, "EBSA110")
|
||||||
MAINTAINER("Russell King")
|
/* Maintainer: Russell King */
|
||||||
BOOT_MEM(0x00000000, 0xe0000000, 0xe0000000)
|
.phys_ram = 0x00000000,
|
||||||
BOOT_PARAMS(0x00000400)
|
.phys_io = 0xe0000000,
|
||||||
DISABLE_PARPORT(0)
|
.io_pg_offst = ((0xe0000000) >> 18) & 0xfffc,
|
||||||
DISABLE_PARPORT(2)
|
.boot_params = 0x00000400,
|
||||||
SOFT_REBOOT
|
.reserve_lp0 = 1,
|
||||||
MAPIO(ebsa110_map_io)
|
.reserve_lp2 = 1,
|
||||||
INITIRQ(ebsa110_init_irq)
|
.soft_reboot = 1,
|
||||||
|
.map_io = ebsa110_map_io,
|
||||||
|
.init_irq = ebsa110_init_irq,
|
||||||
.timer = &ebsa110_timer,
|
.timer = &ebsa110_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -63,10 +63,12 @@ extern void epxa10db_init_irq(void);
|
||||||
extern struct sys_timer epxa10db_timer;
|
extern struct sys_timer epxa10db_timer;
|
||||||
|
|
||||||
MACHINE_START(CAMELOT, "Altera Epxa10db")
|
MACHINE_START(CAMELOT, "Altera Epxa10db")
|
||||||
MAINTAINER("Altera Corporation")
|
/* Maintainer: Altera Corporation */
|
||||||
BOOT_MEM(0x00000000, 0x7fffc000, 0xffffc000)
|
.phys_ram = 0x00000000,
|
||||||
MAPIO(epxa10db_map_io)
|
.phys_io = 0x7fffc000,
|
||||||
INITIRQ(epxa10db_init_irq)
|
.io_pg_offst = ((0xffffc000) >> 18) & 0xfffc,
|
||||||
|
.map_io = epxa10db_map_io,
|
||||||
|
.init_irq = epxa10db_init_irq,
|
||||||
.timer = &epxa10db_timer,
|
.timer = &epxa10db_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
||||||
|
|
|
@ -56,8 +56,8 @@ epxa10db_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
|
|
||||||
static struct irqaction epxa10db_timer_irq = {
|
static struct irqaction epxa10db_timer_irq = {
|
||||||
.name = "Excalibur Timer Tick",
|
.name = "Excalibur Timer Tick",
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
.handler = epxa10db_timer_interrupt
|
.handler = epxa10db_timer_interrupt,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -84,12 +84,14 @@ fixup_cats(struct machine_desc *desc, struct tag *tags,
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(CATS, "Chalice-CATS")
|
MACHINE_START(CATS, "Chalice-CATS")
|
||||||
MAINTAINER("Philip Blundell")
|
/* Maintainer: Philip Blundell */
|
||||||
BOOT_MEM(0x00000000, DC21285_ARMCSR_BASE, 0xfe000000)
|
.phys_ram = 0x00000000,
|
||||||
BOOT_PARAMS(0x00000100)
|
.phys_io = DC21285_ARMCSR_BASE,
|
||||||
SOFT_REBOOT
|
.io_pg_offst = ((0xfe000000) >> 18) & 0xfffc,
|
||||||
FIXUP(fixup_cats)
|
.boot_params = 0x00000100,
|
||||||
MAPIO(footbridge_map_io)
|
.soft_reboot = 1,
|
||||||
INITIRQ(footbridge_init_irq)
|
.fixup = fixup_cats,
|
||||||
|
.map_io = footbridge_map_io,
|
||||||
|
.init_irq = footbridge_init_irq,
|
||||||
.timer = &isa_timer,
|
.timer = &isa_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -28,11 +28,13 @@ fixup_coebsa285(struct machine_desc *desc, struct tag *tags,
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(CO285, "co-EBSA285")
|
MACHINE_START(CO285, "co-EBSA285")
|
||||||
MAINTAINER("Mark van Doesburg")
|
/* Maintainer: Mark van Doesburg */
|
||||||
BOOT_MEM(0x00000000, DC21285_ARMCSR_BASE, 0x7cf00000)
|
.phys_ram = 0x00000000,
|
||||||
FIXUP(fixup_coebsa285)
|
.phys_io = DC21285_ARMCSR_BASE,
|
||||||
MAPIO(footbridge_map_io)
|
.io_pg_offst = ((0x7cf00000) >> 18) & 0xfffc,
|
||||||
INITIRQ(footbridge_init_irq)
|
.fixup = fixup_coebsa285,
|
||||||
|
.map_io = footbridge_map_io,
|
||||||
|
.init_irq = footbridge_init_irq,
|
||||||
.timer = &footbridge_timer,
|
.timer = &footbridge_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,7 @@ timer1_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
static struct irqaction footbridge_timer_irq = {
|
static struct irqaction footbridge_timer_irq = {
|
||||||
.name = "Timer1 timer tick",
|
.name = "Timer1 timer tick",
|
||||||
.handler = timer1_interrupt,
|
.handler = timer1_interrupt,
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -13,12 +13,15 @@
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
MACHINE_START(EBSA285, "EBSA285")
|
MACHINE_START(EBSA285, "EBSA285")
|
||||||
MAINTAINER("Russell King")
|
/* Maintainer: Russell King */
|
||||||
BOOT_MEM(0x00000000, DC21285_ARMCSR_BASE, 0xfe000000)
|
.phys_ram = 0x00000000,
|
||||||
BOOT_PARAMS(0x00000100)
|
.phys_io = DC21285_ARMCSR_BASE,
|
||||||
VIDEO(0x000a0000, 0x000bffff)
|
.io_pg_offst = ((0xfe000000) >> 18) & 0xfffc,
|
||||||
MAPIO(footbridge_map_io)
|
.boot_params = 0x00000100,
|
||||||
INITIRQ(footbridge_init_irq)
|
.video_start = 0x000a0000,
|
||||||
|
.video_end = 0x000bffff,
|
||||||
|
.map_io = footbridge_map_io,
|
||||||
|
.init_irq = footbridge_init_irq,
|
||||||
.timer = &footbridge_timer,
|
.timer = &footbridge_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
||||||
|
|
|
@ -72,7 +72,7 @@ isa_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
static struct irqaction isa_timer_irq = {
|
static struct irqaction isa_timer_irq = {
|
||||||
.name = "ISA timer tick",
|
.name = "ISA timer tick",
|
||||||
.handler = isa_timer_interrupt,
|
.handler = isa_timer_interrupt,
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __init isa_timer_init(void)
|
static void __init isa_timer_init(void)
|
||||||
|
|
|
@ -647,14 +647,17 @@ fixup_netwinder(struct machine_desc *desc, struct tag *tags,
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(NETWINDER, "Rebel-NetWinder")
|
MACHINE_START(NETWINDER, "Rebel-NetWinder")
|
||||||
MAINTAINER("Russell King/Rebel.com")
|
/* Maintainer: Russell King/Rebel.com */
|
||||||
BOOT_MEM(0x00000000, DC21285_ARMCSR_BASE, 0xfe000000)
|
.phys_ram = 0x00000000,
|
||||||
BOOT_PARAMS(0x00000100)
|
.phys_io = DC21285_ARMCSR_BASE,
|
||||||
VIDEO(0x000a0000, 0x000bffff)
|
.io_pg_offst = ((0xfe000000) >> 18) & 0xfffc,
|
||||||
DISABLE_PARPORT(0)
|
.boot_params = 0x00000100,
|
||||||
DISABLE_PARPORT(2)
|
.video_start = 0x000a0000,
|
||||||
FIXUP(fixup_netwinder)
|
.video_end = 0x000bffff,
|
||||||
MAPIO(footbridge_map_io)
|
.reserve_lp0 = 1,
|
||||||
INITIRQ(footbridge_init_irq)
|
.reserve_lp2 = 1,
|
||||||
|
.fixup = fixup_netwinder,
|
||||||
|
.map_io = footbridge_map_io,
|
||||||
|
.init_irq = footbridge_init_irq,
|
||||||
.timer = &isa_timer,
|
.timer = &isa_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -13,11 +13,13 @@
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
MACHINE_START(PERSONAL_SERVER, "Compaq-PersonalServer")
|
MACHINE_START(PERSONAL_SERVER, "Compaq-PersonalServer")
|
||||||
MAINTAINER("Jamey Hicks / George France")
|
/* Maintainer: Jamey Hicks / George France */
|
||||||
BOOT_MEM(0x00000000, DC21285_ARMCSR_BASE, 0xfe000000)
|
.phys_ram = 0x00000000,
|
||||||
BOOT_PARAMS(0x00000100)
|
.phys_io = DC21285_ARMCSR_BASE,
|
||||||
MAPIO(footbridge_map_io)
|
.io_pg_offst = ((0xfe000000) >> 18) & 0xfffc,
|
||||||
INITIRQ(footbridge_init_irq)
|
.boot_params = 0x00000100,
|
||||||
|
.map_io = footbridge_map_io,
|
||||||
|
.init_irq = footbridge_init_irq,
|
||||||
.timer = &footbridge_timer,
|
.timer = &footbridge_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
||||||
|
|
|
@ -41,8 +41,8 @@ h7201_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
|
|
||||||
static struct irqaction h7201_timer_irq = {
|
static struct irqaction h7201_timer_irq = {
|
||||||
.name = "h7201 Timer Tick",
|
.name = "h7201 Timer Tick",
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
.handler = h7201_timer_interrupt
|
.handler = h7201_timer_interrupt,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -171,8 +171,8 @@ static struct irqchip h7202_timerx_chip = {
|
||||||
|
|
||||||
static struct irqaction h7202_timer_irq = {
|
static struct irqaction h7202_timer_irq = {
|
||||||
.name = "h7202 Timer Tick",
|
.name = "h7202 Timer Tick",
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
.handler = h7202_timer_interrupt
|
.handler = h7202_timer_interrupt,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -30,10 +30,12 @@
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
MACHINE_START(H7201, "Hynix GMS30C7201")
|
MACHINE_START(H7201, "Hynix GMS30C7201")
|
||||||
MAINTAINER("Robert Schwebel, Pengutronix")
|
/* Maintainer: Robert Schwebel, Pengutronix */
|
||||||
BOOT_MEM(0x40000000, 0x80000000, 0xf0000000)
|
.phys_ram = 0x40000000,
|
||||||
BOOT_PARAMS(0xc0001000)
|
.phys_io = 0x80000000,
|
||||||
MAPIO(h720x_map_io)
|
.io_pg_offst = ((0xf0000000) >> 18) & 0xfffc,
|
||||||
INITIRQ(h720x_init_irq)
|
.boot_params = 0xc0001000,
|
||||||
.timer = &h7201_timer,
|
.map_io = h720x_map_io,
|
||||||
|
.init_irq = h720x_init_irq,
|
||||||
|
.timer = &h7201_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -71,11 +71,13 @@ static void __init init_eval_h7202(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(H7202, "Hynix HMS30C7202")
|
MACHINE_START(H7202, "Hynix HMS30C7202")
|
||||||
MAINTAINER("Robert Schwebel, Pengutronix")
|
/* Maintainer: Robert Schwebel, Pengutronix */
|
||||||
BOOT_MEM(0x40000000, 0x80000000, 0xf0000000)
|
.phys_ram = 0x40000000,
|
||||||
BOOT_PARAMS(0x40000100)
|
.phys_io = 0x80000000,
|
||||||
MAPIO(h720x_map_io)
|
.io_pg_offst = ((0xf0000000) >> 18) & 0xfffc,
|
||||||
INITIRQ(h7202_init_irq)
|
.boot_params = 0x40000100,
|
||||||
.timer = &h7202_timer,
|
.map_io = h720x_map_io,
|
||||||
INIT_MACHINE(init_eval_h7202)
|
.init_irq = h7202_init_irq,
|
||||||
|
.timer = &h7202_timer,
|
||||||
|
.init_machine = init_eval_h7202,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -78,11 +78,13 @@ mx1ads_map_io(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(MX1ADS, "Motorola MX1ADS")
|
MACHINE_START(MX1ADS, "Motorola MX1ADS")
|
||||||
MAINTAINER("Sascha Hauer, Pengutronix")
|
/* Maintainer: Sascha Hauer, Pengutronix */
|
||||||
BOOT_MEM(0x08000000, 0x00200000, 0xe0200000)
|
.phys_ram = 0x08000000,
|
||||||
BOOT_PARAMS(0x08000100)
|
.phys_io = 0x00200000,
|
||||||
MAPIO(mx1ads_map_io)
|
.io_pg_offst = ((0xe0200000) >> 18) & 0xfffc,
|
||||||
INITIRQ(imx_init_irq)
|
.boot_params = 0x08000100,
|
||||||
|
.map_io = mx1ads_map_io,
|
||||||
|
.init_irq = imx_init_irq,
|
||||||
.timer = &imx_timer,
|
.timer = &imx_timer,
|
||||||
INIT_MACHINE(mx1ads_init)
|
.init_machine = mx1ads_init,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -72,8 +72,8 @@ imx_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
|
|
||||||
static struct irqaction imx_timer_irq = {
|
static struct irqaction imx_timer_irq = {
|
||||||
.name = "i.MX Timer Tick",
|
.name = "i.MX Timer Tick",
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
.handler = imx_timer_interrupt
|
.handler = imx_timer_interrupt,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include <asm/irq.h>
|
#include <asm/irq.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/hardware/amba.h>
|
#include <asm/hardware/amba.h>
|
||||||
|
#include <asm/hardware/arm_timer.h>
|
||||||
#include <asm/arch/cm.h>
|
#include <asm/arch/cm.h>
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
#include <asm/leds.h>
|
#include <asm/leds.h>
|
||||||
|
@ -156,16 +157,6 @@ EXPORT_SYMBOL(cm_control);
|
||||||
#define TICKS2USECS(x) ((x) / TICKS_PER_uSEC)
|
#define TICKS2USECS(x) ((x) / TICKS_PER_uSEC)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
|
||||||
* What does it look like?
|
|
||||||
*/
|
|
||||||
typedef struct TimerStruct {
|
|
||||||
unsigned long TimerLoad;
|
|
||||||
unsigned long TimerValue;
|
|
||||||
unsigned long TimerControl;
|
|
||||||
unsigned long TimerClear;
|
|
||||||
} TimerStruct_t;
|
|
||||||
|
|
||||||
static unsigned long timer_reload;
|
static unsigned long timer_reload;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -174,7 +165,6 @@ static unsigned long timer_reload;
|
||||||
*/
|
*/
|
||||||
unsigned long integrator_gettimeoffset(void)
|
unsigned long integrator_gettimeoffset(void)
|
||||||
{
|
{
|
||||||
volatile TimerStruct_t *timer1 = (TimerStruct_t *)TIMER1_VA_BASE;
|
|
||||||
unsigned long ticks1, ticks2, status;
|
unsigned long ticks1, ticks2, status;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -183,11 +173,11 @@ unsigned long integrator_gettimeoffset(void)
|
||||||
* an interrupt. We get around this by ensuring that the
|
* an interrupt. We get around this by ensuring that the
|
||||||
* counter has not reloaded between our two reads.
|
* counter has not reloaded between our two reads.
|
||||||
*/
|
*/
|
||||||
ticks2 = timer1->TimerValue & 0xffff;
|
ticks2 = readl(TIMER1_VA_BASE + TIMER_VALUE) & 0xffff;
|
||||||
do {
|
do {
|
||||||
ticks1 = ticks2;
|
ticks1 = ticks2;
|
||||||
status = __raw_readl(VA_IC_BASE + IRQ_RAW_STATUS);
|
status = __raw_readl(VA_IC_BASE + IRQ_RAW_STATUS);
|
||||||
ticks2 = timer1->TimerValue & 0xffff;
|
ticks2 = readl(TIMER1_VA_BASE + TIMER_VALUE) & 0xffff;
|
||||||
} while (ticks2 > ticks1);
|
} while (ticks2 > ticks1);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -213,14 +203,12 @@ unsigned long integrator_gettimeoffset(void)
|
||||||
static irqreturn_t
|
static irqreturn_t
|
||||||
integrator_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
integrator_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
volatile TimerStruct_t *timer1 = (volatile TimerStruct_t *)TIMER1_VA_BASE;
|
|
||||||
|
|
||||||
write_seqlock(&xtime_lock);
|
write_seqlock(&xtime_lock);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* clear the interrupt
|
* clear the interrupt
|
||||||
*/
|
*/
|
||||||
timer1->TimerClear = 1;
|
writel(1, TIMER1_VA_BASE + TIMER_INTCLR);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* the clock tick routines are only processed on the
|
* the clock tick routines are only processed on the
|
||||||
|
@ -247,8 +235,8 @@ integrator_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
|
|
||||||
static struct irqaction integrator_timer_irq = {
|
static struct irqaction integrator_timer_irq = {
|
||||||
.name = "Integrator Timer Tick",
|
.name = "Integrator Timer Tick",
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
.handler = integrator_timer_interrupt
|
.handler = integrator_timer_interrupt,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -256,32 +244,29 @@ static struct irqaction integrator_timer_irq = {
|
||||||
*/
|
*/
|
||||||
void __init integrator_time_init(unsigned long reload, unsigned int ctrl)
|
void __init integrator_time_init(unsigned long reload, unsigned int ctrl)
|
||||||
{
|
{
|
||||||
volatile TimerStruct_t *timer0 = (volatile TimerStruct_t *)TIMER0_VA_BASE;
|
unsigned int timer_ctrl = TIMER_CTRL_ENABLE | TIMER_CTRL_PERIODIC;
|
||||||
volatile TimerStruct_t *timer1 = (volatile TimerStruct_t *)TIMER1_VA_BASE;
|
|
||||||
volatile TimerStruct_t *timer2 = (volatile TimerStruct_t *)TIMER2_VA_BASE;
|
|
||||||
unsigned int timer_ctrl = 0x80 | 0x40; /* periodic */
|
|
||||||
|
|
||||||
timer_reload = reload;
|
timer_reload = reload;
|
||||||
timer_ctrl |= ctrl;
|
timer_ctrl |= ctrl;
|
||||||
|
|
||||||
if (timer_reload > 0x100000) {
|
if (timer_reload > 0x100000) {
|
||||||
timer_reload >>= 8;
|
timer_reload >>= 8;
|
||||||
timer_ctrl |= 0x08; /* /256 */
|
timer_ctrl |= TIMER_CTRL_DIV256;
|
||||||
} else if (timer_reload > 0x010000) {
|
} else if (timer_reload > 0x010000) {
|
||||||
timer_reload >>= 4;
|
timer_reload >>= 4;
|
||||||
timer_ctrl |= 0x04; /* /16 */
|
timer_ctrl |= TIMER_CTRL_DIV16;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialise to a known state (all timers off)
|
* Initialise to a known state (all timers off)
|
||||||
*/
|
*/
|
||||||
timer0->TimerControl = 0;
|
writel(0, TIMER0_VA_BASE + TIMER_CTRL);
|
||||||
timer1->TimerControl = 0;
|
writel(0, TIMER1_VA_BASE + TIMER_CTRL);
|
||||||
timer2->TimerControl = 0;
|
writel(0, TIMER2_VA_BASE + TIMER_CTRL);
|
||||||
|
|
||||||
timer1->TimerLoad = timer_reload;
|
writel(timer_reload, TIMER1_VA_BASE + TIMER_LOAD);
|
||||||
timer1->TimerValue = timer_reload;
|
writel(timer_reload, TIMER1_VA_BASE + TIMER_VALUE);
|
||||||
timer1->TimerControl = timer_ctrl;
|
writel(timer_ctrl, TIMER1_VA_BASE + TIMER_CTRL);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Make irqs happen for the system timer
|
* Make irqs happen for the system timer
|
||||||
|
|
|
@ -292,11 +292,13 @@ static struct sys_timer ap_timer = {
|
||||||
};
|
};
|
||||||
|
|
||||||
MACHINE_START(INTEGRATOR, "ARM-Integrator")
|
MACHINE_START(INTEGRATOR, "ARM-Integrator")
|
||||||
MAINTAINER("ARM Ltd/Deep Blue Solutions Ltd")
|
/* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */
|
||||||
BOOT_MEM(0x00000000, 0x16000000, 0xf1600000)
|
.phys_ram = 0x00000000,
|
||||||
BOOT_PARAMS(0x00000100)
|
.phys_io = 0x16000000,
|
||||||
MAPIO(ap_map_io)
|
.io_pg_offst = ((0xf1600000) >> 18) & 0xfffc,
|
||||||
INITIRQ(ap_init_irq)
|
.boot_params = 0x00000100,
|
||||||
|
.map_io = ap_map_io,
|
||||||
|
.init_irq = ap_init_irq,
|
||||||
.timer = &ap_timer,
|
.timer = &ap_timer,
|
||||||
INIT_MACHINE(ap_init)
|
.init_machine = ap_init,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -532,11 +532,13 @@ static struct sys_timer cp_timer = {
|
||||||
};
|
};
|
||||||
|
|
||||||
MACHINE_START(CINTEGRATOR, "ARM-IntegratorCP")
|
MACHINE_START(CINTEGRATOR, "ARM-IntegratorCP")
|
||||||
MAINTAINER("ARM Ltd/Deep Blue Solutions Ltd")
|
/* Maintainer: ARM Ltd/Deep Blue Solutions Ltd */
|
||||||
BOOT_MEM(0x00000000, 0x16000000, 0xf1600000)
|
.phys_ram = 0x00000000,
|
||||||
BOOT_PARAMS(0x00000100)
|
.phys_io = 0x16000000,
|
||||||
MAPIO(intcp_map_io)
|
.io_pg_offst = ((0xf1600000) >> 18) & 0xfffc,
|
||||||
INITIRQ(intcp_init_irq)
|
.boot_params = 0x00000100,
|
||||||
|
.map_io = intcp_map_io,
|
||||||
|
.init_irq = intcp_init_irq,
|
||||||
.timer = &cp_timer,
|
.timer = &cp_timer,
|
||||||
INIT_MACHINE(intcp_init)
|
.init_machine = intcp_init,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -146,23 +146,27 @@ extern void iop321_init_time(void);
|
||||||
|
|
||||||
#if defined(CONFIG_ARCH_IQ80321)
|
#if defined(CONFIG_ARCH_IQ80321)
|
||||||
MACHINE_START(IQ80321, "Intel IQ80321")
|
MACHINE_START(IQ80321, "Intel IQ80321")
|
||||||
MAINTAINER("Intel Corporation")
|
/* Maintainer: Intel Corporation */
|
||||||
BOOT_MEM(PHYS_OFFSET, IQ80321_UART, IQ80321_UART)
|
.phys_ram = PHYS_OFFSET,
|
||||||
MAPIO(iq80321_map_io)
|
.phys_io = IQ80321_UART,
|
||||||
INITIRQ(iop321_init_irq)
|
.io_pg_offst = ((IQ80321_UART) >> 18) & 0xfffc,
|
||||||
|
.map_io = iq80321_map_io,
|
||||||
|
.init_irq = iop321_init_irq,
|
||||||
.timer = &iop321_timer,
|
.timer = &iop321_timer,
|
||||||
BOOT_PARAMS(0xa0000100)
|
.boot_params = 0xa0000100,
|
||||||
INIT_MACHINE(iop32x_init)
|
.init_machine = iop32x_init,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
#elif defined(CONFIG_ARCH_IQ31244)
|
#elif defined(CONFIG_ARCH_IQ31244)
|
||||||
MACHINE_START(IQ31244, "Intel IQ31244")
|
MACHINE_START(IQ31244, "Intel IQ31244")
|
||||||
MAINTAINER("Intel Corp.")
|
/* Maintainer: Intel Corp. */
|
||||||
BOOT_MEM(PHYS_OFFSET, IQ31244_UART, IQ31244_UART)
|
.phys_ram = PHYS_OFFSET,
|
||||||
MAPIO(iq31244_map_io)
|
.phys_io = IQ31244_UART,
|
||||||
INITIRQ(iop321_init_irq)
|
.io_pg_offst = ((IQ31244_UART) >> 18) & 0xfffc,
|
||||||
|
.map_io = iq31244_map_io,
|
||||||
|
.init_irq = iop321_init_irq,
|
||||||
.timer = &iop321_timer,
|
.timer = &iop321_timer,
|
||||||
BOOT_PARAMS(0xa0000100)
|
.boot_params = 0xa0000100,
|
||||||
INIT_MACHINE(iop32x_init)
|
.init_machine = iop32x_init,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
#else
|
#else
|
||||||
#error No machine descriptor defined for this IOP3XX implementation
|
#error No machine descriptor defined for this IOP3XX implementation
|
||||||
|
|
|
@ -86,7 +86,7 @@ iop321_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
static struct irqaction iop321_timer_irq = {
|
static struct irqaction iop321_timer_irq = {
|
||||||
.name = "IOP321 Timer Tick",
|
.name = "IOP321 Timer Tick",
|
||||||
.handler = iop321_timer_interrupt,
|
.handler = iop321_timer_interrupt,
|
||||||
.flags = SA_INTERRUPT
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __init iop321_timer_init(void)
|
static void __init iop321_timer_init(void)
|
||||||
|
|
|
@ -148,26 +148,28 @@ extern void iq80332_map_io(void);
|
||||||
|
|
||||||
#if defined(CONFIG_ARCH_IQ80331)
|
#if defined(CONFIG_ARCH_IQ80331)
|
||||||
MACHINE_START(IQ80331, "Intel IQ80331")
|
MACHINE_START(IQ80331, "Intel IQ80331")
|
||||||
MAINTAINER("Intel Corp.")
|
/* Maintainer: Intel Corp. */
|
||||||
BOOT_MEM(PHYS_OFFSET, 0xfefff000, 0xfffff000) // virtual, physical
|
.phys_ram = PHYS_OFFSET,
|
||||||
//BOOT_MEM(PHYS_OFFSET, IOP331_UART0_VIRT, IOP331_UART0_PHYS)
|
.phys_io = 0xfefff000,
|
||||||
MAPIO(iq80331_map_io)
|
.io_pg_offst = ((0xfffff000) >> 18) & 0xfffc, // virtual, physical
|
||||||
INITIRQ(iop331_init_irq)
|
.map_io = iq80331_map_io,
|
||||||
|
.init_irq = iop331_init_irq,
|
||||||
.timer = &iop331_timer,
|
.timer = &iop331_timer,
|
||||||
BOOT_PARAMS(0x0100)
|
.boot_params = 0x0100,
|
||||||
INIT_MACHINE(iop33x_init)
|
.init_machine = iop33x_init,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
||||||
#elif defined(CONFIG_MACH_IQ80332)
|
#elif defined(CONFIG_MACH_IQ80332)
|
||||||
MACHINE_START(IQ80332, "Intel IQ80332")
|
MACHINE_START(IQ80332, "Intel IQ80332")
|
||||||
MAINTAINER("Intel Corp.")
|
/* Maintainer: Intel Corp. */
|
||||||
BOOT_MEM(PHYS_OFFSET, 0xfefff000, 0xfffff000) // virtual, physical
|
.phys_ram = PHYS_OFFSET,
|
||||||
//BOOT_MEM(PHYS_OFFSET, IOP331_UART0_VIRT, IOP331_UART0_PHYS)
|
.phys_io = 0xfefff000,
|
||||||
MAPIO(iq80332_map_io)
|
.io_pg_offst = ((0xfffff000) >> 18) & 0xfffc, // virtual, physical
|
||||||
INITIRQ(iop331_init_irq)
|
.map_io = iq80332_map_io,
|
||||||
|
.init_irq = iop331_init_irq,
|
||||||
.timer = &iop331_timer,
|
.timer = &iop331_timer,
|
||||||
BOOT_PARAMS(0x0100)
|
.boot_params = 0x0100,
|
||||||
INIT_MACHINE(iop33x_init)
|
.init_machine = iop33x_init,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -83,7 +83,7 @@ iop331_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
static struct irqaction iop331_timer_irq = {
|
static struct irqaction iop331_timer_irq = {
|
||||||
.name = "IOP331 Timer Tick",
|
.name = "IOP331 Timer Tick",
|
||||||
.handler = iop331_timer_interrupt,
|
.handler = iop331_timer_interrupt,
|
||||||
.flags = SA_INTERRUPT
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __init iop331_timer_init(void)
|
static void __init iop331_timer_init(void)
|
||||||
|
|
|
@ -102,6 +102,11 @@ static struct map_desc ixp2000_io_desc[] __initdata = {
|
||||||
.physical = IXP2000_PCI_CSR_PHYS_BASE,
|
.physical = IXP2000_PCI_CSR_PHYS_BASE,
|
||||||
.length = IXP2000_PCI_CSR_SIZE,
|
.length = IXP2000_PCI_CSR_SIZE,
|
||||||
.type = MT_DEVICE
|
.type = MT_DEVICE
|
||||||
|
}, {
|
||||||
|
.virtual = IXP2000_MSF_VIRT_BASE,
|
||||||
|
.physical = IXP2000_MSF_PHYS_BASE,
|
||||||
|
.length = IXP2000_MSF_SIZE,
|
||||||
|
.type = MT_DEVICE
|
||||||
}, {
|
}, {
|
||||||
.virtual = IXP2000_PCI_IO_VIRT_BASE,
|
.virtual = IXP2000_PCI_IO_VIRT_BASE,
|
||||||
.physical = IXP2000_PCI_IO_PHYS_BASE,
|
.physical = IXP2000_PCI_IO_PHYS_BASE,
|
||||||
|
@ -194,8 +199,8 @@ static int ixp2000_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
|
|
||||||
static struct irqaction ixp2000_timer_irq = {
|
static struct irqaction ixp2000_timer_irq = {
|
||||||
.name = "IXP2000 Timer Tick",
|
.name = "IXP2000 Timer Tick",
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
.handler = ixp2000_timer_interrupt
|
.handler = ixp2000_timer_interrupt,
|
||||||
};
|
};
|
||||||
|
|
||||||
void __init ixp2000_init_time(unsigned long tick_rate)
|
void __init ixp2000_init_time(unsigned long tick_rate)
|
||||||
|
|
|
@ -223,13 +223,15 @@ static void __init enp2611_init_machine(void)
|
||||||
|
|
||||||
|
|
||||||
MACHINE_START(ENP2611, "Radisys ENP-2611 PCI network processor board")
|
MACHINE_START(ENP2611, "Radisys ENP-2611 PCI network processor board")
|
||||||
MAINTAINER("Lennert Buytenhek <buytenh@wantstofly.org>")
|
/* Maintainer: Lennert Buytenhek <buytenh@wantstofly.org> */
|
||||||
BOOT_MEM(0x00000000, IXP2000_UART_PHYS_BASE, IXP2000_UART_VIRT_BASE)
|
.phys_ram = 0x00000000,
|
||||||
BOOT_PARAMS(0x00000100)
|
.phys_io = IXP2000_UART_PHYS_BASE,
|
||||||
MAPIO(ixp2000_map_io)
|
.io_pg_offst = ((IXP2000_UART_VIRT_BASE) >> 18) & 0xfffc,
|
||||||
INITIRQ(ixp2000_init_irq)
|
.boot_params = 0x00000100,
|
||||||
|
.map_io = ixp2000_map_io,
|
||||||
|
.init_irq = ixp2000_init_irq,
|
||||||
.timer = &enp2611_timer,
|
.timer = &enp2611_timer,
|
||||||
INIT_MACHINE(enp2611_init_machine)
|
.init_machine = enp2611_init_machine,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -168,12 +168,14 @@ void ixdp2400_init_irq(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(IXDP2400, "Intel IXDP2400 Development Platform")
|
MACHINE_START(IXDP2400, "Intel IXDP2400 Development Platform")
|
||||||
MAINTAINER("MontaVista Software, Inc.")
|
/* Maintainer: MontaVista Software, Inc. */
|
||||||
BOOT_MEM(0x00000000, IXP2000_UART_PHYS_BASE, IXP2000_UART_VIRT_BASE)
|
.phys_ram = 0x00000000,
|
||||||
BOOT_PARAMS(0x00000100)
|
.phys_io = IXP2000_UART_PHYS_BASE,
|
||||||
MAPIO(ixdp2x00_map_io)
|
.io_pg_offst = ((IXP2000_UART_VIRT_BASE) >> 18) & 0xfffc,
|
||||||
INITIRQ(ixdp2400_init_irq)
|
.boot_params = 0x00000100,
|
||||||
|
.map_io = ixdp2x00_map_io,
|
||||||
|
.init_irq = ixdp2400_init_irq,
|
||||||
.timer = &ixdp2400_timer,
|
.timer = &ixdp2400_timer,
|
||||||
INIT_MACHINE(ixdp2x00_init_machine)
|
.init_machine = ixdp2x00_init_machine,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
||||||
|
|
|
@ -42,12 +42,6 @@
|
||||||
#include <asm/mach/flash.h>
|
#include <asm/mach/flash.h>
|
||||||
#include <asm/mach/arch.h>
|
#include <asm/mach/arch.h>
|
||||||
|
|
||||||
|
|
||||||
void ixdp2400_init_irq(void)
|
|
||||||
{
|
|
||||||
ixdp2x00_init_irq(IXDP2800_CPLD_INT_STAT, IXDP2800_CPLD_INT_MASK, IXDP2400_NR_IRQS);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* IXDP2800 timer tick
|
* IXDP2800 timer tick
|
||||||
*************************************************************************/
|
*************************************************************************/
|
||||||
|
@ -290,12 +284,14 @@ void ixdp2800_init_irq(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(IXDP2800, "Intel IXDP2800 Development Platform")
|
MACHINE_START(IXDP2800, "Intel IXDP2800 Development Platform")
|
||||||
MAINTAINER("MontaVista Software, Inc.")
|
/* Maintainer: MontaVista Software, Inc. */
|
||||||
BOOT_MEM(0x00000000, IXP2000_UART_PHYS_BASE, IXP2000_UART_VIRT_BASE)
|
.phys_ram = 0x00000000,
|
||||||
BOOT_PARAMS(0x00000100)
|
.phys_io = IXP2000_UART_PHYS_BASE,
|
||||||
MAPIO(ixdp2x00_map_io)
|
.io_pg_offst = ((IXP2000_UART_VIRT_BASE) >> 18) & 0xfffc,
|
||||||
INITIRQ(ixdp2800_init_irq)
|
.boot_params = 0x00000100,
|
||||||
|
.map_io = ixdp2x00_map_io,
|
||||||
|
.init_irq = ixdp2800_init_irq,
|
||||||
.timer = &ixdp2800_timer,
|
.timer = &ixdp2800_timer,
|
||||||
INIT_MACHINE(ixdp2x00_init_machine)
|
.init_machine = ixdp2x00_init_machine,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
||||||
|
|
|
@ -375,25 +375,29 @@ static void __init ixdp2x01_init_machine(void)
|
||||||
|
|
||||||
#ifdef CONFIG_ARCH_IXDP2401
|
#ifdef CONFIG_ARCH_IXDP2401
|
||||||
MACHINE_START(IXDP2401, "Intel IXDP2401 Development Platform")
|
MACHINE_START(IXDP2401, "Intel IXDP2401 Development Platform")
|
||||||
MAINTAINER("MontaVista Software, Inc.")
|
/* Maintainer: MontaVista Software, Inc. */
|
||||||
BOOT_MEM(0x00000000, IXP2000_UART_PHYS_BASE, IXP2000_UART_VIRT_BASE)
|
.phys_ram = 0x00000000,
|
||||||
BOOT_PARAMS(0x00000100)
|
.phys_io = IXP2000_UART_PHYS_BASE,
|
||||||
MAPIO(ixdp2x01_map_io)
|
.io_pg_offst = ((IXP2000_UART_VIRT_BASE) >> 18) & 0xfffc,
|
||||||
INITIRQ(ixdp2x01_init_irq)
|
.boot_params = 0x00000100,
|
||||||
|
.map_io = ixdp2x01_map_io,
|
||||||
|
.init_irq = ixdp2x01_init_irq,
|
||||||
.timer = &ixdp2x01_timer,
|
.timer = &ixdp2x01_timer,
|
||||||
INIT_MACHINE(ixdp2x01_init_machine)
|
.init_machine = ixdp2x01_init_machine,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_ARCH_IXDP2801
|
#ifdef CONFIG_ARCH_IXDP2801
|
||||||
MACHINE_START(IXDP2801, "Intel IXDP2801 Development Platform")
|
MACHINE_START(IXDP2801, "Intel IXDP2801 Development Platform")
|
||||||
MAINTAINER("MontaVista Software, Inc.")
|
/* Maintainer: MontaVista Software, Inc. */
|
||||||
BOOT_MEM(0x00000000, IXP2000_UART_PHYS_BASE, IXP2000_UART_VIRT_BASE)
|
.phys_ram = 0x00000000,
|
||||||
BOOT_PARAMS(0x00000100)
|
.phys_io = IXP2000_UART_PHYS_BASE,
|
||||||
MAPIO(ixdp2x01_map_io)
|
.io_pg_offst = ((IXP2000_UART_VIRT_BASE) >> 18) & 0xfffc,
|
||||||
INITIRQ(ixdp2x01_init_irq)
|
.boot_params = 0x00000100,
|
||||||
|
.map_io = ixdp2x01_map_io,
|
||||||
|
.init_irq = ixdp2x01_init_irq,
|
||||||
.timer = &ixdp2x01_timer,
|
.timer = &ixdp2x01_timer,
|
||||||
INIT_MACHINE(ixdp2x01_init_machine)
|
.init_machine = ixdp2x01_init_machine,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -298,8 +298,8 @@ static irqreturn_t ixp4xx_timer_interrupt(int irq, void *dev_id, struct pt_regs
|
||||||
|
|
||||||
static struct irqaction ixp4xx_timer_irq = {
|
static struct irqaction ixp4xx_timer_irq = {
|
||||||
.name = "IXP4xx Timer Tick",
|
.name = "IXP4xx Timer Tick",
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
.handler = ixp4xx_timer_interrupt
|
.handler = ixp4xx_timer_interrupt,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __init ixp4xx_timer_init(void)
|
static void __init ixp4xx_timer_init(void)
|
||||||
|
|
|
@ -100,14 +100,15 @@ static void __init coyote_init(void)
|
||||||
|
|
||||||
#ifdef CONFIG_ARCH_ADI_COYOTE
|
#ifdef CONFIG_ARCH_ADI_COYOTE
|
||||||
MACHINE_START(ADI_COYOTE, "ADI Engineering Coyote")
|
MACHINE_START(ADI_COYOTE, "ADI Engineering Coyote")
|
||||||
MAINTAINER("MontaVista Software, Inc.")
|
/* Maintainer: MontaVista Software, Inc. */
|
||||||
BOOT_MEM(PHYS_OFFSET, IXP4XX_PERIPHERAL_BASE_PHYS,
|
.phys_ram = PHYS_OFFSET,
|
||||||
IXP4XX_PERIPHERAL_BASE_VIRT)
|
.phys_io = IXP4XX_PERIPHERAL_BASE_PHYS,
|
||||||
MAPIO(coyote_map_io)
|
.io_pg_offst = ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xfffc,
|
||||||
INITIRQ(ixp4xx_init_irq)
|
.map_io = coyote_map_io,
|
||||||
|
.init_irq = ixp4xx_init_irq,
|
||||||
.timer = &ixp4xx_timer,
|
.timer = &ixp4xx_timer,
|
||||||
BOOT_PARAMS(0x0100)
|
.boot_params = 0x0100,
|
||||||
INIT_MACHINE(coyote_init)
|
.init_machine = coyote_init,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -117,14 +118,15 @@ MACHINE_END
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_MACH_IXDPG425
|
#ifdef CONFIG_MACH_IXDPG425
|
||||||
MACHINE_START(IXDPG425, "Intel IXDPG425")
|
MACHINE_START(IXDPG425, "Intel IXDPG425")
|
||||||
MAINTAINER("MontaVista Software, Inc.")
|
/* Maintainer: MontaVista Software, Inc. */
|
||||||
BOOT_MEM(PHYS_OFFSET, IXP4XX_PERIPHERAL_BASE_PHYS,
|
.phys_ram = PHYS_OFFSET,
|
||||||
IXP4XX_PERIPHERAL_BASE_VIRT)
|
.phys_io = IXP4XX_PERIPHERAL_BASE_PHYS,
|
||||||
MAPIO(coyote_map_io)
|
.io_pg_offst = ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xfffc,
|
||||||
INITIRQ(ixp4xx_init_irq)
|
.map_io = coyote_map_io,
|
||||||
|
.init_irq = ixp4xx_init_irq,
|
||||||
.timer = &ixp4xx_timer,
|
.timer = &ixp4xx_timer,
|
||||||
BOOT_PARAMS(0x0100)
|
.boot_params = 0x0100,
|
||||||
INIT_MACHINE(coyote_init)
|
.init_machine = coyote_init,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -140,14 +140,15 @@ static void __init gtwx5715_init(void)
|
||||||
|
|
||||||
|
|
||||||
MACHINE_START(GTWX5715, "Gemtek GTWX5715 (Linksys WRV54G)")
|
MACHINE_START(GTWX5715, "Gemtek GTWX5715 (Linksys WRV54G)")
|
||||||
MAINTAINER("George Joseph")
|
/* Maintainer: George Joseph */
|
||||||
BOOT_MEM(PHYS_OFFSET, IXP4XX_UART2_BASE_PHYS,
|
.phys_ram = PHYS_OFFSET,
|
||||||
IXP4XX_UART2_BASE_VIRT)
|
.phys_io = IXP4XX_UART2_BASE_PHYS,
|
||||||
MAPIO(gtwx5715_map_io)
|
.io_pg_offst = ((IXP4XX_UART2_BASE_VIRT) >> 18) & 0xfffc,
|
||||||
INITIRQ(ixp4xx_init_irq)
|
.map_io = gtwx5715_map_io,
|
||||||
.timer = &ixp4xx_timer,
|
.init_irq = ixp4xx_init_irq,
|
||||||
BOOT_PARAMS(0x0100)
|
.timer = &ixp4xx_timer,
|
||||||
INIT_MACHINE(gtwx5715_init)
|
.boot_params = 0x0100,
|
||||||
|
.init_machine = gtwx5715_init,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -128,36 +128,39 @@ static void __init ixdp425_init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(IXDP425, "Intel IXDP425 Development Platform")
|
MACHINE_START(IXDP425, "Intel IXDP425 Development Platform")
|
||||||
MAINTAINER("MontaVista Software, Inc.")
|
/* Maintainer: MontaVista Software, Inc. */
|
||||||
BOOT_MEM(PHYS_OFFSET, IXP4XX_PERIPHERAL_BASE_PHYS,
|
.phys_ram = PHYS_OFFSET,
|
||||||
IXP4XX_PERIPHERAL_BASE_VIRT)
|
.phys_io = IXP4XX_PERIPHERAL_BASE_PHYS,
|
||||||
MAPIO(ixdp425_map_io)
|
.io_pg_offst = ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xfffc,
|
||||||
INITIRQ(ixp4xx_init_irq)
|
.map_io = ixdp425_map_io,
|
||||||
|
.init_irq = ixp4xx_init_irq,
|
||||||
.timer = &ixp4xx_timer,
|
.timer = &ixp4xx_timer,
|
||||||
BOOT_PARAMS(0x0100)
|
.boot_params = 0x0100,
|
||||||
INIT_MACHINE(ixdp425_init)
|
.init_machine = ixdp425_init,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
||||||
MACHINE_START(IXDP465, "Intel IXDP465 Development Platform")
|
MACHINE_START(IXDP465, "Intel IXDP465 Development Platform")
|
||||||
MAINTAINER("MontaVista Software, Inc.")
|
/* Maintainer: MontaVista Software, Inc. */
|
||||||
BOOT_MEM(PHYS_OFFSET, IXP4XX_PERIPHERAL_BASE_PHYS,
|
.phys_ram = PHYS_OFFSET,
|
||||||
IXP4XX_PERIPHERAL_BASE_VIRT)
|
.phys_io = IXP4XX_PERIPHERAL_BASE_PHYS,
|
||||||
MAPIO(ixdp425_map_io)
|
.io_pg_offst = ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xfffc,
|
||||||
INITIRQ(ixp4xx_init_irq)
|
.map_io = ixdp425_map_io,
|
||||||
|
.init_irq = ixp4xx_init_irq,
|
||||||
.timer = &ixp4xx_timer,
|
.timer = &ixp4xx_timer,
|
||||||
BOOT_PARAMS(0x0100)
|
.boot_params = 0x0100,
|
||||||
INIT_MACHINE(ixdp425_init)
|
.init_machine = ixdp425_init,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
||||||
MACHINE_START(IXCDP1100, "Intel IXCDP1100 Development Platform")
|
MACHINE_START(IXCDP1100, "Intel IXCDP1100 Development Platform")
|
||||||
MAINTAINER("MontaVista Software, Inc.")
|
/* Maintainer: MontaVista Software, Inc. */
|
||||||
BOOT_MEM(PHYS_OFFSET, IXP4XX_PERIPHERAL_BASE_PHYS,
|
.phys_ram = PHYS_OFFSET,
|
||||||
IXP4XX_PERIPHERAL_BASE_VIRT)
|
.phys_io = IXP4XX_PERIPHERAL_BASE_PHYS,
|
||||||
MAPIO(ixdp425_map_io)
|
.io_pg_offst = ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xfffc,
|
||||||
INITIRQ(ixp4xx_init_irq)
|
.map_io = ixdp425_map_io,
|
||||||
|
.init_irq = ixp4xx_init_irq,
|
||||||
.timer = &ixp4xx_timer,
|
.timer = &ixp4xx_timer,
|
||||||
BOOT_PARAMS(0x0100)
|
.boot_params = 0x0100,
|
||||||
INIT_MACHINE(ixdp425_init)
|
.init_machine = ixdp425_init,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -168,14 +171,15 @@ MACHINE_END
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_ARCH_AVILA
|
#ifdef CONFIG_ARCH_AVILA
|
||||||
MACHINE_START(AVILA, "Gateworks Avila Network Platform")
|
MACHINE_START(AVILA, "Gateworks Avila Network Platform")
|
||||||
MAINTAINER("Deepak Saxena <dsaxena@plexity.net>")
|
/* Maintainer: Deepak Saxena <dsaxena@plexity.net> */
|
||||||
BOOT_MEM(PHYS_OFFSET, IXP4XX_PERIPHERAL_BASE_PHYS,
|
.phys_ram = PHYS_OFFSET,
|
||||||
IXP4XX_PERIPHERAL_BASE_VIRT)
|
.phys_io = IXP4XX_PERIPHERAL_BASE_PHYS,
|
||||||
MAPIO(ixdp425_map_io)
|
.io_pg_offst = ((IXP4XX_PERIPHERAL_BASE_VIRT) >> 18) & 0xfffc,
|
||||||
INITIRQ(ixp4xx_init_irq)
|
.map_io = ixdp425_map_io,
|
||||||
|
.init_irq = ixp4xx_init_irq,
|
||||||
.timer = &ixp4xx_timer,
|
.timer = &ixp4xx_timer,
|
||||||
BOOT_PARAMS(0x0100)
|
.boot_params = 0x0100,
|
||||||
INIT_MACHINE(ixdp425_init)
|
.init_machine = ixdp425_init,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -81,9 +81,11 @@ static void __init l7200_map_io(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(L7200, "LinkUp Systems L7200")
|
MACHINE_START(L7200, "LinkUp Systems L7200")
|
||||||
MAINTAINER("Steve Hill / Scott McConnell")
|
/* Maintainer: Steve Hill / Scott McConnell */
|
||||||
BOOT_MEM(0xf0000000, 0x80040000, 0xd0000000)
|
.phys_ram = 0xf0000000,
|
||||||
MAPIO(l7200_map_io)
|
.phys_io = 0x80040000,
|
||||||
INITIRQ(l7200_init_irq)
|
.io_pg_offst = ((0xd0000000) >> 18) & 0xfffc,
|
||||||
|
.map_io = l7200_map_io,
|
||||||
|
.init_irq = l7200_init_irq,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
||||||
|
|
|
@ -102,10 +102,12 @@ void __init lh7a40x_init_board_irq (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START (KEV7A400, "Sharp KEV7a400")
|
MACHINE_START (KEV7A400, "Sharp KEV7a400")
|
||||||
MAINTAINER ("Marc Singer")
|
/* Maintainer: Marc Singer */
|
||||||
BOOT_MEM (0xc0000000, 0x80000000, io_p2v (0x80000000))
|
.phys_ram = 0xc0000000,
|
||||||
BOOT_PARAMS (0xc0000100)
|
.phys_io = 0x80000000,
|
||||||
MAPIO (kev7a400_map_io)
|
.io_pg_offst = ((io_p2v (0x80000000))>>18) & 0xfffc,
|
||||||
INITIRQ (lh7a400_init_irq)
|
.boot_params = 0xc0000100,
|
||||||
|
.map_io = kev7a400_map_io,
|
||||||
|
.init_irq = lh7a400_init_irq,
|
||||||
.timer = &lh7a40x_timer,
|
.timer = &lh7a40x_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -260,13 +260,15 @@ lpd7a400_map_io(void)
|
||||||
#ifdef CONFIG_MACH_LPD7A400
|
#ifdef CONFIG_MACH_LPD7A400
|
||||||
|
|
||||||
MACHINE_START (LPD7A400, "Logic Product Development LPD7A400-10")
|
MACHINE_START (LPD7A400, "Logic Product Development LPD7A400-10")
|
||||||
MAINTAINER ("Marc Singer")
|
/* Maintainer: Marc Singer */
|
||||||
BOOT_MEM (0xc0000000, 0x80000000, io_p2v (0x80000000))
|
.phys_ram = 0xc0000000,
|
||||||
BOOT_PARAMS (0xc0000100)
|
.phys_io = 0x80000000,
|
||||||
MAPIO (lpd7a400_map_io)
|
.io_pg_offst = ((io_p2v (0x80000000))>>18) & 0xfffc,
|
||||||
INITIRQ (lh7a400_init_irq)
|
.boot_params = 0xc0000100,
|
||||||
|
.map_io = lpd7a400_map_io,
|
||||||
|
.init_irq = lh7a400_init_irq,
|
||||||
.timer = &lh7a40x_timer,
|
.timer = &lh7a40x_timer,
|
||||||
INIT_MACHINE (lpd7a40x_init)
|
.init_machine = lpd7a40x_init,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -274,13 +276,15 @@ MACHINE_END
|
||||||
#ifdef CONFIG_MACH_LPD7A404
|
#ifdef CONFIG_MACH_LPD7A404
|
||||||
|
|
||||||
MACHINE_START (LPD7A404, "Logic Product Development LPD7A404-10")
|
MACHINE_START (LPD7A404, "Logic Product Development LPD7A404-10")
|
||||||
MAINTAINER ("Marc Singer")
|
/* Maintainer: Marc Singer */
|
||||||
BOOT_MEM (0xc0000000, 0x80000000, io_p2v (0x80000000))
|
.phys_ram = 0xc0000000,
|
||||||
BOOT_PARAMS (0xc0000100)
|
.phys_io = 0x80000000,
|
||||||
MAPIO (lpd7a400_map_io)
|
.io_pg_offst = ((io_p2v (0x80000000))>>18) & 0xfffc,
|
||||||
INITIRQ (lh7a404_init_irq)
|
.boot_params = 0xc0000100,
|
||||||
|
.map_io = lpd7a400_map_io,
|
||||||
|
.init_irq = lh7a404_init_irq,
|
||||||
.timer = &lh7a40x_timer,
|
.timer = &lh7a40x_timer,
|
||||||
INIT_MACHINE (lpd7a40x_init)
|
.init_machine = lpd7a40x_init,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -53,8 +53,8 @@ lh7a40x_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
||||||
|
|
||||||
static struct irqaction lh7a40x_timer_irq = {
|
static struct irqaction lh7a40x_timer_irq = {
|
||||||
.name = "LHA740x Timer Tick",
|
.name = "LHA740x Timer Tick",
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
.handler = lh7a40x_timer_interrupt
|
.handler = lh7a40x_timer_interrupt,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __init lh7a40x_timer_init(void)
|
static void __init lh7a40x_timer_init(void)
|
||||||
|
|
|
@ -88,11 +88,13 @@ static void __init omap_generic_map_io(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(OMAP_GENERIC, "Generic OMAP1510/1610/1710")
|
MACHINE_START(OMAP_GENERIC, "Generic OMAP1510/1610/1710")
|
||||||
MAINTAINER("Tony Lindgren <tony@atomide.com>")
|
/* Maintainer: Tony Lindgren <tony@atomide.com> */
|
||||||
BOOT_MEM(0x10000000, 0xfff00000, 0xfef00000)
|
.phys_ram = 0x10000000,
|
||||||
BOOT_PARAMS(0x10000100)
|
.phys_io = 0xfff00000,
|
||||||
MAPIO(omap_generic_map_io)
|
.io_pg_offst = ((0xfef00000) >> 18) & 0xfffc,
|
||||||
INITIRQ(omap_generic_init_irq)
|
.boot_params = 0x10000100,
|
||||||
INIT_MACHINE(omap_generic_init)
|
.map_io = omap_generic_map_io,
|
||||||
|
.init_irq = omap_generic_init_irq,
|
||||||
|
.init_machine = omap_generic_init,
|
||||||
.timer = &omap_timer,
|
.timer = &omap_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -177,11 +177,13 @@ static void __init h2_map_io(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(OMAP_H2, "TI-H2")
|
MACHINE_START(OMAP_H2, "TI-H2")
|
||||||
MAINTAINER("Imre Deak <imre.deak@nokia.com>")
|
/* Maintainer: Imre Deak <imre.deak@nokia.com> */
|
||||||
BOOT_MEM(0x10000000, 0xfff00000, 0xfef00000)
|
.phys_ram = 0x10000000,
|
||||||
BOOT_PARAMS(0x10000100)
|
.phys_io = 0xfff00000,
|
||||||
MAPIO(h2_map_io)
|
.io_pg_offst = ((0xfef00000) >> 18) & 0xfffc,
|
||||||
INITIRQ(h2_init_irq)
|
.boot_params = 0x10000100,
|
||||||
INIT_MACHINE(h2_init)
|
.map_io = h2_map_io,
|
||||||
|
.init_irq = h2_init_irq,
|
||||||
|
.init_machine = h2_init,
|
||||||
.timer = &omap_timer,
|
.timer = &omap_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -195,11 +195,13 @@ static void __init h3_map_io(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(OMAP_H3, "TI OMAP1710 H3 board")
|
MACHINE_START(OMAP_H3, "TI OMAP1710 H3 board")
|
||||||
MAINTAINER("Texas Instruments, Inc.")
|
/* Maintainer: Texas Instruments, Inc. */
|
||||||
BOOT_MEM(0x10000000, 0xfff00000, 0xfef00000)
|
.phys_ram = 0x10000000,
|
||||||
BOOT_PARAMS(0x10000100)
|
.phys_io = 0xfff00000,
|
||||||
MAPIO(h3_map_io)
|
.io_pg_offst = ((0xfef00000) >> 18) & 0xfffc,
|
||||||
INITIRQ(h3_init_irq)
|
.boot_params = 0x10000100,
|
||||||
INIT_MACHINE(h3_init)
|
.map_io = h3_map_io,
|
||||||
|
.init_irq = h3_init_irq,
|
||||||
|
.init_machine = h3_init,
|
||||||
.timer = &omap_timer,
|
.timer = &omap_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -270,11 +270,13 @@ static void __init innovator_map_io(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(OMAP_INNOVATOR, "TI-Innovator")
|
MACHINE_START(OMAP_INNOVATOR, "TI-Innovator")
|
||||||
MAINTAINER("MontaVista Software, Inc.")
|
/* Maintainer: MontaVista Software, Inc. */
|
||||||
BOOT_MEM(0x10000000, 0xfff00000, 0xfef00000)
|
.phys_ram = 0x10000000,
|
||||||
BOOT_PARAMS(0x10000100)
|
.phys_io = 0xfff00000,
|
||||||
MAPIO(innovator_map_io)
|
.io_pg_offst = ((0xfef00000) >> 18) & 0xfffc,
|
||||||
INITIRQ(innovator_init_irq)
|
.boot_params = 0x10000100,
|
||||||
INIT_MACHINE(innovator_init)
|
.map_io = innovator_map_io,
|
||||||
|
.init_irq = innovator_init_irq,
|
||||||
|
.init_machine = innovator_init,
|
||||||
.timer = &omap_timer,
|
.timer = &omap_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -141,11 +141,13 @@ static int __init netstar_late_init(void)
|
||||||
postcore_initcall(netstar_late_init);
|
postcore_initcall(netstar_late_init);
|
||||||
|
|
||||||
MACHINE_START(NETSTAR, "NetStar OMAP5910")
|
MACHINE_START(NETSTAR, "NetStar OMAP5910")
|
||||||
MAINTAINER("Ladislav Michl <michl@2n.cz>")
|
/* Maintainer: Ladislav Michl <michl@2n.cz> */
|
||||||
BOOT_MEM(0x10000000, 0xfff00000, 0xfef00000)
|
.phys_ram = 0x10000000,
|
||||||
BOOT_PARAMS(0x10000100)
|
.phys_io = 0xfff00000,
|
||||||
MAPIO(netstar_map_io)
|
.io_pg_offst = ((0xfef00000) >> 18) & 0xfffc,
|
||||||
INITIRQ(netstar_init_irq)
|
.boot_params = 0x10000100,
|
||||||
INIT_MACHINE(netstar_init)
|
.map_io = netstar_map_io,
|
||||||
.timer = &omap_timer,
|
.init_irq = netstar_init_irq,
|
||||||
|
.init_machine = netstar_init,
|
||||||
|
.timer = &omap_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -159,11 +159,13 @@ static void __init osk_map_io(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(OMAP_OSK, "TI-OSK")
|
MACHINE_START(OMAP_OSK, "TI-OSK")
|
||||||
MAINTAINER("Dirk Behme <dirk.behme@de.bosch.com>")
|
/* Maintainer: Dirk Behme <dirk.behme@de.bosch.com> */
|
||||||
BOOT_MEM(0x10000000, 0xfff00000, 0xfef00000)
|
.phys_ram = 0x10000000,
|
||||||
BOOT_PARAMS(0x10000100)
|
.phys_io = 0xfff00000,
|
||||||
MAPIO(osk_map_io)
|
.io_pg_offst = ((0xfef00000) >> 18) & 0xfffc,
|
||||||
INITIRQ(osk_init_irq)
|
.boot_params = 0x10000100,
|
||||||
INIT_MACHINE(osk_init)
|
.map_io = osk_map_io,
|
||||||
|
.init_irq = osk_init_irq,
|
||||||
|
.init_machine = osk_init,
|
||||||
.timer = &omap_timer,
|
.timer = &omap_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -179,11 +179,13 @@ static void __init omap_perseus2_map_io(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(OMAP_PERSEUS2, "OMAP730 Perseus2")
|
MACHINE_START(OMAP_PERSEUS2, "OMAP730 Perseus2")
|
||||||
MAINTAINER("Kevin Hilman <kjh@hilman.org>")
|
/* Maintainer: Kevin Hilman <kjh@hilman.org> */
|
||||||
BOOT_MEM(0x10000000, 0xfff00000, 0xfef00000)
|
.phys_ram = 0x10000000,
|
||||||
BOOT_PARAMS(0x10000100)
|
.phys_io = 0xfff00000,
|
||||||
MAPIO(omap_perseus2_map_io)
|
.io_pg_offst = ((0xfef00000) >> 18) & 0xfffc,
|
||||||
INITIRQ(omap_perseus2_init_irq)
|
.boot_params = 0x10000100,
|
||||||
INIT_MACHINE(omap_perseus2_init)
|
.map_io = omap_perseus2_map_io,
|
||||||
|
.init_irq = omap_perseus2_init_irq,
|
||||||
|
.init_machine = omap_perseus2_init,
|
||||||
.timer = &omap_timer,
|
.timer = &omap_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -246,11 +246,13 @@ EXPORT_SYMBOL(voiceblue_wdt_disable);
|
||||||
EXPORT_SYMBOL(voiceblue_wdt_ping);
|
EXPORT_SYMBOL(voiceblue_wdt_ping);
|
||||||
|
|
||||||
MACHINE_START(VOICEBLUE, "VoiceBlue OMAP5910")
|
MACHINE_START(VOICEBLUE, "VoiceBlue OMAP5910")
|
||||||
MAINTAINER("Ladislav Michl <michl@2n.cz>")
|
/* Maintainer: Ladislav Michl <michl@2n.cz> */
|
||||||
BOOT_MEM(0x10000000, 0xfff00000, 0xfef00000)
|
.phys_ram = 0x10000000,
|
||||||
BOOT_PARAMS(0x10000100)
|
.phys_io = 0xfff00000,
|
||||||
MAPIO(voiceblue_map_io)
|
.io_pg_offst = ((0xfef00000) >> 18) & 0xfffc,
|
||||||
INITIRQ(voiceblue_init_irq)
|
.boot_params = 0x10000100,
|
||||||
INIT_MACHINE(voiceblue_init)
|
.map_io = voiceblue_map_io,
|
||||||
.timer = &omap_timer,
|
.init_irq = voiceblue_init_irq,
|
||||||
|
.init_machine = voiceblue_init,
|
||||||
|
.timer = &omap_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -41,7 +41,9 @@
|
||||||
#include <linux/pm.h>
|
#include <linux/pm.h>
|
||||||
|
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
|
#include <asm/mach/time.h>
|
||||||
#include <asm/mach-types.h>
|
#include <asm/mach-types.h>
|
||||||
|
|
||||||
#include <asm/arch/omap16xx.h>
|
#include <asm/arch/omap16xx.h>
|
||||||
#include <asm/arch/pm.h>
|
#include <asm/arch/pm.h>
|
||||||
#include <asm/arch/mux.h>
|
#include <asm/arch/mux.h>
|
||||||
|
@ -80,13 +82,13 @@ void omap_pm_idle(void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mask32 = omap_readl(ARM_SYSST);
|
mask32 = omap_readl(ARM_SYSST);
|
||||||
local_fiq_enable();
|
|
||||||
local_irq_enable();
|
|
||||||
|
|
||||||
#if defined(CONFIG_OMAP_32K_TIMER) && defined(CONFIG_NO_IDLE_HZ)
|
/*
|
||||||
/* Override timer to use VST for the next cycle */
|
* Since an interrupt may set up a timer, we don't want to
|
||||||
omap_32k_timer_next_vst_interrupt();
|
* reprogram the hardware timer with interrupts enabled.
|
||||||
#endif
|
* Re-enable interrupts only after returning from idle.
|
||||||
|
*/
|
||||||
|
timer_dyn_reprogram();
|
||||||
|
|
||||||
if ((mask32 & DSP_IDLE) == 0) {
|
if ((mask32 & DSP_IDLE) == 0) {
|
||||||
__asm__ volatile ("mcr p15, 0, r0, c7, c0, 4");
|
__asm__ volatile ("mcr p15, 0, r0, c7, c0, 4");
|
||||||
|
@ -102,6 +104,8 @@ void omap_pm_idle(void)
|
||||||
|
|
||||||
func_ptr();
|
func_ptr();
|
||||||
}
|
}
|
||||||
|
local_fiq_enable();
|
||||||
|
local_irq_enable();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* OMAP Timers
|
* OMAP Timers
|
||||||
*
|
*
|
||||||
* Copyright (C) 2004 Nokia Corporation
|
* Copyright (C) 2004 Nokia Corporation
|
||||||
* Partial timer rewrite and additional VST timer support by
|
* Partial timer rewrite and additional dynamic tick timer support by
|
||||||
* Tony Lindgen <tony@atomide.com> and
|
* Tony Lindgen <tony@atomide.com> and
|
||||||
* Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>
|
* Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>
|
||||||
*
|
*
|
||||||
|
@ -188,8 +188,8 @@ static irqreturn_t omap_mpu_timer_interrupt(int irq, void *dev_id,
|
||||||
|
|
||||||
static struct irqaction omap_mpu_timer_irq = {
|
static struct irqaction omap_mpu_timer_irq = {
|
||||||
.name = "mpu timer",
|
.name = "mpu timer",
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
.handler = omap_mpu_timer_interrupt
|
.handler = omap_mpu_timer_interrupt,
|
||||||
};
|
};
|
||||||
|
|
||||||
static unsigned long omap_mpu_timer1_overflows;
|
static unsigned long omap_mpu_timer1_overflows;
|
||||||
|
@ -203,7 +203,7 @@ static irqreturn_t omap_mpu_timer1_interrupt(int irq, void *dev_id,
|
||||||
static struct irqaction omap_mpu_timer1_irq = {
|
static struct irqaction omap_mpu_timer1_irq = {
|
||||||
.name = "mpu timer1 overflow",
|
.name = "mpu timer1 overflow",
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT,
|
||||||
.handler = omap_mpu_timer1_interrupt
|
.handler = omap_mpu_timer1_interrupt,
|
||||||
};
|
};
|
||||||
|
|
||||||
static __init void omap_init_mpu_timer(void)
|
static __init void omap_init_mpu_timer(void)
|
||||||
|
@ -261,7 +261,6 @@ unsigned long long sched_clock(void)
|
||||||
* so with HZ = 100, TVR = 327.68.
|
* so with HZ = 100, TVR = 327.68.
|
||||||
*/
|
*/
|
||||||
#define OMAP_32K_TIMER_TICK_PERIOD ((32768 / HZ) - 1)
|
#define OMAP_32K_TIMER_TICK_PERIOD ((32768 / HZ) - 1)
|
||||||
#define MAX_SKIP_JIFFIES 25
|
|
||||||
#define TIMER_32K_SYNCHRONIZED 0xfffbc410
|
#define TIMER_32K_SYNCHRONIZED 0xfffbc410
|
||||||
|
|
||||||
#define JIFFIES_TO_HW_TICKS(nr_jiffies, clock_rate) \
|
#define JIFFIES_TO_HW_TICKS(nr_jiffies, clock_rate) \
|
||||||
|
@ -347,14 +346,55 @@ static irqreturn_t omap_32k_timer_interrupt(int irq, void *dev_id,
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_NO_IDLE_HZ
|
||||||
|
/*
|
||||||
|
* Programs the next timer interrupt needed. Called when dynamic tick is
|
||||||
|
* enabled, and to reprogram the ticks to skip from pm_idle. Note that
|
||||||
|
* we can keep the timer continuous, and don't need to set it to run in
|
||||||
|
* one-shot mode. This is because the timer will get reprogrammed again
|
||||||
|
* after next interrupt.
|
||||||
|
*/
|
||||||
|
void omap_32k_timer_reprogram(unsigned long next_tick)
|
||||||
|
{
|
||||||
|
omap_32k_timer_start(JIFFIES_TO_HW_TICKS(next_tick, 32768) + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct irqaction omap_32k_timer_irq;
|
||||||
|
extern struct timer_update_handler timer_update;
|
||||||
|
|
||||||
|
static int omap_32k_timer_enable_dyn_tick(void)
|
||||||
|
{
|
||||||
|
/* No need to reprogram timer, just use the next interrupt */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int omap_32k_timer_disable_dyn_tick(void)
|
||||||
|
{
|
||||||
|
omap_32k_timer_start(OMAP_32K_TIMER_TICK_PERIOD);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct dyn_tick_timer omap_dyn_tick_timer = {
|
||||||
|
.enable = omap_32k_timer_enable_dyn_tick,
|
||||||
|
.disable = omap_32k_timer_disable_dyn_tick,
|
||||||
|
.reprogram = omap_32k_timer_reprogram,
|
||||||
|
.handler = omap_32k_timer_interrupt,
|
||||||
|
};
|
||||||
|
#endif /* CONFIG_NO_IDLE_HZ */
|
||||||
|
|
||||||
static struct irqaction omap_32k_timer_irq = {
|
static struct irqaction omap_32k_timer_irq = {
|
||||||
.name = "32KHz timer",
|
.name = "32KHz timer",
|
||||||
.flags = SA_INTERRUPT,
|
.flags = SA_INTERRUPT | SA_TIMER,
|
||||||
.handler = omap_32k_timer_interrupt
|
.handler = omap_32k_timer_interrupt,
|
||||||
};
|
};
|
||||||
|
|
||||||
static __init void omap_init_32k_timer(void)
|
static __init void omap_init_32k_timer(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
#ifdef CONFIG_NO_IDLE_HZ
|
||||||
|
omap_timer.dyn_tick = &omap_dyn_tick_timer;
|
||||||
|
#endif
|
||||||
|
|
||||||
setup_irq(INT_OS_TIMER, &omap_32k_timer_irq);
|
setup_irq(INT_OS_TIMER, &omap_32k_timer_irq);
|
||||||
omap_timer.offset = omap_32k_timer_gettimeoffset;
|
omap_timer.offset = omap_32k_timer_gettimeoffset;
|
||||||
omap_32k_last_tick = omap_32k_sync_timer_read();
|
omap_32k_last_tick = omap_32k_sync_timer_read();
|
||||||
|
|
|
@ -41,7 +41,6 @@
|
||||||
|
|
||||||
/* These routines should handle the standard chip-specific modes
|
/* These routines should handle the standard chip-specific modes
|
||||||
* for usb0/1/2 ports, covering basic mux and transceiver setup.
|
* for usb0/1/2 ports, covering basic mux and transceiver setup.
|
||||||
* Call omap_usb_init() once, from INIT_MACHINE().
|
|
||||||
*
|
*
|
||||||
* Some board-*.c files will need to set up additional mux options,
|
* Some board-*.c files will need to set up additional mux options,
|
||||||
* like for suspend handling, vbus sensing, GPIOs, and the D+ pullup.
|
* like for suspend handling, vbus sensing, GPIOs, and the D+ pullup.
|
||||||
|
@ -288,8 +287,8 @@ static void usb_release(struct device *dev)
|
||||||
static struct resource udc_resources[] = {
|
static struct resource udc_resources[] = {
|
||||||
/* order is significant! */
|
/* order is significant! */
|
||||||
{ /* registers */
|
{ /* registers */
|
||||||
.start = IO_ADDRESS(UDC_BASE),
|
.start = UDC_BASE,
|
||||||
.end = IO_ADDRESS(UDC_BASE + 0xff),
|
.end = UDC_BASE + 0xff,
|
||||||
.flags = IORESOURCE_MEM,
|
.flags = IORESOURCE_MEM,
|
||||||
}, { /* general IRQ */
|
}, { /* general IRQ */
|
||||||
.start = IH2_BASE + 20,
|
.start = IH2_BASE + 20,
|
||||||
|
@ -355,8 +354,8 @@ static struct platform_device ohci_device = {
|
||||||
static struct resource otg_resources[] = {
|
static struct resource otg_resources[] = {
|
||||||
/* order is significant! */
|
/* order is significant! */
|
||||||
{
|
{
|
||||||
.start = IO_ADDRESS(OTG_BASE),
|
.start = OTG_BASE,
|
||||||
.end = IO_ADDRESS(OTG_BASE + 0xff),
|
.end = OTG_BASE + 0xff,
|
||||||
.flags = IORESOURCE_MEM,
|
.flags = IORESOURCE_MEM,
|
||||||
}, {
|
}, {
|
||||||
.start = IH2_BASE + 8,
|
.start = IH2_BASE + 8,
|
||||||
|
|
|
@ -24,3 +24,7 @@ obj-$(CONFIG_LEDS) += $(led-y)
|
||||||
|
|
||||||
# Misc features
|
# Misc features
|
||||||
obj-$(CONFIG_PM) += pm.o sleep.o
|
obj-$(CONFIG_PM) += pm.o sleep.o
|
||||||
|
|
||||||
|
ifeq ($(CONFIG_PXA27x),y)
|
||||||
|
obj-$(CONFIG_PM) += standby.o
|
||||||
|
endif
|
||||||
|
|
|
@ -287,34 +287,40 @@ static void __init corgi_map_io(void)
|
||||||
|
|
||||||
#ifdef CONFIG_MACH_CORGI
|
#ifdef CONFIG_MACH_CORGI
|
||||||
MACHINE_START(CORGI, "SHARP Corgi")
|
MACHINE_START(CORGI, "SHARP Corgi")
|
||||||
BOOT_MEM(0xa0000000, 0x40000000, io_p2v(0x40000000))
|
.phys_ram = 0xa0000000,
|
||||||
FIXUP(fixup_corgi)
|
.phys_io = 0x40000000,
|
||||||
MAPIO(corgi_map_io)
|
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||||
INITIRQ(corgi_init_irq)
|
.fixup = fixup_corgi,
|
||||||
.init_machine = corgi_init,
|
.map_io = corgi_map_io,
|
||||||
.timer = &pxa_timer,
|
.init_irq = corgi_init_irq,
|
||||||
|
.init_machine = corgi_init,
|
||||||
|
.timer = &pxa_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_MACH_SHEPHERD
|
#ifdef CONFIG_MACH_SHEPHERD
|
||||||
MACHINE_START(SHEPHERD, "SHARP Shepherd")
|
MACHINE_START(SHEPHERD, "SHARP Shepherd")
|
||||||
BOOT_MEM(0xa0000000, 0x40000000, io_p2v(0x40000000))
|
.phys_ram = 0xa0000000,
|
||||||
FIXUP(fixup_corgi)
|
.phys_io = 0x40000000,
|
||||||
MAPIO(corgi_map_io)
|
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||||
INITIRQ(corgi_init_irq)
|
.fixup = fixup_corgi,
|
||||||
.init_machine = corgi_init,
|
.map_io = corgi_map_io,
|
||||||
.timer = &pxa_timer,
|
.init_irq = corgi_init_irq,
|
||||||
|
.init_machine = corgi_init,
|
||||||
|
.timer = &pxa_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_MACH_HUSKY
|
#ifdef CONFIG_MACH_HUSKY
|
||||||
MACHINE_START(HUSKY, "SHARP Husky")
|
MACHINE_START(HUSKY, "SHARP Husky")
|
||||||
BOOT_MEM(0xa0000000, 0x40000000, io_p2v(0x40000000))
|
.phys_ram = 0xa0000000,
|
||||||
FIXUP(fixup_corgi)
|
.phys_io = 0x40000000,
|
||||||
MAPIO(corgi_map_io)
|
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||||
INITIRQ(corgi_init_irq)
|
.fixup = fixup_corgi,
|
||||||
.init_machine = corgi_init,
|
.map_io = corgi_map_io,
|
||||||
.timer = &pxa_timer,
|
.init_irq = corgi_init_irq,
|
||||||
|
.init_machine = corgi_init,
|
||||||
|
.timer = &pxa_timer,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -181,10 +181,12 @@ static void __init idp_map_io(void)
|
||||||
|
|
||||||
|
|
||||||
MACHINE_START(PXA_IDP, "Vibren PXA255 IDP")
|
MACHINE_START(PXA_IDP, "Vibren PXA255 IDP")
|
||||||
MAINTAINER("Vibren Technologies")
|
/* Maintainer: Vibren Technologies */
|
||||||
BOOT_MEM(0xa0000000, 0x40000000, io_p2v(0x40000000))
|
.phys_ram = 0xa0000000,
|
||||||
MAPIO(idp_map_io)
|
.phys_io = 0x40000000,
|
||||||
INITIRQ(idp_init_irq)
|
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||||
|
.map_io = idp_map_io,
|
||||||
|
.init_irq = idp_init_irq,
|
||||||
.timer = &pxa_timer,
|
.timer = &pxa_timer,
|
||||||
INIT_MACHINE(idp_init)
|
.init_machine = idp_init,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -268,10 +268,12 @@ static void __init lubbock_map_io(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(LUBBOCK, "Intel DBPXA250 Development Platform (aka Lubbock)")
|
MACHINE_START(LUBBOCK, "Intel DBPXA250 Development Platform (aka Lubbock)")
|
||||||
MAINTAINER("MontaVista Software Inc.")
|
/* Maintainer: MontaVista Software Inc. */
|
||||||
BOOT_MEM(0xa0000000, 0x40000000, io_p2v(0x40000000))
|
.phys_ram = 0xa0000000,
|
||||||
MAPIO(lubbock_map_io)
|
.phys_io = 0x40000000,
|
||||||
INITIRQ(lubbock_init_irq)
|
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||||
|
.map_io = lubbock_map_io,
|
||||||
|
.init_irq = lubbock_init_irq,
|
||||||
.timer = &pxa_timer,
|
.timer = &pxa_timer,
|
||||||
INIT_MACHINE(lubbock_init)
|
.init_machine = lubbock_init,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -345,10 +345,12 @@ static void __init mainstone_map_io(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(MAINSTONE, "Intel HCDDBBVA0 Development Platform (aka Mainstone)")
|
MACHINE_START(MAINSTONE, "Intel HCDDBBVA0 Development Platform (aka Mainstone)")
|
||||||
MAINTAINER("MontaVista Software Inc.")
|
/* Maintainer: MontaVista Software Inc. */
|
||||||
BOOT_MEM(0xa0000000, 0x40000000, io_p2v(0x40000000))
|
.phys_ram = 0xa0000000,
|
||||||
MAPIO(mainstone_map_io)
|
.phys_io = 0x40000000,
|
||||||
INITIRQ(mainstone_init_irq)
|
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||||
|
.map_io = mainstone_map_io,
|
||||||
|
.init_irq = mainstone_init_irq,
|
||||||
.timer = &pxa_timer,
|
.timer = &pxa_timer,
|
||||||
INIT_MACHINE(mainstone_init)
|
.init_machine = mainstone_init,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -180,10 +180,12 @@ static void __init poodle_map_io(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
MACHINE_START(POODLE, "SHARP Poodle")
|
MACHINE_START(POODLE, "SHARP Poodle")
|
||||||
BOOT_MEM(0xa0000000, 0x40000000, io_p2v(0x40000000))
|
.phys_ram = 0xa0000000,
|
||||||
FIXUP(fixup_poodle)
|
.phys_io = 0x40000000,
|
||||||
MAPIO(poodle_map_io)
|
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||||
INITIRQ(pxa_init_irq)
|
.fixup = fixup_poodle,
|
||||||
.timer = &pxa_timer,
|
.map_io = poodle_map_io,
|
||||||
.init_machine = poodle_init,
|
.init_irq = pxa_init_irq,
|
||||||
|
.timer = &pxa_timer,
|
||||||
|
.init_machine = poodle_init,
|
||||||
MACHINE_END
|
MACHINE_END
|
||||||
|
|
|
@ -126,6 +126,7 @@ int pxa_cpu_pm_prepare(suspend_state_t state)
|
||||||
{
|
{
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case PM_SUSPEND_MEM:
|
case PM_SUSPEND_MEM:
|
||||||
|
case PM_SUSPEND_STANDBY:
|
||||||
return 0;
|
return 0;
|
||||||
default:
|
default:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -138,7 +139,10 @@ void pxa_cpu_pm_enter(suspend_state_t state)
|
||||||
extern void pxa_cpu_suspend(unsigned int);
|
extern void pxa_cpu_suspend(unsigned int);
|
||||||
extern void pxa_cpu_resume(void);
|
extern void pxa_cpu_resume(void);
|
||||||
|
|
||||||
CKEN = CKEN22_MEMC | CKEN9_OSTIMER;
|
if (state == PM_SUSPEND_STANDBY)
|
||||||
|
CKEN = CKEN22_MEMC | CKEN9_OSTIMER | CKEN16_LCD |CKEN0_PWM0;
|
||||||
|
else
|
||||||
|
CKEN = CKEN22_MEMC | CKEN9_OSTIMER;
|
||||||
|
|
||||||
/* ensure voltage-change sequencer not initiated, which hangs */
|
/* ensure voltage-change sequencer not initiated, which hangs */
|
||||||
PCFR &= ~PCFR_FVC;
|
PCFR &= ~PCFR_FVC;
|
||||||
|
@ -147,6 +151,9 @@ void pxa_cpu_pm_enter(suspend_state_t state)
|
||||||
PEDR = 0xDF12FE1B;
|
PEDR = 0xDF12FE1B;
|
||||||
|
|
||||||
switch (state) {
|
switch (state) {
|
||||||
|
case PM_SUSPEND_STANDBY:
|
||||||
|
pxa_cpu_standby();
|
||||||
|
break;
|
||||||
case PM_SUSPEND_MEM:
|
case PM_SUSPEND_MEM:
|
||||||
/* set resume return address */
|
/* set resume return address */
|
||||||
PSPR = virt_to_phys(pxa_cpu_resume);
|
PSPR = virt_to_phys(pxa_cpu_resume);
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue