ipq806x: refresh new and changed patches
authorAnsuel Smith <ansuelsmth@gmail.com>
Mon, 16 Dec 2019 19:26:25 +0000 (20:26 +0100)
committerPetr Štetiar <ynezz@true.cz>
Thu, 26 Dec 2019 07:31:42 +0000 (08:31 +0100)
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>
target/linux/ipq806x/patches-4.19/0035-qcom-cpufreq-nvmem-qcm-kyrp_make_Some_variables_static.patch
target/linux/ipq806x/patches-4.19/0036-qcom-cpufreq-nvmem-Re-organise-kryo-cpufreq-driver.patch
target/linux/ipq806x/patches-4.19/0037-qcom-cpufreq-nvmem-Refactor-the-driver.patch
target/linux/ipq806x/patches-4.19/0038-qcom-cpufreq-nvmem-Add-support-for-krait-based-socs.patch
target/linux/ipq806x/patches-4.19/0049-PM-OPP-Support-adjusting-OPP-voltages-at-runtime.patch
target/linux/ipq806x/patches-4.19/0052-PM-OPP-Update-the-voltage-tolerance-when-adjusting-t.patch
target/linux/ipq806x/patches-4.19/0054-cpufreq-dt-Handle-OPP-voltage-adjust-events.patch
target/linux/ipq806x/patches-4.19/0055-cpufreq-dt-Add-L2-frequency-scaling-support.patch
target/linux/ipq806x/patches-4.19/0056-cpufreq-dt-Add-missing-rcu-locks.patch

index d445c0e190c1d3cccf93aa65561158ddc0a21ac0..a51153b2aa68c73f9f92cb8b63d76cf7d9307f2f 100644 (file)
@@ -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 {
index ab6a37ba37f13b41dca05268a4c2522f00b43fee..c7e4569616c768ee5e0a510b16bc4c7c6777563b 100644 (file)
@@ -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");
index 6c519c2c27c397e5ab3b6a0eae5ebca4ec295c43..d00b2ccfcb2815fe872136e6385608720e4bd112 100644 (file)
@@ -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 = {
index 13e8ead471ff7d856a81530fec8ef1dfed455914..b8895231d8dd24af773a3b5ef0d94d30d7b68c03 100644 (file)
@@ -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 },
index 9181d949011d451171f8c761635a704d35406359..bb82251bfd8fde40de62b9935e1439853dafc7d2 100644 (file)
@@ -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,
index f940d8ca624be6e35c35d7fe2df396b17b11fa7d..8ba2369dddeca5267fd32d502bb677c874976bee 100644 (file)
@@ -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;
index 5a4232ded34dfced7f298f3fa220e0eabf5077f7..f60fe3fe2f29621b31ce2d27347b74e349b08223 100644 (file)
@@ -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);
index fa9aa3fff00183dc119d69be645904bc276b81dd..f27f88f8923cf3da1b21a13fbdb2294adb7e78cf 100644 (file)
@@ -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;
  
index 4925efabee4fc923d6a77ef94253c72c6a746e84..6a98c3303ccf6dc97ec3fc278596d5c099209f6a 100644 (file)
@@ -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;
                }