1b5c1be2c8
Allow devfreq drivers to register a preferred governor name and when the devfreq governor loads itself at a later point required drivers are managed appropriately, at the time of unload of a devfreq governor, stop managing those drivers as well. Since the governor structures do not need to be exposed anymore, remove the definitions and make them static NOTE: devfreq_list_lock is now used to protect governor start and stop - as this allows us to protect governors and devfreq with the proper dependencies as needed. As part of this change, change the registration of exynos bus driver to request for ondemand using the governor name. Cc: Rajagopal Venkat <rajagopal.venkat@linaro.org> Cc: MyungJoo Ham <myungjoo.ham@samsung.com> Cc: Kyungmin Park <kyungmin.park@samsung.com> Cc: "Rafael J. Wysocki" <rjw@sisk.pl> Cc: Kevin Hilman <khilman@ti.com> Cc: linux-pm@vger.kernel.org Cc: linux-kernel@vger.kernel.org Signed-off-by: Nishanth Menon <nm@ti.com> [Merge conflict resolved by MyungJoo Ham] Signed-off-by: MyungJoo Ham <myungjoo.ham@samsung.com>
66 lines
1.4 KiB
C
66 lines
1.4 KiB
C
/*
|
|
* linux/drivers/devfreq/governor_performance.c
|
|
*
|
|
* Copyright (C) 2011 Samsung Electronics
|
|
* MyungJoo Ham <myungjoo.ham@samsung.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
#include <linux/devfreq.h>
|
|
#include "governor.h"
|
|
|
|
static int devfreq_performance_func(struct devfreq *df,
|
|
unsigned long *freq)
|
|
{
|
|
/*
|
|
* target callback should be able to get floor value as
|
|
* said in devfreq.h
|
|
*/
|
|
if (!df->max_freq)
|
|
*freq = UINT_MAX;
|
|
else
|
|
*freq = df->max_freq;
|
|
return 0;
|
|
}
|
|
|
|
static int devfreq_performance_handler(struct devfreq *devfreq,
|
|
unsigned int event, void *data)
|
|
{
|
|
int ret = 0;
|
|
|
|
if (event == DEVFREQ_GOV_START) {
|
|
mutex_lock(&devfreq->lock);
|
|
ret = update_devfreq(devfreq);
|
|
mutex_unlock(&devfreq->lock);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
static struct devfreq_governor devfreq_performance = {
|
|
.name = "performance",
|
|
.get_target_freq = devfreq_performance_func,
|
|
.event_handler = devfreq_performance_handler,
|
|
};
|
|
|
|
static int __init devfreq_performance_init(void)
|
|
{
|
|
return devfreq_add_governor(&devfreq_performance);
|
|
}
|
|
subsys_initcall(devfreq_performance_init);
|
|
|
|
static void __exit devfreq_performance_exit(void)
|
|
{
|
|
int ret;
|
|
|
|
ret = devfreq_remove_governor(&devfreq_performance);
|
|
if (ret)
|
|
pr_err("%s: failed remove governor %d\n", __func__, ret);
|
|
|
|
return;
|
|
}
|
|
module_exit(devfreq_performance_exit);
|