diff options
Diffstat (limited to 'drivers/devfreq/governor_userspace.c')
| -rw-r--r-- | drivers/devfreq/governor_userspace.c | 45 | 
1 files changed, 41 insertions, 4 deletions
diff --git a/drivers/devfreq/governor_userspace.c b/drivers/devfreq/governor_userspace.c index 0681246fc89..35de6e83c1f 100644 --- a/drivers/devfreq/governor_userspace.c +++ b/drivers/devfreq/governor_userspace.c @@ -14,6 +14,7 @@  #include <linux/devfreq.h>  #include <linux/pm.h>  #include <linux/mutex.h> +#include <linux/module.h>  #include "governor.h"  struct userspace_data { @@ -116,10 +117,46 @@ static void userspace_exit(struct devfreq *devfreq)  	devfreq->data = NULL;  } -const struct devfreq_governor devfreq_userspace = { +static int devfreq_userspace_handler(struct devfreq *devfreq, +			unsigned int event, void *data) +{ +	int ret = 0; + +	switch (event) { +	case DEVFREQ_GOV_START: +		ret = userspace_init(devfreq); +		break; +	case DEVFREQ_GOV_STOP: +		userspace_exit(devfreq); +		break; +	default: +		break; +	} + +	return ret; +} + +static struct devfreq_governor devfreq_userspace = {  	.name = "userspace",  	.get_target_freq = devfreq_userspace_func, -	.init = userspace_init, -	.exit = userspace_exit, -	.no_central_polling = true, +	.event_handler = devfreq_userspace_handler,  }; + +static int __init devfreq_userspace_init(void) +{ +	return devfreq_add_governor(&devfreq_userspace); +} +subsys_initcall(devfreq_userspace_init); + +static void __exit devfreq_userspace_exit(void) +{ +	int ret; + +	ret = devfreq_remove_governor(&devfreq_userspace); +	if (ret) +		pr_err("%s: failed remove governor %d\n", __func__, ret); + +	return; +} +module_exit(devfreq_userspace_exit); +MODULE_LICENSE("GPL");  |