msm: dcvs: provide frequency set/get callbacks at registration.

There is no need to register a separate structure for setting and
getting frequency.

Simply pass function pointers to set and get callbacks when a
core is registered.

While at it rename the msm_dcvs_freq_sink_register/unregister to
msm_dcvs_freq_sink_start/stop to better reflect that those
apis are meant to do.

Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
(cherry picked from commit 69134111c2a24002d1995a05c99f84403ac6a7e8)

Signed-off-by: Ram Kumar Chakravarthy Chebathini <rcheba@codeaurora.org>
(cherry picked from commit 52cb57c3c6bc1c0d08c1ae9eb5dd0ff1e1125a96)

Change-Id: Iee7aee1cbb2f33ed2852f1816ab62416b96fa7e6
Signed-off-by: Sudhir Sharma <sudsha@codeaurora.org>
diff --git a/arch/arm/mach-msm/include/mach/msm_dcvs.h b/arch/arm/mach-msm/include/mach/msm_dcvs.h
index fe99c0f..3ac0e74 100644
--- a/arch/arm/mach-msm/include/mach/msm_dcvs.h
+++ b/arch/arm/mach-msm/include/mach/msm_dcvs.h
@@ -46,6 +46,17 @@
 };
 
 /**
+ * struct msm_dcvs_freq
+ *
+ * API for clock driver code to register and receive frequency change
+ * request for the core from the msm_dcvs driver.
+ */
+struct msm_dcvs_freq {
+	const char *core_name;
+	/* Callback from msm_dcvs to set the core frequency */
+};
+
+/**
  * msm_dcvs_idle_source_register
  * @drv: Pointer to the source driver
  * @return: Handle to be used for sending idle state notifications.
@@ -113,35 +124,25 @@
  * msm_dcvs_freq_sink_register
  * Cores that need to run synchronously must share the same group id.
  */
-extern int msm_dcvs_register_core(const char *core_name,
-		struct msm_dcvs_core_info *info, int sensor);
+extern int msm_dcvs_register_core(
+	const char *core_name,
+	struct msm_dcvs_core_info *info,
+	int (*set_frequency)(struct msm_dcvs_freq *self, unsigned int freq),
+	unsigned int (*get_frequency)(struct msm_dcvs_freq *self),
+	int sensor);
 
 /**
- * struct msm_dcvs_freq
- *
- * API for clock driver code to register and receive frequency change
- * request for the core from the msm_dcvs driver.
- */
-struct msm_dcvs_freq {
-	const char *core_name;
-	/* Callback from msm_dcvs to set the core frequency */
-	int (*set_frequency)(struct msm_dcvs_freq *self,
-			unsigned int freq);
-	unsigned int (*get_frequency)(struct msm_dcvs_freq *self);
-};
-
-/**
- * msm_dcvs_freq_sink_register
+ * msm_dcvs_freq_sink_start
  * @drv: The sink driver
  * @return: Handle unique to the core.
  *
  * Register the clock driver code with the msm_dvs driver to get notified about
  * frequency change requests.
  */
-extern int msm_dcvs_freq_sink_register(struct msm_dcvs_freq *drv);
+extern int msm_dcvs_freq_sink_start(struct msm_dcvs_freq *drv);
 
 /**
- * msm_dcvs_freq_sink_unregister
+ * msm_dcvs_freq_sink_stop
  * @drv: The sink driver
  * @return:
  *	0 on success,
@@ -150,7 +151,7 @@
  * Unregister the sink driver for the core. This will cause the source driver
  * for the core to stop sending idle pulses.
  */
