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
nexedi
linux
Commits
82d007ae
Commit
82d007ae
authored
Oct 05, 2003
by
Russell King
Browse files
Options
Browse Files
Download
Plain Diff
Merge
parents
d1054d95
d24e45f8
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
282 additions
and
265 deletions
+282
-265
arch/arm/lib/lib1funcs.S
arch/arm/lib/lib1funcs.S
+260
-257
arch/arm/mach-pxa/irq.c
arch/arm/mach-pxa/irq.c
+13
-3
arch/arm/mach-pxa/lubbock.c
arch/arm/mach-pxa/lubbock.c
+2
-1
include/asm-arm/arch-pxa/irqs.h
include/asm-arm/arch-pxa/irqs.h
+5
-3
include/asm-arm/arch-pxa/lubbock.h
include/asm-arm/arch-pxa/lubbock.h
+2
-1
No files found.
arch/arm/lib/lib1funcs.S
View file @
82d007ae
@
libgcc1
routines
for
ARM
cpu
.
@
Division
routines
,
written
by
Richard
Earnshaw
,
(
rearnsha
@
armltd
.
co
.
uk
)
/*
*
linux
/
arch
/
arm
/
lib
/
lib1funcs
.
S
:
Optimized
ARM
division
routines
*
*
Author
:
Nicolas
Pitre
<
nico
@
cam
.
org
>
*
-
contributed
to
gcc
-
3
.4
on
Sep
30
,
2003
*
-
adapted
for
the
Linux
kernel
on
Oct
2
,
2003
*/
/*
Copyright
(
C
)
1995
,
1996
,
1998
Free
Software
Foundation
,
Inc
.
/*
Copyright
1995
,
1996
,
1998
,
1999
,
2000
,
2003
Free
Software
Foundation
,
Inc
.
This
file
is
free
software
; you can redistribute it and/or modify it
under
the
terms
of
the
GNU
General
Public
License
as
published
by
the
...
...
@@ -10,11 +15,12 @@ later version.
In
addition
to
the
permissions
in
the
GNU
General
Public
License
,
the
Free
Software
Foundation
gives
you
unlimited
permission
to
link
the
compiled
version
of
this
file
with
other
programs
,
and
to
distribute
those
programs
without
any
restriction
coming
from
the
use
of
this
file
.
(
The
General
Public
License
restrictions
do
apply
in
other
respects
; for example, they cover modification of the file, and
distribution
when
not
linked
into
another
program
.
)
compiled
version
of
this
file
into
combinations
with
other
programs
,
and
to
distribute
those
combinations
without
any
restriction
coming
from
the
use
of
this
file
.
(
The
General
Public
License
restrictions
do
apply
in
other
respects
; for example, they cover modification of
the
file
,
and
distribution
when
not
linked
into
a
combine
executable
.)
This
file
is
distributed
in
the
hope
that
it
will
be
useful
,
but
WITHOUT
ANY
WARRANTY
; without even the implied warranty of
...
...
@@ -26,286 +32,283 @@ along with this program; see the file COPYING. If not, write to
the
Free
Software
Foundation
,
59
Temple
Place
-
Suite
330
,
Boston
,
MA
02111
-
1307
,
USA
.
*/
/*
As
a
special
exception
,
if
you
link
this
library
with
other
files
,
some
of
which
are
compiled
with
GCC
,
to
produce
an
executable
,
this
library
does
not
by
itself
cause
the
resulting
executable
to
be
covered
by
the
GNU
General
Public
License
.
This
exception
does
not
however
invalidate
any
other
reasons
why
the
executable
file
might
be
covered
by
the
GNU
General
Public
License
.
*/
/*
This
code
is
derived
from
gcc
2
.95.3
*
29
/
07
/
01
Adapted
for
linux
*
27
/
03
/
03
Ian
Molton
Clean
up
CONFIG_CPU
*/
#include <linux/linkage.h>
#include <asm/assembler.h>
#include <asm/hardware.h>
#define RET mov
#define RETc(x) mov##x
#define RETCOND
dividend
.
req
r0
divisor
.
req
r1
result
.
req
r2
overdone
.
req
r2
curbit
.
req
r3
.
macro
ARM_DIV_BODY
dividend
,
divisor
,
result
,
curbit
#if __LINUX_ARM_ARCH__ >= 5
clz
\
curbit
,
\
divisor
clz
\
result
,
\
dividend
sub
\
result
,
\
curbit
,
\
result
mov
\
curbit
,
#
1
mov
\
divisor
,
\
divisor
,
lsl
\
result
mov
\
curbit
,
\
curbit
,
lsl
\
result
mov
\
result
,
#
0
ENTRY
(
__udivsi3
)
cmp
divisor
,
#
0
beq
Ldiv0
mov
curbit
,
#
1
mov
result
,
#
0
cmp
dividend
,
divisor
bcc
Lgot_result_udivsi3
1
:
#else
@
Initially
shift
the
divisor
left
3
bits
if
possible
,
@
set
curbit
accordingly
.
This
allows
for
curbit
to
be
located
@
at
the
left
end
of
each
4
bit
nibbles
in
the
division
loop
@
to
save
one
loop
in
most
cases
.
tst
\
divisor
,
#
0xe0000000
moveq
\
divisor
,
\
divisor
,
lsl
#
3
moveq
\
curbit
,
#
8
movne
\
curbit
,
#
1
@
Unless
the
divisor
is
very
big
,
shift
it
up
in
multiples
of
@
four
bits
,
since
this
is
the
amount
of
unwinding
in
the
main
@
division
loop
.
Continue
shifting
until
the
divisor
is
@
larger
than
the
dividend
.
cmp
divisor
,
#
0x10000000
cmp
cc
divisor
,
dividend
mov
cc
divisor
,
divisor
,
lsl
#
4
mov
cc
curbit
,
curbit
,
lsl
#
4
b
cc
1
b
1
:
cmp
\
divisor
,
#
0x10000000
cmp
lo
\
divisor
,
\
dividend
mov
lo
\
divisor
,
\
divisor
,
lsl
#
4
mov
lo
\
curbit
,
\
curbit
,
lsl
#
4
b
lo
1
b
2
:
@
For
very
big
divisors
,
we
must
shift
it
a
bit
at
a
time
,
or
@
we
will
be
in
danger
of
overflowing
.
cmp
divisor
,
#
0x80000000
cmpcc
divisor
,
dividend
movcc
divisor
,
divisor
,
lsl
#
1
movcc
curbit
,
curbit
,
lsl
#
1
bcc
2
b
3
:
@
Test
for
possible
subtractions
,
and
note
which
bits
@
are
done
in
the
result
.
On
the
final
pass
,
this
may
subtract
@
too
much
from
the
dividend
,
but
the
result
will
be
ok
,
since
the
@
"bit"
will
have
been
shifted
out
at
the
bottom
.
cmp
dividend
,
divisor
subcs
dividend
,
dividend
,
divisor
orrcs
result
,
result
,
curbit
cmp
dividend
,
divisor
,
lsr
#
1
subcs
dividend
,
dividend
,
divisor
,
lsr
#
1
orrcs
result
,
result
,
curbit
,
lsr
#
1
cmp
dividend
,
divisor
,
lsr
#
2
subcs
dividend
,
dividend
,
divisor
,
lsr
#
2
orrcs
result
,
result
,
curbit
,
lsr
#
2
cmp
dividend
,
divisor
,
lsr
#
3
subcs
dividend
,
dividend
,
divisor
,
lsr
#
3
orrcs
result
,
result
,
curbit
,
lsr
#
3
cmp
dividend
,
#
0
@
Early
termination
?
movnes
curbit
,
curbit
,
lsr
#
4
@
No
,
any
more
bits
to
do
?
movne
divisor
,
divisor
,
lsr
#
4
bne
3
b
Lgot_result_udivsi3
:
mov
r0
,
result
RET
pc
,
lr
1
:
cmp
\
divisor
,
#
0x80000000
cmplo
\
divisor
,
\
dividend
movlo
\
divisor
,
\
divisor
,
lsl
#
1
movlo
\
curbit
,
\
curbit
,
lsl
#
1
blo
1
b
Ldiv0
:
str
lr
,
[
sp
,
#-
4
]!
bl
__div0
mov
r0
,
#
0
@
about
as
wrong
as
it
could
be
ldmia
sp
!,
{
pc
}
RETCOND
mov
\
result
,
#
0
/*
__umodsi3
-----------------------
*/
#endif
@
Division
loop
1
:
cmp
\
dividend
,
\
divisor
subhs
\
dividend
,
\
dividend
,
\
divisor
orrhs
\
result
,
\
result
,
\
curbit
cmp
\
dividend
,
\
divisor
,
lsr
#
1
subhs
\
dividend
,
\
dividend
,
\
divisor
,
lsr
#
1
orrhs
\
result
,
\
result
,
\
curbit
,
lsr
#
1
cmp
\
dividend
,
\
divisor
,
lsr
#
2
subhs
\
dividend
,
\
dividend
,
\
divisor
,
lsr
#
2
orrhs
\
result
,
\
result
,
\
curbit
,
lsr
#
2
cmp
\
dividend
,
\
divisor
,
lsr
#
3
subhs
\
dividend
,
\
dividend
,
\
divisor
,
lsr
#
3
orrhs
\
result
,
\
result
,
\
curbit
,
lsr
#
3
cmp
\
dividend
,
#
0
@
Early
termination
?
movnes
\
curbit
,
\
curbit
,
lsr
#
4
@
No
,
any
more
bits
to
do
?
movne
\
divisor
,
\
divisor
,
lsr
#
4
bne
1
b
.
endm
.
macro
ARM_DIV2_ORDER
divisor
,
order
#if __LINUX_ARM_ARCH__ >= 5
clz
\
order
,
\
divisor
rsb
\
order
,
\
order
,
#
31
#else
cmp
\
divisor
,
#(
1
<<
16
)
movhs
\
divisor
,
\
divisor
,
lsr
#
16
movhs
\
order
,
#
16
movlo
\
order
,
#
0
cmp
\
divisor
,
#(
1
<<
8
)
movhs
\
divisor
,
\
divisor
,
lsr
#
8
addhs
\
order
,
\
order
,
#
8
cmp
\
divisor
,
#(
1
<<
4
)
movhs
\
divisor
,
\
divisor
,
lsr
#
4
addhs
\
order
,
\
order
,
#
4
cmp
\
divisor
,
#(
1
<<
2
)
addhi
\
order
,
\
order
,
#
3
addls
\
order
,
\
order
,
\
divisor
,
lsr
#
1
#endif
.
endm
.
macro
ARM_MOD_BODY
dividend
,
divisor
,
order
,
spare
#if __LINUX_ARM_ARCH__ >= 5
clz
\
order
,
\
divisor
clz
\
spare
,
\
dividend
sub
\
order
,
\
order
,
\
spare
mov
\
divisor
,
\
divisor
,
lsl
\
order
#else
mov
\
order
,
#
0
ENTRY
(
__umodsi3
)
cmp
divisor
,
#
0
beq
Ldiv0
mov
curbit
,
#
1
cmp
dividend
,
divisor
RETc
(
cc
)
pc
,
lr
1
:
@
Unless
the
divisor
is
very
big
,
shift
it
up
in
multiples
of
@
four
bits
,
since
this
is
the
amount
of
unwinding
in
the
main
@
division
loop
.
Continue
shifting
until
the
divisor
is
@
larger
than
the
dividend
.
cmp
divisor
,
#
0x10000000
cmp
cc
divisor
,
dividend
mov
cc
divisor
,
divisor
,
lsl
#
4
movcc
curbit
,
curbit
,
lsl
#
4
b
cc
1
b
1
:
cmp
\
divisor
,
#
0x10000000
cmp
lo
\
divisor
,
\
dividend
mov
lo
\
divisor
,
\
divisor
,
lsl
#
4
addlo
\
order
,
\
order
,
#
4
b
lo
1
b
2
:
@
For
very
big
divisors
,
we
must
shift
it
a
bit
at
a
time
,
or
@
we
will
be
in
danger
of
overflowing
.
cmp
divisor
,
#
0x80000000
cmpcc
divisor
,
dividend
movcc
divisor
,
divisor
,
lsl
#
1
movcc
curbit
,
curbit
,
lsl
#
1
bcc
2
b
3
:
@
Test
for
possible
subtractions
.
On
the
final
pass
,
this
may
@
subtract
too
much
from
the
dividend
,
so
keep
track
of
which
@
subtractions
are
done
,
we
can
fix
them
up
afterwards
...
mov
overdone
,
#
0
cmp
dividend
,
divisor
subcs
dividend
,
dividend
,
divisor
cmp
dividend
,
divisor
,
lsr
#
1
subcs
dividend
,
dividend
,
divisor
,
lsr
#
1
orrcs
overdone
,
overdone
,
curbit
,
ror
#
1
cmp
dividend
,
divisor
,
lsr
#
2
subcs
dividend
,
dividend
,
divisor
,
lsr
#
2
orrcs
overdone
,
overdone
,
curbit
,
ror
#
2
cmp
dividend
,
divisor
,
lsr
#
3
subcs
dividend
,
dividend
,
divisor
,
lsr
#
3
orrcs
overdone
,
overdone
,
curbit
,
ror
#
3
mov
ip
,
curbit
cmp
dividend
,
#
0
@
Early
termination
?
movnes
curbit
,
curbit
,
lsr
#
4
@
No
,
any
more
bits
to
do
?
movne
divisor
,
divisor
,
lsr
#
4
bne
3
b
@
Any
subtractions
that
we
should
not
have
done
will
be
recorded
in
@
the
top
three
bits
of
"overdone"
.
Exactly
which
were
not
needed
@
are
governed
by
the
position
of
the
bit
,
stored
in
ip
.
@
If
we
terminated
early
,
because
dividend
became
zero
,
@
then
none
of
the
below
will
match
,
since
the
bit
in
ip
will
not
be
@
in
the
bottom
nibble
.
ands
overdone
,
overdone
,
#
0xe0000000
RETc
(
eq
)
pc
,
lr
@
No
fixups
needed
tst
overdone
,
ip
,
ror
#
3
addne
dividend
,
dividend
,
divisor
,
lsr
#
3
tst
overdone
,
ip
,
ror
#
2
addne
dividend
,
dividend
,
divisor
,
lsr
#
2
tst
overdone
,
ip
,
ror
#
1
addne
dividend
,
dividend
,
divisor
,
lsr
#
1
RET
pc
,
lr
1
:
cmp
\
divisor
,
#
0x80000000
cmplo
\
divisor
,
\
dividend
movlo
\
divisor
,
\
divisor
,
lsl
#
1
addlo
\
order
,
\
order
,
#
1
blo
1
b
#endif
@
Perform
all
needed
substractions
to
keep
only
the
reminder
.
@
Do
comparisons
in
batch
of
4
first
.
subs
\
order
,
\
order
,
#
3
@
yes
,
3
is
intended
here
blt
2
f
1
:
cmp
\
dividend
,
\
divisor
subhs
\
dividend
,
\
dividend
,
\
divisor
cmp
\
dividend
,
\
divisor
,
lsr
#
1
subhs
\
dividend
,
\
dividend
,
\
divisor
,
lsr
#
1
cmp
\
dividend
,
\
divisor
,
lsr
#
2
subhs
\
dividend
,
\
dividend
,
\
divisor
,
lsr
#
2
cmp
\
dividend
,
\
divisor
,
lsr
#
3
subhs
\
dividend
,
\
dividend
,
\
divisor
,
lsr
#
3
cmp
\
dividend
,
#
1
mov
\
divisor
,
\
divisor
,
lsr
#
4
subges
\
order
,
\
order
,
#
4
bge
1
b
tst
\
order
,
#
3
teqne
\
dividend
,
#
0
beq
5
f
@
Either
1
,
2
or
3
comparison
/
substractions
are
left
.
2
:
cmn
\
order
,
#
2
blt
4
f
beq
3
f
cmp
\
dividend
,
\
divisor
subhs
\
dividend
,
\
dividend
,
\
divisor
mov
\
divisor
,
\
divisor
,
lsr
#
1
3
:
cmp
\
dividend
,
\
divisor
subhs
\
dividend
,
\
dividend
,
\
divisor
mov
\
divisor
,
\
divisor
,
lsr
#
1
4
:
cmp
\
dividend
,
\
divisor
subhs
\
dividend
,
\
dividend
,
\
divisor
5
:
.
endm
ENTRY
(
__udivsi3
)
subs
r2
,
r1
,
#
1
moveq
pc
,
lr
bcc
Ldiv0
cmp
r0
,
r1
bls
11
f
tst
r1
,
r2
beq
12
f
ARM_DIV_BODY
r0
,
r1
,
r2
,
r3
mov
r0
,
r2
mov
pc
,
lr
11
:
moveq
r0
,
#
1
movne
r0
,
#
0
mov
pc
,
lr
12
:
ARM_DIV2_ORDER
r1
,
r2
mov
r0
,
r0
,
lsr
r2
mov
pc
,
lr
ENTRY
(
__umodsi3
)
subs
r2
,
r1
,
#
1
@
compare
divisor
with
1
bcc
Ldiv0
cmpne
r0
,
r1
@
compare
dividend
with
divisor
moveq
r0
,
#
0
tsthi
r1
,
r2
@
see
if
divisor
is
power
of
2
andeq
r0
,
r0
,
r2
movls
pc
,
lr
ARM_MOD_BODY
r0
,
r1
,
r2
,
r3
mov
pc
,
lr
ENTRY
(
__divsi3
)
eor
ip
,
dividend
,
divisor
@
Save
the
sign
of
the
result
.
mov
curbit
,
#
1
mov
result
,
#
0
cmp
divisor
,
#
0
rsbmi
divisor
,
divisor
,
#
0
@
Loops
below
use
unsigned
.
cmp
r1
,
#
0
eor
ip
,
r0
,
r1
@
save
the
sign
of
the
result
.
beq
Ldiv0
cmp
dividend
,
#
0
rsbmi
dividend
,
dividend
,
#
0
cmp
dividend
,
divisor
bcc
Lgot_result_divsi3
rsbmi
r1
,
r1
,
#
0
@
loops
below
use
unsigned
.
subs
r2
,
r1
,
#
1
@
division
by
1
or
-
1
?
beq
10
f
movs
r3
,
r0
rsbmi
r3
,
r0
,
#
0
@
positive
dividend
value
cmp
r3
,
r1
bls
11
f
tst
r1
,
r2
@
divisor
is
power
of
2
?
beq
12
f
1
:
@
Unless
the
divisor
is
very
big
,
shift
it
up
in
multiples
of
@
four
bits
,
since
this
is
the
amount
of
unwinding
in
the
main
@
division
loop
.
Continue
shifting
until
the
divisor
is
@
larger
than
the
dividend
.
cmp
divisor
,
#
0x10000000
cmpcc
divisor
,
dividend
movcc
divisor
,
divisor
,
lsl
#
4
movcc
curbit
,
curbit
,
lsl
#
4
bcc
1
b
ARM_DIV_BODY
r3
,
r1
,
r0
,
r2
2
:
@
For
very
big
divisors
,
we
must
shift
it
a
bit
at
a
time
,
or
@
we
will
be
in
danger
of
overflowing
.
cmp
divisor
,
#
0x80000000
cmpcc
divisor
,
dividend
movcc
divisor
,
divisor
,
lsl
#
1
movcc
curbit
,
curbit
,
lsl
#
1
bcc
2
b
3
:
@
Test
for
possible
subtractions
,
and
note
which
bits
@
are
done
in
the
result
.
On
the
final
pass
,
this
may
subtract
@
too
much
from
the
dividend
,
but
the
result
will
be
ok
,
since
the
@
"bit"
will
have
been
shifted
out
at
the
bottom
.
cmp
dividend
,
divisor
subcs
dividend
,
dividend
,
divisor
orrcs
result
,
result
,
curbit
cmp
dividend
,
divisor
,
lsr
#
1
subcs
dividend
,
dividend
,
divisor
,
lsr
#
1
orrcs
result
,
result
,
curbit
,
lsr
#
1
cmp
dividend
,
divisor
,
lsr
#
2
subcs
dividend
,
dividend
,
divisor
,
lsr
#
2
orrcs
result
,
result
,
curbit
,
lsr
#
2
cmp
dividend
,
divisor
,
lsr
#
3
subcs
dividend
,
dividend
,
divisor
,
lsr
#
3
orrcs
result
,
result
,
curbit
,
lsr
#
3
cmp
dividend
,
#
0
@
Early
termination
?
movnes
curbit
,
curbit
,
lsr
#
4
@
No
,
any
more
bits
to
do
?
movne
divisor
,
divisor
,
lsr
#
4
bne
3
b
Lgot_result_divsi3
:
mov
r0
,
result
cmp
ip
,
#
0
rsbmi
r0
,
r0
,
#
0
RET
pc
,
lr
mov
pc
,
lr
10
:
teq
ip
,
r0
@
same
sign
?
rsbmi
r0
,
r0
,
#
0
mov
pc
,
lr
11
:
movlo
r0
,
#
0
moveq
r0
,
ip
,
asr
#
31
orreq
r0
,
r0
,
#
1
mov
pc
,
lr
12
:
ARM_DIV2_ORDER
r1
,
r2
cmp
ip
,
#
0
mov
r0
,
r3
,
lsr
r2
rsbmi
r0
,
r0
,
#
0
mov
pc
,
lr
ENTRY
(
__modsi3
)
mov
curbit
,
#
1
cmp
divisor
,
#
0
rsbmi
divisor
,
divisor
,
#
0
@
Loops
below
use
unsigned
.
cmp
r1
,
#
0
beq
Ldiv0
@
Need
to
save
the
sign
of
the
dividend
,
unfortunately
,
we
need
@
ip
later
on
; this is faster than pushing lr and using that.
str
dividend
,
[
sp
,
#-
4
]!
cmp
dividend
,
#
0
rsbmi
dividend
,
dividend
,
#
0
cmp
dividend
,
divisor
bcc
Lgot_result_modsi3
1
:
@
Unless
the
divisor
is
very
big
,
shift
it
up
in
multiples
of
@
four
bits
,
since
this
is
the
amount
of
unwinding
in
the
main
@
division
loop
.
Continue
shifting
until
the
divisor
is
@
larger
than
the
dividend
.
cmp
divisor
,
#
0x10000000
cmpcc
divisor
,
dividend
movcc
divisor
,
divisor
,
lsl
#
4
movcc
curbit
,
curbit
,
lsl
#
4
bcc
1
b
rsbmi
r1
,
r1
,
#
0
@
loops
below
use
unsigned
.
movs
ip
,
r0
@
preserve
sign
of
dividend
rsbmi
r0
,
r0
,
#
0
@
if
negative
make
positive
subs
r2
,
r1
,
#
1
@
compare
divisor
with
1
cmpne
r0
,
r1
@
compare
dividend
with
divisor
moveq
r0
,
#
0
tsthi
r1
,
r2
@
see
if
divisor
is
power
of
2
andeq
r0
,
r0
,
r2
bls
10
f
ARM_MOD_BODY
r0
,
r1
,
r2
,
r3
10
:
cmp
ip
,
#
0
rsbmi
r0
,
r0
,
#
0
mov
pc
,
lr
Ldiv0
:
str
lr
,
[
sp
,
#-
4
]!
bl
__div0
mov
r0
,
#
0
@
About
as
wrong
as
it
could
be
.
ldr
pc
,
[
sp
],
#
4
2
:
@
For
very
big
divisors
,
we
must
shift
it
a
bit
at
a
time
,
or
@
we
will
be
in
danger
of
overflowing
.
cmp
divisor
,
#
0x80000000
cmpcc
divisor
,
dividend
movcc
divisor
,
divisor
,
lsl
#
1
movcc
curbit
,
curbit
,
lsl
#
1
bcc
2
b
3
:
@
Test
for
possible
subtractions
.
On
the
final
pass
,
this
may
@
subtract
too
much
from
the
dividend
,
so
keep
track
of
which
@
subtractions
are
done
,
we
can
fix
them
up
afterwards
...
mov
overdone
,
#
0
cmp
dividend
,
divisor
subcs
dividend
,
dividend
,
divisor
cmp
dividend
,
divisor
,
lsr
#
1
subcs
dividend
,
dividend
,
divisor
,
lsr
#
1
orrcs
overdone
,
overdone
,
curbit
,
ror
#
1
cmp
dividend
,
divisor
,
lsr
#
2
subcs
dividend
,
dividend
,
divisor
,
lsr
#
2
orrcs
overdone
,
overdone
,
curbit
,
ror
#
2
cmp
dividend
,
divisor
,
lsr
#
3
subcs
dividend
,
dividend
,
divisor
,
lsr
#
3
orrcs
overdone
,
overdone
,
curbit
,
ror
#
3
mov
ip
,
curbit
cmp
dividend
,
#
0
@
Early
termination
?
movnes
curbit
,
curbit
,
lsr
#
4
@
No
,
any
more
bits
to
do
?
movne
divisor
,
divisor
,
lsr
#
4
bne
3
b
@
Any
subtractions
that
we
should
not
have
done
will
be
recorded
in
@
the
top
three
bits
of
"overdone"
.
Exactly
which
were
not
needed
@
are
governed
by
the
position
of
the
bit
,
stored
in
ip
.
@
If
we
terminated
early
,
because
dividend
became
zero
,
@
then
none
of
the
below
will
match
,
since
the
bit
in
ip
will
not
be
@
in
the
bottom
nibble
.
ands
overdone
,
overdone
,
#
0xe0000000
beq
Lgot_result_modsi3
tst
overdone
,
ip
,
ror
#
3
addne
dividend
,
dividend
,
divisor
,
lsr
#
3
tst
overdone
,
ip
,
ror
#
2
addne
dividend
,
dividend
,
divisor
,
lsr
#
2
tst
overdone
,
ip
,
ror
#
1
addne
dividend
,
dividend
,
divisor
,
lsr
#
1
Lgot_result_modsi3
:
ldr
ip
,
[
sp
],
#
4
cmp
ip
,
#
0
rsbmi
dividend
,
dividend
,
#
0
RET
pc
,
lr
arch/arm/mach-pxa/irq.c
View file @
82d007ae
...
...
@@ -58,7 +58,19 @@ static int pxa_gpio_irq_type(unsigned int irq, unsigned int type)
{
int
gpio
,
idx
;
gpio
=
irq
-
((
irq
>=
IRQ_GPIO
(
2
))
?
IRQ_GPIO
(
2
)
+
2
:
IRQ_GPIO
(
0
));
gpio
=
IRQ_TO_GPIO
(
irq
);
idx
=
gpio
>>
5
;
if
(
type
==
IRQT_PROBE
)
{
/* Don't mess with enabled GPIOs using preconfigured edges or
GPIOs set to alternate function during probe */
if
((
GPIO_IRQ_rising_edge
[
idx
]
|
GPIO_IRQ_falling_edge
[
idx
])
&
GPIO_bit
(
gpio
))
return
0
;
if
(
GAFR
(
gpio
)
&
(
0x3
<<
(((
gpio
)
&
0xf
)
*
2
)))
return
0
;
type
=
__IRQT_RISEDGE
|
__IRQT_FALEDGE
;
}
printk
(
KERN_DEBUG
"IRQ%d (GPIO%d): "
,
irq
,
gpio
);
...
...
@@ -78,10 +90,8 @@ static int pxa_gpio_irq_type(unsigned int irq, unsigned int type)
printk
(
"edges
\n
"
);
idx
=
gpio
>>
5
;
GRER
(
gpio
)
=
GPIO_IRQ_rising_edge
[
idx
]
&
GPIO_IRQ_mask
[
idx
];
GFER
(
gpio
)
=
GPIO_IRQ_falling_edge
[
idx
]
&
GPIO_IRQ_mask
[
idx
];
return
0
;
}
...
...
arch/arm/mach-pxa/lubbock.c
View file @
82d007ae
...
...
@@ -78,7 +78,7 @@ static void __init lubbock_init_irq(void)
pxa_init_irq
();
/* setup extra lubbock irqs */
for
(
irq
=
LUBBOCK_IRQ
(
0
);
irq
<=
LUBBOCK_
IRQ
(
5
)
;
irq
++
)
{
for
(
irq
=
LUBBOCK_IRQ
(
0
);
irq
<=
LUBBOCK_
LAST_IRQ
;
irq
++
)
{
set_irq_chip
(
irq
,
&
lubbock_irq_chip
);
set_irq_handler
(
irq
,
do_level_IRQ
);
set_irq_flags
(
irq
,
IRQF_VALID
|
IRQF_PROBE
);
...
...
@@ -124,6 +124,7 @@ static struct map_desc lubbock_io_desc[] __initdata = {
{
0xf0000000
,
0x08000000
,
0x00100000
,
MT_DEVICE
},
/* CPLD */
{
0xf1000000
,
0x0c000000
,
0x00100000
,
MT_DEVICE
},
/* LAN91C96 IO */
{
0xf1100000
,
0x0e000000
,
0x00100000
,
MT_DEVICE
},
/* LAN91C96 Attr */
{
0xf4000000
,
0x10000000
,
0x00800000
,
MT_DEVICE
},
/* SA1111 */
};
static
void
__init
lubbock_map_io
(
void
)
...
...
include/asm-arm/arch-pxa/irqs.h
View file @
82d007ae
...
...
@@ -13,7 +13,7 @@
#include <linux/config.h>
#define PXA_IRQ_SKIP 7
/* The first 7 IRQs are not yet used */
#define PXA_IRQ(x)
((x) - PXA_IRQ_SKIP)
#define PXA_IRQ(x) ((x) - PXA_IRQ_SKIP)
#define IRQ_HWUART PXA_IRQ(7)
/* HWUART Transmit/Receive/Error */
#define IRQ_GPIO0 PXA_IRQ(8)
/* GPIO0 Edge Detect */
...
...
@@ -47,7 +47,7 @@
#define IRQ_TO_GPIO_2_80(i) \
((i) - PXA_IRQ(32) + 2)
#define IRQ_TO_GPIO(i) ((i) - (((i) > IRQ_GPIO1) ? IRQ_GPIO(2) : IRQ_GPIO(0)))
#define IRQ_TO_GPIO(i) ((i) - (((i) > IRQ_GPIO1) ? IRQ_GPIO(2)
- 2
: IRQ_GPIO(0)))
/*
* The next 16 interrupts are for board specific purposes. Since
...
...
@@ -131,8 +131,10 @@
#define LUBBOCK_IRQ(x) (IRQ_BOARD_START + (x))
#define LUBBOCK_SD_IRQ LUBBOCK_IRQ(0)
#define LUBBOCK_SA1111_IRQ LUBBOCK_IRQ(1)
#define LUBBOCK_USB_IRQ LUBBOCK_IRQ(2)
#define LUBBOCK_USB_IRQ LUBBOCK_IRQ(2)
/* usb connect */
#define LUBBOCK_ETH_IRQ LUBBOCK_IRQ(3)
#define LUBBOCK_UCB1400_IRQ LUBBOCK_IRQ(4)
#define LUBBOCK_BB_IRQ LUBBOCK_IRQ(5)
#define LUBBOCK_USB_DISC_IRQ LUBBOCK_IRQ(6)
/* usb disconnect */
#define LUBBOCK_LAST_IRQ LUBBOCK_IRQ(6)
include/asm-arm/arch-pxa/lubbock.h
View file @
82d007ae
...
...
@@ -12,7 +12,8 @@
#define LUBBOCK_FPGA_PHYS PXA_CS2_PHYS
#define LUBBOCK_FPGA_VIRT (0xf0000000)
/* phys 0x08000000 */
#define LUBBOCK_ETH_BASE (0xf1000000)
/* phys 0x0c000000 */
#define LUBBOCK_ETH_PHYS PXA_CS3_PHYS
#define LUBBOCK_ETH_VIRT (0xf1000000)
#define LUB_P2V(x) ((x) - LUBBOCK_FPGA_PHYS + LUBBOCK_FPGA_VIRT)
#define LUB_V2P(x) ((x) - LUBBOCK_FPGA_VIRT + LUBBOCK_FPGA_PHYS)
...
...
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