/* Vote clock disable */ void clock_lib2_vote_clk_disable(struct clk *c) { uint32_t vote_regval; struct vote_clk *vclk = to_local_vote_clk(c); vote_regval = readl(vclk->vote_reg); vote_regval &= ~vclk->en_mask; writel_relaxed(vote_regval, vclk->vote_reg); }
/* * Voteable clock functions */ static int local_vote_clk_reset(struct clk *c, enum clk_reset_action action) { struct local_vote_clk *vclk = to_local_vote_clk(c); if (!vclk->bcr_reg) { WARN("clk_reset called on an unsupported clock (%s)\n", c->dbg_name); return -EPERM; } return __branch_clk_reset(BCR_REG(vclk), action); }
static enum handoff local_vote_clk_handoff(struct clk *c) { struct local_vote_clk *vclk = to_local_vote_clk(c); u32 vote_regval; /* Is the branch voted on by apps? */ vote_regval = readl_relaxed(VOTE_REG(vclk)); if (!(vote_regval & vclk->en_mask)) return HANDOFF_DISABLED_CLK; return HANDOFF_ENABLED_CLK; }
static void local_vote_clk_disable(struct clk *c) { unsigned long flags; u32 ena; struct local_vote_clk *vclk = to_local_vote_clk(c); spin_lock_irqsave(&local_clock_reg_lock, flags); ena = readl_relaxed(VOTE_REG(vclk)); ena &= ~vclk->en_mask; writel_relaxed(ena, VOTE_REG(vclk)); spin_unlock_irqrestore(&local_clock_reg_lock, flags); }
static int local_vote_clk_enable(struct clk *c) { unsigned long flags; u32 ena; struct local_vote_clk *vclk = to_local_vote_clk(c); spin_lock_irqsave(&local_clock_reg_lock, flags); ena = readl_relaxed(VOTE_REG(vclk)); ena |= vclk->en_mask; writel_relaxed(ena, VOTE_REG(vclk)); spin_unlock_irqrestore(&local_clock_reg_lock, flags); branch_clk_halt_check(vclk->halt_check, c->dbg_name, CBCR_REG(vclk), BRANCH_ON); return 0; }
/* Vote clock enable */ int clock_lib2_vote_clk_enable(struct clk *c) { uint32_t vote_regval; uint32_t val; struct vote_clk *vclk = to_local_vote_clk(c); vote_regval = readl(vclk->vote_reg); vote_regval |= vclk->en_mask; writel_relaxed(vote_regval, vclk->vote_reg); do { val = readl(vclk->cbcr_reg); val &= BRANCH_CHECK_MASK; } /* wait until status shows it is enabled */ while((val != BRANCH_ON_VAL) && (val != BRANCH_NOC_FSM_ON_VAL)); return 0; }
/* * Voteable clock functions */ static int local_vote_clk_reset(struct clk *c, enum clk_reset_action action) { struct local_vote_clk *vclk = to_local_vote_clk(c); return __branch_clk_reset(BCR_REG(vclk), action, c->dbg_name); }