-extern int msm_dcvs_freq_sink_unregister(struct msm_dcvs_freq *drv);
+extern int msm_dcvs_freq_sink_stop(struct msm_dcvs_freq *drv);
 
 /**
  * msm_dcvs_update_limits
diff --git a/arch/arm/mach-msm/msm_dcvs.c b/arch/arm/mach-msm/msm_dcvs.c
index 2181337..288d6bb 100644
--- a/arch/arm/mach-msm/msm_dcvs.c
+++ b/arch/arm/mach-msm/msm_dcvs.c
@@ -97,6 +97,8 @@
 	int sensor;
 	int pending_freq;
 	wait_queue_head_t wait_q;
+	int (*set_frequency)(struct msm_dcvs_freq *self, unsigned int freq);
+	unsigned int (*get_frequency)(struct msm_dcvs_freq *self);
 };
 
 static int msm_dcvs_debug;
@@ -123,7 +125,7 @@
 	uint32_t slack_us = 0;
 	uint32_t ret1 = 0;
 
-	if (!core->freq_driver || !core->freq_driver->set_frequency) {
+	if (!core->freq_driver || !core->set_frequency) {
 		/* Core may have unregistered or hotplugged */
 		return -ENODEV;
 	}
@@ -151,8 +153,7 @@
 	 * We will need to get back the actual frequency in KHz and
 	 * the record the time taken to change it.
 	 */
