Cpufreq: Added input event hook to ramp up cpu frequency
This will cause switch to maximum opp immediately when user interaction occurs, i.e. touchscreen input or keypad activity. Change-Id: I0cfe32479ef62a967f359c1bf57f97eefde7e8f7 Signed-off-by: Tero Kristo <tero.kristo@nokia.com> Signed-off-by: Jouni Hogander <jouni.hogander@nokia.com> [bsteuer@quicinc.com: fixed cpu_dbs_info naming, added header] Signed-off-by: Brian Steuer <bsteuer@codeaurora.org>
This commit is contained in:
committed by
Stephen Boyd
parent
e7bbb10673
commit
0e29c3a27e
@@ -72,7 +72,7 @@ static DEFINE_PER_CPU(int, cpufreq_policy_cpu);
|
|||||||
static DEFINE_PER_CPU(struct rw_semaphore, cpu_policy_rwsem);
|
static DEFINE_PER_CPU(struct rw_semaphore, cpu_policy_rwsem);
|
||||||
|
|
||||||
#define lock_policy_rwsem(mode, cpu) \
|
#define lock_policy_rwsem(mode, cpu) \
|
||||||
static int lock_policy_rwsem_##mode \
|
int lock_policy_rwsem_##mode \
|
||||||
(int cpu) \
|
(int cpu) \
|
||||||
{ \
|
{ \
|
||||||
int policy_cpu = per_cpu(cpufreq_policy_cpu, cpu); \
|
int policy_cpu = per_cpu(cpufreq_policy_cpu, cpu); \
|
||||||
@@ -97,7 +97,7 @@ static void unlock_policy_rwsem_read(int cpu)
|
|||||||
up_read(&per_cpu(cpu_policy_rwsem, policy_cpu));
|
up_read(&per_cpu(cpu_policy_rwsem, policy_cpu));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void unlock_policy_rwsem_write(int cpu)
|
void unlock_policy_rwsem_write(int cpu)
|
||||||
{
|
{
|
||||||
int policy_cpu = per_cpu(cpufreq_policy_cpu, cpu);
|
int policy_cpu = per_cpu(cpufreq_policy_cpu, cpu);
|
||||||
BUG_ON(policy_cpu == -1);
|
BUG_ON(policy_cpu == -1);
|
||||||
|
|||||||
@@ -22,6 +22,9 @@
|
|||||||
#include <linux/tick.h>
|
#include <linux/tick.h>
|
||||||
#include <linux/ktime.h>
|
#include <linux/ktime.h>
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
|
#include <linux/input.h>
|
||||||
|
#include <linux/workqueue.h>
|
||||||
|
#include <linux/slab.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* dbs is used in this file as a shortform for demandbased switching
|
* dbs is used in this file as a shortform for demandbased switching
|
||||||
@@ -705,6 +708,86 @@ static int should_io_be_busy(void)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void dbs_refresh_callback(struct work_struct *unused)
|
||||||
|
{
|
||||||
|
struct cpufreq_policy *policy;
|
||||||
|
struct cpu_dbs_info_s *this_dbs_info;
|
||||||
|
|
||||||
|
if (lock_policy_rwsem_write(0) < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this_dbs_info = &per_cpu(od_cpu_dbs_info, 0);
|
||||||
|
policy = this_dbs_info->cur_policy;
|
||||||
|
|
||||||
|
if (policy->cur < policy->max) {
|
||||||
|
policy->cur = policy->max;
|
||||||
|
|
||||||
|
__cpufreq_driver_target(policy, policy->max,
|
||||||
|
CPUFREQ_RELATION_L);
|
||||||
|
this_dbs_info->prev_cpu_idle = get_cpu_idle_time(0,
|
||||||
|
&this_dbs_info->prev_cpu_wall);
|
||||||
|
}
|
||||||
|
unlock_policy_rwsem_write(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static DECLARE_WORK(dbs_refresh_work, dbs_refresh_callback);
|
||||||
|
|
||||||
|
static void dbs_input_event(struct input_handle *handle, unsigned int type,
|
||||||
|
unsigned int code, int value)
|
||||||
|
{
|
||||||
|
schedule_work(&dbs_refresh_work);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int dbs_input_connect(struct input_handler *handler,
|
||||||
|
struct input_dev *dev, const struct input_device_id *id)
|
||||||
|
{
|
||||||
|
struct input_handle *handle;
|
||||||
|
int error;
|
||||||
|
|
||||||
|
handle = kzalloc(sizeof(struct input_handle), GFP_KERNEL);
|
||||||
|
if (!handle)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
handle->dev = dev;
|
||||||
|
handle->handler = handler;
|
||||||
|
handle->name = "cpufreq";
|
||||||
|
|
||||||
|
error = input_register_handle(handle);
|
||||||
|
if (error)
|
||||||
|
goto err2;
|
||||||
|
|
||||||
|
error = input_open_device(handle);
|
||||||
|
if (error)
|
||||||
|
goto err1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
err1:
|
||||||
|
input_unregister_handle(handle);
|
||||||
|
err2:
|
||||||
|
kfree(handle);
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dbs_input_disconnect(struct input_handle *handle)
|
||||||
|
{
|
||||||
|
input_close_device(handle);
|
||||||
|
input_unregister_handle(handle);
|
||||||
|
kfree(handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct input_device_id dbs_ids[] = {
|
||||||
|
{ .driver_info = 1 },
|
||||||
|
{ },
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct input_handler dbs_input_handler = {
|
||||||
|
.event = dbs_input_event,
|
||||||
|
.connect = dbs_input_connect,
|
||||||
|
.disconnect = dbs_input_disconnect,
|
||||||
|
.name = "cpufreq_ond",
|
||||||
|
.id_table = dbs_ids,
|
||||||
|
};
|
||||||
|
|
||||||
static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
|
static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
|
||||||
unsigned int event)
|
unsigned int event)
|
||||||
{
|
{
|
||||||
@@ -763,6 +846,7 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
|
|||||||
latency * LATENCY_MULTIPLIER);
|
latency * LATENCY_MULTIPLIER);
|
||||||
dbs_tuners_ins.io_is_busy = should_io_be_busy();
|
dbs_tuners_ins.io_is_busy = should_io_be_busy();
|
||||||
}
|
}
|
||||||
|
rc = input_register_handler(&dbs_input_handler);
|
||||||
mutex_unlock(&dbs_mutex);
|
mutex_unlock(&dbs_mutex);
|
||||||
|
|
||||||
mutex_init(&this_dbs_info->timer_mutex);
|
mutex_init(&this_dbs_info->timer_mutex);
|
||||||
@@ -775,6 +859,7 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
|
|||||||
mutex_lock(&dbs_mutex);
|
mutex_lock(&dbs_mutex);
|
||||||
mutex_destroy(&this_dbs_info->timer_mutex);
|
mutex_destroy(&this_dbs_info->timer_mutex);
|
||||||
dbs_enable--;
|
dbs_enable--;
|
||||||
|
input_unregister_handler(&dbs_input_handler);
|
||||||
mutex_unlock(&dbs_mutex);
|
mutex_unlock(&dbs_mutex);
|
||||||
if (!dbs_enable)
|
if (!dbs_enable)
|
||||||
sysfs_remove_group(cpufreq_global_kobject,
|
sysfs_remove_group(cpufreq_global_kobject,
|
||||||
|
|||||||
@@ -205,6 +205,8 @@ extern int __cpufreq_driver_getavg(struct cpufreq_policy *policy,
|
|||||||
int cpufreq_register_governor(struct cpufreq_governor *governor);
|
int cpufreq_register_governor(struct cpufreq_governor *governor);
|
||||||
void cpufreq_unregister_governor(struct cpufreq_governor *governor);
|
void cpufreq_unregister_governor(struct cpufreq_governor *governor);
|
||||||
|
|
||||||
|
int lock_policy_rwsem_write(int cpu);
|
||||||
|
void unlock_policy_rwsem_write(int cpu);
|
||||||
|
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
* CPUFREQ DRIVER INTERFACE *
|
* CPUFREQ DRIVER INTERFACE *
|
||||||
|
|||||||
Reference in New Issue
Block a user