2010-12-08 17:13:42 +03:00
/*
* Copyright ( C ) STMicroelectronics 2009
2012-11-28 14:27:44 +04:00
* Copyright ( C ) ST - Ericsson SA 2010 - 2012
2010-12-08 17:13:42 +03:00
*
* License Terms : GNU General Public License v2
* Author : Sundar Iyer < sundar . iyer @ stericsson . com >
* Author : Martin Persson < martin . persson @ stericsson . com >
* Author : Jonas Aaberg < jonas . aberg @ stericsson . com >
*/
2012-11-28 14:27:44 +04:00
2012-10-10 15:42:24 +04:00
# include <linux/module.h>
2010-12-08 17:13:42 +03:00
# include <linux/kernel.h>
# include <linux/cpufreq.h>
# include <linux/delay.h>
2011-05-15 21:19:51 +04:00
# include <linux/slab.h>
2012-10-10 15:42:24 +04:00
# include <linux/platform_device.h>
2012-10-10 15:42:29 +04:00
# include <linux/clk.h>
2010-12-08 17:13:42 +03:00
2012-10-10 15:42:25 +04:00
static struct cpufreq_frequency_table * freq_table ;
2012-10-10 15:42:29 +04:00
static struct clk * armss_clk ;
2011-05-15 21:19:51 +04:00
2012-12-10 19:25:38 +04:00
static int dbx500_cpufreq_target ( struct cpufreq_policy * policy ,
2013-10-25 18:15:48 +04:00
unsigned int index )
2010-12-08 17:13:42 +03:00
{
2012-10-10 15:42:29 +04:00
/* update armss clk frequency */
2013-08-14 18:08:24 +04:00
return clk_set_rate ( armss_clk , freq_table [ index ] . frequency * 1000 ) ;
2010-12-08 17:13:42 +03:00
}
2013-06-19 21:54:04 +04:00
static int dbx500_cpufreq_init ( struct cpufreq_policy * policy )
2010-12-08 17:13:42 +03:00
{
2014-01-09 19:08:43 +04:00
policy - > clk = armss_clk ;
2013-10-03 18:59:12 +04:00
return cpufreq_generic_init ( policy , freq_table , 20 * 1000 ) ;
2010-12-08 17:13:42 +03:00
}
2012-12-10 19:25:38 +04:00
static struct cpufreq_driver dbx500_cpufreq_driver = {
2013-12-03 09:50:45 +04:00
. flags = CPUFREQ_STICKY | CPUFREQ_CONST_LOOPS |
CPUFREQ_NEED_INITIAL_FREQ_CHECK ,
2013-10-03 18:58:03 +04:00
. verify = cpufreq_generic_frequency_table_verify ,
2013-10-25 18:15:48 +04:00
. target_index = dbx500_cpufreq_target ,
2014-01-09 19:08:43 +04:00
. get = cpufreq_generic_get ,
2012-12-10 19:25:38 +04:00
. init = dbx500_cpufreq_init ,
. name = " DBX500 " ,
2013-10-03 18:58:03 +04:00
. attr = cpufreq_generic_attr ,
2010-12-08 17:13:42 +03:00
} ;
2012-12-10 19:25:38 +04:00
static int dbx500_cpufreq_probe ( struct platform_device * pdev )
2012-10-10 15:42:24 +04:00
{
2014-04-26 00:15:38 +04:00
struct cpufreq_frequency_table * pos ;
2012-10-10 15:42:25 +04:00
2012-12-10 19:25:40 +04:00
freq_table = dev_get_platdata ( & pdev - > dev ) ;
2012-10-10 15:42:25 +04:00
if ( ! freq_table ) {
2012-12-10 19:25:38 +04:00
pr_err ( " dbx500-cpufreq: Failed to fetch cpufreq table \n " ) ;
2012-10-10 15:42:25 +04:00
return - ENODEV ;
}
2012-12-10 19:25:40 +04:00
armss_clk = clk_get ( & pdev - > dev , " armss " ) ;
if ( IS_ERR ( armss_clk ) ) {
2012-11-28 14:27:43 +04:00
pr_err ( " dbx500-cpufreq: Failed to get armss clk \n " ) ;
2012-12-10 19:25:40 +04:00
return PTR_ERR ( armss_clk ) ;
}
2012-11-28 14:27:43 +04:00
pr_info ( " dbx500-cpufreq: Available frequencies: \n " ) ;
2014-04-26 00:15:38 +04:00
cpufreq_for_each_entry ( pos , freq_table )
pr_info ( " %d Mhz \n " , pos - > frequency / 1000 ) ;
2012-12-10 19:25:40 +04:00
2012-12-10 19:25:38 +04:00
return cpufreq_register_driver ( & dbx500_cpufreq_driver ) ;
2012-10-10 15:42:24 +04:00
}
2012-12-10 19:25:38 +04:00
static struct platform_driver dbx500_cpufreq_plat_driver = {
2012-10-10 15:42:24 +04:00
. driver = {
2012-12-10 19:25:38 +04:00
. name = " cpufreq-ux500 " ,
2012-10-10 15:42:24 +04:00
. owner = THIS_MODULE ,
} ,
2012-12-10 19:25:38 +04:00
. probe = dbx500_cpufreq_probe ,
2012-10-10 15:42:24 +04:00
} ;
2012-12-10 19:25:38 +04:00
static int __init dbx500_cpufreq_register ( void )
2010-12-08 17:13:42 +03:00
{
2012-12-10 19:25:38 +04:00
return platform_driver_register ( & dbx500_cpufreq_plat_driver ) ;
2010-12-08 17:13:42 +03:00
}
2012-12-10 19:25:38 +04:00
device_initcall ( dbx500_cpufreq_register ) ;
2012-10-10 15:42:24 +04:00
MODULE_LICENSE ( " GPL v2 " ) ;
2012-12-10 19:25:38 +04:00
MODULE_DESCRIPTION ( " cpufreq driver for DBX500 " ) ;