Hello Rafael,
As you requested, here is a new version of the cpufreq-dt patches, rebased on top of the latest Linus tree (52d589a01d4545ce1dc5c3892bb8c7b55edfe714 as I write this).
Compared to version 2:
- Rebased on top of latest Linus tree.
- Removed PATCH 3/4, which is meant to go through the mvebu maintainer tree. I'll push it post-rc1.
- Added Acked-by tags from Viresh, since he ACKed all the patches.
Could you take those patches and push them to 3.18 ?
Thanks a lot,
Thomas
Thomas Petazzoni (3): cpufreq: allow driver-specific data cpufreq: cpufreq-dt: extend with platform_data cpufreq: cpufreq-dt: adjust message related to regulators
drivers/cpufreq/cpufreq-dt.c | 21 +++++++++++++++++---- drivers/cpufreq/cpufreq.c | 15 +++++++++++++++ include/linux/cpufreq-dt.h | 22 ++++++++++++++++++++++ include/linux/cpufreq.h | 2 ++ 4 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 include/linux/cpufreq-dt.h
This commit extends the cpufreq_driver structure with an additional 'void *driver_data' field that can be filled by the ->probe() function of a cpufreq driver to pass additional custom information to the driver itself.
A new function called cpufreq_get_driver_data() is added to allow a cpufreq driver to retrieve those driver data, since they are typically needed from a cpufreq_policy->init() callback, which does not have access to the cpufreq_driver structure. This function call is similar to the existing cpufreq_get_current_driver() function call.
Signed-off-by: Thomas Petazzoni thomas.petazzoni@free-electrons.com Acked-by: Viresh Kumar viresh.kumar@linaro.org --- drivers/cpufreq/cpufreq.c | 15 +++++++++++++++ include/linux/cpufreq.h | 2 ++ 2 files changed, 17 insertions(+)
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 24bf76f..058d6e0 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c @@ -1731,6 +1731,21 @@ const char *cpufreq_get_current_driver(void) } EXPORT_SYMBOL_GPL(cpufreq_get_current_driver);
+/** + * cpufreq_get_driver_data - return current driver data + * + * Return the private data of the currently loaded cpufreq + * driver, or NULL if no cpufreq driver is loaded. + */ +void *cpufreq_get_driver_data(void) +{ + if (cpufreq_driver) + return cpufreq_driver->driver_data; + + return NULL; +} +EXPORT_SYMBOL_GPL(cpufreq_get_driver_data); + /********************************************************************* * NOTIFIER LISTS INTERFACE * *********************************************************************/ diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h index 138336b..503b085 100644 --- a/include/linux/cpufreq.h +++ b/include/linux/cpufreq.h @@ -219,6 +219,7 @@ __ATTR(_name, 0644, show_##_name, store_##_name) struct cpufreq_driver { char name[CPUFREQ_NAME_LEN]; u8 flags; + void *driver_data;
/* needed by all drivers */ int (*init) (struct cpufreq_policy *policy); @@ -312,6 +313,7 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data); int cpufreq_unregister_driver(struct cpufreq_driver *driver_data);
const char *cpufreq_get_current_driver(void); +void *cpufreq_get_driver_data(void);
static inline void cpufreq_verify_within_limits(struct cpufreq_policy *policy, unsigned int min, unsigned int max)
This commit extends the cpufreq-dt driver to take a platform_data structure. This structure is for now used to tell the cpufreq-dt driver the layout of the clocks on the platform, i.e whether all CPUs share the same clock or whether each CPU has a separate clock.
Signed-off-by: Thomas Petazzoni thomas.petazzoni@free-electrons.com Acked-by: Viresh Kumar viresh.kumar@linaro.org --- drivers/cpufreq/cpufreq-dt.c | 17 +++++++++++++++-- include/linux/cpufreq-dt.h | 22 ++++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 include/linux/cpufreq-dt.h
diff --git a/drivers/cpufreq/cpufreq-dt.c b/drivers/cpufreq/cpufreq-dt.c index 6bbb8b9..52facda 100644 --- a/drivers/cpufreq/cpufreq-dt.c +++ b/drivers/cpufreq/cpufreq-dt.c @@ -18,6 +18,7 @@ #include <linux/cpu.h> #include <linux/cpu_cooling.h> #include <linux/cpufreq.h> +#include <linux/cpufreq-dt.h> #include <linux/cpumask.h> #include <linux/err.h> #include <linux/module.h> @@ -178,6 +179,7 @@ try_again:
static int cpufreq_init(struct cpufreq_policy *policy) { + struct cpufreq_dt_platform_data *pd; struct cpufreq_frequency_table *freq_table; struct thermal_cooling_device *cdev; struct device_node *np; @@ -265,9 +267,18 @@ static int cpufreq_init(struct cpufreq_policy *policy) policy->driver_data = priv;
policy->clk = cpu_clk; - ret = cpufreq_generic_init(policy, freq_table, transition_latency); - if (ret) + ret = cpufreq_table_validate_and_show(policy, freq_table); + if (ret) { + dev_err(cpu_dev, "%s: invalid frequency table: %d\n", __func__, + ret); goto out_cooling_unregister; + } + + policy->cpuinfo.transition_latency = transition_latency; + + pd = cpufreq_get_driver_data(); + if (pd && !pd->independent_clocks) + cpumask_setall(policy->cpus);
of_node_put(np);
@@ -335,6 +346,8 @@ static int dt_cpufreq_probe(struct platform_device *pdev) if (!IS_ERR(cpu_reg)) regulator_put(cpu_reg);
+ dt_cpufreq_driver.driver_data = dev_get_platdata(&pdev->dev); + ret = cpufreq_register_driver(&dt_cpufreq_driver); if (ret) dev_err(cpu_dev, "failed register driver: %d\n", ret); diff --git a/include/linux/cpufreq-dt.h b/include/linux/cpufreq-dt.h new file mode 100644 index 0000000..0414009 --- /dev/null +++ b/include/linux/cpufreq-dt.h @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2014 Marvell + * Thomas Petazzoni thomas.petazzoni@free-electrons.com + * + * 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. + */ + +#ifndef __CPUFREQ_DT_H__ +#define __CPUFREQ_DT_H__ + +struct cpufreq_dt_platform_data { + /* + * True when each CPU has its own clock to control its + * frequency, false when all CPUs are controlled by a single + * clock. + */ + bool independent_clocks; +}; + +#endif /* __CPUFREQ_DT_H__ */
The cpufreq-dt driver tries to get a regulator for each CPU. This regulator is optional, but when not present, a scary message "failed to get cpuX regulator" is displayed. To solve this, we reduce the severity of the message from dev_warn() to dev_dbg() and we reword the message to not be as scary.
Signed-off-by: Thomas Petazzoni thomas.petazzoni@free-electrons.com Acked-by: Viresh Kumar viresh.kumar@linaro.org --- drivers/cpufreq/cpufreq-dt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/cpufreq/cpufreq-dt.c b/drivers/cpufreq/cpufreq-dt.c index 52facda..92c162a 100644 --- a/drivers/cpufreq/cpufreq-dt.c +++ b/drivers/cpufreq/cpufreq-dt.c @@ -147,8 +147,8 @@ try_again: goto try_again; }
- dev_warn(cpu_dev, "failed to get cpu%d regulator: %ld\n", - cpu, PTR_ERR(cpu_reg)); + dev_dbg(cpu_dev, "no regulator for cpu%d: %ld\n", + cpu, PTR_ERR(cpu_reg)); }
cpu_clk = clk_get(cpu_dev, NULL);
On Sunday, October 19, 2014 11:30:26 AM Thomas Petazzoni wrote:
Hello Rafael,
As you requested, here is a new version of the cpufreq-dt patches, rebased on top of the latest Linus tree (52d589a01d4545ce1dc5c3892bb8c7b55edfe714 as I write this).
Compared to version 2:
Rebased on top of latest Linus tree.
Removed PATCH 3/4, which is meant to go through the mvebu maintainer tree. I'll push it post-rc1.
Added Acked-by tags from Viresh, since he ACKed all the patches.
Could you take those patches and push them to 3.18 ?
I've applied the series and it is in my linux-next branch now (which means that it should appear in linux-next proper tomorrow).
I'm going to push it for 3.18-rc2.
Dear Rafael J. Wysocki,
On Tue, 21 Oct 2014 15:33:09 +0200, Rafael J. Wysocki wrote:
On Sunday, October 19, 2014 11:30:26 AM Thomas Petazzoni wrote:
Hello Rafael,
As you requested, here is a new version of the cpufreq-dt patches, rebased on top of the latest Linus tree (52d589a01d4545ce1dc5c3892bb8c7b55edfe714 as I write this).
Compared to version 2:
Rebased on top of latest Linus tree.
Removed PATCH 3/4, which is meant to go through the mvebu maintainer tree. I'll push it post-rc1.
Added Acked-by tags from Viresh, since he ACKed all the patches.
Could you take those patches and push them to 3.18 ?
I've applied the series and it is in my linux-next branch now (which means that it should appear in linux-next proper tomorrow).
I'm going to push it for 3.18-rc2.
Thanks a lot! I'll push the mvebu part of the series separately through the mvebu maintainers.
Best regards,
Thomas Petazzoni
On Tue, Oct 21, 2014 at 3:33 PM, Rafael J. Wysocki rjw@rjwysocki.net wrote:
On Sunday, October 19, 2014 11:30:26 AM Thomas Petazzoni wrote:
Hello Rafael,
As you requested, here is a new version of the cpufreq-dt patches, rebased on top of the latest Linus tree (52d589a01d4545ce1dc5c3892bb8c7b55edfe714 as I write this).
Compared to version 2:
Rebased on top of latest Linus tree.
Removed PATCH 3/4, which is meant to go through the mvebu maintainer tree. I'll push it post-rc1.
Added Acked-by tags from Viresh, since he ACKed all the patches.
Could you take those patches and push them to 3.18 ?
I've applied the series and it is in my linux-next branch now (which means that it should appear in linux-next proper tomorrow).
I'm going to push it for 3.18-rc2.
Unfortunately this caused a regression (crash). Fix available in https://lkml.org/lkml/2014/10/27/361
Gr{oetje,eeting}s,
Geert
-- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds
linaro-kernel@lists.linaro.org