Merge back cpufreq changes for v4.12.
This commit is contained in:
commit
69a07f1803
|
@ -3450,6 +3450,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git
|
||||||
T: git git://git.linaro.org/people/vireshk/linux.git (For ARM Updates)
|
T: git git://git.linaro.org/people/vireshk/linux.git (For ARM Updates)
|
||||||
B: https://bugzilla.kernel.org
|
B: https://bugzilla.kernel.org
|
||||||
F: Documentation/cpu-freq/
|
F: Documentation/cpu-freq/
|
||||||
|
F: Documentation/devicetree/bindings/cpufreq/
|
||||||
F: drivers/cpufreq/
|
F: drivers/cpufreq/
|
||||||
F: include/linux/cpufreq.h
|
F: include/linux/cpufreq.h
|
||||||
F: tools/testing/selftests/cpufreq/
|
F: tools/testing/selftests/cpufreq/
|
||||||
|
|
|
@ -1170,11 +1170,6 @@
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
cpufreq-cooling {
|
|
||||||
compatible = "stericsson,db8500-cpufreq-cooling";
|
|
||||||
status = "disabled";
|
|
||||||
};
|
|
||||||
|
|
||||||
mcde@a0350000 {
|
mcde@a0350000 {
|
||||||
compatible = "stericsson,mcde";
|
compatible = "stericsson,mcde";
|
||||||
reg = <0xa0350000 0x1000>, /* MCDE */
|
reg = <0xa0350000 0x1000>, /* MCDE */
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/cpufreq.h>
|
#include <linux/cpufreq.h>
|
||||||
|
#include <linux/cpu_cooling.h>
|
||||||
#include <linux/delay.h>
|
#include <linux/delay.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
|
@ -18,6 +19,7 @@
|
||||||
|
|
||||||
static struct cpufreq_frequency_table *freq_table;
|
static struct cpufreq_frequency_table *freq_table;
|
||||||
static struct clk *armss_clk;
|
static struct clk *armss_clk;
|
||||||
|
static struct thermal_cooling_device *cdev;
|
||||||
|
|
||||||
static int dbx500_cpufreq_target(struct cpufreq_policy *policy,
|
static int dbx500_cpufreq_target(struct cpufreq_policy *policy,
|
||||||
unsigned int index)
|
unsigned int index)
|
||||||
|
@ -32,6 +34,22 @@ static int dbx500_cpufreq_init(struct cpufreq_policy *policy)
|
||||||
return cpufreq_generic_init(policy, freq_table, 20 * 1000);
|
return cpufreq_generic_init(policy, freq_table, 20 * 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int dbx500_cpufreq_exit(struct cpufreq_policy *policy)
|
||||||
|
{
|
||||||
|
if (!IS_ERR(cdev))
|
||||||
|
cpufreq_cooling_unregister(cdev);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dbx500_cpufreq_ready(struct cpufreq_policy *policy)
|
||||||
|
{
|
||||||
|
cdev = cpufreq_cooling_register(policy->cpus);
|
||||||
|
if (IS_ERR(cdev))
|
||||||
|
pr_err("Failed to register cooling device %ld\n", PTR_ERR(cdev));
|
||||||
|
else
|
||||||
|
pr_info("Cooling device registered: %s\n", cdev->type);
|
||||||
|
}
|
||||||
|
|
||||||
static struct cpufreq_driver dbx500_cpufreq_driver = {
|
static struct cpufreq_driver dbx500_cpufreq_driver = {
|
||||||
.flags = CPUFREQ_STICKY | CPUFREQ_CONST_LOOPS |
|
.flags = CPUFREQ_STICKY | CPUFREQ_CONST_LOOPS |
|
||||||
CPUFREQ_NEED_INITIAL_FREQ_CHECK,
|
CPUFREQ_NEED_INITIAL_FREQ_CHECK,
|
||||||
|
@ -39,6 +57,8 @@ static struct cpufreq_driver dbx500_cpufreq_driver = {
|
||||||
.target_index = dbx500_cpufreq_target,
|
.target_index = dbx500_cpufreq_target,
|
||||||
.get = cpufreq_generic_get,
|
.get = cpufreq_generic_get,
|
||||||
.init = dbx500_cpufreq_init,
|
.init = dbx500_cpufreq_init,
|
||||||
|
.exit = dbx500_cpufreq_exit,
|
||||||
|
.ready = dbx500_cpufreq_ready,
|
||||||
.name = "DBX500",
|
.name = "DBX500",
|
||||||
.attr = cpufreq_generic_attr,
|
.attr = cpufreq_generic_attr,
|
||||||
};
|
};
|
||||||
|
|
|
@ -573,14 +573,33 @@ static struct platform_driver mt8173_cpufreq_platdrv = {
|
||||||
.probe = mt8173_cpufreq_probe,
|
.probe = mt8173_cpufreq_probe,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int mt8173_cpufreq_driver_init(void)
|
/* List of machines supported by this driver */
|
||||||
|
static const struct of_device_id mt8173_cpufreq_machines[] __initconst = {
|
||||||
|
{ .compatible = "mediatek,mt817x", },
|
||||||
|
{ .compatible = "mediatek,mt8173", },
|
||||||
|
{ .compatible = "mediatek,mt8176", },
|
||||||
|
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __init mt8173_cpufreq_driver_init(void)
|
||||||
{
|
{
|
||||||
|
struct device_node *np;
|
||||||
|
const struct of_device_id *match;
|
||||||
struct platform_device *pdev;
|
struct platform_device *pdev;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (!of_machine_is_compatible("mediatek,mt8173"))
|
np = of_find_node_by_path("/");
|
||||||
|
if (!np)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
|
match = of_match_node(mt8173_cpufreq_machines, np);
|
||||||
|
of_node_put(np);
|
||||||
|
if (!match) {
|
||||||
|
pr_warn("Machine is not compatible with mt8173-cpufreq\n");
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
err = platform_driver_register(&mt8173_cpufreq_platdrv);
|
err = platform_driver_register(&mt8173_cpufreq_platdrv);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
|
@ -52,17 +52,27 @@ static u32 get_bus_freq(void)
|
||||||
{
|
{
|
||||||
struct device_node *soc;
|
struct device_node *soc;
|
||||||
u32 sysfreq;
|
u32 sysfreq;
|
||||||
|
struct clk *pltclk;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
/* get platform freq by searching bus-frequency property */
|
||||||
soc = of_find_node_by_type(NULL, "soc");
|
soc = of_find_node_by_type(NULL, "soc");
|
||||||
if (!soc)
|
if (soc) {
|
||||||
return 0;
|
ret = of_property_read_u32(soc, "bus-frequency", &sysfreq);
|
||||||
|
|
||||||
if (of_property_read_u32(soc, "bus-frequency", &sysfreq))
|
|
||||||
sysfreq = 0;
|
|
||||||
|
|
||||||
of_node_put(soc);
|
of_node_put(soc);
|
||||||
|
if (!ret)
|
||||||
return sysfreq;
|
return sysfreq;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* get platform freq by its clock name */
|
||||||
|
pltclk = clk_get(NULL, "cg-pll0-div1");
|
||||||
|
if (IS_ERR(pltclk)) {
|
||||||
|
pr_err("%s: can't get bus frequency %ld\n",
|
||||||
|
__func__, PTR_ERR(pltclk));
|
||||||
|
return PTR_ERR(pltclk);
|
||||||
|
}
|
||||||
|
|
||||||
|
return clk_get_rate(pltclk);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct clk *cpu_to_clk(int cpu)
|
static struct clk *cpu_to_clk(int cpu)
|
||||||
|
|
|
@ -291,18 +291,6 @@ config ARMADA_THERMAL
|
||||||
Enable this option if you want to have support for thermal management
|
Enable this option if you want to have support for thermal management
|
||||||
controller present in Armada 370 and Armada XP SoC.
|
controller present in Armada 370 and Armada XP SoC.
|
||||||
|
|
||||||
config DB8500_CPUFREQ_COOLING
|
|
||||||
tristate "DB8500 cpufreq cooling"
|
|
||||||
depends on ARCH_U8500 || COMPILE_TEST
|
|
||||||
depends on HAS_IOMEM
|
|
||||||
depends on CPU_THERMAL
|
|
||||||
default y
|
|
||||||
help
|
|
||||||
Adds DB8500 cpufreq cooling devices, and these cooling devices can be
|
|
||||||
bound to thermal zone trip points. When a trip point reached, the
|
|
||||||
bound cpufreq cooling device turns active to set CPU frequency low to
|
|
||||||
cool down the CPU.
|
|
||||||
|
|
||||||
config INTEL_POWERCLAMP
|
config INTEL_POWERCLAMP
|
||||||
tristate "Intel PowerClamp idle injection driver"
|
tristate "Intel PowerClamp idle injection driver"
|
||||||
depends on THERMAL
|
depends on THERMAL
|
||||||
|
|
|
@ -41,7 +41,6 @@ obj-$(CONFIG_TANGO_THERMAL) += tango_thermal.o
|
||||||
obj-$(CONFIG_IMX_THERMAL) += imx_thermal.o
|
obj-$(CONFIG_IMX_THERMAL) += imx_thermal.o
|
||||||
obj-$(CONFIG_MAX77620_THERMAL) += max77620_thermal.o
|
obj-$(CONFIG_MAX77620_THERMAL) += max77620_thermal.o
|
||||||
obj-$(CONFIG_QORIQ_THERMAL) += qoriq_thermal.o
|
obj-$(CONFIG_QORIQ_THERMAL) += qoriq_thermal.o
|
||||||
obj-$(CONFIG_DB8500_CPUFREQ_COOLING) += db8500_cpufreq_cooling.o
|
|
||||||
obj-$(CONFIG_INTEL_POWERCLAMP) += intel_powerclamp.o
|
obj-$(CONFIG_INTEL_POWERCLAMP) += intel_powerclamp.o
|
||||||
obj-$(CONFIG_X86_PKG_TEMP_THERMAL) += x86_pkg_temp_thermal.o
|
obj-$(CONFIG_X86_PKG_TEMP_THERMAL) += x86_pkg_temp_thermal.o
|
||||||
obj-$(CONFIG_INTEL_SOC_DTS_IOSF_CORE) += intel_soc_dts_iosf.o
|
obj-$(CONFIG_INTEL_SOC_DTS_IOSF_CORE) += intel_soc_dts_iosf.o
|
||||||
|
|
|
@ -1,105 +0,0 @@
|
||||||
/*
|
|
||||||
* db8500_cpufreq_cooling.c - DB8500 cpufreq works as cooling device.
|
|
||||||
*
|
|
||||||
* Copyright (C) 2012 ST-Ericsson
|
|
||||||
* Copyright (C) 2012 Linaro Ltd.
|
|
||||||
*
|
|
||||||
* Author: Hongbo Zhang <hongbo.zhang@linaro.com>
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/cpu_cooling.h>
|
|
||||||
#include <linux/err.h>
|
|
||||||
#include <linux/module.h>
|
|
||||||
#include <linux/of.h>
|
|
||||||
#include <linux/platform_device.h>
|
|
||||||
#include <linux/slab.h>
|
|
||||||
|
|
||||||
static int db8500_cpufreq_cooling_probe(struct platform_device *pdev)
|
|
||||||
{
|
|
||||||
struct thermal_cooling_device *cdev;
|
|
||||||
|
|
||||||
cdev = cpufreq_cooling_register(cpu_present_mask);
|
|
||||||
if (IS_ERR(cdev)) {
|
|
||||||
int ret = PTR_ERR(cdev);
|
|
||||||
|
|
||||||
if (ret != -EPROBE_DEFER)
|
|
||||||
dev_err(&pdev->dev,
|
|
||||||
"Failed to register cooling device %d\n",
|
|
||||||
ret);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
platform_set_drvdata(pdev, cdev);
|
|
||||||
|
|
||||||
dev_info(&pdev->dev, "Cooling device registered: %s\n", cdev->type);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int db8500_cpufreq_cooling_remove(struct platform_device *pdev)
|
|
||||||
{
|
|
||||||
struct thermal_cooling_device *cdev = platform_get_drvdata(pdev);
|
|
||||||
|
|
||||||
cpufreq_cooling_unregister(cdev);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int db8500_cpufreq_cooling_suspend(struct platform_device *pdev,
|
|
||||||
pm_message_t state)
|
|
||||||
{
|
|
||||||
return -ENOSYS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int db8500_cpufreq_cooling_resume(struct platform_device *pdev)
|
|
||||||
{
|
|
||||||
return -ENOSYS;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_OF
|
|
||||||
static const struct of_device_id db8500_cpufreq_cooling_match[] = {
|
|
||||||
{ .compatible = "stericsson,db8500-cpufreq-cooling" },
|
|
||||||
{},
|
|
||||||
};
|
|
||||||
MODULE_DEVICE_TABLE(of, db8500_cpufreq_cooling_match);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static struct platform_driver db8500_cpufreq_cooling_driver = {
|
|
||||||
.driver = {
|
|
||||||
.name = "db8500-cpufreq-cooling",
|
|
||||||
.of_match_table = of_match_ptr(db8500_cpufreq_cooling_match),
|
|
||||||
},
|
|
||||||
.probe = db8500_cpufreq_cooling_probe,
|
|
||||||
.suspend = db8500_cpufreq_cooling_suspend,
|
|
||||||
.resume = db8500_cpufreq_cooling_resume,
|
|
||||||
.remove = db8500_cpufreq_cooling_remove,
|
|
||||||
};
|
|
||||||
|
|
||||||
static int __init db8500_cpufreq_cooling_init(void)
|
|
||||||
{
|
|
||||||
return platform_driver_register(&db8500_cpufreq_cooling_driver);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void __exit db8500_cpufreq_cooling_exit(void)
|
|
||||||
{
|
|
||||||
platform_driver_unregister(&db8500_cpufreq_cooling_driver);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Should be later than db8500_cpufreq_register */
|
|
||||||
late_initcall(db8500_cpufreq_cooling_init);
|
|
||||||
module_exit(db8500_cpufreq_cooling_exit);
|
|
||||||
|
|
||||||
MODULE_AUTHOR("Hongbo Zhang <hongbo.zhang@stericsson.com>");
|
|
||||||
MODULE_DESCRIPTION("DB8500 cpufreq cooling driver");
|
|
||||||
MODULE_LICENSE("GPL");
|
|
Loading…
Reference in New Issue