static int __init clk_init(void) { struct clk **clkp; /* Disable autoclocking, as it doesn't seem to work */ __raw_writel(0xff, AUTOCLK_CTRL); for (clkp = onchip_clks; clkp < onchip_clks + ARRAY_SIZE(onchip_clks); clkp++) { if (((*clkp)->flags & NEEDS_INITIALIZATION) && ((*clkp)->set_rate)) { (*clkp)->user_rate = (*clkp)->rate; local_set_rate((*clkp), (*clkp)->user_rate); if ((*clkp)->set_parent) (*clkp)->set_parent((*clkp), (*clkp)->parent); } pr_debug("%s: clock %s, rate %ld\n", __func__, (*clkp)->name, (*clkp)->rate); } local_clk_use(&ck_pll4); /* if ck_13MHz is not used, disable it. */ if (ck_13MHz.usecount == 0) local_clk_disable(&ck_13MHz); /* Disable autoclocking */ __raw_writeb(0xff, AUTOCLK_CTRL); return 0; }
static void propagate_rate(struct clk *clk) { struct clk *tmp_clk; tmp_clk = clk; while (tmp_clk->propagate_next) { tmp_clk = tmp_clk->propagate_next; local_set_rate(tmp_clk, tmp_clk->user_rate); } }
static int __init clk_init(void) { struct clk **clkp; /* Disable autoclocking, as it doesn't seem to work */ __raw_writel(0xff, AUTOCLK_CTRL); for (clkp = onchip_clks; clkp < onchip_clks + ARRAY_SIZE(onchip_clks); clkp++) { struct clk *clk = *clkp; if (clk->flags & NEEDS_INITIALIZATION) { if (clk->set_rate) { clk->user_rate = clk->rate; local_set_rate(clk, clk->user_rate); if (clk->set_parent) clk->set_parent(clk, clk->parent); } if (clk->enable && clk->usecount) clk->enable(clk); if (clk->disable && !clk->usecount) clk->disable(clk); } pr_debug("%s: clock %s, rate %ld\n", __func__, clk->name, clk->rate); } local_clk_enable(&ck_pll4); /* if ck_13MHz is not used, disable it. */ if (ck_13MHz.usecount == 0) local_clk_disable(&ck_13MHz); /* Disable autoclocking */ __raw_writeb(0xff, AUTOCLK_CTRL); clkdev_add_table(onchip_clkreg, ARRAY_SIZE(onchip_clkreg)); return 0; }
int clk_set_rate(struct clk *clk, unsigned long rate) { int ret = -EINVAL; if (clk->flags & FIXED_RATE) goto out; clock_lock(); if ((clk->flags & PARENT_SET_RATE) && clk->parent) { clk->user_rate = clk->round_rate(clk, rate); /* parent clock needs to be refreshed for the setting to take effect */ } else { ret = local_set_rate(clk, rate); } ret = 0; clock_unlock(); out: return ret; }