Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
91b90475
Commit
91b90475
authored
Jun 20, 2005
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge master.kernel.org:/home/rmk/linux-2.6-arm
parents
bcc408b7
f0ffeddc
Changes
54
Hide whitespace changes
Inline
Side-by-side
Showing
54 changed files
with
1705 additions
and
496 deletions
+1705
-496
arch/arm/Kconfig
arch/arm/Kconfig
+8
-5
arch/arm/Makefile
arch/arm/Makefile
+1
-0
arch/arm/common/dmabounce.c
arch/arm/common/dmabounce.c
+16
-2
arch/arm/common/sharpsl_param.c
arch/arm/common/sharpsl_param.c
+1
-1
arch/arm/configs/enp2611_defconfig
arch/arm/configs/enp2611_defconfig
+7
-1
arch/arm/configs/ixdp2400_defconfig
arch/arm/configs/ixdp2400_defconfig
+7
-1
arch/arm/configs/ixdp2401_defconfig
arch/arm/configs/ixdp2401_defconfig
+7
-1
arch/arm/configs/ixdp2800_defconfig
arch/arm/configs/ixdp2800_defconfig
+7
-1
arch/arm/configs/ixdp2801_defconfig
arch/arm/configs/ixdp2801_defconfig
+7
-1
arch/arm/kernel/Makefile
arch/arm/kernel/Makefile
+1
-1
arch/arm/kernel/arch.c
arch/arm/kernel/arch.c
+0
-46
arch/arm/lib/ashldi3.c
arch/arm/lib/ashldi3.c
+21
-26
arch/arm/lib/ashrdi3.c
arch/arm/lib/ashrdi3.c
+22
-26
arch/arm/lib/gcclib.h
arch/arm/lib/gcclib.h
+12
-15
arch/arm/lib/longlong.h
arch/arm/lib/longlong.h
+34
-34
arch/arm/lib/lshrdi3.c
arch/arm/lib/lshrdi3.c
+21
-26
arch/arm/lib/muldi3.c
arch/arm/lib/muldi3.c
+13
-18
arch/arm/lib/ucmpdi2.c
arch/arm/lib/ucmpdi2.c
+14
-16
arch/arm/lib/udivdi3.c
arch/arm/lib/udivdi3.c
+176
-196
arch/arm/mach-aaec2000/Kconfig
arch/arm/mach-aaec2000/Kconfig
+11
-0
arch/arm/mach-aaec2000/Makefile
arch/arm/mach-aaec2000/Makefile
+9
-0
arch/arm/mach-aaec2000/aaed2000.c
arch/arm/mach-aaec2000/aaed2000.c
+48
-0
arch/arm/mach-aaec2000/core.c
arch/arm/mach-aaec2000/core.c
+157
-0
arch/arm/mach-aaec2000/core.h
arch/arm/mach-aaec2000/core.h
+16
-0
arch/arm/mach-integrator/core.c
arch/arm/mach-integrator/core.c
+0
-1
arch/arm/mach-ixp2000/core.c
arch/arm/mach-ixp2000/core.c
+26
-8
arch/arm/mach-versatile/Makefile
arch/arm/mach-versatile/Makefile
+1
-0
arch/arm/mach-versatile/core.c
arch/arm/mach-versatile/core.c
+9
-5
arch/arm/mach-versatile/pci.c
arch/arm/mach-versatile/pci.c
+360
-0
arch/arm/mm/Kconfig
arch/arm/mm/Kconfig
+1
-1
arch/arm/mm/copypage-v6.c
arch/arm/mm/copypage-v6.c
+2
-4
arch/arm/mm/fault-armv.c
arch/arm/mm/fault-armv.c
+11
-20
arch/arm/mm/flush.c
arch/arm/mm/flush.c
+18
-26
arch/arm/mm/ioremap.c
arch/arm/mm/ioremap.c
+47
-0
drivers/char/watchdog/ixp2000_wdt.c
drivers/char/watchdog/ixp2000_wdt.c
+6
-1
include/asm-arm/arch-aaec2000/aaec2000.h
include/asm-arm/arch-aaec2000/aaec2000.h
+151
-0
include/asm-arm/arch-aaec2000/debug-macro.S
include/asm-arm/arch-aaec2000/debug-macro.S
+36
-0
include/asm-arm/arch-aaec2000/dma.h
include/asm-arm/arch-aaec2000/dma.h
+17
-0
include/asm-arm/arch-aaec2000/entry-macro.S
include/asm-arm/arch-aaec2000/entry-macro.S
+33
-0
include/asm-arm/arch-aaec2000/hardware.h
include/asm-arm/arch-aaec2000/hardware.h
+49
-0
include/asm-arm/arch-aaec2000/io.h
include/asm-arm/arch-aaec2000/io.h
+19
-0
include/asm-arm/arch-aaec2000/irqs.h
include/asm-arm/arch-aaec2000/irqs.h
+46
-0
include/asm-arm/arch-aaec2000/memory.h
include/asm-arm/arch-aaec2000/memory.h
+73
-0
include/asm-arm/arch-aaec2000/param.h
include/asm-arm/arch-aaec2000/param.h
+15
-0
include/asm-arm/arch-aaec2000/system.h
include/asm-arm/arch-aaec2000/system.h
+24
-0
include/asm-arm/arch-aaec2000/timex.h
include/asm-arm/arch-aaec2000/timex.h
+18
-0
include/asm-arm/arch-aaec2000/uncompress.h
include/asm-arm/arch-aaec2000/uncompress.h
+47
-0
include/asm-arm/arch-aaec2000/vmalloc.h
include/asm-arm/arch-aaec2000/vmalloc.h
+16
-0
include/asm-arm/arch-ixp2000/ixp2000-regs.h
include/asm-arm/arch-ixp2000/ixp2000-regs.h
+1
-0
include/asm-arm/arch-versatile/hardware.h
include/asm-arm/arch-versatile/hardware.h
+17
-10
include/asm-arm/arch-versatile/io.h
include/asm-arm/arch-versatile/io.h
+1
-1
include/asm-arm/arch-versatile/platform.h
include/asm-arm/arch-versatile/platform.h
+15
-2
include/asm-arm/cacheflush.h
include/asm-arm/cacheflush.h
+3
-0
include/asm-arm/io.h
include/asm-arm/io.h
+27
-0
No files found.
arch/arm/Kconfig
View file @
91b90475
...
...
@@ -67,10 +67,6 @@ config GENERIC_BUST_SPINLOCK
config GENERIC_ISA_DMA
bool
config GENERIC_IOMAP
bool
default y
config FIQ
bool
...
...
@@ -202,6 +198,11 @@ config ARCH_H720X
help
This enables support for systems based on the Hynix HMS720x
config ARCH_AAEC2000
bool "Agilent AAEC-2000 based"
help
This enables support for systems based on the Agilent AAEC-2000
endchoice
source "arch/arm/mach-clps711x/Kconfig"
...
...
@@ -234,6 +235,8 @@ source "arch/arm/mach-h720x/Kconfig"
source "arch/arm/mach-versatile/Kconfig"
source "arch/arm/mach-aaec2000/Kconfig"
# Definitions to make life easier
config ARCH_ACORN
bool
...
...
@@ -277,7 +280,7 @@ config ISA_DMA_API
default y
config PCI
bool "PCI support" if ARCH_INTEGRATOR_AP
bool "PCI support" if ARCH_INTEGRATOR_AP
|| ARCH_VERSATILE_PB
help
Find out whether you have a PCI motherboard. PCI is the name of a
bus system, i.e. the way the CPU talks to the other stuff inside
...
...
arch/arm/Makefile
View file @
91b90475
...
...
@@ -97,6 +97,7 @@ textaddr-$(CONFIG_ARCH_FORTUNET) := 0xc0008000
machine-$(CONFIG_ARCH_VERSATILE)
:=
versatile
machine-$(CONFIG_ARCH_IMX)
:=
imx
machine-$(CONFIG_ARCH_H720X)
:=
h720x
machine-$(CONFIG_ARCH_AAEC2000)
:=
aaec2000
ifeq
($(CONFIG_ARCH_EBSA110),y)
# This is what happens if you forget the IOCS16 line.
...
...
arch/arm/common/dmabounce.c
View file @
91b90475
...
...
@@ -30,6 +30,8 @@
#include <linux/dmapool.h>
#include <linux/list.h>
#include <asm/cacheflush.h>
#undef DEBUG
#undef STATS
...
...
@@ -302,12 +304,24 @@ unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
DO_STATS
(
device_info
->
bounce_count
++
);
if
((
dir
==
DMA_FROM_DEVICE
)
||
(
dir
==
DMA_BIDIRECTIONAL
))
{
if
(
dir
==
DMA_FROM_DEVICE
||
dir
==
DMA_BIDIRECTIONAL
)
{
unsigned
long
ptr
;
dev_dbg
(
dev
,
"%s: copy back safe %p to unsafe %p size %d
\n
"
,
__func__
,
buf
->
safe
,
buf
->
ptr
,
size
);
memcpy
(
buf
->
ptr
,
buf
->
safe
,
size
);
/*
* DMA buffers must have the same cache properties
* as if they were really used for DMA - which means
* data must be written back to RAM. Note that
* we don't use dmac_flush_range() here for the
* bidirectional case because we know the cache
* lines will be coherent with the data written.
*/
ptr
=
(
unsigned
long
)
buf
->
ptr
;
dmac_clean_range
(
ptr
,
ptr
+
size
);
}
free_safe_buffer
(
device_info
,
buf
);
}
...
...
arch/arm/common/sharpsl_param.c
View file @
91b90475
...
...
@@ -22,7 +22,7 @@
* them early in the boot process, then pass them to the appropriate drivers.
* Not all devices use all paramaters but the format is common to all.
*/
#ifdef ARCH_SA1100
#ifdef
CONFIG_
ARCH_SA1100
#define PARAM_BASE 0xe8ffc000
#else
#define PARAM_BASE 0xa0000a00
...
...
arch/arm/configs/enp2611_defconfig
View file @
91b90475
...
...
@@ -50,7 +50,13 @@ CONFIG_BASE_SMALL=0
#
# Loadable module support
#
# CONFIG_MODULES is not set
CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
# CONFIG_MODULE_FORCE_UNLOAD is not set
CONFIG_OBSOLETE_MODPARM=y
# CONFIG_MODVERSIONS is not set
# CONFIG_MODULE_SRCVERSION_ALL is not set
CONFIG_KMOD=y
#
# System Type
...
...
arch/arm/configs/ixdp2400_defconfig
View file @
91b90475
...
...
@@ -50,7 +50,13 @@ CONFIG_BASE_SMALL=0
#
# Loadable module support
#
# CONFIG_MODULES is not set
CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
# CONFIG_MODULE_FORCE_UNLOAD is not set
CONFIG_OBSOLETE_MODPARM=y
# CONFIG_MODVERSIONS is not set
# CONFIG_MODULE_SRCVERSION_ALL is not set
CONFIG_KMOD=y
#
# System Type
...
...
arch/arm/configs/ixdp2401_defconfig
View file @
91b90475
...
...
@@ -50,7 +50,13 @@ CONFIG_BASE_SMALL=0
#
# Loadable module support
#
# CONFIG_MODULES is not set
CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
# CONFIG_MODULE_FORCE_UNLOAD is not set
CONFIG_OBSOLETE_MODPARM=y
# CONFIG_MODVERSIONS is not set
# CONFIG_MODULE_SRCVERSION_ALL is not set
CONFIG_KMOD=y
#
# System Type
...
...
arch/arm/configs/ixdp2800_defconfig
View file @
91b90475
...
...
@@ -50,7 +50,13 @@ CONFIG_BASE_SMALL=0
#
# Loadable module support
#
# CONFIG_MODULES is not set
CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
# CONFIG_MODULE_FORCE_UNLOAD is not set
CONFIG_OBSOLETE_MODPARM=y
# CONFIG_MODVERSIONS is not set
# CONFIG_MODULE_SRCVERSION_ALL is not set
CONFIG_KMOD=y
#
# System Type
...
...
arch/arm/configs/ixdp2801_defconfig
View file @
91b90475
...
...
@@ -50,7 +50,13 @@ CONFIG_BASE_SMALL=0
#
# Loadable module support
#
# CONFIG_MODULES is not set
CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
# CONFIG_MODULE_FORCE_UNLOAD is not set
CONFIG_OBSOLETE_MODPARM=y
# CONFIG_MODVERSIONS is not set
# CONFIG_MODULE_SRCVERSION_ALL is not set
CONFIG_KMOD=y
#
# System Type
...
...
arch/arm/kernel/Makefile
View file @
91b90475
...
...
@@ -6,7 +6,7 @@ AFLAGS_head.o := -DTEXTADDR=$(TEXTADDR) -DDATAADDR=$(DATAADDR)
# Object file lists.
obj-y
:=
arch.o compat.o dma.o entry-armv.o entry-common.o irq.o
\
obj-y
:=
compat.o dma.o entry-armv.o entry-common.o irq.o
\
process.o ptrace.o semaphore.o setup.o signal.o sys_arm.o
\
time.o traps.o
...
...
arch/arm/kernel/arch.c
deleted
100644 → 0
View file @
bcc408b7
/*
* linux/arch/arm/kernel/arch.c
*
* Architecture specific fixups.
*/
#include <linux/config.h>
#include <linux/init.h>
#include <linux/types.h>
#include <asm/elf.h>
#include <asm/page.h>
#include <asm/setup.h>
#include <asm/mach/arch.h>
unsigned
int
vram_size
;
#ifdef CONFIG_ARCH_ACORN
unsigned
int
memc_ctrl_reg
;
unsigned
int
number_mfm_drives
;
static
int
__init
parse_tag_acorn
(
const
struct
tag
*
tag
)
{
memc_ctrl_reg
=
tag
->
u
.
acorn
.
memc_control_reg
;
number_mfm_drives
=
tag
->
u
.
acorn
.
adfsdrives
;
switch
(
tag
->
u
.
acorn
.
vram_pages
)
{
case
512
:
vram_size
+=
PAGE_SIZE
*
256
;
case
256
:
vram_size
+=
PAGE_SIZE
*
256
;
default:
break
;
}
#if 0
if (vram_size) {
desc->video_start = 0x02000000;
desc->video_end = 0x02000000 + vram_size;
}
#endif
return
0
;
}
__tagtable
(
ATAG_ACORN
,
parse_tag_acorn
);
#endif
arch/arm/lib/ashldi3.c
View file @
91b90475
...
...
@@ -31,31 +31,26 @@ Boston, MA 02111-1307, USA. */
#include "gcclib.h"
DItype
__ashldi3
(
DItype
u
,
word_type
b
)
s64
__ashldi3
(
s64
u
,
int
b
)
{
DIunion
w
;
word_type
bm
;
DIunion
uu
;
if
(
b
==
0
)
return
u
;
uu
.
ll
=
u
;
bm
=
(
sizeof
(
SItype
)
*
BITS_PER_UNIT
)
-
b
;
if
(
bm
<=
0
)
{
w
.
s
.
low
=
0
;
w
.
s
.
high
=
(
USItype
)
uu
.
s
.
low
<<
-
bm
;
}
else
{
USItype
carries
=
(
USItype
)
uu
.
s
.
low
>>
bm
;
w
.
s
.
low
=
(
USItype
)
uu
.
s
.
low
<<
b
;
w
.
s
.
high
=
((
USItype
)
uu
.
s
.
high
<<
b
)
|
carries
;
}
return
w
.
ll
;
DIunion
w
;
int
bm
;
DIunion
uu
;
if
(
b
==
0
)
return
u
;
uu
.
ll
=
u
;
bm
=
(
sizeof
(
s32
)
*
BITS_PER_UNIT
)
-
b
;
if
(
bm
<=
0
)
{
w
.
s
.
low
=
0
;
w
.
s
.
high
=
(
u32
)
uu
.
s
.
low
<<
-
bm
;
}
else
{
u32
carries
=
(
u32
)
uu
.
s
.
low
>>
bm
;
w
.
s
.
low
=
(
u32
)
uu
.
s
.
low
<<
b
;
w
.
s
.
high
=
((
u32
)
uu
.
s
.
high
<<
b
)
|
carries
;
}
return
w
.
ll
;
}
arch/arm/lib/ashrdi3.c
View file @
91b90475
...
...
@@ -31,31 +31,27 @@ Boston, MA 02111-1307, USA. */
#include "gcclib.h"
DItype
__ashrdi3
(
DItype
u
,
word_type
b
)
s64
__ashrdi3
(
s64
u
,
int
b
)
{
DIunion
w
;
word_type
bm
;
DIunion
uu
;
if
(
b
==
0
)
return
u
;
uu
.
ll
=
u
;
bm
=
(
sizeof
(
SItype
)
*
BITS_PER_UNIT
)
-
b
;
if
(
bm
<=
0
)
{
/* w.s.high = 1..1 or 0..0 */
w
.
s
.
high
=
uu
.
s
.
high
>>
(
sizeof
(
SItype
)
*
BITS_PER_UNIT
-
1
);
w
.
s
.
low
=
uu
.
s
.
high
>>
-
bm
;
}
else
{
USItype
carries
=
(
USItype
)
uu
.
s
.
high
<<
bm
;
w
.
s
.
high
=
uu
.
s
.
high
>>
b
;
w
.
s
.
low
=
((
USItype
)
uu
.
s
.
low
>>
b
)
|
carries
;
}
return
w
.
ll
;
DIunion
w
;
int
bm
;
DIunion
uu
;
if
(
b
==
0
)
return
u
;
uu
.
ll
=
u
;
bm
=
(
sizeof
(
s32
)
*
BITS_PER_UNIT
)
-
b
;
if
(
bm
<=
0
)
{
/* w.s.high = 1..1 or 0..0 */
w
.
s
.
high
=
uu
.
s
.
high
>>
(
sizeof
(
s32
)
*
BITS_PER_UNIT
-
1
);
w
.
s
.
low
=
uu
.
s
.
high
>>
-
bm
;
}
else
{
u32
carries
=
(
u32
)
uu
.
s
.
high
<<
bm
;
w
.
s
.
high
=
uu
.
s
.
high
>>
b
;
w
.
s
.
low
=
((
u32
)
uu
.
s
.
low
>>
b
)
|
carries
;
}
return
w
.
ll
;
}
arch/arm/lib/gcclib.h
View file @
91b90475
/* gcclib.h -- definitions for various functions 'borrowed' from gcc-2.95.3 */
/* I Molton 29/07/01 */
#define BITS_PER_UNIT 8
#define SI_TYPE_SIZE (sizeof (SItype) * BITS_PER_UNIT)
#include <linux/types.h>
typedef
unsigned
int
UQItype
__attribute__
((
mode
(
QI
)));
typedef
int
SItype
__attribute__
((
mode
(
SI
)));
typedef
unsigned
int
USItype
__attribute__
((
mode
(
SI
)));
typedef
int
DItype
__attribute__
((
mode
(
DI
)));
typedef
int
word_type
__attribute__
((
mode
(
__word__
)));
typedef
unsigned
int
UDItype
__attribute__
((
mode
(
DI
)));
#define BITS_PER_UNIT 8
#define SI_TYPE_SIZE (sizeof(s32) * BITS_PER_UNIT)
#ifdef __ARMEB__
struct
DIstruct
{
SItype
high
,
low
;};
struct
DIstruct
{
s32
high
,
low
;
};
#else
struct
DIstruct
{
SItype
low
,
high
;};
struct
DIstruct
{
s32
low
,
high
;
};
#endif
typedef
union
{
struct
DIstruct
s
;
DItype
ll
;
typedef
union
{
struct
DIstruct
s
;
s64
ll
;
}
DIunion
;
arch/arm/lib/longlong.h
View file @
91b90475
...
...
@@ -26,18 +26,18 @@
#define __BITS4 (SI_TYPE_SIZE / 4)
#define __ll_B (1L << (SI_TYPE_SIZE / 2))
#define __ll_lowpart(t) ((
USItype
) (t) % __ll_B)
#define __ll_highpart(t) ((
USItype
) (t) / __ll_B)
#define __ll_lowpart(t) ((
u32
) (t) % __ll_B)
#define __ll_highpart(t) ((
u32
) (t) / __ll_B)
/* Define auxiliary asm macros.
1) umul_ppmm(high_prod, low_prod, multipler, multiplicand)
multiplies two
USItype
integers MULTIPLER and MULTIPLICAND,
and generates a two-part
USItype
product in HIGH_PROD and
multiplies two
u32
integers MULTIPLER and MULTIPLICAND,
and generates a two-part
u32
product in HIGH_PROD and
LOW_PROD.
2) __umulsidi3(a,b) multiplies two
USItype
integers A and B,
and returns a
UDItype
product. This is just a variant of umul_ppmm.
2) __umulsidi3(a,b) multiplies two
u32
integers A and B,
and returns a
u64
product. This is just a variant of umul_ppmm.
3) udiv_qrnnd(quotient, remainder, high_numerator, low_numerator,
denominator) divides a two-word unsigned integer, composed by the
...
...
@@ -77,23 +77,23 @@
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
__asm__ ("adds %1, %4, %5 \n\
adc %0, %2, %3" \
: "=r" ((
USItype
) (sh)), \
"=&r" ((
USItype
) (sl)) \
: "%r" ((
USItype
) (ah)), \
"rI" ((
USItype
) (bh)), \
"%r" ((
USItype
) (al)), \
"rI" ((
USItype
) (bl)))
: "=r" ((
u32
) (sh)), \
"=&r" ((
u32
) (sl)) \
: "%r" ((
u32
) (ah)), \
"rI" ((
u32
) (bh)), \
"%r" ((
u32
) (al)), \
"rI" ((
u32
) (bl)))
#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
__asm__ ("subs %1, %4, %5 \n\
sbc %0, %2, %3" \
: "=r" ((
USItype
) (sh)), \
"=&r" ((
USItype
) (sl)) \
: "r" ((
USItype
) (ah)), \
"rI" ((
USItype
) (bh)), \
"r" ((
USItype
) (al)), \
"rI" ((
USItype
) (bl)))
: "=r" ((
u32
) (sh)), \
"=&r" ((
u32
) (sl)) \
: "r" ((
u32
) (ah)), \
"rI" ((
u32
) (bh)), \
"r" ((
u32
) (al)), \
"rI" ((
u32
) (bl)))
#define umul_ppmm(xh, xl, a, b) \
{register
USItype
__t0, __t1, __t2; \
{register
u32
__t0, __t1, __t2; \
__asm__ ("%@ Inlined umul_ppmm \n\
mov %2, %5, lsr #16 \n\
mov %0, %6, lsr #16 \n\
...
...
@@ -107,14 +107,14 @@
addcs %0, %0, #65536 \n\
adds %1, %1, %3, lsl #16 \n\
adc %0, %0, %3, lsr #16" \
: "=&r" ((
USItype
) (xh)), \
"=r" ((
USItype
) (xl)), \
: "=&r" ((
u32
) (xh)), \
"=r" ((
u32
) (xl)), \
"=&r" (__t0), "=&r" (__t1), "=r" (__t2) \
: "r" ((
USItype
) (a)), \
"r" ((
USItype
) (b)));}
: "r" ((
u32
) (a)), \
"r" ((
u32
) (b)));}
#define UMUL_TIME 20
#define UDIV_TIME 100
#endif
/* __arm__ */
#endif
/* __arm__ */
#define __umulsidi3(u, v) \
({DIunion __w; \
...
...
@@ -123,14 +123,14 @@
#define __udiv_qrnnd_c(q, r, n1, n0, d) \
do { \
USItype
__d1, __d0, __q1, __q0; \
USItype
__r1, __r0, __m; \
u32
__d1, __d0, __q1, __q0; \
u32
__r1, __r0, __m; \
__d1 = __ll_highpart (d); \
__d0 = __ll_lowpart (d); \
\
__r1 = (n1) % __d1; \
__q1 = (n1) / __d1; \
__m = (
USItype
) __q1 * __d0; \
__m = (
u32
) __q1 * __d0; \
__r1 = __r1 * __ll_B | __ll_highpart (n0); \
if (__r1 < __m) \
{ \
...
...
@@ -143,7 +143,7 @@
\
__r0 = __r1 % __d1; \
__q0 = __r1 / __d1; \
__m = (
USItype
) __q0 * __d0; \
__m = (
u32
) __q0 * __d0; \
__r0 = __r0 * __ll_B | __ll_lowpart (n0); \
if (__r0 < __m) \
{ \
...
...
@@ -154,7 +154,7 @@
} \
__r0 -= __m; \
\
(q) = (
USItype
) __q1 * __ll_B | __q0; \
(q) = (
u32
) __q1 * __ll_B | __q0; \
(r) = __r0; \
} while (0)
...
...
@@ -163,14 +163,14 @@
#define count_leading_zeros(count, x) \
do { \
USItype
__xr = (x); \
USItype
__a; \
u32
__xr = (x); \
u32
__a; \
\
if (SI_TYPE_SIZE <= 32) \
{ \
__a = __xr < ((
USItype
)1<<2*__BITS4) \
? (__xr < ((
USItype
)1<<__BITS4) ? 0 : __BITS4) \
: (__xr < ((
USItype
)1<<3*__BITS4) ? 2*__BITS4 : 3*__BITS4); \
__a = __xr < ((
u32
)1<<2*__BITS4) \
? (__xr < ((
u32
)1<<__BITS4) ? 0 : __BITS4) \
: (__xr < ((
u32
)1<<3*__BITS4) ? 2*__BITS4 : 3*__BITS4); \
} \
else \
{ \
...
...
arch/arm/lib/lshrdi3.c
View file @
91b90475
...
...
@@ -31,31 +31,26 @@ Boston, MA 02111-1307, USA. */
#include "gcclib.h"
DItype
__lshrdi3
(
DItype
u
,
word_type
b
)
s64
__lshrdi3
(
s64
u
,
int
b
)
{
DIunion
w
;
word_type
bm
;
DIunion
uu
;
if
(
b
==
0
)
return
u
;
uu
.
ll
=
u
;
bm
=
(
sizeof
(
SItype
)
*
BITS_PER_UNIT
)
-
b
;
if
(
bm
<=
0
)
{
w
.
s
.
high
=
0
;
w
.
s
.
low
=
(
USItype
)
uu
.
s
.
high
>>
-
bm
;
}
else
{
USItype
carries
=
(
USItype
)
uu
.
s
.
high
<<
bm
;
w
.
s
.
high
=
(
USItype
)
uu
.
s
.
high
>>
b
;
w
.
s
.
low
=
((
USItype
)
uu
.
s
.
low
>>
b
)
|
carries
;
}
return
w
.
ll
;
DIunion
w
;
int
bm
;
DIunion
uu
;
if
(
b
==
0
)
return
u
;
uu
.
ll
=
u
;
bm
=
(
sizeof
(
s32
)
*
BITS_PER_UNIT
)
-
b
;
if
(
bm
<=
0
)
{
w
.
s
.
high
=
0
;
w
.
s
.
low
=
(
u32
)
uu
.
s
.
high
>>
-
bm
;
}
else
{
u32
carries
=
(
u32
)
uu
.
s
.
high
<<
bm
;
w
.
s
.
high
=
(
u32
)
uu
.
s
.
high
>>
b
;
w
.
s
.
low
=
((
u32
)
uu
.
s
.
low
>>
b
)
|
carries
;
}
return
w
.
ll
;
}
arch/arm/lib/muldi3.c
View file @
91b90475
...
...
@@ -32,7 +32,7 @@ Boston, MA 02111-1307, USA. */
#include "gcclib.h"
#define umul_ppmm(xh, xl, a, b) \
{register
USItype
__t0, __t1, __t2; \
{register
u32
__t0, __t1, __t2; \
__asm__ ("%@ Inlined umul_ppmm \n\
mov %2, %5, lsr #16 \n\
mov %0, %6, lsr #16 \n\
...
...
@@ -46,32 +46,27 @@ Boston, MA 02111-1307, USA. */
addcs %0, %0, #65536 \n\
adds %1, %1, %3, lsl #16 \n\
adc %0, %0, %3, lsr #16" \
: "=&r" ((
USItype
) (xh)), \
"=r" ((
USItype
) (xl)), \
: "=&r" ((
u32
) (xh)), \
"=r" ((
u32
) (xl)), \
"=&r" (__t0), "=&r" (__t1), "=r" (__t2) \
: "r" ((USItype) (a)), \
"r" ((USItype) (b)));}
: "r" ((u32) (a)), \
"r" ((u32) (b)));}
#define __umulsidi3(u, v) \
({DIunion __w; \
umul_ppmm (__w.s.high, __w.s.low, u, v); \
__w.ll; })
DItype
__muldi3
(
DItype
u
,
DItype
v
)
s64
__muldi3
(
s64
u
,
s64
v
)
{
DIunion
w
;
DIunion
uu
,
vv
;
DIunion
w
;
DIunion
uu
,
vv
;
uu
.
ll
=
u
,
vv
.
ll
=
v
;
uu
.
ll
=
u
,
vv
.
ll
=
v
;
w
.
ll
=
__umulsidi3
(
uu
.
s
.
low
,
vv
.
s
.
low
);
w
.
s
.
high
+=
((
USItype
)
uu
.
s
.
low
*
(
USItype
)
vv
.
s
.
high
+
(
USItype
)
uu
.
s
.
high
*
(
USItype
)
vv
.
s
.
low
);
w
.
ll
=
__umulsidi3
(
uu
.
s
.
low
,
vv
.
s
.
low
);
w
.
s
.
high
+=
((
u32
)
uu
.
s
.
low
*
(
u32
)
vv
.
s
.
high
+
(
u32
)
uu
.
s
.
high
*
(
u32
)
vv
.
s
.
low
);
return
w
.
ll
;
return
w
.
ll
;
}
arch/arm/lib/ucmpdi2.c
View file @
91b90475
...
...
@@ -31,21 +31,19 @@ Boston, MA 02111-1307, USA. */
#include "gcclib.h"
word_type
__ucmpdi2
(
DItype
a
,
DItype
b
)
int
__ucmpdi2
(
s64
a
,
s64
b
)
{
DIunion
au
,
bu
;
au
.
ll
=
a
,
bu
.
ll
=
b
;
if
((
USItype
)
au
.
s
.
high
<
(
USItype
)
bu
.
s
.
high
)
return
0
;
else
if
((
USItype
)
au
.
s
.
high
>
(
USItype
)
bu
.
s
.
high
)
return
2
;
if
((
USItype
)
au
.
s
.
low
<
(
USItype
)
bu
.
s
.
low
)
return
0
;
else
if
((
USItype
)
au
.
s
.
low
>
(
USItype
)
bu
.
s
.
low
)
return
2
;
return
1
;
DIunion
au
,
bu
;
au
.
ll
=
a
,
bu
.
ll
=
b
;
if
((
u32
)
au
.
s
.
high
<
(
u32
)
bu
.
s
.
high
)
return
0
;
else
if
((
u32
)
au
.
s
.
high
>
(
u32
)
bu
.
s
.
high
)
return
2
;
if
((
u32
)
au
.
s
.
low
<
(
u32
)
bu
.
s
.
low
)
return
0
;
else
if
((
u32
)
au
.
s
.
low
>
(
u32
)
bu
.
s
.
low
)
return
2
;
return
1
;
}
arch/arm/lib/udivdi3.c
View file @
91b90475
...
...
@@ -32,211 +32,191 @@ Boston, MA 02111-1307, USA. */
#include "gcclib.h"
#include "longlong.h"
static
const
UQItype
__clz_tab
[]
=
{
0
,
1
,
2
,
2
,
3
,
3
,
3
,
3
,
4
,
4
,
4
,
4
,
4
,
4
,
4
,
4
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
static
const
u8
__clz_tab
[]
=
{
0
,
1
,
2
,
2
,
3
,
3
,
3
,
3
,
4
,
4
,
4
,
4
,
4
,
4
,
4
,
4
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
};
UDItype
__udivmoddi4
(
UDItype
n
,
UDItype
d
,
UDItype
*
rp
)
u64
__udivmoddi4
(
u64
n
,
u64
d
,
u64
*
rp
)
{
DIunion
ww
;
DIunion
nn
,
dd
;
DIunion
rr
;
USItype
d0
,
d1
,
n0
,
n1
,
n2
;
USItype
q0
,
q1
;
USItype
b
,
bm
;
nn
.
ll
=
n
;
dd
.
ll
=
d
;
d0
=
dd
.
s
.
low
;
d1
=
dd
.
s
.
high
;
n0
=
nn
.
s
.
low
;
n1
=
nn
.
s
.
high
;
if
(
d1
==
0
)
{
if
(
d0
>
n1
)
{
/* 0q = nn / 0D */
count_leading_zeros
(
bm
,
d0
);
if
(
bm
!=
0
)
{
/* Normalize, i.e. make the most significant bit of the
denominator set. */
d0
=
d0
<<
bm
;
n1
=
(
n1
<<
bm
)
|
(
n0
>>
(
SI_TYPE_SIZE
-
bm
));
n0
=
n0
<<
bm
;
}
udiv_qrnnd
(
q0
,
n0
,
n1
,
n0
,
d0
);
q1
=
0
;
/* Remainder in n0 >> bm. */
}
else
{
/* qq = NN / 0d */
if
(
d0
==
0
)
d0
=
1
/
d0
;
/* Divide intentionally by zero. */
count_leading_zeros
(
bm
,
d0
);
if
(
bm
==
0
)
{
/* From (n1 >= d0) /\ (the most significant bit of d0 is set),
conclude (the most significant bit of n1 is set) /\ (the
leading quotient digit q1 = 1).
This special case is necessary, not an optimization.
(Shifts counts of SI_TYPE_SIZE are undefined.) */
n1
-=
d0
;
q1
=
1
;
}
else
{
/* Normalize. */
b
=
SI_TYPE_SIZE
-
bm
;
d0
=
d0
<<
bm
;
n2
=
n1
>>
b
;
n1
=
(
n1
<<
bm
)
|
(
n0
>>
b
);
n0
=
n0
<<
bm
;
udiv_qrnnd
(
q1
,
n1
,
n2
,
n1
,
d0
);
}
/* n1 != d0... */
udiv_qrnnd
(
q0
,
n0
,
n1
,
n0
,
d0
);
/* Remainder in n0 >> bm. */
}
if
(
rp
!=
0
)
{
rr
.
s
.
low
=
n0
>>
bm
;
rr
.
s
.
high
=
0
;
*
rp
=
rr
.
ll
;
}
}
else
{
if
(
d1
>
n1
)
{
/* 00 = nn / DD */
q0
=
0
;
q1
=
0
;
/* Remainder in n1n0. */
if
(
rp
!=
0
)
{
rr
.
s
.
low
=
n0
;
rr
.
s
.
high
=
n1
;
*
rp
=
rr
.
ll
;
}
}
else
{
/* 0q = NN / dd */
count_leading_zeros
(
bm
,
d1
);
if
(
bm
==
0
)
{
/* From (n1 >= d1) /\ (the most significant bit of d1 is set),
conclude (the most significant bit of n1 is set) /\ (the
quotient digit q0 = 0 or 1).
This special case is necessary, not an optimization. */
/* The condition on the next line takes advantage of that
n1 >= d1 (true due to program flow). */
if
(
n1
>
d1
||
n0
>=
d0
)
{
q0
=
1
;
sub_ddmmss
(
n1
,
n0
,
n1
,
n0
,
d1
,
d0
);
}
else
q0
=
0
;
q1
=
0
;
if
(
rp
!=
0
)
{
rr
.
s
.
low
=
n0
;
rr
.
s
.
high
=
n1
;
*
rp
=
rr
.
ll
;
}
}
else
{
USItype
m1
,
m0
;
/* Normalize. */
b
=
SI_TYPE_SIZE
-
bm
;
d1
=
(
d1
<<
bm
)
|
(
d0
>>
b
);
d0
=
d0
<<
bm
;
n2
=
n1
>>
b
;
n1
=
(
n1
<<
bm
)
|
(
n0
>>
b
);
n0
=
n0
<<
bm
;
udiv_qrnnd
(
q0
,
n1
,
n2
,
n1
,
d1
);
umul_ppmm
(
m1
,
m0
,
q0
,
d0
);
if
(
m1
>
n1
||
(
m1
==
n1
&&
m0
>
n0
))
{
q0
--
;
sub_ddmmss
(
m1
,
m0
,
m1
,
m0
,
d1
,
d0
);
}
q1
=
0
;
/* Remainder in (n1n0 - m1m0) >> bm. */
if
(
rp
!=
0
)
{
sub_ddmmss
(
n1
,
n0
,
n1
,
n0
,
m1
,
m0
);
rr
.
s
.
low
=
(
n1
<<
b
)
|
(
n0
>>
bm
);
rr
.
s
.
high
=
n1
>>
bm
;
*
rp
=
rr
.
ll
;
}
}
}
}
ww
.
s
.
low
=
q0
;
ww
.
s
.
high
=
q1
;
return
ww
.
ll
;
DIunion
ww
;
DIunion
nn
,
dd
;
DIunion
rr
;
u32
d0
,
d1
,
n0
,
n1
,
n2
;
u32
q0
,
q1
;
u32
b
,
bm
;
nn
.
ll
=
n
;
dd
.
ll
=
d
;
d0
=
dd
.
s
.
low
;
d1
=
dd
.
s
.
high
;
n0
=
nn
.
s
.
low
;
n1
=
nn
.
s
.
high
;
if
(
d1
==
0
)
{
if
(
d0
>
n1
)
{
/* 0q = nn / 0D */
count_leading_zeros
(
bm
,
d0
);
if
(
bm
!=
0
)
{
/* Normalize, i.e. make the most significant bit of the
denominator set. */
d0
=
d0
<<
bm
;
n1
=
(
n1
<<
bm
)
|
(
n0
>>
(
SI_TYPE_SIZE
-
bm
));
n0
=
n0
<<
bm
;
}
udiv_qrnnd
(
q0
,
n0
,
n1
,
n0
,
d0
);
q1
=
0
;
/* Remainder in n0 >> bm. */
}
else
{
/* qq = NN / 0d */
if
(
d0
==
0
)
d0
=
1
/
d0
;
/* Divide intentionally by zero. */
count_leading_zeros
(
bm
,
d0
);
if
(
bm
==
0
)
{
/* From (n1 >= d0) /\ (the most significant bit of d0 is set),
conclude (the most significant bit of n1 is set) /\ (the
leading quotient digit q1 = 1).
This special case is necessary, not an optimization.
(Shifts counts of SI_TYPE_SIZE are undefined.) */
n1
-=
d0
;
q1
=
1
;
}
else
{
/* Normalize. */
b
=
SI_TYPE_SIZE
-
bm
;
d0
=
d0
<<
bm
;
n2
=
n1
>>
b
;
n1
=
(
n1
<<
bm
)
|
(
n0
>>
b
);
n0
=
n0
<<
bm
;
udiv_qrnnd
(
q1
,
n1
,
n2
,
n1
,
d0
);
}
/* n1 != d0... */
udiv_qrnnd
(
q0
,
n0
,
n1
,
n0
,
d0
);
/* Remainder in n0 >> bm. */
}
if
(
rp
!=
0
)
{
rr
.
s
.
low
=
n0
>>
bm
;
rr
.
s
.
high
=
0
;
*
rp
=
rr
.
ll
;
}
}
else
{
if
(
d1
>
n1
)
{
/* 00 = nn / DD */
q0
=
0
;
q1
=
0
;
/* Remainder in n1n0. */
if
(
rp
!=
0
)
{
rr
.
s
.
low
=
n0
;
rr
.
s
.
high
=
n1
;
*
rp
=
rr
.
ll
;
}
}
else
{
/* 0q = NN / dd */
count_leading_zeros
(
bm
,
d1
);
if
(
bm
==
0
)
{
/* From (n1 >= d1) /\ (the most significant bit of d1 is set),
conclude (the most significant bit of n1 is set) /\ (the
quotient digit q0 = 0 or 1).
This special case is necessary, not an optimization. */
/* The condition on the next line takes advantage of that
n1 >= d1 (true due to program flow). */
if
(
n1
>
d1
||
n0
>=
d0
)
{
q0
=
1
;
sub_ddmmss
(
n1
,
n0
,
n1
,
n0
,
d1
,
d0
);
}
else
q0
=
0
;
q1
=
0
;
if
(
rp
!=
0
)
{
rr
.
s
.
low
=
n0
;
rr
.
s
.
high
=
n1
;
*
rp
=
rr
.
ll
;
}
}
else
{
u32
m1
,
m0
;
/* Normalize. */
b
=
SI_TYPE_SIZE
-
bm
;
d1
=
(
d1
<<
bm
)
|
(
d0
>>
b
);
d0
=
d0
<<
bm
;
n2
=
n1
>>
b
;
n1
=
(
n1
<<
bm
)
|
(
n0
>>
b
);
n0
=
n0
<<
bm
;
udiv_qrnnd
(
q0
,
n1
,
n2
,
n1
,
d1
);
umul_ppmm
(
m1
,
m0
,
q0
,
d0
);
if
(
m1
>
n1
||
(
m1
==
n1
&&
m0
>
n0
))
{
q0
--
;
sub_ddmmss
(
m1
,
m0
,
m1
,
m0
,
d1
,
d0
);
}
q1
=
0
;
/* Remainder in (n1n0 - m1m0) >> bm. */
if
(
rp
!=
0
)
{
sub_ddmmss
(
n1
,
n0
,
n1
,
n0
,
m1
,
m0
);
rr
.
s
.
low
=
(
n1
<<
b
)
|
(
n0
>>
bm
);
rr
.
s
.
high
=
n1
>>
bm
;
*
rp
=
rr
.
ll
;
}
}
}
}
ww
.
s
.
low
=
q0
;
ww
.
s
.
high
=
q1
;
return
ww
.
ll
;
}
UDItype
__udivdi3
(
UDItype
n
,
UDItype
d
)
u64
__udivdi3
(
u64
n
,
u64
d
)
{
return
__udivmoddi4
(
n
,
d
,
(
UDItype
*
)
0
);
return
__udivmoddi4
(
n
,
d
,
(
u64
*
)
0
);
}
UDItype
__umoddi3
(
UDItype
u
,
UDItype
v
)
u64
__umoddi3
(
u64
u
,
u64
v
)
{
UDItype
w
;
u64
w
;
(
void
)
__udivmoddi4
(
u
,
v
,
&
w
);
(
void
)
__udivmoddi4
(
u
,
v
,
&
w
);
return
w
;
return
w
;
}
arch/arm/mach-aaec2000/Kconfig
0 → 100644
View file @
91b90475
if ARCH_AAEC2000
menu "Agilent AAEC-2000 Implementations"
config MACH_AAED2000
bool "Agilent AAED-2000 Development Platform"
select CPU_ARM920T
endmenu
endif
arch/arm/mach-aaec2000/Makefile
0 → 100644
View file @
91b90475
#
# Makefile for the linux kernel.
#
# Common support (must be linked before board specific support)
obj-y
+=
core.o
# Specific board support
obj-$(CONFIG_MACH_AAED2000)
+=
aaed2000.o
arch/arm/mach-aaec2000/aaed2000.c
0 → 100644
View file @
91b90475
/*
* linux/arch/arm/mach-aaec2000/aaed2000.c
*
* Support for the Agilent AAED-2000 Development Platform.
*
* Copyright (c) 2005 Nicolas Bellido Y Ortega
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
*/
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/major.h>
#include <linux/interrupt.h>
#include <asm/setup.h>
#include <asm/memory.h>
#include <asm/mach-types.h>
#include <asm/hardware.h>
#include <asm/irq.h>
#include <asm/mach/arch.h>
#include <asm/mach/map.h>
#include <asm/mach/irq.h>
#include "core.h"
static
void
__init
aaed2000_init_irq
(
void
)
{
aaec2000_init_irq
();
}
static
void
__init
aaed2000_map_io
(
void
)
{
aaec2000_map_io
();
}
MACHINE_START
(
AAED2000
,
"Agilent AAED-2000 Development Platform"
)
MAINTAINER
(
"Nicolas Bellido Y Ortega"
)
BOOT_MEM
(
0xf0000000
,
PIO_BASE
,
VIO_BASE
)
MAPIO
(
aaed2000_map_io
)
INITIRQ
(
aaed2000_init_irq
)
.
timer
=
&
aaec2000_timer
,
MACHINE_END
arch/arm/mach-aaec2000/core.c
0 → 100644
View file @
91b90475
/*
* linux/arch/arm/mach-aaec2000/core.c
*
* Code common to all AAEC-2000 machines
*
* Copyright (c) 2005 Nicolas Bellido Y Ortega
*
* 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/config.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/list.h>
#include <linux/errno.h>
#include <linux/interrupt.h>
#include <linux/timex.h>
#include <linux/signal.h>
#include <asm/hardware.h>
#include <asm/irq.h>
#include <asm/mach/irq.h>
#include <asm/mach/time.h>
#include <asm/mach/map.h>
/*
* Common I/O mapping:
*
* Static virtual address mappings are as follow:
*
* 0xf8000000-0xf8001ffff: Devices connected to APB bus
* 0xf8002000-0xf8003ffff: Devices connected to AHB bus
*
* Below 0xe8000000 is reserved for vm allocation.
*
* The machine specific code must provide the extra mapping beside the
* default mapping provided here.
*/
static
struct
map_desc
standard_io_desc
[]
__initdata
=
{
/* virtual physical length type */
{
VIO_APB_BASE
,
PIO_APB_BASE
,
IO_APB_LENGTH
,
MT_DEVICE
},
{
VIO_AHB_BASE
,
PIO_AHB_BASE
,
IO_AHB_LENGTH
,
MT_DEVICE
}
};
void
__init
aaec2000_map_io
(
void
)
{
iotable_init
(
standard_io_desc
,
ARRAY_SIZE
(
standard_io_desc
));
}
/*
* Interrupt handling routines
*/
static
void
aaec2000_int_ack
(
unsigned
int
irq
)
{
IRQ_INTSR
=
1
<<
irq
;
}
static
void
aaec2000_int_mask
(
unsigned
int
irq
)
{
IRQ_INTENC
|=
(
1
<<
irq
);
}
static
void
aaec2000_int_unmask
(
unsigned
int
irq
)
{
IRQ_INTENS
|=
(
1
<<
irq
);
}
static
struct
irqchip
aaec2000_irq_chip
=
{
.
ack
=
aaec2000_int_ack
,
.
mask
=
aaec2000_int_mask
,
.
unmask
=
aaec2000_int_unmask
,
};
void
__init
aaec2000_init_irq
(
void
)
{
unsigned
int
i
;
for
(
i
=
0
;
i
<
NR_IRQS
;
i
++
)
{
set_irq_handler
(
i
,
do_level_IRQ
);
set_irq_chip
(
i
,
&
aaec2000_irq_chip
);
set_irq_flags
(
i
,
IRQF_VALID
);
}
/* Disable all interrupts */
IRQ_INTENC
=
0xffffffff
;
/* Clear any pending interrupts */
IRQ_INTSR
=
IRQ_INTSR
;
}
/*
* Time keeping
*/
/* IRQs are disabled before entering here from do_gettimeofday() */
static
unsigned
long
aaec2000_gettimeoffset
(
void
)
{
unsigned
long
ticks_to_match
,
elapsed
,
usec
;
/* Get ticks before next timer match */
ticks_to_match
=
TIMER1_LOAD
-
TIMER1_VAL
;
/* We need elapsed ticks since last match */
elapsed
=
LATCH
-
ticks_to_match
;
/* Now, convert them to usec */
usec
=
(
unsigned
long
)(
elapsed
*
(
tick_nsec
/
1000
))
/
LATCH
;
return
usec
;
}
/* We enter here with IRQs enabled */
static
irqreturn_t
aaec2000_timer_interrupt
(
int
irq
,
void
*
dev_id
,
struct
pt_regs
*
regs
)
{
/* TODO: Check timer accuracy */
write_seqlock
(
&
xtime_lock
);
timer_tick
(
regs
);
TIMER1_CLEAR
=
1
;
write_sequnlock
(
&
xtime_lock
);
return
IRQ_HANDLED
;
}
static
struct
irqaction
aaec2000_timer_irq
=
{
.
name
=
"AAEC-2000 Timer Tick"
,
.
flags
=
SA_INTERRUPT
,
.
handler
=
aaec2000_timer_interrupt
};
static
void
__init
aaec2000_timer_init
(
void
)
{
/* Disable timer 1 */
TIMER1_CTRL
=
0
;
/* We have somehow to generate a 100Hz clock.
* We then use the 508KHz timer in periodic mode.
*/
TIMER1_LOAD
=
LATCH
;
TIMER1_CLEAR
=
1
;
/* Clear interrupt */
setup_irq
(
INT_TMR1_OFL
,
&
aaec2000_timer_irq
);
TIMER1_CTRL
=
TIMER_CTRL_ENABLE
|
TIMER_CTRL_PERIODIC
|
TIMER_CTRL_CLKSEL_508K
;
}
struct
sys_timer
aaec2000_timer
=
{
.
init
=
aaec2000_timer_init
,
.
offset
=
aaec2000_gettimeoffset
,
};
arch/arm/mach-aaec2000/core.h
0 → 100644
View file @
91b90475
/*
* linux/arch/arm/mach-aaec2000/core.h
*
* Copyright (c) 2005 Nicolas Bellido Y Ortega
*
* 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.
*
*/
struct
sys_timer
;
extern
struct
sys_timer
aaec2000_timer
;
extern
void
__init
aaec2000_map_io
(
void
);
extern
void
__init
aaec2000_init_irq
(
void
);
arch/arm/mach-integrator/core.c
View file @
91b90475
...
...
@@ -227,7 +227,6 @@ integrator_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
* primary CPU
*/
if
(
hard_smp_processor_id
()
==
0
)
{
nmi_tick
();
timer_tick
(
regs
);
#ifdef CONFIG_SMP
smp_send_timer
();
...
...
arch/arm/mach-ixp2000/core.c
View file @
91b90475
...
...
@@ -162,12 +162,13 @@ void __init ixp2000_map_io(void)
static
unsigned
ticks_per_jiffy
;
static
unsigned
ticks_per_usec
;
static
unsigned
next_jiffy_time
;
static
volatile
unsigned
long
*
missing_jiffy_timer_csr
;
unsigned
long
ixp2000_gettimeoffset
(
void
)
{
unsigned
long
offset
;
offset
=
next_jiffy_time
-
*
IXP2000_T4_CSR
;
offset
=
next_jiffy_time
-
*
missing_jiffy_timer_csr
;
return
offset
/
ticks_per_usec
;
}
...
...
@@ -179,7 +180,7 @@ static int ixp2000_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
/* clear timer 1 */
ixp2000_reg_write
(
IXP2000_T1_CLR
,
1
);
while
((
next_jiffy_time
-
*
IXP2000_T4_CSR
)
>
ticks_per_jiffy
)
{
while
((
next_jiffy_time
-
*
missing_jiffy_timer_csr
)
>
ticks_per_jiffy
)
{
timer_tick
(
regs
);
next_jiffy_time
-=
ticks_per_jiffy
;
}
...
...
@@ -197,20 +198,37 @@ static struct irqaction ixp2000_timer_irq = {
void
__init
ixp2000_init_time
(
unsigned
long
tick_rate
)
{
ixp2000_reg_write
(
IXP2000_T1_CLR
,
0
);
ixp2000_reg_write
(
IXP2000_T4_CLR
,
0
);
ticks_per_jiffy
=
(
tick_rate
+
HZ
/
2
)
/
HZ
;
ticks_per_usec
=
tick_rate
/
1000000
;
/*
* We use timer 1 as our timer interrupt.
*/
ixp2000_reg_write
(
IXP2000_T1_CLR
,
0
);
ixp2000_reg_write
(
IXP2000_T1_CLD
,
ticks_per_jiffy
-
1
);
ixp2000_reg_write
(
IXP2000_T1_CTL
,
(
1
<<
7
));
/*
* We use T4 as a monotonic counter to track missed jiffies
* We use a second timer as a monotonic counter for tracking
* missed jiffies. The IXP2000 has four timers, but if we're
* on an A-step IXP2800, timer 2 and 3 don't work, so on those
* chips we use timer 4. Timer 4 is the only timer that can
* be used for the watchdog, so we use timer 2 if we're on a
* non-buggy chip.
*/
ixp2000_reg_write
(
IXP2000_T4_CLD
,
-
1
);
ixp2000_reg_write
(
IXP2000_T4_CTL
,
(
1
<<
7
));
if
((
*
IXP2000_PRODUCT_ID
&
0x001ffef0
)
==
0x00000000
)
{
printk
(
KERN_INFO
"Enabling IXP2800 erratum #25 workaround
\n
"
);
ixp2000_reg_write
(
IXP2000_T4_CLR
,
0
);
ixp2000_reg_write
(
IXP2000_T4_CLD
,
-
1
);
ixp2000_reg_write
(
IXP2000_T4_CTL
,
(
1
<<
7
));
missing_jiffy_timer_csr
=
IXP2000_T4_CSR
;
}
else
{
ixp2000_reg_write
(
IXP2000_T2_CLR
,
0
);
ixp2000_reg_write
(
IXP2000_T2_CLD
,
-
1
);
ixp2000_reg_write
(
IXP2000_T2_CTL
,
(
1
<<
7
));
missing_jiffy_timer_csr
=
IXP2000_T2_CSR
;
}
next_jiffy_time
=
0xffffffff
;
/* register for interrupt */
...
...
arch/arm/mach-versatile/Makefile
View file @
91b90475
...
...
@@ -5,3 +5,4 @@
obj-y
:=
core.o clock.o
obj-$(CONFIG_ARCH_VERSATILE_PB)
+=
versatile_pb.o
obj-$(CONFIG_MACH_VERSATILE_AB)
+=
versatile_ab.o
obj-$(CONFIG_PCI)
+=
pci.o
arch/arm/mach-versatile/core.c
View file @
91b90475
...
...
@@ -196,11 +196,15 @@ static struct map_desc versatile_io_desc[] __initdata = {
#ifdef CONFIG_DEBUG_LL
{
IO_ADDRESS
(
VERSATILE_UART0_BASE
),
VERSATILE_UART0_BASE
,
SZ_4K
,
MT_DEVICE
},
#endif
#ifdef FIXME
{
PCI_MEMORY_VADDR
,
PHYS_PCI_MEM_BASE
,
SZ_16M
,
MT_DEVICE
},
{
PCI_CONFIG_VADDR
,
PHYS_PCI_CONFIG_BASE
,
SZ_16M
,
MT_DEVICE
},
{
PCI_V3_VADDR
,
PHYS_PCI_V3_BASE
,
SZ_512K
,
MT_DEVICE
},
{
PCI_IO_VADDR
,
PHYS_PCI_IO_BASE
,
SZ_64K
,
MT_DEVICE
},
#ifdef CONFIG_PCI
{
IO_ADDRESS
(
VERSATILE_PCI_CORE_BASE
),
VERSATILE_PCI_CORE_BASE
,
SZ_4K
,
MT_DEVICE
},
{
VERSATILE_PCI_VIRT_BASE
,
VERSATILE_PCI_BASE
,
VERSATILE_PCI_BASE_SIZE
,
MT_DEVICE
},
{
VERSATILE_PCI_CFG_VIRT_BASE
,
VERSATILE_PCI_CFG_BASE
,
VERSATILE_PCI_CFG_BASE_SIZE
,
MT_DEVICE
},
#if 0
{ VERSATILE_PCI_VIRT_MEM_BASE0, VERSATILE_PCI_MEM_BASE0, SZ_16M, MT_DEVICE },
{ VERSATILE_PCI_VIRT_MEM_BASE1, VERSATILE_PCI_MEM_BASE1, SZ_16M, MT_DEVICE },
{ VERSATILE_PCI_VIRT_MEM_BASE2, VERSATILE_PCI_MEM_BASE2, SZ_16M, MT_DEVICE },
#endif
#endif
};
...
...
arch/arm/mach-versatile/pci.c
0 → 100644
View file @
91b90475
/*
* linux/arch/arm/mach-versatile/pci.c
*
* (C) Copyright Koninklijke Philips Electronics NV 2004. All rights reserved.
* You can redistribute and/or modify this software under the terms of version 2
* of the GNU General Public License as published by the Free Software Foundation.
* THIS SOFTWARE IS PROVIDED "AS IS" 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.
* Koninklijke Philips Electronics nor its subsidiaries is obligated to provide any support for this software.
*
* ARM Versatile PCI driver.
*
* 14/04/2005 Initial version, colin.king@philips.com
*
*/
#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/pci.h>
#include <linux/ptrace.h>
#include <linux/slab.h>
#include <linux/ioport.h>
#include <linux/interrupt.h>
#include <linux/spinlock.h>
#include <linux/init.h>
#include <asm/hardware.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/system.h>
#include <asm/mach/pci.h>
#include <asm/mach-types.h>
/*
* these spaces are mapped using the following base registers:
*
* Usage Local Bus Memory Base/Map registers used
*
* Mem 50000000 - 5FFFFFFF LB_BASE0/LB_MAP0, non prefetch
* Mem 60000000 - 6FFFFFFF LB_BASE1/LB_MAP1, prefetch
* IO 44000000 - 4FFFFFFF LB_BASE2/LB_MAP2, IO
* Cfg 42000000 - 42FFFFFF PCI config
*
*/
#define SYS_PCICTL IO_ADDRESS(VERSATILE_SYS_PCICTL)
#define PCI_IMAP0 IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x0)
#define PCI_IMAP1 IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x4)
#define PCI_IMAP2 IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x8)
#define PCI_SMAP0 IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x10)
#define PCI_SMAP1 IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x14)
#define PCI_SMAP2 IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0x18)
#define PCI_SELFID IO_ADDRESS(VERSATILE_PCI_CORE_BASE+0xc)
#define DEVICE_ID_OFFSET 0x00
#define CSR_OFFSET 0x04
#define CLASS_ID_OFFSET 0x08
#define VP_PCI_DEVICE_ID 0x030010ee
#define VP_PCI_CLASS_ID 0x0b400000
static
unsigned
long
pci_slot_ignore
=
0
;
static
int
__init
versatile_pci_slot_ignore
(
char
*
str
)
{
int
retval
;
int
slot
;
while
((
retval
=
get_option
(
&
str
,
&
slot
)))
{
if
((
slot
<
0
)
||
(
slot
>
31
))
{
printk
(
"Illegal slot value: %d
\n
"
,
slot
);
}
else
{
pci_slot_ignore
|=
(
1
<<
slot
);
}
}
return
1
;
}
__setup
(
"pci_slot_ignore="
,
versatile_pci_slot_ignore
);
static
unsigned
long
__pci_addr
(
struct
pci_bus
*
bus
,
unsigned
int
devfn
,
int
offset
)
{
unsigned
int
busnr
=
bus
->
number
;
/*
* Trap out illegal values
*/
if
(
offset
>
255
)
BUG
();
if
(
busnr
>
255
)
BUG
();
if
(
devfn
>
255
)
BUG
();
return
(
VERSATILE_PCI_CFG_VIRT_BASE
|
(
busnr
<<
16
)
|
(
PCI_SLOT
(
devfn
)
<<
11
)
|
(
PCI_FUNC
(
devfn
)
<<
8
)
|
offset
);
}
static
int
versatile_read_config
(
struct
pci_bus
*
bus
,
unsigned
int
devfn
,
int
where
,
int
size
,
u32
*
val
)
{
unsigned
long
addr
=
__pci_addr
(
bus
,
devfn
,
where
);
u32
v
;
int
slot
=
PCI_SLOT
(
devfn
);
if
(
pci_slot_ignore
&
(
1
<<
slot
))
{
/* Ignore this slot */
switch
(
size
)
{
case
1
:
v
=
0xff
;
break
;
case
2
:
v
=
0xffff
;
break
;
default:
v
=
0xffffffff
;
}
}
else
{
switch
(
size
)
{
case
1
:
addr
&=
~
3
;
v
=
__raw_readb
(
addr
);
break
;
case
2
:
v
=
__raw_readl
(
addr
&
~
3
);
if
(
addr
&
2
)
v
>>=
16
;
v
&=
0xffff
;
break
;
default:
addr
&=
~
3
;
v
=
__raw_readl
(
addr
);
break
;
}
}
*
val
=
v
;
return
PCIBIOS_SUCCESSFUL
;
}
static
int
versatile_write_config
(
struct
pci_bus
*
bus
,
unsigned
int
devfn
,
int
where
,
int
size
,
u32
val
)
{
unsigned
long
addr
=
__pci_addr
(
bus
,
devfn
,
where
);
int
slot
=
PCI_SLOT
(
devfn
);
if
(
pci_slot_ignore
&
(
1
<<
slot
))
{
return
PCIBIOS_SUCCESSFUL
;
}
switch
(
size
)
{
case
1
:
__raw_writeb
((
u8
)
val
,
addr
);
break
;
case
2
:
__raw_writew
((
u16
)
val
,
addr
);
break
;
case
4
:
__raw_writel
(
val
,
addr
);
break
;
}
return
PCIBIOS_SUCCESSFUL
;
}
static
struct
pci_ops
pci_versatile_ops
=
{
.
read
=
versatile_read_config
,
.
write
=
versatile_write_config
,
};
static
struct
resource
io_mem
=
{
.
name
=
"PCI I/O space"
,
.
start
=
VERSATILE_PCI_MEM_BASE0
,
.
end
=
VERSATILE_PCI_MEM_BASE0
+
VERSATILE_PCI_MEM_BASE0_SIZE
-
1
,
.
flags
=
IORESOURCE_IO
,
};
static
struct
resource
non_mem
=
{
.
name
=
"PCI non-prefetchable"
,
.
start
=
VERSATILE_PCI_MEM_BASE1
,
.
end
=
VERSATILE_PCI_MEM_BASE1
+
VERSATILE_PCI_MEM_BASE1_SIZE
-
1
,
.
flags
=
IORESOURCE_MEM
,
};
static
struct
resource
pre_mem
=
{
.
name
=
"PCI prefetchable"
,
.
start
=
VERSATILE_PCI_MEM_BASE2
,
.
end
=
VERSATILE_PCI_MEM_BASE2
+
VERSATILE_PCI_MEM_BASE2_SIZE
-
1
,
.
flags
=
IORESOURCE_MEM
|
IORESOURCE_PREFETCH
,
};
static
int
__init
pci_versatile_setup_resources
(
struct
resource
**
resource
)
{
int
ret
=
0
;
ret
=
request_resource
(
&
iomem_resource
,
&
io_mem
);
if
(
ret
)
{
printk
(
KERN_ERR
"PCI: unable to allocate I/O "
"memory region (%d)
\n
"
,
ret
);
goto
out
;
}
ret
=
request_resource
(
&
iomem_resource
,
&
non_mem
);
if
(
ret
)
{
printk
(
KERN_ERR
"PCI: unable to allocate non-prefetchable "
"memory region (%d)
\n
"
,
ret
);
goto
release_io_mem
;
}
ret
=
request_resource
(
&
iomem_resource
,
&
pre_mem
);
if
(
ret
)
{
printk
(
KERN_ERR
"PCI: unable to allocate prefetchable "
"memory region (%d)
\n
"
,
ret
);
goto
release_non_mem
;
}
/*
* bus->resource[0] is the IO resource for this bus
* bus->resource[1] is the mem resource for this bus
* bus->resource[2] is the prefetch mem resource for this bus
*/
resource
[
0
]
=
&
io_mem
;
resource
[
1
]
=
&
non_mem
;
resource
[
2
]
=
&
pre_mem
;
goto
out
;
release_non_mem:
release_resource
(
&
non_mem
);
release_io_mem:
release_resource
(
&
io_mem
);
out:
return
ret
;
}
int
__init
pci_versatile_setup
(
int
nr
,
struct
pci_sys_data
*
sys
)
{
int
ret
=
0
;
int
i
;
int
myslot
=
-
1
;
unsigned
long
val
;
if
(
nr
==
0
)
{
sys
->
mem_offset
=
0
;
ret
=
pci_versatile_setup_resources
(
sys
->
resource
);
if
(
ret
<
0
)
{
printk
(
"pci_versatile_setup: resources... oops?
\n
"
);
goto
out
;
}
}
else
{
printk
(
"pci_versatile_setup: resources... nr == 0??
\n
"
);
goto
out
;
}
__raw_writel
(
VERSATILE_PCI_MEM_BASE0
>>
28
,
PCI_IMAP0
);
__raw_writel
(
VERSATILE_PCI_MEM_BASE1
>>
28
,
PCI_IMAP1
);
__raw_writel
(
VERSATILE_PCI_MEM_BASE2
>>
28
,
PCI_IMAP2
);
__raw_writel
(
1
,
SYS_PCICTL
);
val
=
__raw_readl
(
SYS_PCICTL
);
if
(
!
(
val
&
1
))
{
printk
(
"Not plugged into PCI backplane!
\n
"
);
ret
=
-
EIO
;
goto
out
;
}
/*
* We need to discover the PCI core first to configure itself
* before the main PCI probing is performed
*/
for
(
i
=
0
;
i
<
32
;
i
++
)
{
if
((
__raw_readl
(
VERSATILE_PCI_VIRT_BASE
+
(
i
<<
11
)
+
DEVICE_ID_OFFSET
)
==
VP_PCI_DEVICE_ID
)
&&
(
__raw_readl
(
VERSATILE_PCI_VIRT_BASE
+
(
i
<<
11
)
+
CLASS_ID_OFFSET
)
==
VP_PCI_CLASS_ID
))
{
myslot
=
i
;
__raw_writel
(
myslot
,
PCI_SELFID
);
val
=
__raw_readl
(
VERSATILE_PCI_CFG_VIRT_BASE
+
(
myslot
<<
11
)
+
CSR_OFFSET
);
val
|=
(
1
<<
2
);
__raw_writel
(
val
,
VERSATILE_PCI_CFG_VIRT_BASE
+
(
myslot
<<
11
)
+
CSR_OFFSET
);
break
;
}
}
if
(
myslot
==
-
1
)
{
printk
(
"Cannot find PCI core!
\n
"
);
ret
=
-
EIO
;
}
else
{
printk
(
"PCI core found (slot %d)
\n
"
,
myslot
);
/* Do not to map Versatile FPGA PCI device
into memory space as we are short of
mappable memory */
pci_slot_ignore
|=
(
1
<<
myslot
);
ret
=
1
;
}
out:
return
ret
;
}
struct
pci_bus
*
pci_versatile_scan_bus
(
int
nr
,
struct
pci_sys_data
*
sys
)
{
return
pci_scan_bus
(
sys
->
busnr
,
&
pci_versatile_ops
,
sys
);
}
/*
* V3_LB_BASE? - local bus address
* V3_LB_MAP? - pci bus address
*/
void
__init
pci_versatile_preinit
(
void
)
{
}
void
__init
pci_versatile_postinit
(
void
)
{
}
/*
* map the specified device/slot/pin to an IRQ. Different backplanes may need to modify this.
*/
static
int
__init
versatile_map_irq
(
struct
pci_dev
*
dev
,
u8
slot
,
u8
pin
)
{
int
irq
;
int
devslot
=
PCI_SLOT
(
dev
->
devfn
);
/* slot, pin, irq
24 1 27
25 1 28 untested
26 1 29
27 1 30 untested
*/
irq
=
27
+
((
slot
+
pin
+
2
)
%
3
);
/* Fudged */
printk
(
"map irq: slot %d, pin %d, devslot %d, irq: %d
\n
"
,
slot
,
pin
,
devslot
,
irq
);
return
irq
;
}
static
struct
hw_pci
versatile_pci
__initdata
=
{
.
swizzle
=
NULL
,
.
map_irq
=
versatile_map_irq
,
.
nr_controllers
=
1
,
.
setup
=
pci_versatile_setup
,
.
scan
=
pci_versatile_scan_bus
,
.
preinit
=
pci_versatile_preinit
,
.
postinit
=
pci_versatile_postinit
,
};
static
int
__init
versatile_pci_init
(
void
)
{
pci_common_init
(
&
versatile_pci
);
return
0
;
}
subsys_initcall
(
versatile_pci_init
);
arch/arm/mm/Kconfig
View file @
91b90475
...
...
@@ -62,7 +62,7 @@ config CPU_ARM720T
# ARM920T
config CPU_ARM920T
bool "Support ARM920T processor" if !ARCH_S3C2410
depends on ARCH_INTEGRATOR || ARCH_S3C2410 || ARCH_IMX
depends on ARCH_INTEGRATOR || ARCH_S3C2410 || ARCH_IMX
|| ARCH_AAEC2000
default y if ARCH_S3C2410
select CPU_32v4
select CPU_ABRT_EV4T
...
...
arch/arm/mm/copypage-v6.c
View file @
91b90475
...
...
@@ -30,8 +30,6 @@
static
DEFINE_SPINLOCK
(
v6_lock
);
#define DCACHE_COLOUR(vaddr) ((vaddr & (SHMLBA - 1)) >> PAGE_SHIFT)
/*
* Copy the user page. No aliasing to deal with so we can just
* attack the kernel's existing mapping of these pages.
...
...
@@ -55,7 +53,7 @@ void v6_clear_user_page_nonaliasing(void *kaddr, unsigned long vaddr)
*/
void
v6_copy_user_page_aliasing
(
void
*
kto
,
const
void
*
kfrom
,
unsigned
long
vaddr
)
{
unsigned
int
offset
=
D
CACHE_COLOUR
(
vaddr
);
unsigned
int
offset
=
CACHE_COLOUR
(
vaddr
);
unsigned
long
from
,
to
;
/*
...
...
@@ -95,7 +93,7 @@ void v6_copy_user_page_aliasing(void *kto, const void *kfrom, unsigned long vadd
*/
void
v6_clear_user_page_aliasing
(
void
*
kaddr
,
unsigned
long
vaddr
)
{
unsigned
int
offset
=
D
CACHE_COLOUR
(
vaddr
);
unsigned
int
offset
=
CACHE_COLOUR
(
vaddr
);
unsigned
long
to
=
to_address
+
(
offset
<<
PAGE_SHIFT
);
/*
...
...
arch/arm/mm/fault-armv.c
View file @
91b90475
...
...
@@ -77,9 +77,8 @@ static int adjust_pte(struct vm_area_struct *vma, unsigned long address)
}
static
void
make_coherent
(
struct
vm_area_struct
*
vma
,
unsigned
long
addr
,
struct
page
*
page
,
int
dirty
)
make_coherent
(
struct
address_space
*
mapping
,
struct
vm_area_struct
*
vma
,
unsigned
long
addr
,
unsigned
long
pfn
)
{
struct
address_space
*
mapping
=
page_mapping
(
page
);
struct
mm_struct
*
mm
=
vma
->
vm_mm
;
struct
vm_area_struct
*
mpnt
;
struct
prio_tree_iter
iter
;
...
...
@@ -87,9 +86,6 @@ make_coherent(struct vm_area_struct *vma, unsigned long addr, struct page *page,
pgoff_t
pgoff
;
int
aliases
=
0
;
if
(
!
mapping
)
return
;
pgoff
=
vma
->
vm_pgoff
+
((
addr
-
vma
->
vm_start
)
>>
PAGE_SHIFT
);
/*
...
...
@@ -115,9 +111,11 @@ make_coherent(struct vm_area_struct *vma, unsigned long addr, struct page *page,
if
(
aliases
)
adjust_pte
(
vma
,
addr
);
else
flush_cache_page
(
vma
,
addr
,
p
age_to_pfn
(
page
)
);
flush_cache_page
(
vma
,
addr
,
p
fn
);
}
void
__flush_dcache_page
(
struct
address_space
*
mapping
,
struct
page
*
page
);
/*
* Take care of architecture specific things when placing a new PTE into
* a page table, or changing an existing PTE. Basically, there are two
...
...
@@ -134,29 +132,22 @@ make_coherent(struct vm_area_struct *vma, unsigned long addr, struct page *page,
void
update_mmu_cache
(
struct
vm_area_struct
*
vma
,
unsigned
long
addr
,
pte_t
pte
)
{
unsigned
long
pfn
=
pte_pfn
(
pte
);
struct
address_space
*
mapping
;
struct
page
*
page
;
if
(
!
pfn_valid
(
pfn
))
return
;
page
=
pfn_to_page
(
pfn
);
if
(
page_mapping
(
page
))
{
mapping
=
page_mapping
(
page
);
if
(
mapping
)
{
int
dirty
=
test_and_clear_bit
(
PG_dcache_dirty
,
&
page
->
flags
);
if
(
dirty
)
{
/*
* This is our first userspace mapping of this page.
* Ensure that the physical page is coherent with
* the kernel mapping.
*
* FIXME: only need to do this on VIVT and aliasing
* VIPT cache architectures. We can do that
* by choosing whether to set this bit...
*/
__cpuc_flush_dcache_page
(
page_address
(
page
));
}
if
(
dirty
)
__flush_dcache_page
(
mapping
,
page
);
if
(
cache_is_vivt
())
make_coherent
(
vma
,
addr
,
page
,
dirty
);
make_coherent
(
mapping
,
vma
,
addr
,
pfn
);
}
}
...
...
arch/arm/mm/flush.c
View file @
91b90475
...
...
@@ -37,13 +37,8 @@ static void flush_pfn_alias(unsigned long pfn, unsigned long vaddr)
#define flush_pfn_alias(pfn,vaddr) do { } while (0)
#endif
static
void
__flush_dcache_page
(
struct
address_space
*
mapping
,
struct
page
*
page
)
void
__flush_dcache_page
(
struct
address_space
*
mapping
,
struct
page
*
page
)
{
struct
mm_struct
*
mm
=
current
->
active_mm
;
struct
vm_area_struct
*
mpnt
;
struct
prio_tree_iter
iter
;
pgoff_t
pgoff
;
/*
* Writeback any data associated with the kernel mapping of this
* page. This ensures that data in the physical page is mutually
...
...
@@ -52,24 +47,21 @@ static void __flush_dcache_page(struct address_space *mapping, struct page *page
__cpuc_flush_dcache_page
(
page_address
(
page
));
/*
* If there's no mapping pointer here, then this page isn't
* visible to userspace yet, so there are no cache lines
* associated with any other aliases.
*/
if
(
!
mapping
)
return
;
/*
* This is a page cache page. If we have a VIPT cache, we
* only need to do one flush - which would be at the relevant
* If this is a page cache page, and we have an aliasing VIPT cache,
* we only need to do one flush - which would be at the relevant
* userspace colour, which is congruent with page->index.
*/
if
(
cache_is_vipt
())
{
if
(
cache_is_vipt_aliasing
())
flush_pfn_alias
(
page_to_pfn
(
page
),
page
->
index
<<
PAGE_CACHE_SHIFT
);
return
;
}
if
(
mapping
&&
cache_is_vipt_aliasing
())
flush_pfn_alias
(
page_to_pfn
(
page
),
page
->
index
<<
PAGE_CACHE_SHIFT
);
}
static
void
__flush_dcache_aliases
(
struct
address_space
*
mapping
,
struct
page
*
page
)
{
struct
mm_struct
*
mm
=
current
->
active_mm
;
struct
vm_area_struct
*
mpnt
;
struct
prio_tree_iter
iter
;
pgoff_t
pgoff
;
/*
* There are possible user space mappings of this page:
...
...
@@ -116,12 +108,12 @@ void flush_dcache_page(struct page *page)
{
struct
address_space
*
mapping
=
page_mapping
(
page
);
if
(
cache_is_vipt_nonaliasing
())
return
;
if
(
mapping
&&
!
mapping_mapped
(
mapping
))
set_bit
(
PG_dcache_dirty
,
&
page
->
flags
);
else
else
{
__flush_dcache_page
(
mapping
,
page
);
if
(
mapping
&&
cache_is_vivt
())
__flush_dcache_aliases
(
mapping
,
page
);
}
}
EXPORT_SYMBOL
(
flush_dcache_page
);
arch/arm/mm/ioremap.c
View file @
91b90475
...
...
@@ -170,3 +170,50 @@ void __iounmap(void __iomem *addr)
vfree
((
void
*
)
(
PAGE_MASK
&
(
unsigned
long
)
addr
));
}
EXPORT_SYMBOL
(
__iounmap
);
#ifdef __io
void
__iomem
*
ioport_map
(
unsigned
long
port
,
unsigned
int
nr
)
{
return
__io
(
port
);
}
EXPORT_SYMBOL
(
ioport_map
);
void
ioport_unmap
(
void
__iomem
*
addr
)
{
}
EXPORT_SYMBOL
(
ioport_unmap
);
#endif
#ifdef CONFIG_PCI
#include <linux/pci.h>
#include <linux/ioport.h>
void
__iomem
*
pci_iomap
(
struct
pci_dev
*
dev
,
int
bar
,
unsigned
long
maxlen
)
{
unsigned
long
start
=
pci_resource_start
(
dev
,
bar
);
unsigned
long
len
=
pci_resource_len
(
dev
,
bar
);
unsigned
long
flags
=
pci_resource_flags
(
dev
,
bar
);
if
(
!
len
||
!
start
)
return
NULL
;
if
(
maxlen
&&
len
>
maxlen
)
len
=
maxlen
;
if
(
flags
&
IORESOURCE_IO
)
return
ioport_map
(
start
,
len
);
if
(
flags
&
IORESOURCE_MEM
)
{
if
(
flags
&
IORESOURCE_CACHEABLE
)
return
ioremap
(
start
,
len
);
return
ioremap_nocache
(
start
,
len
);
}
return
NULL
;
}
EXPORT_SYMBOL
(
pci_iomap
);
void
pci_iounmap
(
struct
pci_dev
*
dev
,
void
__iomem
*
addr
)
{
if
((
unsigned
long
)
addr
>=
VMALLOC_START
&&
(
unsigned
long
)
addr
<
VMALLOC_END
)
iounmap
(
addr
);
}
EXPORT_SYMBOL
(
pci_iounmap
);
#endif
drivers/char/watchdog/ixp2000_wdt.c
View file @
91b90475
...
...
@@ -192,7 +192,12 @@ static struct miscdevice ixp2000_wdt_miscdev =
static
int
__init
ixp2000_wdt_init
(
void
)
{
wdt_tick_rate
=
(
*
IXP2000_T1_CLD
*
HZ
)
/
256
;;
if
((
*
IXP2000_PRODUCT_ID
&
0x001ffef0
)
==
0x00000000
)
{
printk
(
KERN_INFO
"Unable to use IXP2000 watchdog due to IXP2800 erratum #25.
\n
"
);
return
-
EIO
;
}
wdt_tick_rate
=
(
*
IXP2000_T1_CLD
*
HZ
)
/
256
;
return
misc_register
(
&
ixp2000_wdt_miscdev
);
}
...
...
include/asm-arm/arch-aaec2000/aaec2000.h
0 → 100644
View file @
91b90475
/*
* linux/include/asm-arm/arch-aaec2000/aaec2000.h
*
* AAEC-2000 registers definition
*
* Copyright (c) 2005 Nicolas Bellido Y Ortega
*
* 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.
*/
#ifndef __ASM_ARCH_AAEC2000_H
#define __ASM_ARCH_AAEC2000_H
#ifndef __ASM_ARCH_HARDWARE_H
#error You must include hardware.h not this file
#endif
/* __ASM_ARCH_HARDWARE_H */
/* Interrupt controller */
#define IRQ_BASE __REG(0x80000500)
#define IRQ_INTSR __REG(0x80000500)
/* Int Status Register */
#define IRQ_INTRSR __REG(0x80000504)
/* Int Raw (unmasked) Status */
#define IRQ_INTENS __REG(0x80000508)
/* Int Enable Set */
#define IRQ_INTENC __REG(0x8000050c)
/* Int Enable Clear */
/* UART 1 */
#define UART1_BASE __REG(0x80000600)
#define UART1_DR __REG(0x80000600)
/* Data/FIFO Register */
#define UART1_LCR __REG(0x80000604)
/* Link Control Register */
#define UART1_BRCR __REG(0x80000608)
/* Baud Rate Control Register */
#define UART1_CR __REG(0x8000060c)
/* Control Register */
#define UART1_SR __REG(0x80000610)
/* Status Register */
#define UART1_INT __REG(0x80000614)
/* Interrupt Status Register */
#define UART1_INTM __REG(0x80000618)
/* Interrupt Mask Register */
#define UART1_INTRES __REG(0x8000061c)
/* Int Result (masked status) Register */
/* UART 2 */
#define UART2_BASE __REG(0x80000700)
#define UART2_DR __REG(0x80000700)
/* Data/FIFO Register */
#define UART2_LCR __REG(0x80000704)
/* Link Control Register */
#define UART2_BRCR __REG(0x80000708)
/* Baud Rate Control Register */
#define UART2_CR __REG(0x8000070c)
/* Control Register */
#define UART2_SR __REG(0x80000710)
/* Status Register */
#define UART2_INT __REG(0x80000714)
/* Interrupt Status Register */
#define UART2_INTM __REG(0x80000718)
/* Interrupt Mask Register */
#define UART2_INTRES __REG(0x8000071c)
/* Int Result (masked status) Register */
/* UART 3 */
#define UART3_BASE __REG(0x80000800)
#define UART3_DR __REG(0x80000800)
/* Data/FIFO Register */
#define UART3_LCR __REG(0x80000804)
/* Link Control Register */
#define UART3_BRCR __REG(0x80000808)
/* Baud Rate Control Register */
#define UART3_CR __REG(0x8000080c)
/* Control Register */
#define UART3_SR __REG(0x80000810)
/* Status Register */
#define UART3_INT __REG(0x80000814)
/* Interrupt Status Register */
#define UART3_INTM __REG(0x80000818)
/* Interrupt Mask Register */
#define UART3_INTRES __REG(0x8000081c)
/* Int Result (masked status) Register */
/* These are used in some places */
#define _UART1_BASE __PREG(UART1_BASE)
#define _UART2_BASE __PREG(UART2_BASE)
#define _UART3_BASE __PREG(UART3_BASE)
/* UART Registers Offsets */
#define UART_DR 0x00
#define UART_LCR 0x04
#define UART_BRCR 0x08
#define UART_CR 0x0c
#define UART_SR 0x10
#define UART_INT 0x14
#define UART_INTM 0x18
#define UART_INTRES 0x1c
/* UART_LCR Bitmask */
#define UART_LCR_BRK (1 << 0)
/* Send Break */
#define UART_LCR_PEN (1 << 1)
/* Parity Enable */
#define UART_LCR_EP (1 << 2)
/* Even/Odd Parity */
#define UART_LCR_S2 (1 << 3)
/* One/Two Stop bits */
#define UART_LCR_FIFO (1 << 4)
/* FIFO Enable */
#define UART_LCR_WL5 (0 << 5)
/* Word Length - 5 bits */
#define UART_LCR_WL6 (1 << 5)
/* Word Length - 6 bits */
#define UART_LCR_WL7 (1 << 6)
/* Word Length - 7 bits */
#define UART_LCR_WL8 (1 << 7)
/* Word Length - 8 bits */
/* UART_CR Bitmask */
#define UART_CR_EN (1 << 0)
/* UART Enable */
#define UART_CR_SIR (1 << 1)
/* IrDA SIR Enable */
#define UART_CR_SIRLP (1 << 2)
/* Low Power IrDA Enable */
#define UART_CR_RXP (1 << 3)
/* Receive Pin Polarity */
#define UART_CR_TXP (1 << 4)
/* Transmit Pin Polarity */
#define UART_CR_MXP (1 << 5)
/* Modem Pin Polarity */
#define UART_CR_LOOP (1 << 6)
/* Loopback Mode */
/* UART_SR Bitmask */
#define UART_SR_CTS (1 << 0)
/* Clear To Send Status */
#define UART_SR_DSR (1 << 1)
/* Data Set Ready Status */
#define UART_SR_DCD (1 << 2)
/* Data Carrier Detect Status */
#define UART_SR_TxBSY (1 << 3)
/* Transmitter Busy Status */
#define UART_SR_RxFE (1 << 4)
/* Receive FIFO Empty Status */
#define UART_SR_TxFF (1 << 5)
/* Transmit FIFO Full Status */
#define UART_SR_RxFF (1 << 6)
/* Receive FIFO Full Status */
#define UART_SR_TxFE (1 << 7)
/* Transmit FIFO Empty Status */
/* UART_INT Bitmask */
#define UART_INT_RIS (1 << 0)
/* Rx Interrupt */
#define UART_INT_TIS (1 << 1)
/* Tx Interrupt */
#define UART_INT_MIS (1 << 2)
/* Modem Interrupt */
#define UART_INT_RTIS (1 << 3)
/* Receive Timeout Interrupt */
/* Timer 1 */
#define TIMER1_BASE __REG(0x80000c00)
#define TIMER1_LOAD __REG(0x80000c00)
/* Timer 1 Load Register */
#define TIMER1_VAL __REG(0x80000c04)
/* Timer 1 Value Register */
#define TIMER1_CTRL __REG(0x80000c08)
/* Timer 1 Control Register */
#define TIMER1_CLEAR __REG(0x80000c0c)
/* Timer 1 Clear Register */
/* Timer 2 */
#define TIMER2_BASE __REG(0x80000d00)
#define TIMER2_LOAD __REG(0x80000d00)
/* Timer 2 Load Register */
#define TIMER2_VAL __REG(0x80000d04)
/* Timer 2 Value Register */
#define TIMER2_CTRL __REG(0x80000d08)
/* Timer 2 Control Register */
#define TIMER2_CLEAR __REG(0x80000d0c)
/* Timer 2 Clear Register */
/* Timer 3 */
#define TIMER3_BASE __REG(0x80000e00)
#define TIMER3_LOAD __REG(0x80000e00)
/* Timer 3 Load Register */
#define TIMER3_VAL __REG(0x80000e04)
/* Timer 3 Value Register */
#define TIMER3_CTRL __REG(0x80000e08)
/* Timer 3 Control Register */
#define TIMER3_CLEAR __REG(0x80000e0c)
/* Timer 3 Clear Register */
/* Timer Control register bits */
#define TIMER_CTRL_ENABLE (1 << 7)
/* Enable (Start° Timer */
#define TIMER_CTRL_PERIODIC (1 << 6)
/* Periodic Running Mode */
#define TIMER_CTRL_FREE_RUNNING (0 << 6)
/* Normal Running Mode */
#define TIMER_CTRL_CLKSEL_508K (1 << 3)
/* 508KHz Clock select (Timer 1, 2) */
#define TIMER_CTRL_CLKSEL_2K (0 << 3)
/* 2KHz Clock Select (Timer 1, 2)*/
/* Power and State Control */
#define POWER_BASE __REG(0x80000400)
#define POWER_PWRSR __REG(0x80000400)
/* Power Status Register */
#define POWER_PWRCNT __REG(0x80000404)
/* Power/Clock control */
#define POWER_HALT __REG(0x80000408)
/* Power Idle Mode */
#define POWER_STDBY __REG(0x8000040c)
/* Power Standby Mode */
#define POWER_BLEOI __REG(0x80000410)
/* Battery Low End of Interrupt */
#define POWER_MCEOI __REG(0x80000414)
/* Media Changed EoI */
#define POWER_TEOI __REG(0x80000418)
/* Tick EoI */
#define POWER_STFCLR __REG(0x8000041c)
/* NbFlg, RSTFlg, PFFlg, CLDFlg Clear */
#define POWER_CLKSET __REG(0x80000420)
/* Clock Speed Control */
#endif
/* __ARM_ARCH_AAEC2000_H */
include/asm-arm/arch-aaec2000/debug-macro.S
0 → 100644
View file @
91b90475
/*
linux
/
include
/
asm
-
arm
/
arch
-
aaec2000
/
debug
-
macro.S
*
*
Debugging
macro
include
header
*
*
Copyright
(
c
)
2005
Nicolas
Bellido
Y
Ortega
*
*
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
.
*/
.
macro
addruart
,
rx
mrc
p15
,
0
,
\
rx
,
c1
,
c0
tst
\
rx
,
#
1
@
MMU
enabled
?
moveq
\
rx
,
#
0x80000000
@
physical
movne
\
rx
,
#
io_p2v
(
0x80000000
)
@
virtual
orr
\
rx
,
\
rx
,
#
0x00000800
.
endm
.
macro
senduart
,
rd
,
rx
str
\
rd
,
[
\
rx
,
#
0
]
.
endm
.
macro
busyuart
,
rd
,
rx
1002
:
ldr
\
rd
,
[
\
rx
,
#
0x10
]
tst
\
rd
,
#(
1
<<
7
)
beq
1002
b
.
endm
.
macro
waituart
,
rd
,
rx
#if 0
1001
:
ldr
\
rd
,
[
\
rx
,
#
0x10
]
tst
\
rd
,
#(
1
<<
5
)
beq
1001
b
#endif
.
endm
include/asm-arm/arch-aaec2000/dma.h
0 → 100644
View file @
91b90475
/*
* linux/include/asm-arm/arch-aaec2000/dma.h
*
* Copyright (c) 2005 Nicolas Bellido Y Ortega
*
* 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.
*/
#ifndef __ASM_ARCH_DMA_H
#define __ASM_ARCH_DMA_H
#define MAX_DMA_ADDRESS 0xffffffff
#define MAX_DMA_CHANNELS 0
#endif
include/asm-arm/arch-aaec2000/entry-macro.S
0 → 100644
View file @
91b90475
/*
*
linux
/
include
/
asm
-
arm
/
arch
-
aaec2000
/
entry
-
macro
.
S
*
*
Low
-
level
IRQ
helper
for
aaec
-
2000
based
platforms
*
*
Copyright
(
c
)
2005
Nicolas
Bellido
Y
Ortega
*
*
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
.
*
*/
.
macro
disable_fiq
.
endm
.
macro
get_irqnr_and_base
,
irqnr
,
irqstat
,
base
,
tmp
mov
r4
,
#
0xf8000000
add
r4
,
r4
,
#
0x00000500
mov
\
base
,
r4
ldr
\
irqstat
,
[
\
base
,
#
0
]
cmp
\
irqstat
,
#
0
bne
1001
f
ldr
\
irqnr
,
=
NR_IRQS
+
1
b
1003
f
1001
:
mov
\
irqnr
,
#
0
1002
:
ands
\
tmp
,
\
irqstat
,
#
1
mov
\
irqstat
,
\
irqstat
,
LSR
#
1
add
\
irqnr
,
\
irqnr
,
#
1
beq
1002
b
sub
\
irqnr
,
\
irqnr
,
#
1
1003
:
.
endm
include/asm-arm/arch-aaec2000/hardware.h
0 → 100644
View file @
91b90475
/*
* linux/include/asm-arm/arch-aaec2000/hardware.h
*
* Copyright (c) 2005 Nicolas Bellido Y Ortega
*
* 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.
*/
#ifndef __ASM_ARCH_HARDWARE_H
#define __ASM_ARCH_HARDWARE_H
#include <linux/config.h>
/* The kernel is loaded at physical address 0xf8000000.
* We map the IO space a bit after
*/
#define PIO_APB_BASE 0x80000000
#define VIO_APB_BASE 0xf8000000
#define IO_APB_LENGTH 0x2000
#define PIO_AHB_BASE 0x80002000
#define VIO_AHB_BASE 0xf8002000
#define IO_AHB_LENGTH 0x2000
#define VIO_BASE VIO_APB_BASE
#define PIO_BASE PIO_APB_BASE
#define io_p2v(x) ( (x) - PIO_BASE + VIO_BASE )
#define io_v2p(x) ( (x) + PIO_BASE - VIO_BASE )
#ifndef __ASSEMBLY__
#include <asm/types.h>
/* FIXME: Is it needed to optimize this a la pxa ?? */
#define __REG(x) (*((volatile u32 *)io_p2v(x)))
#define __PREG(x) (io_v2p((u32)&(x)))
#else
/* __ASSEMBLY__ */
#define __REG(x) io_p2v(x)
#define __PREG(x) io_v2p(x)
#endif
#include "aaec2000.h"
#endif
/* __ASM_ARCH_HARDWARE_H */
include/asm-arm/arch-aaec2000/io.h
0 → 100644
View file @
91b90475
/*
* linux/include/asm-arm/arch-aaec2000/io.h
*
* Copied from asm/arch/sa1100/io.h
*/
#ifndef __ASM_ARM_ARCH_IO_H
#define __ASM_ARM_ARCH_IO_H
#define IO_SPACE_LIMIT 0xffffffff
/*
* We don't actually have real ISA nor PCI buses, but there is so many
* drivers out there that might just work if we fake them...
*/
#define __io(a) ((void __iomem *)(a))
#define __mem_pci(a) (a)
#define __mem_isa(a) (a)
#endif
include/asm-arm/arch-aaec2000/irqs.h
0 → 100644
View file @
91b90475
/*
* linux/include/asm-arm/arch-aaec2000/irqs.h
*
* Copyright (c) 2005 Nicolas Bellido Y Ortega
*
* 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.
*/
#ifndef __ASM_ARCH_IRQS_H
#define __ASM_ARCH_IRQS_H
#define INT_GPIOF0_FIQ 0
/* External GPIO Port F O Fast Interrupt Input */
#define INT_BL_FIQ 1
/* Battery Low Fast Interrupt */
#define INT_WE_FIQ 2
/* Watchdog Expired Fast Interrupt */
#define INT_MV_FIQ 3
/* Media Changed Interrupt */
#define INT_SC 4
/* Sound Codec Interrupt */
#define INT_GPIO1 5
/* GPIO Port F Configurable Int 1 */
#define INT_GPIO2 6
/* GPIO Port F Configurable Int 2 */
#define INT_GPIO3 7
/* GPIO Port F Configurable Int 3 */
#define INT_TMR1_OFL 8
/* Timer 1 Overflow Interrupt */
#define INT_TMR2_OFL 9
/* Timer 2 Overflow Interrupt */
#define INT_RTC_CM 10
/* RTC Compare Match Interrupt */
#define INT_TICK 11
/* 64Hz Tick Interrupt */
#define INT_UART1 12
/* UART1 Interrupt */
#define INT_UART2 13
/* UART2 & Modem State Changed Interrupt */
#define INT_LCD 14
/* LCD Interrupt */
#define INT_SSI 15
/* SSI End of Transfer Interrupt */
#define INT_UART3 16
/* UART3 Interrupt */
#define INT_SCI 17
/* SCI Interrupt */
#define INT_AAC 18
/* Advanced Audio Codec Interrupt */
#define INT_MMC 19
/* MMC Interrupt */
#define INT_USB 20
/* USB Interrupt */
#define INT_DMA 21
/* DMA Interrupt */
#define INT_TMR3_UOFL 22
/* Timer 3 Underflow Interrupt */
#define INT_GPIO4 23
/* GPIO Port F Configurable Int 4 */
#define INT_GPIO5 24
/* GPIO Port F Configurable Int 4 */
#define INT_GPIO6 25
/* GPIO Port F Configurable Int 4 */
#define INT_GPIO7 26
/* GPIO Port F Configurable Int 4 */
#define INT_BMI 27
/* BMI Interrupt */
#define NR_IRQS (INT_BMI + 1)
#endif
/* __ASM_ARCH_IRQS_H */
include/asm-arm/arch-aaec2000/memory.h
0 → 100644
View file @
91b90475
/*
* linux/include/asm-arm/arch-aaec2000/memory.h
*
* Copyright (c) 2005 Nicolas Bellido Y Ortega
*
* 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.
*/
#ifndef __ASM_ARCH_MEMORY_H
#define __ASM_ARCH_MEMORY_H
#include <linux/config.h>
#define PHYS_OFFSET (0xf0000000UL)
#define __virt_to_bus(x) __virt_to_phys(x)
#define __bus_to_virt(x) __phys_to_virt(x)
#ifdef CONFIG_DISCONTIGMEM
/*
* The nodes are the followings:
*
* node 0: 0xf000.0000 - 0xf3ff.ffff
* node 1: 0xf400.0000 - 0xf7ff.ffff
* node 2: 0xf800.0000 - 0xfbff.ffff
* node 3: 0xfc00.0000 - 0xffff.ffff
*/
/*
* Given a kernel address, find the home node of the underlying memory.
*/
#define KVADDR_TO_NID(addr) \
(((unsigned long)(addr) - PAGE_OFFSET) >> NODE_MAX_MEM_SHIFT)
/*
* Given a page frame number, convert it to a node id.
*/
#define PFN_TO_NID(pfn) \
(((pfn) - PHYS_PFN_OFFSET) >> (NODE_MAX_MEM_SHIFT - PAGE_SHIFT))
/*
* Given a kaddr, ADDR_TO_MAPBASE finds the owning node of the memory
* and return the mem_map of that node.
*/
#define ADDR_TO_MAPBASE(kaddr) NODE_MEM_MAP(KVADDR_TO_NID(kaddr))
/*
* Given a page frame number, find the owning node of the memory
* and return the mem_map of that node.
*/
#define PFN_TO_MAPBASE(pfn) NODE_MEM_MAP(PFN_TO_NID(pfn))
/*
* Given a kaddr, LOCAL_MEM_MAP finds the owning node of the memory
* and returns the index corresponding to the appropriate page in the
* node's mem_map.
*/
#define LOCAL_MAP_NR(addr) \
(((unsigned long)(addr) & (NODE_MAX_MEM_SIZE - 1)) >> PAGE_SHIFT)
#define NODE_MAX_MEM_SHIFT 26
#define NODE_MAX_MEM_SIZE (1 << NODE_MAX_MEM_SHIFT)
#else
#define PFN_TO_NID(addr) (0)
#endif
/* CONFIG_DISCONTIGMEM */
#endif
/* __ASM_ARCH_MEMORY_H */
include/asm-arm/arch-aaec2000/param.h
0 → 100644
View file @
91b90475
/*
* linux/include/asm-arm/arch-aaec2000/param.h
*
* Copyright (c) 2005 Nicolas Bellido Y Ortega
*
* 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.
*/
#ifndef __ASM_ARCH_PARAM_H
#define __ASM_ARCH_PARAM_H
#endif
/* __ASM_ARCH_PARAM_H */
include/asm-arm/arch-aaec2000/system.h
0 → 100644
View file @
91b90475
/*
* linux/include/asm-arm/arch-aaed2000/system.h
*
* Copyright (c) 2005 Nicolas Bellido Y Ortega
*
* 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.
*/
#ifndef __ASM_ARCH_SYSTEM_H
#define __ASM_ARCH_SYSTEM_H
static
inline
void
arch_idle
(
void
)
{
cpu_do_idle
();
}
static
inline
void
arch_reset
(
char
mode
)
{
cpu_reset
(
0
);
}
#endif
/* __ASM_ARCH_SYSTEM_H */
include/asm-arm/arch-aaec2000/timex.h
0 → 100644
View file @
91b90475
/*
* linux/include/asm-arm/arch-aaec2000/timex.h
*
* AAEC-2000 Architecture timex specification
*
* Copyright (c) 2005 Nicolas Bellido Y Ortega
*
* 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.
*/
#ifndef __ASM_ARCH_TIMEX_H
#define __ASM_ARCH_TIMEX_H
#define CLOCK_TICK_RATE 508000
#endif
/* __ASM_ARCH_TIMEX_H */
include/asm-arm/arch-aaec2000/uncompress.h
0 → 100644
View file @
91b90475
/*
* linux/include/asm-arm/arch-aaec2000/uncompress.h
*
* Copyright (c) 2005 Nicolas Bellido Y Ortega
*
* 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.
*/
#ifndef __ASM_ARCH_UNCOMPRESS_H
#define __ASM_ARCH_UNCOMPRESS_H
#include "hardware.h"
#define UART(x) (*(volatile unsigned long *)(serial_port + (x)))
static
void
putstr
(
const
char
*
s
)
{
unsigned
long
serial_port
;
do
{
serial_port
=
_UART3_BASE
;
if
(
UART
(
UART_CR
)
&
UART_CR_EN
)
break
;
serial_port
=
_UART1_BASE
;
if
(
UART
(
UART_CR
)
&
UART_CR_EN
)
break
;
serial_port
=
_UART2_BASE
;
if
(
UART
(
UART_CR
)
&
UART_CR_EN
)
break
;
return
;
}
while
(
0
);
for
(;
*
s
;
s
++
)
{
/* wait for space in the UART's transmitter */
while
((
UART
(
UART_SR
)
&
UART_SR_TxFF
));
/* send the character out. */
UART
(
UART_DR
)
=
*
s
;
/* if a LF, also do CR... */
if
(
*
s
==
10
)
{
while
((
UART
(
UART_SR
)
&
UART_SR_TxFF
));
UART
(
UART_DR
)
=
13
;
}
}
}
#define arch_decomp_setup()
#define arch_decomp_wdog()
#endif
/* __ASM_ARCH_UNCOMPRESS_H */
include/asm-arm/arch-aaec2000/vmalloc.h
0 → 100644
View file @
91b90475
/*
* linux/include/asm-arm/arch-aaec2000/vmalloc.h
*
* Copyright (c) 2005 Nicolas Bellido Y Ortega
*
* 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.
*/
#ifndef __ASM_ARCH_VMALLOC_H
#define __ASM_ARCH_VMALLOC_H
#define VMALLOC_END (PAGE_OFFSET + 0x10000000)
#endif
/* __ASM_ARCH_VMALLOC_H */
include/asm-arm/arch-ixp2000/ixp2000-regs.h
View file @
91b90475
...
...
@@ -363,6 +363,7 @@
#define IXP2000_MIN_REV_MASK 0x0000000F
#define IXP2000_PROD_ID_MASK 0xFFFFFFFF
#define IXP2000_PRODUCT_ID GLOBAL_REG(0x00)
#define IXP2000_MISC_CONTROL GLOBAL_REG(0x04)
#define IXP2000_MSF_CLK_CNTRL GLOBAL_REG(0x08)
#define IXP2000_RESET0 GLOBAL_REG(0x0c)
...
...
include/asm-arm/arch-versatile/hardware.h
View file @
91b90475
...
...
@@ -25,19 +25,26 @@
#include <asm/sizes.h>
#include <asm/arch/platform.h>
// FIXME = PCI settings need to be fixed!!!!!
/*
* Similar to above, but for PCI addresses (memory, IO, Config and the
* V3 chip itself). WARNING: this has to mirror definitions in platform.h
* PCI space virtual addresses
*/
#define PCI_MEMORY_VADDR 0xe8000000
#define PCI_CONFIG_VADDR 0xec000000
#define PCI_V3_VADDR 0xed000000
#define PCI_IO_VADDR 0xee000000
#define VERSATILE_PCI_VIRT_BASE 0xe8000000
#define VERSATILE_PCI_CFG_VIRT_BASE 0xe9000000
#if 0
#define VERSATILE_PCI_VIRT_MEM_BASE0 0xf4000000
#define VERSATILE_PCI_VIRT_MEM_BASE1 0xf5000000
#define VERSATILE_PCI_VIRT_MEM_BASE2 0xf6000000
#define PCIO_BASE VERSATILE_PCI_VIRT_MEM_BASE0
#define PCIMEM_BASE VERSATILE_PCI_VIRT_MEM_BASE1
#endif
/* CIK guesswork */
#define PCIBIOS_MIN_IO 0x44000000
#define PCIBIOS_MIN_MEM 0x50000000
#define PCIO_BASE PCI_IO_VADDR
#define PCIMEM_BASE PCI_MEMORY_VADDR
#define pcibios_assign_all_busses() 1
/* macro to get at IO space when running virtually */
#define IO_ADDRESS(x) (((x) & 0x0fffffff) + (((x) >> 4) & 0x0f000000) + 0xf0000000)
...
...
include/asm-arm/arch-versatile/io.h
View file @
91b90475
...
...
@@ -20,7 +20,7 @@
#ifndef __ASM_ARM_ARCH_IO_H
#define __ASM_ARM_ARCH_IO_H
#define IO_SPACE_LIMIT 0xffff
#define IO_SPACE_LIMIT 0xffff
ffff
#define __io(a) ((void __iomem *)(a))
#define __mem_pci(a) (a)
...
...
include/asm-arm/arch-versatile/platform.h
View file @
91b90475
...
...
@@ -76,7 +76,7 @@
#define VERSATILE_SYS_NVFLAGSSET_OFFSET 0x38
#define VERSATILE_SYS_NVFLAGSCLR_OFFSET 0x3C
#define VERSATILE_SYS_RESETCTL_OFFSET 0x40
#define VERSATILE_SYS_P
IC
CTL_OFFSET 0x44
#define VERSATILE_SYS_P
CI
CTL_OFFSET 0x44
#define VERSATILE_SYS_MCI_OFFSET 0x48
#define VERSATILE_SYS_FLASH_OFFSET 0x4C
#define VERSATILE_SYS_CLCD_OFFSET 0x50
...
...
@@ -114,7 +114,7 @@
#define VERSATILE_SYS_NVFLAGSSET (VERSATILE_SYS_BASE + VERSATILE_SYS_NVFLAGSSET_OFFSET)
#define VERSATILE_SYS_NVFLAGSCLR (VERSATILE_SYS_BASE + VERSATILE_SYS_NVFLAGSCLR_OFFSET)
#define VERSATILE_SYS_RESETCTL (VERSATILE_SYS_BASE + VERSATILE_SYS_RESETCTL_OFFSET)
#define VERSATILE_SYS_P
ICCTL (VERSATILE_SYS_BASE + VERSATILE_SYS_PIC
CTL_OFFSET)
#define VERSATILE_SYS_P
CICTL (VERSATILE_SYS_BASE + VERSATILE_SYS_PCI
CTL_OFFSET)
#define VERSATILE_SYS_MCI (VERSATILE_SYS_BASE + VERSATILE_SYS_MCI_OFFSET)
#define VERSATILE_SYS_FLASH (VERSATILE_SYS_BASE + VERSATILE_SYS_FLASH_OFFSET)
#define VERSATILE_SYS_CLCD (VERSATILE_SYS_BASE + VERSATILE_SYS_CLCD_OFFSET)
...
...
@@ -225,7 +225,20 @@
#define VERSATILE_SSMC_BASE 0x20000000
/* SSMC */
#define VERSATILE_IB2_BASE 0x24000000
/* IB2 module */
#define VERSATILE_MBX_BASE 0x40000000
/* MBX */
/* PCI space */
#define VERSATILE_PCI_BASE 0x41000000
/* PCI Interface */
#define VERSATILE_PCI_CFG_BASE 0x42000000
#define VERSATILE_PCI_MEM_BASE0 0x44000000
#define VERSATILE_PCI_MEM_BASE1 0x50000000
#define VERSATILE_PCI_MEM_BASE2 0x60000000
/* Sizes of above maps */
#define VERSATILE_PCI_BASE_SIZE 0x01000000
#define VERSATILE_PCI_CFG_BASE_SIZE 0x02000000
#define VERSATILE_PCI_MEM_BASE0_SIZE 0x0c000000
/* 32Mb */
#define VERSATILE_PCI_MEM_BASE1_SIZE 0x10000000
/* 256Mb */
#define VERSATILE_PCI_MEM_BASE2_SIZE 0x10000000
/* 256Mb */
#define VERSATILE_SDRAM67_BASE 0x70000000
/* SDRAM banks 6 and 7 */
#define VERSATILE_LT_BASE 0x80000000
/* Logic Tile expansion */
...
...
include/asm-arm/cacheflush.h
View file @
91b90475
...
...
@@ -16,6 +16,9 @@
#include <asm/mman.h>
#include <asm/glue.h>
#include <asm/shmparam.h>
#define CACHE_COLOUR(vaddr) ((vaddr & (SHMLBA - 1)) >> PAGE_SHIFT)
/*
* Cache Model
...
...
include/asm-arm/io.h
View file @
91b90475
...
...
@@ -272,6 +272,33 @@ extern void __iounmap(void __iomem *addr);
#define iounmap(cookie) __arch_iounmap(cookie)
#endif
/*
* io{read,write}{8,16,32} macros
*/
#define ioread8(p) ({ unsigned int __v = __raw_readb(p); __v; })
#define ioread16(p) ({ unsigned int __v = le16_to_cpu(__raw_readw(p)); __v; })
#define ioread32(p) ({ unsigned int __v = le32_to_cpu(__raw_readl(p)); __v; })
#define iowrite8(v,p) __raw_writeb(v, p)
#define iowrite16(v,p) __raw_writew(cpu_to_le16(v), p)
#define iowrite32(v,p) __raw_writel(cpu_to_le32(v), p)
#define ioread8_rep(p,d,c) __raw_readsb(p,d,c)
#define ioread16_rep(p,d,c) __raw_readsw(p,d,c)
#define ioread32_rep(p,d,c) __raw_readsl(p,d,c)
#define iowrite8_rep(p,s,c) __raw_writesb(p,s,c)
#define iowrite16_rep(p,s,c) __raw_writesw(p,s,c)
#define iowrite32_rep(p,s,c) __raw_writesl(p,s,c)
extern
void
__iomem
*
ioport_map
(
unsigned
long
port
,
unsigned
int
nr
);
extern
void
ioport_unmap
(
void
__iomem
*
addr
);
struct
pci_dev
;
extern
void
__iomem
*
pci_iomap
(
struct
pci_dev
*
dev
,
int
bar
,
unsigned
long
maxlen
);
extern
void
pci_iounmap
(
struct
pci_dev
*
dev
,
void
__iomem
*
addr
);
/*
* can the hardware map this into one segment or not, given no other
* constraints.
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment