Commit 80a26a5c authored by Zhang Rui's avatar Zhang Rui

Thermal: build thermal governors into thermal_sys module

The thermal governors are part of the thermal framework,
rather than a seperate feature/module.
Because the generic thermal layer can not work without
thermal governors, and it must load the thermal governors
during its initialization.

Build them into one module in this patch.

This also fix a problem that the generic thermal layer does not
work when CONFIG_THERMAL=m and CONFIG_THERMAL_GOV_XXX=y.
Signed-off-by: default avatarZhang Rui <rui.zhang@intel.com>
Acked-by: default avatarEduardo Valentin <eduardo.valentin@ti.com>
Acked-by: default avatarDurgadoss R <durgadoss.r@intel.com>
parent 5fc024ab
...@@ -379,11 +379,3 @@ platform data is provided, this uses the step_wise throttling policy. ...@@ -379,11 +379,3 @@ platform data is provided, this uses the step_wise throttling policy.
This function serves as an arbitrator to set the state of a cooling This function serves as an arbitrator to set the state of a cooling
device. It sets the cooling device to the deepest cooling state if device. It sets the cooling device to the deepest cooling state if
possible. possible.
5.5:thermal_register_governor:
This function lets the various thermal governors to register themselves
with the Thermal framework. At run time, depending on a zone's platform
data, a particular governor is used for throttling.
5.6:thermal_unregister_governor:
This function unregisters a governor from the thermal framework.
...@@ -6,9 +6,9 @@ obj-$(CONFIG_THERMAL) += thermal_sys.o ...@@ -6,9 +6,9 @@ obj-$(CONFIG_THERMAL) += thermal_sys.o
thermal_sys-y += thermal_core.o thermal_sys-y += thermal_core.o
# governors # governors
obj-$(CONFIG_THERMAL_GOV_FAIR_SHARE) += fair_share.o thermal_sys-$(CONFIG_THERMAL_GOV_FAIR_SHARE) += fair_share.o
obj-$(CONFIG_THERMAL_GOV_STEP_WISE) += step_wise.o thermal_sys-$(CONFIG_THERMAL_GOV_STEP_WISE) += step_wise.o
obj-$(CONFIG_THERMAL_GOV_USER_SPACE) += user_space.o thermal_sys-$(CONFIG_THERMAL_GOV_USER_SPACE) += user_space.o
# cpufreq cooling # cpufreq cooling
obj-$(CONFIG_CPU_THERMAL) += cpu_cooling.o obj-$(CONFIG_CPU_THERMAL) += cpu_cooling.o
......
...@@ -22,9 +22,6 @@ ...@@ -22,9 +22,6 @@
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/ */
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/module.h>
#include <linux/thermal.h> #include <linux/thermal.h>
#include "thermal_core.h" #include "thermal_core.h"
...@@ -111,23 +108,15 @@ static int fair_share_throttle(struct thermal_zone_device *tz, int trip) ...@@ -111,23 +108,15 @@ static int fair_share_throttle(struct thermal_zone_device *tz, int trip)
static struct thermal_governor thermal_gov_fair_share = { static struct thermal_governor thermal_gov_fair_share = {
.name = "fair_share", .name = "fair_share",
.throttle = fair_share_throttle, .throttle = fair_share_throttle,
.owner = THIS_MODULE,
}; };
static int __init thermal_gov_fair_share_init(void) int thermal_gov_fair_share_register(void)
{ {
return thermal_register_governor(&thermal_gov_fair_share); return thermal_register_governor(&thermal_gov_fair_share);
} }
static void __exit thermal_gov_fair_share_exit(void) void thermal_gov_fair_share_unregister(void)
{ {
thermal_unregister_governor(&thermal_gov_fair_share); thermal_unregister_governor(&thermal_gov_fair_share);
} }
/* This should load after thermal framework */
fs_initcall(thermal_gov_fair_share_init);
module_exit(thermal_gov_fair_share_exit);
MODULE_AUTHOR("Durgadoss R");
MODULE_DESCRIPTION("A simple weight based thermal throttling governor");
MODULE_LICENSE("GPL");
...@@ -22,9 +22,6 @@ ...@@ -22,9 +22,6 @@
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/ */
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/module.h>
#include <linux/thermal.h> #include <linux/thermal.h>
#include "thermal_core.h" #include "thermal_core.h"
...@@ -186,23 +183,14 @@ static int step_wise_throttle(struct thermal_zone_device *tz, int trip) ...@@ -186,23 +183,14 @@ static int step_wise_throttle(struct thermal_zone_device *tz, int trip)
static struct thermal_governor thermal_gov_step_wise = { static struct thermal_governor thermal_gov_step_wise = {
.name = "step_wise", .name = "step_wise",
.throttle = step_wise_throttle, .throttle = step_wise_throttle,
.owner = THIS_MODULE,
}; };
static int __init thermal_gov_step_wise_init(void) int thermal_gov_step_wise_register(void)
{ {
return thermal_register_governor(&thermal_gov_step_wise); return thermal_register_governor(&thermal_gov_step_wise);
} }
static void __exit thermal_gov_step_wise_exit(void) void thermal_gov_step_wise_unregister(void)
{ {
thermal_unregister_governor(&thermal_gov_step_wise); thermal_unregister_governor(&thermal_gov_step_wise);
} }
/* This should load after thermal framework */
fs_initcall(thermal_gov_step_wise_init);
module_exit(thermal_gov_step_wise_exit);
MODULE_AUTHOR("Durgadoss R");
MODULE_DESCRIPTION("A step-by-step thermal throttling governor");
MODULE_LICENSE("GPL");
...@@ -99,7 +99,6 @@ int thermal_register_governor(struct thermal_governor *governor) ...@@ -99,7 +99,6 @@ int thermal_register_governor(struct thermal_governor *governor)
return err; return err;
} }
EXPORT_SYMBOL_GPL(thermal_register_governor);
void thermal_unregister_governor(struct thermal_governor *governor) void thermal_unregister_governor(struct thermal_governor *governor)
{ {
...@@ -127,7 +126,6 @@ void thermal_unregister_governor(struct thermal_governor *governor) ...@@ -127,7 +126,6 @@ void thermal_unregister_governor(struct thermal_governor *governor)
mutex_unlock(&thermal_governor_lock); mutex_unlock(&thermal_governor_lock);
return; return;
} }
EXPORT_SYMBOL_GPL(thermal_unregister_governor);
static int get_idr(struct idr *idr, struct mutex *lock, int *id) static int get_idr(struct idr *idr, struct mutex *lock, int *id)
{ {
...@@ -1858,30 +1856,69 @@ static inline int genetlink_init(void) { return 0; } ...@@ -1858,30 +1856,69 @@ static inline int genetlink_init(void) { return 0; }
static inline void genetlink_exit(void) {} static inline void genetlink_exit(void) {}
#endif /* !CONFIG_NET */ #endif /* !CONFIG_NET */
static int __init thermal_register_governors(void)
{
int result;
result = thermal_gov_step_wise_register();
if (result)
return result;
result = thermal_gov_fair_share_register();
if (result)
return result;
return thermal_gov_user_space_register();
}
static void thermal_unregister_governors(void)
{
thermal_gov_step_wise_unregister();
thermal_gov_fair_share_unregister();
thermal_gov_user_space_unregister();
}
static int __init thermal_init(void) static int __init thermal_init(void)
{ {
int result = 0; int result;
result = thermal_register_governors();
if (result)
goto error;
result = class_register(&thermal_class); result = class_register(&thermal_class);
if (result) { if (result)
goto unregister_governors;
result = genetlink_init();
if (result)
goto unregister_class;
return 0;
unregister_governors:
thermal_unregister_governors();
unregister_class:
class_unregister(&thermal_class);
error:
idr_destroy(&thermal_tz_idr); idr_destroy(&thermal_tz_idr);
idr_destroy(&thermal_cdev_idr); idr_destroy(&thermal_cdev_idr);
mutex_destroy(&thermal_idr_lock); mutex_destroy(&thermal_idr_lock);
mutex_destroy(&thermal_list_lock); mutex_destroy(&thermal_list_lock);
return result; mutex_destroy(&thermal_governor_lock);
}
result = genetlink_init();
return result; return result;
} }
static void __exit thermal_exit(void) static void __exit thermal_exit(void)
{ {
genetlink_exit();
class_unregister(&thermal_class); class_unregister(&thermal_class);
thermal_unregister_governors();
idr_destroy(&thermal_tz_idr); idr_destroy(&thermal_tz_idr);
idr_destroy(&thermal_cdev_idr); idr_destroy(&thermal_cdev_idr);
mutex_destroy(&thermal_idr_lock); mutex_destroy(&thermal_idr_lock);
mutex_destroy(&thermal_list_lock); mutex_destroy(&thermal_list_lock);
genetlink_exit(); mutex_destroy(&thermal_governor_lock);
} }
fs_initcall(thermal_init); fs_initcall(thermal_init);
......
...@@ -50,4 +50,31 @@ struct thermal_instance { ...@@ -50,4 +50,31 @@ struct thermal_instance {
struct list_head cdev_node; /* node in cdev->thermal_instances */ struct list_head cdev_node; /* node in cdev->thermal_instances */
}; };
int thermal_register_governor(struct thermal_governor *);
void thermal_unregister_governor(struct thermal_governor *);
#ifdef CONFIG_THERMAL_GOV_STEP_WISE
int thermal_gov_step_wise_register(void);
void thermal_gov_step_wise_unregister(void);
#else
static inline int thermal_gov_step_wise_register(void) { return 0; }
static inline void thermal_gov_step_wise_unregister(void) {}
#endif /* CONFIG_THERMAL_GOV_STEP_WISE */
#ifdef CONFIG_THERMAL_GOV_FAIR_SHARE
int thermal_gov_fair_share_register(void);
void thermal_gov_fair_share_unregister(void);
#else
static inline int thermal_gov_fair_share_register(void) { return 0; }
static inline void thermal_gov_fair_share_unregister(void) {}
#endif /* CONFIG_THERMAL_GOV_FAIR_SHARE */
#ifdef CONFIG_THERMAL_GOV_USER_SPACE
int thermal_gov_user_space_register(void);
void thermal_gov_user_space_unregister(void);
#else
static inline int thermal_gov_user_space_register(void) { return 0; }
static inline void thermal_gov_user_space_unregister(void) {}
#endif /* CONFIG_THERMAL_GOV_USER_SPACE */
#endif /* __THERMAL_CORE_H__ */ #endif /* __THERMAL_CORE_H__ */
...@@ -22,9 +22,6 @@ ...@@ -22,9 +22,6 @@
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*/ */
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
#include <linux/module.h>
#include <linux/thermal.h> #include <linux/thermal.h>
#include "thermal_core.h" #include "thermal_core.h"
...@@ -46,23 +43,15 @@ static int notify_user_space(struct thermal_zone_device *tz, int trip) ...@@ -46,23 +43,15 @@ static int notify_user_space(struct thermal_zone_device *tz, int trip)
static struct thermal_governor thermal_gov_user_space = { static struct thermal_governor thermal_gov_user_space = {
.name = "user_space", .name = "user_space",
.throttle = notify_user_space, .throttle = notify_user_space,
.owner = THIS_MODULE,
}; };
static int __init thermal_gov_user_space_init(void) int thermal_gov_user_space_register(void)
{ {
return thermal_register_governor(&thermal_gov_user_space); return thermal_register_governor(&thermal_gov_user_space);
} }
static void __exit thermal_gov_user_space_exit(void) void thermal_gov_user_space_unregister(void)
{ {
thermal_unregister_governor(&thermal_gov_user_space); thermal_unregister_governor(&thermal_gov_user_space);
} }
/* This should load after thermal framework */
fs_initcall(thermal_gov_user_space_init);
module_exit(thermal_gov_user_space_exit);
MODULE_AUTHOR("Durgadoss R");
MODULE_DESCRIPTION("A user space Thermal notifier");
MODULE_LICENSE("GPL");
...@@ -187,7 +187,6 @@ struct thermal_governor { ...@@ -187,7 +187,6 @@ struct thermal_governor {
char name[THERMAL_NAME_LENGTH]; char name[THERMAL_NAME_LENGTH];
int (*throttle)(struct thermal_zone_device *tz, int trip); int (*throttle)(struct thermal_zone_device *tz, int trip);
struct list_head governor_list; struct list_head governor_list;
struct module *owner;
}; };
/* Structure that holds binding parameters for a zone */ /* Structure that holds binding parameters for a zone */
...@@ -247,9 +246,6 @@ struct thermal_instance *get_thermal_instance(struct thermal_zone_device *, ...@@ -247,9 +246,6 @@ struct thermal_instance *get_thermal_instance(struct thermal_zone_device *,
void thermal_cdev_update(struct thermal_cooling_device *); void thermal_cdev_update(struct thermal_cooling_device *);
void notify_thermal_framework(struct thermal_zone_device *, int); void notify_thermal_framework(struct thermal_zone_device *, int);
int thermal_register_governor(struct thermal_governor *);
void thermal_unregister_governor(struct thermal_governor *);
#ifdef CONFIG_NET #ifdef CONFIG_NET
extern int thermal_generate_netlink_event(struct thermal_zone_device *tz, extern int thermal_generate_netlink_event(struct thermal_zone_device *tz,
enum events event); enum events event);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment