governor_powersave.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. /*
  2. * linux/drivers/devfreq/governor_powersave.c
  3. *
  4. * Copyright (C) 2011 Samsung Electronics
  5. * MyungJoo Ham <myungjoo.ham@samsung.com>
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License version 2 as
  9. * published by the Free Software Foundation.
  10. */
  11. #include <linux/devfreq.h>
  12. #include "governor.h"
  13. static int devfreq_powersave_func(struct devfreq *df,
  14. unsigned long *freq)
  15. {
  16. /*
  17. * target callback should be able to get ceiling value as
  18. * said in devfreq.h
  19. */
  20. *freq = df->min_freq;
  21. return 0;
  22. }
  23. static int devfreq_powersave_handler(struct devfreq *devfreq,
  24. unsigned int event, void *data)
  25. {
  26. int ret = 0;
  27. if (event == DEVFREQ_GOV_START) {
  28. mutex_lock(&devfreq->lock);
  29. ret = update_devfreq(devfreq);
  30. mutex_unlock(&devfreq->lock);
  31. }
  32. return ret;
  33. }
  34. static struct devfreq_governor devfreq_powersave = {
  35. .name = "powersave",
  36. .get_target_freq = devfreq_powersave_func,
  37. .event_handler = devfreq_powersave_handler,
  38. };
  39. static int __init devfreq_powersave_init(void)
  40. {
  41. return devfreq_add_governor(&devfreq_powersave);
  42. }
  43. subsys_initcall(devfreq_powersave_init);
  44. static void __exit devfreq_powersave_exit(void)
  45. {
  46. int ret;
  47. ret = devfreq_remove_governor(&devfreq_powersave);
  48. if (ret)
  49. pr_err("%s: failed remove governor %d\n", __func__, ret);
  50. return;
  51. }
  52. module_exit(devfreq_powersave_exit);