mirror of
https://github.com/openwrt/openwrt.git
synced 2025-02-20 09:26:28 +00:00
ipq806x: refresh new and changed patches
Refresh patches to remove fuzz Tested-by: Stefan Lippers-Hollmann <s.l-h@gmx.de> [nbg6817/ipq8065] Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
This commit is contained in:
parent
62a4e4b319
commit
c8086c7d2d
@ -12,8 +12,6 @@ Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
|
||||
drivers/cpufreq/qcom-cpufreq-kryo.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/cpufreq/qcom-cpufreq-kryo.c b/drivers/cpufreq/qcom-cpufreq-kryo.c
|
||||
index 2a3675c24032b..1c8583cc06a2a 100644
|
||||
--- a/drivers/cpufreq/qcom-cpufreq-kryo.c
|
||||
+++ b/drivers/cpufreq/qcom-cpufreq-kryo.c
|
||||
@@ -42,7 +42,7 @@ enum _msm8996_version {
|
||||
|
@ -25,11 +25,9 @@ Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
|
||||
4 files changed, 78 insertions(+), 54 deletions(-)
|
||||
rename drivers/cpufreq/{qcom-cpufreq-kryo.c => qcom-cpufreq-nvmem.c} (69%)
|
||||
|
||||
diff --git a/drivers/cpufreq/Kconfig.arm b/drivers/cpufreq/Kconfig.arm
|
||||
index 56c31a78c6920..b1aa485a28dde 100644
|
||||
--- a/drivers/cpufreq/Kconfig.arm
|
||||
+++ b/drivers/cpufreq/Kconfig.arm
|
||||
@@ -120,8 +120,8 @@ config ARM_OMAP2PLUS_CPUFREQ
|
||||
@@ -110,8 +110,8 @@ config ARM_OMAP2PLUS_CPUFREQ
|
||||
depends on ARCH_OMAP2PLUS
|
||||
default ARCH_OMAP2PLUS
|
||||
|
||||
@ -40,11 +38,9 @@ index 56c31a78c6920..b1aa485a28dde 100644
|
||||
depends on ARM64
|
||||
depends on QCOM_QFPROM
|
||||
depends on QCOM_SMEM
|
||||
diff --git a/drivers/cpufreq/Makefile b/drivers/cpufreq/Makefile
|
||||
index 5a6c70d26c985..8572a918aa755 100644
|
||||
--- a/drivers/cpufreq/Makefile
|
||||
+++ b/drivers/cpufreq/Makefile
|
||||
@@ -64,7 +64,7 @@ obj-$(CONFIG_MACH_MVEBU_V7) += mvebu-cpufreq.o
|
||||
@@ -64,7 +64,7 @@ obj-$(CONFIG_MACH_MVEBU_V7) += mvebu-cp
|
||||
obj-$(CONFIG_ARM_OMAP2PLUS_CPUFREQ) += omap-cpufreq.o
|
||||
obj-$(CONFIG_ARM_PXA2xx_CPUFREQ) += pxa2xx-cpufreq.o
|
||||
obj-$(CONFIG_PXA3xx) += pxa3xx-cpufreq.o
|
||||
@ -53,55 +49,344 @@ index 5a6c70d26c985..8572a918aa755 100644
|
||||
obj-$(CONFIG_ARM_S3C2410_CPUFREQ) += s3c2410-cpufreq.o
|
||||
obj-$(CONFIG_ARM_S3C2412_CPUFREQ) += s3c2412-cpufreq.o
|
||||
obj-$(CONFIG_ARM_S3C2416_CPUFREQ) += s3c2416-cpufreq.o
|
||||
diff --git a/drivers/cpufreq/qcom-cpufreq-kryo.c b/drivers/cpufreq/qcom-cpufreq-nvmem.c
|
||||
similarity index 69%
|
||||
rename from drivers/cpufreq/qcom-cpufreq-kryo.c
|
||||
rename to drivers/cpufreq/qcom-cpufreq-nvmem.c
|
||||
index dd64dcf89c74c..fd08120768af2 100644
|
||||
--- a/drivers/cpufreq/qcom-cpufreq-kryo.c
|
||||
+++ b/drivers/cpufreq/qcom-cpufreq-nvmem.c
|
||||
@@ -9,7 +9,7 @@
|
||||
* based on the silicon variant in use. Qualcomm Process Voltage Scaling Tables
|
||||
* defines the voltage and frequency value based on the msm-id in SMEM
|
||||
* and speedbin blown in the efuse combination.
|
||||
+++ /dev/null
|
||||
@@ -1,249 +0,0 @@
|
||||
-// SPDX-License-Identifier: GPL-2.0
|
||||
-/*
|
||||
- * Copyright (c) 2018, The Linux Foundation. All rights reserved.
|
||||
- */
|
||||
-
|
||||
-/*
|
||||
- * In Certain QCOM SoCs like apq8096 and msm8996 that have KRYO processors,
|
||||
- * the CPU frequency subset and voltage value of each OPP varies
|
||||
- * based on the silicon variant in use. Qualcomm Process Voltage Scaling Tables
|
||||
- * defines the voltage and frequency value based on the msm-id in SMEM
|
||||
- * and speedbin blown in the efuse combination.
|
||||
- * The qcom-cpufreq-kryo driver reads the msm-id and efuse value from the SoC
|
||||
+ * The qcom-cpufreq-nvmem driver reads the msm-id and efuse value from the SoC
|
||||
* to provide the OPP framework with required information.
|
||||
* This is used to determine the voltage and frequency value for each OPP of
|
||||
* operating-points-v2 table when it is parsed by the OPP framework.
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/nvmem-consumer.h>
|
||||
#include <linux/of.h>
|
||||
+#include <linux/of_device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/pm_opp.h>
|
||||
#include <linux/slab.h>
|
||||
@@ -42,9 +43,9 @@ enum _msm8996_version {
|
||||
NUM_OF_MSM8996_VERSIONS,
|
||||
};
|
||||
|
||||
- * to provide the OPP framework with required information.
|
||||
- * This is used to determine the voltage and frequency value for each OPP of
|
||||
- * operating-points-v2 table when it is parsed by the OPP framework.
|
||||
- */
|
||||
-
|
||||
-#include <linux/cpu.h>
|
||||
-#include <linux/err.h>
|
||||
-#include <linux/init.h>
|
||||
-#include <linux/kernel.h>
|
||||
-#include <linux/module.h>
|
||||
-#include <linux/nvmem-consumer.h>
|
||||
-#include <linux/of.h>
|
||||
-#include <linux/platform_device.h>
|
||||
-#include <linux/pm_opp.h>
|
||||
-#include <linux/slab.h>
|
||||
-#include <linux/soc/qcom/smem.h>
|
||||
-
|
||||
-#define MSM_ID_SMEM 137
|
||||
-
|
||||
-enum _msm_id {
|
||||
- MSM8996V3 = 0xF6ul,
|
||||
- APQ8096V3 = 0x123ul,
|
||||
- MSM8996SG = 0x131ul,
|
||||
- APQ8096SG = 0x138ul,
|
||||
-};
|
||||
-
|
||||
-enum _msm8996_version {
|
||||
- MSM8996_V3,
|
||||
- MSM8996_SG,
|
||||
- NUM_OF_MSM8996_VERSIONS,
|
||||
-};
|
||||
-
|
||||
-static struct platform_device *cpufreq_dt_pdev, *kryo_cpufreq_pdev;
|
||||
+static struct platform_device *cpufreq_dt_pdev, *cpufreq_pdev;
|
||||
|
||||
-
|
||||
-static enum _msm8996_version qcom_cpufreq_kryo_get_msm_id(void)
|
||||
+static enum _msm8996_version qcom_cpufreq_get_msm_id(void)
|
||||
{
|
||||
size_t len;
|
||||
u32 *msm_id;
|
||||
@@ -73,28 +74,62 @@ static enum _msm8996_version qcom_cpufreq_kryo_get_msm_id(void)
|
||||
return version;
|
||||
}
|
||||
|
||||
-{
|
||||
- size_t len;
|
||||
- u32 *msm_id;
|
||||
- enum _msm8996_version version;
|
||||
-
|
||||
- msm_id = qcom_smem_get(QCOM_SMEM_HOST_ANY, MSM_ID_SMEM, &len);
|
||||
- if (IS_ERR(msm_id))
|
||||
- return NUM_OF_MSM8996_VERSIONS;
|
||||
-
|
||||
- /* The first 4 bytes are format, next to them is the actual msm-id */
|
||||
- msm_id++;
|
||||
-
|
||||
- switch ((enum _msm_id)*msm_id) {
|
||||
- case MSM8996V3:
|
||||
- case APQ8096V3:
|
||||
- version = MSM8996_V3;
|
||||
- break;
|
||||
- case MSM8996SG:
|
||||
- case APQ8096SG:
|
||||
- version = MSM8996_SG;
|
||||
- break;
|
||||
- default:
|
||||
- version = NUM_OF_MSM8996_VERSIONS;
|
||||
- }
|
||||
-
|
||||
- return version;
|
||||
-}
|
||||
-
|
||||
-static int qcom_cpufreq_kryo_probe(struct platform_device *pdev)
|
||||
-{
|
||||
- struct opp_table **opp_tables;
|
||||
- enum _msm8996_version msm8996_version;
|
||||
- struct nvmem_cell *speedbin_nvmem;
|
||||
- struct device_node *np;
|
||||
- struct device *cpu_dev;
|
||||
- unsigned cpu;
|
||||
- u8 *speedbin;
|
||||
- u32 versions;
|
||||
- size_t len;
|
||||
- int ret;
|
||||
-
|
||||
- cpu_dev = get_cpu_device(0);
|
||||
- if (!cpu_dev)
|
||||
- return -ENODEV;
|
||||
-
|
||||
- msm8996_version = qcom_cpufreq_kryo_get_msm_id();
|
||||
- if (NUM_OF_MSM8996_VERSIONS == msm8996_version) {
|
||||
- dev_err(cpu_dev, "Not Snapdragon 820/821!");
|
||||
- return -ENODEV;
|
||||
- }
|
||||
-
|
||||
- np = dev_pm_opp_of_get_opp_desc_node(cpu_dev);
|
||||
- if (!np)
|
||||
- return -ENOENT;
|
||||
-
|
||||
- ret = of_device_is_compatible(np, "operating-points-v2-kryo-cpu");
|
||||
- if (!ret) {
|
||||
- of_node_put(np);
|
||||
- return -ENOENT;
|
||||
- }
|
||||
-
|
||||
- speedbin_nvmem = of_nvmem_cell_get(np, NULL);
|
||||
- of_node_put(np);
|
||||
- if (IS_ERR(speedbin_nvmem)) {
|
||||
- if (PTR_ERR(speedbin_nvmem) != -EPROBE_DEFER)
|
||||
- dev_err(cpu_dev, "Could not get nvmem cell: %ld\n",
|
||||
- PTR_ERR(speedbin_nvmem));
|
||||
- return PTR_ERR(speedbin_nvmem);
|
||||
- }
|
||||
-
|
||||
- speedbin = nvmem_cell_read(speedbin_nvmem, &len);
|
||||
- nvmem_cell_put(speedbin_nvmem);
|
||||
- if (IS_ERR(speedbin))
|
||||
- return PTR_ERR(speedbin);
|
||||
-
|
||||
- switch (msm8996_version) {
|
||||
- case MSM8996_V3:
|
||||
- versions = 1 << (unsigned int)(*speedbin);
|
||||
- break;
|
||||
- case MSM8996_SG:
|
||||
- versions = 1 << ((unsigned int)(*speedbin) + 4);
|
||||
- break;
|
||||
- default:
|
||||
- BUG();
|
||||
- break;
|
||||
- }
|
||||
- kfree(speedbin);
|
||||
-
|
||||
- opp_tables = kcalloc(num_possible_cpus(), sizeof(*opp_tables), GFP_KERNEL);
|
||||
- if (!opp_tables)
|
||||
- return -ENOMEM;
|
||||
-
|
||||
- for_each_possible_cpu(cpu) {
|
||||
- cpu_dev = get_cpu_device(cpu);
|
||||
- if (NULL == cpu_dev) {
|
||||
- ret = -ENODEV;
|
||||
- goto free_opp;
|
||||
- }
|
||||
-
|
||||
- opp_tables[cpu] = dev_pm_opp_set_supported_hw(cpu_dev,
|
||||
- &versions, 1);
|
||||
- if (IS_ERR(opp_tables[cpu])) {
|
||||
- ret = PTR_ERR(opp_tables[cpu]);
|
||||
- dev_err(cpu_dev, "Failed to set supported hardware\n");
|
||||
- goto free_opp;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- cpufreq_dt_pdev = platform_device_register_simple("cpufreq-dt", -1,
|
||||
- NULL, 0);
|
||||
- if (!IS_ERR(cpufreq_dt_pdev)) {
|
||||
- platform_set_drvdata(pdev, opp_tables);
|
||||
- return 0;
|
||||
- }
|
||||
-
|
||||
- ret = PTR_ERR(cpufreq_dt_pdev);
|
||||
- dev_err(cpu_dev, "Failed to register platform device\n");
|
||||
-
|
||||
-free_opp:
|
||||
- for_each_possible_cpu(cpu) {
|
||||
- if (IS_ERR_OR_NULL(opp_tables[cpu]))
|
||||
- break;
|
||||
- dev_pm_opp_put_supported_hw(opp_tables[cpu]);
|
||||
- }
|
||||
- kfree(opp_tables);
|
||||
-
|
||||
- return ret;
|
||||
-}
|
||||
-
|
||||
-static int qcom_cpufreq_kryo_remove(struct platform_device *pdev)
|
||||
-{
|
||||
- struct opp_table **opp_tables = platform_get_drvdata(pdev);
|
||||
- unsigned int cpu;
|
||||
-
|
||||
- platform_device_unregister(cpufreq_dt_pdev);
|
||||
-
|
||||
- for_each_possible_cpu(cpu)
|
||||
- dev_pm_opp_put_supported_hw(opp_tables[cpu]);
|
||||
-
|
||||
- kfree(opp_tables);
|
||||
-
|
||||
- return 0;
|
||||
-}
|
||||
-
|
||||
-static struct platform_driver qcom_cpufreq_kryo_driver = {
|
||||
- .probe = qcom_cpufreq_kryo_probe,
|
||||
- .remove = qcom_cpufreq_kryo_remove,
|
||||
- .driver = {
|
||||
- .name = "qcom-cpufreq-kryo",
|
||||
- },
|
||||
-};
|
||||
-
|
||||
-static const struct of_device_id qcom_cpufreq_kryo_match_list[] __initconst = {
|
||||
- { .compatible = "qcom,apq8096", },
|
||||
- { .compatible = "qcom,msm8996", },
|
||||
- {}
|
||||
-};
|
||||
-
|
||||
-/*
|
||||
- * Since the driver depends on smem and nvmem drivers, which may
|
||||
- * return EPROBE_DEFER, all the real activity is done in the probe,
|
||||
- * which may be defered as well. The init here is only registering
|
||||
- * the driver and the platform device.
|
||||
- */
|
||||
-static int __init qcom_cpufreq_kryo_init(void)
|
||||
-{
|
||||
- struct device_node *np = of_find_node_by_path("/");
|
||||
- const struct of_device_id *match;
|
||||
- int ret;
|
||||
-
|
||||
- if (!np)
|
||||
- return -ENODEV;
|
||||
-
|
||||
- match = of_match_node(qcom_cpufreq_kryo_match_list, np);
|
||||
- of_node_put(np);
|
||||
- if (!match)
|
||||
- return -ENODEV;
|
||||
-
|
||||
- ret = platform_driver_register(&qcom_cpufreq_kryo_driver);
|
||||
- if (unlikely(ret < 0))
|
||||
- return ret;
|
||||
-
|
||||
- kryo_cpufreq_pdev = platform_device_register_simple(
|
||||
- "qcom-cpufreq-kryo", -1, NULL, 0);
|
||||
- ret = PTR_ERR_OR_ZERO(kryo_cpufreq_pdev);
|
||||
- if (0 == ret)
|
||||
- return 0;
|
||||
-
|
||||
- platform_driver_unregister(&qcom_cpufreq_kryo_driver);
|
||||
- return ret;
|
||||
-}
|
||||
-module_init(qcom_cpufreq_kryo_init);
|
||||
-
|
||||
-static void __exit qcom_cpufreq_kryo_exit(void)
|
||||
-{
|
||||
- platform_device_unregister(kryo_cpufreq_pdev);
|
||||
- platform_driver_unregister(&qcom_cpufreq_kryo_driver);
|
||||
-}
|
||||
-module_exit(qcom_cpufreq_kryo_exit);
|
||||
-
|
||||
-MODULE_DESCRIPTION("Qualcomm Technologies, Inc. Kryo CPUfreq driver");
|
||||
-MODULE_LICENSE("GPL v2");
|
||||
--- /dev/null
|
||||
+++ b/drivers/cpufreq/qcom-cpufreq-nvmem.c
|
||||
@@ -0,0 +1,273 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0
|
||||
+/*
|
||||
+ * Copyright (c) 2018, The Linux Foundation. All rights reserved.
|
||||
+ */
|
||||
+
|
||||
+/*
|
||||
+ * In Certain QCOM SoCs like apq8096 and msm8996 that have KRYO processors,
|
||||
+ * the CPU frequency subset and voltage value of each OPP varies
|
||||
+ * based on the silicon variant in use. Qualcomm Process Voltage Scaling Tables
|
||||
+ * defines the voltage and frequency value based on the msm-id in SMEM
|
||||
+ * and speedbin blown in the efuse combination.
|
||||
+ * The qcom-cpufreq-nvmem driver reads the msm-id and efuse value from the SoC
|
||||
+ * to provide the OPP framework with required information.
|
||||
+ * This is used to determine the voltage and frequency value for each OPP of
|
||||
+ * operating-points-v2 table when it is parsed by the OPP framework.
|
||||
+ */
|
||||
+
|
||||
+#include <linux/cpu.h>
|
||||
+#include <linux/err.h>
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/nvmem-consumer.h>
|
||||
+#include <linux/of.h>
|
||||
+#include <linux/of_device.h>
|
||||
+#include <linux/platform_device.h>
|
||||
+#include <linux/pm_opp.h>
|
||||
+#include <linux/slab.h>
|
||||
+#include <linux/soc/qcom/smem.h>
|
||||
+
|
||||
+#define MSM_ID_SMEM 137
|
||||
+
|
||||
+enum _msm_id {
|
||||
+ MSM8996V3 = 0xF6ul,
|
||||
+ APQ8096V3 = 0x123ul,
|
||||
+ MSM8996SG = 0x131ul,
|
||||
+ APQ8096SG = 0x138ul,
|
||||
+};
|
||||
+
|
||||
+enum _msm8996_version {
|
||||
+ MSM8996_V3,
|
||||
+ MSM8996_SG,
|
||||
+ NUM_OF_MSM8996_VERSIONS,
|
||||
+};
|
||||
+
|
||||
+static struct platform_device *cpufreq_dt_pdev, *cpufreq_pdev;
|
||||
+
|
||||
+static enum _msm8996_version qcom_cpufreq_get_msm_id(void)
|
||||
+{
|
||||
+ size_t len;
|
||||
+ u32 *msm_id;
|
||||
+ enum _msm8996_version version;
|
||||
+
|
||||
+ msm_id = qcom_smem_get(QCOM_SMEM_HOST_ANY, MSM_ID_SMEM, &len);
|
||||
+ if (IS_ERR(msm_id))
|
||||
+ return NUM_OF_MSM8996_VERSIONS;
|
||||
+
|
||||
+ /* The first 4 bytes are format, next to them is the actual msm-id */
|
||||
+ msm_id++;
|
||||
+
|
||||
+ switch ((enum _msm_id)*msm_id) {
|
||||
+ case MSM8996V3:
|
||||
+ case APQ8096V3:
|
||||
+ version = MSM8996_V3;
|
||||
+ break;
|
||||
+ case MSM8996SG:
|
||||
+ case APQ8096SG:
|
||||
+ version = MSM8996_SG;
|
||||
+ break;
|
||||
+ default:
|
||||
+ version = NUM_OF_MSM8996_VERSIONS;
|
||||
+ }
|
||||
+
|
||||
+ return version;
|
||||
+}
|
||||
+
|
||||
+static int qcom_cpufreq_kryo_name_version(struct device *cpu_dev,
|
||||
+ struct nvmem_cell *speedbin_nvmem,
|
||||
+ u32 *versions)
|
||||
{
|
||||
- struct opp_table **opp_tables;
|
||||
+{
|
||||
+ size_t len;
|
||||
+ u8 *speedbin;
|
||||
enum _msm8996_version msm8996_version;
|
||||
+ enum _msm8996_version msm8996_version;
|
||||
+
|
||||
+ msm8996_version = qcom_cpufreq_get_msm_id();
|
||||
+ if (NUM_OF_MSM8996_VERSIONS == msm8996_version) {
|
||||
@ -135,147 +420,160 @@ index dd64dcf89c74c..fd08120768af2 100644
|
||||
+ int (*get_version)(struct device *cpu_dev,
|
||||
+ struct nvmem_cell *speedbin_nvmem,
|
||||
+ u32 *versions);
|
||||
struct nvmem_cell *speedbin_nvmem;
|
||||
struct device_node *np;
|
||||
struct device *cpu_dev;
|
||||
unsigned cpu;
|
||||
- u8 *speedbin;
|
||||
u32 versions;
|
||||
- size_t len;
|
||||
+ struct nvmem_cell *speedbin_nvmem;
|
||||
+ struct device_node *np;
|
||||
+ struct device *cpu_dev;
|
||||
+ unsigned cpu;
|
||||
+ u32 versions;
|
||||
+ const struct of_device_id *match;
|
||||
int ret;
|
||||
|
||||
cpu_dev = get_cpu_device(0);
|
||||
if (!cpu_dev)
|
||||
return -ENODEV;
|
||||
|
||||
- msm8996_version = qcom_cpufreq_kryo_get_msm_id();
|
||||
- if (NUM_OF_MSM8996_VERSIONS == msm8996_version) {
|
||||
- dev_err(cpu_dev, "Not Snapdragon 820/821!");
|
||||
+ int ret;
|
||||
+
|
||||
+ cpu_dev = get_cpu_device(0);
|
||||
+ if (!cpu_dev)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ match = pdev->dev.platform_data;
|
||||
+ get_version = match->data;
|
||||
+ if (!get_version)
|
||||
return -ENODEV;
|
||||
- }
|
||||
|
||||
np = dev_pm_opp_of_get_opp_desc_node(cpu_dev);
|
||||
if (!np)
|
||||
@@ -115,23 +150,10 @@ static int qcom_cpufreq_kryo_probe(struct platform_device *pdev)
|
||||
return PTR_ERR(speedbin_nvmem);
|
||||
}
|
||||
|
||||
- speedbin = nvmem_cell_read(speedbin_nvmem, &len);
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ np = dev_pm_opp_of_get_opp_desc_node(cpu_dev);
|
||||
+ if (!np)
|
||||
+ return -ENOENT;
|
||||
+
|
||||
+ ret = of_device_is_compatible(np, "operating-points-v2-kryo-cpu");
|
||||
+ if (!ret) {
|
||||
+ of_node_put(np);
|
||||
+ return -ENOENT;
|
||||
+ }
|
||||
+
|
||||
+ speedbin_nvmem = of_nvmem_cell_get(np, NULL);
|
||||
+ of_node_put(np);
|
||||
+ if (IS_ERR(speedbin_nvmem)) {
|
||||
+ if (PTR_ERR(speedbin_nvmem) != -EPROBE_DEFER)
|
||||
+ dev_err(cpu_dev, "Could not get nvmem cell: %ld\n",
|
||||
+ PTR_ERR(speedbin_nvmem));
|
||||
+ return PTR_ERR(speedbin_nvmem);
|
||||
+ }
|
||||
+
|
||||
+ ret = get_version(cpu_dev, speedbin_nvmem, &versions);
|
||||
nvmem_cell_put(speedbin_nvmem);
|
||||
- if (IS_ERR(speedbin))
|
||||
- return PTR_ERR(speedbin);
|
||||
-
|
||||
- switch (msm8996_version) {
|
||||
- case MSM8996_V3:
|
||||
- versions = 1 << (unsigned int)(*speedbin);
|
||||
- break;
|
||||
- case MSM8996_SG:
|
||||
- versions = 1 << ((unsigned int)(*speedbin) + 4);
|
||||
- break;
|
||||
- default:
|
||||
- BUG();
|
||||
- break;
|
||||
- }
|
||||
- kfree(speedbin);
|
||||
+ nvmem_cell_put(speedbin_nvmem);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
|
||||
opp_tables = kcalloc(num_possible_cpus(), sizeof(*opp_tables), GFP_KERNEL);
|
||||
if (!opp_tables)
|
||||
@@ -174,7 +196,7 @@ static int qcom_cpufreq_kryo_probe(struct platform_device *pdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
-static int qcom_cpufreq_kryo_remove(struct platform_device *pdev)
|
||||
+
|
||||
+ opp_tables = kcalloc(num_possible_cpus(), sizeof(*opp_tables), GFP_KERNEL);
|
||||
+ if (!opp_tables)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ for_each_possible_cpu(cpu) {
|
||||
+ cpu_dev = get_cpu_device(cpu);
|
||||
+ if (NULL == cpu_dev) {
|
||||
+ ret = -ENODEV;
|
||||
+ goto free_opp;
|
||||
+ }
|
||||
+
|
||||
+ opp_tables[cpu] = dev_pm_opp_set_supported_hw(cpu_dev,
|
||||
+ &versions, 1);
|
||||
+ if (IS_ERR(opp_tables[cpu])) {
|
||||
+ ret = PTR_ERR(opp_tables[cpu]);
|
||||
+ dev_err(cpu_dev, "Failed to set supported hardware\n");
|
||||
+ goto free_opp;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ cpufreq_dt_pdev = platform_device_register_simple("cpufreq-dt", -1,
|
||||
+ NULL, 0);
|
||||
+ if (!IS_ERR(cpufreq_dt_pdev)) {
|
||||
+ platform_set_drvdata(pdev, opp_tables);
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ ret = PTR_ERR(cpufreq_dt_pdev);
|
||||
+ dev_err(cpu_dev, "Failed to register platform device\n");
|
||||
+
|
||||
+free_opp:
|
||||
+ for_each_possible_cpu(cpu) {
|
||||
+ if (IS_ERR_OR_NULL(opp_tables[cpu]))
|
||||
+ break;
|
||||
+ dev_pm_opp_put_supported_hw(opp_tables[cpu]);
|
||||
+ }
|
||||
+ kfree(opp_tables);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static int qcom_cpufreq_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct opp_table **opp_tables = platform_get_drvdata(pdev);
|
||||
unsigned int cpu;
|
||||
@@ -189,18 +211,20 @@ static int qcom_cpufreq_kryo_remove(struct platform_device *pdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static struct platform_driver qcom_cpufreq_kryo_driver = {
|
||||
- .probe = qcom_cpufreq_kryo_probe,
|
||||
- .remove = qcom_cpufreq_kryo_remove,
|
||||
+{
|
||||
+ struct opp_table **opp_tables = platform_get_drvdata(pdev);
|
||||
+ unsigned int cpu;
|
||||
+
|
||||
+ platform_device_unregister(cpufreq_dt_pdev);
|
||||
+
|
||||
+ for_each_possible_cpu(cpu)
|
||||
+ dev_pm_opp_put_supported_hw(opp_tables[cpu]);
|
||||
+
|
||||
+ kfree(opp_tables);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static struct platform_driver qcom_cpufreq_driver = {
|
||||
+ .probe = qcom_cpufreq_probe,
|
||||
+ .remove = qcom_cpufreq_remove,
|
||||
.driver = {
|
||||
- .name = "qcom-cpufreq-kryo",
|
||||
+ .driver = {
|
||||
+ .name = "qcom-cpufreq-nvmem",
|
||||
},
|
||||
};
|
||||
|
||||
-static const struct of_device_id qcom_cpufreq_kryo_match_list[] __initconst = {
|
||||
- { .compatible = "qcom,apq8096", },
|
||||
- { .compatible = "qcom,msm8996", },
|
||||
- {}
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static const struct of_device_id qcom_cpufreq_match_list[] __initconst = {
|
||||
+ { .compatible = "qcom,apq8096",
|
||||
+ .data = qcom_cpufreq_kryo_name_version },
|
||||
+ { .compatible = "qcom,msm8996",
|
||||
+ .data = qcom_cpufreq_kryo_name_version },
|
||||
+ {},
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -209,7 +233,7 @@ static const struct of_device_id qcom_cpufreq_kryo_match_list[] __initconst = {
|
||||
* which may be defered as well. The init here is only registering
|
||||
* the driver and the platform device.
|
||||
*/
|
||||
-static int __init qcom_cpufreq_kryo_init(void)
|
||||
+};
|
||||
+
|
||||
+/*
|
||||
+ * Since the driver depends on smem and nvmem drivers, which may
|
||||
+ * return EPROBE_DEFER, all the real activity is done in the probe,
|
||||
+ * which may be defered as well. The init here is only registering
|
||||
+ * the driver and the platform device.
|
||||
+ */
|
||||
+static int __init qcom_cpufreq_init(void)
|
||||
{
|
||||
struct device_node *np = of_find_node_by_path("/");
|
||||
const struct of_device_id *match;
|
||||
@@ -218,32 +242,32 @@ static int __init qcom_cpufreq_kryo_init(void)
|
||||
if (!np)
|
||||
return -ENODEV;
|
||||
|
||||
- match = of_match_node(qcom_cpufreq_kryo_match_list, np);
|
||||
+{
|
||||
+ struct device_node *np = of_find_node_by_path("/");
|
||||
+ const struct of_device_id *match;
|
||||
+ int ret;
|
||||
+
|
||||
+ if (!np)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ match = of_match_node(qcom_cpufreq_match_list, np);
|
||||
of_node_put(np);
|
||||
if (!match)
|
||||
return -ENODEV;
|
||||
|
||||
- ret = platform_driver_register(&qcom_cpufreq_kryo_driver);
|
||||
+ of_node_put(np);
|
||||
+ if (!match)
|
||||
+ return -ENODEV;
|
||||
+
|
||||
+ ret = platform_driver_register(&qcom_cpufreq_driver);
|
||||
if (unlikely(ret < 0))
|
||||
return ret;
|
||||
|
||||
- kryo_cpufreq_pdev = platform_device_register_simple(
|
||||
- "qcom-cpufreq-kryo", -1, NULL, 0);
|
||||
- ret = PTR_ERR_OR_ZERO(kryo_cpufreq_pdev);
|
||||
+ if (unlikely(ret < 0))
|
||||
+ return ret;
|
||||
+
|
||||
+ cpufreq_pdev = platform_device_register_data(NULL, "qcom-cpufreq-nvmem",
|
||||
+ -1, match, sizeof(*match));
|
||||
+ ret = PTR_ERR_OR_ZERO(cpufreq_pdev);
|
||||
if (0 == ret)
|
||||
return 0;
|
||||
|
||||
- platform_driver_unregister(&qcom_cpufreq_kryo_driver);
|
||||
+ if (0 == ret)
|
||||
+ return 0;
|
||||
+
|
||||
+ platform_driver_unregister(&qcom_cpufreq_driver);
|
||||
return ret;
|
||||
}
|
||||
-module_init(qcom_cpufreq_kryo_init);
|
||||
+ return ret;
|
||||
+}
|
||||
+module_init(qcom_cpufreq_init);
|
||||
|
||||
-static void __exit qcom_cpufreq_kryo_exit(void)
|
||||
+
|
||||
+static void __exit qcom_cpufreq_exit(void)
|
||||
{
|
||||
- platform_device_unregister(kryo_cpufreq_pdev);
|
||||
- platform_driver_unregister(&qcom_cpufreq_kryo_driver);
|
||||
+{
|
||||
+ platform_device_unregister(cpufreq_pdev);
|
||||
+ platform_driver_unregister(&qcom_cpufreq_driver);
|
||||
}
|
||||
-module_exit(qcom_cpufreq_kryo_exit);
|
||||
+}
|
||||
+module_exit(qcom_cpufreq_exit);
|
||||
|
||||
-MODULE_DESCRIPTION("Qualcomm Technologies, Inc. Kryo CPUfreq driver");
|
||||
+
|
||||
+MODULE_DESCRIPTION("Qualcomm Technologies, Inc. CPUfreq driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
+MODULE_LICENSE("GPL v2");
|
||||
|
@ -20,8 +20,6 @@ Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
|
||||
drivers/cpufreq/qcom-cpufreq-nvmem.c | 123 +++++++++++++++++----------
|
||||
1 file changed, 79 insertions(+), 44 deletions(-)
|
||||
|
||||
diff --git a/drivers/cpufreq/qcom-cpufreq-nvmem.c b/drivers/cpufreq/qcom-cpufreq-nvmem.c
|
||||
index fd08120768af2..2d798a1685c5d 100644
|
||||
--- a/drivers/cpufreq/qcom-cpufreq-nvmem.c
|
||||
+++ b/drivers/cpufreq/qcom-cpufreq-nvmem.c
|
||||
@@ -43,6 +43,20 @@ enum _msm8996_version {
|
||||
@ -45,7 +43,7 @@ index fd08120768af2..2d798a1685c5d 100644
|
||||
static struct platform_device *cpufreq_dt_pdev, *cpufreq_pdev;
|
||||
|
||||
static enum _msm8996_version qcom_cpufreq_get_msm_id(void)
|
||||
@@ -76,7 +90,7 @@ static enum _msm8996_version qcom_cpufreq_get_msm_id(void)
|
||||
@@ -76,7 +90,7 @@ static enum _msm8996_version qcom_cpufre
|
||||
|
||||
static int qcom_cpufreq_kryo_name_version(struct device *cpu_dev,
|
||||
struct nvmem_cell *speedbin_nvmem,
|
||||
@ -54,7 +52,7 @@ index fd08120768af2..2d798a1685c5d 100644
|
||||
{
|
||||
size_t len;
|
||||
u8 *speedbin;
|
||||
@@ -94,10 +108,10 @@ static int qcom_cpufreq_kryo_name_version(struct device *cpu_dev,
|
||||
@@ -94,10 +108,10 @@ static int qcom_cpufreq_kryo_name_versio
|
||||
|
||||
switch (msm8996_version) {
|
||||
case MSM8996_V3:
|
||||
@ -67,7 +65,7 @@ index fd08120768af2..2d798a1685c5d 100644
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
@@ -108,17 +122,17 @@ static int qcom_cpufreq_kryo_name_version(struct device *cpu_dev,
|
||||
@@ -108,17 +122,17 @@ static int qcom_cpufreq_kryo_name_versio
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -90,7 +88,7 @@ index fd08120768af2..2d798a1685c5d 100644
|
||||
const struct of_device_id *match;
|
||||
int ret;
|
||||
|
||||
@@ -126,11 +140,6 @@ static int qcom_cpufreq_probe(struct platform_device *pdev)
|
||||
@@ -126,11 +140,6 @@ static int qcom_cpufreq_probe(struct pla
|
||||
if (!cpu_dev)
|
||||
return -ENODEV;
|
||||
|
||||
@ -102,7 +100,7 @@ index fd08120768af2..2d798a1685c5d 100644
|
||||
np = dev_pm_opp_of_get_opp_desc_node(cpu_dev);
|
||||
if (!np)
|
||||
return -ENOENT;
|
||||
@@ -141,23 +150,43 @@ static int qcom_cpufreq_probe(struct platform_device *pdev)
|
||||
@@ -141,23 +150,43 @@ static int qcom_cpufreq_probe(struct pla
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
@ -160,7 +158,7 @@ index fd08120768af2..2d798a1685c5d 100644
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
cpu_dev = get_cpu_device(cpu);
|
||||
@@ -166,19 +195,23 @@ static int qcom_cpufreq_probe(struct platform_device *pdev)
|
||||
@@ -166,19 +195,23 @@ static int qcom_cpufreq_probe(struct pla
|
||||
goto free_opp;
|
||||
}
|
||||
|
||||
@ -191,7 +189,7 @@ index fd08120768af2..2d798a1685c5d 100644
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -187,26 +220,30 @@ static int qcom_cpufreq_probe(struct platform_device *pdev)
|
||||
@@ -187,26 +220,30 @@ static int qcom_cpufreq_probe(struct pla
|
||||
|
||||
free_opp:
|
||||
for_each_possible_cpu(cpu) {
|
||||
@ -228,7 +226,7 @@ index fd08120768af2..2d798a1685c5d 100644
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -220,10 +257,8 @@ static struct platform_driver qcom_cpufreq_driver = {
|
||||
@@ -220,10 +257,8 @@ static struct platform_driver qcom_cpufr
|
||||
};
|
||||
|
||||
static const struct of_device_id qcom_cpufreq_match_list[] __initconst = {
|
||||
|
@ -39,11 +39,9 @@ Signed-off-by: Sricharan R <sricharan@codeaurora.org>
|
||||
# - nvmem-cells: A phandle pointing to a nvmem-cells node representing the
|
||||
# efuse registers that has information about the
|
||||
# speedbin that is used to select the right frequency/voltage
|
||||
diff --git a/drivers/cpufreq/Kconfig.arm b/drivers/cpufreq/Kconfig.arm
|
||||
index 13fbd97..497ae89 100644
|
||||
--- a/drivers/cpufreq/Kconfig.arm
|
||||
+++ b/drivers/cpufreq/Kconfig.arm
|
||||
@@ -126,7 +126,7 @@ config ARM_OMAP2PLUS_CPUFREQ
|
||||
@@ -112,7 +112,7 @@ config ARM_OMAP2PLUS_CPUFREQ
|
||||
|
||||
config ARM_QCOM_CPUFREQ_NVMEM
|
||||
tristate "Qualcomm nvmem based CPUFreq"
|
||||
@ -52,11 +50,9 @@ index 13fbd97..497ae89 100644
|
||||
depends on QCOM_QFPROM
|
||||
depends on QCOM_SMEM
|
||||
select PM_OPP
|
||||
diff --git a/drivers/cpufreq/cpufreq-dt-platdev.c b/drivers/cpufreq/cpufreq-dt-platdev.c
|
||||
index fe14c57..917cdc2 100644
|
||||
--- a/drivers/cpufreq/cpufreq-dt-platdev.c
|
||||
+++ b/drivers/cpufreq/cpufreq-dt-platdev.c
|
||||
@@ -128,6 +128,11 @@
|
||||
@@ -128,6 +128,11 @@ static const struct of_device_id blackli
|
||||
{ .compatible = "ti,am43", },
|
||||
{ .compatible = "ti,dra7", },
|
||||
|
||||
@ -68,11 +64,9 @@ index fe14c57..917cdc2 100644
|
||||
{ }
|
||||
};
|
||||
|
||||
diff --git a/drivers/cpufreq/qcom-cpufreq-nvmem.c b/drivers/cpufreq/qcom-cpufreq-nvmem.c
|
||||
index 0ad8e5b..5f2add0 100644
|
||||
--- a/drivers/cpufreq/qcom-cpufreq-nvmem.c
|
||||
+++ b/drivers/cpufreq/qcom-cpufreq-nvmem.c
|
||||
@@ -48,17 +48,92 @@
|
||||
@@ -48,17 +48,92 @@ struct qcom_cpufreq_drv;
|
||||
struct qcom_cpufreq_match_data {
|
||||
int (*get_version)(struct device *cpu_dev,
|
||||
struct nvmem_cell *speedbin_nvmem,
|
||||
@ -166,7 +160,7 @@ index 0ad8e5b..5f2add0 100644
|
||||
static enum _msm8996_version qcom_cpufreq_get_msm_id(void)
|
||||
{
|
||||
size_t len;
|
||||
@@ -90,11 +165,13 @@
|
||||
@@ -90,11 +165,13 @@ static enum _msm8996_version qcom_cpufre
|
||||
|
||||
static int qcom_cpufreq_kryo_name_version(struct device *cpu_dev,
|
||||
struct nvmem_cell *speedbin_nvmem,
|
||||
@ -180,7 +174,7 @@ index 0ad8e5b..5f2add0 100644
|
||||
|
||||
msm8996_version = qcom_cpufreq_get_msm_id();
|
||||
if (NUM_OF_MSM8996_VERSIONS == msm8996_version) {
|
||||
@@ -122,16 +199,51 @@
|
||||
@@ -122,16 +199,51 @@ static int qcom_cpufreq_kryo_name_versio
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -232,7 +226,7 @@ index 0ad8e5b..5f2add0 100644
|
||||
unsigned cpu;
|
||||
const struct of_device_id *match;
|
||||
int ret;
|
||||
@@ -144,7 +256,7 @@
|
||||
@@ -144,7 +256,7 @@ static int qcom_cpufreq_probe(struct pla
|
||||
if (!np)
|
||||
return -ENOENT;
|
||||
|
||||
@ -241,7 +235,7 @@ index 0ad8e5b..5f2add0 100644
|
||||
if (!ret) {
|
||||
of_node_put(np);
|
||||
return -ENOENT;
|
||||
@@ -172,7 +284,7 @@
|
||||
@@ -172,7 +284,7 @@ static int qcom_cpufreq_probe(struct pla
|
||||
goto free_drv;
|
||||
}
|
||||
|
||||
@ -250,7 +244,7 @@ index 0ad8e5b..5f2add0 100644
|
||||
if (ret) {
|
||||
nvmem_cell_put(speedbin_nvmem);
|
||||
goto free_drv;
|
||||
@@ -181,12 +293,18 @@
|
||||
@@ -181,12 +293,18 @@ static int qcom_cpufreq_probe(struct pla
|
||||
}
|
||||
of_node_put(np);
|
||||
|
||||
@ -271,7 +265,7 @@ index 0ad8e5b..5f2add0 100644
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
cpu_dev = get_cpu_device(cpu);
|
||||
@@ -196,11 +314,22 @@
|
||||
@@ -196,11 +314,22 @@ static int qcom_cpufreq_probe(struct pla
|
||||
}
|
||||
|
||||
if (drv->data->get_version) {
|
||||
@ -298,7 +292,7 @@ index 0ad8e5b..5f2add0 100644
|
||||
dev_err(cpu_dev,
|
||||
"Failed to set supported hardware\n");
|
||||
goto free_opp;
|
||||
@@ -220,11 +349,18 @@
|
||||
@@ -220,11 +349,18 @@ static int qcom_cpufreq_probe(struct pla
|
||||
|
||||
free_opp:
|
||||
for_each_possible_cpu(cpu) {
|
||||
@ -320,7 +314,7 @@ index 0ad8e5b..5f2add0 100644
|
||||
free_drv:
|
||||
kfree(drv);
|
||||
|
||||
@@ -239,10 +375,14 @@
|
||||
@@ -239,10 +375,14 @@ static int qcom_cpufreq_remove(struct pl
|
||||
platform_device_unregister(cpufreq_dt_pdev);
|
||||
|
||||
for_each_possible_cpu(cpu)
|
||||
@ -338,7 +332,7 @@ index 0ad8e5b..5f2add0 100644
|
||||
kfree(drv);
|
||||
|
||||
return 0;
|
||||
@@ -259,6 +399,10 @@
|
||||
@@ -259,6 +399,10 @@ static struct platform_driver qcom_cpufr
|
||||
static const struct of_device_id qcom_cpufreq_match_list[] __initconst = {
|
||||
{ .compatible = "qcom,apq8096", .data = &match_data_kryo },
|
||||
{ .compatible = "qcom,msm8996", .data = &match_data_kryo },
|
||||
|
@ -37,15 +37,12 @@ Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com>
|
||||
include/linux/pm_opp.h | 13 ++++++++
|
||||
2 files changed, 82 insertions(+)
|
||||
|
||||
diff --git a/drivers/opp/core.c b/drivers/opp/core.c
|
||||
index 3b7ffd0234e9..f38b3be85072 100644
|
||||
--- a/drivers/opp/core.c
|
||||
+++ b/drivers/opp/core.c
|
||||
@@ -2112,6 +2112,75 @@ static int _opp_set_availability(struct device *dev, unsigned long freq,
|
||||
return r;
|
||||
@@ -1623,6 +1623,75 @@ put_table:
|
||||
}
|
||||
|
||||
+/**
|
||||
|
||||
/**
|
||||
+ * dev_pm_opp_adjust_voltage() - helper to change the voltage of an OPP
|
||||
+ * @dev: device for which we do this operation
|
||||
+ * @freq: OPP frequency to adjust voltage of
|
||||
@ -114,36 +111,35 @@ index 3b7ffd0234e9..f38b3be85072 100644
|
||||
+ return r;
|
||||
+}
|
||||
+
|
||||
/**
|
||||
+/**
|
||||
* dev_pm_opp_enable() - Enable a specific OPP
|
||||
* @dev: device for which we do this operation
|
||||
diff --git a/include/linux/pm_opp.h b/include/linux/pm_opp.h
|
||||
index b8197ab014f2..747861816f4f 100644
|
||||
* @freq: OPP frequency to enable
|
||||
--- a/include/linux/pm_opp.h
|
||||
+++ b/include/linux/pm_opp.h
|
||||
@@ -22,6 +22,7 @@ struct opp_table;
|
||||
|
||||
@@ -25,6 +25,7 @@ struct opp_table;
|
||||
|
||||
enum dev_pm_opp_event {
|
||||
OPP_EVENT_ADD, OPP_EVENT_REMOVE, OPP_EVENT_ENABLE, OPP_EVENT_DISABLE,
|
||||
+ OPP_EVENT_ADJUST_VOLTAGE,
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
@@ -113,6 +114,10 @@ int dev_pm_opp_add(struct device *dev, unsigned long freq,
|
||||
@@ -108,6 +109,10 @@ int dev_pm_opp_add(struct device *dev, u
|
||||
unsigned long u_volt);
|
||||
void dev_pm_opp_remove(struct device *dev, unsigned long freq);
|
||||
void dev_pm_opp_remove_all_dynamic(struct device *dev);
|
||||
|
||||
|
||||
+int dev_pm_opp_adjust_voltage(struct device *dev, unsigned long freq,
|
||||
+ unsigned long u_volt, unsigned long u_volt_min,
|
||||
+ unsigned long u_volt_max);
|
||||
+
|
||||
int dev_pm_opp_enable(struct device *dev, unsigned long freq);
|
||||
|
||||
|
||||
int dev_pm_opp_disable(struct device *dev, unsigned long freq);
|
||||
@@ -242,6 +247,14 @@ static inline void dev_pm_opp_remove_all_dynamic(struct device *dev)
|
||||
@@ -208,6 +213,14 @@ static inline void dev_pm_opp_remove(str
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
+static inline int
|
||||
+dev_pm_opp_adjust_voltage(struct device *dev, unsigned long freq,
|
||||
+ unsigned long u_volt, unsigned long u_volt_min,
|
||||
|
@ -17,7 +17,7 @@ Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org>
|
||||
|
||||
--- a/drivers/opp/core.c
|
||||
+++ b/drivers/opp/core.c
|
||||
@@ -1663,6 +1663,7 @@
|
||||
@@ -1663,6 +1663,7 @@ int dev_pm_opp_adjust_voltage(struct dev
|
||||
struct opp_table *opp_table;
|
||||
struct dev_pm_opp *tmp_opp, *opp = ERR_PTR(-ENODEV);
|
||||
int r = 0;
|
||||
@ -25,7 +25,7 @@ Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org>
|
||||
|
||||
/* Find the opp_table */
|
||||
opp_table = _find_opp_table(dev);
|
||||
@@ -1692,8 +1693,17 @@
|
||||
@@ -1692,8 +1693,17 @@ int dev_pm_opp_adjust_voltage(struct dev
|
||||
goto adjust_unlock;
|
||||
|
||||
opp->supplies->u_volt = u_volt;
|
||||
|
@ -99,7 +99,7 @@ Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org>
|
||||
|
||||
cpu_dev = get_cpu_device(policy->cpu);
|
||||
if (!cpu_dev) {
|
||||
@@ -254,10 +294,13 @@ static int cpufreq_init(struct cpufreq_p
|
||||
@@ -251,10 +291,13 @@ static int cpufreq_init(struct cpufreq_p
|
||||
__func__, ret);
|
||||
}
|
||||
|
||||
@ -114,7 +114,7 @@ Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org>
|
||||
}
|
||||
|
||||
priv->cpu_dev = cpu_dev;
|
||||
@@ -287,6 +330,8 @@ static int cpufreq_init(struct cpufreq_p
|
||||
@@ -284,6 +327,8 @@ static int cpufreq_init(struct cpufreq_p
|
||||
|
||||
out_free_cpufreq_table:
|
||||
dev_pm_opp_free_cpufreq_table(cpu_dev, &freq_table);
|
||||
|
@ -52,7 +52,7 @@ Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org>
|
||||
priv->opp_freq = freq * 1000;
|
||||
arch_set_freq_scale(policy->related_cpus, freq,
|
||||
policy->cpuinfo.max_freq);
|
||||
@@ -201,6 +229,8 @@ static int cpufreq_init(struct cpufreq_p
|
||||
@@ -201,6 +230,8 @@ static int cpufreq_init(struct cpufreq_p
|
||||
const char *name;
|
||||
int ret;
|
||||
struct srcu_notifier_head *opp_srcu_head;
|
||||
@ -61,7 +61,7 @@ Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org>
|
||||
|
||||
cpu_dev = get_cpu_device(policy->cpu);
|
||||
if (!cpu_dev) {
|
||||
@@ -310,6 +340,13 @@ static int cpufreq_init(struct cpufreq_p
|
||||
@@ -307,6 +338,13 @@ static int cpufreq_init(struct cpufreq_p
|
||||
|
||||
policy->suspend_freq = dev_pm_opp_get_suspend_opp_freq(cpu_dev) / 1000;
|
||||
|
||||
|
@ -10,7 +10,7 @@ Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org>
|
||||
|
||||
--- a/drivers/cpufreq/cpufreq-dt.c
|
||||
+++ b/drivers/cpufreq/cpufreq-dt.c
|
||||
@@ -146,8 +146,10 @@ static int opp_notifier(struct notifier_
|
||||
@@ -147,8 +147,10 @@ static int opp_notifier(struct notifier_
|
||||
ret = PTR_ERR(cpu_reg);
|
||||
goto out;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user