Merge branch 'master' of /pub/scm/linux/kernel/git/torvalds/linux-2.6
This commit is contained in:
commit
e9f20d6f03
|
@ -119,7 +119,7 @@ X!Ilib/string.c
|
|||
!Elib/string.c
|
||||
</sect1>
|
||||
<sect1><title>Bit Operations</title>
|
||||
!Iinclude/asm-x86/bitops_32.h
|
||||
!Iinclude/asm-x86/bitops.h
|
||||
</sect1>
|
||||
</chapter>
|
||||
|
||||
|
@ -645,4 +645,58 @@ X!Idrivers/video/console/fonts.c
|
|||
!Edrivers/i2c/i2c-core.c
|
||||
</chapter>
|
||||
|
||||
<chapter id="clk">
|
||||
<title>Clock Framework</title>
|
||||
|
||||
<para>
|
||||
The clock framework defines programming interfaces to support
|
||||
software management of the system clock tree.
|
||||
This framework is widely used with System-On-Chip (SOC) platforms
|
||||
to support power management and various devices which may need
|
||||
custom clock rates.
|
||||
Note that these "clocks" don't relate to timekeeping or real
|
||||
time clocks (RTCs), each of which have separate frameworks.
|
||||
These <structname>struct clk</structname> instances may be used
|
||||
to manage for example a 96 MHz signal that is used to shift bits
|
||||
into and out of peripherals or busses, or otherwise trigger
|
||||
synchronous state machine transitions in system hardware.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Power management is supported by explicit software clock gating:
|
||||
unused clocks are disabled, so the system doesn't waste power
|
||||
changing the state of transistors that aren't in active use.
|
||||
On some systems this may be backed by hardware clock gating,
|
||||
where clocks are gated without being disabled in software.
|
||||
Sections of chips that are powered but not clocked may be able
|
||||
to retain their last state.
|
||||
This low power state is often called a <emphasis>retention
|
||||
mode</emphasis>.
|
||||
This mode still incurs leakage currents, especially with finer
|
||||
circuit geometries, but for CMOS circuits power is mostly used
|
||||
by clocked state changes.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Power-aware drivers only enable their clocks when the device
|
||||
they manage is in active use. Also, system sleep states often
|
||||
differ according to which clock domains are active: while a
|
||||
"standby" state may allow wakeup from several active domains, a
|
||||
"mem" (suspend-to-RAM) state may require a more wholesale shutdown
|
||||
of clocks derived from higher speed PLLs and oscillators, limiting
|
||||
the number of possible wakeup event sources. A driver's suspend
|
||||
method may need to be aware of system-specific clock constraints
|
||||
on the target sleep state.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Some platforms support programmable clock generators. These
|
||||
can be used by external chips of various kinds, such as other
|
||||
CPUs, multimedia codecs, and devices with strict requirements
|
||||
for interface clocking.
|
||||
</para>
|
||||
|
||||
!Iinclude/linux/clk.h
|
||||
</chapter>
|
||||
|
||||
</book>
|
||||
|
|
|
@ -0,0 +1,52 @@
|
|||
[This file is cloned from VesaFB/aty128fb]
|
||||
|
||||
What is gxfb?
|
||||
=================
|
||||
|
||||
This is a graphics framebuffer driver for AMD Geode GX2 based processors.
|
||||
|
||||
Advantages:
|
||||
|
||||
* No need to use AMD's VSA code (or other VESA emulation layer) in the
|
||||
BIOS.
|
||||
* It provides a nice large console (128 cols + 48 lines with 1024x768)
|
||||
without using tiny, unreadable fonts.
|
||||
* You can run XF68_FBDev on top of /dev/fb0
|
||||
* Most important: boot logo :-)
|
||||
|
||||
Disadvantages:
|
||||
|
||||
* graphic mode is slower than text mode...
|
||||
|
||||
|
||||
How to use it?
|
||||
==============
|
||||
|
||||
Switching modes is done using gxfb.mode_option=<resolution>... boot
|
||||
parameter or using `fbset' program.
|
||||
|
||||
See Documentation/fb/modedb.txt for more information on modedb
|
||||
resolutions.
|
||||
|
||||
|
||||
X11
|
||||
===
|
||||
|
||||
XF68_FBDev should generally work fine, but it is non-accelerated.
|
||||
|
||||
|
||||
Configuration
|
||||
=============
|
||||
|
||||
You can pass kernel command line options to gxfb with gxfb.<option>.
|
||||
For example, gxfb.mode_option=800x600@75.
|
||||
Accepted options:
|
||||
|
||||
mode_option - specify the video mode. Of the form
|
||||
<x>x<y>[-<bpp>][@<refresh>]
|
||||
vram - size of video ram (normally auto-detected)
|
||||
vt_switch - enable vt switching during suspend/resume. The vt
|
||||
switch is slow, but harmless.
|
||||
|
||||
--
|
||||
Andres Salomon <dilinger@debian.org>
|
|
@ -14,6 +14,8 @@ graphics devices. These would include:
|
|||
Intel 915GM
|
||||
Intel 945G
|
||||
Intel 945GM
|
||||
Intel 965G
|
||||
Intel 965GM
|
||||
|
||||
B. List of available options
|
||||
|
||||
|
|
|
@ -0,0 +1,52 @@
|
|||
[This file is cloned from VesaFB/aty128fb]
|
||||
|
||||
What is lxfb?
|
||||
=================
|
||||
|
||||
This is a graphics framebuffer driver for AMD Geode LX based processors.
|
||||
|
||||
Advantages:
|
||||
|
||||
* No need to use AMD's VSA code (or other VESA emulation layer) in the
|
||||
BIOS.
|
||||
* It provides a nice large console (128 cols + 48 lines with 1024x768)
|
||||
without using tiny, unreadable fonts.
|
||||
* You can run XF68_FBDev on top of /dev/fb0
|
||||
* Most important: boot logo :-)
|
||||
|
||||
Disadvantages:
|
||||
|
||||
* graphic mode is slower than text mode...
|
||||
|
||||
|
||||
How to use it?
|
||||
==============
|
||||
|
||||
Switching modes is done using lxfb.mode_option=<resolution>... boot
|
||||
parameter or using `fbset' program.
|
||||
|
||||
See Documentation/fb/modedb.txt for more information on modedb
|
||||
resolutions.
|
||||
|
||||
|
||||
X11
|
||||
===
|
||||
|
||||
XF68_FBDev should generally work fine, but it is non-accelerated.
|
||||
|
||||
|
||||
Configuration
|
||||
=============
|
||||
|
||||
You can pass kernel command line options to lxfb with lxfb.<option>.
|
||||
For example, lxfb.mode_option=800x600@75.
|
||||
Accepted options:
|
||||
|
||||
mode_option - specify the video mode. Of the form
|
||||
<x>x<y>[-<bpp>][@<refresh>]
|
||||
vram - size of video ram (normally auto-detected)
|
||||
vt_switch - enable vt switching during suspend/resume. The vt
|
||||
switch is slow, but harmless.
|
||||
|
||||
--
|
||||
Andres Salomon <dilinger@debian.org>
|
|
@ -1,7 +1,7 @@
|
|||
Metronomefb
|
||||
-----------
|
||||
Maintained by Jaya Kumar <jayakumar.lkml.gmail.com>
|
||||
Last revised: Nov 20, 2007
|
||||
Last revised: Mar 10, 2008
|
||||
|
||||
Metronomefb is a driver for the Metronome display controller. The controller
|
||||
is from E-Ink Corporation. It is intended to be used to drive the E-Ink
|
||||
|
@ -11,20 +11,18 @@ display media here http://www.e-ink.com/products/matrix/metronome.html .
|
|||
Metronome is interfaced to the host CPU through the AMLCD interface. The
|
||||
host CPU generates the control information and the image in a framebuffer
|
||||
which is then delivered to the AMLCD interface by a host specific method.
|
||||
Currently, that's implemented for the PXA's LCDC controller. The display and
|
||||
error status are each pulled through individual GPIOs.
|
||||
The display and error status are each pulled through individual GPIOs.
|
||||
|
||||
Metronomefb was written for the PXA255/gumstix/lyre combination and
|
||||
therefore currently has board set specific code in it. If other boards based on
|
||||
other architectures are available, then the host specific code can be separated
|
||||
and abstracted out.
|
||||
Metronomefb is platform independent and depends on a board specific driver
|
||||
to do all physical IO work. Currently, an example is implemented for the
|
||||
PXA board used in the AM-200 EPD devkit. This example is am200epd.c
|
||||
|
||||
Metronomefb requires waveform information which is delivered via the AMLCD
|
||||
interface to the metronome controller. The waveform information is expected to
|
||||
be delivered from userspace via the firmware class interface. The waveform file
|
||||
can be compressed as long as your udev or hotplug script is aware of the need
|
||||
to uncompress it before delivering it. metronomefb will ask for waveform.wbf
|
||||
which would typically go into /lib/firmware/waveform.wbf depending on your
|
||||
to uncompress it before delivering it. metronomefb will ask for metronome.wbf
|
||||
which would typically go into /lib/firmware/metronome.wbf depending on your
|
||||
udev/hotplug setup. I have only tested with a single waveform file which was
|
||||
originally labeled 23P01201_60_WT0107_MTC. I do not know what it stands for.
|
||||
Caution should be exercised when manipulating the waveform as there may be
|
||||
|
|
|
@ -125,8 +125,12 @@ There may be more modes.
|
|||
amifb - Amiga chipset frame buffer
|
||||
aty128fb - ATI Rage128 / Pro frame buffer
|
||||
atyfb - ATI Mach64 frame buffer
|
||||
pm2fb - Permedia 2/2V frame buffer
|
||||
pm3fb - Permedia 3 frame buffer
|
||||
sstfb - Voodoo 1/2 (SST1) chipset frame buffer
|
||||
tdfxfb - 3D Fx frame buffer
|
||||
tridentfb - Trident (Cyber)blade chipset frame buffer
|
||||
vt8623fb - VIA 8623 frame buffer
|
||||
|
||||
BTW, only a few drivers use this at the moment. Others are to follow
|
||||
(feel free to send patches).
|
||||
|
|
|
@ -128,15 +128,6 @@ Who: Arjan van de Ven <arjan@linux.intel.com>
|
|||
|
||||
---------------------------
|
||||
|
||||
What: vm_ops.nopage
|
||||
When: Soon, provided in-kernel callers have been converted
|
||||
Why: This interface is replaced by vm_ops.fault, but it has been around
|
||||
forever, is used by a lot of drivers, and doesn't cost much to
|
||||
maintain.
|
||||
Who: Nick Piggin <npiggin@suse.de>
|
||||
|
||||
---------------------------
|
||||
|
||||
What: PHYSDEVPATH, PHYSDEVBUS, PHYSDEVDRIVER in the uevent environment
|
||||
When: October 2008
|
||||
Why: The stacking of class devices makes these values misleading and
|
||||
|
|
|
@ -511,7 +511,6 @@ prototypes:
|
|||
void (*open)(struct vm_area_struct*);
|
||||
void (*close)(struct vm_area_struct*);
|
||||
int (*fault)(struct vm_area_struct*, struct vm_fault *);
|
||||
struct page *(*nopage)(struct vm_area_struct*, unsigned long, int *);
|
||||
int (*page_mkwrite)(struct vm_area_struct *, struct page *);
|
||||
|
||||
locking rules:
|
||||
|
@ -519,7 +518,6 @@ locking rules:
|
|||
open: no yes
|
||||
close: no yes
|
||||
fault: no yes
|
||||
nopage: no yes
|
||||
page_mkwrite: no yes no
|
||||
|
||||
->page_mkwrite() is called when a previously read-only page is
|
||||
|
@ -537,4 +535,3 @@ NULL.
|
|||
|
||||
ipc/shm.c::shm_delete() - may need BKL.
|
||||
->read() and ->write() in many drivers are (probably) missing BKL.
|
||||
drivers/sgi/char/graphics.c::sgi_graphics_nopage() - may need BKL.
|
||||
|
|
|
@ -92,6 +92,18 @@ NodeList format is a comma-separated list of decimal numbers and ranges,
|
|||
a range being two hyphen-separated decimal numbers, the smallest and
|
||||
largest node numbers in the range. For example, mpol=bind:0-3,5,7,9-15
|
||||
|
||||
NUMA memory allocation policies have optional flags that can be used in
|
||||
conjunction with their modes. These optional flags can be specified
|
||||
when tmpfs is mounted by appending them to the mode before the NodeList.
|
||||
See Documentation/vm/numa_memory_policy.txt for a list of all available
|
||||
memory allocation policy mode flags.
|
||||
|
||||
=static is equivalent to MPOL_F_STATIC_NODES
|
||||
=relative is equivalent to MPOL_F_RELATIVE_NODES
|
||||
|
||||
For example, mpol=bind=static:NodeList, is the equivalent of an
|
||||
allocation policy of MPOL_BIND | MPOL_F_STATIC_NODES.
|
||||
|
||||
Note that trying to mount a tmpfs with an mpol option will fail if the
|
||||
running kernel does not support NUMA; and will fail if its nodelist
|
||||
specifies a node which is not online. If your system relies on that
|
||||
|
|
|
@ -17,6 +17,21 @@ dmask=### -- The permission mask for the directory.
|
|||
fmask=### -- The permission mask for files.
|
||||
The default is the umask of current process.
|
||||
|
||||
allow_utime=### -- This option controls the permission check of mtime/atime.
|
||||
|
||||
20 - If current process is in group of file's group ID,
|
||||
you can change timestamp.
|
||||
2 - Other users can change timestamp.
|
||||
|
||||
The default is set from `dmask' option. (If the directory is
|
||||
writable, utime(2) is also allowed. I.e. ~dmask & 022)
|
||||
|
||||
Normally utime(2) checks current process is owner of
|
||||
the file, or it has CAP_FOWNER capability. But FAT
|
||||
filesystem doesn't have uid/gid on disk, so normal
|
||||
check is too unflexible. With this option you can
|
||||
relax it.
|
||||
|
||||
codepage=### -- Sets the codepage number for converting to shortname
|
||||
characters on FAT filesystem.
|
||||
By default, FAT_DEFAULT_CODEPAGE setting is used.
|
||||
|
|
|
@ -107,6 +107,16 @@ type of GPIO controller, and on one particular board 80-95 with an FPGA.
|
|||
The numbers need not be contiguous; either of those platforms could also
|
||||
use numbers 2000-2063 to identify GPIOs in a bank of I2C GPIO expanders.
|
||||
|
||||
If you want to initialize a structure with an invalid GPIO number, use
|
||||
some negative number (perhaps "-EINVAL"); that will never be valid. To
|
||||
test if a number could reference a GPIO, you may use this predicate:
|
||||
|
||||
int gpio_is_valid(int number);
|
||||
|
||||
A number that's not valid will be rejected by calls which may request
|
||||
or free GPIOs (see below). Other numbers may also be rejected; for
|
||||
example, a number might be valid but unused on a given board.
|
||||
|
||||
Whether a platform supports multiple GPIO controllers is currently a
|
||||
platform-specific implementation issue.
|
||||
|
||||
|
|
|
@ -37,6 +37,11 @@ registration function such as register_kprobe() specifies where
|
|||
the probe is to be inserted and what handler is to be called when
|
||||
the probe is hit.
|
||||
|
||||
There are also register_/unregister_*probes() functions for batch
|
||||
registration/unregistration of a group of *probes. These functions
|
||||
can speed up unregistration process when you have to unregister
|
||||
a lot of probes at once.
|
||||
|
||||
The next three subsections explain how the different types of
|
||||
probes work. They explain certain things that you'll need to
|
||||
know in order to make the best use of Kprobes -- e.g., the
|
||||
|
@ -190,10 +195,11 @@ code mapping.
|
|||
4. API Reference
|
||||
|
||||
The Kprobes API includes a "register" function and an "unregister"
|
||||
function for each type of probe. Here are terse, mini-man-page
|
||||
specifications for these functions and the associated probe handlers
|
||||
that you'll write. See the files in the samples/kprobes/ sub-directory
|
||||
for examples.
|
||||
function for each type of probe. The API also includes "register_*probes"
|
||||
and "unregister_*probes" functions for (un)registering arrays of probes.
|
||||
Here are terse, mini-man-page specifications for these functions and
|
||||
the associated probe handlers that you'll write. See the files in the
|
||||
samples/kprobes/ sub-directory for examples.
|
||||
|
||||
4.1 register_kprobe
|
||||
|
||||
|
@ -319,6 +325,43 @@ void unregister_kretprobe(struct kretprobe *rp);
|
|||
Removes the specified probe. The unregister function can be called
|
||||
at any time after the probe has been registered.
|
||||
|
||||
NOTE:
|
||||
If the functions find an incorrect probe (ex. an unregistered probe),
|
||||
they clear the addr field of the probe.
|
||||
|
||||
4.5 register_*probes
|
||||
|
||||
#include <linux/kprobes.h>
|
||||
int register_kprobes(struct kprobe **kps, int num);
|
||||
int register_kretprobes(struct kretprobe **rps, int num);
|
||||
int register_jprobes(struct jprobe **jps, int num);
|
||||
|
||||
Registers each of the num probes in the specified array. If any
|
||||
error occurs during registration, all probes in the array, up to
|
||||
the bad probe, are safely unregistered before the register_*probes
|
||||
function returns.
|
||||
- kps/rps/jps: an array of pointers to *probe data structures
|
||||
- num: the number of the array entries.
|
||||
|
||||
NOTE:
|
||||
You have to allocate(or define) an array of pointers and set all
|
||||
of the array entries before using these functions.
|
||||
|
||||
4.6 unregister_*probes
|
||||
|
||||
#include <linux/kprobes.h>
|
||||
void unregister_kprobes(struct kprobe **kps, int num);
|
||||
void unregister_kretprobes(struct kretprobe **rps, int num);
|
||||
void unregister_jprobes(struct jprobe **jps, int num);
|
||||
|
||||
Removes each of the num probes in the specified array at once.
|
||||
|
||||
NOTE:
|
||||
If the functions find some incorrect probes (ex. unregistered
|
||||
probes) in the specified array, they clear the addr field of those
|
||||
incorrect probes. However, other probes in the array are
|
||||
unregistered correctly.
|
||||
|
||||
5. Kprobes Features and Limitations
|
||||
|
||||
Kprobes allows multiple probes at the same address. Currently,
|
||||
|
|
|
@ -450,3 +450,9 @@ These currently include
|
|||
there are upper and lower limits (32768, 16). Default is 128.
|
||||
strip_cache_active (currently raid5 only)
|
||||
number of active entries in the stripe cache
|
||||
preread_bypass_threshold (currently raid5 only)
|
||||
number of times a stripe requiring preread will be bypassed by
|
||||
a stripe that does not require preread. For fairness defaults
|
||||
to 1. Setting this to 0 disables bypass accounting and
|
||||
requires preread stripes to wait until all full-width stripe-
|
||||
writes are complete. Valid values are 0 to stripe_cache_size.
|
||||
|
|
|
@ -2836,6 +2836,39 @@ platforms are moved over to use the flattened-device-tree model.
|
|||
big-endian;
|
||||
};
|
||||
|
||||
r) Freescale Display Interface Unit
|
||||
|
||||
The Freescale DIU is a LCD controller, with proper hardware, it can also
|
||||
drive DVI monitors.
|
||||
|
||||
Required properties:
|
||||
- compatible : should be "fsl-diu".
|
||||
- reg : should contain at least address and length of the DIU register
|
||||
set.
|
||||
- Interrupts : one DIU interrupt should be describe here.
|
||||
|
||||
Example (MPC8610HPCD)
|
||||
display@2c000 {
|
||||
compatible = "fsl,diu";
|
||||
reg = <0x2c000 100>;
|
||||
interrupts = <72 2>;
|
||||
interrupt-parent = <&mpic>;
|
||||
};
|
||||
|
||||
s) Freescale on board FPGA
|
||||
|
||||
This is the memory-mapped registers for on board FPGA.
|
||||
|
||||
Required properities:
|
||||
- compatible : should be "fsl,fpga-pixis".
|
||||
- reg : should contain the address and the lenght of the FPPGA register
|
||||
set.
|
||||
|
||||
Example (MPC8610HPCD)
|
||||
board-control@e8000000 {
|
||||
compatible = "fsl,fpga-pixis";
|
||||
reg = <0xe8000000 32>;
|
||||
};
|
||||
|
||||
VII - Marvell Discovery mv64[345]6x System Controller chips
|
||||
===========================================================
|
||||
|
|
|
@ -126,8 +126,8 @@ NOTES:
|
|||
FULL DUPLEX CHARACTER DEVICE API
|
||||
================================
|
||||
|
||||
See the sample program below for one example showing the use of the full
|
||||
duplex programming interface. (Although it doesn't perform a full duplex
|
||||
See the spidev_fdx.c sample program for one example showing the use of the
|
||||
full duplex programming interface. (Although it doesn't perform a full duplex
|
||||
transfer.) The model is the same as that used in the kernel spi_sync()
|
||||
request; the individual transfers offer the same capabilities as are
|
||||
available to kernel drivers (except that it's not asynchronous).
|
||||
|
@ -141,167 +141,3 @@ and bitrate for each transfer segment.)
|
|||
|
||||
To make a full duplex request, provide both rx_buf and tx_buf for the
|
||||
same transfer. It's even OK if those are the same buffer.
|
||||
|
||||
|
||||
SAMPLE PROGRAM
|
||||
==============
|
||||
|
||||
-------------------------------- CUT HERE
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <fcntl.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/spi/spidev.h>
|
||||
|
||||
|
||||
static int verbose;
|
||||
|
||||
static void do_read(int fd, int len)
|
||||
{
|
||||
unsigned char buf[32], *bp;
|
||||
int status;
|
||||
|
||||
/* read at least 2 bytes, no more than 32 */
|
||||
if (len < 2)
|
||||
len = 2;
|
||||
else if (len > sizeof(buf))
|
||||
len = sizeof(buf);
|
||||
memset(buf, 0, sizeof buf);
|
||||
|
||||
status = read(fd, buf, len);
|
||||
if (status < 0) {
|
||||
perror("read");
|
||||
return;
|
||||
}
|
||||
if (status != len) {
|
||||
fprintf(stderr, "short read\n");
|
||||
return;
|
||||
}
|
||||
|
||||
printf("read(%2d, %2d): %02x %02x,", len, status,
|
||||
buf[0], buf[1]);
|
||||
status -= 2;
|
||||
bp = buf + 2;
|
||||
while (status-- > 0)
|
||||
printf(" %02x", *bp++);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
static void do_msg(int fd, int len)
|
||||
{
|
||||
struct spi_ioc_transfer xfer[2];
|
||||
unsigned char buf[32], *bp;
|
||||
int status;
|
||||
|
||||
memset(xfer, 0, sizeof xfer);
|
||||
memset(buf, 0, sizeof buf);
|
||||
|
||||
if (len > sizeof buf)
|
||||
len = sizeof buf;
|
||||
|
||||
buf[0] = 0xaa;
|
||||
xfer[0].tx_buf = (__u64) buf;
|
||||
xfer[0].len = 1;
|
||||
|
||||
xfer[1].rx_buf = (__u64) buf;
|
||||
xfer[1].len = len;
|
||||
|
||||
status = ioctl(fd, SPI_IOC_MESSAGE(2), xfer);
|
||||
if (status < 0) {
|
||||
perror("SPI_IOC_MESSAGE");
|
||||
return;
|
||||
}
|
||||
|
||||
printf("response(%2d, %2d): ", len, status);
|
||||
for (bp = buf; len; len--)
|
||||
printf(" %02x", *bp++);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
static void dumpstat(const char *name, int fd)
|
||||
{
|
||||
__u8 mode, lsb, bits;
|
||||
__u32 speed;
|
||||
|
||||
if (ioctl(fd, SPI_IOC_RD_MODE, &mode) < 0) {
|
||||
perror("SPI rd_mode");
|
||||
return;
|
||||
}
|
||||
if (ioctl(fd, SPI_IOC_RD_LSB_FIRST, &lsb) < 0) {
|
||||
perror("SPI rd_lsb_fist");
|
||||
return;
|
||||
}
|
||||
if (ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits) < 0) {
|
||||
perror("SPI bits_per_word");
|
||||
return;
|
||||
}
|
||||
if (ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed) < 0) {
|
||||
perror("SPI max_speed_hz");
|
||||
return;
|
||||
}
|
||||
|
||||
printf("%s: spi mode %d, %d bits %sper word, %d Hz max\n",
|
||||
name, mode, bits, lsb ? "(lsb first) " : "", speed);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int c;
|
||||
int readcount = 0;
|
||||
int msglen = 0;
|
||||
int fd;
|
||||
const char *name;
|
||||
|
||||
while ((c = getopt(argc, argv, "hm:r:v")) != EOF) {
|
||||
switch (c) {
|
||||
case 'm':
|
||||
msglen = atoi(optarg);
|
||||
if (msglen < 0)
|
||||
goto usage;
|
||||
continue;
|
||||
case 'r':
|
||||
readcount = atoi(optarg);
|
||||
if (readcount < 0)
|
||||
goto usage;
|
||||
continue;
|
||||
case 'v':
|
||||
verbose++;
|
||||
continue;
|
||||
case 'h':
|
||||
case '?':
|
||||
usage:
|
||||
fprintf(stderr,
|
||||
"usage: %s [-h] [-m N] [-r N] /dev/spidevB.D\n",
|
||||
argv[0]);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
if ((optind + 1) != argc)
|
||||
goto usage;
|
||||
name = argv[optind];
|
||||
|
||||
fd = open(name, O_RDWR);
|
||||
if (fd < 0) {
|
||||
perror("open");
|
||||
return 1;
|
||||
}
|
||||
|
||||
dumpstat(name, fd);
|
||||
|
||||
if (msglen)
|
||||
do_msg(fd, msglen);
|
||||
|
||||
if (readcount)
|
||||
do_read(fd, readcount);
|
||||
|
||||
close(fd);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,158 @@
|
|||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <fcntl.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/spi/spidev.h>
|
||||
|
||||
|
||||
static int verbose;
|
||||
|
||||
static void do_read(int fd, int len)
|
||||
{
|
||||
unsigned char buf[32], *bp;
|
||||
int status;
|
||||
|
||||
/* read at least 2 bytes, no more than 32 */
|
||||
if (len < 2)
|
||||
len = 2;
|
||||
else if (len > sizeof(buf))
|
||||
len = sizeof(buf);
|
||||
memset(buf, 0, sizeof buf);
|
||||
|
||||
status = read(fd, buf, len);
|
||||
if (status < 0) {
|
||||
perror("read");
|
||||
return;
|
||||
}
|
||||
if (status != len) {
|
||||
fprintf(stderr, "short read\n");
|
||||
return;
|
||||
}
|
||||
|
||||
printf("read(%2d, %2d): %02x %02x,", len, status,
|
||||
buf[0], buf[1]);
|
||||
status -= 2;
|
||||
bp = buf + 2;
|
||||
while (status-- > 0)
|
||||
printf(" %02x", *bp++);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
static void do_msg(int fd, int len)
|
||||
{
|
||||
struct spi_ioc_transfer xfer[2];
|
||||
unsigned char buf[32], *bp;
|
||||
int status;
|
||||
|
||||
memset(xfer, 0, sizeof xfer);
|
||||
memset(buf, 0, sizeof buf);
|
||||
|
||||
if (len > sizeof buf)
|
||||
len = sizeof buf;
|
||||
|
||||
buf[0] = 0xaa;
|
||||
xfer[0].tx_buf = (__u64) buf;
|
||||
xfer[0].len = 1;
|
||||
|
||||
xfer[1].rx_buf = (__u64) buf;
|
||||
xfer[1].len = len;
|
||||
|
||||
status = ioctl(fd, SPI_IOC_MESSAGE(2), xfer);
|
||||
if (status < 0) {
|
||||
perror("SPI_IOC_MESSAGE");
|
||||
return;
|
||||
}
|
||||
|
||||
printf("response(%2d, %2d): ", len, status);
|
||||
for (bp = buf; len; len--)
|
||||
printf(" %02x", *bp++);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
static void dumpstat(const char *name, int fd)
|
||||
{
|
||||
__u8 mode, lsb, bits;
|
||||
__u32 speed;
|
||||
|
||||
if (ioctl(fd, SPI_IOC_RD_MODE, &mode) < 0) {
|
||||
perror("SPI rd_mode");
|
||||
return;
|
||||
}
|
||||
if (ioctl(fd, SPI_IOC_RD_LSB_FIRST, &lsb) < 0) {
|
||||
perror("SPI rd_lsb_fist");
|
||||
return;
|
||||
}
|
||||
if (ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits) < 0) {
|
||||
perror("SPI bits_per_word");
|
||||
return;
|
||||
}
|
||||
if (ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed) < 0) {
|
||||
perror("SPI max_speed_hz");
|
||||
return;
|
||||
}
|
||||
|
||||
printf("%s: spi mode %d, %d bits %sper word, %d Hz max\n",
|
||||
name, mode, bits, lsb ? "(lsb first) " : "", speed);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int c;
|
||||
int readcount = 0;
|
||||
int msglen = 0;
|
||||
int fd;
|
||||
const char *name;
|
||||
|
||||
while ((c = getopt(argc, argv, "hm:r:v")) != EOF) {
|
||||
switch (c) {
|
||||
case 'm':
|
||||
msglen = atoi(optarg);
|
||||
if (msglen < 0)
|
||||
goto usage;
|
||||
continue;
|
||||
case 'r':
|
||||
readcount = atoi(optarg);
|
||||
if (readcount < 0)
|
||||
goto usage;
|
||||
continue;
|
||||
case 'v':
|
||||
verbose++;
|
||||
continue;
|
||||
case 'h':
|
||||
case '?':
|
||||
usage:
|
||||
fprintf(stderr,
|
||||
"usage: %s [-h] [-m N] [-r N] /dev/spidevB.D\n",
|
||||
argv[0]);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
if ((optind + 1) != argc)
|
||||
goto usage;
|
||||
name = argv[optind];
|
||||
|
||||
fd = open(name, O_RDWR);
|
||||
if (fd < 0) {
|
||||
perror("open");
|
||||
return 1;
|
||||
}
|
||||
|
||||
dumpstat(name, fd);
|
||||
|
||||
if (msglen)
|
||||
do_msg(fd, msglen);
|
||||
|
||||
if (readcount)
|
||||
do_read(fd, readcount);
|
||||
|
||||
close(fd);
|
||||
return 0;
|
||||
}
|
|
@ -135,77 +135,58 @@ most general to most specific:
|
|||
|
||||
Components of Memory Policies
|
||||
|
||||
A Linux memory policy is a tuple consisting of a "mode" and an optional set
|
||||
of nodes. The mode determine the behavior of the policy, while the
|
||||
optional set of nodes can be viewed as the arguments to the behavior.
|
||||
A Linux memory policy consists of a "mode", optional mode flags, and an
|
||||
optional set of nodes. The mode determines the behavior of the policy,
|
||||
the optional mode flags determine the behavior of the mode, and the
|
||||
optional set of nodes can be viewed as the arguments to the policy
|
||||
behavior.
|
||||
|
||||
Internally, memory policies are implemented by a reference counted
|
||||
structure, struct mempolicy. Details of this structure will be discussed
|
||||
in context, below, as required to explain the behavior.
|
||||
|
||||
Note: in some functions AND in the struct mempolicy itself, the mode
|
||||
is called "policy". However, to avoid confusion with the policy tuple,
|
||||
this document will continue to use the term "mode".
|
||||
|
||||
Linux memory policy supports the following 4 behavioral modes:
|
||||
|
||||
Default Mode--MPOL_DEFAULT: The behavior specified by this mode is
|
||||
context or scope dependent.
|
||||
Default Mode--MPOL_DEFAULT: This mode is only used in the memory
|
||||
policy APIs. Internally, MPOL_DEFAULT is converted to the NULL
|
||||
memory policy in all policy scopes. Any existing non-default policy
|
||||
will simply be removed when MPOL_DEFAULT is specified. As a result,
|
||||
MPOL_DEFAULT means "fall back to the next most specific policy scope."
|
||||
|
||||
As mentioned in the Policy Scope section above, during normal
|
||||
system operation, the System Default Policy is hard coded to
|
||||
contain the Default mode.
|
||||
For example, a NULL or default task policy will fall back to the
|
||||
system default policy. A NULL or default vma policy will fall
|
||||
back to the task policy.
|
||||
|
||||
In this context, default mode means "local" allocation--that is
|
||||
attempt to allocate the page from the node associated with the cpu
|
||||
where the fault occurs. If the "local" node has no memory, or the
|
||||
node's memory can be exhausted [no free pages available], local
|
||||
allocation will "fallback to"--attempt to allocate pages from--
|
||||
"nearby" nodes, in order of increasing "distance".
|
||||
When specified in one of the memory policy APIs, the Default mode
|
||||
does not use the optional set of nodes.
|
||||
|
||||
Implementation detail -- subject to change: "Fallback" uses
|
||||
a per node list of sibling nodes--called zonelists--built at
|
||||
boot time, or when nodes or memory are added or removed from
|
||||
the system [memory hotplug]. These per node zonelist are
|
||||
constructed with nodes in order of increasing distance based
|
||||
on information provided by the platform firmware.
|
||||
|
||||
When a task/process policy or a shared policy contains the Default
|
||||
mode, this also means "local allocation", as described above.
|
||||
|
||||
In the context of a VMA, Default mode means "fall back to task
|
||||
policy"--which may or may not specify Default mode. Thus, Default
|
||||
mode can not be counted on to mean local allocation when used
|
||||
on a non-shared region of the address space. However, see
|
||||
MPOL_PREFERRED below.
|
||||
|
||||
The Default mode does not use the optional set of nodes.
|
||||
It is an error for the set of nodes specified for this policy to
|
||||
be non-empty.
|
||||
|
||||
MPOL_BIND: This mode specifies that memory must come from the
|
||||
set of nodes specified by the policy.
|
||||
|
||||
The memory policy APIs do not specify an order in which the nodes
|
||||
will be searched. However, unlike "local allocation", the Bind
|
||||
policy does not consider the distance between the nodes. Rather,
|
||||
allocations will fallback to the nodes specified by the policy in
|
||||
order of numeric node id. Like everything in Linux, this is subject
|
||||
to change.
|
||||
set of nodes specified by the policy. Memory will be allocated from
|
||||
the node in the set with sufficient free memory that is closest to
|
||||
the node where the allocation takes place.
|
||||
|
||||
MPOL_PREFERRED: This mode specifies that the allocation should be
|
||||
attempted from the single node specified in the policy. If that
|
||||
allocation fails, the kernel will search other nodes, exactly as
|
||||
it would for a local allocation that started at the preferred node
|
||||
in increasing distance from the preferred node. "Local" allocation
|
||||
policy can be viewed as a Preferred policy that starts at the node
|
||||
allocation fails, the kernel will search other nodes, in order of
|
||||
increasing distance from the preferred node based on information
|
||||
provided by the platform firmware.
|
||||
containing the cpu where the allocation takes place.
|
||||
|
||||
Internally, the Preferred policy uses a single node--the
|
||||
preferred_node member of struct mempolicy. A "distinguished
|
||||
value of this preferred_node, currently '-1', is interpreted
|
||||
as "the node containing the cpu where the allocation takes
|
||||
place"--local allocation. This is the way to specify
|
||||
local allocation for a specific range of addresses--i.e. for
|
||||
VMA policies.
|
||||
preferred_node member of struct mempolicy. When the internal
|
||||
mode flag MPOL_F_LOCAL is set, the preferred_node is ignored and
|
||||
the policy is interpreted as local allocation. "Local" allocation
|
||||
policy can be viewed as a Preferred policy that starts at the node
|
||||
containing the cpu where the allocation takes place.
|
||||
|
||||
It is possible for the user to specify that local allocation is
|
||||
always preferred by passing an empty nodemask with this mode.
|
||||
If an empty nodemask is passed, the policy cannot use the
|
||||
MPOL_F_STATIC_NODES or MPOL_F_RELATIVE_NODES flags described
|
||||
below.
|
||||
|
||||
MPOL_INTERLEAVED: This mode specifies that page allocations be
|
||||
interleaved, on a page granularity, across the nodes specified in
|
||||
|
@ -231,6 +212,154 @@ Components of Memory Policies
|
|||
the temporary interleaved system default policy works in this
|
||||
mode.
|
||||
|
||||
Linux memory policy supports the following optional mode flags:
|
||||
|
||||
MPOL_F_STATIC_NODES: This flag specifies that the nodemask passed by
|
||||
the user should not be remapped if the task or VMA's set of allowed
|
||||
nodes changes after the memory policy has been defined.
|
||||
|
||||
Without this flag, anytime a mempolicy is rebound because of a
|
||||
change in the set of allowed nodes, the node (Preferred) or
|
||||
nodemask (Bind, Interleave) is remapped to the new set of
|
||||
allowed nodes. This may result in nodes being used that were
|
||||
previously undesired.
|
||||
|
||||
With this flag, if the user-specified nodes overlap with the
|
||||
nodes allowed by the task's cpuset, then the memory policy is
|
||||
applied to their intersection. If the two sets of nodes do not
|
||||
overlap, the Default policy is used.
|
||||
|
||||
For example, consider a task that is attached to a cpuset with
|
||||
mems 1-3 that sets an Interleave policy over the same set. If
|
||||
the cpuset's mems change to 3-5, the Interleave will now occur
|
||||
over nodes 3, 4, and 5. With this flag, however, since only node
|
||||
3 is allowed from the user's nodemask, the "interleave" only
|
||||
occurs over that node. If no nodes from the user's nodemask are
|
||||
now allowed, the Default behavior is used.
|
||||
|
||||
MPOL_F_STATIC_NODES cannot be combined with the
|
||||
MPOL_F_RELATIVE_NODES flag. It also cannot be used for
|
||||
MPOL_PREFERRED policies that were created with an empty nodemask
|
||||
(local allocation).
|
||||
|
||||
MPOL_F_RELATIVE_NODES: This flag specifies that the nodemask passed
|
||||
by the user will be mapped relative to the set of the task or VMA's
|
||||
set of allowed nodes. The kernel stores the user-passed nodemask,
|
||||
and if the allowed nodes changes, then that original nodemask will
|
||||
be remapped relative to the new set of allowed nodes.
|
||||
|
||||
Without this flag (and without MPOL_F_STATIC_NODES), anytime a
|
||||
mempolicy is rebound because of a change in the set of allowed
|
||||
nodes, the node (Preferred) or nodemask (Bind, Interleave) is
|
||||
remapped to the new set of allowed nodes. That remap may not
|
||||
preserve the relative nature of the user's passed nodemask to its
|
||||
set of allowed nodes upon successive rebinds: a nodemask of
|
||||
1,3,5 may be remapped to 7-9 and then to 1-3 if the set of
|
||||
allowed nodes is restored to its original state.
|
||||
|
||||
With this flag, the remap is done so that the node numbers from
|
||||
the user's passed nodemask are relative to the set of allowed
|
||||
nodes. In other words, if nodes 0, 2, and 4 are set in the user's
|
||||
nodemask, the policy will be effected over the first (and in the
|
||||
Bind or Interleave case, the third and fifth) nodes in the set of
|
||||
allowed nodes. The nodemask passed by the user represents nodes
|
||||
relative to task or VMA's set of allowed nodes.
|
||||
|
||||
If the user's nodemask includes nodes that are outside the range
|
||||
of the new set of allowed nodes (for example, node 5 is set in
|
||||
the user's nodemask when the set of allowed nodes is only 0-3),
|
||||
then the remap wraps around to the beginning of the nodemask and,
|
||||
if not already set, sets the node in the mempolicy nodemask.
|
||||
|
||||
For example, consider a task that is attached to a cpuset with
|
||||
mems 2-5 that sets an Interleave policy over the same set with
|
||||
MPOL_F_RELATIVE_NODES. If the cpuset's mems change to 3-7, the
|
||||
interleave now occurs over nodes 3,5-6. If the cpuset's mems
|
||||
then change to 0,2-3,5, then the interleave occurs over nodes
|
||||
0,3,5.
|
||||
|
||||
Thanks to the consistent remapping, applications preparing
|
||||
nodemasks to specify memory policies using this flag should
|
||||
disregard their current, actual cpuset imposed memory placement
|
||||
and prepare the nodemask as if they were always located on
|
||||
memory nodes 0 to N-1, where N is the number of memory nodes the
|
||||
policy is intended to manage. Let the kernel then remap to the
|
||||
set of memory nodes allowed by the task's cpuset, as that may
|
||||
change over time.
|
||||
|
||||
MPOL_F_RELATIVE_NODES cannot be combined with the
|
||||
MPOL_F_STATIC_NODES flag. It also cannot be used for
|
||||
MPOL_PREFERRED policies that were created with an empty nodemask
|
||||
(local allocation).
|
||||
|
||||
MEMORY POLICY REFERENCE COUNTING
|
||||
|
||||
To resolve use/free races, struct mempolicy contains an atomic reference
|
||||
count field. Internal interfaces, mpol_get()/mpol_put() increment and
|
||||
decrement this reference count, respectively. mpol_put() will only free
|
||||
the structure back to the mempolicy kmem cache when the reference count
|
||||
goes to zero.
|
||||
|
||||
When a new memory policy is allocated, it's reference count is initialized
|
||||
to '1', representing the reference held by the task that is installing the
|
||||
new policy. When a pointer to a memory policy structure is stored in another
|
||||
structure, another reference is added, as the task's reference will be dropped
|
||||
on completion of the policy installation.
|
||||
|
||||
During run-time "usage" of the policy, we attempt to minimize atomic operations
|
||||
on the reference count, as this can lead to cache lines bouncing between cpus
|
||||
and NUMA nodes. "Usage" here means one of the following:
|
||||
|
||||
1) querying of the policy, either by the task itself [using the get_mempolicy()
|
||||
API discussed below] or by another task using the /proc/<pid>/numa_maps
|
||||
interface.
|
||||
|
||||
2) examination of the policy to determine the policy mode and associated node
|
||||
or node lists, if any, for page allocation. This is considered a "hot
|
||||
path". Note that for MPOL_BIND, the "usage" extends across the entire
|
||||
allocation process, which may sleep during page reclaimation, because the
|
||||
BIND policy nodemask is used, by reference, to filter ineligible nodes.
|
||||
|
||||
We can avoid taking an extra reference during the usages listed above as
|
||||
follows:
|
||||
|
||||
1) we never need to get/free the system default policy as this is never
|
||||
changed nor freed, once the system is up and running.
|
||||
|
||||
2) for querying the policy, we do not need to take an extra reference on the
|
||||
target task's task policy nor vma policies because we always acquire the
|
||||
task's mm's mmap_sem for read during the query. The set_mempolicy() and
|
||||
mbind() APIs [see below] always acquire the mmap_sem for write when
|
||||
installing or replacing task or vma policies. Thus, there is no possibility
|
||||
of a task or thread freeing a policy while another task or thread is
|
||||
querying it.
|
||||
|
||||
3) Page allocation usage of task or vma policy occurs in the fault path where
|
||||
we hold them mmap_sem for read. Again, because replacing the task or vma
|
||||
policy requires that the mmap_sem be held for write, the policy can't be
|
||||
freed out from under us while we're using it for page allocation.
|
||||
|
||||
4) Shared policies require special consideration. One task can replace a
|
||||
shared memory policy while another task, with a distinct mmap_sem, is
|
||||
querying or allocating a page based on the policy. To resolve this
|
||||
potential race, the shared policy infrastructure adds an extra reference
|
||||
to the shared policy during lookup while holding a spin lock on the shared
|
||||
policy management structure. This requires that we drop this extra
|
||||
reference when we're finished "using" the policy. We must drop the
|
||||
extra reference on shared policies in the same query/allocation paths
|
||||
used for non-shared policies. For this reason, shared policies are marked
|
||||
as such, and the extra reference is dropped "conditionally"--i.e., only
|
||||
for shared policies.
|
||||
|
||||
Because of this extra reference counting, and because we must lookup
|
||||
shared policies in a tree structure under spinlock, shared policies are
|
||||
more expensive to use in the page allocation path. This is expecially
|
||||
true for shared policies on shared memory regions shared by tasks running
|
||||
on different NUMA nodes. This extra overhead can be avoided by always
|
||||
falling back to task or system default policy for shared memory regions,
|
||||
or by prefaulting the entire shared memory region into memory and locking
|
||||
it down. However, this might not be appropriate for all applications.
|
||||
|
||||
MEMORY POLICY APIs
|
||||
|
||||
Linux supports 3 system calls for controlling memory policy. These APIS
|
||||
|
@ -251,7 +380,9 @@ Set [Task] Memory Policy:
|
|||
Set's the calling task's "task/process memory policy" to mode
|
||||
specified by the 'mode' argument and the set of nodes defined
|
||||
by 'nmask'. 'nmask' points to a bit mask of node ids containing
|
||||
at least 'maxnode' ids.
|
||||
at least 'maxnode' ids. Optional mode flags may be passed by
|
||||
combining the 'mode' argument with the flag (for example:
|
||||
MPOL_INTERLEAVE | MPOL_F_STATIC_NODES).
|
||||
|
||||
See the set_mempolicy(2) man page for more details
|
||||
|
||||
|
@ -303,29 +434,19 @@ MEMORY POLICIES AND CPUSETS
|
|||
Memory policies work within cpusets as described above. For memory policies
|
||||
that require a node or set of nodes, the nodes are restricted to the set of
|
||||
nodes whose memories are allowed by the cpuset constraints. If the nodemask
|
||||
specified for the policy contains nodes that are not allowed by the cpuset, or
|
||||
the intersection of the set of nodes specified for the policy and the set of
|
||||
nodes with memory is the empty set, the policy is considered invalid
|
||||
and cannot be installed.
|
||||
specified for the policy contains nodes that are not allowed by the cpuset and
|
||||
MPOL_F_RELATIVE_NODES is not used, the intersection of the set of nodes
|
||||
specified for the policy and the set of nodes with memory is used. If the
|
||||
result is the empty set, the policy is considered invalid and cannot be
|
||||
installed. If MPOL_F_RELATIVE_NODES is used, the policy's nodes are mapped
|
||||
onto and folded into the task's set of allowed nodes as previously described.
|
||||
|
||||
The interaction of memory policies and cpusets can be problematic for a
|
||||
couple of reasons:
|
||||
|
||||
1) the memory policy APIs take physical node id's as arguments. As mentioned
|
||||
above, it is illegal to specify nodes that are not allowed in the cpuset.
|
||||
The application must query the allowed nodes using the get_mempolicy()
|
||||
API with the MPOL_F_MEMS_ALLOWED flag to determine the allowed nodes and
|
||||
restrict itself to those nodes. However, the resources available to a
|
||||
cpuset can be changed by the system administrator, or a workload manager
|
||||
application, at any time. So, a task may still get errors attempting to
|
||||
specify policy nodes, and must query the allowed memories again.
|
||||
|
||||
2) when tasks in two cpusets share access to a memory region, such as shared
|
||||
memory segments created by shmget() of mmap() with the MAP_ANONYMOUS and
|
||||
MAP_SHARED flags, and any of the tasks install shared policy on the region,
|
||||
only nodes whose memories are allowed in both cpusets may be used in the
|
||||
policies. Obtaining this information requires "stepping outside" the
|
||||
memory policy APIs to use the cpuset information and requires that one
|
||||
know in what cpusets other task might be attaching to the shared region.
|
||||
Furthermore, if the cpusets' allowed memory sets are disjoint, "local"
|
||||
allocation is the only valid policy.
|
||||
The interaction of memory policies and cpusets can be problematic when tasks
|
||||
in two cpusets share access to a memory region, such as shared memory segments
|
||||
created by shmget() of mmap() with the MAP_ANONYMOUS and MAP_SHARED flags, and
|
||||
any of the tasks install shared policy on the region, only nodes whose
|
||||
memories are allowed in both cpusets may be used in the policies. Obtaining
|
||||
this information requires "stepping outside" the memory policy APIs to use the
|
||||
cpuset information and requires that one know in what cpusets other task might
|
||||
be attaching to the shared region. Furthermore, if the cpusets' allowed
|
||||
memory sets are disjoint, "local" allocation is the only valid policy.
|
||||
|
|
62
Kbuild
62
Kbuild
|
@ -1,26 +1,61 @@
|
|||
#
|
||||
# Kbuild for top-level directory of the kernel
|
||||
# This file takes care of the following:
|
||||
# 1) Generate asm-offsets.h
|
||||
# 2) Check for missing system calls
|
||||
# 1) Generate bounds.h
|
||||
# 2) Generate asm-offsets.h (may need bounds.h)
|
||||
# 3) Check for missing system calls
|
||||
|
||||
#####
|
||||
# 1) Generate asm-offsets.h
|
||||
# 1) Generate bounds.h
|
||||
|
||||
bounds-file := include/linux/bounds.h
|
||||
|
||||
always := $(bounds-file)
|
||||
targets := $(bounds-file) kernel/bounds.s
|
||||
|
||||
quiet_cmd_bounds = GEN $@
|
||||
define cmd_bounds
|
||||
(set -e; \
|
||||
echo "#ifndef __LINUX_BOUNDS_H__"; \
|
||||
echo "#define __LINUX_BOUNDS_H__"; \
|
||||
echo "/*"; \
|
||||
echo " * DO NOT MODIFY."; \
|
||||
echo " *"; \
|
||||
echo " * This file was generated by Kbuild"; \
|
||||
echo " *"; \
|
||||
echo " */"; \
|
||||
echo ""; \
|
||||
sed -ne $(sed-y) $<; \
|
||||
echo ""; \
|
||||
echo "#endif" ) > $@
|
||||
endef
|
||||
|
||||
# We use internal kbuild rules to avoid the "is up to date" message from make
|
||||
kernel/bounds.s: kernel/bounds.c FORCE
|
||||
$(Q)mkdir -p $(dir $@)
|
||||
$(call if_changed_dep,cc_s_c)
|
||||
|
||||
$(obj)/$(bounds-file): kernel/bounds.s Kbuild
|
||||
$(Q)mkdir -p $(dir $@)
|
||||
$(call cmd,bounds)
|
||||
|
||||
#####
|
||||
# 2) Generate asm-offsets.h
|
||||
#
|
||||
|
||||
offsets-file := include/asm-$(SRCARCH)/asm-offsets.h
|
||||
|
||||
always := $(offsets-file)
|
||||
targets := $(offsets-file)
|
||||
always += $(offsets-file)
|
||||
targets += $(offsets-file)
|
||||
targets += arch/$(SRCARCH)/kernel/asm-offsets.s
|
||||
clean-files := $(addprefix $(objtree)/,$(targets))
|
||||
|
||||
|
||||
# Default sed regexp - multiline due to syntax constraints
|
||||
define sed-y
|
||||
"/^->/{s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; s:->::; p;}"
|
||||
"/^->/{s:->#\(.*\):/* \1 */:; \
|
||||
s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; \
|
||||
s:->::; p;}"
|
||||
endef
|
||||
# Override default regexp for specific architectures
|
||||
sed-$(CONFIG_MIPS) := "/^@@@/{s/^@@@//; s/ \#.*\$$//; p;}"
|
||||
|
||||
quiet_cmd_offsets = GEN $@
|
||||
define cmd_offsets
|
||||
|
@ -40,7 +75,8 @@ define cmd_offsets
|
|||
endef
|
||||
|
||||
# We use internal kbuild rules to avoid the "is up to date" message from make
|
||||
arch/$(SRCARCH)/kernel/asm-offsets.s: arch/$(SRCARCH)/kernel/asm-offsets.c FORCE
|
||||
arch/$(SRCARCH)/kernel/asm-offsets.s: arch/$(SRCARCH)/kernel/asm-offsets.c \
|
||||
$(obj)/$(bounds-file) FORCE
|
||||
$(Q)mkdir -p $(dir $@)
|
||||
$(call if_changed_dep,cc_s_c)
|
||||
|
||||
|
@ -49,7 +85,7 @@ $(obj)/$(offsets-file): arch/$(SRCARCH)/kernel/asm-offsets.s Kbuild
|
|||
$(call cmd,offsets)
|
||||
|
||||
#####
|
||||
# 2) Check for missing system calls
|
||||
# 3) Check for missing system calls
|
||||
#
|
||||
|
||||
quiet_cmd_syscalls = CALL $<
|
||||
|
@ -58,3 +94,7 @@ quiet_cmd_syscalls = CALL $<
|
|||
PHONY += missing-syscalls
|
||||
missing-syscalls: scripts/checksyscalls.sh FORCE
|
||||
$(call cmd,syscalls)
|
||||
|
||||
# Delete all targets during make clean
|
||||
clean-files := $(addprefix $(objtree)/,$(targets))
|
||||
|
||||
|
|
|
@ -994,7 +994,7 @@ marvel_agp_configure(alpha_agp_info *agp)
|
|||
* rate, but warn the user.
|
||||
*/
|
||||
printk("%s: unknown PLL setting RNGB=%lx (PLL6_CTL=%016lx)\n",
|
||||
__FUNCTION__, IO7_PLL_RNGB(agp_pll), agp_pll);
|
||||
__func__, IO7_PLL_RNGB(agp_pll), agp_pll);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1044,13 +1044,13 @@ marvel_agp_translate(alpha_agp_info *agp, dma_addr_t addr)
|
|||
|
||||
if (addr < agp->aperture.bus_base ||
|
||||
addr >= agp->aperture.bus_base + agp->aperture.size) {
|
||||
printk("%s: addr out of range\n", __FUNCTION__);
|
||||
printk("%s: addr out of range\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
pte = aper->arena->ptes[baddr >> PAGE_SHIFT];
|
||||
if (!(pte & 1)) {
|
||||
printk("%s: pte not valid\n", __FUNCTION__);
|
||||
printk("%s: pte not valid\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
return (pte >> 1) << PAGE_SHIFT;
|
||||
|
|
|
@ -336,10 +336,7 @@ t2_direct_map_window1(unsigned long base, unsigned long length)
|
|||
|
||||
#if DEBUG_PRINT_FINAL_SETTINGS
|
||||
printk("%s: setting WBASE1=0x%lx WMASK1=0x%lx TBASE1=0x%lx\n",
|
||||
__FUNCTION__,
|
||||
*(vulp)T2_WBASE1,
|
||||
*(vulp)T2_WMASK1,
|
||||
*(vulp)T2_TBASE1);
|
||||
__func__, *(vulp)T2_WBASE1, *(vulp)T2_WMASK1, *(vulp)T2_TBASE1);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -366,10 +363,7 @@ t2_sg_map_window2(struct pci_controller *hose,
|
|||
|
||||
#if DEBUG_PRINT_FINAL_SETTINGS
|
||||
printk("%s: setting WBASE2=0x%lx WMASK2=0x%lx TBASE2=0x%lx\n",
|
||||
__FUNCTION__,
|
||||
*(vulp)T2_WBASE2,
|
||||
*(vulp)T2_WMASK2,
|
||||
*(vulp)T2_TBASE2);
|
||||
__func__, *(vulp)T2_WBASE2, *(vulp)T2_WMASK2, *(vulp)T2_TBASE2);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -377,15 +371,15 @@ static void __init
|
|||
t2_save_configuration(void)
|
||||
{
|
||||
#if DEBUG_PRINT_INITIAL_SETTINGS
|
||||
printk("%s: HAE_1 was 0x%lx\n", __FUNCTION__, srm_hae); /* HW is 0 */
|
||||
printk("%s: HAE_2 was 0x%lx\n", __FUNCTION__, *(vulp)T2_HAE_2);
|
||||
printk("%s: HAE_3 was 0x%lx\n", __FUNCTION__, *(vulp)T2_HAE_3);
|
||||
printk("%s: HAE_4 was 0x%lx\n", __FUNCTION__, *(vulp)T2_HAE_4);
|
||||
printk("%s: HBASE was 0x%lx\n", __FUNCTION__, *(vulp)T2_HBASE);
|
||||
printk("%s: HAE_1 was 0x%lx\n", __func__, srm_hae); /* HW is 0 */
|
||||
printk("%s: HAE_2 was 0x%lx\n", __func__, *(vulp)T2_HAE_2);
|
||||
printk("%s: HAE_3 was 0x%lx\n", __func__, *(vulp)T2_HAE_3);
|
||||
printk("%s: HAE_4 was 0x%lx\n", __func__, *(vulp)T2_HAE_4);
|
||||
printk("%s: HBASE was 0x%lx\n", __func__, *(vulp)T2_HBASE);
|
||||
|
||||
printk("%s: WBASE1=0x%lx WMASK1=0x%lx TBASE1=0x%lx\n", __FUNCTION__,
|
||||
printk("%s: WBASE1=0x%lx WMASK1=0x%lx TBASE1=0x%lx\n", __func__,
|
||||
*(vulp)T2_WBASE1, *(vulp)T2_WMASK1, *(vulp)T2_TBASE1);
|
||||
printk("%s: WBASE2=0x%lx WMASK2=0x%lx TBASE2=0x%lx\n", __FUNCTION__,
|
||||
printk("%s: WBASE2=0x%lx WMASK2=0x%lx TBASE2=0x%lx\n", __func__,
|
||||
*(vulp)T2_WBASE2, *(vulp)T2_WMASK2, *(vulp)T2_TBASE2);
|
||||
#endif
|
||||
|
||||
|
|
|
@ -365,21 +365,21 @@ void __init
|
|||
titan_init_arch(void)
|
||||
{
|
||||
#if 0
|
||||
printk("%s: titan_init_arch()\n", __FUNCTION__);
|
||||
printk("%s: CChip registers:\n", __FUNCTION__);
|
||||
printk("%s: CSR_CSC 0x%lx\n", __FUNCTION__, TITAN_cchip->csc.csr);
|
||||
printk("%s: CSR_MTR 0x%lx\n", __FUNCTION__, TITAN_cchip->mtr.csr);
|
||||
printk("%s: CSR_MISC 0x%lx\n", __FUNCTION__, TITAN_cchip->misc.csr);
|
||||
printk("%s: CSR_DIM0 0x%lx\n", __FUNCTION__, TITAN_cchip->dim0.csr);
|
||||
printk("%s: CSR_DIM1 0x%lx\n", __FUNCTION__, TITAN_cchip->dim1.csr);
|
||||
printk("%s: CSR_DIR0 0x%lx\n", __FUNCTION__, TITAN_cchip->dir0.csr);
|
||||
printk("%s: CSR_DIR1 0x%lx\n", __FUNCTION__, TITAN_cchip->dir1.csr);
|
||||
printk("%s: CSR_DRIR 0x%lx\n", __FUNCTION__, TITAN_cchip->drir.csr);
|
||||
printk("%s: titan_init_arch()\n", __func__);
|
||||
printk("%s: CChip registers:\n", __func__);
|
||||
printk("%s: CSR_CSC 0x%lx\n", __func__, TITAN_cchip->csc.csr);
|
||||
printk("%s: CSR_MTR 0x%lx\n", __func__, TITAN_cchip->mtr.csr);
|
||||
printk("%s: CSR_MISC 0x%lx\n", __func__, TITAN_cchip->misc.csr);
|
||||
printk("%s: CSR_DIM0 0x%lx\n", __func__, TITAN_cchip->dim0.csr);
|
||||
printk("%s: CSR_DIM1 0x%lx\n", __func__, TITAN_cchip->dim1.csr);
|
||||
printk("%s: CSR_DIR0 0x%lx\n", __func__, TITAN_cchip->dir0.csr);
|
||||
printk("%s: CSR_DIR1 0x%lx\n", __func__, TITAN_cchip->dir1.csr);
|
||||
printk("%s: CSR_DRIR 0x%lx\n", __func__, TITAN_cchip->drir.csr);
|
||||
|
||||
printk("%s: DChip registers:\n", __FUNCTION__);
|
||||
printk("%s: CSR_DSC 0x%lx\n", __FUNCTION__, TITAN_dchip->dsc.csr);
|
||||
printk("%s: CSR_STR 0x%lx\n", __FUNCTION__, TITAN_dchip->str.csr);
|
||||
printk("%s: CSR_DREV 0x%lx\n", __FUNCTION__, TITAN_dchip->drev.csr);
|
||||
printk("%s: DChip registers:\n", __func__);
|
||||
printk("%s: CSR_DSC 0x%lx\n", __func__, TITAN_dchip->dsc.csr);
|
||||
printk("%s: CSR_STR 0x%lx\n", __func__, TITAN_dchip->str.csr);
|
||||
printk("%s: CSR_DREV 0x%lx\n", __func__, TITAN_dchip->drev.csr);
|
||||
#endif
|
||||
|
||||
boot_cpuid = __hard_smp_processor_id();
|
||||
|
@ -700,13 +700,13 @@ titan_agp_translate(alpha_agp_info *agp, dma_addr_t addr)
|
|||
|
||||
if (addr < agp->aperture.bus_base ||
|
||||
addr >= agp->aperture.bus_base + agp->aperture.size) {
|
||||
printk("%s: addr out of range\n", __FUNCTION__);
|
||||
printk("%s: addr out of range\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
pte = aper->arena->ptes[baddr >> PAGE_SHIFT];
|
||||
if (!(pte & 1)) {
|
||||
printk("%s: pte not valid\n", __FUNCTION__);
|
||||
printk("%s: pte not valid\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
|
|
@ -241,8 +241,6 @@ tsunami_probe_write(volatile unsigned long *vaddr)
|
|||
#define tsunami_probe_read(ADDR) 1
|
||||
#endif /* NXM_MACHINE_CHECKS_ON_TSUNAMI */
|
||||
|
||||
#define FN __FUNCTION__
|
||||
|
||||
static void __init
|
||||
tsunami_init_one_pchip(tsunami_pchip *pchip, int index)
|
||||
{
|
||||
|
@ -383,27 +381,27 @@ tsunami_init_arch(void)
|
|||
/* NXMs just don't matter to Tsunami--unless they make it
|
||||
choke completely. */
|
||||
tmp = (unsigned long)(TSUNAMI_cchip - 1);
|
||||
printk("%s: probing bogus address: 0x%016lx\n", FN, bogus_addr);
|
||||
printk("%s: probing bogus address: 0x%016lx\n", __func__, bogus_addr);
|
||||
printk("\tprobe %s\n",
|
||||
tsunami_probe_write((unsigned long *)bogus_addr)
|
||||
? "succeeded" : "failed");
|
||||
#endif /* NXM_MACHINE_CHECKS_ON_TSUNAMI */
|
||||
|
||||
#if 0
|
||||
printk("%s: CChip registers:\n", FN);
|
||||
printk("%s: CSR_CSC 0x%lx\n", FN, TSUNAMI_cchip->csc.csr);
|
||||
printk("%s: CSR_MTR 0x%lx\n", FN, TSUNAMI_cchip.mtr.csr);
|
||||
printk("%s: CSR_MISC 0x%lx\n", FN, TSUNAMI_cchip->misc.csr);
|
||||
printk("%s: CSR_DIM0 0x%lx\n", FN, TSUNAMI_cchip->dim0.csr);
|
||||
printk("%s: CSR_DIM1 0x%lx\n", FN, TSUNAMI_cchip->dim1.csr);
|
||||
printk("%s: CSR_DIR0 0x%lx\n", FN, TSUNAMI_cchip->dir0.csr);
|
||||
printk("%s: CSR_DIR1 0x%lx\n", FN, TSUNAMI_cchip->dir1.csr);
|
||||
printk("%s: CSR_DRIR 0x%lx\n", FN, TSUNAMI_cchip->drir.csr);
|
||||
printk("%s: CChip registers:\n", __func__);
|
||||
printk("%s: CSR_CSC 0x%lx\n", __func__, TSUNAMI_cchip->csc.csr);
|
||||
printk("%s: CSR_MTR 0x%lx\n", __func__, TSUNAMI_cchip.mtr.csr);
|
||||
printk("%s: CSR_MISC 0x%lx\n", __func__, TSUNAMI_cchip->misc.csr);
|
||||
printk("%s: CSR_DIM0 0x%lx\n", __func__, TSUNAMI_cchip->dim0.csr);
|
||||
printk("%s: CSR_DIM1 0x%lx\n", __func__, TSUNAMI_cchip->dim1.csr);
|
||||
printk("%s: CSR_DIR0 0x%lx\n", __func__, TSUNAMI_cchip->dir0.csr);
|
||||
printk("%s: CSR_DIR1 0x%lx\n", __func__, TSUNAMI_cchip->dir1.csr);
|
||||
printk("%s: CSR_DRIR 0x%lx\n", __func__, TSUNAMI_cchip->drir.csr);
|
||||
|
||||
printk("%s: DChip registers:\n");
|
||||
printk("%s: CSR_DSC 0x%lx\n", FN, TSUNAMI_dchip->dsc.csr);
|
||||
printk("%s: CSR_STR 0x%lx\n", FN, TSUNAMI_dchip->str.csr);
|
||||
printk("%s: CSR_DREV 0x%lx\n", FN, TSUNAMI_dchip->drev.csr);
|
||||
printk("%s: CSR_DSC 0x%lx\n", __func__, TSUNAMI_dchip->dsc.csr);
|
||||
printk("%s: CSR_STR 0x%lx\n", __func__, TSUNAMI_dchip->str.csr);
|
||||
printk("%s: CSR_DREV 0x%lx\n", __func__, TSUNAMI_dchip->drev.csr);
|
||||
#endif
|
||||
/* With multiple PCI busses, we play with I/O as physical addrs. */
|
||||
ioport_resource.end = ~0UL;
|
||||
|
|
|
@ -120,6 +120,12 @@ module_frob_arch_sections(Elf64_Ehdr *hdr, Elf64_Shdr *sechdrs,
|
|||
|
||||
nsyms = symtab->sh_size / sizeof(Elf64_Sym);
|
||||
chains = kcalloc(nsyms, sizeof(struct got_entry), GFP_KERNEL);
|
||||
if (!chains) {
|
||||
printk(KERN_ERR
|
||||
"module %s: no memory for symbol chain buffer\n",
|
||||
me->name);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
got->sh_size = 0;
|
||||
got->sh_addralign = 8;
|
||||
|
|
|
@ -208,7 +208,7 @@ pdev_save_srm_config(struct pci_dev *dev)
|
|||
|
||||
tmp = kmalloc(sizeof(*tmp), GFP_KERNEL);
|
||||
if (!tmp) {
|
||||
printk(KERN_ERR "%s: kmalloc() failed!\n", __FUNCTION__);
|
||||
printk(KERN_ERR "%s: kmalloc() failed!\n", __func__);
|
||||
return;
|
||||
}
|
||||
tmp->next = srm_saved_configs;
|
||||
|
|
|
@ -79,25 +79,21 @@ iommu_arena_new_node(int nid, struct pci_controller *hose, dma_addr_t base,
|
|||
|
||||
#ifdef CONFIG_DISCONTIGMEM
|
||||
|
||||
if (!NODE_DATA(nid) ||
|
||||
(NULL == (arena = alloc_bootmem_node(NODE_DATA(nid),
|
||||
sizeof(*arena))))) {
|
||||
printk("%s: couldn't allocate arena from node %d\n"
|
||||
" falling back to system-wide allocation\n",
|
||||
__FUNCTION__, nid);
|
||||
arena = alloc_bootmem(sizeof(*arena));
|
||||
}
|
||||
arena = alloc_bootmem_node(NODE_DATA(nid), sizeof(*arena));
|
||||
if (!NODE_DATA(nid) || !arena) {
|
||||
printk("%s: couldn't allocate arena from node %d\n"
|
||||
" falling back to system-wide allocation\n",
|
||||
__func__, nid);
|
||||
arena = alloc_bootmem(sizeof(*arena));
|
||||
}
|
||||
|
||||
if (!NODE_DATA(nid) ||
|
||||
(NULL == (arena->ptes = __alloc_bootmem_node(NODE_DATA(nid),
|
||||
mem_size,
|
||||
align,
|
||||
0)))) {
|
||||
printk("%s: couldn't allocate arena ptes from node %d\n"
|
||||
" falling back to system-wide allocation\n",
|
||||
__FUNCTION__, nid);
|
||||
arena->ptes = __alloc_bootmem(mem_size, align, 0);
|
||||
}
|
||||
arena->ptes = __alloc_bootmem_node(NODE_DATA(nid), mem_size, align, 0);
|
||||
if (!NODE_DATA(nid) || !arena->ptes) {
|
||||
printk("%s: couldn't allocate arena ptes from node %d\n"
|
||||
" falling back to system-wide allocation\n",
|
||||
__func__, nid);
|
||||
arena->ptes = __alloc_bootmem(mem_size, align, 0);
|
||||
}
|
||||
|
||||
#else /* CONFIG_DISCONTIGMEM */
|
||||
|
||||
|
|
|
@ -755,7 +755,7 @@ smp_call_function_on_cpu (void (*func) (void *info), void *info, int retry,
|
|||
if (atomic_read(&data.unstarted_count) > 0) {
|
||||
long start_time = jiffies;
|
||||
printk(KERN_ERR "%s: initial timeout -- trying long wait\n",
|
||||
__FUNCTION__);
|
||||
__func__);
|
||||
timeout = jiffies + 30 * HZ;
|
||||
while (atomic_read(&data.unstarted_count) > 0
|
||||
&& time_before(jiffies, timeout))
|
||||
|
@ -764,7 +764,7 @@ smp_call_function_on_cpu (void (*func) (void *info), void *info, int retry,
|
|||
long delta = jiffies - start_time;
|
||||
printk(KERN_ERR
|
||||
"%s: response %ld.%ld seconds into long wait\n",
|
||||
__FUNCTION__, delta / HZ,
|
||||
__func__, delta / HZ,
|
||||
(100 * (delta - ((delta / HZ) * HZ))) / HZ);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -199,7 +199,7 @@ srm_env_init(void)
|
|||
printk(KERN_INFO "%s: This Alpha system doesn't "
|
||||
"know about SRM (or you've booted "
|
||||
"SRM->MILO->Linux, which gets "
|
||||
"misdetected)...\n", __FUNCTION__);
|
||||
"misdetected)...\n", __func__);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
|
|
|
@ -259,7 +259,7 @@ alcor_init_pci(void)
|
|||
if (dev && dev->devfn == PCI_DEVFN(6,0)) {
|
||||
alpha_mv.sys.cia.gru_int_req_bits = XLT_GRU_INT_REQ_BITS;
|
||||
printk(KERN_INFO "%s: Detected AS500 or XLT motherboard.\n",
|
||||
__FUNCTION__);
|
||||
__func__);
|
||||
}
|
||||
pci_dev_put(dev);
|
||||
}
|
||||
|
|
|
@ -80,7 +80,7 @@ io7_get_irq_ctl(unsigned int irq, struct io7 **pio7)
|
|||
if (!(io7 = marvel_find_io7(pid))) {
|
||||
printk(KERN_ERR
|
||||
"%s for nonexistent io7 -- vec %x, pid %d\n",
|
||||
__FUNCTION__, irq, pid);
|
||||
__func__, irq, pid);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -90,7 +90,7 @@ io7_get_irq_ctl(unsigned int irq, struct io7 **pio7)
|
|||
if (irq >= 0x180) {
|
||||
printk(KERN_ERR
|
||||
"%s for invalid irq -- pid %d adjusted irq %x\n",
|
||||
__FUNCTION__, pid, irq);
|
||||
__func__, pid, irq);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -110,8 +110,8 @@ io7_enable_irq(unsigned int irq)
|
|||
|
||||
ctl = io7_get_irq_ctl(irq, &io7);
|
||||
if (!ctl || !io7) {
|
||||
printk(KERN_ERR "%s: get_ctl failed for irq %x\n",
|
||||
__FUNCTION__, irq);
|
||||
printk(KERN_ERR "%s: get_ctl failed for irq %x\n",
|
||||
__func__, irq);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -130,8 +130,8 @@ io7_disable_irq(unsigned int irq)
|
|||
|
||||
ctl = io7_get_irq_ctl(irq, &io7);
|
||||
if (!ctl || !io7) {
|
||||
printk(KERN_ERR "%s: get_ctl failed for irq %x\n",
|
||||
__FUNCTION__, irq);
|
||||
printk(KERN_ERR "%s: get_ctl failed for irq %x\n",
|
||||
__func__, irq);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -454,7 +454,7 @@ sable_lynx_enable_irq(unsigned int irq)
|
|||
spin_unlock(&sable_lynx_irq_lock);
|
||||
#if 0
|
||||
printk("%s: mask 0x%lx bit 0x%x irq 0x%x\n",
|
||||
__FUNCTION__, mask, bit, irq);
|
||||
__func__, mask, bit, irq);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -470,7 +470,7 @@ sable_lynx_disable_irq(unsigned int irq)
|
|||
spin_unlock(&sable_lynx_irq_lock);
|
||||
#if 0
|
||||
printk("%s: mask 0x%lx bit 0x%x irq 0x%x\n",
|
||||
__FUNCTION__, mask, bit, irq);
|
||||
__func__, mask, bit, irq);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -524,7 +524,7 @@ sable_lynx_srm_device_interrupt(unsigned long vector)
|
|||
irq = sable_lynx_irq_swizzle->mask_to_irq[bit];
|
||||
#if 0
|
||||
printk("%s: vector 0x%lx bit 0x%x irq 0x%x\n",
|
||||
__FUNCTION__, vector, bit, irq);
|
||||
__func__, vector, bit, irq);
|
||||
#endif
|
||||
handle_irq(irq);
|
||||
}
|
||||
|
|
|
@ -89,7 +89,7 @@ sio_pci_route(void)
|
|||
/* First, ALWAYS read and print the original setting. */
|
||||
pci_bus_read_config_dword(pci_isa_hose->bus, PCI_DEVFN(7, 0), 0x60,
|
||||
&orig_route_tab);
|
||||
printk("%s: PIRQ original 0x%x new 0x%x\n", __FUNCTION__,
|
||||
printk("%s: PIRQ original 0x%x new 0x%x\n", __func__,
|
||||
orig_route_tab, alpha_mv.sys.sio.route_tab);
|
||||
|
||||
#if defined(ALPHA_RESTORE_SRM_SETUP)
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
* This file initializes the trap entry points
|
||||
*/
|
||||
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/tty.h>
|
||||
|
@ -770,7 +771,7 @@ do_entUnaUser(void __user * va, unsigned long opcode,
|
|||
unsigned long reg, struct pt_regs *regs)
|
||||
{
|
||||
static int cnt = 0;
|
||||
static long last_time = 0;
|
||||
static unsigned long last_time;
|
||||
|
||||
unsigned long tmp1, tmp2, tmp3, tmp4;
|
||||
unsigned long fake_reg, *reg_addr = &fake_reg;
|
||||
|
@ -781,7 +782,7 @@ do_entUnaUser(void __user * va, unsigned long opcode,
|
|||
with the unaliged access. */
|
||||
|
||||
if (!test_thread_flag (TIF_UAC_NOPRINT)) {
|
||||
if (cnt >= 5 && jiffies - last_time > 5*HZ) {
|
||||
if (cnt >= 5 && time_after(jiffies, last_time + 5 * HZ)) {
|
||||
cnt = 0;
|
||||
}
|
||||
if (++cnt < 5) {
|
||||
|
|
|
@ -539,6 +539,17 @@ void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data)
|
|||
at91_set_B_periph(AT91_PIN_PB28, 0); /* LCDD23 */
|
||||
#endif
|
||||
|
||||
if (ARRAY_SIZE(lcdc_resources) > 2) {
|
||||
void __iomem *fb;
|
||||
struct resource *fb_res = &lcdc_resources[2];
|
||||
size_t fb_len = fb_res->end - fb_res->start + 1;
|
||||
|
||||
fb = ioremap_writecombine(fb_res->start, fb_len);
|
||||
if (fb) {
|
||||
memset(fb, 0, fb_len);
|
||||
iounmap(fb, fb_len);
|
||||
}
|
||||
}
|
||||
lcdc_data = *data;
|
||||
platform_device_register(&at91_lcdc_device);
|
||||
}
|
||||
|
|
|
@ -381,6 +381,20 @@ void __init at91_add_device_lcdc(struct atmel_lcdfb_info *data)
|
|||
at91_set_B_periph(AT91_PIN_PC24, 0); /* LCDD22 */
|
||||
at91_set_B_periph(AT91_PIN_PC25, 0); /* LCDD23 */
|
||||
|
||||
#ifdef CONFIG_FB_INTSRAM
|
||||
{
|
||||
void __iomem *fb;
|
||||
struct resource *fb_res = &lcdc_resources[2];
|
||||
size_t fb_len = fb_res->end - fb_res->start + 1;
|
||||
|
||||
fb = ioremap_writecombine(fb_res->start, fb_len);
|
||||
if (fb) {
|
||||
memset(fb, 0, fb_len);
|
||||
iounmap(fb, fb_len);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
lcdc_data = *data;
|
||||
platform_device_register(&at91_lcdc_device);
|
||||
}
|
||||
|
|
|
@ -274,6 +274,8 @@ static int __init early_parse_fbmem(char *p)
|
|||
printk(KERN_WARNING
|
||||
"Failed to allocate framebuffer memory\n");
|
||||
fbmem_size = 0;
|
||||
} else {
|
||||
memset(__va(fbmem_start), 0, fbmem_size);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -27,7 +27,6 @@ show_mem(void)
|
|||
|
||||
printk("\nMem-info:\n");
|
||||
show_free_areas();
|
||||
printk("Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
|
||||
i = max_mapnr;
|
||||
while (i-- > 0) {
|
||||
total++;
|
||||
|
|
|
@ -49,7 +49,7 @@ asmlinkage void insn_access_error(unsigned long esfr1, unsigned long epcr0, unsi
|
|||
info.si_signo = SIGSEGV;
|
||||
info.si_code = SEGV_ACCERR;
|
||||
info.si_errno = 0;
|
||||
info.si_addr = (void *) ((epcr0 & EPCR0_V) ? (epcr0 & EPCR0_PC) : __frame->pc);
|
||||
info.si_addr = (void __user *) ((epcr0 & EPCR0_V) ? (epcr0 & EPCR0_PC) : __frame->pc);
|
||||
|
||||
force_sig_info(info.si_signo, &info, current);
|
||||
} /* end insn_access_error() */
|
||||
|
@ -73,7 +73,7 @@ asmlinkage void illegal_instruction(unsigned long esfr1, unsigned long epcr0, un
|
|||
epcr0, esr0, esfr1);
|
||||
|
||||
info.si_errno = 0;
|
||||
info.si_addr = (void *) ((epcr0 & EPCR0_V) ? (epcr0 & EPCR0_PC) : __frame->pc);
|
||||
info.si_addr = (void __user *) ((epcr0 & EPCR0_V) ? (epcr0 & EPCR0_PC) : __frame->pc);
|
||||
|
||||
switch (__frame->tbr & TBR_TT) {
|
||||
case TBR_TT_ILLEGAL_INSTR:
|
||||
|
@ -111,7 +111,8 @@ asmlinkage void atomic_operation(unsigned long esfr1, unsigned long epcr0,
|
|||
unsigned long esr0)
|
||||
{
|
||||
static DEFINE_SPINLOCK(atomic_op_lock);
|
||||
unsigned long x, y, z, *p;
|
||||
unsigned long x, y, z;
|
||||
unsigned long __user *p;
|
||||
mm_segment_t oldfs;
|
||||
siginfo_t info;
|
||||
int ret;
|
||||
|
@ -128,7 +129,7 @@ asmlinkage void atomic_operation(unsigned long esfr1, unsigned long epcr0,
|
|||
* u32 __atomic_user_cmpxchg32(u32 *ptr, u32 test, u32 new)
|
||||
*/
|
||||
case TBR_TT_ATOMIC_CMPXCHG32:
|
||||
p = (unsigned long *) __frame->gr8;
|
||||
p = (unsigned long __user *) __frame->gr8;
|
||||
x = __frame->gr9;
|
||||
y = __frame->gr10;
|
||||
|
||||
|
@ -158,7 +159,7 @@ asmlinkage void atomic_operation(unsigned long esfr1, unsigned long epcr0,
|
|||
* u32 __atomic_kernel_xchg32(void *v, u32 new)
|
||||
*/
|
||||
case TBR_TT_ATOMIC_XCHG32:
|
||||
p = (unsigned long *) __frame->gr8;
|
||||
p = (unsigned long __user *) __frame->gr8;
|
||||
y = __frame->gr9;
|
||||
|
||||
for (;;) {
|
||||
|
@ -181,7 +182,7 @@ asmlinkage void atomic_operation(unsigned long esfr1, unsigned long epcr0,
|
|||
* ulong __atomic_kernel_XOR_return(ulong i, ulong *v)
|
||||
*/
|
||||
case TBR_TT_ATOMIC_XOR:
|
||||
p = (unsigned long *) __frame->gr8;
|
||||
p = (unsigned long __user *) __frame->gr8;
|
||||
x = __frame->gr9;
|
||||
|
||||
for (;;) {
|
||||
|
@ -205,7 +206,7 @@ asmlinkage void atomic_operation(unsigned long esfr1, unsigned long epcr0,
|
|||
* ulong __atomic_kernel_OR_return(ulong i, ulong *v)
|
||||
*/
|
||||
case TBR_TT_ATOMIC_OR:
|
||||
p = (unsigned long *) __frame->gr8;
|
||||
p = (unsigned long __user *) __frame->gr8;
|
||||
x = __frame->gr9;
|
||||
|
||||
for (;;) {
|
||||
|
@ -229,7 +230,7 @@ asmlinkage void atomic_operation(unsigned long esfr1, unsigned long epcr0,
|
|||
* ulong __atomic_kernel_AND_return(ulong i, ulong *v)
|
||||
*/
|
||||
case TBR_TT_ATOMIC_AND:
|
||||
p = (unsigned long *) __frame->gr8;
|
||||
p = (unsigned long __user *) __frame->gr8;
|
||||
x = __frame->gr9;
|
||||
|
||||
for (;;) {
|
||||
|
@ -253,7 +254,7 @@ asmlinkage void atomic_operation(unsigned long esfr1, unsigned long epcr0,
|
|||
* int __atomic_user_sub_return(atomic_t *v, int i)
|
||||
*/
|
||||
case TBR_TT_ATOMIC_SUB:
|
||||
p = (unsigned long *) __frame->gr8;
|
||||
p = (unsigned long __user *) __frame->gr8;
|
||||
x = __frame->gr9;
|
||||
|
||||
for (;;) {
|
||||
|
@ -277,7 +278,7 @@ asmlinkage void atomic_operation(unsigned long esfr1, unsigned long epcr0,
|
|||
* int __atomic_user_add_return(atomic_t *v, int i)
|
||||
*/
|
||||
case TBR_TT_ATOMIC_ADD:
|
||||
p = (unsigned long *) __frame->gr8;
|
||||
p = (unsigned long __user *) __frame->gr8;
|
||||
x = __frame->gr9;
|
||||
|
||||
for (;;) {
|
||||
|
@ -322,7 +323,7 @@ error:
|
|||
info.si_signo = SIGSEGV;
|
||||
info.si_code = SEGV_ACCERR;
|
||||
info.si_errno = 0;
|
||||
info.si_addr = (void *) __frame->pc;
|
||||
info.si_addr = (void __user *) __frame->pc;
|
||||
|
||||
force_sig_info(info.si_signo, &info, current);
|
||||
}
|
||||
|
@ -343,7 +344,7 @@ asmlinkage void media_exception(unsigned long msr0, unsigned long msr1)
|
|||
info.si_signo = SIGFPE;
|
||||
info.si_code = FPE_MDAOVF;
|
||||
info.si_errno = 0;
|
||||
info.si_addr = (void *) __frame->pc;
|
||||
info.si_addr = (void __user *) __frame->pc;
|
||||
|
||||
force_sig_info(info.si_signo, &info, current);
|
||||
} /* end media_exception() */
|
||||
|
@ -383,7 +384,7 @@ asmlinkage void memory_access_exception(unsigned long esr0,
|
|||
info.si_addr = NULL;
|
||||
|
||||
if ((esr0 & (ESRx_VALID | ESR0_EAV)) == (ESRx_VALID | ESR0_EAV))
|
||||
info.si_addr = (void *) ear0;
|
||||
info.si_addr = (void __user *) ear0;
|
||||
|
||||
force_sig_info(info.si_signo, &info, current);
|
||||
|
||||
|
@ -412,7 +413,7 @@ asmlinkage void data_access_error(unsigned long esfr1, unsigned long esr15, unsi
|
|||
info.si_signo = SIGSEGV;
|
||||
info.si_code = SEGV_ACCERR;
|
||||
info.si_errno = 0;
|
||||
info.si_addr = (void *)
|
||||
info.si_addr = (void __user *)
|
||||
(((esr15 & (ESRx_VALID|ESR15_EAV)) == (ESRx_VALID|ESR15_EAV)) ? ear15 : 0);
|
||||
|
||||
force_sig_info(info.si_signo, &info, current);
|
||||
|
@ -446,7 +447,7 @@ asmlinkage void division_exception(unsigned long esfr1, unsigned long esr0, unsi
|
|||
info.si_signo = SIGFPE;
|
||||
info.si_code = FPE_INTDIV;
|
||||
info.si_errno = 0;
|
||||
info.si_addr = (void *) __frame->pc;
|
||||
info.si_addr = (void __user *) __frame->pc;
|
||||
|
||||
force_sig_info(info.si_signo, &info, current);
|
||||
} /* end division_exception() */
|
||||
|
|
|
@ -42,10 +42,7 @@ $(obj)/$(offsets-file): arch/ia64/kvm/asm-offsets.s
|
|||
#
|
||||
|
||||
EXTRA_CFLAGS += -Ivirt/kvm -Iarch/ia64/kvm/
|
||||
|
||||
$(addprefix $(objtree)/,$(obj)/memcpy.S $(obj)/memset.S):
|
||||
$(shell ln -snf ../lib/memcpy.S $(src)/memcpy.S)
|
||||
$(shell ln -snf ../lib/memset.S $(src)/memset.S)
|
||||
EXTRA_AFLAGS += -Ivirt/kvm -Iarch/ia64/kvm/
|
||||
|
||||
common-objs = $(addprefix ../../../virt/kvm/, kvm_main.o ioapic.o)
|
||||
|
||||
|
@ -57,5 +54,5 @@ EXTRA_CFLAGS_vcpu.o += -mfixed-range=f2-f5,f12-f127
|
|||
kvm-intel-objs = vmm.o vmm_ivt.o trampoline.o vcpu.o optvfault.o mmio.o \
|
||||
vtlb.o process.o
|
||||
#Add link memcpy and memset to avoid possible structure assignment error
|
||||
kvm-intel-objs += memset.o memcpy.o
|
||||
kvm-intel-objs += ../lib/memset.o ../lib/memcpy.o
|
||||
obj-$(CONFIG_KVM_INTEL) += kvm-intel.o
|
||||
|
|
|
@ -682,15 +682,6 @@ mem_init (void)
|
|||
}
|
||||
|
||||
#ifdef CONFIG_MEMORY_HOTPLUG
|
||||
void online_page(struct page *page)
|
||||
{
|
||||
ClearPageReserved(page);
|
||||
init_page_count(page);
|
||||
__free_page(page);
|
||||
totalram_pages++;
|
||||
num_physpages++;
|
||||
}
|
||||
|
||||
int arch_add_memory(int nid, u64 start, u64 size)
|
||||
{
|
||||
pg_data_t *pgdat;
|
||||
|
|
|
@ -186,7 +186,7 @@ int setup_irq(unsigned int irq, struct irq_node *node)
|
|||
|
||||
if (irq >= NR_IRQS || !(contr = irq_controller[irq])) {
|
||||
printk("%s: Incorrect IRQ %d from %s\n",
|
||||
__FUNCTION__, irq, node->devname);
|
||||
__func__, irq, node->devname);
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
|
@ -249,7 +249,7 @@ void free_irq(unsigned int irq, void *dev_id)
|
|||
unsigned long flags;
|
||||
|
||||
if (irq >= NR_IRQS || !(contr = irq_controller[irq])) {
|
||||
printk("%s: Incorrect IRQ %d\n", __FUNCTION__, irq);
|
||||
printk("%s: Incorrect IRQ %d\n", __func__, irq);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -267,7 +267,7 @@ void free_irq(unsigned int irq, void *dev_id)
|
|||
node->handler = NULL;
|
||||
} else
|
||||
printk("%s: Removing probably wrong IRQ %d\n",
|
||||
__FUNCTION__, irq);
|
||||
__func__, irq);
|
||||
|
||||
if (!irq_list[irq]) {
|
||||
if (contr->shutdown)
|
||||
|
@ -288,7 +288,7 @@ void enable_irq(unsigned int irq)
|
|||
|
||||
if (irq >= NR_IRQS || !(contr = irq_controller[irq])) {
|
||||
printk("%s: Incorrect IRQ %d\n",
|
||||
__FUNCTION__, irq);
|
||||
__func__, irq);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -312,7 +312,7 @@ void disable_irq(unsigned int irq)
|
|||
|
||||
if (irq >= NR_IRQS || !(contr = irq_controller[irq])) {
|
||||
printk("%s: Incorrect IRQ %d\n",
|
||||
__FUNCTION__, irq);
|
||||
__func__, irq);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -190,7 +190,7 @@ void oss_irq_enable(int irq) {
|
|||
break;
|
||||
#ifdef DEBUG_IRQUSE
|
||||
default:
|
||||
printk("%s unknown irq %d\n",__FUNCTION__, irq);
|
||||
printk("%s unknown irq %d\n", __func__, irq);
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
|
@ -230,7 +230,7 @@ void oss_irq_disable(int irq) {
|
|||
break;
|
||||
#ifdef DEBUG_IRQUSE
|
||||
default:
|
||||
printk("%s unknown irq %d\n", __FUNCTION__, irq);
|
||||
printk("%s unknown irq %d\n", __func__, irq);
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -79,7 +79,6 @@ void show_mem(void)
|
|||
|
||||
printk("\nMem-info:\n");
|
||||
show_free_areas();
|
||||
printk("Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
|
||||
for_each_online_pgdat(pgdat) {
|
||||
for (i = 0; i < pgdat->node_spanned_pages; i++) {
|
||||
struct page *page = pgdat->node_mem_map + i;
|
||||
|
|
|
@ -47,7 +47,7 @@ static int q40_irq_startup(unsigned int irq)
|
|||
switch (irq) {
|
||||
case 1: case 2: case 8: case 9:
|
||||
case 11: case 12: case 13:
|
||||
printk("%s: ISA IRQ %d not implemented by HW\n", __FUNCTION__, irq);
|
||||
printk("%s: ISA IRQ %d not implemented by HW\n", __func__, irq);
|
||||
return -ENXIO;
|
||||
}
|
||||
return 0;
|
||||
|
|
|
@ -81,7 +81,9 @@ config MIPS_COBALT
|
|||
config MACH_DECSTATION
|
||||
bool "DECstations"
|
||||
select BOOT_ELF32
|
||||
select CEVT_DS1287
|
||||
select CEVT_R4K
|
||||
select CSRC_IOASIC
|
||||
select CSRC_R4K
|
||||
select CPU_DADDI_WORKAROUNDS if 64BIT
|
||||
select CPU_R4000_WORKAROUNDS if 64BIT
|
||||
|
@ -221,6 +223,7 @@ config MIPS_MALTA
|
|||
select DMA_NONCOHERENT
|
||||
select GENERIC_ISA_DMA
|
||||
select IRQ_CPU
|
||||
select IRQ_GIC
|
||||
select HW_HAS_PCI
|
||||
select I8253
|
||||
select I8259
|
||||
|
@ -309,12 +312,12 @@ config MACH_VR41XX
|
|||
select GENERIC_HARDIRQS_NO__DO_IRQ
|
||||
|
||||
config PNX8550_JBS
|
||||
bool "Philips PNX8550 based JBS board"
|
||||
bool "NXP PNX8550 based JBS board"
|
||||
select PNX8550
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
|
||||
config PNX8550_STB810
|
||||
bool "Philips PNX8550 based STB810 board"
|
||||
bool "NXP PNX8550 based STB810 board"
|
||||
select PNX8550
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
|
||||
|
@ -612,6 +615,7 @@ config TOSHIBA_JMR3927
|
|||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
select SYS_SUPPORTS_BIG_ENDIAN
|
||||
select GENERIC_HARDIRQS_NO__DO_IRQ
|
||||
select GPIO_TXX9
|
||||
|
||||
config TOSHIBA_RBTX4927
|
||||
bool "Toshiba RBTX49[23]7 board"
|
||||
|
@ -653,7 +657,7 @@ config TOSHIBA_RBTX4938
|
|||
select SYS_SUPPORTS_BIG_ENDIAN
|
||||
select SYS_SUPPORTS_KGDB
|
||||
select GENERIC_HARDIRQS_NO__DO_IRQ
|
||||
select GENERIC_GPIO
|
||||
select GPIO_TXX9
|
||||
help
|
||||
This Toshiba board is based on the TX4938 processor. Say Y here to
|
||||
support this machine type
|
||||
|
@ -767,6 +771,9 @@ config BOOT_RAW
|
|||
config CEVT_BCM1480
|
||||
bool
|
||||
|
||||
config CEVT_DS1287
|
||||
bool
|
||||
|
||||
config CEVT_GT641XX
|
||||
bool
|
||||
|
||||
|
@ -782,12 +789,20 @@ config CEVT_TXX9
|
|||
config CSRC_BCM1480
|
||||
bool
|
||||
|
||||
config CSRC_IOASIC
|
||||
bool
|
||||
|
||||
config CSRC_R4K
|
||||
bool
|
||||
|
||||
config CSRC_SB1250
|
||||
bool
|
||||
|
||||
config GPIO_TXX9
|
||||
select GENERIC_GPIO
|
||||
select HAVE_GPIO_LIB
|
||||
bool
|
||||
|
||||
config CFE
|
||||
bool
|
||||
|
||||
|
@ -840,6 +855,9 @@ config MIPS_NILE4
|
|||
config MIPS_DISABLE_OBSOLETE_IDE
|
||||
bool
|
||||
|
||||
config SYNC_R4K
|
||||
bool
|
||||
|
||||
config NO_IOPORT
|
||||
def_bool n
|
||||
|
||||
|
@ -909,6 +927,9 @@ config IRQ_TXX9
|
|||
config IRQ_GT641XX
|
||||
bool
|
||||
|
||||
config IRQ_GIC
|
||||
bool
|
||||
|
||||
config MIPS_BOARDS_GEN
|
||||
bool
|
||||
|
||||
|
@ -1811,6 +1832,17 @@ config NR_CPUS
|
|||
performance should round up your number of processors to the next
|
||||
power of two.
|
||||
|
||||
config MIPS_CMP
|
||||
bool "MIPS CMP framework support"
|
||||
depends on SMP
|
||||
select SYNC_R4K
|
||||
select SYS_SUPPORTS_SCHED_SMT
|
||||
select WEAK_ORDERING
|
||||
default n
|
||||
help
|
||||
This is a placeholder option for the GCMP work. It will need to
|
||||
be handled differently...
|
||||
|
||||
source "kernel/time/Kconfig"
|
||||
|
||||
#
|
||||
|
|
|
@ -73,14 +73,4 @@ config RUNTIME_DEBUG
|
|||
include/asm-mips/debug.h for debuging macros.
|
||||
If unsure, say N.
|
||||
|
||||
config MIPS_UNCACHED
|
||||
bool "Run uncached"
|
||||
depends on DEBUG_KERNEL && !SMP && !SGI_IP27
|
||||
help
|
||||
If you say Y here there kernel will disable all CPU caches. This will
|
||||
reduce the system's performance dramatically but can help finding
|
||||
otherwise hard to track bugs. It can also useful if you're doing
|
||||
hardware debugging with a logic analyzer and need to see all traffic
|
||||
on the bus.
|
||||
|
||||
endmenu
|
||||
|
|
|
@ -410,21 +410,21 @@ load-$(CONFIG_CASIO_E55) += 0xffffffff80004000
|
|||
load-$(CONFIG_TANBAC_TB022X) += 0xffffffff80000000
|
||||
|
||||
#
|
||||
# Common Philips PNX8550
|
||||
# Common NXP PNX8550
|
||||
#
|
||||
core-$(CONFIG_SOC_PNX8550) += arch/mips/philips/pnx8550/common/
|
||||
core-$(CONFIG_SOC_PNX8550) += arch/mips/nxp/pnx8550/common/
|
||||
cflags-$(CONFIG_SOC_PNX8550) += -Iinclude/asm-mips/mach-pnx8550
|
||||
|
||||
#
|
||||
# Philips PNX8550 JBS board
|
||||
# NXP PNX8550 JBS board
|
||||
#
|
||||
libs-$(CONFIG_PNX8550_JBS) += arch/mips/philips/pnx8550/jbs/
|
||||
libs-$(CONFIG_PNX8550_JBS) += arch/mips/nxp/pnx8550/jbs/
|
||||
#cflags-$(CONFIG_PNX8550_JBS) += -Iinclude/asm-mips/mach-pnx8550
|
||||
load-$(CONFIG_PNX8550_JBS) += 0xffffffff80060000
|
||||
|
||||
# Philips PNX8550 STB810 board
|
||||
# NXP PNX8550 STB810 board
|
||||
#
|
||||
libs-$(CONFIG_PNX8550_STB810) += arch/mips/philips/pnx8550/stb810/
|
||||
libs-$(CONFIG_PNX8550_STB810) += arch/mips/nxp/pnx8550/stb810/
|
||||
load-$(CONFIG_PNX8550_STB810) += 0xffffffff80060000
|
||||
|
||||
# NEC EMMA2RH boards
|
||||
|
|
|
@ -11,10 +11,7 @@
|
|||
* as published by the Free Software Foundation; either version
|
||||
* 2 of the License, or (at your option) any later version.
|
||||
*/
|
||||
#include <linux/string.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/threads.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/mach-au1x00/au1000.h>
|
||||
|
||||
struct cpu_spec* cur_cpu_spec[NR_CPUS];
|
||||
|
|
|
@ -31,18 +31,12 @@
|
|||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/module.h>
|
||||
#include <asm/mach-au1x00/au1000.h>
|
||||
#include <asm/mach-au1x00/au1xxx_dbdma.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
|
||||
#if defined(CONFIG_SOC_AU1550) || defined(CONFIG_SOC_AU1200)
|
||||
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
|
||||
#include <asm/io.h>
|
||||
#include <asm/mach-au1x00/au1000.h>
|
||||
|
||||
#ifdef CONFIG_KGDB
|
||||
|
@ -55,8 +54,7 @@ typedef unsigned int uint32;
|
|||
#define UART16550_READ(y) (au_readl(DEBUG_BASE + y) & 0xff)
|
||||
#define UART16550_WRITE(y, z) (au_writel(z&0xff, DEBUG_BASE + y))
|
||||
|
||||
extern unsigned long get_au1x00_uart_baud_base(void);
|
||||
extern unsigned long cal_r4koff(void);
|
||||
extern unsigned long calc_clock(void);
|
||||
|
||||
void debugInit(uint32 baud, uint8 data, uint8 parity, uint8 stop)
|
||||
{
|
||||
|
@ -64,7 +62,7 @@ void debugInit(uint32 baud, uint8 data, uint8 parity, uint8 stop)
|
|||
if (UART16550_READ(UART_MOD_CNTRL) != 0x3) {
|
||||
UART16550_WRITE(UART_MOD_CNTRL, 3);
|
||||
}
|
||||
cal_r4koff();
|
||||
calc_clock();
|
||||
|
||||
/* disable interrupts */
|
||||
UART16550_WRITE(UART_IER, 0);
|
||||
|
|
|
@ -33,12 +33,9 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
#include <asm/mach-au1x00/au1000.h>
|
||||
#include <asm/mach-au1x00/au1000_dma.h>
|
||||
|
||||
|
|
|
@ -27,13 +27,8 @@
|
|||
* others have a second one : GPIO2
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <asm/addrspace.h>
|
||||
|
||||
#include <asm/mach-au1x00/au1000.h>
|
||||
#include <asm/gpio.h>
|
||||
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
/*
|
||||
* Copyright 2001 MontaVista Software Inc.
|
||||
* Author: MontaVista Software, Inc.
|
||||
* ppopov@mvista.com or source@mvista.com
|
||||
* Copyright 2001, 2007-2008 MontaVista Software Inc.
|
||||
* Author: MontaVista Software, Inc. <source@mvista.com>
|
||||
*
|
||||
* Copyright (C) 2007 Ralf Baechle (ralf@linux-mips.org)
|
||||
*
|
||||
|
@ -27,7 +26,6 @@
|
|||
*/
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
|
||||
|
@ -591,7 +589,7 @@ void __init arch_init_irq(void)
|
|||
imp++;
|
||||
}
|
||||
|
||||
set_c0_status(ALLINTS);
|
||||
set_c0_status(IE_IRQ0 | IE_IRQ1 | IE_IRQ2 | IE_IRQ3 | IE_IRQ4);
|
||||
|
||||
/* Board specific IRQ initialization.
|
||||
*/
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
#include <linux/types.h>
|
||||
|
||||
#include <linux/pci.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
|
|
|
@ -3,18 +3,65 @@
|
|||
*
|
||||
* Copyright 2004, Matt Porter <mporter@kernel.crashing.org>
|
||||
*
|
||||
* (C) Copyright Embedded Alley Solutions, Inc 2005
|
||||
* Author: Pantelis Antoniou <pantelis@embeddedalley.com>
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
#include <linux/device.h>
|
||||
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/serial_8250.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/resource.h>
|
||||
|
||||
#include <asm/mach-au1x00/au1xxx.h>
|
||||
|
||||
#define PORT(_base, _irq) \
|
||||
{ \
|
||||
.iobase = _base, \
|
||||
.membase = (void __iomem *)_base,\
|
||||
.mapbase = CPHYSADDR(_base), \
|
||||
.irq = _irq, \
|
||||
.regshift = 2, \
|
||||
.iotype = UPIO_AU, \
|
||||
.flags = UPF_SKIP_TEST \
|
||||
}
|
||||
|
||||
static struct plat_serial8250_port au1x00_uart_data[] = {
|
||||
#if defined(CONFIG_SERIAL_8250_AU1X00)
|
||||
#if defined(CONFIG_SOC_AU1000)
|
||||
PORT(UART0_ADDR, AU1000_UART0_INT),
|
||||
PORT(UART1_ADDR, AU1000_UART1_INT),
|
||||
PORT(UART2_ADDR, AU1000_UART2_INT),
|
||||
PORT(UART3_ADDR, AU1000_UART3_INT),
|
||||
#elif defined(CONFIG_SOC_AU1500)
|
||||
PORT(UART0_ADDR, AU1500_UART0_INT),
|
||||
PORT(UART3_ADDR, AU1500_UART3_INT),
|
||||
#elif defined(CONFIG_SOC_AU1100)
|
||||
PORT(UART0_ADDR, AU1100_UART0_INT),
|
||||
PORT(UART1_ADDR, AU1100_UART1_INT),
|
||||
PORT(UART3_ADDR, AU1100_UART3_INT),
|
||||
#elif defined(CONFIG_SOC_AU1550)
|
||||
PORT(UART0_ADDR, AU1550_UART0_INT),
|
||||
PORT(UART1_ADDR, AU1550_UART1_INT),
|
||||
PORT(UART3_ADDR, AU1550_UART3_INT),
|
||||
#elif defined(CONFIG_SOC_AU1200)
|
||||
PORT(UART0_ADDR, AU1200_UART0_INT),
|
||||
PORT(UART1_ADDR, AU1200_UART1_INT),
|
||||
#endif
|
||||
#endif /* CONFIG_SERIAL_8250_AU1X00 */
|
||||
{ },
|
||||
};
|
||||
|
||||
static struct platform_device au1xx0_uart_device = {
|
||||
.name = "serial8250",
|
||||
.id = PLAT8250_DEV_AU1X00,
|
||||
.dev = {
|
||||
.platform_data = au1x00_uart_data,
|
||||
},
|
||||
};
|
||||
|
||||
/* OHCI (USB full speed host controller) */
|
||||
static struct resource au1xxx_usb_ohci_resources[] = {
|
||||
[0] = {
|
||||
|
@ -186,19 +233,6 @@ static struct resource au1200_lcd_resources[] = {
|
|||
}
|
||||
};
|
||||
|
||||
static struct resource au1200_ide0_resources[] = {
|
||||
[0] = {
|
||||
.start = AU1XXX_ATA_PHYS_ADDR,
|
||||
.end = AU1XXX_ATA_PHYS_ADDR + AU1XXX_ATA_PHYS_LEN - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = AU1XXX_ATA_INT,
|
||||
.end = AU1XXX_ATA_INT,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
}
|
||||
};
|
||||
|
||||
static u64 au1200_lcd_dmamask = ~(u32)0;
|
||||
|
||||
static struct platform_device au1200_lcd_device = {
|
||||
|
@ -212,20 +246,6 @@ static struct platform_device au1200_lcd_device = {
|
|||
.resource = au1200_lcd_resources,
|
||||
};
|
||||
|
||||
|
||||
static u64 ide0_dmamask = ~(u32)0;
|
||||
|
||||
static struct platform_device au1200_ide0_device = {
|
||||
.name = "au1200-ide",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.dma_mask = &ide0_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(au1200_ide0_resources),
|
||||
.resource = au1200_ide0_resources,
|
||||
};
|
||||
|
||||
static u64 au1xxx_mmc_dmamask = ~(u32)0;
|
||||
|
||||
static struct platform_device au1xxx_mmc_device = {
|
||||
|
@ -245,31 +265,6 @@ static struct platform_device au1x00_pcmcia_device = {
|
|||
.id = 0,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_MIPS_DB1200
|
||||
|
||||
static struct resource smc91x_resources[] = {
|
||||
[0] = {
|
||||
.name = "smc91x-regs",
|
||||
.start = AU1XXX_SMC91111_PHYS_ADDR,
|
||||
.end = AU1XXX_SMC91111_PHYS_ADDR + 0xfffff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = AU1XXX_SMC91111_IRQ,
|
||||
.end = AU1XXX_SMC91111_IRQ,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device smc91x_device = {
|
||||
.name = "smc91x",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(smc91x_resources),
|
||||
.resource = smc91x_resources,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
/* All Alchemy demoboards with I2C have this #define in their headers */
|
||||
#ifdef SMBUS_PSC_BASE
|
||||
static struct resource pbdb_smbus_resources[] = {
|
||||
|
@ -289,6 +284,7 @@ static struct platform_device pbdb_smbus_device = {
|
|||
#endif
|
||||
|
||||
static struct platform_device *au1xxx_platform_devices[] __initdata = {
|
||||
&au1xx0_uart_device,
|
||||
&au1xxx_usb_ohci_device,
|
||||
&au1x00_pcmcia_device,
|
||||
#ifdef CONFIG_FB_AU1100
|
||||
|
@ -299,12 +295,8 @@ static struct platform_device *au1xxx_platform_devices[] __initdata = {
|
|||
&au1xxx_usb_gdt_device,
|
||||
&au1xxx_usb_otg_device,
|
||||
&au1200_lcd_device,
|
||||
&au1200_ide0_device,
|
||||
&au1xxx_mmc_device,
|
||||
#endif
|
||||
#ifdef CONFIG_MIPS_DB1200
|
||||
&smc91x_device,
|
||||
#endif
|
||||
#ifdef SMBUS_PSC_BASE
|
||||
&pbdb_smbus_device,
|
||||
#endif
|
||||
|
@ -312,6 +304,13 @@ static struct platform_device *au1xxx_platform_devices[] __initdata = {
|
|||
|
||||
int __init au1xxx_platform_init(void)
|
||||
{
|
||||
unsigned int uartclk = get_au1x00_uart_baud_base() * 16;
|
||||
int i;
|
||||
|
||||
/* Fill up uartclk. */
|
||||
for (i = 0; au1x00_uart_data[i].flags ; i++)
|
||||
au1x00_uart_data[i].uartclk = uartclk;
|
||||
|
||||
return platform_add_devices(au1xxx_platform_devices, ARRAY_SIZE(au1xxx_platform_devices));
|
||||
}
|
||||
|
||||
|
|
|
@ -29,17 +29,14 @@
|
|||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/pm_legacy.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/sysctl.h>
|
||||
#include <linux/jiffies.h>
|
||||
|
||||
#include <asm/string.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/mach-au1x00/au1000.h>
|
||||
|
||||
|
@ -47,17 +44,13 @@
|
|||
|
||||
#define DEBUG 1
|
||||
#ifdef DEBUG
|
||||
# define DPRINTK(fmt, args...) printk("%s: " fmt, __FUNCTION__ , ## args)
|
||||
# define DPRINTK(fmt, args...) printk("%s: " fmt, __func__, ## args)
|
||||
#else
|
||||
# define DPRINTK(fmt, args...)
|
||||
#endif
|
||||
|
||||
static void au1000_calibrate_delay(void);
|
||||
|
||||
extern void set_au1x00_speed(unsigned int new_freq);
|
||||
extern unsigned int get_au1x00_speed(void);
|
||||
extern unsigned long get_au1x00_uart_baud_base(void);
|
||||
extern void set_au1x00_uart_baud_base(unsigned long new_baud_base);
|
||||
extern unsigned long save_local_and_disable(int controller);
|
||||
extern void restore_local_and_enable(int controller, unsigned long mask);
|
||||
extern void local_enable_irq(unsigned int irq_nr);
|
||||
|
|
|
@ -33,8 +33,8 @@
|
|||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
|
|
|
@ -28,7 +28,6 @@
|
|||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <asm/mach-au1x00/au1000.h>
|
||||
|
||||
#define SERIAL_BASE UART_BASE
|
||||
|
|
|
@ -27,13 +27,7 @@
|
|||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
#include <linux/sched.h>
|
||||
#include <linux/mm.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/reboot.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
#include <asm/mach-au1x00/au1000.h>
|
||||
|
||||
extern int au_sleep(void);
|
||||
|
|
|
@ -25,21 +25,14 @@
|
|||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/pm.h>
|
||||
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/reboot.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/time.h>
|
||||
|
||||
#include <au1000.h>
|
||||
|
@ -49,8 +42,6 @@ extern void __init board_setup(void);
|
|||
extern void au1000_restart(char *);
|
||||
extern void au1000_halt(void);
|
||||
extern void au1000_power_off(void);
|
||||
extern void au1x_time_init(void);
|
||||
extern void au1x_timer_setup(struct irqaction *irq);
|
||||
extern void set_cpuspec(void);
|
||||
|
||||
void __init plat_mem_setup(void)
|
||||
|
|
|
@ -9,9 +9,9 @@
|
|||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*/
|
||||
|
||||
#include <asm/asm.h>
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/addrspace.h>
|
||||
#include <asm/regdef.h>
|
||||
#include <asm/stackframe.h>
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
*
|
||||
* Copyright (C) 2001 MontaVista Software, ppopov@mvista.com
|
||||
* Copyright (C) 2001, 2006, 2008 MontaVista Software, <source@mvista.com>
|
||||
* Copied and modified Carsten Langgaard's time.c
|
||||
*
|
||||
* Carsten Langgaard, carstenl@mips.com
|
||||
|
@ -34,23 +34,13 @@
|
|||
|
||||
#include <linux/types.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel_stat.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/hardirq.h>
|
||||
|
||||
#include <asm/compiler.h>
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/time.h>
|
||||
#include <asm/div64.h>
|
||||
#include <asm/mach-au1x00/au1000.h>
|
||||
|
||||
#include <linux/mc146818rtc.h>
|
||||
#include <linux/timex.h>
|
||||
|
||||
static unsigned long r4k_offset; /* Amount to increment compare reg each time */
|
||||
static unsigned long r4k_cur; /* What counter should be at next timer irq */
|
||||
int no_au1xxx_32khz;
|
||||
static int no_au1xxx_32khz;
|
||||
extern int allow_au1k_wait; /* default off for CP0 Counter */
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
@ -184,7 +174,7 @@ wakeup_counter0_set(int ticks)
|
|||
* "wait" is enabled, and we need to detect if the 32KHz isn't present
|
||||
* but requested......got it? :-) -- Dan
|
||||
*/
|
||||
unsigned long cal_r4koff(void)
|
||||
unsigned long calc_clock(void)
|
||||
{
|
||||
unsigned long cpu_speed;
|
||||
unsigned long flags;
|
||||
|
@ -229,19 +219,13 @@ unsigned long cal_r4koff(void)
|
|||
// Equation: Baudrate = CPU / (SD * 2 * CLKDIV * 16)
|
||||
set_au1x00_uart_baud_base(cpu_speed / (2 * ((int)(au_readl(SYS_POWERCTRL)&0x03) + 2) * 16));
|
||||
spin_unlock_irqrestore(&time_lock, flags);
|
||||
return (cpu_speed / HZ);
|
||||
return cpu_speed;
|
||||
}
|
||||
|
||||
void __init plat_time_init(void)
|
||||
{
|
||||
unsigned int est_freq;
|
||||
unsigned int est_freq = calc_clock();
|
||||
|
||||
printk("calculating r4koff... ");
|
||||
r4k_offset = cal_r4koff();
|
||||
printk("%08lx(%d)\n", r4k_offset, (int) r4k_offset);
|
||||
|
||||
//est_freq = 2*r4k_offset*HZ;
|
||||
est_freq = r4k_offset*HZ;
|
||||
est_freq += 5000; /* round */
|
||||
est_freq -= est_freq%10000;
|
||||
printk("CPU frequency %d.%02d MHz\n", est_freq/1000000,
|
||||
|
@ -249,9 +233,6 @@ void __init plat_time_init(void)
|
|||
set_au1x00_speed(est_freq);
|
||||
set_au1x00_lcd_clock(); // program the LCD clock
|
||||
|
||||
r4k_cur = (read_c0_count() + r4k_offset);
|
||||
write_c0_compare(r4k_cur);
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
/*
|
||||
* setup counter 0, since it keeps ticking after a
|
||||
|
@ -265,12 +246,8 @@ void __init plat_time_init(void)
|
|||
* Check to ensure we really have a 32KHz oscillator before
|
||||
* we do this.
|
||||
*/
|
||||
if (no_au1xxx_32khz) {
|
||||
if (no_au1xxx_32khz)
|
||||
printk("WARNING: no 32KHz clock found.\n");
|
||||
|
||||
/* Ensure we get CPO_COUNTER interrupts. */
|
||||
set_c0_status(IE_IRQ5);
|
||||
}
|
||||
else {
|
||||
while (au_readl(SYS_COUNTER_CNTRL) & SYS_CNTRL_C0S);
|
||||
au_writel(0, SYS_TOYWRITE);
|
||||
|
|
|
@ -27,20 +27,9 @@
|
|||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/mc146818rtc.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/reboot.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/mach-au1x00/au1000.h>
|
||||
#include <asm/mach-db1x00/db1x00.h>
|
||||
|
||||
|
|
|
@ -28,13 +28,8 @@
|
|||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include <asm/addrspace.h>
|
||||
#include <asm/bootinfo.h>
|
||||
|
||||
#include <prom.h>
|
||||
|
|
|
@ -25,26 +25,9 @@
|
|||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
#include <linux/errno.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/kernel_stat.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/timex.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/random.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/bitops.h>
|
||||
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/system.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/mach-au1x00/au1000.h>
|
||||
|
||||
#ifdef CONFIG_MIPS_DB1500
|
||||
|
|
|
@ -28,19 +28,9 @@
|
|||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/reboot.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/mach-au1x00/au1000.h>
|
||||
|
||||
extern int (*board_pci_idsel)(unsigned int devsel, int assert);
|
||||
|
|
|
@ -28,14 +28,10 @@
|
|||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
#include <linux/string.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/bootmem.h>
|
||||
|
||||
#include <asm/addrspace.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/bootinfo.h>
|
||||
|
||||
#include <prom.h>
|
||||
|
|
|
@ -25,26 +25,9 @@
|
|||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
#include <linux/errno.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/kernel_stat.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/timex.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/random.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/bitops.h>
|
||||
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/system.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/mach-au1x00/au1000.h>
|
||||
|
||||
char irq_tab_alchemy[][5] __initdata = {
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/gpio_keys.h>
|
||||
|
|
|
@ -23,19 +23,10 @@
|
|||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/reboot.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/mach-au1x00/au1000.h>
|
||||
#include <asm/mach-pb1x00/pb1000.h>
|
||||
|
||||
|
|
|
@ -26,14 +26,10 @@
|
|||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include <asm/addrspace.h>
|
||||
#include <asm/bootinfo.h>
|
||||
|
||||
#include <prom.h>
|
||||
|
|
|
@ -25,26 +25,10 @@
|
|||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
#include <linux/errno.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/kernel_stat.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/timex.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/random.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/bitops.h>
|
||||
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/system.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
#include <asm/mach-au1x00/au1000.h>
|
||||
|
||||
struct au1xxx_irqmap __initdata au1xxx_irq_map[] = {
|
||||
|
|
|
@ -23,19 +23,10 @@
|
|||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/reboot.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/mach-au1x00/au1000.h>
|
||||
#include <asm/mach-pb1x00/pb1100.h>
|
||||
|
||||
|
|
|
@ -27,14 +27,10 @@
|
|||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include <asm/addrspace.h>
|
||||
#include <asm/bootinfo.h>
|
||||
|
||||
#include <prom.h>
|
||||
|
|
|
@ -25,26 +25,9 @@
|
|||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
#include <linux/errno.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/kernel_stat.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/timex.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/random.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/bitops.h>
|
||||
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/system.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/mach-au1x00/au1000.h>
|
||||
|
||||
struct au1xxx_irqmap __initdata au1xxx_irq_map[] = {
|
||||
|
|
|
@ -3,5 +3,6 @@
|
|||
#
|
||||
|
||||
lib-y := init.o board_setup.o irqmap.o
|
||||
obj-y += platform.o
|
||||
|
||||
EXTRA_CFLAGS += -Werror
|
||||
|
|
|
@ -23,27 +23,11 @@
|
|||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/mc146818rtc.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#if defined(CONFIG_BLK_DEV_IDE_AU1XXX)
|
||||
#include <linux/ide.h>
|
||||
#endif
|
||||
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/reboot.h>
|
||||
#include <asm/pgtable.h>
|
||||
|
||||
#include <au1000.h>
|
||||
#include <au1xxx_dbdma.h>
|
||||
#include <prom.h>
|
||||
|
||||
#ifdef CONFIG_MIPS_PB1200
|
||||
|
@ -52,8 +36,6 @@
|
|||
|
||||
#ifdef CONFIG_MIPS_DB1200
|
||||
#include <asm/mach-db1x00/db1200.h>
|
||||
#define PB1200_ETH_INT DB1200_ETH_INT
|
||||
#define PB1200_IDE_INT DB1200_IDE_INT
|
||||
#endif
|
||||
|
||||
extern void _board_init_irq(void);
|
||||
|
|
|
@ -27,14 +27,10 @@
|
|||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include <asm/addrspace.h>
|
||||
#include <asm/bootinfo.h>
|
||||
|
||||
#include <prom.h>
|
||||
|
|
|
@ -22,26 +22,10 @@
|
|||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
#include <linux/errno.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/kernel_stat.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/timex.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/random.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/bitops.h>
|
||||
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/system.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
#include <asm/mach-au1x00/au1000.h>
|
||||
|
||||
#ifdef CONFIG_MIPS_PB1200
|
||||
|
|
|
@ -0,0 +1,84 @@
|
|||
/*
|
||||
* Pb1200/DBAu1200 board platform device registration
|
||||
*
|
||||
* Copyright (C) 2008 MontaVista Software Inc. <source@mvista.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <asm/mach-au1x00/au1xxx.h>
|
||||
|
||||
static struct resource ide_resources[] = {
|
||||
[0] = {
|
||||
.start = IDE_PHYS_ADDR,
|
||||
.end = IDE_PHYS_ADDR + IDE_PHYS_LEN - 1,
|
||||
.flags = IORESOURCE_MEM
|
||||
},
|
||||
[1] = {
|
||||
.start = IDE_INT,
|
||||
.end = IDE_INT,
|
||||
.flags = IORESOURCE_IRQ
|
||||
}
|
||||
};
|
||||
|
||||
static u64 ide_dmamask = ~(u32)0;
|
||||
|
||||
static struct platform_device ide_device = {
|
||||
.name = "au1200-ide",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.dma_mask = &ide_dmamask,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(ide_resources),
|
||||
.resource = ide_resources
|
||||
};
|
||||
|
||||
static struct resource smc91c111_resources[] = {
|
||||
[0] = {
|
||||
.name = "smc91x-regs",
|
||||
.start = SMC91C111_PHYS_ADDR,
|
||||
.end = SMC91C111_PHYS_ADDR + 0xf,
|
||||
.flags = IORESOURCE_MEM
|
||||
},
|
||||
[1] = {
|
||||
.start = SMC91C111_INT,
|
||||
.end = SMC91C111_INT,
|
||||
.flags = IORESOURCE_IRQ
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device smc91c111_device = {
|
||||
.name = "smc91x",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(smc91c111_resources),
|
||||
.resource = smc91c111_resources
|
||||
};
|
||||
|
||||
static struct platform_device *board_platform_devices[] __initdata = {
|
||||
&ide_device,
|
||||
&smc91c111_device
|
||||
};
|
||||
|
||||
static int __init board_register_devices(void)
|
||||
{
|
||||
return platform_add_devices(board_platform_devices,
|
||||
ARRAY_SIZE(board_platform_devices));
|
||||
}
|
||||
|
||||
arch_initcall(board_register_devices);
|
|
@ -23,19 +23,10 @@
|
|||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/reboot.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/mach-au1x00/au1000.h>
|
||||
#include <asm/mach-pb1x00/pb1500.h>
|
||||
|
||||
|
|
|
@ -27,14 +27,10 @@
|
|||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include <asm/addrspace.h>
|
||||
#include <asm/bootinfo.h>
|
||||
|
||||
#include <prom.h>
|
||||
|
|
|
@ -25,26 +25,9 @@
|
|||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
#include <linux/errno.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/kernel_stat.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/timex.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/random.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/bitops.h>
|
||||
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/system.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/mach-au1x00/au1000.h>
|
||||
|
||||
char irq_tab_alchemy[][5] __initdata = {
|
||||
|
|
|
@ -27,20 +27,9 @@
|
|||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/mc146818rtc.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/reboot.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/mach-au1x00/au1000.h>
|
||||
#include <asm/mach-pb1x00/pb1550.h>
|
||||
|
||||
|
|
|
@ -27,14 +27,10 @@
|
|||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include <asm/addrspace.h>
|
||||
#include <asm/bootinfo.h>
|
||||
|
||||
#include <prom.h>
|
||||
|
|
|
@ -25,26 +25,9 @@
|
|||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
#include <linux/errno.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/kernel_stat.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/timex.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/random.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/bitops.h>
|
||||
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/system.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/mach-au1x00/au1000.h>
|
||||
|
||||
char irq_tab_alchemy[][5] __initdata = {
|
||||
|
|
|
@ -23,19 +23,10 @@
|
|||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/reboot.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/mach-au1x00/au1000.h>
|
||||
|
||||
void board_reset(void)
|
||||
|
|
|
@ -26,14 +26,10 @@
|
|||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#include <asm/addrspace.h>
|
||||
#include <asm/bootinfo.h>
|
||||
|
||||
#include <prom.h>
|
||||
|
|
|
@ -25,26 +25,9 @@
|
|||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
#include <linux/errno.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/kernel_stat.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/timex.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/random.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/bitops.h>
|
||||
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/system.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/mach-au1x00/au1000.h>
|
||||
|
||||
struct au1xxx_irqmap __initdata au1xxx_irq_map[] = {
|
||||
|
|
|
@ -641,7 +641,6 @@ CONFIG_CROSSCOMPILE=y
|
|||
CONFIG_CMDLINE="nfsroot=192.168.192.169:/u1/mipsel,timeo=20 ip=dhcp"
|
||||
# CONFIG_DEBUG_STACK_USAGE is not set
|
||||
# CONFIG_RUNTIME_DEBUG is not set
|
||||
# CONFIG_MIPS_UNCACHED is not set
|
||||
|
||||
#
|
||||
# Security options
|
||||
|
|
|
@ -1223,7 +1223,6 @@ CONFIG_CMDLINE="console=ttyS1,38400n8 kgdb=ttyS0 root=/dev/nfs ip=bootp"
|
|||
# CONFIG_KGDB is not set
|
||||
CONFIG_SYS_SUPPORTS_KGDB=y
|
||||
# CONFIG_RUNTIME_DEBUG is not set
|
||||
# CONFIG_MIPS_UNCACHED is not set
|
||||
|
||||
#
|
||||
# Security options
|
||||
|
|
|
@ -1213,7 +1213,6 @@ CONFIG_CMDLINE="console=ttyS1,38400n8 kgdb=ttyS0 root=/dev/nfs ip=bootp"
|
|||
# CONFIG_KGDB is not set
|
||||
CONFIG_SYS_SUPPORTS_KGDB=y
|
||||
# CONFIG_RUNTIME_DEBUG is not set
|
||||
# CONFIG_MIPS_UNCACHED is not set
|
||||
|
||||
#
|
||||
# Security options
|
||||
|
|
|
@ -9,30 +9,15 @@
|
|||
*
|
||||
*/
|
||||
#include <linux/bcd.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mc146818rtc.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/param.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#include <asm/bootinfo.h>
|
||||
#include <asm/cpu.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/cpu-features.h>
|
||||
#include <asm/ds1287.h>
|
||||
#include <asm/time.h>
|
||||
|
||||
#include <asm/dec/interrupts.h>
|
||||
#include <asm/dec/ioasic.h>
|
||||
#include <asm/dec/ioasic_addrs.h>
|
||||
#include <asm/dec/machtype.h>
|
||||
|
||||
unsigned long read_persistent_clock(void)
|
||||
|
@ -139,42 +124,32 @@ int rtc_mips_set_mmss(unsigned long nowtime)
|
|||
return retval;
|
||||
}
|
||||
|
||||
static int dec_timer_state(void)
|
||||
{
|
||||
return (CMOS_READ(RTC_REG_C) & RTC_PF) != 0;
|
||||
}
|
||||
|
||||
static void dec_timer_ack(void)
|
||||
{
|
||||
CMOS_READ(RTC_REG_C); /* Ack the RTC interrupt. */
|
||||
}
|
||||
|
||||
static cycle_t dec_ioasic_hpt_read(void)
|
||||
{
|
||||
/*
|
||||
* The free-running counter is 32-bit which is good for about
|
||||
* 2 minutes, 50 seconds at possible count rates of up to 25MHz.
|
||||
*/
|
||||
return ioasic_read(IO_REG_FCTR);
|
||||
}
|
||||
|
||||
|
||||
void __init plat_time_init(void)
|
||||
{
|
||||
mips_timer_ack = dec_timer_ack;
|
||||
u32 start, end;
|
||||
int i = HZ / 10;
|
||||
|
||||
if (!cpu_has_counter && IOASIC)
|
||||
/* Set up the rate of periodic DS1287 interrupts. */
|
||||
ds1287_set_base_clock(HZ);
|
||||
|
||||
if (cpu_has_counter) {
|
||||
while (!ds1287_timer_state())
|
||||
;
|
||||
|
||||
start = read_c0_count();
|
||||
|
||||
while (i--)
|
||||
while (!ds1287_timer_state())
|
||||
;
|
||||
|
||||
end = read_c0_count();
|
||||
|
||||
mips_hpt_frequency = (end - start) * 10;
|
||||
printk(KERN_INFO "MIPS counter frequency %dHz\n",
|
||||
mips_hpt_frequency);
|
||||
} else if (IOASIC)
|
||||
/* For pre-R4k systems we use the I/O ASIC's counter. */
|
||||
clocksource_mips.read = dec_ioasic_hpt_read;
|
||||
dec_ioasic_clocksource_init();
|
||||
|
||||
/* Set up the rate of periodic DS1287 interrupts. */
|
||||
CMOS_WRITE(RTC_REF_CLCK_32KHZ | (16 - __ffs(HZ)), RTC_REG_A);
|
||||
}
|
||||
|
||||
void __init plat_timer_setup(struct irqaction *irq)
|
||||
{
|
||||
setup_irq(dec_interrupt[DEC_IRQ_RTC], irq);
|
||||
|
||||
/* Enable periodic DS1287 interrupts. */
|
||||
CMOS_WRITE(CMOS_READ(RTC_REG_B) | RTC_PIE, RTC_REG_B);
|
||||
ds1287_clockevent_init(dec_interrupt[DEC_IRQ_RTC]);
|
||||
}
|
||||
|
|
|
@ -36,11 +36,13 @@
|
|||
#include <linux/pm.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/gpio.h>
|
||||
#ifdef CONFIG_SERIAL_TXX9
|
||||
#include <linux/serial_core.h>
|
||||
#endif
|
||||
|
||||
#include <asm/txx9tmr.h>
|
||||
#include <asm/txx9pio.h>
|
||||
#include <asm/reboot.h>
|
||||
#include <asm/jmr3927/jmr3927.h>
|
||||
#include <asm/mipsregs.h>
|
||||
|
@ -340,9 +342,12 @@ static void __init tx3927_setup(void)
|
|||
|
||||
/* PIO */
|
||||
/* PIO[15:12] connected to LEDs */
|
||||
tx3927_pioptr->dir = 0x0000f000;
|
||||
tx3927_pioptr->maskcpu = 0;
|
||||
tx3927_pioptr->maskext = 0;
|
||||
__raw_writel(0x0000f000, &tx3927_pioptr->dir);
|
||||
__raw_writel(0, &tx3927_pioptr->maskcpu);
|
||||
__raw_writel(0, &tx3927_pioptr->maskext);
|
||||
txx9_gpio_init(TX3927_PIO_REG, 0, 16);
|
||||
gpio_request(11, "dipsw1");
|
||||
gpio_request(10, "dipsw2");
|
||||
{
|
||||
unsigned int conf;
|
||||
|
||||
|
|
|
@ -10,12 +10,15 @@ obj-y += cpu-probe.o branch.o entry.o genex.o irq.o process.o \
|
|||
|
||||
obj-$(CONFIG_CEVT_BCM1480) += cevt-bcm1480.o
|
||||
obj-$(CONFIG_CEVT_R4K) += cevt-r4k.o
|
||||
obj-$(CONFIG_CEVT_DS1287) += cevt-ds1287.o
|
||||
obj-$(CONFIG_CEVT_GT641XX) += cevt-gt641xx.o
|
||||
obj-$(CONFIG_CEVT_SB1250) += cevt-sb1250.o
|
||||
obj-$(CONFIG_CEVT_TXX9) += cevt-txx9.o
|
||||
obj-$(CONFIG_CSRC_BCM1480) += csrc-bcm1480.o
|
||||
obj-$(CONFIG_CSRC_IOASIC) += csrc-ioasic.o
|
||||
obj-$(CONFIG_CSRC_R4K) += csrc-r4k.o
|
||||
obj-$(CONFIG_CSRC_SB1250) += csrc-sb1250.o
|
||||
obj-$(CONFIG_SYNC_R4K) += sync-r4k.o
|
||||
|
||||
binfmt_irix-objs := irixelf.o irixinv.o irixioctl.o irixsig.o \
|
||||
irix5sys.o sysirix.o
|
||||
|
@ -50,6 +53,8 @@ obj-$(CONFIG_MIPS_MT) += mips-mt.o
|
|||
obj-$(CONFIG_MIPS_MT_FPAFF) += mips-mt-fpaff.o
|
||||
obj-$(CONFIG_MIPS_MT_SMTC) += smtc.o smtc-asm.o smtc-proc.o
|
||||
obj-$(CONFIG_MIPS_MT_SMP) += smp-mt.o
|
||||
obj-$(CONFIG_MIPS_CMP) += smp-cmp.o
|
||||
obj-$(CONFIG_CPU_MIPSR2) += spram.o
|
||||
|
||||
obj-$(CONFIG_MIPS_APSP_KSPD) += kspd.o
|
||||
obj-$(CONFIG_MIPS_VPE_LOADER) += vpe.o
|
||||
|
@ -62,6 +67,7 @@ obj-$(CONFIG_IRQ_CPU_RM9K) += irq-rm9000.o
|
|||
obj-$(CONFIG_MIPS_BOARDS_GEN) += irq-msc01.o
|
||||
obj-$(CONFIG_IRQ_TXX9) += irq_txx9.o
|
||||
obj-$(CONFIG_IRQ_GT641XX) += irq-gt641xx.o
|
||||
obj-$(CONFIG_IRQ_GIC) += irq-gic.o
|
||||
|
||||
obj-$(CONFIG_32BIT) += scall32-o32.o
|
||||
obj-$(CONFIG_64BIT) += scall64-64.o
|
||||
|
@ -77,6 +83,8 @@ obj-$(CONFIG_64BIT) += cpu-bugs64.o
|
|||
|
||||
obj-$(CONFIG_I8253) += i8253.o
|
||||
|
||||
obj-$(CONFIG_GPIO_TXX9) += gpio_txx9.o
|
||||
|
||||
obj-$(CONFIG_KEXEC) += machine_kexec.o relocate_kernel.o
|
||||
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
|
||||
|
||||
|
|
|
@ -17,252 +17,252 @@
|
|||
#include <asm/ptrace.h>
|
||||
#include <asm/processor.h>
|
||||
|
||||
#define text(t) __asm__("\n@@@" t)
|
||||
#define text(t) __asm__("\n->#" t)
|
||||
#define _offset(type, member) (&(((type *)NULL)->member))
|
||||
#define offset(string, ptr, member) \
|
||||
__asm__("\n@@@" string "%0" : : "i" (_offset(ptr, member)))
|
||||
__asm__("\n->" string " %0" : : "i" (_offset(ptr, member)))
|
||||
#define constant(string, member) \
|
||||
__asm__("\n@@@" string "%X0" : : "ri" (member))
|
||||
__asm__("\n->" string " %0" : : "ri" (member))
|
||||
#define size(string, size) \
|
||||
__asm__("\n@@@" string "%0" : : "i" (sizeof(size)))
|
||||
__asm__("\n->" string " %0" : : "i" (sizeof(size)))
|
||||
#define linefeed text("")
|
||||
|
||||
void output_ptreg_defines(void)
|
||||
{
|
||||
text("/* MIPS pt_regs offsets. */");
|
||||
offset("#define PT_R0 ", struct pt_regs, regs[0]);
|
||||
offset("#define PT_R1 ", struct pt_regs, regs[1]);
|
||||
offset("#define PT_R2 ", struct pt_regs, regs[2]);
|
||||
offset("#define PT_R3 ", struct pt_regs, regs[3]);
|
||||
offset("#define PT_R4 ", struct pt_regs, regs[4]);
|
||||
offset("#define PT_R5 ", struct pt_regs, regs[5]);
|
||||
offset("#define PT_R6 ", struct pt_regs, regs[6]);
|
||||
offset("#define PT_R7 ", struct pt_regs, regs[7]);
|
||||
offset("#define PT_R8 ", struct pt_regs, regs[8]);
|
||||
offset("#define PT_R9 ", struct pt_regs, regs[9]);
|
||||
offset("#define PT_R10 ", struct pt_regs, regs[10]);
|
||||
offset("#define PT_R11 ", struct pt_regs, regs[11]);
|
||||
offset("#define PT_R12 ", struct pt_regs, regs[12]);
|
||||
offset("#define PT_R13 ", struct pt_regs, regs[13]);
|
||||
offset("#define PT_R14 ", struct pt_regs, regs[14]);
|
||||
offset("#define PT_R15 ", struct pt_regs, regs[15]);
|
||||
offset("#define PT_R16 ", struct pt_regs, regs[16]);
|
||||
offset("#define PT_R17 ", struct pt_regs, regs[17]);
|
||||
offset("#define PT_R18 ", struct pt_regs, regs[18]);
|
||||
offset("#define PT_R19 ", struct pt_regs, regs[19]);
|
||||
offset("#define PT_R20 ", struct pt_regs, regs[20]);
|
||||
offset("#define PT_R21 ", struct pt_regs, regs[21]);
|
||||
offset("#define PT_R22 ", struct pt_regs, regs[22]);
|
||||
offset("#define PT_R23 ", struct pt_regs, regs[23]);
|
||||
offset("#define PT_R24 ", struct pt_regs, regs[24]);
|
||||
offset("#define PT_R25 ", struct pt_regs, regs[25]);
|
||||
offset("#define PT_R26 ", struct pt_regs, regs[26]);
|
||||
offset("#define PT_R27 ", struct pt_regs, regs[27]);
|
||||
offset("#define PT_R28 ", struct pt_regs, regs[28]);
|
||||
offset("#define PT_R29 ", struct pt_regs, regs[29]);
|
||||
offset("#define PT_R30 ", struct pt_regs, regs[30]);
|
||||
offset("#define PT_R31 ", struct pt_regs, regs[31]);
|
||||
offset("#define PT_LO ", struct pt_regs, lo);
|
||||
offset("#define PT_HI ", struct pt_regs, hi);
|
||||
text("MIPS pt_regs offsets.");
|
||||
offset("PT_R0", struct pt_regs, regs[0]);
|
||||
offset("PT_R1", struct pt_regs, regs[1]);
|
||||
offset("PT_R2", struct pt_regs, regs[2]);
|
||||
offset("PT_R3", struct pt_regs, regs[3]);
|
||||
offset("PT_R4", struct pt_regs, regs[4]);
|
||||
offset("PT_R5", struct pt_regs, regs[5]);
|
||||
offset("PT_R6", struct pt_regs, regs[6]);
|
||||
offset("PT_R7", struct pt_regs, regs[7]);
|
||||
offset("PT_R8", struct pt_regs, regs[8]);
|
||||
offset("PT_R9", struct pt_regs, regs[9]);
|
||||
offset("PT_R10", struct pt_regs, regs[10]);
|
||||
offset("PT_R11", struct pt_regs, regs[11]);
|
||||
offset("PT_R12", struct pt_regs, regs[12]);
|
||||
offset("PT_R13", struct pt_regs, regs[13]);
|
||||
offset("PT_R14", struct pt_regs, regs[14]);
|
||||
offset("PT_R15", struct pt_regs, regs[15]);
|
||||
offset("PT_R16", struct pt_regs, regs[16]);
|
||||
offset("PT_R17", struct pt_regs, regs[17]);
|
||||
offset("PT_R18", struct pt_regs, regs[18]);
|
||||
offset("PT_R19", struct pt_regs, regs[19]);
|
||||
offset("PT_R20", struct pt_regs, regs[20]);
|
||||
offset("PT_R21", struct pt_regs, regs[21]);
|
||||
offset("PT_R22", struct pt_regs, regs[22]);
|
||||
offset("PT_R23", struct pt_regs, regs[23]);
|
||||
offset("PT_R24", struct pt_regs, regs[24]);
|
||||
offset("PT_R25", struct pt_regs, regs[25]);
|
||||
offset("PT_R26", struct pt_regs, regs[26]);
|
||||
offset("PT_R27", struct pt_regs, regs[27]);
|
||||
offset("PT_R28", struct pt_regs, regs[28]);
|
||||
offset("PT_R29", struct pt_regs, regs[29]);
|
||||
offset("PT_R30", struct pt_regs, regs[30]);
|
||||
offset("PT_R31", struct pt_regs, regs[31]);
|
||||
offset("PT_LO", struct pt_regs, lo);
|
||||
offset("PT_HI", struct pt_regs, hi);
|
||||
#ifdef CONFIG_CPU_HAS_SMARTMIPS
|
||||
offset("#define PT_ACX ", struct pt_regs, acx);
|
||||
offset("PT_ACX", struct pt_regs, acx);
|
||||
#endif
|
||||
offset("#define PT_EPC ", struct pt_regs, cp0_epc);
|
||||
offset("#define PT_BVADDR ", struct pt_regs, cp0_badvaddr);
|
||||
offset("#define PT_STATUS ", struct pt_regs, cp0_status);
|
||||
offset("#define PT_CAUSE ", struct pt_regs, cp0_cause);
|
||||
offset("PT_EPC", struct pt_regs, cp0_epc);
|
||||
offset("PT_BVADDR", struct pt_regs, cp0_badvaddr);
|
||||
offset("PT_STATUS", struct pt_regs, cp0_status);
|
||||
offset("PT_CAUSE", struct pt_regs, cp0_cause);
|
||||
#ifdef CONFIG_MIPS_MT_SMTC
|
||||
offset("#define PT_TCSTATUS ", struct pt_regs, cp0_tcstatus);
|
||||
offset("PT_TCSTATUS", struct pt_regs, cp0_tcstatus);
|
||||
#endif /* CONFIG_MIPS_MT_SMTC */
|
||||
size("#define PT_SIZE ", struct pt_regs);
|
||||
size("PT_SIZE", struct pt_regs);
|
||||
linefeed;
|
||||
}
|
||||
|
||||
void output_task_defines(void)
|
||||
{
|
||||
text("/* MIPS task_struct offsets. */");
|
||||
offset("#define TASK_STATE ", struct task_struct, state);
|
||||
offset("#define TASK_THREAD_INFO ", struct task_struct, stack);
|
||||
offset("#define TASK_FLAGS ", struct task_struct, flags);
|
||||
offset("#define TASK_MM ", struct task_struct, mm);
|
||||
offset("#define TASK_PID ", struct task_struct, pid);
|
||||
size( "#define TASK_STRUCT_SIZE ", struct task_struct);
|
||||
text("MIPS task_struct offsets.");
|
||||
offset("TASK_STATE", struct task_struct, state);
|
||||
offset("TASK_THREAD_INFO", struct task_struct, stack);
|
||||
offset("TASK_FLAGS", struct task_struct, flags);
|
||||
offset("TASK_MM", struct task_struct, mm);
|
||||
offset("TASK_PID", struct task_struct, pid);
|
||||
size( "TASK_STRUCT_SIZE", struct task_struct);
|
||||
linefeed;
|
||||
}
|
||||
|
||||
void output_thread_info_defines(void)
|
||||
{
|
||||
text("/* MIPS thread_info offsets. */");
|
||||
offset("#define TI_TASK ", struct thread_info, task);
|
||||
offset("#define TI_EXEC_DOMAIN ", struct thread_info, exec_domain);
|
||||
offset("#define TI_FLAGS ", struct thread_info, flags);
|
||||
offset("#define TI_TP_VALUE ", struct thread_info, tp_value);
|
||||
offset("#define TI_CPU ", struct thread_info, cpu);
|
||||
offset("#define TI_PRE_COUNT ", struct thread_info, preempt_count);
|
||||
offset("#define TI_ADDR_LIMIT ", struct thread_info, addr_limit);
|
||||
offset("#define TI_RESTART_BLOCK ", struct thread_info, restart_block);
|
||||
offset("#define TI_REGS ", struct thread_info, regs);
|
||||
constant("#define _THREAD_SIZE ", THREAD_SIZE);
|
||||
constant("#define _THREAD_MASK ", THREAD_MASK);
|
||||
text("MIPS thread_info offsets.");
|
||||
offset("TI_TASK", struct thread_info, task);
|
||||
offset("TI_EXEC_DOMAIN", struct thread_info, exec_domain);
|
||||
offset("TI_FLAGS", struct thread_info, flags);
|
||||
offset("TI_TP_VALUE", struct thread_info, tp_value);
|
||||
offset("TI_CPU", struct thread_info, cpu);
|
||||
offset("TI_PRE_COUNT", struct thread_info, preempt_count);
|
||||
offset("TI_ADDR_LIMIT", struct thread_info, addr_limit);
|
||||
offset("TI_RESTART_BLOCK", struct thread_info, restart_block);
|
||||
offset("TI_REGS", struct thread_info, regs);
|
||||
constant("_THREAD_SIZE", THREAD_SIZE);
|
||||
constant("_THREAD_MASK", THREAD_MASK);
|
||||
linefeed;
|
||||
}
|
||||
|
||||
void output_thread_defines(void)
|
||||
{
|
||||
text("/* MIPS specific thread_struct offsets. */");
|
||||
offset("#define THREAD_REG16 ", struct task_struct, thread.reg16);
|
||||
offset("#define THREAD_REG17 ", struct task_struct, thread.reg17);
|
||||
offset("#define THREAD_REG18 ", struct task_struct, thread.reg18);
|
||||
offset("#define THREAD_REG19 ", struct task_struct, thread.reg19);
|
||||
offset("#define THREAD_REG20 ", struct task_struct, thread.reg20);
|
||||
offset("#define THREAD_REG21 ", struct task_struct, thread.reg21);
|
||||
offset("#define THREAD_REG22 ", struct task_struct, thread.reg22);
|
||||
offset("#define THREAD_REG23 ", struct task_struct, thread.reg23);
|
||||
offset("#define THREAD_REG29 ", struct task_struct, thread.reg29);
|
||||
offset("#define THREAD_REG30 ", struct task_struct, thread.reg30);
|
||||
offset("#define THREAD_REG31 ", struct task_struct, thread.reg31);
|
||||
offset("#define THREAD_STATUS ", struct task_struct,
|
||||
text("MIPS specific thread_struct offsets.");
|
||||
offset("THREAD_REG16", struct task_struct, thread.reg16);
|
||||
offset("THREAD_REG17", struct task_struct, thread.reg17);
|
||||
offset("THREAD_REG18", struct task_struct, thread.reg18);
|
||||
offset("THREAD_REG19", struct task_struct, thread.reg19);
|
||||
offset("THREAD_REG20", struct task_struct, thread.reg20);
|
||||
offset("THREAD_REG21", struct task_struct, thread.reg21);
|
||||
offset("THREAD_REG22", struct task_struct, thread.reg22);
|
||||
offset("THREAD_REG23", struct task_struct, thread.reg23);
|
||||
offset("THREAD_REG29", struct task_struct, thread.reg29);
|
||||
offset("THREAD_REG30", struct task_struct, thread.reg30);
|
||||
offset("THREAD_REG31", struct task_struct, thread.reg31);
|
||||
offset("THREAD_STATUS", struct task_struct,
|
||||
thread.cp0_status);
|
||||
offset("#define THREAD_FPU ", struct task_struct, thread.fpu);
|
||||
offset("THREAD_FPU", struct task_struct, thread.fpu);
|
||||
|
||||
offset("#define THREAD_BVADDR ", struct task_struct, \
|
||||
offset("THREAD_BVADDR", struct task_struct, \
|
||||
thread.cp0_badvaddr);
|
||||
offset("#define THREAD_BUADDR ", struct task_struct, \
|
||||
offset("THREAD_BUADDR", struct task_struct, \
|
||||
thread.cp0_baduaddr);
|
||||
offset("#define THREAD_ECODE ", struct task_struct, \
|
||||
offset("THREAD_ECODE", struct task_struct, \
|
||||
thread.error_code);
|
||||
offset("#define THREAD_TRAPNO ", struct task_struct, thread.trap_no);
|
||||
offset("#define THREAD_TRAMP ", struct task_struct, \
|
||||
offset("THREAD_TRAPNO", struct task_struct, thread.trap_no);
|
||||
offset("THREAD_TRAMP", struct task_struct, \
|
||||
thread.irix_trampoline);
|
||||
offset("#define THREAD_OLDCTX ", struct task_struct, \
|
||||
offset("THREAD_OLDCTX", struct task_struct, \
|
||||
thread.irix_oldctx);
|
||||
linefeed;
|
||||
}
|
||||
|
||||
void output_thread_fpu_defines(void)
|
||||
{
|
||||
offset("#define THREAD_FPR0 ",
|
||||
offset("THREAD_FPR0",
|
||||
struct task_struct, thread.fpu.fpr[0]);
|
||||
offset("#define THREAD_FPR1 ",
|
||||
offset("THREAD_FPR1",
|
||||
struct task_struct, thread.fpu.fpr[1]);
|
||||
offset("#define THREAD_FPR2 ",
|
||||
offset("THREAD_FPR2",
|
||||
struct task_struct, thread.fpu.fpr[2]);
|
||||
offset("#define THREAD_FPR3 ",
|
||||
offset("THREAD_FPR3",
|
||||
struct task_struct, thread.fpu.fpr[3]);
|
||||
offset("#define THREAD_FPR4 ",
|
||||
offset("THREAD_FPR4",
|
||||
struct task_struct, thread.fpu.fpr[4]);
|
||||
offset("#define THREAD_FPR5 ",
|
||||
offset("THREAD_FPR5",
|
||||
struct task_struct, thread.fpu.fpr[5]);
|
||||
offset("#define THREAD_FPR6 ",
|
||||
offset("THREAD_FPR6",
|
||||
struct task_struct, thread.fpu.fpr[6]);
|
||||
offset("#define THREAD_FPR7 ",
|
||||
offset("THREAD_FPR7",
|
||||
struct task_struct, thread.fpu.fpr[7]);
|
||||
offset("#define THREAD_FPR8 ",
|
||||
offset("THREAD_FPR8",
|
||||
struct task_struct, thread.fpu.fpr[8]);
|
||||
offset("#define THREAD_FPR9 ",
|
||||
offset("THREAD_FPR9",
|
||||
struct task_struct, thread.fpu.fpr[9]);
|
||||
offset("#define THREAD_FPR10 ",
|
||||
offset("THREAD_FPR10",
|
||||
struct task_struct, thread.fpu.fpr[10]);
|
||||
offset("#define THREAD_FPR11 ",
|
||||
offset("THREAD_FPR11",
|
||||
struct task_struct, thread.fpu.fpr[11]);
|
||||
offset("#define THREAD_FPR12 ",
|
||||
offset("THREAD_FPR12",
|
||||
struct task_struct, thread.fpu.fpr[12]);
|
||||
offset("#define THREAD_FPR13 ",
|
||||
offset("THREAD_FPR13",
|
||||
struct task_struct, thread.fpu.fpr[13]);
|
||||
offset("#define THREAD_FPR14 ",
|
||||
offset("THREAD_FPR14",
|
||||
struct task_struct, thread.fpu.fpr[14]);
|
||||
offset("#define THREAD_FPR15 ",
|
||||
offset("THREAD_FPR15",
|
||||
struct task_struct, thread.fpu.fpr[15]);
|
||||
offset("#define THREAD_FPR16 ",
|
||||
offset("THREAD_FPR16",
|
||||
struct task_struct, thread.fpu.fpr[16]);
|
||||
offset("#define THREAD_FPR17 ",
|
||||
offset("THREAD_FPR17",
|
||||
struct task_struct, thread.fpu.fpr[17]);
|
||||
offset("#define THREAD_FPR18 ",
|
||||
offset("THREAD_FPR18",
|
||||
struct task_struct, thread.fpu.fpr[18]);
|
||||
offset("#define THREAD_FPR19 ",
|
||||
offset("THREAD_FPR19",
|
||||
struct task_struct, thread.fpu.fpr[19]);
|
||||
offset("#define THREAD_FPR20 ",
|
||||
offset("THREAD_FPR20",
|
||||
struct task_struct, thread.fpu.fpr[20]);
|
||||
offset("#define THREAD_FPR21 ",
|
||||
offset("THREAD_FPR21",
|
||||
struct task_struct, thread.fpu.fpr[21]);
|
||||
offset("#define THREAD_FPR22 ",
|
||||
offset("THREAD_FPR22",
|
||||
struct task_struct, thread.fpu.fpr[22]);
|
||||
offset("#define THREAD_FPR23 ",
|
||||
offset("THREAD_FPR23",
|
||||
struct task_struct, thread.fpu.fpr[23]);
|
||||
offset("#define THREAD_FPR24 ",
|
||||
offset("THREAD_FPR24",
|
||||
struct task_struct, thread.fpu.fpr[24]);
|
||||
offset("#define THREAD_FPR25 ",
|
||||
offset("THREAD_FPR25",
|
||||
struct task_struct, thread.fpu.fpr[25]);
|
||||
offset("#define THREAD_FPR26 ",
|
||||
offset("THREAD_FPR26",
|
||||
struct task_struct, thread.fpu.fpr[26]);
|
||||
offset("#define THREAD_FPR27 ",
|
||||
offset("THREAD_FPR27",
|
||||
struct task_struct, thread.fpu.fpr[27]);
|
||||
offset("#define THREAD_FPR28 ",
|
||||
offset("THREAD_FPR28",
|
||||
struct task_struct, thread.fpu.fpr[28]);
|
||||
offset("#define THREAD_FPR29 ",
|
||||
offset("THREAD_FPR29",
|
||||
struct task_struct, thread.fpu.fpr[29]);
|
||||
offset("#define THREAD_FPR30 ",
|
||||
offset("THREAD_FPR30",
|
||||
struct task_struct, thread.fpu.fpr[30]);
|
||||
offset("#define THREAD_FPR31 ",
|
||||
offset("THREAD_FPR31",
|
||||
struct task_struct, thread.fpu.fpr[31]);
|
||||
|
||||
offset("#define THREAD_FCR31 ",
|
||||
offset("THREAD_FCR31",
|
||||
struct task_struct, thread.fpu.fcr31);
|
||||
linefeed;
|
||||
}
|
||||
|
||||
void output_mm_defines(void)
|
||||
{
|
||||
text("/* Size of struct page */");
|
||||
size("#define STRUCT_PAGE_SIZE ", struct page);
|
||||
text("Size of struct page");
|
||||
size("STRUCT_PAGE_SIZE", struct page);
|
||||
linefeed;
|
||||
text("/* Linux mm_struct offsets. */");
|
||||
offset("#define MM_USERS ", struct mm_struct, mm_users);
|
||||
offset("#define MM_PGD ", struct mm_struct, pgd);
|
||||
offset("#define MM_CONTEXT ", struct mm_struct, context);
|
||||
text("Linux mm_struct offsets.");
|
||||
offset("MM_USERS", struct mm_struct, mm_users);
|
||||
offset("MM_PGD", struct mm_struct, pgd);
|
||||
offset("MM_CONTEXT", struct mm_struct, context);
|
||||
linefeed;
|
||||
constant("#define _PAGE_SIZE ", PAGE_SIZE);
|
||||
constant("#define _PAGE_SHIFT ", PAGE_SHIFT);
|
||||
constant("_PAGE_SIZE", PAGE_SIZE);
|
||||
constant("_PAGE_SHIFT", PAGE_SHIFT);
|
||||
linefeed;
|
||||
constant("#define _PGD_T_SIZE ", sizeof(pgd_t));
|
||||
constant("#define _PMD_T_SIZE ", sizeof(pmd_t));
|
||||
constant("#define _PTE_T_SIZE ", sizeof(pte_t));
|
||||
constant("_PGD_T_SIZE", sizeof(pgd_t));
|
||||
constant("_PMD_T_SIZE", sizeof(pmd_t));
|
||||
constant("_PTE_T_SIZE", sizeof(pte_t));
|
||||
linefeed;
|
||||
constant("#define _PGD_T_LOG2 ", PGD_T_LOG2);
|
||||
constant("#define _PMD_T_LOG2 ", PMD_T_LOG2);
|
||||
constant("#define _PTE_T_LOG2 ", PTE_T_LOG2);
|
||||
constant("_PGD_T_LOG2", PGD_T_LOG2);
|
||||
constant("_PMD_T_LOG2", PMD_T_LOG2);
|
||||
constant("_PTE_T_LOG2", PTE_T_LOG2);
|
||||
linefeed;
|
||||
constant("#define _PGD_ORDER ", PGD_ORDER);
|
||||
constant("#define _PMD_ORDER ", PMD_ORDER);
|
||||
constant("#define _PTE_ORDER ", PTE_ORDER);
|
||||
constant("_PGD_ORDER", PGD_ORDER);
|
||||
constant("_PMD_ORDER", PMD_ORDER);
|
||||
constant("_PTE_ORDER", PTE_ORDER);
|
||||
linefeed;
|
||||
constant("#define _PMD_SHIFT ", PMD_SHIFT);
|
||||
constant("#define _PGDIR_SHIFT ", PGDIR_SHIFT);
|
||||
constant("_PMD_SHIFT", PMD_SHIFT);
|
||||
constant("_PGDIR_SHIFT", PGDIR_SHIFT);
|
||||
linefeed;
|
||||
constant("#define _PTRS_PER_PGD ", PTRS_PER_PGD);
|
||||
constant("#define _PTRS_PER_PMD ", PTRS_PER_PMD);
|
||||
constant("#define _PTRS_PER_PTE ", PTRS_PER_PTE);
|
||||
constant("_PTRS_PER_PGD", PTRS_PER_PGD);
|
||||
constant("_PTRS_PER_PMD", PTRS_PER_PMD);
|
||||
constant("_PTRS_PER_PTE", PTRS_PER_PTE);
|
||||
linefeed;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_32BIT
|
||||
void output_sc_defines(void)
|
||||
{
|
||||
text("/* Linux sigcontext offsets. */");
|
||||
offset("#define SC_REGS ", struct sigcontext, sc_regs);
|
||||
offset("#define SC_FPREGS ", struct sigcontext, sc_fpregs);
|
||||
offset("#define SC_ACX ", struct sigcontext, sc_acx);
|
||||
offset("#define SC_MDHI ", struct sigcontext, sc_mdhi);
|
||||
offset("#define SC_MDLO ", struct sigcontext, sc_mdlo);
|
||||
offset("#define SC_PC ", struct sigcontext, sc_pc);
|
||||
offset("#define SC_FPC_CSR ", struct sigcontext, sc_fpc_csr);
|
||||
offset("#define SC_FPC_EIR ", struct sigcontext, sc_fpc_eir);
|
||||
offset("#define SC_HI1 ", struct sigcontext, sc_hi1);
|
||||
offset("#define SC_LO1 ", struct sigcontext, sc_lo1);
|
||||
offset("#define SC_HI2 ", struct sigcontext, sc_hi2);
|
||||
offset("#define SC_LO2 ", struct sigcontext, sc_lo2);
|
||||
offset("#define SC_HI3 ", struct sigcontext, sc_hi3);
|
||||
offset("#define SC_LO3 ", struct sigcontext, sc_lo3);
|
||||
text("Linux sigcontext offsets.");
|
||||
offset("SC_REGS", struct sigcontext, sc_regs);
|
||||
offset("SC_FPREGS", struct sigcontext, sc_fpregs);
|
||||
offset("SC_ACX", struct sigcontext, sc_acx);
|
||||
offset("SC_MDHI", struct sigcontext, sc_mdhi);
|
||||
offset("SC_MDLO", struct sigcontext, sc_mdlo);
|
||||
offset("SC_PC", struct sigcontext, sc_pc);
|
||||
offset("SC_FPC_CSR", struct sigcontext, sc_fpc_csr);
|
||||
offset("SC_FPC_EIR", struct sigcontext, sc_fpc_eir);
|
||||
offset("SC_HI1", struct sigcontext, sc_hi1);
|
||||
offset("SC_LO1", struct sigcontext, sc_lo1);
|
||||
offset("SC_HI2", struct sigcontext, sc_hi2);
|
||||
offset("SC_LO2", struct sigcontext, sc_lo2);
|
||||
offset("SC_HI3", struct sigcontext, sc_hi3);
|
||||
offset("SC_LO3", struct sigcontext, sc_lo3);
|
||||
linefeed;
|
||||
}
|
||||
#endif
|
||||
|
@ -270,13 +270,13 @@ void output_sc_defines(void)
|
|||
#ifdef CONFIG_64BIT
|
||||
void output_sc_defines(void)
|
||||
{
|
||||
text("/* Linux sigcontext offsets. */");
|
||||
offset("#define SC_REGS ", struct sigcontext, sc_regs);
|
||||
offset("#define SC_FPREGS ", struct sigcontext, sc_fpregs);
|
||||
offset("#define SC_MDHI ", struct sigcontext, sc_mdhi);
|
||||
offset("#define SC_MDLO ", struct sigcontext, sc_mdlo);
|
||||
offset("#define SC_PC ", struct sigcontext, sc_pc);
|
||||
offset("#define SC_FPC_CSR ", struct sigcontext, sc_fpc_csr);
|
||||
text("Linux sigcontext offsets.");
|
||||
offset("SC_REGS", struct sigcontext, sc_regs);
|
||||
offset("SC_FPREGS", struct sigcontext, sc_fpregs);
|
||||
offset("SC_MDHI", struct sigcontext, sc_mdhi);
|
||||
offset("SC_MDLO", struct sigcontext, sc_mdlo);
|
||||
offset("SC_PC", struct sigcontext, sc_pc);
|
||||
offset("SC_FPC_CSR", struct sigcontext, sc_fpc_csr);
|
||||
linefeed;
|
||||
}
|
||||
#endif
|
||||
|
@ -284,56 +284,56 @@ void output_sc_defines(void)
|
|||
#ifdef CONFIG_MIPS32_COMPAT
|
||||
void output_sc32_defines(void)
|
||||
{
|
||||
text("/* Linux 32-bit sigcontext offsets. */");
|
||||
offset("#define SC32_FPREGS ", struct sigcontext32, sc_fpregs);
|
||||
offset("#define SC32_FPC_CSR ", struct sigcontext32, sc_fpc_csr);
|
||||
offset("#define SC32_FPC_EIR ", struct sigcontext32, sc_fpc_eir);
|
||||
text("Linux 32-bit sigcontext offsets.");
|
||||
offset("SC32_FPREGS", struct sigcontext32, sc_fpregs);
|
||||
offset("SC32_FPC_CSR", struct sigcontext32, sc_fpc_csr);
|
||||
offset("SC32_FPC_EIR", struct sigcontext32, sc_fpc_eir);
|
||||
linefeed;
|
||||
}
|
||||
#endif
|
||||
|
||||
void output_signal_defined(void)
|
||||
{
|
||||
text("/* Linux signal numbers. */");
|
||||
constant("#define _SIGHUP ", SIGHUP);
|
||||
constant("#define _SIGINT ", SIGINT);
|
||||
constant("#define _SIGQUIT ", SIGQUIT);
|
||||
constant("#define _SIGILL ", SIGILL);
|
||||
constant("#define _SIGTRAP ", SIGTRAP);
|
||||
constant("#define _SIGIOT ", SIGIOT);
|
||||
constant("#define _SIGABRT ", SIGABRT);
|
||||
constant("#define _SIGEMT ", SIGEMT);
|
||||
constant("#define _SIGFPE ", SIGFPE);
|
||||
constant("#define _SIGKILL ", SIGKILL);
|
||||
constant("#define _SIGBUS ", SIGBUS);
|
||||
constant("#define _SIGSEGV ", SIGSEGV);
|
||||
constant("#define _SIGSYS ", SIGSYS);
|
||||
constant("#define _SIGPIPE ", SIGPIPE);
|
||||
constant("#define _SIGALRM ", SIGALRM);
|
||||
constant("#define _SIGTERM ", SIGTERM);
|
||||
constant("#define _SIGUSR1 ", SIGUSR1);
|
||||
constant("#define _SIGUSR2 ", SIGUSR2);
|
||||
constant("#define _SIGCHLD ", SIGCHLD);
|
||||
constant("#define _SIGPWR ", SIGPWR);
|
||||
constant("#define _SIGWINCH ", SIGWINCH);
|
||||
constant("#define _SIGURG ", SIGURG);
|
||||
constant("#define _SIGIO ", SIGIO);
|
||||
constant("#define _SIGSTOP ", SIGSTOP);
|
||||
constant("#define _SIGTSTP ", SIGTSTP);
|
||||
constant("#define _SIGCONT ", SIGCONT);
|
||||
constant("#define _SIGTTIN ", SIGTTIN);
|
||||
constant("#define _SIGTTOU ", SIGTTOU);
|
||||
constant("#define _SIGVTALRM ", SIGVTALRM);
|
||||
constant("#define _SIGPROF ", SIGPROF);
|
||||
constant("#define _SIGXCPU ", SIGXCPU);
|
||||
constant("#define _SIGXFSZ ", SIGXFSZ);
|
||||
text("Linux signal numbers.");
|
||||
constant("_SIGHUP", SIGHUP);
|
||||
constant("_SIGINT", SIGINT);
|
||||
constant("_SIGQUIT", SIGQUIT);
|
||||
constant("_SIGILL", SIGILL);
|
||||
constant("_SIGTRAP", SIGTRAP);
|
||||
constant("_SIGIOT", SIGIOT);
|
||||
constant("_SIGABRT", SIGABRT);
|
||||
constant("_SIGEMT", SIGEMT);
|
||||
constant("_SIGFPE", SIGFPE);
|
||||
constant("_SIGKILL", SIGKILL);
|
||||
constant("_SIGBUS", SIGBUS);
|
||||
constant("_SIGSEGV", SIGSEGV);
|
||||
constant("_SIGSYS", SIGSYS);
|
||||
constant("_SIGPIPE", SIGPIPE);
|
||||
constant("_SIGALRM", SIGALRM);
|
||||
constant("_SIGTERM", SIGTERM);
|
||||
constant("_SIGUSR1", SIGUSR1);
|
||||
constant("_SIGUSR2", SIGUSR2);
|
||||
constant("_SIGCHLD", SIGCHLD);
|
||||
constant("_SIGPWR", SIGPWR);
|
||||
constant("_SIGWINCH", SIGWINCH);
|
||||
constant("_SIGURG", SIGURG);
|
||||
constant("_SIGIO", SIGIO);
|
||||
constant("_SIGSTOP", SIGSTOP);
|
||||
constant("_SIGTSTP", SIGTSTP);
|
||||
constant("_SIGCONT", SIGCONT);
|
||||
constant("_SIGTTIN", SIGTTIN);
|
||||
constant("_SIGTTOU", SIGTTOU);
|
||||
constant("_SIGVTALRM", SIGVTALRM);
|
||||
constant("_SIGPROF", SIGPROF);
|
||||
constant("_SIGXCPU", SIGXCPU);
|
||||
constant("_SIGXFSZ", SIGXFSZ);
|
||||
linefeed;
|
||||
}
|
||||
|
||||
void output_irq_cpustat_t_defines(void)
|
||||
{
|
||||
text("/* Linux irq_cpustat_t offsets. */");
|
||||
offset("#define IC_SOFTIRQ_PENDING ", irq_cpustat_t, __softirq_pending);
|
||||
size("#define IC_IRQ_CPUSTAT_T ", irq_cpustat_t);
|
||||
text("Linux irq_cpustat_t offsets.");
|
||||
offset("IC_SOFTIRQ_PENDING", irq_cpustat_t, __softirq_pending);
|
||||
size("IC_IRQ_CPUSTAT_T", irq_cpustat_t);
|
||||
linefeed;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,129 @@
|
|||
/*
|
||||
* DS1287 clockevent driver
|
||||
*
|
||||
* Copyright (C) 2008 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
#include <linux/clockchips.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/mc146818rtc.h>
|
||||
|
||||
#include <asm/time.h>
|
||||
|
||||
int ds1287_timer_state(void)
|
||||
{
|
||||
return (CMOS_READ(RTC_REG_C) & RTC_PF) != 0;
|
||||
}
|
||||
|
||||
int ds1287_set_base_clock(unsigned int hz)
|
||||
{
|
||||
u8 rate;
|
||||
|
||||
switch (hz) {
|
||||
case 128:
|
||||
rate = 0x9;
|
||||
break;
|
||||
case 256:
|
||||
rate = 0x8;
|
||||
break;
|
||||
case 1024:
|
||||
rate = 0x6;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
CMOS_WRITE(RTC_REF_CLCK_32KHZ | rate, RTC_REG_A);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ds1287_set_next_event(unsigned long delta,
|
||||
struct clock_event_device *evt)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static void ds1287_set_mode(enum clock_event_mode mode,
|
||||
struct clock_event_device *evt)
|
||||
{
|
||||
u8 val;
|
||||
|
||||
spin_lock(&rtc_lock);
|
||||
|
||||
val = CMOS_READ(RTC_REG_B);
|
||||
|
||||
switch (mode) {
|
||||
case CLOCK_EVT_MODE_PERIODIC:
|
||||
val |= RTC_PIE;
|
||||
break;
|
||||
default:
|
||||
val &= ~RTC_PIE;
|
||||
break;
|
||||
}
|
||||
|
||||
CMOS_WRITE(val, RTC_REG_B);
|
||||
|
||||
spin_unlock(&rtc_lock);
|
||||
}
|
||||
|
||||
static void ds1287_event_handler(struct clock_event_device *dev)
|
||||
{
|
||||
}
|
||||
|
||||
static struct clock_event_device ds1287_clockevent = {
|
||||
.name = "ds1287",
|
||||
.features = CLOCK_EVT_FEAT_PERIODIC,
|
||||
.cpumask = CPU_MASK_CPU0,
|
||||
.set_next_event = ds1287_set_next_event,
|
||||
.set_mode = ds1287_set_mode,
|
||||
.event_handler = ds1287_event_handler,
|
||||
};
|
||||
|
||||
static irqreturn_t ds1287_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
struct clock_event_device *cd = &ds1287_clockevent;
|
||||
|
||||
/* Ack the RTC interrupt. */
|
||||
CMOS_READ(RTC_REG_C);
|
||||
|
||||
cd->event_handler(cd);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static struct irqaction ds1287_irqaction = {
|
||||
.handler = ds1287_interrupt,
|
||||
.flags = IRQF_DISABLED | IRQF_PERCPU,
|
||||
.name = "ds1287",
|
||||
};
|
||||
|
||||
int __init ds1287_clockevent_init(int irq)
|
||||
{
|
||||
struct clock_event_device *cd;
|
||||
|
||||
cd = &ds1287_clockevent;
|
||||
cd->rating = 100;
|
||||
cd->irq = irq;
|
||||
clockevent_set_clock(cd, 32768);
|
||||
cd->max_delta_ns = clockevent_delta2ns(0x7fffffff, cd);
|
||||
cd->min_delta_ns = clockevent_delta2ns(0x300, cd);
|
||||
|
||||
clockevents_register_device(&ds1287_clockevent);
|
||||
|
||||
return setup_irq(irq, &ds1287_irqaction);
|
||||
}
|
|
@ -25,8 +25,6 @@
|
|||
#include <asm/gt64120.h>
|
||||
#include <asm/time.h>
|
||||
|
||||
#include <irq.h>
|
||||
|
||||
static DEFINE_SPINLOCK(gt641xx_timer_lock);
|
||||
static unsigned int gt641xx_base_clock;
|
||||
|
||||
|
|
|
@ -169,6 +169,7 @@ static inline void check_wait(void)
|
|||
|
||||
case CPU_24K:
|
||||
case CPU_34K:
|
||||
case CPU_1004K:
|
||||
cpu_wait = r4k_wait;
|
||||
if (read_c0_config7() & MIPS_CONF7_WII)
|
||||
cpu_wait = r4k_wait_irqoff;
|
||||
|
@ -675,6 +676,12 @@ static void __cpuinit decode_configs(struct cpuinfo_mips *c)
|
|||
return;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CPU_MIPSR2
|
||||
extern void spram_config(void);
|
||||
#else
|
||||
static inline void spram_config(void) {}
|
||||
#endif
|
||||
|
||||
static inline void cpu_probe_mips(struct cpuinfo_mips *c)
|
||||
{
|
||||
decode_configs(c);
|
||||
|
@ -711,7 +718,12 @@ static inline void cpu_probe_mips(struct cpuinfo_mips *c)
|
|||
case PRID_IMP_74K:
|
||||
c->cputype = CPU_74K;
|
||||
break;
|
||||
case PRID_IMP_1004K:
|
||||
c->cputype = CPU_1004K;
|
||||
break;
|
||||
}
|
||||
|
||||
spram_config();
|
||||
}
|
||||
|
||||
static inline void cpu_probe_alchemy(struct cpuinfo_mips *c)
|
||||
|
@ -778,7 +790,7 @@ static inline void cpu_probe_sandcraft(struct cpuinfo_mips *c)
|
|||
}
|
||||
}
|
||||
|
||||
static inline void cpu_probe_philips(struct cpuinfo_mips *c)
|
||||
static inline void cpu_probe_nxp(struct cpuinfo_mips *c)
|
||||
{
|
||||
decode_configs(c);
|
||||
switch (c->processor_id & 0xff00) {
|
||||
|
@ -787,7 +799,7 @@ static inline void cpu_probe_philips(struct cpuinfo_mips *c)
|
|||
c->isa_level = MIPS_CPU_ISA_M32R1;
|
||||
break;
|
||||
default:
|
||||
panic("Unknown Philips Core!"); /* REVISIT: die? */
|
||||
panic("Unknown NXP Core!"); /* REVISIT: die? */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -876,6 +888,7 @@ static __cpuinit const char *cpu_to_name(struct cpuinfo_mips *c)
|
|||
case CPU_24K: name = "MIPS 24K"; break;
|
||||
case CPU_25KF: name = "MIPS 25Kf"; break;
|
||||
case CPU_34K: name = "MIPS 34K"; break;
|
||||
case CPU_1004K: name = "MIPS 1004K"; break;
|
||||
case CPU_74K: name = "MIPS 74K"; break;
|
||||
case CPU_VR4111: name = "NEC VR4111"; break;
|
||||
case CPU_VR4121: name = "NEC VR4121"; break;
|
||||
|
@ -925,8 +938,8 @@ __cpuinit void cpu_probe(void)
|
|||
case PRID_COMP_SANDCRAFT:
|
||||
cpu_probe_sandcraft(c);
|
||||
break;
|
||||
case PRID_COMP_PHILIPS:
|
||||
cpu_probe_philips(c);
|
||||
case PRID_COMP_NXP:
|
||||
cpu_probe_nxp(c);
|
||||
break;
|
||||
default:
|
||||
c->cputype = CPU_UNKNOWN;
|
||||
|
|
|
@ -0,0 +1,65 @@
|
|||
/*
|
||||
* DEC I/O ASIC's counter clocksource
|
||||
*
|
||||
* Copyright (C) 2008 Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
#include <linux/clocksource.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/ds1287.h>
|
||||
#include <asm/time.h>
|
||||
#include <asm/dec/ioasic.h>
|
||||
#include <asm/dec/ioasic_addrs.h>
|
||||
|
||||
static cycle_t dec_ioasic_hpt_read(void)
|
||||
{
|
||||
return ioasic_read(IO_REG_FCTR);
|
||||
}
|
||||
|
||||
static struct clocksource clocksource_dec = {
|
||||
.name = "dec-ioasic",
|
||||
.read = dec_ioasic_hpt_read,
|
||||
.mask = CLOCKSOURCE_MASK(32),
|
||||
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
|
||||
};
|
||||
|
||||
void __init dec_ioasic_clocksource_init(void)
|
||||
{
|
||||
unsigned int freq;
|
||||
u32 start, end;
|
||||
int i = HZ / 10;
|
||||
|
||||
|
||||
while (!ds1287_timer_state())
|
||||
;
|
||||
|
||||
start = dec_ioasic_hpt_read();
|
||||
|
||||
while (i--)
|
||||
while (!ds1287_timer_state())
|
||||
;
|
||||
|
||||
end = dec_ioasic_hpt_read();
|
||||
|
||||
freq = (end - start) * 10;
|
||||
printk(KERN_INFO "I/O ASIC clock frequency %dHz\n", freq);
|
||||
|
||||
clocksource_dec.rating = 200 + freq / 10000000;
|
||||
clocksource_set_clock(&clocksource_dec, freq);
|
||||
|
||||
clocksource_register(&clocksource_dec);
|
||||
}
|
|
@ -0,0 +1,87 @@
|
|||
/*
|
||||
* A gpio chip driver for TXx9 SoCs
|
||||
*
|
||||
* Copyright (C) 2008 Atsushi Nemoto <anemo@mba.ocn.ne.jp>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/io.h>
|
||||
#include <asm/txx9pio.h>
|
||||
|
||||
static DEFINE_SPINLOCK(txx9_gpio_lock);
|
||||
|
||||
static struct txx9_pio_reg __iomem *txx9_pioptr;
|
||||
|
||||
static int txx9_gpio_get(struct gpio_chip *chip, unsigned int offset)
|
||||
{
|
||||
return __raw_readl(&txx9_pioptr->din) & (1 << offset);
|
||||
}
|
||||
|
||||
static void txx9_gpio_set_raw(unsigned int offset, int value)
|
||||
{
|
||||
u32 val;
|
||||
val = __raw_readl(&txx9_pioptr->dout);
|
||||
if (value)
|
||||
val |= 1 << offset;
|
||||
else
|
||||
val &= ~(1 << offset);
|
||||
__raw_writel(val, &txx9_pioptr->dout);
|
||||
}
|
||||
|
||||
static void txx9_gpio_set(struct gpio_chip *chip, unsigned int offset,
|
||||
int value)
|
||||
{
|
||||
unsigned long flags;
|
||||
spin_lock_irqsave(&txx9_gpio_lock, flags);
|
||||
txx9_gpio_set_raw(offset, value);
|
||||
mmiowb();
|
||||
spin_unlock_irqrestore(&txx9_gpio_lock, flags);
|
||||
}
|
||||
|
||||
static int txx9_gpio_dir_in(struct gpio_chip *chip, unsigned int offset)
|
||||
{
|
||||
spin_lock_irq(&txx9_gpio_lock);
|
||||
__raw_writel(__raw_readl(&txx9_pioptr->dir) & ~(1 << offset),
|
||||
&txx9_pioptr->dir);
|
||||
mmiowb();
|
||||
spin_unlock_irq(&txx9_gpio_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int txx9_gpio_dir_out(struct gpio_chip *chip, unsigned int offset,
|
||||
int value)
|
||||
{
|
||||
spin_lock_irq(&txx9_gpio_lock);
|
||||
txx9_gpio_set_raw(offset, value);
|
||||
__raw_writel(__raw_readl(&txx9_pioptr->dir) | (1 << offset),
|
||||
&txx9_pioptr->dir);
|
||||
mmiowb();
|
||||
spin_unlock_irq(&txx9_gpio_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct gpio_chip txx9_gpio_chip = {
|
||||
.get = txx9_gpio_get,
|
||||
.set = txx9_gpio_set,
|
||||
.direction_input = txx9_gpio_dir_in,
|
||||
.direction_output = txx9_gpio_dir_out,
|
||||
.label = "TXx9",
|
||||
};
|
||||
|
||||
int __init txx9_gpio_init(unsigned long baseaddr,
|
||||
unsigned int base, unsigned int num)
|
||||
{
|
||||
txx9_pioptr = ioremap(baseaddr, sizeof(struct txx9_pio_reg));
|
||||
if (!txx9_pioptr)
|
||||
return -ENODEV;
|
||||
txx9_gpio_chip.base = base;
|
||||
txx9_gpio_chip.ngpio = num;
|
||||
return gpiochip_add(&txx9_gpio_chip);
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue