diff options
| author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 15:20:36 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 15:20:36 -0700 | 
| commit | 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch) | |
| tree | 0bba044c4ce775e45a88a51686b5d9f90697ea9d /arch/arm/mach-versatile/clock.c | |
| download | olio-linux-3.10-1da177e4c3f41524e886b7f1b8a0c1fc7321cac2.tar.xz olio-linux-3.10-1da177e4c3f41524e886b7f1b8a0c1fc7321cac2.zip  | |
Linux-2.6.12-rc2
Initial git repository build. I'm not bothering with the full history,
even though we have it. We can create a separate "historical" git
archive of that later if we want to, and in the meantime it's about
3.2GB when imported into git - space that would just make the early
git days unnecessarily complicated, when we don't have a lot of good
infrastructure for it.
Let it rip!
Diffstat (limited to 'arch/arm/mach-versatile/clock.c')
| -rw-r--r-- | arch/arm/mach-versatile/clock.c | 145 | 
1 files changed, 145 insertions, 0 deletions
diff --git a/arch/arm/mach-versatile/clock.c b/arch/arm/mach-versatile/clock.c new file mode 100644 index 00000000000..48025c2b998 --- /dev/null +++ b/arch/arm/mach-versatile/clock.c @@ -0,0 +1,145 @@ +/* + *  linux/arch/arm/mach-versatile/clock.c + * + *  Copyright (C) 2004 ARM Limited. + *  Written by Deep Blue Solutions Limited. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ +#include <linux/module.h> +#include <linux/kernel.h> +#include <linux/list.h> +#include <linux/errno.h> +#include <linux/err.h> + +#include <asm/semaphore.h> +#include <asm/hardware/clock.h> +#include <asm/hardware/icst307.h> + +#include "clock.h" + +static LIST_HEAD(clocks); +static DECLARE_MUTEX(clocks_sem); + +struct clk *clk_get(struct device *dev, const char *id) +{ +	struct clk *p, *clk = ERR_PTR(-ENOENT); + +	down(&clocks_sem); +	list_for_each_entry(p, &clocks, node) { +		if (strcmp(id, p->name) == 0 && try_module_get(p->owner)) { +			clk = p; +			break; +		} +	} +	up(&clocks_sem); + +	return clk; +} +EXPORT_SYMBOL(clk_get); + +void clk_put(struct clk *clk) +{ +	module_put(clk->owner); +} +EXPORT_SYMBOL(clk_put); + +int clk_enable(struct clk *clk) +{ +	return 0; +} +EXPORT_SYMBOL(clk_enable); + +void clk_disable(struct clk *clk) +{ +} +EXPORT_SYMBOL(clk_disable); + +int clk_use(struct clk *clk) +{ +	return 0; +} +EXPORT_SYMBOL(clk_use); + +void clk_unuse(struct clk *clk) +{ +} +EXPORT_SYMBOL(clk_unuse); + +unsigned long clk_get_rate(struct clk *clk) +{ +	return clk->rate; +} +EXPORT_SYMBOL(clk_get_rate); + +long clk_round_rate(struct clk *clk, unsigned long rate) +{ +	return rate; +} +EXPORT_SYMBOL(clk_round_rate); + +int clk_set_rate(struct clk *clk, unsigned long rate) +{ +	int ret = -EIO; + +	if (clk->setvco) { +		struct icst307_vco vco; + +		vco = icst307_khz_to_vco(clk->params, rate / 1000); +		clk->rate = icst307_khz(clk->params, vco) * 1000; + +		printk("Clock %s: setting VCO reg params: S=%d R=%d V=%d\n", +			clk->name, vco.s, vco.r, vco.v); + +		clk->setvco(clk, vco); +		ret = 0; +	} +	return ret; +} +EXPORT_SYMBOL(clk_set_rate); + +/* + * These are fixed clocks. + */ +static struct clk kmi_clk = { +	.name	= "KMIREFCLK", +	.rate	= 24000000, +}; + +static struct clk uart_clk = { +	.name	= "UARTCLK", +	.rate	= 24000000, +}; + +static struct clk mmci_clk = { +	.name	= "MCLK", +	.rate	= 33000000, +}; + +int clk_register(struct clk *clk) +{ +	down(&clocks_sem); +	list_add(&clk->node, &clocks); +	up(&clocks_sem); +	return 0; +} +EXPORT_SYMBOL(clk_register); + +void clk_unregister(struct clk *clk) +{ +	down(&clocks_sem); +	list_del(&clk->node); +	up(&clocks_sem); +} +EXPORT_SYMBOL(clk_unregister); + +static int __init clk_init(void) +{ +	clk_register(&kmi_clk); +	clk_register(&uart_clk); +	clk_register(&mmci_clk); +	return 0; +} +arch_initcall(clk_init);  |