mirror of
https://github.com/torvalds/linux.git
synced 2026-06-12 16:57:59 +02:00
The power_allocator thermal governor should get utilization of cooling device to calculate dynamic power, but the powersave, userspace and performance devfreq governor don't updade stats, so the utilization is inaccurate. This patch adds support to update status when get requested power, so that power_allocator can also work properly when use powersave, userspace and performance devfreq governor. Change-Id: Ic98fabf46f693a60b0f07094c59e75e4d141e42c Signed-off-by: Finley Xiao <finley.xiao@rock-chips.com>
68 lines
1.5 KiB
C
68 lines
1.5 KiB
C
/*
|
|
* linux/drivers/devfreq/governor_powersave.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 <linux/module.h>
|
|
#include "governor.h"
|
|
|
|
static int devfreq_powersave_func(struct devfreq *df,
|
|
unsigned long *freq)
|
|
{
|
|
/*
|
|
* target callback should be able to get ceiling value as
|
|
* said in devfreq.h
|
|
*/
|
|
*freq = DEVFREQ_MIN_FREQ;
|
|
return 0;
|
|
}
|
|
|
|
static int devfreq_powersave_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);
|
|
devfreq->last_status.update = true;
|
|
} else {
|
|
devfreq->last_status.update = false;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
static struct devfreq_governor devfreq_powersave = {
|
|
.name = DEVFREQ_GOV_POWERSAVE,
|
|
.get_target_freq = devfreq_powersave_func,
|
|
.event_handler = devfreq_powersave_handler,
|
|
};
|
|
|
|
static int __init devfreq_powersave_init(void)
|
|
{
|
|
return devfreq_add_governor(&devfreq_powersave);
|
|
}
|
|
subsys_initcall(devfreq_powersave_init);
|
|
|
|
static void __exit devfreq_powersave_exit(void)
|
|
{
|
|
int ret;
|
|
|
|
ret = devfreq_remove_governor(&devfreq_powersave);
|
|
if (ret)
|
|
pr_err("%s: failed remove governor %d\n", __func__, ret);
|
|
|
|
return;
|
|
}
|
|
module_exit(devfreq_powersave_exit);
|
|
MODULE_LICENSE("GPL");
|