162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *  linux/drivers/devfreq/governor_powersave.c
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci *  Copyright (C) 2011 Samsung Electronics
662306a36Sopenharmony_ci *	MyungJoo Ham <myungjoo.ham@samsung.com>
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/devfreq.h>
1062306a36Sopenharmony_ci#include <linux/module.h>
1162306a36Sopenharmony_ci#include "governor.h"
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_cistatic int devfreq_powersave_func(struct devfreq *df,
1462306a36Sopenharmony_ci				  unsigned long *freq)
1562306a36Sopenharmony_ci{
1662306a36Sopenharmony_ci	/*
1762306a36Sopenharmony_ci	 * target callback should be able to get ceiling value as
1862306a36Sopenharmony_ci	 * said in devfreq.h
1962306a36Sopenharmony_ci	 */
2062306a36Sopenharmony_ci	*freq = DEVFREQ_MIN_FREQ;
2162306a36Sopenharmony_ci	return 0;
2262306a36Sopenharmony_ci}
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_cistatic int devfreq_powersave_handler(struct devfreq *devfreq,
2562306a36Sopenharmony_ci				unsigned int event, void *data)
2662306a36Sopenharmony_ci{
2762306a36Sopenharmony_ci	int ret = 0;
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci	if (event == DEVFREQ_GOV_START) {
3062306a36Sopenharmony_ci		mutex_lock(&devfreq->lock);
3162306a36Sopenharmony_ci		ret = update_devfreq(devfreq);
3262306a36Sopenharmony_ci		mutex_unlock(&devfreq->lock);
3362306a36Sopenharmony_ci	}
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci	return ret;
3662306a36Sopenharmony_ci}
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_cistatic struct devfreq_governor devfreq_powersave = {
3962306a36Sopenharmony_ci	.name = DEVFREQ_GOV_POWERSAVE,
4062306a36Sopenharmony_ci	.get_target_freq = devfreq_powersave_func,
4162306a36Sopenharmony_ci	.event_handler = devfreq_powersave_handler,
4262306a36Sopenharmony_ci};
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cistatic int __init devfreq_powersave_init(void)
4562306a36Sopenharmony_ci{
4662306a36Sopenharmony_ci	return devfreq_add_governor(&devfreq_powersave);
4762306a36Sopenharmony_ci}
4862306a36Sopenharmony_cisubsys_initcall(devfreq_powersave_init);
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_cistatic void __exit devfreq_powersave_exit(void)
5162306a36Sopenharmony_ci{
5262306a36Sopenharmony_ci	int ret;
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci	ret = devfreq_remove_governor(&devfreq_powersave);
5562306a36Sopenharmony_ci	if (ret)
5662306a36Sopenharmony_ci		pr_err("%s: failed remove governor %d\n", __func__, ret);
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci	return;
5962306a36Sopenharmony_ci}
6062306a36Sopenharmony_cimodule_exit(devfreq_powersave_exit);
6162306a36Sopenharmony_ciMODULE_LICENSE("GPL");
62