/** * omap2_clk_disable - disable a clock, if the system is not using it * @clk: struct clk * to disable * * Decrements the usecount on struct clk @clk. If there are no users * left, call the clkops-specific clock disable function to disable it * in hardware. If the clock is part of a clockdomain (which they all * should be), request that the clockdomain be disabled. (It too has * a usecount, and so will not be disabled in the hardware until it no * longer has any users.) If the clock has a parent clock (most of * them do), then call ourselves, recursing on the parent clock. This * can cause an entire branch of the clock tree to be powered off by * simply disabling one clock. Intended to be called with the clockfw_lock * spinlock held. No return value. */ void omap2_clk_disable(struct clk *clk) { if (clk->usecount == 0) { WARN(1, "clock: %s: omap2_clk_disable() called, but usecount " "already 0?", clk->name); return; } pr_debug("clock: %s: decrementing usecount\n", clk->name); clk->usecount--; if (clk->usecount > 0) return; pr_debug("clock: %s: disabling in hardware\n", clk->name); clk->ops->disable(clk); if (clk->clkdm) omap2_clkdm_clk_disable(clk->clkdm, clk); if (clk->parent) omap2_clk_disable(clk->parent); }
int omap2_clk_enable(struct clk *clk) { int ret = 0; if (clk->usecount++ == 0) { #ifndef CONFIG_ARCH_OMAP4 /* FIXME: Remove this once clkdm f/w is in place */ if (clk->clkdm) omap2_clkdm_clk_enable(clk->clkdm, clk); #endif if (clk->parent) { ret = omap2_clk_enable(clk->parent); if (ret) goto err; } ret = _omap2_clk_enable(clk); if (ret) { if (clk->parent) omap2_clk_disable(clk->parent); goto err; } } return ret; err: #ifndef CONFIG_ARCH_OMAP4 /* FIXME: Remove this once clkdm f/w is in place */ if (clk->clkdm) omap2_clkdm_clk_disable(clk->clkdm, clk); #endif clk->usecount--; return ret; }
int omap2_clk_enable(struct clk *clk) { int ret = 0; if (clk->usecount++ == 0) { if (clk->clkdm) omap2_clkdm_clk_enable(clk->clkdm, clk); if (clk->parent) { ret = omap2_clk_enable(clk->parent); if (ret) goto err; } ret = _omap2_clk_enable(clk); if (ret) { if (clk->parent) omap2_clk_disable(clk->parent); goto err; } } return ret; err: if (clk->clkdm) omap2_clkdm_clk_disable(clk->clkdm, clk); clk->usecount--; return ret; }
/** * omap2_clk_enable - request that the system enable a clock * @clk: struct clk * to enable * * Increments the usecount on struct clk @clk. If there were no users * previously, then recurse up the clock tree, enabling all of the * clock's parents and all of the parent clockdomains, and finally, * enabling @clk's clockdomain, and @clk itself. Intended to be * called with the clockfw_lock spinlock held. Returns 0 upon success * or a negative error code upon failure. */ int omap2_clk_enable(struct clk *clk) { int ret; pr_debug("clock: %s: incrementing usecount\n", clk->name); clk->usecount++; if (clk->usecount > 1) return 0; pr_debug("clock: %s: enabling in hardware\n", clk->name); if (clk->parent) { ret = omap2_clk_enable(clk->parent); if (ret) { WARN(1, "clock: %s: could not enable parent %s: %d\n", clk->name, clk->parent->name, ret); goto oce_err1; } } if (clk->clkdm) { ret = omap2_clkdm_clk_enable(clk->clkdm, clk); if (ret) { WARN(1, "clock: %s: could not enable clockdomain %s: " "%d\n", clk->name, clk->clkdm->name, ret); goto oce_err2; } } ret = clk->ops->enable(clk); if (ret) { WARN(1, "clock: %s: could not enable: %d\n", clk->name, ret); goto oce_err3; } if (clk->clkdm) { ret = omap2_clkdm_clk_enable_post(clk->clkdm, clk); if (ret) { WARN(1, "clock: %s: could not enable clockdomain %s: " "%d\n", clk->name, clk->clkdm->name, ret); goto oce_err2; } } return 0; oce_err3: if (clk->clkdm) omap2_clkdm_clk_disable(clk->clkdm, clk); oce_err2: if (clk->parent) omap2_clk_disable(clk->parent); oce_err1: clk->usecount--; return ret; }
void omap2_clk_disable(struct clk *clk) { if (clk->usecount > 0 && !(--clk->usecount)) { _omap2_clk_disable(clk); if (clk->parent) omap2_clk_disable(clk->parent); if (clk->clkdm) omap2_clkdm_clk_disable(clk->clkdm, clk); } }
void omap2_clk_disable(struct clk *clk) { if (clk->usecount > 0 && !(--clk->usecount)) { _omap2_clk_disable(clk); if (clk->parent) omap2_clk_disable(clk->parent); #ifndef CONFIG_ARCH_OMAP4 /* FIXME: Remove this once clkdm f/w is in place */ if (clk->clkdm) omap2_clkdm_clk_disable(clk->clkdm, clk); #endif } }
/** * omap2_clk_enable - request that the system enable a clock * @clk: struct clk * to enable * * Increments the usecount on struct clk @clk. If there were no users * previously, then recurse up the clock tree, enabling all of the * clock's parents and all of the parent clockdomains, and finally, * enabling @clk's clockdomain, and @clk itself. Intended to be * called with the clockfw_lock spinlock held. Returns 0 upon success * or a negative error code upon failure. */ int omap2_clk_enable(struct clk *clk) { int ret; if (clk->usecount == 127) { /* 20110626 [email protected] usecount range check for + value also */ WARN(1, "clock: %s: omap2_clk_enable() called, but usecount " "already 127?", clk->name); return; } pr_debug("clock: %s: incrementing usecount\n", clk->name); clk->usecount++; if (clk->usecount > 1) return 0; pr_debug("clock: %s: enabling in hardware\n", clk->name); if (clk->parent) { ret = omap2_clk_enable(clk->parent); if (ret) { WARN(1, "clock: %s: could not enable parent %s: %d\n", clk->name, clk->parent->name, ret); goto oce_err1; } } if (clk->clkdm) { ret = omap2_clkdm_clk_enable(clk->clkdm, clk); if (ret) { WARN(1, "clock: %s: could not enable clockdomain %s: " "%d\n", clk->name, clk->clkdm->name, ret); goto oce_err2; } } ret = clk->ops->enable(clk); if (ret) { WARN(1, "clock: %s: could not enable: %d\n", clk->name, ret); goto oce_err3; } if (clk->clkdm) { ret = omap2_clkdm_clk_enable_post(clk->clkdm, clk); if (ret) { WARN(1, "clock: %s: could not enable clockdomain %s: " "%d\n", clk->name, clk->clkdm->name, ret); goto oce_err2; } } return 0; oce_err3: if (clk->clkdm) omap2_clkdm_clk_disable(clk->clkdm, clk); oce_err2: if (clk->parent) omap2_clk_disable(clk->parent); oce_err1: clk->usecount--; return ret; }