static int sysclk_enable(struct clk *clk) { static bool swat_enable; int r; if (!swat_enable) { r = ab8500_sysctrl_set(AB8500_SWATCTRL, AB8500_SWATCTRL_SWATENABLE); if (r) return r; swat_enable = true; } r = request_sysclk(true); if (r) return r; if (clk->cg_sel) { r = ab8500_sysctrl_set(AB8500_SYSULPCLKCTRL1, (u8)clk->cg_sel); if (r) (void)request_sysclk(false); } return r; }
static int ab_ulpclk_enable(struct clk *clk) { int err; if (clk->regulator == NULL) { struct regulator *reg; reg = regulator_get(NULL, "v-intcore"); if (IS_ERR(reg)) return PTR_ERR(reg); clk->regulator = reg; } err = regulator_set_optimum_mode(clk->regulator, 1500); if (unlikely(err < 0)) goto regulator_enable_error; err = regulator_enable(clk->regulator); if (unlikely(err)) goto regulator_enable_error; err = ab8500_sysctrl_clear(AB8500_SYSULPCLKCONF, AB8500_SYSULPCLKCONF_ULPCLKCONF_MASK); if (unlikely(err)) goto enable_error; err = ab8500_sysctrl_set(AB8500_SYSULPCLKCTRL1, AB8500_SYSULPCLKCTRL1_ULPCLKREQ); if (unlikely(err)) goto enable_error; /* Unknown/undocumented PLL locking time => wait 1 ms. */ msleep(1); return 0; enable_error: (void)regulator_disable(clk->regulator); regulator_enable_error: return err; }
static void sysclk_init_disable(struct work_struct *not_used) { int i; mutex_lock(&sysclk_mutex); /* Enable SWAT */ if (ab8500_sysctrl_set(AB8500_SWATCTRL, AB8500_SWATCTRL_SWATENABLE)) goto err_swat; for (i = 0; i < ARRAY_SIZE(u8500_v2_sysclks); i++) { struct clk *clk = u8500_v2_sysclks[i].clk; /* Disable sysclks */ if (!clk->enabled && clk->cg_sel) { if (ab8500_sysctrl_clear(AB8500_SYSULPCLKCTRL1, (u8)clk->cg_sel)) goto err_sysclk; } } goto unlock_and_exit; err_sysclk: pr_err("clock: Disable %s failed", u8500_v2_sysclks[i].clk->name); ab8500_sysctrl_clear(AB8500_SWATCTRL, AB8500_SWATCTRL_SWATENABLE); goto unlock_and_exit; err_swat: pr_err("clock: Enable SWAT failed"); unlock_and_exit: mutex_unlock(&sysclk_mutex); }
static int audioclk_enable(struct clk *clk) { return ab8500_sysctrl_set(AB8500_SYSULPCLKCTRL1, AB8500_SYSULPCLKCTRL1_AUDIOCLKENA); }