OMAP: clockdomain: Infrastructure to put arch specific code
Put infrastructure in place, so arch specific func pointers can be hooked up to the platform-independent part of the framework. This is in preparation of splitting the clockdomain framework into platform-independent part (for all omaps) and platform-specific parts. Signed-off-by: Rajendra Nayak <rnayak@ti.com> Signed-off-by: Paul Walmsley <paul@pwsan.com>
This commit is contained in:
Родитель
3673d1ef5d
Коммит
32d4034eea
|
@ -44,6 +44,7 @@ static LIST_HEAD(clkdm_list);
|
|||
/* array of clockdomain deps to be added/removed when clkdm in hwsup mode */
|
||||
static struct clkdm_autodep *autodeps;
|
||||
|
||||
static struct clkdm_ops *arch_clkdm;
|
||||
|
||||
/* Private functions */
|
||||
|
||||
|
@ -292,6 +293,7 @@ static void _disable_hwsup(struct clockdomain *clkdm)
|
|||
* clkdm_init - set up the clockdomain layer
|
||||
* @clkdms: optional pointer to an array of clockdomains to register
|
||||
* @init_autodeps: optional pointer to an array of autodeps to register
|
||||
* @custom_funcs: func pointers for arch specfic implementations
|
||||
*
|
||||
* Set up internal state. If a pointer to an array of clockdomains
|
||||
* @clkdms was supplied, loop through the list of clockdomains,
|
||||
|
@ -300,12 +302,18 @@ static void _disable_hwsup(struct clockdomain *clkdm)
|
|||
* @init_autodeps was provided, register those. No return value.
|
||||
*/
|
||||
void clkdm_init(struct clockdomain **clkdms,
|
||||
struct clkdm_autodep *init_autodeps)
|
||||
struct clkdm_autodep *init_autodeps,
|
||||
struct clkdm_ops *custom_funcs)
|
||||
{
|
||||
struct clockdomain **c = NULL;
|
||||
struct clockdomain *clkdm;
|
||||
struct clkdm_autodep *autodep = NULL;
|
||||
|
||||
if (!custom_funcs)
|
||||
WARN(1, "No custom clkdm functions registered\n");
|
||||
else
|
||||
arch_clkdm = custom_funcs;
|
||||
|
||||
if (clkdms)
|
||||
for (c = clkdms; *c; c++)
|
||||
_clkdm_register(*c);
|
||||
|
|
|
@ -116,7 +116,42 @@ struct clockdomain {
|
|||
struct list_head node;
|
||||
};
|
||||
|
||||
void clkdm_init(struct clockdomain **clkdms, struct clkdm_autodep *autodeps);
|
||||
/**
|
||||
* struct clkdm_ops - Arch specfic function implementations
|
||||
* @clkdm_add_wkdep: Add a wakeup dependency between clk domains
|
||||
* @clkdm_del_wkdep: Delete a wakeup dependency between clk domains
|
||||
* @clkdm_read_wkdep: Read wakeup dependency state between clk domains
|
||||
* @clkdm_clear_all_wkdeps: Remove all wakeup dependencies from the clk domain
|
||||
* @clkdm_add_sleepdep: Add a sleep dependency between clk domains
|
||||
* @clkdm_del_sleepdep: Delete a sleep dependency between clk domains
|
||||
* @clkdm_read_sleepdep: Read sleep dependency state between clk domains
|
||||
* @clkdm_clear_all_sleepdeps: Remove all sleep dependencies from the clk domain
|
||||
* @clkdm_sleep: Force a clockdomain to sleep
|
||||
* @clkdm_wakeup: Force a clockdomain to wakeup
|
||||
* @clkdm_allow_idle: Enable hw supervised idle transitions for clock domain
|
||||
* @clkdm_deny_idle: Disable hw supervised idle transitions for clock domain
|
||||
* @clkdm_clk_enable: Put the clkdm in right state for a clock enable
|
||||
* @clkdm_clk_disable: Put the clkdm in right state for a clock disable
|
||||
*/
|
||||
struct clkdm_ops {
|
||||
int (*clkdm_add_wkdep)(struct clockdomain *clkdm1, struct clockdomain *clkdm2);
|
||||
int (*clkdm_del_wkdep)(struct clockdomain *clkdm1, struct clockdomain *clkdm2);
|
||||
int (*clkdm_read_wkdep)(struct clockdomain *clkdm1, struct clockdomain *clkdm2);
|
||||
int (*clkdm_clear_all_wkdeps)(struct clockdomain *clkdm);
|
||||
int (*clkdm_add_sleepdep)(struct clockdomain *clkdm1, struct clockdomain *clkdm2);
|
||||
int (*clkdm_del_sleepdep)(struct clockdomain *clkdm1, struct clockdomain *clkdm2);
|
||||
int (*clkdm_read_sleepdep)(struct clockdomain *clkdm1, struct clockdomain *clkdm2);
|
||||
int (*clkdm_clear_all_sleepdeps)(struct clockdomain *clkdm);
|
||||
int (*clkdm_sleep)(struct clockdomain *clkdm);
|
||||
int (*clkdm_wakeup)(struct clockdomain *clkdm);
|
||||
void (*clkdm_allow_idle)(struct clockdomain *clkdm);
|
||||
void (*clkdm_deny_idle)(struct clockdomain *clkdm);
|
||||
int (*clkdm_clk_enable)(struct clockdomain *clkdm);
|
||||
int (*clkdm_clk_disable)(struct clockdomain *clkdm);
|
||||
};
|
||||
|
||||
void clkdm_init(struct clockdomain **clkdms, struct clkdm_autodep *autodeps,
|
||||
struct clkdm_ops *custom_funcs);
|
||||
struct clockdomain *clkdm_lookup(const char *name);
|
||||
|
||||
int clkdm_for_each(int (*fn)(struct clockdomain *clkdm, void *user),
|
||||
|
|
|
@ -856,5 +856,5 @@ static struct clockdomain *clockdomains_omap2[] __initdata = {
|
|||
|
||||
void __init omap2_clockdomains_init(void)
|
||||
{
|
||||
clkdm_init(clockdomains_omap2, clkdm_autodeps);
|
||||
clkdm_init(clockdomains_omap2, clkdm_autodeps, NULL);
|
||||
}
|
||||
|
|
|
@ -305,5 +305,5 @@ static struct clockdomain *clockdomains_omap44xx[] __initdata = {
|
|||
|
||||
void __init omap44xx_clockdomains_init(void)
|
||||
{
|
||||
clkdm_init(clockdomains_omap44xx, NULL);
|
||||
clkdm_init(clockdomains_omap44xx, NULL, NULL);
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче