diff options
Diffstat (limited to 'arch/mips/lantiq/xway/pmu.c')
| -rw-r--r-- | arch/mips/lantiq/xway/pmu.c | 70 | 
1 files changed, 70 insertions, 0 deletions
diff --git a/arch/mips/lantiq/xway/pmu.c b/arch/mips/lantiq/xway/pmu.c new file mode 100644 index 00000000000..9d69f01e352 --- /dev/null +++ b/arch/mips/lantiq/xway/pmu.c @@ -0,0 +1,70 @@ +/* + *  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. + * + *  Copyright (C) 2010 John Crispin <blogic@openwrt.org> + */ + +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/version.h> +#include <linux/ioport.h> + +#include <lantiq_soc.h> + +/* PMU - the power management unit allows us to turn part of the core + * on and off + */ + +/* the enable / disable registers */ +#define LTQ_PMU_PWDCR	0x1C +#define LTQ_PMU_PWDSR	0x20 + +#define ltq_pmu_w32(x, y)	ltq_w32((x), ltq_pmu_membase + (y)) +#define ltq_pmu_r32(x)		ltq_r32(ltq_pmu_membase + (x)) + +static struct resource ltq_pmu_resource = { +	.name	= "pmu", +	.start	= LTQ_PMU_BASE_ADDR, +	.end	= LTQ_PMU_BASE_ADDR + LTQ_PMU_SIZE - 1, +	.flags	= IORESOURCE_MEM, +}; + +static void __iomem *ltq_pmu_membase; + +void ltq_pmu_enable(unsigned int module) +{ +	int err = 1000000; + +	ltq_pmu_w32(ltq_pmu_r32(LTQ_PMU_PWDCR) & ~module, LTQ_PMU_PWDCR); +	do {} while (--err && (ltq_pmu_r32(LTQ_PMU_PWDSR) & module)); + +	if (!err) +		panic("activating PMU module failed!\n"); +} +EXPORT_SYMBOL(ltq_pmu_enable); + +void ltq_pmu_disable(unsigned int module) +{ +	ltq_pmu_w32(ltq_pmu_r32(LTQ_PMU_PWDCR) | module, LTQ_PMU_PWDCR); +} +EXPORT_SYMBOL(ltq_pmu_disable); + +int __init ltq_pmu_init(void) +{ +	if (insert_resource(&iomem_resource, <q_pmu_resource) < 0) +		panic("Failed to insert pmu memory\n"); + +	if (request_mem_region(ltq_pmu_resource.start, +			resource_size(<q_pmu_resource), "pmu") < 0) +		panic("Failed to request pmu memory\n"); + +	ltq_pmu_membase = ioremap_nocache(ltq_pmu_resource.start, +				resource_size(<q_pmu_resource)); +	if (!ltq_pmu_membase) +		panic("Failed to remap pmu memory\n"); +	return 0; +} + +core_initcall(ltq_pmu_init);  |