Commit 77b773ae authored by Tero Kristo's avatar Tero Kristo
Browse files

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: default avatarTero Kristo <t-kristo@ti.com>
Acked-by: default avatarTony Lindgren <tony@atomide.com>
Tested-by: default avatarKeerthy <j-keerthy@ti.com>
parent bfeffd15
Loading
Loading
Loading
Loading
+26 −39
Original line number Diff line number Diff line
@@ -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();

+42 −0
Original line number Diff line number Diff line
@@ -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;
}
+1 −0
Original line number Diff line number Diff line
@@ -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;