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:
		
				
					committed by
					
						
						Petr Štetiar
					
				
			
			
				
	
			
			
			
						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;
 | 
			
		||||
 		}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user