Ejemplo n.º 1
0
static int local_clk_enable(struct clk *clk)
{
	int ret = 0;

	if (clk->usecount == 0) {
		if (clk->parent) {
			ret = local_clk_enable(clk->parent);
			if (ret != 0)
				goto out;
		}

		if (clk->enable)
			ret = clk->enable(clk);
		else if (!(clk->flags & FIXED_RATE) && !clk->rate && clk->set_rate
			    && clk->user_rate)
			ret = clk->set_rate(clk, clk->user_rate);

		if (ret != 0 && clk->parent) {
			local_clk_disable(clk->parent);
			goto out;
		}

		clk->usecount++;
	}
out:
	return ret;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
static void local_clk_unuse(struct clk *clk)
{
	if (clk->usecount > 0 && !(--clk->usecount)) {
		local_clk_disable(clk);
		if (clk->parent)
			local_clk_unuse(clk->parent);
	}
}
Ejemplo n.º 4
0
static void local_clk_disable(struct clk *clk)
{
	if (WARN_ON(clk->usecount == 0))
		return;

	if (!(--clk->usecount)) {
		if (clk->disable)
			clk->disable(clk);
		else if (!(clk->flags & FIXED_RATE) && clk->rate && clk->set_rate)
			clk->set_rate(clk, 0);
		if (clk->parent)
			local_clk_disable(clk->parent);
	}
}
Ejemplo n.º 5
0
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;
}
Ejemplo n.º 6
0
void clk_disable(struct clk *clk)
{
	clock_lock();
	local_clk_disable(clk);
	clock_unlock();
}