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 +-
 | 
					 drivers/cpufreq/qcom-cpufreq-kryo.c | 2 +-
 | 
				
			||||||
 1 file changed, 1 insertion(+), 1 deletion(-)
 | 
					 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
 | 
					--- a/drivers/cpufreq/qcom-cpufreq-kryo.c
 | 
				
			||||||
+++ b/drivers/cpufreq/qcom-cpufreq-kryo.c
 | 
					+++ b/drivers/cpufreq/qcom-cpufreq-kryo.c
 | 
				
			||||||
@@ -42,7 +42,7 @@ enum _msm8996_version {
 | 
					@@ -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(-)
 | 
					 4 files changed, 78 insertions(+), 54 deletions(-)
 | 
				
			||||||
 rename drivers/cpufreq/{qcom-cpufreq-kryo.c => qcom-cpufreq-nvmem.c} (69%)
 | 
					 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
 | 
					--- a/drivers/cpufreq/Kconfig.arm
 | 
				
			||||||
+++ b/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
 | 
					 	depends on ARCH_OMAP2PLUS
 | 
				
			||||||
 	default ARCH_OMAP2PLUS
 | 
					 	default ARCH_OMAP2PLUS
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -40,11 +38,9 @@ index 56c31a78c6920..b1aa485a28dde 100644
 | 
				
			|||||||
 	depends on ARM64
 | 
					 	depends on ARM64
 | 
				
			||||||
 	depends on QCOM_QFPROM
 | 
					 	depends on QCOM_QFPROM
 | 
				
			||||||
 	depends on QCOM_SMEM
 | 
					 	depends on QCOM_SMEM
 | 
				
			||||||
diff --git a/drivers/cpufreq/Makefile b/drivers/cpufreq/Makefile
 | 
					 | 
				
			||||||
index 5a6c70d26c985..8572a918aa755 100644
 | 
					 | 
				
			||||||
--- a/drivers/cpufreq/Makefile
 | 
					--- a/drivers/cpufreq/Makefile
 | 
				
			||||||
+++ b/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_OMAP2PLUS_CPUFREQ)	+= omap-cpufreq.o
 | 
				
			||||||
 obj-$(CONFIG_ARM_PXA2xx_CPUFREQ)	+= pxa2xx-cpufreq.o
 | 
					 obj-$(CONFIG_ARM_PXA2xx_CPUFREQ)	+= pxa2xx-cpufreq.o
 | 
				
			||||||
 obj-$(CONFIG_PXA3xx)			+= pxa3xx-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_S3C2410_CPUFREQ)	+= s3c2410-cpufreq.o
 | 
				
			||||||
 obj-$(CONFIG_ARM_S3C2412_CPUFREQ)	+= s3c2412-cpufreq.o
 | 
					 obj-$(CONFIG_ARM_S3C2412_CPUFREQ)	+= s3c2412-cpufreq.o
 | 
				
			||||||
 obj-$(CONFIG_ARM_S3C2416_CPUFREQ)	+= s3c2416-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
 | 
					--- a/drivers/cpufreq/qcom-cpufreq-kryo.c
 | 
				
			||||||
+++ b/drivers/cpufreq/qcom-cpufreq-nvmem.c
 | 
					+++ /dev/null
 | 
				
			||||||
@@ -9,7 +9,7 @@
 | 
					@@ -1,249 +0,0 @@
 | 
				
			||||||
  * based on the silicon variant in use. Qualcomm Process Voltage Scaling Tables
 | 
					-// SPDX-License-Identifier: GPL-2.0
 | 
				
			||||||
  * defines the voltage and frequency value based on the msm-id in SMEM
 | 
					-/*
 | 
				
			||||||
  * and speedbin blown in the efuse combination.
 | 
					- * 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-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.
 | 
				
			||||||
  * to provide the OPP framework with required information.
 | 
					- * This is used to determine the voltage and frequency value for each OPP of
 | 
				
			||||||
  * 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.
 | 
				
			||||||
  * operating-points-v2 table when it is parsed by the OPP framework.
 | 
					- */
 | 
				
			||||||
@@ -22,6 +22,7 @@
 | 
					-
 | 
				
			||||||
 #include <linux/module.h>
 | 
					-#include <linux/cpu.h>
 | 
				
			||||||
 #include <linux/nvmem-consumer.h>
 | 
					-#include <linux/err.h>
 | 
				
			||||||
 #include <linux/of.h>
 | 
					-#include <linux/init.h>
 | 
				
			||||||
+#include <linux/of_device.h>
 | 
					-#include <linux/kernel.h>
 | 
				
			||||||
 #include <linux/platform_device.h>
 | 
					-#include <linux/module.h>
 | 
				
			||||||
 #include <linux/pm_opp.h>
 | 
					-#include <linux/nvmem-consumer.h>
 | 
				
			||||||
 #include <linux/slab.h>
 | 
					-#include <linux/of.h>
 | 
				
			||||||