-	ret = core->freq_driver->set_frequency(core->freq_driver,
-				requested_freq);
+	ret = core->set_frequency(core->freq_driver, requested_freq);
 	if (ret <= 0) {
 		__err("Core %s failed to set freq %u\n",
 				core->core_name, requested_freq);
@@ -576,7 +577,10 @@
 }
 
 int msm_dcvs_register_core(const char *core_name,
-		struct msm_dcvs_core_info *info, int sensor)
+	struct msm_dcvs_core_info *info,
+	int (*set_frequency)(struct msm_dcvs_freq *self, unsigned int freq),
+	unsigned int (*get_frequency)(struct msm_dcvs_freq *self),
+	int sensor)
 {
 	int ret = -EINVAL;
 	struct dcvs_core *core = NULL;
@@ -592,6 +596,9 @@
 
 	mutex_lock(&core->lock);
 
+	core->set_frequency = set_frequency;
+	core->get_frequency = get_frequency;
+
 	core->info = info;
 	memcpy(&core->algo_param, &info->algo_param,
 			sizeof(struct msm_dcvs_algo_param));
@@ -601,8 +608,8 @@
 
 	pr_debug("registering core with sensor %d\n", sensor);
 	core->sensor = sensor;
-	ret = msm_dcvs_scm_register_core(core->handle,
-			&info->core_param);
+
+	ret = msm_dcvs_scm_register_core(core->handle, &info->core_param);
 	if (ret)
 		goto bail;
 
@@ -639,14 +646,14 @@
 {
 	struct dcvs_core *core;
 
-	if (!drv || !drv->core_name || !drv->get_frequency)
+	if (!drv || !drv->core_name)
 		return;
 
 	core = msm_dcvs_get_core(drv->core_name, false);
-	core->actual_freq = drv->get_frequency(drv);
+	core->actual_freq = core->get_frequency(drv);
 }
 
-int msm_dcvs_freq_sink_register(struct msm_dcvs_freq *drv)
+int msm_dcvs_freq_sink_start(struct msm_dcvs_freq *drv)
 {
 	int ret = -EINVAL;
 	struct dcvs_core *core = NULL;
@@ -674,7 +681,7 @@
 		__info("Enabling idle pulse for %s\n", core->core_name);
 
 	if (core->idle_driver) {
-		core->actual_freq = core->freq_driver->get_frequency(drv);
+		core->actual_freq = core->get_frequency(drv);
 		/* Notify TZ to start receiving idle info for the core */
 		ret = msm_dcvs_update_freq(core, MSM_DCVS_SCM_DCVS_ENABLE, 1,
 					   &ret1, &ret2);
@@ -686,9 +693,9 @@
 
 	return core->handle;
 }
-EXPORT_SYMBOL(msm_dcvs_freq_sink_register);
+EXPORT_SYMBOL(msm_dcvs_freq_sink_start);
 
-int msm_dcvs_freq_sink_unregister(struct msm_dcvs_freq *drv)
+int msm_dcvs_freq_sink_stop(struct msm_dcvs_freq *drv)
 {
 	int ret = -EINVAL;
 	struct dcvs_core *core = NULL;
@@ -722,7 +729,7 @@
 
 	return 0;
 }
-EXPORT_SYMBOL(msm_dcvs_freq_sink_unregister);
+EXPORT_SYMBOL(msm_dcvs_freq_sink_stop);
 
 int msm_dcvs_idle_source_register(struct msm_dcvs_idle *drv)
 {
diff --git a/drivers/cpufreq/cpufreq_gov_msm.c b/drivers/cpufreq/cpufreq_gov_msm.c
index f69cceb..9ad1811 100644
--- a/drivers/cpufreq/cpufreq_gov_msm.c
+++ b/drivers/cpufreq/cpufreq_gov_msm.c
@@ -116,16 +116,14 @@
 		per_cpu(msm_gov_info, cpu).cpu = cpu;
 		gov->policy = policy;
 		dcvs_notifier->core_name = core_name[cpu];
-		dcvs_notifier->set_frequency = msm_dcvs_freq_set;
-		dcvs_notifier->get_frequency = msm_dcvs_freq_get;
-		handle = msm_dcvs_freq_sink_register(dcvs_notifier);
+		handle = msm_dcvs_freq_sink_start(dcvs_notifier);
 		BUG_ON(handle < 0);
 		msm_gov_check_limits(policy);
 		mutex_unlock(&per_cpu(gov_mutex, cpu));
 		break;
 
 	case CPUFREQ_GOV_STOP:
-		msm_dcvs_freq_sink_unregister(dcvs_notifier);
+		msm_dcvs_freq_sink_stop(dcvs_notifier);
 		break;
 
 	case CPUFREQ_GOV_LIMITS:
@@ -158,7 +156,10 @@
 		snprintf(core_name[cpu], 10, "cpu%d", cpu);
 		if (cpu < core->num_cores)
 			sensor = core->sensors[cpu];
-		ret = msm_dcvs_register_core(core_name[cpu], core, sensor);
+		ret = msm_dcvs_register_core(core_name[cpu], core,
+						msm_dcvs_freq_set,
+						msm_dcvs_freq_get,
+						sensor);
 		if (ret)
 			pr_err("Unable to register core for %d\n", cpu);
 	}
diff --git a/drivers/gpu/msm/kgsl_pwrscale_msm.c b/drivers/gpu/msm/kgsl_pwrscale_msm.c
index ae34d22..5d1625f 100644
--- a/drivers/gpu/msm/kgsl_pwrscale_msm.c
+++ b/drivers/gpu/msm/kgsl_pwrscale_msm.c
@@ -150,6 +150,7 @@
 	for (i = 0; i <= low_level; i++)
 		tbl[i].freq = pwr->pwrlevels[low_level - i].gpu_freq / 1000;
 	ret = msm_dcvs_register_core(device->name, priv->core_info,
+			msm_set_freq, msm_get_freq,
 			priv->core_info->sensors[0]);
 	if (ret) {
 		KGSL_PWR_ERR(device, "msm_dcvs_register_core failed");
@@ -167,9 +168,7 @@
 	}
 
 	priv->freq_sink.core_name = device->name;
-	priv->freq_sink.set_frequency = msm_set_freq;
-	priv->freq_sink.get_frequency = msm_get_freq;
-	ret = msm_dcvs_freq_sink_register(&priv->freq_sink);
+	ret = msm_dcvs_freq_sink_start(&priv->freq_sink);
 	if (ret >= 0) {
 		if (device->ftbl->isidle(device)) {
 			priv->gpu_busy = 0;
@@ -198,7 +197,7 @@
 	if (pwrscale->priv == NULL)
 		return;
 	msm_dcvs_idle_source_unregister(&priv->idle_source);
-	msm_dcvs_freq_sink_unregister(&priv->freq_sink);
+	msm_dcvs_freq_sink_stop(&priv->freq_sink);
 	kfree(pwrscale->priv);
 	pwrscale->priv = NULL;
 }