Skip to content

Commit

Permalink
ARM: tegra: clock: prevent accidental disables of cpu clock
Browse files Browse the repository at this point in the history
Peripheral clocks that have no clock enable bit in the
enable registers have their clk_num set to 0.  Bit 0
in the clock enable registers is the CPU clock.
Prevent disables on these peripheral clocks from
accidentally disabling the CPU clock.

Signed-off-by: Colin Cross <ccross@android.com>
Acked-by: Olof Johansson <olof@lixom.net>
  • Loading branch information
Colin Cross committed Feb 22, 2011
1 parent 421186e commit 1be3d05
Showing 1 changed file with 25 additions and 0 deletions.
25 changes: 25 additions & 0 deletions arch/arm/mach-tegra/tegra2_clocks.c
Original file line number Diff line number Diff line change
Expand Up @@ -946,9 +946,14 @@ static void tegra2_periph_clk_init(struct clk *c)
}

c->state = ON;

if (!c->u.periph.clk_num)
return;

if (!(clk_readl(CLK_OUT_ENB + PERIPH_CLK_TO_ENB_REG(c)) &
PERIPH_CLK_TO_ENB_BIT(c)))
c->state = OFF;

if (!(c->flags & PERIPH_NO_RESET))
if (clk_readl(RST_DEVICES + PERIPH_CLK_TO_ENB_REG(c)) &
PERIPH_CLK_TO_ENB_BIT(c))
Expand All @@ -962,6 +967,9 @@ static int tegra2_periph_clk_enable(struct clk *c)
int refcount;
pr_debug("%s on clock %s\n", __func__, c->name);

if (!c->u.periph.clk_num)
return 0;

spin_lock_irqsave(&clock_register_lock, flags);

refcount = tegra_periph_clk_enable_refcount[c->u.periph.clk_num]++;
Expand Down Expand Up @@ -994,6 +1002,9 @@ static void tegra2_periph_clk_disable(struct clk *c)

pr_debug("%s on clock %s\n", __func__, c->name);

if (!c->u.periph.clk_num)
return;

spin_lock_irqsave(&clock_register_lock, flags);

if (c->refcnt)
Expand All @@ -1012,6 +1023,9 @@ static void tegra2_periph_clk_reset(struct clk *c, bool assert)

pr_debug("%s %s on clock %s\n", __func__,
assert ? "assert" : "deassert", c->name);

BUG_ON(!c->u.periph.clk_num);

if (!(c->flags & PERIPH_NO_RESET))
clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
base + PERIPH_CLK_TO_ENB_SET_REG(c));
Expand Down Expand Up @@ -1182,6 +1196,10 @@ static void tegra2_clk_double_init(struct clk *c)
c->mul = 2;
c->div = 1;
c->state = ON;

if (!c->u.periph.clk_num)
return;

if (!(clk_readl(CLK_OUT_ENB + PERIPH_CLK_TO_ENB_REG(c)) &
PERIPH_CLK_TO_ENB_BIT(c)))
c->state = OFF;
Expand Down Expand Up @@ -1269,20 +1287,27 @@ static void tegra2_cdev_clk_init(struct clk *c)
/* We could un-tristate the cdev1 or cdev2 pingroup here; this is
* currently done in the pinmux code. */
c->state = ON;

BUG_ON(!c->u.periph.clk_num);

if (!(clk_readl(CLK_OUT_ENB + PERIPH_CLK_TO_ENB_REG(c)) &
PERIPH_CLK_TO_ENB_BIT(c)))
c->state = OFF;
}

static int tegra2_cdev_clk_enable(struct clk *c)
{
BUG_ON(!c->u.periph.clk_num);

clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
CLK_OUT_ENB_SET + PERIPH_CLK_TO_ENB_SET_REG(c));
return 0;
}

static void tegra2_cdev_clk_disable(struct clk *c)
{
BUG_ON(!c->u.periph.clk_num);

clk_writel(PERIPH_CLK_TO_ENB_BIT(c),
CLK_OUT_ENB_CLR + PERIPH_CLK_TO_ENB_SET_REG(c));
}
Expand Down

0 comments on commit 1be3d05

Please sign in to comment.