Skip to content

Commit

Permalink
ARM: OMAP: hwmod: Fix up hwmod based clkdm accesses
Browse files Browse the repository at this point in the history
hwmod uses deferencing the clk pointer to acccess the clkdm.
With COMMON clk hwoever this will need to be deferenced through
the clk_hw_omap pointer, so do the necessary changes.

Signed-off-by: Rajendra Nayak <rnayak@ti.com>
Signed-off-by: Mike Turquette <mturquette@ti.com>
Signed-off-by: Paul Walmsley <paul@pwsan.com>
  • Loading branch information
Rajendra Nayak authored and Paul Walmsley committed Nov 12, 2012
1 parent b5a2366 commit f5dd3bb
Showing 1 changed file with 56 additions and 14 deletions.
70 changes: 56 additions & 14 deletions arch/arm/mach-omap2/omap_hwmod.c
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,11 @@
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/io.h>
#ifdef CONFIG_COMMON_CLK
#include <linux/clk-provider.h>
#else
#include <linux/clk.h>
#endif
#include <linux/delay.h>
#include <linux/err.h>
#include <linux/list.h>
Expand Down Expand Up @@ -614,6 +618,23 @@ static int _disable_wakeup(struct omap_hwmod *oh, u32 *v)
return 0;
}

static struct clockdomain *_get_clkdm(struct omap_hwmod *oh)
{
if (oh->clkdm) {
return oh->clkdm;
} else if (oh->_clk) {
#ifdef CONFIG_COMMON_CLK
struct clk_hw_omap *clk;

clk = to_clk_hw_omap(__clk_get_hw(oh->_clk));
return clk->clkdm;
#else
return oh->_clk->clkdm;
#endif
}
return NULL;
}

/**
* _add_initiator_dep: prevent @oh from smart-idling while @init_oh is active
* @oh: struct omap_hwmod *
Expand All @@ -629,13 +650,18 @@ static int _disable_wakeup(struct omap_hwmod *oh, u32 *v)
*/
static int _add_initiator_dep(struct omap_hwmod *oh, struct omap_hwmod *init_oh)
{
if (!oh->_clk)
struct clockdomain *clkdm, *init_clkdm;

clkdm = _get_clkdm(oh);
init_clkdm = _get_clkdm(init_oh);

if (!clkdm || !init_clkdm)
return -EINVAL;

if (oh->_clk->clkdm && oh->_clk->clkdm->flags & CLKDM_NO_AUTODEPS)
if (clkdm && clkdm->flags & CLKDM_NO_AUTODEPS)
return 0;

return clkdm_add_sleepdep(oh->_clk->clkdm, init_oh->_clk->clkdm);
return clkdm_add_sleepdep(clkdm, init_clkdm);
}

/**
Expand All @@ -653,13 +679,18 @@ static int _add_initiator_dep(struct omap_hwmod *oh, struct omap_hwmod *init_oh)
*/
static int _del_initiator_dep(struct omap_hwmod *oh, struct omap_hwmod *init_oh)
{
if (!oh->_clk)
struct clockdomain *clkdm, *init_clkdm;

clkdm = _get_clkdm(oh);
init_clkdm = _get_clkdm(init_oh);

if (!clkdm || !init_clkdm)
return -EINVAL;

if (oh->_clk->clkdm && oh->_clk->clkdm->flags & CLKDM_NO_AUTODEPS)
if (clkdm && clkdm->flags & CLKDM_NO_AUTODEPS)
return 0;

return clkdm_del_sleepdep(oh->_clk->clkdm, init_oh->_clk->clkdm);
return clkdm_del_sleepdep(clkdm, init_clkdm);
}

/**
Expand Down Expand Up @@ -693,7 +724,7 @@ static int _init_main_clk(struct omap_hwmod *oh)
*/
clk_prepare(oh->_clk);

if (!oh->_clk->clkdm)
if (!_get_clkdm(oh))
pr_debug("omap_hwmod: %s: missing clockdomain for %s.\n",
oh->name, oh->main_clk);

Expand Down Expand Up @@ -1276,18 +1307,17 @@ static void _enable_sysc(struct omap_hwmod *oh)
u8 idlemode, sf;
u32 v;
bool clkdm_act;
struct clockdomain *clkdm;

if (!oh->class->sysc)
return;

v = oh->_sysc_cache;
sf = oh->class->sysc->sysc_flags;

clkdm = _get_clkdm(oh);
if (sf & SYSC_HAS_SIDLEMODE) {
clkdm_act = ((oh->clkdm &&
oh->clkdm->flags & CLKDM_ACTIVE_WITH_MPU) ||
(oh->_clk && oh->_clk->clkdm &&
oh->_clk->clkdm->flags & CLKDM_ACTIVE_WITH_MPU));
clkdm_act = (clkdm && clkdm->flags & CLKDM_ACTIVE_WITH_MPU);
if (clkdm_act && !(oh->class->sysc->idlemodes &
(SIDLE_SMART | SIDLE_SMART_WKUP)))
idlemode = HWMOD_IDLEMODE_FORCE;
Expand Down Expand Up @@ -3556,10 +3586,17 @@ struct powerdomain *omap_hwmod_get_pwrdm(struct omap_hwmod *oh)
{
struct clk *c;
struct omap_hwmod_ocp_if *oi;
struct clockdomain *clkdm;
#ifdef CONFIG_COMMON_CLK
struct clk_hw_omap *clk;
#endif

if (!oh)
return NULL;

if (oh->clkdm)
return oh->clkdm->pwrdm.ptr;

if (oh->_clk) {
c = oh->_clk;
} else {
Expand All @@ -3569,11 +3606,16 @@ struct powerdomain *omap_hwmod_get_pwrdm(struct omap_hwmod *oh)
c = oi->_clk;
}

if (!c->clkdm)
#ifdef CONFIG_COMMON_CLK
clk = to_clk_hw_omap(__clk_get_hw(c));
clkdm = clk->clkdm;
#else
clkdm = c->clkdm;
#endif
if (!clkdm)
return NULL;

return c->clkdm->pwrdm.ptr;

return clkdm->pwrdm.ptr;
}

/**
Expand Down

0 comments on commit f5dd3bb

Please sign in to comment.