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
1d90da95
Commit
1d90da95
authored
Feb 28, 2011
by
Tony Lindgren
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'hwmod_clockevent_2.6.39' of
git://git.pwsan.com/linux-2.6
into omap-for-linus
parents
d6b5d01b
38698bef
Changes
9
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
2045 additions
and
62 deletions
+2045
-62
arch/arm/mach-omap2/omap_hwmod.c
arch/arm/mach-omap2/omap_hwmod.c
+100
-54
arch/arm/mach-omap2/omap_hwmod_2420_data.c
arch/arm/mach-omap2/omap_hwmod_2420_data.c
+635
-1
arch/arm/mach-omap2/omap_hwmod_2430_data.c
arch/arm/mach-omap2/omap_hwmod_2430_data.c
+634
-1
arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
+650
-1
arch/arm/mach-omap2/omap_hwmod_44xx_data.c
arch/arm/mach-omap2/omap_hwmod_44xx_data.c
+1
-1
arch/arm/mach-omap2/serial.c
arch/arm/mach-omap2/serial.c
+1
-1
arch/arm/mach-omap2/timer-gp.c
arch/arm/mach-omap2/timer-gp.c
+6
-1
arch/arm/plat-omap/include/plat/dmtimer.h
arch/arm/plat-omap/include/plat/dmtimer.h
+11
-0
arch/arm/plat-omap/include/plat/omap_hwmod.h
arch/arm/plat-omap/include/plat/omap_hwmod.h
+7
-2
No files found.
arch/arm/mach-omap2/omap_hwmod.c
View file @
1d90da95
/*
* omap_hwmod implementation for OMAP2/3/4
*
* Copyright (C) 2009-201
0
Nokia Corporation
* Copyright (C) 2009-201
1
Nokia Corporation
*
* Paul Walmsley, Benoît Cousson, Kevin Hilman
*
...
...
@@ -162,9 +162,6 @@ static LIST_HEAD(omap_hwmod_list);
/* mpu_oh: used to add/remove MPU initiator from sleepdep list */
static
struct
omap_hwmod
*
mpu_oh
;
/* inited: 0 if omap_hwmod_init() has not yet been called; 1 otherwise */
static
u8
inited
;
/* Private functions */
...
...
@@ -904,18 +901,16 @@ static struct omap_hwmod *_lookup(const char *name)
* @oh: struct omap_hwmod *
* @data: not used; pass NULL
*
* Called by omap_hwmod_late_init() (after omap2_clk_init()).
* Resolves all clock names embedded in the hwmod. Returns -EINVAL if
* the omap_hwmod has not yet been registered or if the clocks have
* already been initialized, 0 on success, or a non-zero error on
* failure.
* Called by omap_hwmod_setup_*() (after omap2_clk_init()).
* Resolves all clock names embedded in the hwmod. Returns 0 on
* success, or a negative error code on failure.
*/
static
int
_init_clocks
(
struct
omap_hwmod
*
oh
,
void
*
data
)
{
int
ret
=
0
;
if
(
!
oh
||
(
oh
->
_state
!=
_HWMOD_STATE_REGISTERED
)
)
return
-
EINVAL
;
if
(
oh
->
_state
!=
_HWMOD_STATE_REGISTERED
)
return
0
;
pr_debug
(
"omap_hwmod: %s: looking up clocks
\n
"
,
oh
->
name
);
...
...
@@ -1354,14 +1349,16 @@ static int _shutdown(struct omap_hwmod *oh)
* @oh: struct omap_hwmod *
*
* Writes the CLOCKACTIVITY bits @clockact to the hwmod @oh
* OCP_SYSCONFIG register. Returns -EINVAL if the hwmod is in the
* wrong state or returns 0.
* OCP_SYSCONFIG register. Returns 0.
*/
static
int
_setup
(
struct
omap_hwmod
*
oh
,
void
*
data
)
{
int
i
,
r
;
u8
postsetup_state
;
if
(
oh
->
_state
!=
_HWMOD_STATE_CLKS_INITED
)
return
0
;
/* Set iclk autoidle mode */
if
(
oh
->
slaves_cnt
>
0
)
{
for
(
i
=
0
;
i
<
oh
->
slaves_cnt
;
i
++
)
{
...
...
@@ -1455,7 +1452,7 @@ static int _setup(struct omap_hwmod *oh, void *data)
*/
static
int
__init
_register
(
struct
omap_hwmod
*
oh
)
{
int
ret
,
ms_id
;
int
ms_id
;
if
(
!
oh
||
!
oh
->
name
||
!
oh
->
class
||
!
oh
->
class
->
name
||
(
oh
->
_state
!=
_HWMOD_STATE_UNKNOWN
))
...
...
@@ -1478,9 +1475,14 @@ static int __init _register(struct omap_hwmod *oh)
oh
->
_state
=
_HWMOD_STATE_REGISTERED
;
ret
=
0
;
/*
* XXX Rather than doing a strcmp(), this should test a flag
* set in the hwmod data, inserted by the autogenerator code.
*/
if
(
!
strcmp
(
oh
->
name
,
MPU_INITIATOR_NAME
))
mpu_oh
=
oh
;
return
ret
;
return
0
;
}
...
...
@@ -1583,38 +1585,30 @@ int omap_hwmod_for_each(int (*fn)(struct omap_hwmod *oh, void *data),
return
ret
;
}
/**
* omap_hwmod_
init - init omap_hwmod code and register
hwmods
* omap_hwmod_
register - register an array of
hwmods
* @ohs: pointer to an array of omap_hwmods to register
*
* Intended to be called early in boot before the clock framework is
* initialized. If @ohs is not null, will register all omap_hwmods
* listed in @ohs that are valid for this chip. Returns -EINVAL if
* omap_hwmod_init() has already been called or 0 otherwise.
* listed in @ohs that are valid for this chip. Returns 0.
*/
int
__init
omap_hwmod_
init
(
struct
omap_hwmod
**
ohs
)
int
__init
omap_hwmod_
register
(
struct
omap_hwmod
**
ohs
)
{
struct
omap_hwmod
*
oh
;
int
r
;
if
(
inited
)
return
-
EINVAL
;
inited
=
1
;
int
r
,
i
;
if
(
!
ohs
)
return
0
;
oh
=
*
ohs
;
while
(
oh
)
{
if
(
omap_chip_is
(
oh
->
omap_chip
))
{
r
=
_register
(
oh
)
;
WARN
(
r
,
"omap_hwmod: %s: _register returned "
"%d
\n
"
,
oh
->
name
,
r
);
}
oh
=
*++
ohs
;
}
i
=
0
;
do
{
if
(
!
omap_chip_is
(
ohs
[
i
]
->
omap_chip
))
continue
;
r
=
_register
(
ohs
[
i
]
);
WARN
(
r
,
"omap_hwmod: %s: _register returned %d
\n
"
,
ohs
[
i
]
->
name
,
r
)
;
}
while
(
ohs
[
++
i
]);
return
0
;
}
...
...
@@ -1622,12 +1616,14 @@ int __init omap_hwmod_init(struct omap_hwmod **ohs)
/*
* _populate_mpu_rt_base - populate the virtual address for a hwmod
*
* Must be called only from omap_hwmod_
late_init
so ioremap works properly.
* Must be called only from omap_hwmod_
setup_*()
so ioremap works properly.
* Assumes the caller takes care of locking if needed.
*
*/
static
int
__init
_populate_mpu_rt_base
(
struct
omap_hwmod
*
oh
,
void
*
data
)
{
if
(
oh
->
_state
!=
_HWMOD_STATE_REGISTERED
)
return
0
;
if
(
oh
->
_int_flags
&
_HWMOD_NO_MPU_PORT
)
return
0
;
...
...
@@ -1640,31 +1636,81 @@ static int __init _populate_mpu_rt_base(struct omap_hwmod *oh, void *data)
}
/**
* omap_hwmod_late_init - do some post-clock framework initialization
* omap_hwmod_setup_one - set up a single hwmod
* @oh_name: const char * name of the already-registered hwmod to set up
*
* Must be called after omap2_clk_init(). Resolves the struct clk
* names to struct clk pointers for each registered omap_hwmod. Also
* calls _setup() on each hwmod. Returns -EINVAL upon error or 0 upon
* success.
*/
int
__init
omap_hwmod_setup_one
(
const
char
*
oh_name
)
{
struct
omap_hwmod
*
oh
;
int
r
;
pr_debug
(
"omap_hwmod: %s: %s
\n
"
,
oh_name
,
__func__
);
if
(
!
mpu_oh
)
{
pr_err
(
"omap_hwmod: %s: cannot setup_one: MPU initiator hwmod %s not yet registered
\n
"
,
oh_name
,
MPU_INITIATOR_NAME
);
return
-
EINVAL
;
}
oh
=
_lookup
(
oh_name
);
if
(
!
oh
)
{
WARN
(
1
,
"omap_hwmod: %s: hwmod not yet registered
\n
"
,
oh_name
);
return
-
EINVAL
;
}
if
(
mpu_oh
->
_state
==
_HWMOD_STATE_REGISTERED
&&
oh
!=
mpu_oh
)
omap_hwmod_setup_one
(
MPU_INITIATOR_NAME
);
r
=
_populate_mpu_rt_base
(
oh
,
NULL
);
if
(
IS_ERR_VALUE
(
r
))
{
WARN
(
1
,
"omap_hwmod: %s: couldn't set mpu_rt_base
\n
"
,
oh_name
);
return
-
EINVAL
;
}
r
=
_init_clocks
(
oh
,
NULL
);
if
(
IS_ERR_VALUE
(
r
))
{
WARN
(
1
,
"omap_hwmod: %s: couldn't init clocks
\n
"
,
oh_name
);
return
-
EINVAL
;
}
_setup
(
oh
,
NULL
);
return
0
;
}
/**
* omap_hwmod_setup - do some post-clock framework initialization
*
* Must be called after omap2_clk_init(). Resolves the struct clk names
* to struct clk pointers for each registered omap_hwmod. Also calls
* _setup() on each hwmod. Returns 0.
* _setup() on each hwmod. Returns 0
upon success
.
*/
static
int
__init
omap_hwmod_
late_init
(
void
)
static
int
__init
omap_hwmod_
setup_all
(
void
)
{
int
r
;
if
(
!
mpu_oh
)
{
pr_err
(
"omap_hwmod: %s: MPU initiator hwmod %s not yet registered
\n
"
,
__func__
,
MPU_INITIATOR_NAME
);
return
-
EINVAL
;
}
r
=
omap_hwmod_for_each
(
_populate_mpu_rt_base
,
NULL
);
/* XXX check return value */
r
=
omap_hwmod_for_each
(
_init_clocks
,
NULL
);
WARN
(
r
,
"omap_hwmod: omap_hwmod_late_init(): _init_clocks failed
\n
"
);
mpu_oh
=
omap_hwmod_lookup
(
MPU_INITIATOR_NAME
);
WARN
(
!
mpu_oh
,
"omap_hwmod: could not find MPU initiator hwmod %s
\n
"
,
MPU_INITIATOR_NAME
);
WARN
(
IS_ERR_VALUE
(
r
),
"omap_hwmod: %s: _init_clocks failed
\n
"
,
__func__
);
omap_hwmod_for_each
(
_setup
,
NULL
);
return
0
;
}
core_initcall
(
omap_hwmod_
late_init
);
core_initcall
(
omap_hwmod_
setup_all
);
/**
* omap_hwmod_enable - enable an omap_hwmod
...
...
@@ -2183,11 +2229,11 @@ int omap_hwmod_for_each_by_class(const char *classname,
* @oh: struct omap_hwmod *
* @state: state that _setup() should leave the hwmod in
*
* Sets the hwmod state that @oh will enter at the end of _setup()
(called by
*
omap_hwmod_late_init()). Only valid to call between calls to
*
omap_hwmod_init() and omap_hwmod_late_init(). Returns 0 upon success or
*
-EINVAL if there is a problem with the arguments or if the hwmod i
s
* in the wrong state.
* Sets the hwmod state that @oh will enter at the end of _setup()
*
(called by omap_hwmod_setup_*()). Only valid to call between
*
calling omap_hwmod_register() and omap_hwmod_setup_*(). Returns
*
0 upon success or -EINVAL if there is a problem with the argument
s
*
or if the hwmod is
in the wrong state.
*/
int
omap_hwmod_set_postsetup_state
(
struct
omap_hwmod
*
oh
,
u8
state
)
{
...
...
arch/arm/mach-omap2/omap_hwmod_2420_data.c
View file @
1d90da95
This diff is collapsed.
Click to expand it.
arch/arm/mach-omap2/omap_hwmod_2430_data.c
View file @
1d90da95
This diff is collapsed.
Click to expand it.
arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
View file @
1d90da95
This diff is collapsed.
Click to expand it.
arch/arm/mach-omap2/omap_hwmod_44xx_data.c
View file @
1d90da95
...
...
@@ -5125,6 +5125,6 @@ static __initdata struct omap_hwmod *omap44xx_hwmods[] = {
int
__init
omap44xx_hwmod_init
(
void
)
{
return
omap_hwmod_
init
(
omap44xx_hwmods
);
return
omap_hwmod_
register
(
omap44xx_hwmods
);
}
arch/arm/mach-omap2/serial.c
View file @
1d90da95
...
...
@@ -680,7 +680,7 @@ static int __init omap_serial_early_init(void)
num_uarts
++
;
/*
* NOTE: omap_hwmod_
init
() has not yet been called,
* NOTE: omap_hwmod_
setup*
() has not yet been called,
* so no hwmod functions will work yet.
*/
...
...
arch/arm/mach-omap2/timer-gp.c
View file @
1d90da95
...
...
@@ -39,10 +39,11 @@
#include <asm/mach/time.h>
#include <plat/dmtimer.h>
#include <asm/localtimer.h>
#include <plat/common.h>
#include <plat/omap_hwmod.h>
#include "timer-gp.h"
#include <plat/common.h>
/* MAX_GPTIMER_ID: number of GPTIMERs on the chip */
#define MAX_GPTIMER_ID 12
...
...
@@ -132,9 +133,13 @@ static void __init omap2_gp_clockevent_init(void)
{
u32
tick_rate
;
int
src
;
char
clockevent_hwmod_name
[
8
];
/* 8 = sizeof("timerXX0") */
inited
=
1
;
sprintf
(
clockevent_hwmod_name
,
"timer%d"
,
gptimer_id
);
omap_hwmod_setup_one
(
clockevent_hwmod_name
);
gptimer
=
omap_dm_timer_request_specific
(
gptimer_id
);
BUG_ON
(
gptimer
==
NULL
);
gptimer_wakeup
=
gptimer
;
...
...
arch/arm/plat-omap/include/plat/dmtimer.h
View file @
1d90da95
...
...
@@ -3,6 +3,12 @@
*
* OMAP Dual-Mode Timers
*
* Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/
* Tarun Kanti DebBarma <tarun.kanti@ti.com>
* Thara Gopinath <thara@ti.com>
*
* Platform device conversion and hwmod support.
*
* Copyright (C) 2005 Nokia Corporation
* Author: Lauri Leukkunen <lauri.leukkunen@nokia.com>
* PWM and clock framwork support by Timo Teras.
...
...
@@ -44,6 +50,11 @@
#define OMAP_TIMER_TRIGGER_OVERFLOW 0x01
#define OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE 0x02
/*
* IP revision identifier so that Highlander IP
* in OMAP4 can be distinguished.
*/
#define OMAP_TIMER_IP_VERSION_1 0x1
struct
omap_dm_timer
;
extern
struct
omap_dm_timer
*
gptimer_wakeup
;
extern
struct
sys_timer
omap_timer
;
...
...
arch/arm/plat-omap/include/plat/omap_hwmod.h
View file @
1d90da95
/*
* omap_hwmod macros, structures
*
* Copyright (C) 2009-201
0
Nokia Corporation
* Copyright (C) 2009-201
1
Nokia Corporation
* Paul Walmsley
*
* Created in collaboration with (alphabetical order): Benoît Cousson,
...
...
@@ -30,6 +30,7 @@
#define __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_OMAP_HWMOD_H
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/list.h>
#include <linux/ioport.h>
#include <linux/spinlock.h>
...
...
@@ -370,8 +371,10 @@ struct omap_hwmod_omap4_prcm {
* of standby, rather than relying on module smart-standby
* HWMOD_INIT_NO_RESET: don't reset this module at boot - important for
* SDRAM controller, etc. XXX probably belongs outside the main hwmod file
* XXX Should be HWMOD_SETUP_NO_RESET
* HWMOD_INIT_NO_IDLE: don't idle this module at boot - important for SDRAM
* controller, etc. XXX probably belongs outside the main hwmod file
* XXX Should be HWMOD_SETUP_NO_IDLE
* HWMOD_NO_AUTOIDLE: disable module autoidle (OCP_SYSCONFIG.AUTOIDLE)
* when module is enabled, rather than the default, which is to
* enable autoidle
...
...
@@ -535,11 +538,13 @@ struct omap_hwmod {
const
struct
omap_chip_id
omap_chip
;
};
int
omap_hwmod_
init
(
struct
omap_hwmod
**
ohs
);
int
omap_hwmod_
register
(
struct
omap_hwmod
**
ohs
);
struct
omap_hwmod
*
omap_hwmod_lookup
(
const
char
*
name
);
int
omap_hwmod_for_each
(
int
(
*
fn
)(
struct
omap_hwmod
*
oh
,
void
*
data
),
void
*
data
);
int
__init
omap_hwmod_setup_one
(
const
char
*
name
);
int
omap_hwmod_enable
(
struct
omap_hwmod
*
oh
);
int
_omap_hwmod_enable
(
struct
omap_hwmod
*
oh
);
int
omap_hwmod_idle
(
struct
omap_hwmod
*
oh
);
...
...
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