linux/drivers/cpufreq/unicore2-cpufreq.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * clock scaling for the UniCore-II
   4 *
   5 * Code specific to PKUnity SoC and UniCore ISA
   6 *
   7 *      Maintained by GUAN Xue-tao <gxt@mprc.pku.edu.cn>
   8 *      Copyright (C) 2001-2010 Guan Xuetao
   9 */
  10
  11#include <linux/err.h>
  12#include <linux/kernel.h>
  13#include <linux/types.h>
  14#include <linux/init.h>
  15#include <linux/clk.h>
  16#include <linux/cpufreq.h>
  17
  18#include <mach/hardware.h>
  19
  20static struct cpufreq_driver ucv2_driver;
  21
  22/* make sure that only the "userspace" governor is run
  23 * -- anything else wouldn't make sense on this platform, anyway.
  24 */
  25static int ucv2_verify_speed(struct cpufreq_policy *policy)
  26{
  27        if (policy->cpu)
  28                return -EINVAL;
  29
  30        cpufreq_verify_within_cpu_limits(policy);
  31        return 0;
  32}
  33
  34static int ucv2_target(struct cpufreq_policy *policy,
  35                         unsigned int target_freq,
  36                         unsigned int relation)
  37{
  38        struct cpufreq_freqs freqs;
  39        int ret;
  40
  41        freqs.old = policy->cur;
  42        freqs.new = target_freq;
  43
  44        cpufreq_freq_transition_begin(policy, &freqs);
  45        ret = clk_set_rate(policy->clk, target_freq * 1000);
  46        cpufreq_freq_transition_end(policy, &freqs, ret);
  47
  48        return ret;
  49}
  50
  51static int __init ucv2_cpu_init(struct cpufreq_policy *policy)
  52{
  53        if (policy->cpu != 0)
  54                return -EINVAL;
  55
  56        policy->min = policy->cpuinfo.min_freq = 250000;
  57        policy->max = policy->cpuinfo.max_freq = 1000000;
  58        policy->clk = clk_get(NULL, "MAIN_CLK");
  59        return PTR_ERR_OR_ZERO(policy->clk);
  60}
  61
  62static struct cpufreq_driver ucv2_driver = {
  63        .flags          = CPUFREQ_STICKY | CPUFREQ_NO_AUTO_DYNAMIC_SWITCHING,
  64        .verify         = ucv2_verify_speed,
  65        .target         = ucv2_target,
  66        .get            = cpufreq_generic_get,
  67        .init           = ucv2_cpu_init,
  68        .name           = "UniCore-II",
  69};
  70
  71static int __init ucv2_cpufreq_init(void)
  72{
  73        return cpufreq_register_driver(&ucv2_driver);
  74}
  75
  76arch_initcall(ucv2_cpufreq_init);
  77