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)
{