From 5969835edfb72d6a848899ec9b0126cdb3f9124c Mon Sep 17 00:00:00 2001 From: Viresh Kumar Date: Sat, 1 Dec 2012 17:16:02 +0530 Subject: cpufreq: arm_big_little: Get freq table from platform specific driver Every platform have different way to get available frequencies from boot loaders. Vexpress platform gets this information from SPC controller. This patch separates out platform specific part for getting cpufreq table from arm big LITTLE cpufreq driver. Every platform can pass this information from their own stubs to this driver. Signed-off-by: Viresh Kumar --- drivers/cpufreq/vexpress_big_little.c | 63 +++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 drivers/cpufreq/vexpress_big_little.c (limited to 'drivers/cpufreq/vexpress_big_little.c') diff --git a/drivers/cpufreq/vexpress_big_little.c b/drivers/cpufreq/vexpress_big_little.c new file mode 100644 index 00000000000..1b44ae2ad36 --- /dev/null +++ b/drivers/cpufreq/vexpress_big_little.c @@ -0,0 +1,63 @@ +/* + * Vexpress big.LITTLE CPUFreq Interface driver + * + * It provides necessary ops to arm_big_little cpufreq driver and gets + * information from spc controller. + * + * Copyright (C) 2012 ARM Ltd. + * Author: Sudeep KarkadaNagesha + * + * Copyright (C) 2012 Linaro. + * Viresh Kumar + * + * 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. + * + * This program is distributed "as is" WITHOUT ANY WARRANTY of any + * kind, whether express or implied; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include "arm_big_little.h" + +static struct cpufreq_frequency_table *vexpress_get_freq_tbl(u32 cluster, + int *count) +{ + unsigned int *table = vexpress_spc_get_freq_table(cluster, count); + + if (!table || !*count) { + pr_err("SPC controller returned invalid freq table"); + return NULL; + } + + return arm_bl_copy_table_from_array(table, *count); +} + +static void vexpress_put_freq_tbl(u32 cluster) +{ + arm_bl_free_freq_table(cluster); +} + +static struct cpufreq_arm_bl_ops vexpress_bl_ops = { + .get_freq_tbl = vexpress_get_freq_tbl, + .put_freq_tbl = vexpress_put_freq_tbl, +}; + +struct cpufreq_arm_bl_ops *vexpress_bl_get_ops(void) +{ + if (!vexpress_spc_check_loaded()) { + pr_info("No SPC found\n"); + return NULL; + } + + return &vexpress_bl_ops; +} +EXPORT_SYMBOL_GPL(vexpress_bl_get_ops); -- cgit v1.2.3 From 81ac613e2140039350f4224cba73c3935e6ea509 Mon Sep 17 00:00:00 2001 From: Viresh Kumar Date: Fri, 21 Dec 2012 12:25:22 +0530 Subject: cpufreq: arm_big_little: Remove all platform drivers dependencies Currently, we need to add entry for any new platform using this driver in compatible list of arm_big_little.c driver. Which is not good. Lets make this driver independent of slave drivers. Now, slave drivers would be calling register routine of arm_big_little.c driver and would pass ops as parameter. Signed-off-by: Viresh Kumar --- drivers/cpufreq/vexpress_big_little.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) (limited to 'drivers/cpufreq/vexpress_big_little.c') diff --git a/drivers/cpufreq/vexpress_big_little.c b/drivers/cpufreq/vexpress_big_little.c index 1b44ae2ad36..81080b1f437 100644 --- a/drivers/cpufreq/vexpress_big_little.c +++ b/drivers/cpufreq/vexpress_big_little.c @@ -24,6 +24,7 @@ #include #include +#include #include #include #include "arm_big_little.h" @@ -47,17 +48,27 @@ static void vexpress_put_freq_tbl(u32 cluster) } static struct cpufreq_arm_bl_ops vexpress_bl_ops = { + .name = "vexpress-bl", .get_freq_tbl = vexpress_get_freq_tbl, .put_freq_tbl = vexpress_put_freq_tbl, }; -struct cpufreq_arm_bl_ops *vexpress_bl_get_ops(void) +static int vexpress_bl_init(void) { if (!vexpress_spc_check_loaded()) { - pr_info("No SPC found\n"); - return NULL; + pr_info("%s: No SPC found\n", __func__); + return -ENOENT; } - return &vexpress_bl_ops; + return bl_cpufreq_register(&vexpress_bl_ops); } -EXPORT_SYMBOL_GPL(vexpress_bl_get_ops); +module_init(vexpress_bl_init); + +static void vexpress_bl_exit(void) +{ + return bl_cpufreq_unregister(&vexpress_bl_ops); +} +module_exit(vexpress_bl_exit); + +MODULE_DESCRIPTION("ARM Vexpress big LITTLE cpufreq driver"); +MODULE_LICENSE("GPL"); -- cgit v1.2.3 From a3cafa7631efb9d73c00ceb56e54eacba7104556 Mon Sep 17 00:00:00 2001 From: Viresh Kumar Date: Sat, 12 Jan 2013 21:11:53 +0530 Subject: cpufreq: ARM big LITTLE: Replace "bl" with standard shortname "bL" Throughout Linux code big LITTLE is written as "bL". We have used "bl" instead of "bL". Lets fix it. Signed-off-by: Viresh Kumar Reported-by: Nicolas Pitre --- drivers/cpufreq/vexpress_big_little.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'drivers/cpufreq/vexpress_big_little.c') diff --git a/drivers/cpufreq/vexpress_big_little.c b/drivers/cpufreq/vexpress_big_little.c index 81080b1f437..66648c3fc94 100644 --- a/drivers/cpufreq/vexpress_big_little.c +++ b/drivers/cpufreq/vexpress_big_little.c @@ -39,36 +39,36 @@ static struct cpufreq_frequency_table *vexpress_get_freq_tbl(u32 cluster, return NULL; } - return arm_bl_copy_table_from_array(table, *count); + return arm_bL_copy_table_from_array(table, *count); } static void vexpress_put_freq_tbl(u32 cluster) { - arm_bl_free_freq_table(cluster); + arm_bL_free_freq_table(cluster); } -static struct cpufreq_arm_bl_ops vexpress_bl_ops = { - .name = "vexpress-bl", +static struct cpufreq_arm_bL_ops vexpress_bL_ops = { + .name = "vexpress-bL", .get_freq_tbl = vexpress_get_freq_tbl, .put_freq_tbl = vexpress_put_freq_tbl, }; -static int vexpress_bl_init(void) +static int vexpress_bL_init(void) { if (!vexpress_spc_check_loaded()) { pr_info("%s: No SPC found\n", __func__); return -ENOENT; } - return bl_cpufreq_register(&vexpress_bl_ops); + return bL_cpufreq_register(&vexpress_bL_ops); } -module_init(vexpress_bl_init); +module_init(vexpress_bL_init); -static void vexpress_bl_exit(void) +static void vexpress_bL_exit(void) { - return bl_cpufreq_unregister(&vexpress_bl_ops); + return bL_cpufreq_unregister(&vexpress_bL_ops); } -module_exit(vexpress_bl_exit); +module_exit(vexpress_bL_exit); MODULE_DESCRIPTION("ARM Vexpress big LITTLE cpufreq driver"); MODULE_LICENSE("GPL"); -- cgit v1.2.3