static int clk_sysctrl_set_parent(struct clk_hw *hw, u8 index) { struct clk_sysctrl *clk = to_clk_sysctrl(hw); u8 old_index = clk->parent_index; int ret = 0; if (clk->reg_sel[old_index]) { ret = ab8500_sysctrl_clear(clk->reg_sel[old_index], clk->reg_mask[old_index]); if (ret) return ret; } if (clk->reg_sel[index]) { ret = ab8500_sysctrl_write(clk->reg_sel[index], clk->reg_mask[index], clk->reg_bits[index]); if (ret) { if (clk->reg_sel[old_index]) ab8500_sysctrl_write(clk->reg_sel[old_index], clk->reg_mask[old_index], clk->reg_bits[old_index]); return ret; } } clk->parent_index = index; return ret; }
static int ab_intclk_set_parent(struct clk *clk, struct clk *parent) { int err; if (!clk->enabled) return 0; err = __clk_enable(parent, clk->mutex); if (unlikely(err)) goto parent_enable_error; if (parent == clk->parents[AB_INTCLK_PARENT_ULPCLK]) { err = ab8500_sysctrl_write(AB8500_SYSULPCLKCTRL1, AB8500_SYSULPCLKCTRL1_SYSULPCLKINTSEL_MASK, (1 << AB8500_SYSULPCLKCTRL1_SYSULPCLKINTSEL_SHIFT)); } else { err = ab8500_sysctrl_clear(AB8500_SYSULPCLKCTRL1, AB8500_SYSULPCLKCTRL1_SYSULPCLKINTSEL_MASK); } if (unlikely(err)) goto config_error; __clk_disable(clk->parent, clk->mutex); return 0; config_error: __clk_disable(parent, clk->mutex); parent_enable_error: return err; }
static int ab_intclk_enable(struct clk *clk) { if (clk->parent == clk->parents[AB_INTCLK_PARENT_ULPCLK]) { return ab8500_sysctrl_write(AB8500_SYSULPCLKCTRL1, AB8500_SYSULPCLKCTRL1_SYSULPCLKINTSEL_MASK, (1 << AB8500_SYSULPCLKCTRL1_SYSULPCLKINTSEL_SHIFT)); } return 0; }
static int clk_sysctrl_prepare(struct clk_hw *hw) { int ret; struct clk_sysctrl *clk = to_clk_sysctrl(hw); ret = ab8500_sysctrl_write(clk->reg_sel[0], clk->reg_mask[0], clk->reg_bits[0]); if (!ret && clk->enable_delay_us) usleep_range(clk->enable_delay_us, clk->enable_delay_us); return ret; }