2010-12-08 15:13:42 +01:00
/*
* Copyright ( C ) STMicroelectronics 2009
2012-11-28 11:27:44 +01:00
* Copyright ( C ) ST - Ericsson SA 2010 - 2012
2010-12-08 15:13:42 +01: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 11:27:44 +01:00
2012-10-10 13:42:24 +02:00
# include <linux/module.h>
2010-12-08 15:13:42 +01:00
# include <linux/kernel.h>
# include <linux/cpufreq.h>
# include <linux/delay.h>
2011-05-15 19:19:51 +02:00
# include <linux/slab.h>
2012-10-10 13:42:24 +02:00
# include <linux/platform_device.h>
2012-10-10 13:42:29 +02:00
# include <linux/clk.h>
2010-12-08 15:13:42 +01:00
2012-10-10 13:42:25 +02:00
static struct cpufreq_frequency_table * freq_table ;
2012-10-10 13:42:29 +02:00
static struct clk * armss_clk ;
2011-05-15 19:19:51 +02:00
2012-12-10 16:25:38 +01:00
static int dbx500_cpufreq_target ( struct cpufreq_policy * policy ,
2013-10-25 19:45:48 +05:30
unsigned int index )
2010-12-08 15:13:42 +01:00
{
2012-10-10 13:42:29 +02:00
/* update armss clk frequency */
2013-08-14 19:38:24 +05:30
return clk_set_rate ( armss_clk , freq_table [ index ] . frequency * 1000 ) ;
2010-12-08 15:13:42 +01:00
}
2013-06-19 13:54:04 -04:00
static int dbx500_cpufreq_init ( struct cpufreq_policy * policy )
2010-12-08 15:13:42 +01:00
{
2014-01-09 20:38:43 +05:30
policy - > clk = armss_clk ;
2013-10-03 20:29:12 +05:30
return cpufreq_generic_init ( policy , freq_table , 20 * 1000 ) ;
2010-12-08 15:13:42 +01:00
}
2012-12-10 16:25:38 +01:00
static struct cpufreq_driver dbx500_cpufreq_driver = {
2013-12-03 11:20:45 +05:30
. flags = CPUFREQ_STICKY | CPUFREQ_CONST_LOOPS |
CPUFREQ_NEED_INITIAL_FREQ_CHECK ,
2013-10-03 20:28:03 +05:30
. verify = cpufreq_generic_frequency_table_verify ,
2013-10-25 19:45:48 +05:30
. target_index = dbx500_cpufreq_target ,
2014-01-09 20:38:43 +05:30
. get = cpufreq_generic_get ,
2012-12-10 16:25:38 +01:00
. init = dbx500_cpufreq_init ,
. name = " DBX500 " ,
2013-10-03 20:28:03 +05:30
. attr = cpufreq_generic_attr ,
2010-12-08 15:13:42 +01:00
} ;
2012-12-10 16:25:38 +01:00
static int dbx500_cpufreq_probe ( struct platform_device * pdev )
2012-10-10 13:42:24 +02:00
{
2014-04-25 23:15:38 +03:00
struct cpufreq_frequency_table * pos ;
2012-10-10 13:42:25 +02:00
2012-12-10 16:25:40 +01:00
freq_table = dev_get_platdata ( & pdev - > dev ) ;
2012-10-10 13:42:25 +02:00
if ( ! freq_table ) {
2012-12-10 16:25:38 +01:00
pr_err ( " dbx500-cpufreq: Failed to fetch cpufreq table \n " ) ;
2012-10-10 13:42:25 +02:00
return - ENODEV ;
}
2012-12-10 16:25:40 +01:00
armss_clk = clk_get ( & pdev - > dev , " armss " ) ;
if ( IS_ERR ( armss_clk ) ) {
2012-11-28 11:27:43 +01:00
pr_err ( " dbx500-cpufreq: Failed to get armss clk \n " ) ;
2012-12-10 16:25:40 +01:00
return PTR_ERR ( armss_clk ) ;
}
2012-11-28 11:27:43 +01:00
pr_info ( " dbx500-cpufreq: Available frequencies: \n " ) ;
2014-04-25 23:15:38 +03:00
cpufreq_for_each_entry ( pos , freq_table )
pr_info ( " %d Mhz \n " , pos - > frequency / 1000 ) ;
2012-12-10 16:25:40 +01:00
2012-12-10 16:25:38 +01:00
return cpufreq_register_driver ( & dbx500_cpufreq_driver ) ;
2012-10-10 13:42:24 +02:00
}
2012-12-10 16:25:38 +01:00
static struct platform_driver dbx500_cpufreq_plat_driver = {
2012-10-10 13:42:24 +02:00
. driver = {
2012-12-10 16:25:38 +01:00
. name = " cpufreq-ux500 " ,
2012-10-10 13:42:24 +02:00
} ,
2012-12-10 16:25:38 +01:00
. probe = dbx500_cpufreq_probe ,
2012-10-10 13:42:24 +02:00
} ;
2012-12-10 16:25:38 +01:00
static int __init dbx500_cpufreq_register ( void )
2010-12-08 15:13:42 +01:00
{
2012-12-10 16:25:38 +01:00
return platform_driver_register ( & dbx500_cpufreq_plat_driver ) ;
2010-12-08 15:13:42 +01:00
}
2012-12-10 16:25:38 +01:00
device_initcall ( dbx500_cpufreq_register ) ;
2012-10-10 13:42:24 +02:00
MODULE_LICENSE ( " GPL v2 " ) ;
2012-12-10 16:25:38 +01:00
MODULE_DESCRIPTION ( " cpufreq driver for DBX500 " ) ;