diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-12 22:27:59 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-12 22:27:59 -0400 |
commit | a3920a6efa158b445b8a39080b463b9b29337425 (patch) | |
tree | 1726a21d317bea8039c1f0f041b7443af76f6ca1 /include | |
parent | 18a022de47bc11ee20d7d0f4dd72d42d2cfdc51c (diff) | |
parent | d1d4a81b842db21b144ffd2334ca5eee3eb740f3 (diff) |
Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux
Pull ACPI & Thermal updates from Len Brown:
"The generic Linux thermal layer is gaining some new capabilities
(generic cooling via cpufreq) and some new customers (ARM).
Also, an ACPI EC bug fix plus a regression fix."
* 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux: (30 commits)
tools/power/acpi/acpidump: remove duplicated include from acpidump.c
ACPI idle, CPU hotplug: Fix NULL pointer dereference during hotplug
cpuidle / ACPI: fix potential NULL pointer dereference
ACPI: EC: Add a quirk for CLEVO M720T/M730T laptop
ACPI: EC: Make the GPE storm threshold a module parameter
thermal: Exynos: Fix NULL pointer dereference in exynos_unregister_thermal()
Thermal: Fix bug on cpu_cooling, cooling device's id conflict problem.
thermal: exynos: Use devm_* functions
ARM: exynos: add thermal sensor driver platform data support
thermal: exynos: register the tmu sensor with the kernel thermal layer
thermal: exynos5: add exynos5250 thermal sensor driver support
hwmon: exynos4: move thermal sensor driver to driver/thermal directory
thermal: add generic cpufreq cooling implementation
Fix a build error.
thermal: Fix potential NULL pointer accesses
thermal: add Renesas R-Car thermal sensor support
thermal: fix potential out-of-bounds memory access
Thermal: Introduce locking for cdev.thermal_instances list.
Thermal: Unify the code for both active and passive cooling
Thermal: Introduce simple arbitrator for setting device cooling state
...
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/cpu_cooling.h | 58 | ||||
-rw-r--r-- | include/linux/platform_data/exynos_thermal.h (renamed from include/linux/platform_data/exynos4_tmu.h) | 47 | ||||
-rw-r--r-- | include/linux/thermal.h | 28 |
3 files changed, 118 insertions, 15 deletions
diff --git a/include/linux/cpu_cooling.h b/include/linux/cpu_cooling.h new file mode 100644 index 000000000000..851530128e65 --- /dev/null +++ b/include/linux/cpu_cooling.h | |||
@@ -0,0 +1,58 @@ | |||
1 | /* | ||
2 | * linux/include/linux/cpu_cooling.h | ||
3 | * | ||
4 | * Copyright (C) 2012 Samsung Electronics Co., Ltd(http://www.samsung.com) | ||
5 | * Copyright (C) 2012 Amit Daniel <amit.kachhap@linaro.org> | ||
6 | * | ||
7 | * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License as published by | ||
10 | * the Free Software Foundation; version 2 of the License. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, but | ||
13 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | * General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License along | ||
18 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
19 | * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. | ||
20 | * | ||
21 | * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
22 | */ | ||
23 | |||
24 | #ifndef __CPU_COOLING_H__ | ||
25 | #define __CPU_COOLING_H__ | ||
26 | |||
27 | #include <linux/thermal.h> | ||
28 | |||
29 | #define CPUFREQ_COOLING_START 0 | ||
30 | #define CPUFREQ_COOLING_STOP 1 | ||
31 | |||
32 | #ifdef CONFIG_CPU_THERMAL | ||
33 | /** | ||
34 | * cpufreq_cooling_register - function to create cpufreq cooling device. | ||
35 | * @clip_cpus: cpumask of cpus where the frequency constraints will happen | ||
36 | */ | ||
37 | struct thermal_cooling_device *cpufreq_cooling_register( | ||
38 | struct cpumask *clip_cpus); | ||
39 | |||
40 | /** | ||
41 | * cpufreq_cooling_unregister - function to remove cpufreq cooling device. | ||
42 | * @cdev: thermal cooling device pointer. | ||
43 | */ | ||
44 | void cpufreq_cooling_unregister(struct thermal_cooling_device *cdev); | ||
45 | #else /* !CONFIG_CPU_THERMAL */ | ||
46 | static inline struct thermal_cooling_device *cpufreq_cooling_register( | ||
47 | struct cpumask *clip_cpus) | ||
48 | { | ||
49 | return NULL; | ||
50 | } | ||
51 | static inline void cpufreq_cooling_unregister( | ||
52 | struct thermal_cooling_device *cdev) | ||
53 | { | ||
54 | return; | ||
55 | } | ||
56 | #endif /* CONFIG_CPU_THERMAL */ | ||
57 | |||
58 | #endif /* __CPU_COOLING_H__ */ | ||
diff --git a/include/linux/platform_data/exynos4_tmu.h b/include/linux/platform_data/exynos_thermal.h index 39e038cca590..a7bdb2f63b73 100644 --- a/include/linux/platform_data/exynos4_tmu.h +++ b/include/linux/platform_data/exynos_thermal.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * exynos4_tmu.h - Samsung EXYNOS4 TMU (Thermal Management Unit) | 2 | * exynos_thermal.h - Samsung EXYNOS TMU (Thermal Management Unit) |
3 | * | 3 | * |
4 | * Copyright (C) 2011 Samsung Electronics | 4 | * Copyright (C) 2011 Samsung Electronics |
5 | * Donggeun Kim <dg77.kim@samsung.com> | 5 | * Donggeun Kim <dg77.kim@samsung.com> |
@@ -19,8 +19,9 @@ | |||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
20 | */ | 20 | */ |
21 | 21 | ||
22 | #ifndef _LINUX_EXYNOS4_TMU_H | 22 | #ifndef _LINUX_EXYNOS_THERMAL_H |
23 | #define _LINUX_EXYNOS4_TMU_H | 23 | #define _LINUX_EXYNOS_THERMAL_H |
24 | #include <linux/cpu_cooling.h> | ||
24 | 25 | ||
25 | enum calibration_type { | 26 | enum calibration_type { |
26 | TYPE_ONE_POINT_TRIMMING, | 27 | TYPE_ONE_POINT_TRIMMING, |
@@ -28,8 +29,28 @@ enum calibration_type { | |||
28 | TYPE_NONE, | 29 | TYPE_NONE, |
29 | }; | 30 | }; |
30 | 31 | ||
32 | enum soc_type { | ||
33 | SOC_ARCH_EXYNOS4210 = 1, | ||
34 | SOC_ARCH_EXYNOS, | ||
35 | }; | ||
36 | /** | ||
37 | * struct freq_clip_table | ||
38 | * @freq_clip_max: maximum frequency allowed for this cooling state. | ||
39 | * @temp_level: Temperature level at which the temperature clipping will | ||
40 | * happen. | ||
41 | * @mask_val: cpumask of the allowed cpu's where the clipping will take place. | ||
42 | * | ||
43 | * This structure is required to be filled and passed to the | ||
44 | * cpufreq_cooling_unregister function. | ||
45 | */ | ||
46 | struct freq_clip_table { | ||
47 | unsigned int freq_clip_max; | ||
48 | unsigned int temp_level; | ||
49 | const struct cpumask *mask_val; | ||
50 | }; | ||
51 | |||
31 | /** | 52 | /** |
32 | * struct exynos4_tmu_platform_data | 53 | * struct exynos_tmu_platform_data |
33 | * @threshold: basic temperature for generating interrupt | 54 | * @threshold: basic temperature for generating interrupt |
34 | * 25 <= threshold <= 125 [unit: degree Celsius] | 55 | * 25 <= threshold <= 125 [unit: degree Celsius] |
35 | * @trigger_levels: array for each interrupt levels | 56 | * @trigger_levels: array for each interrupt levels |
@@ -63,11 +84,18 @@ enum calibration_type { | |||
63 | * @reference_voltage: reference voltage of amplifier | 84 | * @reference_voltage: reference voltage of amplifier |
64 | * in the positive-TC generator block | 85 | * in the positive-TC generator block |
65 | * 0 <= reference_voltage <= 31 | 86 | * 0 <= reference_voltage <= 31 |
87 | * @noise_cancel_mode: noise cancellation mode | ||
88 | * 000, 100, 101, 110 and 111 can be different modes | ||
89 | * @type: determines the type of SOC | ||
90 | * @efuse_value: platform defined fuse value | ||
66 | * @cal_type: calibration type for temperature | 91 | * @cal_type: calibration type for temperature |
92 | * @freq_clip_table: Table representing frequency reduction percentage. | ||
93 | * @freq_tab_count: Count of the above table as frequency reduction may | ||
94 | * applicable to only some of the trigger levels. | ||
67 | * | 95 | * |
68 | * This structure is required for configuration of exynos4_tmu driver. | 96 | * This structure is required for configuration of exynos_tmu driver. |
69 | */ | 97 | */ |
70 | struct exynos4_tmu_platform_data { | 98 | struct exynos_tmu_platform_data { |
71 | u8 threshold; | 99 | u8 threshold; |
72 | u8 trigger_levels[4]; | 100 | u8 trigger_levels[4]; |
73 | bool trigger_level0_en; | 101 | bool trigger_level0_en; |
@@ -77,7 +105,12 @@ struct exynos4_tmu_platform_data { | |||
77 | 105 | ||
78 | u8 gain; | 106 | u8 gain; |
79 | u8 reference_voltage; | 107 | u8 reference_voltage; |
108 | u8 noise_cancel_mode; | ||
109 | u32 efuse_value; | ||
80 | 110 | ||
81 | enum calibration_type cal_type; | 111 | enum calibration_type cal_type; |
112 | enum soc_type type; | ||
113 | struct freq_clip_table freq_tab[4]; | ||
114 | unsigned int freq_tab_count; | ||
82 | }; | 115 | }; |
83 | #endif /* _LINUX_EXYNOS4_TMU_H */ | 116 | #endif /* _LINUX_EXYNOS_THERMAL_H */ |
diff --git a/include/linux/thermal.h b/include/linux/thermal.h index 4b94a61955df..91b34812cd84 100644 --- a/include/linux/thermal.h +++ b/include/linux/thermal.h | |||
@@ -44,6 +44,12 @@ enum thermal_trip_type { | |||
44 | THERMAL_TRIP_CRITICAL, | 44 | THERMAL_TRIP_CRITICAL, |
45 | }; | 45 | }; |
46 | 46 | ||
47 | enum thermal_trend { | ||
48 | THERMAL_TREND_STABLE, /* temperature is stable */ | ||
49 | THERMAL_TREND_RAISING, /* temperature is raising */ | ||
50 | THERMAL_TREND_DROPPING, /* temperature is dropping */ | ||
51 | }; | ||
52 | |||
47 | struct thermal_zone_device_ops { | 53 | struct thermal_zone_device_ops { |
48 | int (*bind) (struct thermal_zone_device *, | 54 | int (*bind) (struct thermal_zone_device *, |
49 | struct thermal_cooling_device *); | 55 | struct thermal_cooling_device *); |
@@ -65,6 +71,8 @@ struct thermal_zone_device_ops { | |||
65 | int (*set_trip_hyst) (struct thermal_zone_device *, int, | 71 | int (*set_trip_hyst) (struct thermal_zone_device *, int, |
66 | unsigned long); | 72 | unsigned long); |
67 | int (*get_crit_temp) (struct thermal_zone_device *, unsigned long *); | 73 | int (*get_crit_temp) (struct thermal_zone_device *, unsigned long *); |
74 | int (*get_trend) (struct thermal_zone_device *, int, | ||
75 | enum thermal_trend *); | ||
68 | int (*notify) (struct thermal_zone_device *, int, | 76 | int (*notify) (struct thermal_zone_device *, int, |
69 | enum thermal_trip_type); | 77 | enum thermal_trip_type); |
70 | }; | 78 | }; |
@@ -75,6 +83,8 @@ struct thermal_cooling_device_ops { | |||
75 | int (*set_cur_state) (struct thermal_cooling_device *, unsigned long); | 83 | int (*set_cur_state) (struct thermal_cooling_device *, unsigned long); |
76 | }; | 84 | }; |
77 | 85 | ||
86 | #define THERMAL_NO_LIMIT -1UL /* no upper/lower limit requirement */ | ||
87 | |||
78 | #define THERMAL_TRIPS_NONE -1 | 88 | #define THERMAL_TRIPS_NONE -1 |
79 | #define THERMAL_MAX_TRIPS 12 | 89 | #define THERMAL_MAX_TRIPS 12 |
80 | #define THERMAL_NAME_LENGTH 20 | 90 | #define THERMAL_NAME_LENGTH 20 |
@@ -84,6 +94,9 @@ struct thermal_cooling_device { | |||
84 | struct device device; | 94 | struct device device; |
85 | void *devdata; | 95 | void *devdata; |
86 | const struct thermal_cooling_device_ops *ops; | 96 | const struct thermal_cooling_device_ops *ops; |
97 | bool updated; /* true if the cooling device does not need update */ | ||
98 | struct mutex lock; /* protect thermal_instances list */ | ||
99 | struct list_head thermal_instances; | ||
87 | struct list_head node; | 100 | struct list_head node; |
88 | }; | 101 | }; |
89 | 102 | ||
@@ -105,17 +118,16 @@ struct thermal_zone_device { | |||
105 | struct thermal_attr *trip_hyst_attrs; | 118 | struct thermal_attr *trip_hyst_attrs; |
106 | void *devdata; | 119 | void *devdata; |
107 | int trips; | 120 | int trips; |
108 | int tc1; | ||
109 | int tc2; | ||
110 | int passive_delay; | 121 | int passive_delay; |
111 | int polling_delay; | 122 | int polling_delay; |
123 | int temperature; | ||
112 | int last_temperature; | 124 | int last_temperature; |
113 | bool passive; | 125 | int passive; |
114 | unsigned int forced_passive; | 126 | unsigned int forced_passive; |
115 | const struct thermal_zone_device_ops *ops; | 127 | const struct thermal_zone_device_ops *ops; |
116 | struct list_head cooling_devices; | 128 | struct list_head thermal_instances; |
117 | struct idr idr; | 129 | struct idr idr; |
118 | struct mutex lock; /* protect cooling devices list */ | 130 | struct mutex lock; /* protect thermal_instances list */ |
119 | struct list_head node; | 131 | struct list_head node; |
120 | struct delayed_work poll_queue; | 132 | struct delayed_work poll_queue; |
121 | }; | 133 | }; |
@@ -152,12 +164,12 @@ enum { | |||
152 | #define THERMAL_GENL_CMD_MAX (__THERMAL_GENL_CMD_MAX - 1) | 164 | #define THERMAL_GENL_CMD_MAX (__THERMAL_GENL_CMD_MAX - 1) |
153 | 165 | ||
154 | struct thermal_zone_device *thermal_zone_device_register(const char *, int, int, | 166 | struct thermal_zone_device *thermal_zone_device_register(const char *, int, int, |
155 | void *, const struct thermal_zone_device_ops *, int tc1, | 167 | void *, const struct thermal_zone_device_ops *, int, int); |
156 | int tc2, int passive_freq, int polling_freq); | ||
157 | void thermal_zone_device_unregister(struct thermal_zone_device *); | 168 | void thermal_zone_device_unregister(struct thermal_zone_device *); |
158 | 169 | ||
159 | int thermal_zone_bind_cooling_device(struct thermal_zone_device *, int, | 170 | int thermal_zone_bind_cooling_device(struct thermal_zone_device *, int, |
160 | struct thermal_cooling_device *); | 171 | struct thermal_cooling_device *, |
172 | unsigned long, unsigned long); | ||
161 | int thermal_zone_unbind_cooling_device(struct thermal_zone_device *, int, | 173 | int thermal_zone_unbind_cooling_device(struct thermal_zone_device *, int, |
162 | struct thermal_cooling_device *); | 174 | struct thermal_cooling_device *); |
163 | void thermal_zone_device_update(struct thermal_zone_device *); | 175 | void thermal_zone_device_update(struct thermal_zone_device *); |