162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * Copyright (C) 2006 - 2008 Lemote Inc. & Institute of Computing Technology 362306a36Sopenharmony_ci * Author: Yanhua, yanh@lemote.com 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * This file is subject to the terms and conditions of the GNU General Public 662306a36Sopenharmony_ci * License. See the file "COPYING" in the main directory of this archive 762306a36Sopenharmony_ci * for more details. 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci#include <linux/cpufreq.h> 1062306a36Sopenharmony_ci#include <linux/errno.h> 1162306a36Sopenharmony_ci#include <linux/export.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <asm/mach-loongson2ef/loongson.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_cienum { 1662306a36Sopenharmony_ci DC_ZERO, DC_25PT = 2, DC_37PT, DC_50PT, DC_62PT, DC_75PT, 1762306a36Sopenharmony_ci DC_87PT, DC_DISABLE, DC_RESV 1862306a36Sopenharmony_ci}; 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_cistruct cpufreq_frequency_table loongson2_clockmod_table[] = { 2162306a36Sopenharmony_ci {0, DC_RESV, CPUFREQ_ENTRY_INVALID}, 2262306a36Sopenharmony_ci {0, DC_ZERO, CPUFREQ_ENTRY_INVALID}, 2362306a36Sopenharmony_ci {0, DC_25PT, 0}, 2462306a36Sopenharmony_ci {0, DC_37PT, 0}, 2562306a36Sopenharmony_ci {0, DC_50PT, 0}, 2662306a36Sopenharmony_ci {0, DC_62PT, 0}, 2762306a36Sopenharmony_ci {0, DC_75PT, 0}, 2862306a36Sopenharmony_ci {0, DC_87PT, 0}, 2962306a36Sopenharmony_ci {0, DC_DISABLE, 0}, 3062306a36Sopenharmony_ci {0, DC_RESV, CPUFREQ_TABLE_END}, 3162306a36Sopenharmony_ci}; 3262306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(loongson2_clockmod_table); 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ciint loongson2_cpu_set_rate(unsigned long rate_khz) 3562306a36Sopenharmony_ci{ 3662306a36Sopenharmony_ci struct cpufreq_frequency_table *pos; 3762306a36Sopenharmony_ci int regval; 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci cpufreq_for_each_valid_entry(pos, loongson2_clockmod_table) 4062306a36Sopenharmony_ci if (rate_khz == pos->frequency) 4162306a36Sopenharmony_ci break; 4262306a36Sopenharmony_ci if (rate_khz != pos->frequency) 4362306a36Sopenharmony_ci return -ENOTSUPP; 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci regval = readl(LOONGSON_CHIPCFG); 4662306a36Sopenharmony_ci regval = (regval & ~0x7) | (pos->driver_data - 1); 4762306a36Sopenharmony_ci writel(regval, LOONGSON_CHIPCFG); 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci return 0; 5062306a36Sopenharmony_ci} 5162306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(loongson2_cpu_set_rate); 52