diff options
Diffstat (limited to 'target/linux/ipq806x')
9 files changed, 496 insertions, 212 deletions
diff --git a/target/linux/ipq806x/patches-4.19/0035-qcom-cpufreq-nvmem-qcm-kyrp_make_Some_variables_static.patch b/target/linux/ipq806x/patches-4.19/0035-qcom-cpufreq-nvmem-qcm-kyrp_make_Some_variables_static.patch index d445c0e190..a51153b2aa 100644 --- a/target/linux/ipq806x/patches-4.19/0035-qcom-cpufreq-nvmem-qcm-kyrp_make_Some_variables_static.patch +++ b/target/linux/ipq806x/patches-4.19/0035-qcom-cpufreq-nvmem-qcm-kyrp_make_Some_variables_static.patch @@ -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 { diff --git a/target/linux/ipq806x/patches-4.19/0036-qcom-cpufreq-nvmem-Re-organise-kryo-cpufreq-driver.patch b/target/linux/ipq806x/patches-4.19/0036-qcom-cpufreq-nvmem-Re-organise-kryo-cpufreq-driver.patch index ab6a37ba37..c7e4569616 100644 --- a/target/linux/ipq806x/patches-4.19/0036-qcom-cpufreq-nvmem-Re-organise-kryo-cpufreq-driver.patch +++ b/target/linux/ipq806x/patches-4.19/0036-qcom-cpufreq-nvmem-Re-organise-kryo-cpufreq-driver.patch @@ -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 +- * 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 enum _msm8996_version qcom_cpufreq_kryo_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_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. -@@ -22,6 +22,7 @@ - #include <linux/module.h> - #include <linux/nvmem-consumer.h> - #include <linux/of.h> ++ * 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> -@@ -42,9 +43,9 @@ enum _msm8996_version { - NUM_OF_MSM8996_VERSIONS, - }; - --static struct platform_device *cpufreq_dt_pdev, *kryo_cpufreq_pdev; ++#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_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; - } - --static int qcom_cpufreq_kryo_probe(struct platform_device *pdev) ++{ ++ 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"); diff --git a/target/linux/ipq806x/patches-4.19/0037-qcom-cpufreq-nvmem-Refactor-the-driver.patch b/target/linux/ipq806x/patches-4.19/0037-qcom-cpufreq-nvmem-Refactor-the-driver.patch index 6c519c2c27..d00b2ccfcb 100644 --- a/target/linux/ipq806x/patches-4.19/0037-qcom-cpufreq-nvmem-Refactor-the-driver.patch +++ b/target/linux/ipq806x/patches-4.19/0037-qcom-cpufreq-nvmem-Refactor-the-driver.patch @@ -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 = { diff --git a/target/linux/ipq806x/patches-4.19/0038-qcom-cpufreq-nvmem-Add-support-for-krait-based-socs.patch b/target/linux/ipq806x/patches-4.19/0038-qcom-cpufreq-nvmem-Add-support-for-krait-based-socs.patch index 13e8ead471..b8895231d8 100644 --- a/target/linux/ipq806x/patches-4.19/0038-qcom-cpufreq-nvmem-Add-support-for-krait-based-socs.patch +++ b/target/linux/ipq806x/patches-4.19/0038-qcom-cpufreq-nvmem-Add-support-for-krait-based-socs.patch @@ -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 }, diff --git a/target/linux/ipq806x/patches-4.19/0049-PM-OPP-Support-adjusting-OPP-voltages-at-runtime.patch b/target/linux/ipq806x/patches-4.19/0049-PM-OPP-Support-adjusting-OPP-voltages-at-runtime.patch index 9181d94901..bb82251bfd 100644 --- a/target/linux/ipq806x/patches-4.19/0049-PM-OPP-Support-adjusting-OPP-voltages-at-runtime.patch +++ b/target/linux/ipq806x/patches-4.19/0049-PM-OPP-Support-adjusting-OPP-voltages-at-runtime.patch @@ -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, diff --git a/target/linux/ipq806x/patches-4.19/0052-PM-OPP-Update-the-voltage-tolerance-when-adjusting-t.patch b/target/linux/ipq806x/patches-4.19/0052-PM-OPP-Update-the-voltage-tolerance-when-adjusting-t.patch index f940d8ca62..8ba2369ddd 100644 --- a/target/linux/ipq806x/patches-4.19/0052-PM-OPP-Update-the-voltage-tolerance-when-adjusting-t.patch +++ b/target/linux/ipq806x/patches-4.19/0052-PM-OPP-Update-the-voltage-tolerance-when-adjusting-t.patch @@ -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; diff --git a/target/linux/ipq806x/patches-4.19/0054-cpufreq-dt-Handle-OPP-voltage-adjust-events.patch b/target/linux/ipq806x/patches-4.19/0054-cpufreq-dt-Handle-OPP-voltage-adjust-events.patch index 5a4232ded3..f60fe3fe2f 100644 --- a/target/linux/ipq806x/patches-4.19/0054-cpufreq-dt-Handle-OPP-voltage-adjust-events.patch +++ b/target/linux/ipq806x/patches-4.19/0054-cpufreq-dt-Handle-OPP-voltage-adjust-events.patch @@ -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); diff --git a/target/linux/ipq806x/patches-4.19/0055-cpufreq-dt-Add-L2-frequency-scaling-support.patch b/target/linux/ipq806x/patches-4.19/0055-cpufreq-dt-Add-L2-frequency-scaling-support.patch index fa9aa3fff0..f27f88f892 100644 --- a/target/linux/ipq806x/patches-4.19/0055-cpufreq-dt-Add-L2-frequency-scaling-support.patch +++ b/target/linux/ipq806x/patches-4.19/0055-cpufreq-dt-Add-L2-frequency-scaling-support.patch @@ -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; diff --git a/target/linux/ipq806x/patches-4.19/0056-cpufreq-dt-Add-missing-rcu-locks.patch b/target/linux/ipq806x/patches-4.19/0056-cpufreq-dt-Add-missing-rcu-locks.patch index 4925efabee..6a98c3303c 100644 --- a/target/linux/ipq806x/patches-4.19/0056-cpufreq-dt-Add-missing-rcu-locks.patch +++ b/target/linux/ipq806x/patches-4.19/0056-cpufreq-dt-Add-missing-rcu-locks.patch @@ -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; } |