1/* 2 * Copyright (C) STMicroelectronics 2009 3 * Copyright (C) ST-Ericsson SA 2010-2012 4 * 5 * License Terms: GNU General Public License v2 6 * Author: Sundar Iyer <sundar.iyer@stericsson.com> 7 * Author: Martin Persson <martin.persson@stericsson.com> 8 * Author: Jonas Aaberg <jonas.aberg@stericsson.com> 9 */ 10 11#include <linux/module.h> 12#include <linux/kernel.h> 13#include <linux/cpufreq.h> 14#include <linux/delay.h> 15#include <linux/slab.h> 16#include <linux/platform_device.h> 17#include <linux/clk.h> 18 19static struct cpufreq_frequency_table *freq_table; 20static struct clk *armss_clk; 21 22static int dbx500_cpufreq_target(struct cpufreq_policy *policy, 23 unsigned int index) 24{ 25 /* update armss clk frequency */ 26 return clk_set_rate(armss_clk, freq_table[index].frequency * 1000); 27} 28 29static int dbx500_cpufreq_init(struct cpufreq_policy *policy) 30{ 31 policy->clk = armss_clk; 32 return cpufreq_generic_init(policy, freq_table, 20 * 1000); 33} 34 35static struct cpufreq_driver dbx500_cpufreq_driver = { 36 .flags = CPUFREQ_STICKY | CPUFREQ_CONST_LOOPS | 37 CPUFREQ_NEED_INITIAL_FREQ_CHECK, 38 .verify = cpufreq_generic_frequency_table_verify, 39 .target_index = dbx500_cpufreq_target, 40 .get = cpufreq_generic_get, 41 .init = dbx500_cpufreq_init, 42 .name = "DBX500", 43 .attr = cpufreq_generic_attr, 44}; 45 46static int dbx500_cpufreq_probe(struct platform_device *pdev) 47{ 48 struct cpufreq_frequency_table *pos; 49 50 freq_table = dev_get_platdata(&pdev->dev); 51 if (!freq_table) { 52 pr_err("dbx500-cpufreq: Failed to fetch cpufreq table\n"); 53 return -ENODEV; 54 } 55 56 armss_clk = clk_get(&pdev->dev, "armss"); 57 if (IS_ERR(armss_clk)) { 58 pr_err("dbx500-cpufreq: Failed to get armss clk\n"); 59 return PTR_ERR(armss_clk); 60 } 61 62 pr_info("dbx500-cpufreq: Available frequencies:\n"); 63 cpufreq_for_each_entry(pos, freq_table) 64 pr_info(" %d Mhz\n", pos->frequency / 1000); 65 66 return cpufreq_register_driver(&dbx500_cpufreq_driver); 67} 68 69static struct platform_driver dbx500_cpufreq_plat_driver = { 70 .driver = { 71 .name = "cpufreq-ux500", 72 }, 73 .probe = dbx500_cpufreq_probe, 74}; 75 76static int __init dbx500_cpufreq_register(void) 77{ 78 return platform_driver_register(&dbx500_cpufreq_plat_driver); 79} 80device_initcall(dbx500_cpufreq_register); 81 82MODULE_LICENSE("GPL v2"); 83MODULE_DESCRIPTION("cpufreq driver for DBX500"); 84