| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 | 
							- From 47e161a7873b0891f4e01a69a839f6161d816ea8 Mon Sep 17 00:00:00 2001
 
- From: Robert Marko <[email protected]>
 
- Date: Wed, 25 Oct 2023 14:57:57 +0530
 
- Subject: [PATCH] cpufreq: qcom-nvmem: add support for IPQ6018
 
- IPQ6018 SoC series comes in multiple SKU-s, and not all of them support
 
- high frequency OPP points.
 
- SoC itself does however have a single bit in QFPROM to indicate the CPU
 
- speed-bin.
 
- That bit is used to indicate frequency limit of 1.5GHz, but that alone is
 
- not enough as IPQ6000 only goes up to 1.2GHz, but SMEM ID can be used to
 
- limit it further.
 
- IPQ6018 compatible is blacklisted from DT platdev as the cpufreq device
 
- will get created by NVMEM CPUFreq driver.
 
- Signed-off-by: Robert Marko <[email protected]>
 
- [ Viresh: Fixed rebase conflict. ]
 
- Signed-off-by: Viresh Kumar <[email protected]>
 
- ---
 
-  drivers/cpufreq/cpufreq-dt-platdev.c |  1 +
 
-  drivers/cpufreq/qcom-cpufreq-nvmem.c | 58 ++++++++++++++++++++++++++++
 
-  2 files changed, 59 insertions(+)
 
- --- a/drivers/cpufreq/cpufreq-dt-platdev.c
 
- +++ b/drivers/cpufreq/cpufreq-dt-platdev.c
 
- @@ -163,6 +163,7 @@ static const struct of_device_id blockli
 
-  	{ .compatible = "ti,dra7", },
 
-  	{ .compatible = "ti,omap3", },
 
-  
 
- +	{ .compatible = "qcom,ipq6018", },
 
-  	{ .compatible = "qcom,ipq8064", },
 
-  	{ .compatible = "qcom,apq8064", },
 
-  	{ .compatible = "qcom,msm8974", },
 
- --- a/drivers/cpufreq/qcom-cpufreq-nvmem.c
 
- +++ b/drivers/cpufreq/qcom-cpufreq-nvmem.c
 
- @@ -31,6 +31,8 @@
 
-  
 
-  #include <dt-bindings/arm/qcom,ids.h>
 
-  
 
- +#define IPQ6000_VERSION	BIT(2)
 
- +
 
-  struct qcom_cpufreq_drv;
 
-  
 
-  struct qcom_cpufreq_match_data {
 
- @@ -204,6 +206,57 @@ len_error:
 
-  	return ret;
 
-  }
 
-  
 
- +static int qcom_cpufreq_ipq6018_name_version(struct device *cpu_dev,
 
- +					     struct nvmem_cell *speedbin_nvmem,
 
- +					     char **pvs_name,
 
- +					     struct qcom_cpufreq_drv *drv)
 
- +{
 
- +	u32 msm_id;
 
- +	int ret;
 
- +	u8 *speedbin;
 
- +	*pvs_name = NULL;
 
- +
 
- +	ret = qcom_smem_get_soc_id(&msm_id);
 
- +	if (ret)
 
- +		return ret;
 
- +
 
- +	speedbin = nvmem_cell_read(speedbin_nvmem, NULL);
 
- +	if (IS_ERR(speedbin))
 
- +		return PTR_ERR(speedbin);
 
- +
 
- +	switch (msm_id) {
 
- +	case QCOM_ID_IPQ6005:
 
- +	case QCOM_ID_IPQ6010:
 
- +	case QCOM_ID_IPQ6018:
 
- +	case QCOM_ID_IPQ6028:
 
- +		/* Fuse Value    Freq    BIT to set
 
- +		 * ---------------------------------
 
- +		 *   2’b0     No Limit     BIT(0)
 
- +		 *   2’b1     1.5 GHz      BIT(1)
 
- +		 */
 
- +		drv->versions = 1 << (unsigned int)(*speedbin);
 
- +		break;
 
- +	case QCOM_ID_IPQ6000:
 
- +		/*
 
- +		 * IPQ6018 family only has one bit to advertise the CPU
 
- +		 * speed-bin, but that is not enough for IPQ6000 which
 
- +		 * is only rated up to 1.2GHz.
 
- +		 * So for IPQ6000 manually set BIT(2) based on SMEM ID.
 
- +		 */
 
- +		drv->versions = IPQ6000_VERSION;
 
- +		break;
 
- +	default:
 
- +		dev_err(cpu_dev,
 
- +			"SoC ID %u is not part of IPQ6018 family, limiting to 1.2GHz!\n",
 
- +			msm_id);
 
- +		drv->versions = IPQ6000_VERSION;
 
- +		break;
 
- +	}
 
- +
 
- +	kfree(speedbin);
 
- +	return 0;
 
- +}
 
- +
 
-  static const struct qcom_cpufreq_match_data match_data_kryo = {
 
-  	.get_version = qcom_cpufreq_kryo_name_version,
 
-  };
 
- @@ -218,6 +271,10 @@ static const struct qcom_cpufreq_match_d
 
-  	.genpd_names = qcs404_genpd_names,
 
-  };
 
-  
 
- +static const struct qcom_cpufreq_match_data match_data_ipq6018 = {
 
- +	.get_version = qcom_cpufreq_ipq6018_name_version,
 
- +};
 
- +
 
-  static int qcom_cpufreq_probe(struct platform_device *pdev)
 
-  {
 
-  	struct qcom_cpufreq_drv *drv;
 
- @@ -362,6 +419,7 @@ static const struct of_device_id qcom_cp
 
-  	{ .compatible = "qcom,apq8096", .data = &match_data_kryo },
 
-  	{ .compatible = "qcom,msm8996", .data = &match_data_kryo },
 
-  	{ .compatible = "qcom,qcs404", .data = &match_data_qcs404 },
 
- +	{ .compatible = "qcom,ipq6018", .data = &match_data_ipq6018 },
 
-  	{ .compatible = "qcom,ipq8064", .data = &match_data_krait },
 
-  	{ .compatible = "qcom,apq8064", .data = &match_data_krait },
 
-  	{ .compatible = "qcom,msm8974", .data = &match_data_krait },
 
 
  |