2011-02-26 15:23:59 +03:00
/*
2013-04-04 16:54:23 +04:00
* clock scaling for the UniCore - II
2011-02-26 15:23:59 +03:00
*
* Code specific to PKUnity SoC and UniCore ISA
*
* Maintained by GUAN Xue - tao < gxt @ mprc . pku . edu . cn >
* Copyright ( C ) 2001 - 2010 Guan Xuetao
*
* 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 .
*/
2014-01-09 19:08:43 +04:00
# include <linux/err.h>
2011-02-26 15:23:59 +03:00
# include <linux/kernel.h>
# include <linux/types.h>
# include <linux/init.h>
# include <linux/clk.h>
# include <linux/cpufreq.h>
# include <mach/hardware.h>
static struct cpufreq_driver ucv2_driver ;
/* make sure that only the "userspace" governor is run
* - - anything else wouldn ' t make sense on this platform , anyway .
*/
2013-08-09 11:14:51 +04:00
static int ucv2_verify_speed ( struct cpufreq_policy * policy )
2011-02-26 15:23:59 +03:00
{
if ( policy - > cpu )
return - EINVAL ;
2013-10-02 12:43:19 +04:00
cpufreq_verify_within_cpu_limits ( policy ) ;
2011-02-26 15:23:59 +03:00
return 0 ;
}
static int ucv2_target ( struct cpufreq_policy * policy ,
unsigned int target_freq ,
unsigned int relation )
{
struct cpufreq_freqs freqs ;
2013-12-02 09:34:13 +04:00
int ret ;
2011-02-26 15:23:59 +03:00
2013-12-02 09:34:13 +04:00
freqs . old = policy - > cur ;
freqs . new = target_freq ;
2011-02-26 15:23:59 +03:00
2014-03-24 12:05:45 +04:00
cpufreq_freq_transition_begin ( policy , & freqs ) ;
2014-04-07 16:04:21 +04:00
ret = clk_set_rate ( policy - > clk , target_freq * 1000 ) ;
2014-03-24 12:05:45 +04:00
cpufreq_freq_transition_end ( policy , & freqs , ret ) ;
2011-02-26 15:23:59 +03:00
2013-12-02 09:34:13 +04:00
return ret ;
2011-02-26 15:23:59 +03:00
}
static int __init ucv2_cpu_init ( struct cpufreq_policy * policy )
{
if ( policy - > cpu ! = 0 )
return - EINVAL ;
2014-01-09 19:08:43 +04:00
2011-02-26 15:23:59 +03:00
policy - > min = policy - > cpuinfo . min_freq = 250000 ;
policy - > max = policy - > cpuinfo . max_freq = 1000000 ;
policy - > cpuinfo . transition_latency = CPUFREQ_ETERNAL ;
2014-01-09 19:08:43 +04:00
policy - > clk = clk_get ( NULL , " MAIN_CLK " ) ;
2014-04-11 11:59:38 +04:00
return PTR_ERR_OR_ZERO ( policy - > clk ) ;
2011-02-26 15:23:59 +03:00
}
static struct cpufreq_driver ucv2_driver = {
. flags = CPUFREQ_STICKY ,
. verify = ucv2_verify_speed ,
. target = ucv2_target ,
2014-01-09 19:08:43 +04:00
. get = cpufreq_generic_get ,
2011-02-26 15:23:59 +03:00
. init = ucv2_cpu_init ,
. name = " UniCore-II " ,
} ;
static int __init ucv2_cpufreq_init ( void )
{
return cpufreq_register_driver ( & ucv2_driver ) ;
}
arch_initcall ( ucv2_cpufreq_init ) ;