clk: ti: move clk_hw_omap list handling under generic part of the driver
Currently the clk_hw_omap list is handled under the autoidle code, but it should be accessible generically. Add a few APIs towards this, and update the autoidle code to use the generic implementations. Signed-off-by: Tero Kristo <t-kristo@ti.com> Acked-by: Tony Lindgren <tony@atomide.com> Tested-by: Keerthy <j-keerthy@ti.com>
This commit is contained in:
Родитель
bfeffd1552
Коммит
77b773aea5
|
@ -35,7 +35,20 @@ struct clk_ti_autoidle {
|
|||
#define AUTOIDLE_LOW 0x1
|
||||
|
||||
static LIST_HEAD(autoidle_clks);
|
||||
static LIST_HEAD(clk_hw_omap_clocks);
|
||||
|
||||
static int _omap2_clk_deny_idle(struct clk_hw_omap *clk)
|
||||
{
|
||||
if (clk->ops && clk->ops->deny_idle)
|
||||
clk->ops->deny_idle(clk);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int _omap2_clk_allow_idle(struct clk_hw_omap *clk)
|
||||
{
|
||||
if (clk->ops && clk->ops->allow_idle)
|
||||
clk->ops->allow_idle(clk);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* omap2_clk_deny_idle - disable autoidle on an OMAP clock
|
||||
|
@ -45,12 +58,9 @@ static LIST_HEAD(clk_hw_omap_clocks);
|
|||
*/
|
||||
int omap2_clk_deny_idle(struct clk *clk)
|
||||
{
|
||||
struct clk_hw_omap *c;
|
||||
struct clk_hw_omap *c = to_clk_hw_omap(__clk_get_hw(clk));
|
||||
|
||||
c = to_clk_hw_omap(__clk_get_hw(clk));
|
||||
if (c->ops && c->ops->deny_idle)
|
||||
c->ops->deny_idle(c);
|
||||
return 0;
|
||||
return _omap2_clk_deny_idle(c);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -61,12 +71,9 @@ int omap2_clk_deny_idle(struct clk *clk)
|
|||
*/
|
||||
int omap2_clk_allow_idle(struct clk *clk)
|
||||
{
|
||||
struct clk_hw_omap *c;
|
||||
struct clk_hw_omap *c = to_clk_hw_omap(__clk_get_hw(clk));
|
||||
|
||||
c = to_clk_hw_omap(__clk_get_hw(clk));
|
||||
if (c->ops && c->ops->allow_idle)
|
||||
c->ops->allow_idle(c);
|
||||
return 0;
|
||||
return _omap2_clk_allow_idle(c);
|
||||
}
|
||||
|
||||
static void _allow_autoidle(struct clk_ti_autoidle *clk)
|
||||
|
@ -167,26 +174,6 @@ int __init of_ti_clk_autoidle_setup(struct device_node *node)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* omap2_init_clk_hw_omap_clocks - initialize an OMAP clock
|
||||
* @hw: struct clk_hw * to initialize
|
||||
*
|
||||
* Add an OMAP clock @clk to the internal list of OMAP clocks. Used
|
||||
* temporarily for autoidle handling, until this support can be
|
||||
* integrated into the common clock framework code in some way. No
|
||||
* return value.
|
||||
*/
|
||||
void omap2_init_clk_hw_omap_clocks(struct clk_hw *hw)
|
||||
{
|
||||
struct clk_hw_omap *c;
|
||||
|
||||
if (clk_hw_get_flags(hw) & CLK_IS_BASIC)
|
||||
return;
|
||||
|
||||
c = to_clk_hw_omap(hw);
|
||||
list_add(&c->node, &clk_hw_omap_clocks);
|
||||
}
|
||||
|
||||
/**
|
||||
* omap2_clk_enable_autoidle_all - enable autoidle on all OMAP clocks that
|
||||
* support it
|
||||
|
@ -198,11 +185,11 @@ void omap2_init_clk_hw_omap_clocks(struct clk_hw *hw)
|
|||
*/
|
||||
int omap2_clk_enable_autoidle_all(void)
|
||||
{
|
||||
struct clk_hw_omap *c;
|
||||
int ret;
|
||||
|
||||
list_for_each_entry(c, &clk_hw_omap_clocks, node)
|
||||
if (c->ops && c->ops->allow_idle)
|
||||
c->ops->allow_idle(c);
|
||||
ret = omap2_clk_for_each(_omap2_clk_allow_idle);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
_clk_generic_allow_autoidle_all();
|
||||
|
||||
|
@ -220,11 +207,11 @@ int omap2_clk_enable_autoidle_all(void)
|
|||
*/
|
||||
int omap2_clk_disable_autoidle_all(void)
|
||||
{
|
||||
struct clk_hw_omap *c;
|
||||
int ret;
|
||||
|
||||
list_for_each_entry(c, &clk_hw_omap_clocks, node)
|
||||
if (c->ops && c->ops->deny_idle)
|
||||
c->ops->deny_idle(c);
|
||||
ret = omap2_clk_for_each(_omap2_clk_deny_idle);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
_clk_generic_deny_autoidle_all();
|
||||
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
#undef pr_fmt
|
||||
#define pr_fmt(fmt) "%s: " fmt, __func__
|
||||
|
||||
static LIST_HEAD(clk_hw_omap_clocks);
|
||||
struct ti_clk_ll_ops *ti_clk_ll_ops;
|
||||
static struct device_node *clocks_node_ptr[CLK_MAX_MEMMAPS];
|
||||
|
||||
|
@ -517,3 +518,44 @@ struct clk *ti_clk_register(struct device *dev, struct clk_hw *hw,
|
|||
|
||||
return clk;
|
||||
}
|
||||
|
||||
/**
|
||||
* omap2_init_clk_hw_omap_clocks - initialize an OMAP clock
|
||||
* @hw: struct clk_hw * to initialize
|
||||
*
|
||||
* Add an OMAP clock @clk to the internal list of OMAP clocks. Used
|
||||
* temporarily for autoidle handling, until this support can be
|
||||
* integrated into the common clock framework code in some way. No
|
||||
* return value.
|
||||
*/
|
||||
void omap2_init_clk_hw_omap_clocks(struct clk_hw *hw)
|
||||
{
|
||||
struct clk_hw_omap *c;
|
||||
|
||||
c = to_clk_hw_omap(hw);
|
||||
list_add(&c->node, &clk_hw_omap_clocks);
|
||||
}
|
||||
|
||||
/**
|
||||
* omap2_clk_for_each - call function for each registered clk_hw_omap
|
||||
* @fn: pointer to a callback function
|
||||
*
|
||||
* Call @fn for each registered clk_hw_omap, passing @hw to each
|
||||
* function. @fn must return 0 for success or any other value for
|
||||
* failure. If @fn returns non-zero, the iteration across clocks
|
||||
* will stop and the non-zero return value will be passed to the
|
||||
* caller of omap2_clk_for_each().
|
||||
*/
|
||||
int omap2_clk_for_each(int (*fn)(struct clk_hw_omap *hw))
|
||||
{
|
||||
int ret;
|
||||
struct clk_hw_omap *hw;
|
||||
|
||||
list_for_each_entry(hw, &clk_hw_omap_clocks, node) {
|
||||
ret = (*fn)(hw);
|
||||
if (ret)
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -301,6 +301,7 @@ long omap4_dpll_regm4xen_round_rate(struct clk_hw *hw,
|
|||
unsigned long *parent_rate);
|
||||
int omap4_dpll_regm4xen_determine_rate(struct clk_hw *hw,
|
||||
struct clk_rate_request *req);
|
||||
int omap2_clk_for_each(int (*fn)(struct clk_hw_omap *hw));
|
||||
|
||||
extern struct ti_clk_ll_ops *ti_clk_ll_ops;
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче