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
312cec5d
Commit
312cec5d
authored
Jun 20, 2009
by
Russell King
Committed by
Russell King
Jun 20, 2009
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'omap-clock-for-next' of
git://git.pwsan.com/linux-2.6
into devel
parents
48ec2b53
2687069f
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
163 additions
and
62 deletions
+163
-62
arch/arm/mach-omap2/clock.c
arch/arm/mach-omap2/clock.c
+1
-1
arch/arm/mach-omap2/clock34xx.c
arch/arm/mach-omap2/clock34xx.c
+31
-11
arch/arm/mach-omap2/io.c
arch/arm/mach-omap2/io.c
+36
-0
arch/arm/mach-omap2/powerdomain.c
arch/arm/mach-omap2/powerdomain.c
+1
-1
arch/arm/mach-omap2/sram34xx.S
arch/arm/mach-omap2/sram34xx.S
+85
-44
arch/arm/plat-omap/include/mach/sram.h
arch/arm/plat-omap/include/mach/sram.h
+4
-2
arch/arm/plat-omap/sram.c
arch/arm/plat-omap/sram.c
+5
-3
No files found.
arch/arm/mach-omap2/clock.c
View file @
312cec5d
...
...
@@ -302,7 +302,7 @@ int omap2_wait_clock_ready(void __iomem *reg, u32 mask, const char *name)
udelay
(
1
);
}
if
(
i
<
MAX_CLOCK_ENABLE_WAIT
)
if
(
i
<
=
MAX_CLOCK_ENABLE_WAIT
)
pr_debug
(
"Clock %s stable after %d loops
\n
"
,
name
,
i
);
else
printk
(
KERN_ERR
"Clock %s didn't enable in %d tries
\n
"
,
...
...
arch/arm/mach-omap2/clock34xx.c
View file @
312cec5d
...
...
@@ -286,6 +286,20 @@ static struct omap_clk omap34xx_clks[] = {
#define MIN_SDRC_DLL_LOCK_FREQ 83000000
#define CYCLES_PER_MHZ 1000000
/* Scale factor for fixed-point arith in omap3_core_dpll_m2_set_rate() */
#define SDRC_MPURATE_SCALE 8
/* 2^SDRC_MPURATE_BASE_SHIFT: MPU MHz that SDRC_MPURATE_LOOPS is defined for */
#define SDRC_MPURATE_BASE_SHIFT 9
/*
* SDRC_MPURATE_LOOPS: Number of MPU loops to execute at
* 2^MPURATE_BASE_SHIFT MHz for SDRC to stabilize
*/
#define SDRC_MPURATE_LOOPS 96
/**
* omap3_dpll_recalc - recalculate DPLL rate
* @clk: DPLL struct clk
...
...
@@ -709,7 +723,8 @@ static int omap3_core_dpll_m2_set_rate(struct clk *clk, unsigned long rate)
{
u32
new_div
=
0
;
u32
unlock_dll
=
0
;
unsigned
long
validrate
,
sdrcrate
;
u32
c
;
unsigned
long
validrate
,
sdrcrate
,
mpurate
;
struct
omap_sdrc_params
*
sp
;
if
(
!
clk
||
!
rate
)
...
...
@@ -718,18 +733,15 @@ static int omap3_core_dpll_m2_set_rate(struct clk *clk, unsigned long rate)
if
(
clk
!=
&
dpll3_m2_ck
)
return
-
EINVAL
;
if
(
rate
==
clk
->
rate
)
return
0
;
validrate
=
omap2_clksel_round_rate_div
(
clk
,
rate
,
&
new_div
);
if
(
validrate
!=
rate
)
return
-
EINVAL
;
sdrcrate
=
sdrc_ick
.
rate
;
if
(
rate
>
clk
->
rate
)
sdrcrate
<<=
((
rate
/
clk
->
rate
)
-
1
);
sdrcrate
<<=
((
rate
/
clk
->
rate
)
>>
1
);
else
sdrcrate
>>=
((
clk
->
rate
/
rate
)
-
1
);
sdrcrate
>>=
((
clk
->
rate
/
rate
)
>>
1
);
sp
=
omap2_sdrc_get_params
(
sdrcrate
);
if
(
!
sp
)
...
...
@@ -740,17 +752,25 @@ static int omap3_core_dpll_m2_set_rate(struct clk *clk, unsigned long rate)
unlock_dll
=
1
;
}
/*
* XXX This only needs to be done when the CPU frequency changes
*/
mpurate
=
arm_fck
.
rate
/
CYCLES_PER_MHZ
;
c
=
(
mpurate
<<
SDRC_MPURATE_SCALE
)
>>
SDRC_MPURATE_BASE_SHIFT
;
c
+=
1
;
/* for safety */
c
*=
SDRC_MPURATE_LOOPS
;
c
>>=
SDRC_MPURATE_SCALE
;
if
(
c
==
0
)
c
=
1
;
pr_debug
(
"clock: changing CORE DPLL rate from %lu to %lu
\n
"
,
clk
->
rate
,
validrate
);
pr_debug
(
"clock: SDRC timing params used: %08x %08x %08x
\n
"
,
sp
->
rfr_ctrl
,
sp
->
actim_ctrla
,
sp
->
actim_ctrlb
);
/* REVISIT: SRAM code doesn't support other M2 divisors yet */
WARN_ON
(
new_div
!=
1
&&
new_div
!=
2
);
/* REVISIT: Add SDRC_MR changing to this code also */
omap3_configure_core_dpll
(
sp
->
rfr_ctrl
,
sp
->
actim_ctrla
,
sp
->
actim_ctrlb
,
new_div
,
unlock_dll
);
sp
->
actim_ctrlb
,
new_div
,
unlock_dll
,
c
,
sp
->
mr
,
rate
>
clk
->
rate
);
return
0
;
}
...
...
arch/arm/mach-omap2/io.c
View file @
312cec5d
...
...
@@ -21,6 +21,7 @@
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/io.h>
#include <linux/clk.h>
#include <asm/tlb.h>
...
...
@@ -241,6 +242,40 @@ void __init omap2_map_common_io(void)
omapfb_reserve_sdram
();
}
/*
* omap2_init_reprogram_sdrc - reprogram SDRC timing parameters
*
* Sets the CORE DPLL3 M2 divider to the same value that it's at
* currently. This has the effect of setting the SDRC SDRAM AC timing
* registers to the values currently defined by the kernel. Currently
* only defined for OMAP3; will return 0 if called on OMAP2. Returns
* -EINVAL if the dpll3_m2_ck cannot be found, 0 if called on OMAP2,
* or passes along the return value of clk_set_rate().
*/
static
int
__init
_omap2_init_reprogram_sdrc
(
void
)
{
struct
clk
*
dpll3_m2_ck
;
int
v
=
-
EINVAL
;
long
rate
;
if
(
!
cpu_is_omap34xx
())
return
0
;
dpll3_m2_ck
=
clk_get
(
NULL
,
"dpll3_m2_ck"
);
if
(
!
dpll3_m2_ck
)
return
-
EINVAL
;
rate
=
clk_get_rate
(
dpll3_m2_ck
);
pr_info
(
"Reprogramming SDRC clock to %ld Hz
\n
"
,
rate
);
v
=
clk_set_rate
(
dpll3_m2_ck
,
rate
);
if
(
v
)
pr_err
(
"dpll3_m2_clk rate change failed: %d
\n
"
,
v
);
clk_put
(
dpll3_m2_ck
);
return
v
;
}
void
__init
omap2_init_common_hw
(
struct
omap_sdrc_params
*
sp
)
{
omap2_mux_init
();
...
...
@@ -249,6 +284,7 @@ void __init omap2_init_common_hw(struct omap_sdrc_params *sp)
clkdm_init
(
clockdomains_omap
,
clkdm_pwrdm_autodeps
);
omap2_clk_init
();
omap2_sdrc_init
(
sp
);
_omap2_init_reprogram_sdrc
();
#endif
gpmc_init
();
}
arch/arm/mach-omap2/powerdomain.c
View file @
312cec5d
...
...
@@ -1099,7 +1099,7 @@ int pwrdm_wait_transition(struct powerdomain *pwrdm)
(
c
++
<
PWRDM_TRANSITION_BAILOUT
))
udelay
(
1
);
if
(
c
>
=
PWRDM_TRANSITION_BAILOUT
)
{
if
(
c
>
PWRDM_TRANSITION_BAILOUT
)
{
printk
(
KERN_ERR
"powerdomain: waited too long for "
"powerdomain %s to complete transition
\n
"
,
pwrdm
->
name
);
return
-
EAGAIN
;
...
...
arch/arm/mach-omap2/sram34xx.S
View file @
312cec5d
...
...
@@ -3,13 +3,12 @@
*
*
Omap3
specific
functions
that
need
to
be
run
in
internal
SRAM
*
*
(
C
)
Copyright
2007
*
Texas
Instruments
Inc
.
*
Rajendra
Nayak
<
rnayak
@
ti
.
com
>
*
Copyright
(
C
)
2004
,
2007
,
2008
Texas
Instruments
,
Inc
.
*
Copyright
(
C
)
2008
Nokia
Corporation
*
*
(
C
)
Copyright
2004
*
Texas
Instruments
,
<
www
.
ti
.
com
>
*
Rajendra
Nayak
<
rnayak
@
ti
.
com
>
*
Richard
Woodruff
<
r
-
woodruff2
@
ti
.
com
>
*
Paul
Walmsley
*
*
This
program
is
free
software
; you can redistribute it and/or
*
modify
it
under
the
terms
of
the
GNU
General
Public
License
as
...
...
@@ -37,61 +36,112 @@
.
text
/*
r4
parameters
*/
#define SDRC_NO_UNLOCK_DLL 0x0
#define SDRC_UNLOCK_DLL 0x1
/*
SDRC_DLLA_CTRL
bit
settings
*/
#define FIXEDDELAY_SHIFT 24
#define FIXEDDELAY_MASK (0xff << FIXEDDELAY_SHIFT)
#define DLLIDLE_MASK 0x4
/*
*
SDRC_DLLA_CTRL
default
values
:
TI
hardware
team
indicates
that
*
FIXEDDELAY
should
be
initialized
to
0xf
.
This
apparently
was
*
empirically
determined
during
process
testing
,
so
no
derivation
*
was
provided
.
*/
#define FIXEDDELAY_DEFAULT (0x0f << FIXEDDELAY_SHIFT)
/*
SDRC_DLLA_STATUS
bit
settings
*/
#define LOCKSTATUS_MASK 0x4
/*
SDRC_POWER
bit
settings
*/
#define SRFRONIDLEREQ_MASK 0x40
#define PWDENA_MASK 0x4
/*
CM_IDLEST1_CORE
bit
settings
*/
#define ST_SDRC_MASK 0x2
/*
CM_ICLKEN1_CORE
bit
settings
*/
#define EN_SDRC_MASK 0x2
/*
CM_CLKSEL1_PLL
bit
settings
*/
#define CORE_DPLL_CLKOUT_DIV_SHIFT 0x1b
/*
*
Change
frequency
of
core
dpll
*
r0
=
sdrc_rfr_ctrl
r1
=
sdrc_actim_ctrla
r2
=
sdrc_actim_ctrlb
r3
=
M2
*
r4
=
Unlock
SDRC
DLL
?
(
1
=
yes
,
0
=
no
)
--
only
unlock
DLL
for
*
omap3_sram_configure_core_dpll
-
change
DPLL3
M2
divider
*
r0
=
new
SDRC_RFR_CTRL
register
contents
*
r1
=
new
SDRC_ACTIM_CTRLA
register
contents
*
r2
=
new
SDRC_ACTIM_CTRLB
register
contents
*
r3
=
new
M2
divider
setting
(
only
1
and
2
supported
right
now
)
*
r4
=
unlock
SDRC
DLL
?
(
1
=
yes
,
0
=
no
)
.
Only
unlock
DLL
for
*
SDRC
rates
<
83
MHz
*
r5
=
number
of
MPU
cycles
to
wait
for
SDRC
to
stabilize
after
*
reprogramming
the
SDRC
when
switching
to
a
slower
MPU
speed
*
r6
=
new
SDRC_MR_0
register
value
*
r7
=
increasing
SDRC
rate
?
(
1
=
yes
,
0
=
no
)
*
*/
ENTRY
(
omap3_sram_configure_core_dpll
)
stmfd
sp
!,
{
r1
-
r12
,
lr
}
@
store
regs
to
stack
ldr
r4
,
[
sp
,
#
52
]
@
pull
extra
args
off
the
stack
ldr
r5
,
[
sp
,
#
56
]
@
load
extra
args
from
the
stack
ldr
r6
,
[
sp
,
#
60
]
@
load
extra
args
from
the
stack
ldr
r7
,
[
sp
,
#
64
]
@
load
extra
args
from
the
stack
dsb
@
flush
buffered
writes
to
interconnect
cmp
r
3
,
#
0x2
bl
ne
configure_sdrc
cmp
r4
,
#
0x1
cmp
r
7
,
#
1
@
if
increasing
SDRC
clk
rate
,
bl
eq
configure_sdrc
@
program
the
SDRC
regs
early
(
for
RFR
)
cmp
r4
,
#
SDRC_UNLOCK_DLL
@
set
the
intended
DLL
state
bleq
unlock_dll
blne
lock_dll
bl
sdram_in_selfrefresh
@
put
the
SDRAM
in
self
refresh
bl
configure_core_dpll
bl
enable_sdrc
cmp
r4
,
#
0x1
bl
sdram_in_selfrefresh
@
put
SDRAM
in
self
refresh
,
idle
SDRC
bl
configure_core_dpll
@
change
the
DPLL3
M2
divider
bl
enable_sdrc
@
take
SDRC
out
of
idle
cmp
r4
,
#
SDRC_UNLOCK_DLL
@
wait
for
DLL
status
to
change
bleq
wait_dll_unlock
blne
wait_dll_lock
cmp
r3
,
#
0x1
blne
configure_sdrc
cmp
r7
,
#
1
@
if
increasing
SDRC
clk
rate
,
beq
return_to_sdram
@
return
to
SDRAM
code
,
otherwise
,
bl
configure_sdrc
@
reprogram
SDRC
regs
now
mov
r12
,
r5
bl
wait_clk_stable
@
wait
for
SDRC
to
stabilize
return_to_sdram
:
isb
@
prevent
speculative
exec
past
here
mov
r0
,
#
0
@
return
value
ldmfd
sp
!,
{
r1
-
r12
,
pc
}
@
restore
regs
and
return
unlock_dll
:
ldr
r11
,
omap3_sdrc_dlla_ctrl
ldr
r12
,
[
r11
]
orr
r12
,
r12
,
#
0x4
and
r12
,
r12
,
#
FIXEDDELAY_MASK
orr
r12
,
r12
,
#
FIXEDDELAY_DEFAULT
orr
r12
,
r12
,
#
DLLIDLE_MASK
str
r12
,
[
r11
]
@
(
no
OCP
barrier
needed
)
bx
lr
lock_dll
:
ldr
r11
,
omap3_sdrc_dlla_ctrl
ldr
r12
,
[
r11
]
bic
r12
,
r12
,
#
0x4
bic
r12
,
r12
,
#
DLLIDLE_MASK
str
r12
,
[
r11
]
@
(
no
OCP
barrier
needed
)
bx
lr
sdram_in_selfrefresh
:
ldr
r11
,
omap3_sdrc_power
@
read
the
SDRC_POWER
register
ldr
r12
,
[
r11
]
@
read
the
contents
of
SDRC_POWER
mov
r9
,
r12
@
keep
a
copy
of
SDRC_POWER
bits
orr
r12
,
r12
,
#
0x40
@
enable
self
refresh
on
idle
req
bic
r12
,
r12
,
#
0x4
@
clear
PWDENA
orr
r12
,
r12
,
#
SRFRONIDLEREQ_MASK
@
enable
self
refresh
on
idle
bic
r12
,
r12
,
#
PWDENA_MASK
@
clear
PWDENA
str
r12
,
[
r11
]
@
write
back
to
SDRC_POWER
register
ldr
r12
,
[
r11
]
@
posted
-
write
barrier
for
SDRC
idle_sdrc
:
ldr
r11
,
omap3_cm_iclken1_core
@
read
the
CM_ICLKEN1_CORE
reg
ldr
r12
,
[
r11
]
bic
r12
,
r12
,
#
0x2
@
disable
iclk
bit
for
SDRC
bic
r12
,
r12
,
#
EN_SDRC_MASK
@
disable
iclk
bit
for
SDRC
str
r12
,
[
r11
]
wait_sdrc_idle
:
ldr
r11
,
omap3_cm_idlest1_core
ldr
r12
,
[
r11
]
and
r12
,
r12
,
#
0x2
@
check
for
SDRC
idle
cmp
r12
,
#
2
and
r12
,
r12
,
#
ST_SDRC_MASK
@
check
for
SDRC
idle
cmp
r12
,
#
ST_SDRC_MASK
bne
wait_sdrc_idle
bx
lr
configure_core_dpll
:
...
...
@@ -99,36 +149,23 @@ configure_core_dpll:
ldr
r12
,
[
r11
]
ldr
r10
,
core_m2_mask_val
@
modify
m2
for
core
dpll
and
r12
,
r12
,
r10
orr
r12
,
r12
,
r3
,
lsl
#
0x1B
@
r3
contains
the
M2
val
orr
r12
,
r12
,
r3
,
lsl
#
CORE_DPLL_CLKOUT_DIV_SHIFT
str
r12
,
[
r11
]
ldr
r12
,
[
r11
]
@
posted
-
write
barrier
for
CM
mov
r12
,
#
0x800
@
wait
for
the
clock
to
stabilise
cmp
r3
,
#
2
bne
wait_clk_stable
bx
lr
wait_clk_stable
:
subs
r12
,
r12
,
#
1
bne
wait_clk_stable
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
bx
lr
enable_sdrc
:
ldr
r11
,
omap3_cm_iclken1_core
ldr
r12
,
[
r11
]
orr
r12
,
r12
,
#
0x2
@
enable
iclk
bit
for
SDRC
orr
r12
,
r12
,
#
EN_SDRC_MASK
@
enable
iclk
bit
for
SDRC
str
r12
,
[
r11
]
wait_sdrc_idle1
:
ldr
r11
,
omap3_cm_idlest1_core
ldr
r12
,
[
r11
]
and
r12
,
r12
,
#
0x2
and
r12
,
r12
,
#
ST_SDRC_MASK
cmp
r12
,
#
0
bne
wait_sdrc_idle1
restore_sdrc_power_val
:
...
...
@@ -138,14 +175,14 @@ restore_sdrc_power_val:
wait_dll_lock
:
ldr
r11
,
omap3_sdrc_dlla_status
ldr
r12
,
[
r11
]
and
r12
,
r12
,
#
0x4
cmp
r12
,
#
0x4
and
r12
,
r12
,
#
LOCKSTATUS_MASK
cmp
r12
,
#
LOCKSTATUS_MASK
bne
wait_dll_lock
bx
lr
wait_dll_unlock
:
ldr
r11
,
omap3_sdrc_dlla_status
ldr
r12
,
[
r11
]
and
r12
,
r12
,
#
0x4
and
r12
,
r12
,
#
LOCKSTATUS_MASK
cmp
r12
,
#
0x0
bne
wait_dll_unlock
bx
lr
...
...
@@ -156,7 +193,9 @@ configure_sdrc:
str
r1
,
[
r11
]
ldr
r11
,
omap3_sdrc_actim_ctrlb
str
r2
,
[
r11
]
ldr
r2
,
[
r11
]
@
posted
-
write
barrier
for
SDRC
ldr
r11
,
omap3_sdrc_mr_0
str
r6
,
[
r11
]
ldr
r6
,
[
r11
]
@
posted
-
write
barrier
for
SDRC
bx
lr
omap3_sdrc_power
:
...
...
@@ -173,6 +212,8 @@ omap3_sdrc_actim_ctrla:
.
word
OMAP34XX_SDRC_REGADDR
(
SDRC_ACTIM_CTRL_A_0
)
omap3_sdrc_actim_ctrlb
:
.
word
OMAP34XX_SDRC_REGADDR
(
SDRC_ACTIM_CTRL_B_0
)
omap3_sdrc_mr_0
:
.
word
OMAP34XX_SDRC_REGADDR
(
SDRC_MR_0
)
omap3_sdrc_dlla_status
:
.
word
OMAP34XX_SDRC_REGADDR
(
SDRC_DLLA_STATUS
)
omap3_sdrc_dlla_ctrl
:
...
...
arch/arm/plat-omap/include/mach/sram.h
View file @
312cec5d
...
...
@@ -24,7 +24,8 @@ extern u32 omap2_set_prcm(u32 dpll_ctrl_val, u32 sdrc_rfr_val, int bypass);
extern
u32
omap3_configure_core_dpll
(
u32
sdrc_rfr_ctrl
,
u32
sdrc_actim_ctrla
,
u32
sdrc_actim_ctrlb
,
u32
m2
,
u32
unlock_dll
);
u32
unlock_dll
,
u32
f
,
u32
sdrc_mr
,
u32
inc
);
/* Do not use these */
extern
void
omap1_sram_reprogram_clock
(
u32
ckctl
,
u32
dpllctl
);
...
...
@@ -62,7 +63,8 @@ extern unsigned long omap243x_sram_reprogram_sdrc_sz;
extern
u32
omap3_sram_configure_core_dpll
(
u32
sdrc_rfr_ctrl
,
u32
sdrc_actim_ctrla
,
u32
sdrc_actim_ctrlb
,
u32
m2
,
u32
unlock_dll
);
u32
unlock_dll
,
u32
f
,
u32
sdrc_mr
,
u32
inc
);
extern
unsigned
long
omap3_sram_configure_core_dpll_sz
;
#endif
arch/arm/plat-omap/sram.c
View file @
312cec5d
...
...
@@ -371,15 +371,17 @@ static inline int omap243x_sram_init(void)
static
u32
(
*
_omap3_sram_configure_core_dpll
)(
u32
sdrc_rfr_ctrl
,
u32
sdrc_actim_ctrla
,
u32
sdrc_actim_ctrlb
,
u32
m2
,
u32
unlock_dll
);
u32
m2
,
u32
unlock_dll
,
u32
f
,
u32
sdrc_mr
,
u32
inc
);
u32
omap3_configure_core_dpll
(
u32
sdrc_rfr_ctrl
,
u32
sdrc_actim_ctrla
,
u32
sdrc_actim_ctrlb
,
u32
m2
,
u32
unlock_dll
)
u32
sdrc_actim_ctrlb
,
u32
m2
,
u32
unlock_dll
,
u32
f
,
u32
sdrc_mr
,
u32
inc
)
{
BUG_ON
(
!
_omap3_sram_configure_core_dpll
);
return
_omap3_sram_configure_core_dpll
(
sdrc_rfr_ctrl
,
sdrc_actim_ctrla
,
sdrc_actim_ctrlb
,
m2
,
unlock_dll
);
unlock_dll
,
f
,
sdrc_mr
,
inc
);
}
/* REVISIT: Should this be same as omap34xx_sram_init() after off-idle? */
...
...
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