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
d80f0ade
Commit
d80f0ade
authored
Dec 01, 2004
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://bk.arm.linux.org.uk/linux-2.6-rmk
into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents
17c63116
50a21ac9
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
92 additions
and
146 deletions
+92
-146
arch/arm/mach-omap/time.c
arch/arm/mach-omap/time.c
+92
-132
arch/arm/mach-pxa/generic.c
arch/arm/mach-pxa/generic.c
+0
-3
arch/arm/mach-sa1100/Kconfig
arch/arm/mach-sa1100/Kconfig
+0
-11
No files found.
arch/arm/mach-omap/time.c
View file @
d80f0ade
/*
* arch/arm/mach-omap/time.c
*
linux/
arch/arm/mach-omap/time.c
*
* OMAP Timer
Tick
* OMAP Timer
s
*
* Copyright (C) 2004 Nokia Corporation
* Partial timer rewrite and additional VST timer support by
* Tony Lindgen <tony@atomide.com> and
* Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com>
*
* MPU timer code based on the older MPU timer code for OMAP
* Copyright (C) 2000 RidgeRun, Inc.
* Author: Greg Lonnon <glonnon@ridgerun.com>
*
...
...
@@ -33,6 +39,7 @@
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/sched.h>
#include <linux/spinlock.h>
#include <asm/system.h>
#include <asm/hardware.h>
...
...
@@ -42,181 +49,134 @@
#include <asm/mach/irq.h>
#include <asm/mach/time.h>
#ifndef __instrument
#define __instrument
#define __noinstrument __attribute__ ((no_instrument_function))
#endif
typedef
struct
{
u32
cntl
;
/* CNTL_TIMER, R/W */
u32
load_tim
;
/* LOAD_TIM, W */
u32
read_tim
;
/* READ_TIM, R */
}
mputimer_regs_t
;
#define mputimer_base(n) \
((volatile mputimer_regs_t*)IO_ADDRESS(OMAP_MPUTIMER_BASE + \
(n)*OMAP_MPUTIMER_OFFSET))
static
inline
unsigned
long
timer32k_read
(
int
reg
)
{
unsigned
long
val
;
val
=
omap_readw
(
reg
+
OMAP_32kHz_TIMER_BASE
);
return
val
;
}
static
inline
void
timer32k_write
(
int
reg
,
int
val
)
{
omap_writew
(
val
,
reg
+
OMAP_32kHz_TIMER_BASE
);
}
struct
sys_timer
omap_timer
;
/*
* How long is the timer interval? 100 HZ, right...
* IRQ rate = (TVR + 1) / 32768 seconds
* TVR = 32768 * IRQ_RATE -1
* IRQ_RATE = 1/100
* TVR = 326
* ---------------------------------------------------------------------------
* MPU timer
* ---------------------------------------------------------------------------
*/
#define TIMER32k_PERIOD 326
//#define TIMER32k_PERIOD 0x7ff
#define OMAP_MPU_TIMER1_BASE (0xfffec500)
#define OMAP_MPU_TIMER2_BASE (0xfffec600)
#define OMAP_MPU_TIMER3_BASE (0xfffec700)
#define OMAP_MPU_TIMER_BASE OMAP_MPU_TIMER1_BASE
#define OMAP_MPU_TIMER_OFFSET 0x100
static
inline
void
start_timer32k
(
void
)
{
timer32k_write
(
TIMER32k_CR
,
TIMER32k_TSS
|
TIMER32k_TRB
|
TIMER32k_INT
|
TIMER32k_ARL
);
}
#define MPU_TIMER_FREE (1 << 6)
#define MPU_TIMER_CLOCK_ENABLE (1 << 5)
#define MPU_TIMER_AR (1 << 1)
#define MPU_TIMER_ST (1 << 0)
#ifdef CONFIG_MACH_OMAP_PERSEUS2
/*
*
After programming PTV with 0 and setting the MPUTIM_CLOCK_ENABLE
*
(external clock enable) bit, the timer count rate is 6.5 MHz (13
*
MHZ input/2). !! The divider by 2 is undocumented !!
*
MPU_TICKS_PER_SEC must be an even number, otherwise machinecycles_to_usecs
*
will break. On P2, the timer count rate is 6.5 MHz after programming PTV
*
with 0. This divides the 13MHz input by 2, and is undocumented.
*/
#define MPUTICKS_PER_SEC (13000000/2)
#else
/*
* After programming PTV with 0, the timer count rate is 6 MHz.
* WARNING! this must be an even number, or machinecycles_to_usecs
* below will break.
#ifdef CONFIG_MACH_OMAP_PERSEUS2
/* REVISIT: This ifdef construct should be replaced by a query to clock
* framework to see if timer base frequency is 12.0, 13.0 or 19.2 MHz.
*/
#define MPUTICKS_PER_SEC (12000000/2)
#define MPU_TICKS_PER_SEC (13000000 / 2)
#else
#define MPU_TICKS_PER_SEC (12000000 / 2)
#endif
static
int
mputimer_started
[
3
]
=
{
0
,
0
,
0
};
#define MPU_TIMER_TICK_PERIOD ((MPU_TICKS_PER_SEC / HZ) - 1)
static
inline
void
__noinstrument
start_mputimer
(
int
n
,
unsigned
long
load_val
)
{
volatile
mputimer_regs_t
*
timer
=
mputimer_base
(
n
);
mputimer_started
[
n
]
=
0
;
timer
->
cntl
=
MPUTIM_CLOCK_ENABLE
;
udelay
(
1
);
timer
->
load_tim
=
load_val
;
udelay
(
1
);
timer
->
cntl
=
(
MPUTIM_CLOCK_ENABLE
|
MPUTIM_AR
|
MPUTIM_ST
);
mputimer_started
[
n
]
=
1
;
}
typedef
struct
{
u32
cntl
;
/* CNTL_TIMER, R/W */
u32
load_tim
;
/* LOAD_TIM, W */
u32
read_tim
;
/* READ_TIM, R */
}
omap_mpu_timer_regs_t
;
static
inline
unsigned
long
__noinstrument
read_mputimer
(
int
n
)
{
volatile
mputimer_regs_t
*
timer
=
mputimer_base
(
n
);
return
(
mputimer_started
[
n
]
?
timer
->
read_tim
:
0
);
}
#define omap_mpu_timer_base(n) \
((volatile omap_mpu_timer_regs_t*)IO_ADDRESS(OMAP_MPU_TIMER_BASE + \
(n)*OMAP_MPU_TIMER_OFFSET))
void
__noinstrument
start_mputimer1
(
unsigned
long
load_val
)
{
start_mputimer
(
0
,
load_val
);
}
void
__noinstrument
start_mputimer2
(
unsigned
long
load_val
)
{
start_mputimer
(
1
,
load_val
);
}
void
__noinstrument
start_mputimer3
(
unsigned
long
load_val
)
static
inline
unsigned
long
omap_mpu_timer_read
(
int
nr
)
{
start_mputimer
(
2
,
load_val
);
volatile
omap_mpu_timer_regs_t
*
timer
=
omap_mpu_timer_base
(
nr
);
return
timer
->
read_tim
;
}
unsigned
long
__noinstrument
read_mputimer1
(
void
)
{
return
read_mputimer
(
0
);
}
unsigned
long
__noinstrument
read_mputimer2
(
void
)
static
inline
void
omap_mpu_timer_start
(
int
nr
,
unsigned
long
load_val
)
{
return
read_mputimer
(
1
);
}
unsigned
long
__noinstrument
read_mputimer3
(
void
)
{
return
read_mputimer
(
2
);
}
volatile
omap_mpu_timer_regs_t
*
timer
=
omap_mpu_timer_base
(
nr
);
unsigned
long
__noinstrument
do_getmachinecycles
(
void
)
{
return
0
-
read_mputimer
(
0
);
timer
->
cntl
=
MPU_TIMER_CLOCK_ENABLE
;
udelay
(
1
);
timer
->
load_tim
=
load_val
;
udelay
(
1
);
timer
->
cntl
=
(
MPU_TIMER_CLOCK_ENABLE
|
MPU_TIMER_AR
|
MPU_TIMER_ST
);
}
unsigned
long
__noinstrument
machinecycles_to_usecs
(
unsigned
long
mpu
ticks
)
unsigned
long
omap_mpu_timer_ticks_to_usecs
(
unsigned
long
nr_
ticks
)
{
/* Round up to nearest usec */
return
((
mputicks
*
1000
)
/
(
MPU
TICKS_PER_SEC
/
2
/
1000
)
+
1
)
>>
1
;
return
((
nr_ticks
*
1000
)
/
(
MPU_
TICKS_PER_SEC
/
2
/
1000
)
+
1
)
>>
1
;
}
/*
* This marks the time of the last system timer interrupt
* that was *processed by the ISR* (timer 2).
* Last processed system timer interrupt
*/
static
unsigned
long
systimer_mark
;
static
unsigned
long
omap_mpu_timer_last
=
0
;
static
unsigned
long
omap_gettimeoffset
(
void
)
/*
* Returns elapsed usecs since last system timer interrupt
*/
static
unsigned
long
omap_mpu_timer_gettimeoffset
(
void
)
{
/* Return elapsed usecs since last system timer ISR */
return
machinecycles_to_usecs
(
do_getmachinecycles
()
-
systimer_mark
);
unsigned
long
now
=
0
-
omap_mpu_timer_read
(
0
);
unsigned
long
elapsed
=
now
-
omap_mpu_timer_last
;
return
omap_mpu_timer_ticks_to_usecs
(
elapsed
);
}
static
irqreturn_t
omap_timer_interrupt
(
int
irq
,
void
*
dev_id
,
struct
pt_regs
*
regs
)
/*
* Elapsed time between interrupts is calculated using timer0.
* Latency during the interrupt is calculated using timer1.
* Both timer0 and timer1 are counting at 6MHz (P2 6.5MHz).
*/
static
irqreturn_t
omap_mpu_timer_interrupt
(
int
irq
,
void
*
dev_id
,
struct
pt_regs
*
regs
)
{
unsigned
long
now
,
i
latency
;
unsigned
long
now
,
latency
;
write_seqlock
(
&
xtime_lock
);
/*
* Mark the time at which the timer interrupt ocurred using
* timer1. We need to remove interrupt latency, which we can
* retrieve from the current system timer2 counter. Both the
* offset timer1 and the system timer2 are counting at 6MHz,
* so we're ok.
*/
now
=
0
-
read_mputimer1
();
ilatency
=
MPUTICKS_PER_SEC
/
100
-
read_mputimer2
();
systimer_mark
=
now
-
ilatency
;
now
=
0
-
omap_mpu_timer_read
(
0
);
latency
=
MPU_TICKS_PER_SEC
/
HZ
-
omap_mpu_timer_read
(
1
);
omap_mpu_timer_last
=
now
-
latency
;
timer_tick
(
regs
);
write_sequnlock
(
&
xtime_lock
);
return
IRQ_HANDLED
;
}
static
struct
irqaction
omap_timer_irq
=
{
.
name
=
"
OMAP Timer Tick
"
,
static
struct
irqaction
omap_
mpu_
timer_irq
=
{
.
name
=
"
mpu timer
"
,
.
flags
=
SA_INTERRUPT
,
.
handler
=
omap_timer_interrupt
.
handler
=
omap_
mpu_
timer_interrupt
};
static
void
__init
omap_timer_init
(
void
)
static
__init
void
omap_init_mpu_timer
(
void
)
{
/* Since we don't call request_irq, we must init the structure */
#ifdef OMAP1510_USE_32KHZ_TIMER
timer32k_write
(
TIMER32k_CR
,
0x0
);
timer32k_write
(
TIMER32k_TVR
,
TIMER32k_PERIOD
);
setup_irq
(
INT_OS_32kHz_TIMER
,
&
omap_timer_irq
);
start_timer32k
();
#else
setup_irq
(
INT_TIMER2
,
&
omap_timer_irq
);
start_mputimer2
(
MPUTICKS_PER_SEC
/
100
-
1
);
#endif
omap_timer
.
offset
=
omap_mpu_timer_gettimeoffset
;
setup_irq
(
INT_TIMER2
,
&
omap_mpu_timer_irq
);
omap_mpu_timer_start
(
0
,
0xffffffff
);
omap_mpu_timer_start
(
1
,
MPU_TIMER_TICK_PERIOD
);
}
/*
* ---------------------------------------------------------------------------
* Timer initialization
* ---------------------------------------------------------------------------
*/
void
__init
omap_timer_init
(
void
)
{
omap_init_mpu_timer
();
}
struct
sys_timer
omap_timer
=
{
.
init
=
omap_timer_init
,
.
offset
=
omap_gettimeoffset
,
.
offset
=
NULL
,
/* Initialized later */
};
arch/arm/mach-pxa/generic.c
View file @
d80f0ade
...
...
@@ -138,7 +138,6 @@ void __init pxa_set_mci_info(struct pxamci_platform_data *info)
{
pxamci_device
.
dev
.
platform_data
=
info
;
}
EXPORT_SYMBOL
(
pxa_set_mci_info
);
static
struct
pxa2xx_udc_mach_info
pxa_udc_info
;
...
...
@@ -147,7 +146,6 @@ void __init pxa_set_udc_info(struct pxa2xx_udc_mach_info *info)
{
memcpy
(
&
pxa_udc_info
,
info
,
sizeof
*
info
);
}
EXPORT_SYMBOL
(
pxa_set_udc_info
);
static
struct
resource
pxa2xx_udc_resources
[]
=
{
[
0
]
=
{
...
...
@@ -181,7 +179,6 @@ void __init set_pxa_fb_info(struct pxafb_mach_info *hard_pxa_fb_info)
{
memcpy
(
&
pxa_fb_info
,
hard_pxa_fb_info
,
sizeof
(
struct
pxafb_mach_info
));
}
EXPORT_SYMBOL
(
set_pxa_fb_info
);
static
struct
resource
pxafb_resources
[]
=
{
[
0
]
=
{
...
...
arch/arm/mach-sa1100/Kconfig
View file @
d80f0ade
...
...
@@ -143,17 +143,6 @@ config SA1100_SSP
other devices, eg for BadgePAD 4 sensor support, or Jornada
720 touchscreen support.
config SA1100_USB
tristate "SA1100 USB function support"
config SA1100_USB_NETLINK
tristate "Support for SA11x0 USB network link function"
depends on SA1100_USB
config SA1100_USB_CHAR
tristate "Support for SA11x0 USB character device emulation"
depends on SA1100_USB
config H3600_SLEEVE
tristate "Compaq iPAQ Handheld sleeve support"
depends on SA1100_H3600
...
...
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