@@ -42,9 +43,9 @@ enum _msm8996_version {
 | 
					-#include <linux/platform_device.h>
 | 
				
			||||||
 	NUM_OF_MSM8996_VERSIONS,
 | 
					-#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, *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_kryo_get_msm_id(void)
 | 
				
			||||||
+static enum _msm8996_version qcom_cpufreq_get_msm_id(void)
 | 
					-{
 | 
				
			||||||
 {
 | 
					-	size_t len;
 | 
				
			||||||
 	size_t len;
 | 
					-	u32 *msm_id;
 | 
				
			||||||
 	u32 *msm_id;
 | 
					-	enum _msm8996_version version;
 | 
				
			||||||
@@ -73,28 +74,62 @@ static enum _msm8996_version qcom_cpufreq_kryo_get_msm_id(void)
 | 
					-
 | 
				
			||||||
 	return 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)
 | 
					-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,
 | 
					+static int qcom_cpufreq_kryo_name_version(struct device *cpu_dev,
 | 
				
			||||||
+					  struct nvmem_cell *speedbin_nvmem,
 | 
					+					  struct nvmem_cell *speedbin_nvmem,
 | 
				
			||||||
+					  u32 *versions)
 | 
					+					  u32 *versions)
 | 
				
			||||||
 {
 | 
					+{
 | 
				
			||||||
-	struct opp_table **opp_tables;
 | 
					 | 
				
			||||||
+	size_t len;
 | 
					+	size_t len;
 | 
				
			||||||
+	u8 *speedbin;
 | 
					+	u8 *speedbin;
 | 
				
			||||||
 	enum _msm8996_version msm8996_version;
 | 
					+	enum _msm8996_version msm8996_version;
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
+	msm8996_version = qcom_cpufreq_get_msm_id();
 | 
					+	msm8996_version = qcom_cpufreq_get_msm_id();
 | 
				
			||||||
+	if (NUM_OF_MSM8996_VERSIONS == msm8996_version) {
 | 
					+	if (NUM_OF_MSM8996_VERSIONS == msm8996_version) {
 | 
				
			||||||
@@ -135,147 +420,160 @@ index dd64dcf89c74c..fd08120768af2 100644
 | 
				
			|||||||
+	int (*get_version)(struct device *cpu_dev,
 | 
					+	int (*get_version)(struct device *cpu_dev,
 | 
				
			||||||
+			   struct nvmem_cell *speedbin_nvmem,
 | 
					+			   struct nvmem_cell *speedbin_nvmem,
 | 
				
			||||||
+			   u32 *versions);
 | 
					+			   u32 *versions);
 | 
				
			||||||
 	struct nvmem_cell *speedbin_nvmem;
 | 
					+	struct nvmem_cell *speedbin_nvmem;
 | 
				
			||||||
 	struct device_node *np;
 | 
					+	struct device_node *np;
 | 
				
			||||||
 	struct device *cpu_dev;
 | 
					+	struct device *cpu_dev;
 | 
				
			||||||
 	unsigned cpu;
 | 
					+	unsigned cpu;
 | 
				
			||||||
-	u8 *speedbin;
 | 
					+	u32 versions;
 | 
				
			||||||
 	u32 versions;
 | 
					 | 
				
			||||||
-	size_t len;
 | 
					 | 
				
			||||||
+	const struct of_device_id *match;
 | 
					+	const struct of_device_id *match;
 | 
				
			||||||
 	int ret;
 | 
					+	int ret;
 | 
				
			||||||
 
 | 
					+
 | 
				
			||||||
 	cpu_dev = get_cpu_device(0);
 | 
					+	cpu_dev = get_cpu_device(0);
 | 
				
			||||||
 	if (!cpu_dev)
 | 
					+	if (!cpu_dev)
 | 
				
			||||||
 		return -ENODEV;
 | 
					+		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!");
 | 
					 | 
				
			||||||
+	match = pdev->dev.platform_data;
 | 
					+	match = pdev->dev.platform_data;
 | 
				
			||||||
+	get_version = match->data;
 | 
					+	get_version = match->data;
 | 
				
			||||||
+	if (!get_version)
 | 
					+	if (!get_version)
 | 
				
			||||||
 		return -ENODEV;
 | 
					+		return -ENODEV;
 | 
				
			||||||
-	}
 | 
					+
 | 
				
			||||||
 
 | 
					+	np = dev_pm_opp_of_get_opp_desc_node(cpu_dev);
 | 
				
			||||||
 	np = dev_pm_opp_of_get_opp_desc_node(cpu_dev);
 | 
					+	if (!np)
 | 
				
			||||||
 	if (!np)
 | 
					+		return -ENOENT;
 | 
				
			||||||
@@ -115,23 +150,10 @@ static int qcom_cpufreq_kryo_probe(struct platform_device *pdev)
 | 
					+
 | 
				
			||||||
 		return PTR_ERR(speedbin_nvmem);
 | 
					+	ret = of_device_is_compatible(np, "operating-points-v2-kryo-cpu");
 | 
				
			||||||
 	}
 | 
					+	if (!ret) {
 | 
				
			||||||
 
 | 
					+		of_node_put(np);
 | 
				
			||||||
-	speedbin = nvmem_cell_read(speedbin_nvmem, &len);
 | 
					+		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);
 | 
					+	ret = get_version(cpu_dev, speedbin_nvmem, &versions);
 | 
				
			||||||
 	nvmem_cell_put(speedbin_nvmem);
 | 
					+	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);
 | 
					 | 
				
			||||||
+	if (ret)
 | 
					+	if (ret)
 | 
				
			||||||
+		return ret;
 | 
					+		return ret;
 | 
				
			||||||
 
 | 
					+
 | 
				
			||||||
 	opp_tables = kcalloc(num_possible_cpus(), sizeof(*opp_tables), GFP_KERNEL);
 | 
					+	opp_tables = kcalloc(num_possible_cpus(), sizeof(*opp_tables), GFP_KERNEL);
 | 
				
			||||||
 	if (!opp_tables)
 | 
					+	if (!opp_tables)
 | 
				
			||||||
@@ -174,7 +196,7 @@ static int qcom_cpufreq_kryo_probe(struct platform_device *pdev)
 | 
					+		return -ENOMEM;
 | 
				
			||||||
 	return ret;
 | 
					+
 | 
				
			||||||
 }
 | 
					+	for_each_possible_cpu(cpu) {
 | 
				
			||||||
 
 | 
					+		cpu_dev = get_cpu_device(cpu);
 | 
				
			||||||
-static int qcom_cpufreq_kryo_remove(struct platform_device *pdev)
 | 
					+		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)
 | 
					+static int qcom_cpufreq_remove(struct platform_device *pdev)
 | 
				
			||||||
 {
 | 
					+{
 | 
				
			||||||
 	struct opp_table **opp_tables = platform_get_drvdata(pdev);
 | 
					+	struct opp_table **opp_tables = platform_get_drvdata(pdev);
 | 
				
			||||||
 	unsigned int cpu;
 | 
					+	unsigned int cpu;
 | 
				
			||||||
@@ -189,18 +211,20 @@ static int qcom_cpufreq_kryo_remove(struct platform_device *pdev)
 | 
					+
 | 
				
			||||||
 	return 0;
 | 
					+	platform_device_unregister(cpufreq_dt_pdev);
 | 
				
			||||||
 }
 | 
					+
 | 
				
			||||||
 
 | 
					+	for_each_possible_cpu(cpu)
 | 
				
			||||||
-static struct platform_driver qcom_cpufreq_kryo_driver = {
 | 
					+		dev_pm_opp_put_supported_hw(opp_tables[cpu]);
 | 
				
			||||||
-	.probe = qcom_cpufreq_kryo_probe,
 | 
					+
 | 
				
			||||||
-	.remove = qcom_cpufreq_kryo_remove,
 | 
					+	kfree(opp_tables);
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
 | 
					+	return 0;
 | 
				
			||||||
 | 
					+}
 | 
				
			||||||
 | 
					+
 | 
				
			||||||
+static struct platform_driver qcom_cpufreq_driver = {
 | 
					+static struct platform_driver qcom_cpufreq_driver = {
 | 
				
			||||||
+	.probe = qcom_cpufreq_probe,
 | 
					+	.probe = qcom_cpufreq_probe,
 | 
				
			||||||
+	.remove = qcom_cpufreq_remove,
 | 
					+	.remove = qcom_cpufreq_remove,
 | 
				
			||||||
 	.driver = {
 | 
					+	.driver = {
 | 
				
			||||||
-		.name = "qcom-cpufreq-kryo",
 | 
					 | 
				
			||||||
+		.name = "qcom-cpufreq-nvmem",
 | 
					+		.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 = {
 | 
					+static const struct of_device_id qcom_cpufreq_match_list[] __initconst = {
 | 
				
			||||||
+	{ .compatible = "qcom,apq8096",
 | 
					+	{ .compatible = "qcom,apq8096",
 | 
				
			||||||
+	  .data = qcom_cpufreq_kryo_name_version },
 | 
					+	  .data = qcom_cpufreq_kryo_name_version },
 | 
				
			||||||
+	{ .compatible = "qcom,msm8996",
 | 
					+	{ .compatible = "qcom,msm8996",
 | 
				
			||||||
+	  .data = qcom_cpufreq_kryo_name_version },
 | 
					+	  .data = qcom_cpufreq_kryo_name_version },
 | 
				
			||||||
+	{},
 | 
					+	{},
 | 
				
			||||||
 };
 | 
					+};
 | 
				
			||||||
 
 | 
					+
 | 
				
			||||||
 /*
 | 
					+/*
 | 
				
			||||||
@@ -209,7 +233,7 @@ static const struct of_device_id qcom_cpufreq_kryo_match_list[] __initconst = {
 | 
					+ * Since the driver depends on smem and nvmem drivers, which may
 | 
				
			||||||
  * which may be defered as well. The init here is only registering
 | 
					+ * return EPROBE_DEFER, all the real activity is done in the probe,
 | 
				
			||||||
  * the driver and the platform device.
 | 
					+ * 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)
 | 
					+ */
 | 
				
			||||||
+static int __init qcom_cpufreq_init(void)
 | 
					+static int __init qcom_cpufreq_init(void)
 | 
				
			||||||
 {
 | 
					+{
 | 
				
			||||||
 	struct device_node *np = of_find_node_by_path("/");
 | 
					+	struct device_node *np = of_find_node_by_path("/");
 | 
				
			||||||
 	const struct of_device_id *match;
 | 
					+	const struct of_device_id *match;
 | 
				
			||||||
@@ -218,32 +242,32 @@ static int __init qcom_cpufreq_kryo_init(void)
 | 
					+	int ret;
 | 
				
			||||||
 	if (!np)
 | 
					+
 | 
				
			||||||
 		return -ENODEV;
 | 
					+	if (!np)
 | 
				
			||||||
 
 | 
					+		return -ENODEV;
 | 
				
			||||||
-	match = of_match_node(qcom_cpufreq_kryo_match_list, np);
 | 
					+
 | 
				
			||||||
+	match = of_match_node(qcom_cpufreq_match_list, np);
 | 
					+	match = of_match_node(qcom_cpufreq_match_list, np);
 | 
				
			||||||
 	of_node_put(np);
 | 
					+	of_node_put(np);
 | 
				
			||||||
 	if (!match)
 | 
					+	if (!match)
 | 
				
			||||||
 		return -ENODEV;
 | 
					+		return -ENODEV;
 | 
				
			||||||
 
 | 
					+
 | 
				
			||||||
-	ret = platform_driver_register(&qcom_cpufreq_kryo_driver);
 | 
					 | 
				
			||||||
+	ret = platform_driver_register(&qcom_cpufreq_driver);
 | 
					+	ret = platform_driver_register(&qcom_cpufreq_driver);
 | 
				
			||||||
 	if (unlikely(ret < 0))
 | 
					+	if (unlikely(ret < 0))
 | 
				
			||||||
 		return ret;
 | 
					+		return ret;
 | 
				
			||||||
 
 | 
					+
 | 
				
			||||||
-	kryo_cpufreq_pdev = platform_device_register_simple(
 | 
					 | 
				
			||||||
-		"qcom-cpufreq-kryo", -1, NULL, 0);
 | 
					 | 
				
			||||||
-	ret = PTR_ERR_OR_ZERO(kryo_cpufreq_pdev);
 | 
					 | 
				
			||||||
+	cpufreq_pdev = platform_device_register_data(NULL, "qcom-cpufreq-nvmem",
 | 
					+	cpufreq_pdev = platform_device_register_data(NULL, "qcom-cpufreq-nvmem",
 | 
				
			||||||
+						     -1, match, sizeof(*match));
 | 
					+						     -1, match, sizeof(*match));
 | 
				
			||||||
+	ret = PTR_ERR_OR_ZERO(cpufreq_pdev);
 | 
					+	ret = PTR_ERR_OR_ZERO(cpufreq_pdev);
 | 
				
			||||||
 	if (0 == ret)
 | 
					+	if (0 == ret)
 | 
				
			||||||
 		return 0;
 | 
					+		return 0;
 | 
				
			||||||
 
 | 
					+
 | 
				
			||||||
-	platform_driver_unregister(&qcom_cpufreq_kryo_driver);
 | 
					 | 
				
			||||||
+	platform_driver_unregister(&qcom_cpufreq_driver);
 | 
					+	platform_driver_unregister(&qcom_cpufreq_driver);
 | 
				
			||||||
 	return ret;
 | 
					+	return ret;
 | 
				
			||||||
 }
 | 
					+}
 | 
				
			||||||
-module_init(qcom_cpufreq_kryo_init);
 | 
					 | 
				
			||||||
+module_init(qcom_cpufreq_init);
 | 
					+module_init(qcom_cpufreq_init);
 | 
				
			||||||
 
 | 
					+
 | 
				
			||||||
-static void __exit qcom_cpufreq_kryo_exit(void)
 | 
					 | 
				
			||||||
+static void __exit qcom_cpufreq_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_device_unregister(cpufreq_pdev);
 | 
				
			||||||
+	platform_driver_unregister(&qcom_cpufreq_driver);
 | 
					+	platform_driver_unregister(&qcom_cpufreq_driver);
 | 
				
			||||||
 }
 | 
					+}
 | 
				
			||||||
-module_exit(qcom_cpufreq_kryo_exit);
 | 
					 | 
				
			||||||
+module_exit(qcom_cpufreq_exit);
 | 
					+module_exit(qcom_cpufreq_exit);
 | 
				
			||||||
 
 | 
					+
 | 
				
			||||||
-MODULE_DESCRIPTION("Qualcomm Technologies, Inc. Kryo CPUfreq driver");
 | 
					 | 
				
			||||||
+MODULE_DESCRIPTION("Qualcomm Technologies, Inc. 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 +++++++++++++++++----------
 | 
					 drivers/cpufreq/qcom-cpufreq-nvmem.c | 123 +++++++++++++++++----------
 | 
				
			||||||
 1 file changed, 79 insertions(+), 44 deletions(-)
 | 
					 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
 | 
					--- a/drivers/cpufreq/qcom-cpufreq-nvmem.c
 | 
				
			||||||
+++ b/drivers/cpufreq/qcom-cpufreq-nvmem.c
 | 
					+++ b/drivers/cpufreq/qcom-cpufreq-nvmem.c
 | 
				
			||||||
@@ -43,6 +43,20 @@ enum _msm8996_version {
 | 
					@@ -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 struct platform_device *cpufreq_dt_pdev, *cpufreq_pdev;
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 static enum _msm8996_version qcom_cpufreq_get_msm_id(void)
 | 
					 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,
 | 
					 static int qcom_cpufreq_kryo_name_version(struct device *cpu_dev,
 | 
				
			||||||
 					  struct nvmem_cell *speedbin_nvmem,
 | 
					 					  struct nvmem_cell *speedbin_nvmem,
 | 
				
			||||||
@@ -54,7 +52,7 @@ index fd08120768af2..2d798a1685c5d 100644
 | 
				
			|||||||
 {
 | 
					 {
 | 
				
			||||||
 	size_t len;
 | 
					 	size_t len;
 | 
				
			||||||
 	u8 *speedbin;
 | 
					 	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) {
 | 
					 	switch (msm8996_version) {
 | 
				
			||||||
 	case MSM8996_V3:
 | 
					 	case MSM8996_V3:
 | 
				
			||||||
@@ -67,7 +65,7 @@ index fd08120768af2..2d798a1685c5d 100644
 | 
				
			|||||||
 		break;
 | 
					 		break;
 | 
				
			||||||
 	default:
 | 
					 	default:
 | 
				
			||||||
 		BUG();
 | 
					 		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;
 | 
					 	return 0;
 | 
				
			||||||
 }
 | 
					 }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -90,7 +88,7 @@ index fd08120768af2..2d798a1685c5d 100644
 | 
				
			|||||||
 	const struct of_device_id *match;
 | 
					 	const struct of_device_id *match;
 | 
				
			||||||
 	int ret;
 | 
					 	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)
 | 
					 	if (!cpu_dev)
 | 
				
			||||||
 		return -ENODEV;
 | 
					 		return -ENODEV;
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -102,7 +100,7 @@ index fd08120768af2..2d798a1685c5d 100644
 | 
				
			|||||||
 	np = dev_pm_opp_of_get_opp_desc_node(cpu_dev);
 | 
					 	np = dev_pm_opp_of_get_opp_desc_node(cpu_dev);
 | 
				
			||||||
 	if (!np)
 | 
					 	if (!np)
 | 
				
			||||||
 		return -ENOENT;
 | 
					 		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;
 | 
					 		return -ENOENT;
 | 
				
			||||||
 	}
 | 
					 	}
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -160,7 +158,7 @@ index fd08120768af2..2d798a1685c5d 100644
 | 
				
			|||||||
 
 | 
					 
 | 
				
			||||||
 	for_each_possible_cpu(cpu) {
 | 
					 	for_each_possible_cpu(cpu) {
 | 
				
			||||||
 		cpu_dev = get_cpu_device(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;
 | 
					 			goto free_opp;
 | 
				
			||||||
 		}
 | 
					 		}
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -191,7 +189,7 @@ index fd08120768af2..2d798a1685c5d 100644
 | 
				
			|||||||
 		return 0;
 | 
					 		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:
 | 
					 free_opp:
 | 
				
			||||||
 	for_each_possible_cpu(cpu) {
 | 
					 	for_each_possible_cpu(cpu) {
 | 
				
			||||||
@@ -228,7 +226,7 @@ index fd08120768af2..2d798a1685c5d 100644
 | 
				
			|||||||
 
 | 
					 
 | 
				
			||||||
 	return 0;
 | 
					 	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 = {
 | 
					 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
 | 
					#  - nvmem-cells: A phandle pointing to a nvmem-cells node representing the
 | 
				
			||||||
#  		efuse registers that has information about the
 | 
					#  		efuse registers that has information about the
 | 
				
			||||||
#  		speedbin that is used to select the right frequency/voltage
 | 
					#  		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
 | 
					--- a/drivers/cpufreq/Kconfig.arm
 | 
				
			||||||
+++ b/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
 | 
					 config ARM_QCOM_CPUFREQ_NVMEM
 | 
				
			||||||
 	tristate "Qualcomm nvmem based CPUFreq"
 | 
					 	tristate "Qualcomm nvmem based CPUFreq"
 | 
				
			||||||
@@ -52,11 +50,9 @@ index 13fbd97..497ae89 100644
 | 
				
			|||||||
 	depends on QCOM_QFPROM
 | 
					 	depends on QCOM_QFPROM
 | 
				
			||||||
 	depends on QCOM_SMEM
 | 
					 	depends on QCOM_SMEM
 | 
				
			||||||
 	select PM_OPP
 | 
					 	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
 | 
					--- a/drivers/cpufreq/cpufreq-dt-platdev.c
 | 
				
			||||||
+++ b/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,am43", },
 | 
				
			||||||
 	{ .compatible = "ti,dra7", },
 | 
					 	{ .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
 | 
					--- a/drivers/cpufreq/qcom-cpufreq-nvmem.c
 | 
				
			||||||
+++ b/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 {
 | 
					 struct qcom_cpufreq_match_data {
 | 
				
			||||||
 	int (*get_version)(struct device *cpu_dev,
 | 
					 	int (*get_version)(struct device *cpu_dev,
 | 
				
			||||||
 			   struct nvmem_cell *speedbin_nvmem,
 | 
					 			   struct nvmem_cell *speedbin_nvmem,
 | 
				
			||||||
@@ -166,7 +160,7 @@ index 0ad8e5b..5f2add0 100644
 | 
				
			|||||||
 static enum _msm8996_version qcom_cpufreq_get_msm_id(void)
 | 
					 static enum _msm8996_version qcom_cpufreq_get_msm_id(void)
 | 
				
			||||||
 {
 | 
					 {
 | 
				
			||||||
 	size_t len;
 | 
					 	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,
 | 
					 static int qcom_cpufreq_kryo_name_version(struct device *cpu_dev,
 | 
				
			||||||
 					  struct nvmem_cell *speedbin_nvmem,
 | 
					 					  struct nvmem_cell *speedbin_nvmem,
 | 
				
			||||||
@@ -180,7 +174,7 @@ index 0ad8e5b..5f2add0 100644
 | 
				
			|||||||
 
 | 
					 
 | 
				
			||||||
 	msm8996_version = qcom_cpufreq_get_msm_id();
 | 
					 	msm8996_version = qcom_cpufreq_get_msm_id();
 | 
				
			||||||
 	if (NUM_OF_MSM8996_VERSIONS == msm8996_version) {
 | 
					 	if (NUM_OF_MSM8996_VERSIONS == msm8996_version) {
 | 
				
			||||||
@@ -122,16 +199,51 @@
 | 
					@@ -122,16 +199,51 @@ static int qcom_cpufreq_kryo_name_versio
 | 
				
			||||||
 	return 0;
 | 
					 	return 0;
 | 
				
			||||||
 }
 | 
					 }
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -232,7 +226,7 @@ index 0ad8e5b..5f2add0 100644
 | 
				
			|||||||
 	unsigned cpu;
 | 
					 	unsigned cpu;
 | 
				
			||||||
 	const struct of_device_id *match;
 | 
					 	const struct of_device_id *match;
 | 
				
			||||||
 	int ret;
 | 
					 	int ret;
 | 
				
			||||||
@@ -144,7 +256,7 @@
 | 
					@@ -144,7 +256,7 @@ static int qcom_cpufreq_probe(struct pla
 | 
				
			||||||
 	if (!np)
 | 
					 	if (!np)
 | 
				
			||||||
 		return -ENOENT;
 | 
					 		return -ENOENT;
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -241,7 +235,7 @@ index 0ad8e5b..5f2add0 100644
 | 
				
			|||||||
 	if (!ret) {
 | 
					 	if (!ret) {
 | 
				
			||||||
 		of_node_put(np);
 | 
					 		of_node_put(np);
 | 
				
			||||||
 		return -ENOENT;
 | 
					 		return -ENOENT;
 | 
				
			||||||
@@ -172,7 +284,7 @@
 | 
					@@ -172,7 +284,7 @@ static int qcom_cpufreq_probe(struct pla
 | 
				
			||||||
 			goto free_drv;
 | 
					 			goto free_drv;
 | 
				
			||||||
 		}
 | 
					 		}
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -250,7 +244,7 @@ index 0ad8e5b..5f2add0 100644
 | 
				
			|||||||
 		if (ret) {
 | 
					 		if (ret) {
 | 
				
			||||||
 			nvmem_cell_put(speedbin_nvmem);
 | 
					 			nvmem_cell_put(speedbin_nvmem);
 | 
				
			||||||
 			goto free_drv;
 | 
					 			goto free_drv;
 | 
				
			||||||
@@ -181,12 +293,18 @@
 | 
					@@ -181,12 +293,18 @@ static int qcom_cpufreq_probe(struct pla
 | 
				
			||||||
 	}
 | 
					 	}
 | 
				
			||||||
 	of_node_put(np);
 | 
					 	of_node_put(np);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -271,7 +265,7 @@ index 0ad8e5b..5f2add0 100644
 | 
				
			|||||||
 
 | 
					 
 | 
				
			||||||
 	for_each_possible_cpu(cpu) {
 | 
					 	for_each_possible_cpu(cpu) {
 | 
				
			||||||
 		cpu_dev = get_cpu_device(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) {
 | 
					 		if (drv->data->get_version) {
 | 
				
			||||||
@@ -298,7 +292,7 @@ index 0ad8e5b..5f2add0 100644
 | 
				
			|||||||
 				dev_err(cpu_dev,
 | 
					 				dev_err(cpu_dev,
 | 
				
			||||||
 					"Failed to set supported hardware\n");
 | 
					 					"Failed to set supported hardware\n");
 | 
				
			||||||
 				goto free_opp;
 | 
					 				goto free_opp;
 | 
				
			||||||
@@ -220,11 +349,18 @@
 | 
					@@ -220,11 +349,18 @@ static int qcom_cpufreq_probe(struct pla
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 free_opp:
 | 
					 free_opp:
 | 
				
			||||||
 	for_each_possible_cpu(cpu) {
 | 
					 	for_each_possible_cpu(cpu) {
 | 
				
			||||||
@@ -320,7 +314,7 @@ index 0ad8e5b..5f2add0 100644
 | 
				
			|||||||
 free_drv:
 | 
					 free_drv:
 | 
				
			||||||
 	kfree(drv);
 | 
					 	kfree(drv);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -239,10 +375,14 @@
 | 
					@@ -239,10 +375,14 @@ static int qcom_cpufreq_remove(struct pl
 | 
				
			||||||
 	platform_device_unregister(cpufreq_dt_pdev);
 | 
					 	platform_device_unregister(cpufreq_dt_pdev);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 	for_each_possible_cpu(cpu)
 | 
					 	for_each_possible_cpu(cpu)
 | 
				
			||||||
@@ -338,7 +332,7 @@ index 0ad8e5b..5f2add0 100644
 | 
				
			|||||||
 	kfree(drv);
 | 
					 	kfree(drv);
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 	return 0;
 | 
					 	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 = {
 | 
					 static const struct of_device_id qcom_cpufreq_match_list[] __initconst = {
 | 
				
			||||||
 	{ .compatible = "qcom,apq8096", .data = &match_data_kryo },
 | 
					 	{ .compatible = "qcom,apq8096", .data = &match_data_kryo },
 | 
				
			||||||
 	{ .compatible = "qcom,msm8996", .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 ++++++++
 | 
					 include/linux/pm_opp.h | 13 ++++++++
 | 
				
			||||||
 2 files changed, 82 insertions(+)
 | 
					 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
 | 
					--- a/drivers/opp/core.c
 | 
				
			||||||
+++ b/drivers/opp/core.c
 | 
					+++ b/drivers/opp/core.c
 | 
				
			||||||
@@ -2112,6 +2112,75 @@ static int _opp_set_availability(struct device *dev, unsigned long freq,
 | 
					@@ -1623,6 +1623,75 @@ put_table:
 | 
				
			||||||
 	return r;
 | 
					 | 
				
			||||||
 }
 | 
					 }
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
+/**
 | 
					 /**
 | 
				
			||||||
+ * dev_pm_opp_adjust_voltage() - helper to change the voltage of an OPP
 | 
					+ * dev_pm_opp_adjust_voltage() - helper to change the voltage of an OPP
 | 
				
			||||||
+ * @dev:		device for which we do this operation
 | 
					+ * @dev:		device for which we do this operation
 | 
				
			||||||
+ * @freq:		OPP frequency to adjust voltage of
 | 
					+ * @freq:		OPP frequency to adjust voltage of
 | 
				
			||||||
@@ -114,36 +111,35 @@ index 3b7ffd0234e9..f38b3be85072 100644
 | 
				
			|||||||
+	return r;
 | 
					+	return r;
 | 
				
			||||||
+}
 | 
					+}
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
 /**
 | 
					+/**
 | 
				
			||||||
  * dev_pm_opp_enable() - Enable a specific OPP
 | 
					  * dev_pm_opp_enable() - Enable a specific OPP
 | 
				
			||||||
  * @dev:	device for which we do this operation
 | 
					  * @dev:	device for which we do this operation
 | 
				
			||||||
diff --git a/include/linux/pm_opp.h b/include/linux/pm_opp.h
 | 
					  * @freq:	OPP frequency to enable
 | 
				
			||||||
index b8197ab014f2..747861816f4f 100644
 | 
					 | 
				
			||||||
--- a/include/linux/pm_opp.h
 | 
					--- a/include/linux/pm_opp.h
 | 
				
			||||||
+++ b/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 {
 | 
					 enum dev_pm_opp_event {
 | 
				
			||||||
 	OPP_EVENT_ADD, OPP_EVENT_REMOVE, OPP_EVENT_ENABLE, OPP_EVENT_DISABLE,
 | 
					 	OPP_EVENT_ADD, OPP_EVENT_REMOVE, OPP_EVENT_ENABLE, OPP_EVENT_DISABLE,
 | 
				
			||||||
+	OPP_EVENT_ADJUST_VOLTAGE,
 | 
					+	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(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,
 | 
					+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, unsigned long u_volt_min,
 | 
				
			||||||
+			      unsigned long u_volt_max);
 | 
					+			      unsigned long u_volt_max);
 | 
				
			||||||
+
 | 
					+
 | 
				
			||||||
 int dev_pm_opp_enable(struct device *dev, unsigned long freq);
 | 
					 int dev_pm_opp_enable(struct device *dev, unsigned long freq);
 | 
				
			||||||
 | 
					 
 | 
				
			||||||
 int dev_pm_opp_disable(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
 | 
					+static inline int
 | 
				
			||||||
+dev_pm_opp_adjust_voltage(struct device *dev, unsigned long freq,
 | 
					+dev_pm_opp_adjust_voltage(struct device *dev, unsigned long freq,
 | 
				
			||||||
+			  unsigned long u_volt, unsigned long u_volt_min,
 | 
					+			  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
 | 
					--- a/drivers/opp/core.c
 | 
				
			||||||
+++ b/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 opp_table *opp_table;
 | 
				
			||||||
 	struct dev_pm_opp *tmp_opp, *opp = ERR_PTR(-ENODEV);
 | 
					 	struct dev_pm_opp *tmp_opp, *opp = ERR_PTR(-ENODEV);
 | 
				
			||||||
 	int r = 0;
 | 
					 	int r = 0;
 | 
				
			||||||
@@ -25,7 +25,7 @@ Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org>
 | 
				
			|||||||
 
 | 
					 
 | 
				
			||||||
 	/* Find the opp_table */
 | 
					 	/* Find the opp_table */
 | 
				
			||||||
 	opp_table = _find_opp_table(dev);
 | 
					 	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;
 | 
					 		goto adjust_unlock;
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 	opp->supplies->u_volt = u_volt;
 | 
					 	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);
 | 
					 	cpu_dev = get_cpu_device(policy->cpu);
 | 
				
			||||||
 	if (!cpu_dev) {
 | 
					 	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);
 | 
					 				__func__, ret);
 | 
				
			||||||
 	}
 | 
					 	}
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
@@ -114,7 +114,7 @@ Signed-off-by: Georgi Djakov <georgi.djakov@linaro.org>
 | 
				
			|||||||
 	}
 | 
					 	}
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
 	priv->cpu_dev = cpu_dev;
 | 
					 	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:
 | 
					 out_free_cpufreq_table:
 | 
				
			||||||
 	dev_pm_opp_free_cpufreq_table(cpu_dev, &freq_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;
 | 
					 		priv->opp_freq = freq * 1000;
 | 
				
			||||||
 		arch_set_freq_scale(policy->related_cpus, freq,
 | 
					 		arch_set_freq_scale(policy->related_cpus, freq,
 | 
				
			||||||
 				    policy->cpuinfo.max_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;
 | 
					 	const char *name;
 | 
				
			||||||
 	int ret;
 | 
					 	int ret;
 | 
				
			||||||
 	struct srcu_notifier_head *opp_srcu_head;
 | 
					 	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);
 | 
					 	cpu_dev = get_cpu_device(policy->cpu);
 | 
				
			||||||
 	if (!cpu_dev) {
 | 
					 	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;
 | 
					 	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
 | 
					--- a/drivers/cpufreq/cpufreq-dt.c
 | 
				
			||||||
+++ b/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);
 | 
					 			ret = PTR_ERR(cpu_reg);
 | 
				
			||||||
 			goto out;
 | 
					 			goto out;
 | 
				
			||||||
 		}
 | 
					 		}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user