xref: /openbmc/linux/arch/mips/loongson2ef/lemote-2f/clock.c (revision 4b4193256c8d3bc3a5397b5cd9494c2ad386317d)
171e2f4ddSJiaxun Yang /*
271e2f4ddSJiaxun Yang  * Copyright (C) 2006 - 2008 Lemote Inc. & Institute of Computing Technology
371e2f4ddSJiaxun Yang  * Author: Yanhua, yanh@lemote.com
471e2f4ddSJiaxun Yang  *
571e2f4ddSJiaxun Yang  * This file is subject to the terms and conditions of the GNU General Public
671e2f4ddSJiaxun Yang  * License.  See the file "COPYING" in the main directory of this archive
771e2f4ddSJiaxun Yang  * for more details.
871e2f4ddSJiaxun Yang  */
971e2f4ddSJiaxun Yang #include <linux/cpufreq.h>
1071e2f4ddSJiaxun Yang #include <linux/errno.h>
1171e2f4ddSJiaxun Yang #include <linux/export.h>
1271e2f4ddSJiaxun Yang 
1371e2f4ddSJiaxun Yang #include <asm/mach-loongson2ef/loongson.h>
1471e2f4ddSJiaxun Yang 
1571e2f4ddSJiaxun Yang enum {
1671e2f4ddSJiaxun Yang 	DC_ZERO, DC_25PT = 2, DC_37PT, DC_50PT, DC_62PT, DC_75PT,
1771e2f4ddSJiaxun Yang 	DC_87PT, DC_DISABLE, DC_RESV
1871e2f4ddSJiaxun Yang };
1971e2f4ddSJiaxun Yang 
2071e2f4ddSJiaxun Yang struct cpufreq_frequency_table loongson2_clockmod_table[] = {
2171e2f4ddSJiaxun Yang 	{0, DC_RESV, CPUFREQ_ENTRY_INVALID},
2271e2f4ddSJiaxun Yang 	{0, DC_ZERO, CPUFREQ_ENTRY_INVALID},
2371e2f4ddSJiaxun Yang 	{0, DC_25PT, 0},
2471e2f4ddSJiaxun Yang 	{0, DC_37PT, 0},
2571e2f4ddSJiaxun Yang 	{0, DC_50PT, 0},
2671e2f4ddSJiaxun Yang 	{0, DC_62PT, 0},
2771e2f4ddSJiaxun Yang 	{0, DC_75PT, 0},
2871e2f4ddSJiaxun Yang 	{0, DC_87PT, 0},
2971e2f4ddSJiaxun Yang 	{0, DC_DISABLE, 0},
3071e2f4ddSJiaxun Yang 	{0, DC_RESV, CPUFREQ_TABLE_END},
3171e2f4ddSJiaxun Yang };
3271e2f4ddSJiaxun Yang EXPORT_SYMBOL_GPL(loongson2_clockmod_table);
3371e2f4ddSJiaxun Yang 
loongson2_cpu_set_rate(unsigned long rate_khz)34*c02e9630SArnd Bergmann int loongson2_cpu_set_rate(unsigned long rate_khz)
3571e2f4ddSJiaxun Yang {
3671e2f4ddSJiaxun Yang 	struct cpufreq_frequency_table *pos;
3771e2f4ddSJiaxun Yang 	int regval;
3871e2f4ddSJiaxun Yang 
3971e2f4ddSJiaxun Yang 	cpufreq_for_each_valid_entry(pos, loongson2_clockmod_table)
4071e2f4ddSJiaxun Yang 		if (rate_khz == pos->frequency)
4171e2f4ddSJiaxun Yang 			break;
4271e2f4ddSJiaxun Yang 	if (rate_khz != pos->frequency)
4371e2f4ddSJiaxun Yang 		return -ENOTSUPP;
4471e2f4ddSJiaxun Yang 
455831fdb0SJiaxun Yang 	regval = readl(LOONGSON_CHIPCFG);
4671e2f4ddSJiaxun Yang 	regval = (regval & ~0x7) | (pos->driver_data - 1);
475831fdb0SJiaxun Yang 	writel(regval, LOONGSON_CHIPCFG);
4871e2f4ddSJiaxun Yang 
49*c02e9630SArnd Bergmann 	return 0;
5071e2f4ddSJiaxun Yang }
51*c02e9630SArnd Bergmann EXPORT_SYMBOL_GPL(loongson2_cpu_set_rate);
52