Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.13-rc3 100 lines 2.7 kB view raw
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 unsigned int dbx500_cpufreq_getspeed(unsigned int cpu) 30{ 31 int i = 0; 32 unsigned long freq = clk_get_rate(armss_clk) / 1000; 33 34 /* The value is rounded to closest frequency in the defined table. */ 35 while (freq_table[i + 1].frequency != CPUFREQ_TABLE_END) { 36 if (freq < freq_table[i].frequency + 37 (freq_table[i + 1].frequency - freq_table[i].frequency) / 2) 38 return freq_table[i].frequency; 39 i++; 40 } 41 42 return freq_table[i].frequency; 43} 44 45static int dbx500_cpufreq_init(struct cpufreq_policy *policy) 46{ 47 return cpufreq_generic_init(policy, freq_table, 20 * 1000); 48} 49 50static struct cpufreq_driver dbx500_cpufreq_driver = { 51 .flags = CPUFREQ_STICKY | CPUFREQ_CONST_LOOPS, 52 .verify = cpufreq_generic_frequency_table_verify, 53 .target_index = dbx500_cpufreq_target, 54 .get = dbx500_cpufreq_getspeed, 55 .init = dbx500_cpufreq_init, 56 .name = "DBX500", 57 .attr = cpufreq_generic_attr, 58}; 59 60static int dbx500_cpufreq_probe(struct platform_device *pdev) 61{ 62 int i = 0; 63 64 freq_table = dev_get_platdata(&pdev->dev); 65 if (!freq_table) { 66 pr_err("dbx500-cpufreq: Failed to fetch cpufreq table\n"); 67 return -ENODEV; 68 } 69 70 armss_clk = clk_get(&pdev->dev, "armss"); 71 if (IS_ERR(armss_clk)) { 72 pr_err("dbx500-cpufreq: Failed to get armss clk\n"); 73 return PTR_ERR(armss_clk); 74 } 75 76 pr_info("dbx500-cpufreq: Available frequencies:\n"); 77 while (freq_table[i].frequency != CPUFREQ_TABLE_END) { 78 pr_info(" %d Mhz\n", freq_table[i].frequency/1000); 79 i++; 80 } 81 82 return cpufreq_register_driver(&dbx500_cpufreq_driver); 83} 84 85static struct platform_driver dbx500_cpufreq_plat_driver = { 86 .driver = { 87 .name = "cpufreq-ux500", 88 .owner = THIS_MODULE, 89 }, 90 .probe = dbx500_cpufreq_probe, 91}; 92 93static int __init dbx500_cpufreq_register(void) 94{ 95 return platform_driver_register(&dbx500_cpufreq_plat_driver); 96} 97device_initcall(dbx500_cpufreq_register); 98 99MODULE_LICENSE("GPL v2"); 100MODULE_DESCRIPTION("cpufreq driver for DBX500");