Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
Bricked
flo
Commits
92dd7ca0
Commit
92dd7ca0
authored
19 years ago
by
Linus Torvalds
Browse files
Options
Download
Plain Diff
Merge master.kernel.org:/home/rmk/linux-2.6-arm
parents
164cad9b
da41119a
Changes
27
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
311 additions
and
533 deletions
+311
-533
arch/arm/kernel/armksyms.c
arch/arm/kernel/armksyms.c
+0
-6
arch/arm/kernel/setup.c
arch/arm/kernel/setup.c
+2
-1
arch/arm/kernel/smp.c
arch/arm/kernel/smp.c
+123
-0
arch/arm/lib/Makefile
arch/arm/lib/Makefile
+1
-1
arch/arm/lib/longlong.h
arch/arm/lib/longlong.h
+0
-183
arch/arm/lib/udivdi3.c
arch/arm/lib/udivdi3.c
+0
-222
arch/arm/mach-integrator/core.c
arch/arm/mach-integrator/core.c
+13
-28
arch/arm/mach-omap/pm.c
arch/arm/mach-omap/pm.c
+10
-6
arch/arm/mach-omap/time.c
arch/arm/mach-omap/time.c
+42
-2
arch/arm/mach-s3c2410/Kconfig
arch/arm/mach-s3c2410/Kconfig
+5
-0
arch/arm/mach-s3c2410/Makefile
arch/arm/mach-s3c2410/Makefile
+1
-0
arch/arm/mach-s3c2410/devs.c
arch/arm/mach-s3c2410/devs.c
+2
-2
arch/arm/mach-s3c2410/mach-bast.c
arch/arm/mach-s3c2410/mach-bast.c
+4
-35
arch/arm/mach-s3c2410/mach-vr1000.c
arch/arm/mach-s3c2410/mach-vr1000.c
+2
-6
arch/arm/mach-s3c2410/pm-simtec.c
arch/arm/mach-s3c2410/pm-simtec.c
+65
-0
arch/arm/mach-versatile/core.c
arch/arm/mach-versatile/core.c
+24
-37
arch/arm/mm/init.c
arch/arm/mm/init.c
+1
-1
arch/arm/mm/mm-armv.c
arch/arm/mm/mm-armv.c
+1
-1
arch/arm/vfp/vfp.h
arch/arm/vfp/vfp.h
+13
-2
arch/arm/vfp/vfpdouble.c
arch/arm/vfp/vfpdouble.c
+2
-0
No files found.
arch/arm/kernel/armksyms.c
View file @
92dd7ca0
...
...
@@ -30,9 +30,6 @@ extern void __lshrdi3(void);
extern
void
__modsi3
(
void
);
extern
void
__muldi3
(
void
);
extern
void
__ucmpdi2
(
void
);
extern
void
__udivdi3
(
void
);
extern
void
__umoddi3
(
void
);
extern
void
__udivmoddi4
(
void
);
extern
void
__udivsi3
(
void
);
extern
void
__umodsi3
(
void
);
extern
void
__do_div64
(
void
);
...
...
@@ -134,9 +131,6 @@ EXPORT_SYMBOL(__lshrdi3);
EXPORT_SYMBOL
(
__modsi3
);
EXPORT_SYMBOL
(
__muldi3
);
EXPORT_SYMBOL
(
__ucmpdi2
);
EXPORT_SYMBOL
(
__udivdi3
);
EXPORT_SYMBOL
(
__umoddi3
);
EXPORT_SYMBOL
(
__udivmoddi4
);
EXPORT_SYMBOL
(
__udivsi3
);
EXPORT_SYMBOL
(
__umodsi3
);
EXPORT_SYMBOL
(
__do_div64
);
...
...
This diff is collapsed.
Click to expand it.
arch/arm/kernel/setup.c
View file @
92dd7ca0
...
...
@@ -359,7 +359,8 @@ void cpu_init(void)
"I"
(
offsetof
(
struct
stack
,
abt
[
0
])),
"I"
(
PSR_F_BIT
|
PSR_I_BIT
|
UND_MODE
),
"I"
(
offsetof
(
struct
stack
,
und
[
0
])),
"I"
(
PSR_F_BIT
|
PSR_I_BIT
|
SVC_MODE
));
"I"
(
PSR_F_BIT
|
PSR_I_BIT
|
SVC_MODE
)
:
"r14"
);
}
static
struct
machine_desc
*
__init
setup_machine
(
unsigned
int
nr
)
...
...
This diff is collapsed.
Click to expand it.
arch/arm/kernel/smp.c
View file @
92dd7ca0
...
...
@@ -502,3 +502,126 @@ int __init setup_profiling_timer(unsigned int multiplier)
{
return
-
EINVAL
;
}
static
int
on_each_cpu_mask
(
void
(
*
func
)(
void
*
),
void
*
info
,
int
retry
,
int
wait
,
cpumask_t
mask
)
{
int
ret
=
0
;
preempt_disable
();
ret
=
smp_call_function_on_cpu
(
func
,
info
,
retry
,
wait
,
mask
);
if
(
cpu_isset
(
smp_processor_id
(),
mask
))
func
(
info
);
preempt_enable
();
return
ret
;
}
/**********************************************************************/
/*
* TLB operations
*/
struct
tlb_args
{
struct
vm_area_struct
*
ta_vma
;
unsigned
long
ta_start
;
unsigned
long
ta_end
;
};
static
inline
void
ipi_flush_tlb_all
(
void
*
ignored
)
{
local_flush_tlb_all
();
}
static
inline
void
ipi_flush_tlb_mm
(
void
*
arg
)
{
struct
mm_struct
*
mm
=
(
struct
mm_struct
*
)
arg
;
local_flush_tlb_mm
(
mm
);
}
static
inline
void
ipi_flush_tlb_page
(
void
*
arg
)
{
struct
tlb_args
*
ta
=
(
struct
tlb_args
*
)
arg
;
local_flush_tlb_page
(
ta
->
ta_vma
,
ta
->
ta_start
);
}
static
inline
void
ipi_flush_tlb_kernel_page
(
void
*
arg
)
{
struct
tlb_args
*
ta
=
(
struct
tlb_args
*
)
arg
;
local_flush_tlb_kernel_page
(
ta
->
ta_start
);
}
static
inline
void
ipi_flush_tlb_range
(
void
*
arg
)
{
struct
tlb_args
*
ta
=
(
struct
tlb_args
*
)
arg
;
local_flush_tlb_range
(
ta
->
ta_vma
,
ta
->
ta_start
,
ta
->
ta_end
);
}
static
inline
void
ipi_flush_tlb_kernel_range
(
void
*
arg
)
{
struct
tlb_args
*
ta
=
(
struct
tlb_args
*
)
arg
;
local_flush_tlb_kernel_range
(
ta
->
ta_start
,
ta
->
ta_end
);
}
void
flush_tlb_all
(
void
)
{
on_each_cpu
(
ipi_flush_tlb_all
,
NULL
,
1
,
1
);
}
void
flush_tlb_mm
(
struct
mm_struct
*
mm
)
{
cpumask_t
mask
=
mm
->
cpu_vm_mask
;
on_each_cpu_mask
(
ipi_flush_tlb_mm
,
mm
,
1
,
1
,
mask
);
}
void
flush_tlb_page
(
struct
vm_area_struct
*
vma
,
unsigned
long
uaddr
)
{
cpumask_t
mask
=
vma
->
vm_mm
->
cpu_vm_mask
;
struct
tlb_args
ta
;
ta
.
ta_vma
=
vma
;
ta
.
ta_start
=
uaddr
;
on_each_cpu_mask
(
ipi_flush_tlb_page
,
&
ta
,
1
,
1
,
mask
);
}
void
flush_tlb_kernel_page
(
unsigned
long
kaddr
)
{
struct
tlb_args
ta
;
ta
.
ta_start
=
kaddr
;
on_each_cpu
(
ipi_flush_tlb_kernel_page
,
&
ta
,
1
,
1
);
}
void
flush_tlb_range
(
struct
vm_area_struct
*
vma
,
unsigned
long
start
,
unsigned
long
end
)
{
cpumask_t
mask
=
vma
->
vm_mm
->
cpu_vm_mask
;
struct
tlb_args
ta
;
ta
.
ta_vma
=
vma
;
ta
.
ta_start
=
start
;
ta
.
ta_end
=
end
;
on_each_cpu_mask
(
ipi_flush_tlb_range
,
&
ta
,
1
,
1
,
mask
);
}
void
flush_tlb_kernel_range
(
unsigned
long
start
,
unsigned
long
end
)
{
struct
tlb_args
ta
;
ta
.
ta_start
=
start
;
ta
.
ta_end
=
end
;
on_each_cpu
(
ipi_flush_tlb_kernel_range
,
&
ta
,
1
,
1
);
}
This diff is collapsed.
Click to expand it.
arch/arm/lib/Makefile
View file @
92dd7ca0
...
...
@@ -11,7 +11,7 @@ lib-y := backtrace.o changebit.o csumipv6.o csumpartial.o \
strnlen_user.o strchr.o strrchr.o testchangebit.o
\
testclearbit.o testsetbit.o uaccess.o getuser.o
\
putuser.o ashldi3.o ashrdi3.o lshrdi3.o muldi3.o
\
ucmpdi2.o
udivdi3.o
lib1funcs.o div64.o
\
ucmpdi2.o lib1funcs.o div64.o
\
io-readsb.o io-writesb.o io-readsl.o io-writesl.o
ifeq
($(CONFIG_CPU_32v3),y)
...
...
This diff is collapsed.
Click to expand it.
arch/arm/lib/longlong.h
deleted
100644 → 0
View file @
164cad9b
/* longlong.h -- based on code from gcc-2.95.3
definitions for mixed size 32/64 bit arithmetic.
Copyright (C) 1991, 92, 94, 95, 96, 1997, 1998 Free Software Foundation, Inc.
This definition file is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2, or (at your option) any later version.
This definition file is distributed in the hope that it will be
useful, but WITHOUT ANY WARRANTY; without even the implied
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* Borrowed from GCC 2.95.3, I Molton 29/07/01 */
#ifndef SI_TYPE_SIZE
#define SI_TYPE_SIZE 32
#endif
#define __BITS4 (SI_TYPE_SIZE / 4)
#define __ll_B (1L << (SI_TYPE_SIZE / 2))
#define __ll_lowpart(t) ((u32) (t) % __ll_B)
#define __ll_highpart(t) ((u32) (t) / __ll_B)
/* Define auxiliary asm macros.
1) umul_ppmm(high_prod, low_prod, multipler, multiplicand)
multiplies two u32 integers MULTIPLER and MULTIPLICAND,
and generates a two-part u32 product in HIGH_PROD and
LOW_PROD.
2) __umulsidi3(a,b) multiplies two u32 integers A and B,
and returns a u64 product. This is just a variant of umul_ppmm.
3) udiv_qrnnd(quotient, remainder, high_numerator, low_numerator,
denominator) divides a two-word unsigned integer, composed by the
integers HIGH_NUMERATOR and LOW_NUMERATOR, by DENOMINATOR and
places the quotient in QUOTIENT and the remainder in REMAINDER.
HIGH_NUMERATOR must be less than DENOMINATOR for correct operation.
If, in addition, the most significant bit of DENOMINATOR must be 1,
then the pre-processor symbol UDIV_NEEDS_NORMALIZATION is defined to 1.
4) sdiv_qrnnd(quotient, remainder, high_numerator, low_numerator,
denominator). Like udiv_qrnnd but the numbers are signed. The
quotient is rounded towards 0.
5) count_leading_zeros(count, x) counts the number of zero-bits from
the msb to the first non-zero bit. This is the number of steps X
needs to be shifted left to set the msb. Undefined for X == 0.
6) add_ssaaaa(high_sum, low_sum, high_addend_1, low_addend_1,
high_addend_2, low_addend_2) adds two two-word unsigned integers,
composed by HIGH_ADDEND_1 and LOW_ADDEND_1, and HIGH_ADDEND_2 and
LOW_ADDEND_2 respectively. The result is placed in HIGH_SUM and
LOW_SUM. Overflow (i.e. carry out) is not stored anywhere, and is
lost.
7) sub_ddmmss(high_difference, low_difference, high_minuend,
low_minuend, high_subtrahend, low_subtrahend) subtracts two
two-word unsigned integers, composed by HIGH_MINUEND_1 and
LOW_MINUEND_1, and HIGH_SUBTRAHEND_2 and LOW_SUBTRAHEND_2
respectively. The result is placed in HIGH_DIFFERENCE and
LOW_DIFFERENCE. Overflow (i.e. carry out) is not stored anywhere,
and is lost.
If any of these macros are left undefined for a particular CPU,
C macros are used. */
#if defined (__arm__)
#define add_ssaaaa(sh, sl, ah, al, bh, bl) \
__asm__ ("adds %1, %4, %5 \n\
adc %0, %2, %3" \
: "=r" ((u32) (sh)), \
"=&r" ((u32) (sl)) \
: "%r" ((u32) (ah)), \
"rI" ((u32) (bh)), \
"%r" ((u32) (al)), \
"rI" ((u32) (bl)))
#define sub_ddmmss(sh, sl, ah, al, bh, bl) \
__asm__ ("subs %1, %4, %5 \n\
sbc %0, %2, %3" \
: "=r" ((u32) (sh)), \
"=&r" ((u32) (sl)) \
: "r" ((u32) (ah)), \
"rI" ((u32) (bh)), \
"r" ((u32) (al)), \
"rI" ((u32) (bl)))
#define umul_ppmm(xh, xl, a, b) \
{register u32 __t0, __t1, __t2; \
__asm__ ("%@ Inlined umul_ppmm \n\
mov %2, %5, lsr #16 \n\
mov %0, %6, lsr #16 \n\
bic %3, %5, %2, lsl #16 \n\
bic %4, %6, %0, lsl #16 \n\
mul %1, %3, %4 \n\
mul %4, %2, %4 \n\
mul %3, %0, %3 \n\
mul %0, %2, %0 \n\
adds %3, %4, %3 \n\
addcs %0, %0, #65536 \n\
adds %1, %1, %3, lsl #16 \n\
adc %0, %0, %3, lsr #16" \
: "=&r" ((u32) (xh)), \
"=r" ((u32) (xl)), \
"=&r" (__t0), "=&r" (__t1), "=r" (__t2) \
: "r" ((u32) (a)), \
"r" ((u32) (b)));}
#define UMUL_TIME 20
#define UDIV_TIME 100
#endif
/* __arm__ */
#define __umulsidi3(u, v) \
({DIunion __w; \
umul_ppmm (__w.s.high, __w.s.low, u, v); \
__w.ll; })
#define __udiv_qrnnd_c(q, r, n1, n0, d) \
do { \
u32 __d1, __d0, __q1, __q0; \
u32 __r1, __r0, __m; \
__d1 = __ll_highpart (d); \
__d0 = __ll_lowpart (d); \
\
__r1 = (n1) % __d1; \
__q1 = (n1) / __d1; \
__m = (u32) __q1 * __d0; \
__r1 = __r1 * __ll_B | __ll_highpart (n0); \
if (__r1 < __m) \
{ \
__q1--, __r1 += (d); \
if (__r1 >= (d))
/* i.e. we didn't get carry when adding to __r1 */
\
if (__r1 < __m) \
__q1--, __r1 += (d); \
} \
__r1 -= __m; \
\
__r0 = __r1 % __d1; \
__q0 = __r1 / __d1; \
__m = (u32) __q0 * __d0; \
__r0 = __r0 * __ll_B | __ll_lowpart (n0); \
if (__r0 < __m) \
{ \
__q0--, __r0 += (d); \
if (__r0 >= (d)) \
if (__r0 < __m) \
__q0--, __r0 += (d); \
} \
__r0 -= __m; \
\
(q) = (u32) __q1 * __ll_B | __q0; \
(r) = __r0; \
} while (0)
#define UDIV_NEEDS_NORMALIZATION 1
#define udiv_qrnnd __udiv_qrnnd_c
#define count_leading_zeros(count, x) \
do { \
u32 __xr = (x); \
u32 __a; \
\
if (SI_TYPE_SIZE <= 32) \
{ \
__a = __xr < ((u32)1<<2*__BITS4) \
? (__xr < ((u32)1<<__BITS4) ? 0 : __BITS4) \
: (__xr < ((u32)1<<3*__BITS4) ? 2*__BITS4 : 3*__BITS4); \
} \
else \
{ \
for (__a = SI_TYPE_SIZE - 8; __a > 0; __a -= 8) \
if (((__xr >> __a) & 0xff) != 0) \
break; \
} \
\
(count) = SI_TYPE_SIZE - (__clz_tab[__xr >> __a] + __a); \
} while (0)
This diff is collapsed.
Click to expand it.
arch/arm/lib/udivdi3.c
deleted
100644 → 0
View file @
164cad9b
/* More subroutines needed by GCC output code on some machines. */
/* Compile this one with gcc. */
/* Copyright (C) 1989, 92-98, 1999 Free Software Foundation, Inc.
This file is part of GNU CC.
GNU CC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
GNU CC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* As a special exception, if you link this library with other files,
some of which are compiled with GCC, to produce an executable,
this library does not by itself cause the resulting executable
to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why
the executable file might be covered by the GNU General Public License.
*/
/* support functions required by the kernel. based on code from gcc-2.95.3 */
/* I Molton 29/07/01 */
#include "gcclib.h"
#include "longlong.h"
static
const
u8
__clz_tab
[]
=
{
0
,
1
,
2
,
2
,
3
,
3
,
3
,
3
,
4
,
4
,
4
,
4
,
4
,
4
,
4
,
4
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
7
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
8
,
};
u64
__udivmoddi4
(
u64
n
,
u64
d
,
u64
*
rp
)
{
DIunion
ww
;
DIunion
nn
,
dd
;
DIunion
rr
;
u32
d0
,
d1
,
n0
,
n1
,
n2
;
u32
q0
,
q1
;
u32
b
,
bm
;
nn
.
ll
=
n
;
dd
.
ll
=
d
;
d0
=
dd
.
s
.
low
;
d1
=
dd
.
s
.
high
;
n0
=
nn
.
s
.
low
;
n1
=
nn
.
s
.
high
;
if
(
d1
==
0
)
{
if
(
d0
>
n1
)
{
/* 0q = nn / 0D */
count_leading_zeros
(
bm
,
d0
);
if
(
bm
!=
0
)
{
/* Normalize, i.e. make the most significant bit of the
denominator set. */
d0
=
d0
<<
bm
;
n1
=
(
n1
<<
bm
)
|
(
n0
>>
(
SI_TYPE_SIZE
-
bm
));
n0
=
n0
<<
bm
;
}
udiv_qrnnd
(
q0
,
n0
,
n1
,
n0
,
d0
);
q1
=
0
;
/* Remainder in n0 >> bm. */
}
else
{
/* qq = NN / 0d */
if
(
d0
==
0
)
d0
=
1
/
d0
;
/* Divide intentionally by zero. */
count_leading_zeros
(
bm
,
d0
);
if
(
bm
==
0
)
{
/* From (n1 >= d0) /\ (the most significant bit of d0 is set),
conclude (the most significant bit of n1 is set) /\ (the
leading quotient digit q1 = 1).
This special case is necessary, not an optimization.
(Shifts counts of SI_TYPE_SIZE are undefined.) */
n1
-=
d0
;
q1
=
1
;
}
else
{
/* Normalize. */
b
=
SI_TYPE_SIZE
-
bm
;
d0
=
d0
<<
bm
;
n2
=
n1
>>
b
;
n1
=
(
n1
<<
bm
)
|
(
n0
>>
b
);
n0
=
n0
<<
bm
;
udiv_qrnnd
(
q1
,
n1
,
n2
,
n1
,
d0
);
}
/* n1 != d0... */
udiv_qrnnd
(
q0
,
n0
,
n1
,
n0
,
d0
);
/* Remainder in n0 >> bm. */
}
if
(
rp
!=
0
)
{
rr
.
s
.
low
=
n0
>>
bm
;
rr
.
s
.
high
=
0
;
*
rp
=
rr
.
ll
;
}
}
else
{
if
(
d1
>
n1
)
{
/* 00 = nn / DD */
q0
=
0
;
q1
=
0
;
/* Remainder in n1n0. */
if
(
rp
!=
0
)
{
rr
.
s
.
low
=
n0
;
rr
.
s
.
high
=
n1
;
*
rp
=
rr
.
ll
;
}
}
else
{
/* 0q = NN / dd */
count_leading_zeros
(
bm
,
d1
);
if
(
bm
==
0
)
{
/* From (n1 >= d1) /\ (the most significant bit of d1 is set),
conclude (the most significant bit of n1 is set) /\ (the
quotient digit q0 = 0 or 1).
This special case is necessary, not an optimization. */
/* The condition on the next line takes advantage of that
n1 >= d1 (true due to program flow). */
if
(
n1
>
d1
||
n0
>=
d0
)
{
q0
=
1
;
sub_ddmmss
(
n1
,
n0
,
n1
,
n0
,
d1
,
d0
);
}
else
q0
=
0
;
q1
=
0
;
if
(
rp
!=
0
)
{
rr
.
s
.
low
=
n0
;
rr
.
s
.
high
=
n1
;
*
rp
=
rr
.
ll
;
}
}
else
{
u32
m1
,
m0
;
/* Normalize. */
b
=
SI_TYPE_SIZE
-
bm
;
d1
=
(
d1
<<
bm
)
|
(
d0
>>
b
);
d0
=
d0
<<
bm
;
n2
=
n1
>>
b
;
n1
=
(
n1
<<
bm
)
|
(
n0
>>
b
);
n0
=
n0
<<
bm
;
udiv_qrnnd
(
q0
,
n1
,
n2
,
n1
,
d1
);
umul_ppmm
(
m1
,
m0
,
q0
,
d0
);
if
(
m1
>
n1
||
(
m1
==
n1
&&
m0
>
n0
))
{
q0
--
;
sub_ddmmss
(
m1
,
m0
,
m1
,
m0
,
d1
,
d0
);
}
q1
=
0
;
/* Remainder in (n1n0 - m1m0) >> bm. */
if
(
rp
!=
0
)
{
sub_ddmmss
(
n1
,
n0
,
n1
,
n0
,
m1
,
m0
);
rr
.
s
.
low
=
(
n1
<<
b
)
|
(
n0
>>
bm
);
rr
.
s
.
high
=
n1
>>
bm
;
*
rp
=
rr
.
ll
;
}
}
}
}
ww
.
s
.
low
=
q0
;
ww
.
s
.
high
=
q1
;
return
ww
.
ll
;
}
u64
__udivdi3
(
u64
n
,
u64
d
)
{
return
__udivmoddi4
(
n
,
d
,
(
u64
*
)
0
);
}
u64
__umoddi3
(
u64
u
,
u64
v
)
{
u64
w
;
(
void
)
__udivmoddi4
(
u
,
v
,
&
w
);
return
w
;
}
This diff is collapsed.
Click to expand it.
arch/arm/mach-integrator/core.c
View file @
92dd7ca0
...
...
@@ -20,6 +20,7 @@
#include <asm/irq.h>
#include <asm/io.h>
#include <asm/hardware/amba.h>
#include <asm/hardware/arm_timer.h>
#include <asm/arch/cm.h>
#include <asm/system.h>
#include <asm/leds.h>
...
...
@@ -156,16 +157,6 @@ EXPORT_SYMBOL(cm_control);
#define TICKS2USECS(x) ((x) / TICKS_PER_uSEC)
#endif
/*
* What does it look like?
*/
typedef
struct
TimerStruct
{
unsigned
long
TimerLoad
;
unsigned
long
TimerValue
;
unsigned
long
TimerControl
;
unsigned
long
TimerClear
;
}
TimerStruct_t
;
static
unsigned
long
timer_reload
;
/*
...
...
@@ -174,7 +165,6 @@ static unsigned long timer_reload;
*/
unsigned
long
integrator_gettimeoffset
(
void
)
{
volatile
TimerStruct_t
*
timer1
=
(
TimerStruct_t
*
)
TIMER1_VA_BASE
;
unsigned
long
ticks1
,
ticks2
,
status
;
/*
...
...
@@ -183,11 +173,11 @@ unsigned long integrator_gettimeoffset(void)
* an interrupt. We get around this by ensuring that the
* counter has not reloaded between our two reads.
*/
ticks2
=
timer1
->
TimerValue
&
0xffff
;
ticks2
=
readl
(
TIMER1_VA_BASE
+
TIMER_VALUE
)
&
0xffff
;
do
{
ticks1
=
ticks2
;
status
=
__raw_readl
(
VA_IC_BASE
+
IRQ_RAW_STATUS
);
ticks2
=
timer1
->
TimerValue
&
0xffff
;
ticks2
=
readl
(
TIMER1_VA_BASE
+
TIMER_VALUE
)
&
0xffff
;
}
while
(
ticks2
>
ticks1
);
/*
...
...
@@ -213,14 +203,12 @@ unsigned long integrator_gettimeoffset(void)
static
irqreturn_t
integrator_timer_interrupt
(
int
irq
,
void
*
dev_id
,
struct
pt_regs
*
regs
)
{
volatile
TimerStruct_t
*
timer1
=
(
volatile
TimerStruct_t
*
)
TIMER1_VA_BASE
;
write_seqlock
(
&
xtime_lock
);
/*
* clear the interrupt
*/
timer1
->
TimerClear
=
1
;
writel
(
1
,
TIMER1_VA_BASE
+
TIMER_INTCLR
)
;
/*
* the clock tick routines are only processed on the
...
...
@@ -256,32 +244,29 @@ static struct irqaction integrator_timer_irq = {
*/
void
__init
integrator_time_init
(
unsigned
long
reload
,
unsigned
int
ctrl
)
{
volatile
TimerStruct_t
*
timer0
=
(
volatile
TimerStruct_t
*
)
TIMER0_VA_BASE
;
volatile
TimerStruct_t
*
timer1
=
(
volatile
TimerStruct_t
*
)
TIMER1_VA_BASE
;
volatile
TimerStruct_t
*
timer2
=
(
volatile
TimerStruct_t
*
)
TIMER2_VA_BASE
;
unsigned
int
timer_ctrl
=
0x80
|
0x40
;
/* periodic */
unsigned
int
timer_ctrl
=
TIMER_CTRL_ENABLE
|
TIMER_CTRL_PERIODIC
;
timer_reload
=
reload
;
timer_ctrl
|=
ctrl
;
if
(
timer_reload
>
0x100000
)
{
timer_reload
>>=
8
;
timer_ctrl
|=
0x08
;
/* /256 */
timer_ctrl
|=
TIMER_CTRL_DIV256
;
}
else
if
(
timer_reload
>
0x010000
)
{
timer_reload
>>=
4
;
timer_ctrl
|=
0x04
;
/* /16 */
timer_ctrl
|=
TIMER_CTRL_DIV16
;
}
/*
* Initialise to a known state (all timers off)
*/
timer0
->
TimerControl
=
0
;
timer1
->
TimerControl
=
0
;
timer2
->
TimerControl
=
0
;
writel
(
0
,
TIMER0_VA_BASE
+
TIMER_CTRL
)
;
writel
(
0
,
TIMER1_VA_BASE
+
TIMER_CTRL
)
;
writel
(
0
,
TIMER2_VA_BASE
+
TIMER_CTRL
)
;
timer1
->
TimerLoad
=
timer_reload
;
timer1
->
TimerValue
=
timer_reload
;
timer1
->
TimerControl
=
timer_ctrl
;
writel
(
timer_reload
,
TIMER1_VA_BASE
+
TIMER_LOAD
)
;
writel
(
timer_reload
,
TIMER1_VA_BASE
+
TIMER_VALUE
)
;
writel
(
timer_ctrl
,
TIMER1_VA_BASE
+
TIMER_CTRL
)
;
/*
* Make irqs happen for the system timer
...
...
This diff is collapsed.
Click to expand it.
arch/arm/mach-omap/pm.c
View file @
92dd7ca0
...
...
@@ -41,7 +41,9 @@
#include <linux/pm.h>
#include <asm/io.h>
#include <asm/mach/time.h>
#include <asm/mach-types.h>
#include <asm/arch/omap16xx.h>
#include <asm/arch/pm.h>
#include <asm/arch/mux.h>
...
...
@@ -80,13 +82,13 @@ void omap_pm_idle(void)
return
;
}
mask32
=
omap_readl
(
ARM_SYSST
);
local_fiq_enable
();
local_irq_enable
();
#if defined(CONFIG_OMAP_32K_TIMER) && defined(CONFIG_NO_IDLE_HZ)
/* Override timer to use VST for the next cycle */
omap_32k_timer_next_vst_interrupt
();
#endif
/*
* Since an interrupt may set up a timer, we don't want to
* reprogram the hardware timer with interrupts enabled.
* Re-enable interrupts only after returning from idle.
*/
timer_dyn_reprogram
();
if
((
mask32
&
DSP_IDLE
)
==
0
)
{
__asm__
volatile
(
"mcr p15, 0, r0, c7, c0, 4"
);
...
...
@@ -102,6 +104,8 @@ void omap_pm_idle(void)
func_ptr
();
}
local_fiq_enable
();
local_irq_enable
();
}
/*
...
...
This diff is collapsed.
Click to expand it.
arch/arm/mach-omap/time.c
View file @
92dd7ca0
...
...
@@ -4,7 +4,7 @@
* OMAP Timers
*
* Copyright (C) 2004 Nokia Corporation
* Partial timer rewrite and additional
VST
timer support by
* Partial timer rewrite and additional
dynamic tick
timer support by
* Tony Lindgen <tony@atomide.com> and
* Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>
*
...
...
@@ -261,7 +261,6 @@ unsigned long long sched_clock(void)
* so with HZ = 100, TVR = 327.68.
*/
#define OMAP_32K_TIMER_TICK_PERIOD ((32768 / HZ) - 1)
#define MAX_SKIP_JIFFIES 25
#define TIMER_32K_SYNCHRONIZED 0xfffbc410
#define JIFFIES_TO_HW_TICKS(nr_jiffies, clock_rate) \
...
...
@@ -347,6 +346,42 @@ static irqreturn_t omap_32k_timer_interrupt(int irq, void *dev_id,
return
IRQ_HANDLED
;
}
#ifdef CONFIG_NO_IDLE_HZ
/*
* Programs the next timer interrupt needed. Called when dynamic tick is
* enabled, and to reprogram the ticks to skip from pm_idle. Note that
* we can keep the timer continuous, and don't need to set it to run in
* one-shot mode. This is because the timer will get reprogrammed again
* after next interrupt.
*/
void
omap_32k_timer_reprogram
(
unsigned
long
next_tick
)
{
omap_32k_timer_start
(
JIFFIES_TO_HW_TICKS
(
next_tick
,
32768
)
+
1
);
}
static
struct
irqaction
omap_32k_timer_irq
;
extern
struct
timer_update_handler
timer_update
;
static
int
omap_32k_timer_enable_dyn_tick
(
void
)
{
/* No need to reprogram timer, just use the next interrupt */
return
0
;
}
static
int
omap_32k_timer_disable_dyn_tick
(
void
)
{
omap_32k_timer_start
(
OMAP_32K_TIMER_TICK_PERIOD
);
return
0
;
}
static
struct
dyn_tick_timer
omap_dyn_tick_timer
=
{
.
enable
=
omap_32k_timer_enable_dyn_tick
,
.
disable
=
omap_32k_timer_disable_dyn_tick
,
.
reprogram
=
omap_32k_timer_reprogram
,
.
handler
=
omap_32k_timer_interrupt
,
};
#endif
/* CONFIG_NO_IDLE_HZ */
static
struct
irqaction
omap_32k_timer_irq
=
{
.
name
=
"32KHz timer"
,
.
flags
=
SA_INTERRUPT
|
SA_TIMER
,
...
...
@@ -355,6 +390,11 @@ static struct irqaction omap_32k_timer_irq = {
static
__init
void
omap_init_32k_timer
(
void
)
{
#ifdef CONFIG_NO_IDLE_HZ
omap_timer
.
dyn_tick
=
&
omap_dyn_tick_timer
;
#endif
setup_irq
(
INT_OS_TIMER
,
&
omap_32k_timer_irq
);
omap_timer
.
offset
=
omap_32k_timer_gettimeoffset
;
omap_32k_last_tick
=
omap_32k_sync_timer_read
();
...
...
This diff is collapsed.
Click to expand it.
arch/arm/mach-s3c2410/Kconfig
View file @
92dd7ca0
...
...
@@ -154,6 +154,11 @@ config S3C2410_PM_CHECK_CHUNKSIZE
the CRC data block will take more memory, but wil identify any
faults with better precision.
config PM_SIMTEC
bool
depends on PM && (ARCH_BAST || MACH_VR1000)
default y
config S3C2410_LOWLEVEL_UART_PORT
int "S3C2410 UART to use for low-level messages"
default 0
...
...
This diff is collapsed.
Click to expand it.
arch/arm/mach-s3c2410/Makefile
View file @
92dd7ca0
...
...
@@ -18,6 +18,7 @@ obj-$(CONFIG_S3C2410_DMA) += dma.o
# Power Management support
obj-$(CONFIG_PM)
+=
pm.o sleep.o
obj-$(CONFIG_PM_SIMTEC)
+=
pm-simtec.o
# S3C2440 support
...
...
This diff is collapsed.
Click to expand it.
arch/arm/mach-s3c2410/devs.c
View file @
92dd7ca0
...
...
@@ -96,8 +96,8 @@ struct platform_device s3c_device_lcd = {
.
num_resources
=
ARRAY_SIZE
(
s3c_lcd_resource
),
.
resource
=
s3c_lcd_resource
,
.
dev
=
{
.
dma_mask
=
&
s3c_device_lcd_dmamask
,
.
coherent_dma_mask
=
0xffffffffUL
.
dma_mask
=
&
s3c_device_lcd_dmamask
,
.
coherent_dma_mask
=
0xffffffffUL
}
};
...
...
This diff is collapsed.
Click to expand it.
arch/arm/mach-s3c2410/mach-bast.c
View file @
92dd7ca0
...
...
@@ -27,6 +27,7 @@
* 10-Mar-2005 LCVR Changed S3C2410_VA to S3C24XX_VA
* 14-Mar-2006 BJD Updated for __iomem changes
* 22-Jun-2006 BJD Added DM9000 platform information
* 28-Jun-2006 BJD Moved pm functionality out to common code
*/
#include <linux/kernel.h>
...
...
@@ -67,7 +68,6 @@
#include "devs.h"
#include "cpu.h"
#include "usb-simtec.h"
#include "pm.h"
#define COPYRIGHT ", (c) 2004-2005 Simtec Electronics"
...
...
@@ -405,44 +405,13 @@ void __init bast_map_io(void)
usb_simtec_init
();
}
void
__init
bast_init_irq
(
void
)
{
s3c24xx_init_irq
();
}
#ifdef CONFIG_PM
/* bast_init_machine
*
* enable the power management functions for the EB2410ITX
*/
static
__init
void
bast_init_machine
(
void
)
{
unsigned
long
gstatus4
;
printk
(
KERN_INFO
"BAST Power Manangement"
COPYRIGHT
"
\n
"
);
gstatus4
=
(
__raw_readl
(
S3C2410_BANKCON7
)
&
0x3
)
<<
30
;
gstatus4
|=
(
__raw_readl
(
S3C2410_BANKCON6
)
&
0x3
)
<<
28
;
gstatus4
|=
(
__raw_readl
(
S3C2410_BANKSIZE
)
&
S3C2410_BANKSIZE_MASK
);
__raw_writel
(
gstatus4
,
S3C2410_GSTATUS4
);
s3c2410_pm_init
();
}
#else
#define bast_init_machine NULL
#endif
MACHINE_START
(
BAST
,
"Simtec-BAST"
)
MAINTAINER
(
"Ben Dooks <ben@simtec.co.uk>"
)
BOOT_MEM
(
S3C2410_SDRAM_PA
,
S3C2410_PA_UART
,
(
u32
)
S3C24XX_VA_UART
)
BOOT_PARAMS
(
S3C2410_SDRAM_PA
+
0x100
)
MAPIO
(
bast_map_io
)
INITIRQ
(
bast_init_irq
)
.
init_
machine
=
bast_init_machine
,
.
map_io
=
bast_map_io
,
.
init_
irq
=
s3c24xx_init_irq
,
.
timer
=
&
s3c24xx_timer
,
MACHINE_END
This diff is collapsed.
Click to expand it.
arch/arm/mach-s3c2410/mach-vr1000.c
View file @
92dd7ca0
...
...
@@ -371,16 +371,12 @@ void __init vr1000_map_io(void)
usb_simtec_init
();
}
void
__init
vr1000_init_irq
(
void
)
{
s3c24xx_init_irq
();
}
MACHINE_START
(
VR1000
,
"Thorcom-VR1000"
)
MAINTAINER
(
"Ben Dooks <ben@simtec.co.uk>"
)
BOOT_MEM
(
S3C2410_SDRAM_PA
,
S3C2410_PA_UART
,
(
u32
)
S3C24XX_VA_UART
)
BOOT_PARAMS
(
S3C2410_SDRAM_PA
+
0x100
)
MAPIO
(
vr1000_map_io
)
INITIRQ
(
vr1000
_init_irq
)
.
map_io
=
vr1000_map_io
,
.
init_irq
=
s3c24xx
_init_irq
,
.
timer
=
&
s3c24xx_timer
,
MACHINE_END
This diff is collapsed.
Click to expand it.
arch/arm/mach-s3c2410/pm-simtec.c
0 → 100644
View file @
92dd7ca0
/* linux/arch/arm/mach-s3c2410/pm-simtec.c
*
* Copyright (c) 2004 Simtec Electronics
* Ben Dooks <ben@simtec.co.uk>
*
* http://armlinux.simtec.co.uk/
*
* Power Management helpers for Simtec S3C24XX implementations
*
* 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/kernel.h>
#include <linux/types.h>
#include <linux/interrupt.h>
#include <linux/list.h>
#include <linux/timer.h>
#include <linux/init.h>
#include <linux/device.h>
#include <asm/mach/arch.h>
#include <asm/mach/map.h>
#include <asm/hardware.h>
#include <asm/io.h>
#include <asm/arch/map.h>
#include <asm/arch/regs-serial.h>
#include <asm/arch/regs-gpio.h>
#include <asm/arch/regs-mem.h>
#include <asm/mach-types.h>
#include "pm.h"
#define COPYRIGHT ", (c) 2005 Simtec Electronics"
/* pm_simtec_init
*
* enable the power management functions
*/
static
__init
int
pm_simtec_init
(
void
)
{
unsigned
long
gstatus4
;
/* check which machine we are running on */
if
(
!
machine_is_bast
()
&&
!
machine_is_vr1000
())
return
0
;
printk
(
KERN_INFO
"Simtec Board Power Manangement"
COPYRIGHT
"
\n
"
);
gstatus4
=
(
__raw_readl
(
S3C2410_BANKCON7
)
&
0x3
)
<<
30
;
gstatus4
|=
(
__raw_readl
(
S3C2410_BANKCON6
)
&
0x3
)
<<
28
;
gstatus4
|=
(
__raw_readl
(
S3C2410_BANKSIZE
)
&
S3C2410_BANKSIZE_MASK
);
__raw_writel
(
gstatus4
,
S3C2410_GSTATUS4
);
return
s3c2410_pm_init
();
}
arch_initcall
(
pm_simtec_init
);
This diff is collapsed.
Click to expand it.
arch/arm/mach-versatile/core.c
View file @
92dd7ca0
...
...
@@ -33,6 +33,7 @@
#include <asm/mach-types.h>
#include <asm/hardware/amba.h>
#include <asm/hardware/amba_clcd.h>
#include <asm/hardware/arm_timer.h>
#include <asm/hardware/icst307.h>
#include <asm/mach/arch.h>
...
...
@@ -788,38 +789,25 @@ void __init versatile_init(void)
*/
#define TIMER_INTERVAL (TICKS_PER_uSEC * mSEC_10)
#if TIMER_INTERVAL >= 0x100000
#define TIMER_RELOAD (TIMER_INTERVAL >> 8)
/* Divide by 256 */
#define TIMER_
CTRL 0x88
/* Enable, Clock / 256 */
#define TIMER_RELOAD (TIMER_INTERVAL >> 8)
#define TIMER_
DIVISOR (TIMER_CTRL_DIV256)
#define TICKS2USECS(x) (256 * (x) / TICKS_PER_uSEC)
#elif TIMER_INTERVAL >= 0x10000
#define TIMER_RELOAD (TIMER_INTERVAL >> 4)
/* Divide by 16 */
#define TIMER_
CTRL 0x84
/* Enable, Clock / 16 */
#define TIMER_
DIVISOR (TIMER_CTRL_DIV16)
#define TICKS2USECS(x) (16 * (x) / TICKS_PER_uSEC)
#else
#define TIMER_RELOAD (TIMER_INTERVAL)
#define TIMER_
CTRL 0x80
/* Enable */
#define TIMER_
DIVISOR (TIMER_CTRL_DIV1)
#define TICKS2USECS(x) ((x) / TICKS_PER_uSEC)
#endif
#define TIMER_CTRL_IE (1 << 5)
/* Interrupt Enable */
/*
* What does it look like?
*/
typedef
struct
TimerStruct
{
unsigned
long
TimerLoad
;
unsigned
long
TimerValue
;
unsigned
long
TimerControl
;
unsigned
long
TimerClear
;
}
TimerStruct_t
;
/*
* Returns number of ms since last clock interrupt. Note that interrupts
* will have been disabled by do_gettimeoffset()
*/
static
unsigned
long
versatile_gettimeoffset
(
void
)
{
volatile
TimerStruct_t
*
timer0
=
(
TimerStruct_t
*
)
TIMER0_VA_BASE
;
unsigned
long
ticks1
,
ticks2
,
status
;
/*
...
...
@@ -828,11 +816,11 @@ static unsigned long versatile_gettimeoffset(void)
* an interrupt. We get around this by ensuring that the
* counter has not reloaded between our two reads.
*/
ticks2
=
timer0
->
TimerValue
&
0xffff
;
ticks2
=
readl
(
TIMER0_VA_BASE
+
TIMER_VALUE
)
&
0xffff
;
do
{
ticks1
=
ticks2
;
status
=
__raw_readl
(
VA_IC_BASE
+
VIC_IRQ_RAW_STATUS
);
ticks2
=
timer0
->
TimerValue
&
0xffff
;
ticks2
=
readl
(
TIMER0_VA_BASE
+
TIMER_VALUE
)
&
0xffff
;
}
while
(
ticks2
>
ticks1
);
/*
...
...
@@ -859,12 +847,10 @@ static unsigned long versatile_gettimeoffset(void)
*/
static
irqreturn_t
versatile_timer_interrupt
(
int
irq
,
void
*
dev_id
,
struct
pt_regs
*
regs
)
{
volatile
TimerStruct_t
*
timer0
=
(
volatile
TimerStruct_t
*
)
TIMER0_VA_BASE
;
write_seqlock
(
&
xtime_lock
);
// ...clear the interrupt
timer0
->
TimerClear
=
1
;
writel
(
1
,
TIMER0_VA_BASE
+
TIMER_INTCLR
)
;
timer_tick
(
regs
);
...
...
@@ -884,31 +870,32 @@ static struct irqaction versatile_timer_irq = {
*/
static
void
__init
versatile_timer_init
(
void
)
{
volatile
TimerStruct_t
*
timer0
=
(
volatile
TimerStruct_t
*
)
TIMER0_VA_BASE
;
volatile
TimerStruct_t
*
timer1
=
(
volatile
TimerStruct_t
*
)
TIMER1_VA_BASE
;
volatile
TimerStruct_t
*
timer2
=
(
volatile
TimerStruct_t
*
)
TIMER2_VA_BASE
;
volatile
TimerStruct_t
*
timer3
=
(
volatile
TimerStruct_t
*
)
TIMER3_VA_BASE
;
u32
val
;
/*
* set clock frequency:
* VERSATILE_REFCLK is 32KHz
* VERSATILE_TIMCLK is 1MHz
*/
*
(
volatile
unsigned
int
*
)
IO_ADDRESS
(
VERSATILE_SCTL_BASE
)
|=
((
VERSATILE_TIMCLK
<<
VERSATILE_TIMER1_EnSel
)
|
(
VERSATILE_TIMCLK
<<
VERSATILE_TIMER2_EnSel
)
|
(
VERSATILE_TIMCLK
<<
VERSATILE_TIMER3_EnSel
)
|
(
VERSATILE_TIMCLK
<<
VERSATILE_TIMER4_EnSel
));
val
=
readl
(
IO_ADDRESS
(
VERSATILE_SCTL_BASE
));
writel
((
VERSATILE_TIMCLK
<<
VERSATILE_TIMER1_EnSel
)
|
(
VERSATILE_TIMCLK
<<
VERSATILE_TIMER2_EnSel
)
|
(
VERSATILE_TIMCLK
<<
VERSATILE_TIMER3_EnSel
)
|
(
VERSATILE_TIMCLK
<<
VERSATILE_TIMER4_EnSel
)
|
val
,
IO_ADDRESS
(
VERSATILE_SCTL_BASE
));
/*
* Initialise to a known state (all timers off)
*/
timer0
->
TimerControl
=
0
;
timer1
->
TimerControl
=
0
;
timer2
->
TimerControl
=
0
;
timer3
->
TimerControl
=
0
;
timer0
->
TimerLoad
=
TIMER_RELOAD
;
timer0
->
TimerValue
=
TIMER_RELOAD
;
timer0
->
TimerControl
=
TIMER_CTRL
|
0x40
|
TIMER_CTRL_IE
;
/* periodic + IE */
writel
(
0
,
TIMER0_VA_BASE
+
TIMER_CTRL
);
writel
(
0
,
TIMER1_VA_BASE
+
TIMER_CTRL
);
writel
(
0
,
TIMER2_VA_BASE
+
TIMER_CTRL
);
writel
(
0
,
TIMER3_VA_BASE
+
TIMER_CTRL
);
writel
(
TIMER_RELOAD
,
TIMER0_VA_BASE
+
TIMER_LOAD
);
writel
(
TIMER_RELOAD
,
TIMER0_VA_BASE
+
TIMER_VALUE
);
writel
(
TIMER_DIVISOR
|
TIMER_CTRL_ENABLE
|
TIMER_CTRL_PERIODIC
|
TIMER_CTRL_IE
,
TIMER0_VA_BASE
+
TIMER_CTRL
);
/*
* Make irqs happen for the system timer
...
...
This diff is collapsed.
Click to expand it.
arch/arm/mm/init.c
View file @
92dd7ca0
...
...
@@ -437,7 +437,7 @@ void __init paging_init(struct meminfo *mi, struct machine_desc *mdesc)
memtable_init
(
mi
);
if
(
mdesc
->
map_io
)
mdesc
->
map_io
();
flush_tlb_all
();
local_
flush_tlb_all
();
/*
* initialise the zones within each node
...
...
This diff is collapsed.
Click to expand it.
arch/arm/mm/mm-armv.c
View file @
92dd7ca0
...
...
@@ -682,7 +682,7 @@ void __init memtable_init(struct meminfo *mi)
}
flush_cache_all
();
flush_tlb_all
();
local_
flush_tlb_all
();
top_pmd
=
pmd_off_k
(
0xffff0000
);
}
...
...
This diff is collapsed.
Click to expand it.
arch/arm/vfp/vfp.h
View file @
92dd7ca0
...
...
@@ -117,7 +117,13 @@ static inline u64 vfp_estimate_div128to64(u64 nh, u64 nl, u64 m)
if
(
nh
>=
m
)
return
~
0ULL
;
mh
=
m
>>
32
;
z
=
(
mh
<<
32
<=
nh
)
?
0xffffffff00000000ULL
:
(
nh
/
mh
)
<<
32
;
if
(
mh
<<
32
<=
nh
)
{
z
=
0xffffffff00000000ULL
;
}
else
{
z
=
nh
;
do_div
(
z
,
mh
);
z
<<=
32
;
}
mul64to128
(
&
termh
,
&
terml
,
m
,
z
);
sub128
(
&
remh
,
&
reml
,
nh
,
nl
,
termh
,
terml
);
ml
=
m
<<
32
;
...
...
@@ -126,7 +132,12 @@ static inline u64 vfp_estimate_div128to64(u64 nh, u64 nl, u64 m)
add128
(
&
remh
,
&
reml
,
remh
,
reml
,
mh
,
ml
);
}
remh
=
(
remh
<<
32
)
|
(
reml
>>
32
);
z
|=
(
mh
<<
32
<=
remh
)
?
0xffffffff
:
remh
/
mh
;
if
(
mh
<<
32
<=
remh
)
{
z
|=
0xffffffff
;
}
else
{
do_div
(
remh
,
mh
);
z
|=
remh
;
}
return
z
;
}
...
...
This diff is collapsed.
Click to expand it.
arch/arm/vfp/vfpdouble.c
View file @
92dd7ca0
...
...
@@ -32,6 +32,8 @@
*/
#include <linux/kernel.h>
#include <linux/bitops.h>
#include <asm/div64.h>
#include <asm/ptrace.h>
#include <asm/vfp.h>
...
...
This diff is collapsed.
Click to expand it.
Prev
1
2
Next
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