static void branch_clk_disable(struct clk *c) { unsigned long flags; struct branch_clk *branch = to_branch_clk(c); u32 reg_val; spin_lock_irqsave(&local_clock_reg_lock, flags); reg_val = readl_relaxed(CBCR_REG(branch)); reg_val &= ~CBCR_BRANCH_ENABLE_BIT; writel_relaxed(reg_val, CBCR_REG(branch)); spin_unlock_irqrestore(&local_clock_reg_lock, flags); /* Wait for clock to disable before continuing. */ branch_clk_halt_check(branch->halt_check, branch->c.dbg_name, CBCR_REG(branch), BRANCH_OFF); }
static int branch_cdiv_set_rate(struct branch_clk *branch, unsigned long rate) { unsigned long flags; u32 regval; if (rate > branch->max_div) return -EINVAL; spin_lock_irqsave(&local_clock_reg_lock, flags); regval = readl_relaxed(CBCR_REG(branch)); regval &= ~BM(CBCR_CDIV_MSB, CBCR_CDIV_LSB); regval |= BVAL(CBCR_CDIV_MSB, CBCR_CDIV_LSB, rate); writel_relaxed(regval, CBCR_REG(branch)); spin_unlock_irqrestore(&local_clock_reg_lock, flags); return 0; }
static int branch_clk_enable(struct clk *c) { unsigned long flags; u32 cbcr_val; struct branch_clk *branch = to_branch_clk(c); spin_lock_irqsave(&local_clock_reg_lock, flags); cbcr_val = readl_relaxed(CBCR_REG(branch)); cbcr_val |= CBCR_BRANCH_ENABLE_BIT; writel_relaxed(cbcr_val, CBCR_REG(branch)); spin_unlock_irqrestore(&local_clock_reg_lock, flags); /* Wait for clock to enable before continuing. */ branch_clk_halt_check(branch->halt_check, branch->c.dbg_name, CBCR_REG(branch), BRANCH_ON); return 0; }
static enum handoff branch_clk_handoff(struct clk *c) { struct branch_clk *branch = to_branch_clk(c); u32 cbcr_regval; cbcr_regval = readl_relaxed(CBCR_REG(branch)); if ((cbcr_regval & CBCR_BRANCH_OFF_BIT)) return HANDOFF_DISABLED_CLK; if (branch->max_div) { cbcr_regval &= BM(CBCR_CDIV_MSB, CBCR_CDIV_LSB); cbcr_regval >>= CBCR_CDIV_LSB; c->rate = cbcr_regval; } else if (!branch->has_sibling) {
static enum handoff branch_clk_handoff(struct clk *c) { struct branch_clk *branch = to_branch_clk(c); u32 cbcr_regval; cbcr_regval = readl_relaxed(CBCR_REG(branch)); if ((cbcr_regval & CBCR_BRANCH_OFF_BIT)) return HANDOFF_DISABLED_CLK; if (c->parent) { if (c->parent->ops->handoff) return c->parent->ops->handoff(c->parent); } return HANDOFF_ENABLED_CLK; }
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; }
static enum handoff branch_clk_handoff(struct clk *c) { struct branch_clk *branch = to_branch_clk(c); u32 cbcr_regval; cbcr_regval = readl_relaxed(CBCR_REG(branch)); if ((cbcr_regval & CBCR_BRANCH_OFF_BIT)) return HANDOFF_DISABLED_CLK; pr_info("%s enabled.\n", branch->c.dbg_name); if (branch->parent) { if (branch->parent->ops->handoff) return branch->parent->ops->handoff(branch->parent); } return HANDOFF_ENABLED_CLK; }