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;
}