aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/platform/x86/Kconfig3
-rw-r--r--drivers/platform/x86/acerhdf.c265
2 files changed, 172 insertions, 96 deletions
diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig
index 854cc5049b69..ba7761107d83 100644
--- a/drivers/platform/x86/Kconfig
+++ b/drivers/platform/x86/Kconfig
@@ -38,7 +38,8 @@ config ACER_WMI
38 38
39config ACERHDF 39config ACERHDF
40 tristate "Acer Aspire One temperature and fan driver" 40 tristate "Acer Aspire One temperature and fan driver"
41 depends on THERMAL && ACPI 41 select THERMAL_GOV_BANG_BANG
42 depends on ACPI
42 ---help--- 43 ---help---
43 This is a driver for Acer Aspire One netbooks. It allows to access 44 This is a driver for Acer Aspire One netbooks. It allows to access
44 the temperature sensor and to control the fan. 45 the temperature sensor and to control the fan.
diff --git a/drivers/platform/x86/acerhdf.c b/drivers/platform/x86/acerhdf.c
index f94467c05225..c07623c85d7a 100644
--- a/drivers/platform/x86/acerhdf.c
+++ b/drivers/platform/x86/acerhdf.c
@@ -50,7 +50,7 @@
50 */ 50 */
51#undef START_IN_KERNEL_MODE 51#undef START_IN_KERNEL_MODE
52 52
53#define DRV_VER "0.5.26" 53#define DRV_VER "0.7.0"
54 54
55/* 55/*
56 * According to the Atom N270 datasheet, 56 * According to the Atom N270 datasheet,
@@ -119,116 +119,152 @@ struct fancmd {
119 u8 cmd_auto; 119 u8 cmd_auto;
120}; 120};
121 121
122struct manualcmd {
123 u8 mreg;
124 u8 moff;
125};
126
127/* default register and command to disable fan in manual mode */
128static const struct manualcmd mcmd = {
129 .mreg = 0x94,
130 .moff = 0xff,
131};
132
122/* BIOS settings */ 133/* BIOS settings */
123struct bios_settings_t { 134struct bios_settings {
124 const char *vendor; 135 const char *vendor;
125 const char *product; 136 const char *product;
126 const char *version; 137 const char *version;
127 unsigned char fanreg; 138 u8 fanreg;
128 unsigned char tempreg; 139 u8 tempreg;
129 struct fancmd cmd; 140 struct fancmd cmd;
141 int mcmd_enable;
130}; 142};
131 143
132/* Register addresses and values for different BIOS versions */ 144/* Register addresses and values for different BIOS versions */
133static const struct bios_settings_t bios_tbl[] = { 145static const struct bios_settings bios_tbl[] = {
134 /* AOA110 */ 146 /* AOA110 */
135 {"Acer", "AOA110", "v0.3109", 0x55, 0x58, {0x1f, 0x00} }, 147 {"Acer", "AOA110", "v0.3109", 0x55, 0x58, {0x1f, 0x00}, 0},
136 {"Acer", "AOA110", "v0.3114", 0x55, 0x58, {0x1f, 0x00} }, 148 {"Acer", "AOA110", "v0.3114", 0x55, 0x58, {0x1f, 0x00}, 0},
137 {"Acer", "AOA110", "v0.3301", 0x55, 0x58, {0xaf, 0x00} }, 149 {"Acer", "AOA110", "v0.3301", 0x55, 0x58, {0xaf, 0x00}, 0},
138 {"Acer", "AOA110", "v0.3304", 0x55, 0x58, {0xaf, 0x00} }, 150 {"Acer", "AOA110", "v0.3304", 0x55, 0x58, {0xaf, 0x00}, 0},
139 {"Acer", "AOA110", "v0.3305", 0x55, 0x58, {0xaf, 0x00} }, 151 {"Acer", "AOA110", "v0.3305", 0x55, 0x58, {0xaf, 0x00}, 0},
140 {"Acer", "AOA110", "v0.3307", 0x55, 0x58, {0xaf, 0x00} }, 152 {"Acer", "AOA110", "v0.3307", 0x55, 0x58, {0xaf, 0x00}, 0},
141 {"Acer", "AOA110", "v0.3308", 0x55, 0x58, {0x21, 0x00} }, 153 {"Acer", "AOA110", "v0.3308", 0x55, 0x58, {0x21, 0x00}, 0},
142 {"Acer", "AOA110", "v0.3309", 0x55, 0x58, {0x21, 0x00} }, 154 {"Acer", "AOA110", "v0.3309", 0x55, 0x58, {0x21, 0x00}, 0},
143 {"Acer", "AOA110", "v0.3310", 0x55, 0x58, {0x21, 0x00} }, 155 {"Acer", "AOA110", "v0.3310", 0x55, 0x58, {0x21, 0x00}, 0},
144 /* AOA150 */ 156 /* AOA150 */
145 {"Acer", "AOA150", "v0.3114", 0x55, 0x58, {0x1f, 0x00} }, 157 {"Acer", "AOA150", "v0.3114", 0x55, 0x58, {0x1f, 0x00}, 0},
146 {"Acer", "AOA150", "v0.3301", 0x55, 0x58, {0x20, 0x00} }, 158 {"Acer", "AOA150", "v0.3301", 0x55, 0x58, {0x20, 0x00}, 0},
147 {"Acer", "AOA150", "v0.3304", 0x55, 0x58, {0x20, 0x00} }, 159 {"Acer", "AOA150", "v0.3304", 0x55, 0x58, {0x20, 0x00}, 0},
148 {"Acer", "AOA150", "v0.3305", 0x55, 0x58, {0x20, 0x00} }, 160 {"Acer", "AOA150", "v0.3305", 0x55, 0x58, {0x20, 0x00}, 0},
149 {"Acer", "AOA150", "v0.3307", 0x55, 0x58, {0x20, 0x00} }, 161 {"Acer", "AOA150", "v0.3307", 0x55, 0x58, {0x20, 0x00}, 0},
150 {"Acer", "AOA150", "v0.3308", 0x55, 0x58, {0x20, 0x00} }, 162 {"Acer", "AOA150", "v0.3308", 0x55, 0x58, {0x20, 0x00}, 0},
151 {"Acer", "AOA150", "v0.3309", 0x55, 0x58, {0x20, 0x00} }, 163 {"Acer", "AOA150", "v0.3309", 0x55, 0x58, {0x20, 0x00}, 0},
152 {"Acer", "AOA150", "v0.3310", 0x55, 0x58, {0x20, 0x00} }, 164 {"Acer", "AOA150", "v0.3310", 0x55, 0x58, {0x20, 0x00}, 0},
153 /* LT1005u */ 165 /* LT1005u */
154 {"Acer", "LT-10Q", "v0.3310", 0x55, 0x58, {0x20, 0x00} }, 166 {"Acer", "LT-10Q", "v0.3310", 0x55, 0x58, {0x20, 0x00}, 0},
155 /* Acer 1410 */ 167 /* Acer 1410 */
156 {"Acer", "Aspire 1410", "v0.3108", 0x55, 0x58, {0x9e, 0x00} }, 168 {"Acer", "Aspire 1410", "v0.3108", 0x55, 0x58, {0x9e, 0x00}, 0},
157 {"Acer", "Aspire 1410", "v0.3113", 0x55, 0x58, {0x9e, 0x00} }, 169 {"Acer", "Aspire 1410", "v0.3113", 0x55, 0x58, {0x9e, 0x00}, 0},
158 {"Acer", "Aspire 1410", "v0.3115", 0x55, 0x58, {0x9e, 0x00} }, 170 {"Acer", "Aspire 1410", "v0.3115", 0x55, 0x58, {0x9e, 0x00}, 0},
159 {"Acer", "Aspire 1410", "v0.3117", 0x55, 0x58, {0x9e, 0x00} }, 171 {"Acer", "Aspire 1410", "v0.3117", 0x55, 0x58, {0x9e, 0x00}, 0},
160 {"Acer", "Aspire 1410", "v0.3119", 0x55, 0x58, {0x9e, 0x00} }, 172 {"Acer", "Aspire 1410", "v0.3119", 0x55, 0x58, {0x9e, 0x00}, 0},
161 {"Acer", "Aspire 1410", "v0.3120", 0x55, 0x58, {0x9e, 0x00} }, 173 {"Acer", "Aspire 1410", "v0.3120", 0x55, 0x58, {0x9e, 0x00}, 0},
162 {"Acer", "Aspire 1410", "v1.3204", 0x55, 0x58, {0x9e, 0x00} }, 174 {"Acer", "Aspire 1410", "v1.3204", 0x55, 0x58, {0x9e, 0x00}, 0},
163 {"Acer", "Aspire 1410", "v1.3303", 0x55, 0x58, {0x9e, 0x00} }, 175 {"Acer", "Aspire 1410", "v1.3303", 0x55, 0x58, {0x9e, 0x00}, 0},
164 {"Acer", "Aspire 1410", "v1.3308", 0x55, 0x58, {0x9e, 0x00} }, 176 {"Acer", "Aspire 1410", "v1.3308", 0x55, 0x58, {0x9e, 0x00}, 0},
165 {"Acer", "Aspire 1410", "v1.3310", 0x55, 0x58, {0x9e, 0x00} }, 177 {"Acer", "Aspire 1410", "v1.3310", 0x55, 0x58, {0x9e, 0x00}, 0},
166 {"Acer", "Aspire 1410", "v1.3314", 0x55, 0x58, {0x9e, 0x00} }, 178 {"Acer", "Aspire 1410", "v1.3314", 0x55, 0x58, {0x9e, 0x00}, 0},
167 /* Acer 1810xx */ 179 /* Acer 1810xx */
168 {"Acer", "Aspire 1810TZ", "v0.3108", 0x55, 0x58, {0x9e, 0x00} }, 180 {"Acer", "Aspire 1810TZ", "v0.3108", 0x55, 0x58, {0x9e, 0x00}, 0},
169 {"Acer", "Aspire 1810T", "v0.3108", 0x55, 0x58, {0x9e, 0x00} }, 181 {"Acer", "Aspire 1810T", "v0.3108", 0x55, 0x58, {0x9e, 0x00}, 0},
170 {"Acer", "Aspire 1810TZ", "v0.3113", 0x55, 0x58, {0x9e, 0x00} }, 182 {"Acer", "Aspire 1810TZ", "v0.3113", 0x55, 0x58, {0x9e, 0x00}, 0},
171 {"Acer", "Aspire 1810T", "v0.3113", 0x55, 0x58, {0x9e, 0x00} }, 183 {"Acer", "Aspire 1810T", "v0.3113", 0x55, 0x58, {0x9e, 0x00}, 0},
172 {"Acer", "Aspire 1810TZ", "v0.3115", 0x55, 0x58, {0x9e, 0x00} }, 184 {"Acer", "Aspire 1810TZ", "v0.3115", 0x55, 0x58, {0x9e, 0x00}, 0},
173 {"Acer", "Aspire 1810T", "v0.3115", 0x55, 0x58, {0x9e, 0x00} }, 185 {"Acer", "Aspire 1810T", "v0.3115", 0x55, 0x58, {0x9e, 0x00}, 0},
174 {"Acer", "Aspire 1810TZ", "v0.3117", 0x55, 0x58, {0x9e, 0x00} }, 186 {"Acer", "Aspire 1810TZ", "v0.3117", 0x55, 0x58, {0x9e, 0x00}, 0},
175 {"Acer", "Aspire 1810T", "v0.3117", 0x55, 0x58, {0x9e, 0x00} }, 187 {"Acer", "Aspire 1810T", "v0.3117", 0x55, 0x58, {0x9e, 0x00}, 0},
176 {"Acer", "Aspire 1810TZ", "v0.3119", 0x55, 0x58, {0x9e, 0x00} }, 188 {"Acer", "Aspire 1810TZ", "v0.3119", 0x55, 0x58, {0x9e, 0x00}, 0},
177 {"Acer", "Aspire 1810T", "v0.3119", 0x55, 0x58, {0x9e, 0x00} }, 189 {"Acer", "Aspire 1810T", "v0.3119", 0x55, 0x58, {0x9e, 0x00}, 0},
178 {"Acer", "Aspire 1810TZ", "v0.3120", 0x55, 0x58, {0x9e, 0x00} }, 190 {"Acer", "Aspire 1810TZ", "v0.3120", 0x55, 0x58, {0x9e, 0x00}, 0},
179 {"Acer", "Aspire 1810T", "v0.3120", 0x55, 0x58, {0x9e, 0x00} }, 191 {"Acer", "Aspire 1810T", "v0.3120", 0x55, 0x58, {0x9e, 0x00}, 0},
180 {"Acer", "Aspire 1810TZ", "v1.3204", 0x55, 0x58, {0x9e, 0x00} }, 192 {"Acer", "Aspire 1810TZ", "v1.3204", 0x55, 0x58, {0x9e, 0x00}, 0},
181 {"Acer", "Aspire 1810T", "v1.3204", 0x55, 0x58, {0x9e, 0x00} }, 193 {"Acer", "Aspire 1810T", "v1.3204", 0x55, 0x58, {0x9e, 0x00}, 0},
182 {"Acer", "Aspire 1810TZ", "v1.3303", 0x55, 0x58, {0x9e, 0x00} }, 194 {"Acer", "Aspire 1810TZ", "v1.3303", 0x55, 0x58, {0x9e, 0x00}, 0},
183 {"Acer", "Aspire 1810T", "v1.3303", 0x55, 0x58, {0x9e, 0x00} }, 195 {"Acer", "Aspire 1810T", "v1.3303", 0x55, 0x58, {0x9e, 0x00}, 0},
184 {"Acer", "Aspire 1810TZ", "v1.3308", 0x55, 0x58, {0x9e, 0x00} }, 196 {"Acer", "Aspire 1810TZ", "v1.3308", 0x55, 0x58, {0x9e, 0x00}, 0},
185 {"Acer", "Aspire 1810T", "v1.3308", 0x55, 0x58, {0x9e, 0x00} }, 197 {"Acer", "Aspire 1810T", "v1.3308", 0x55, 0x58, {0x9e, 0x00}, 0},
186 {"Acer", "Aspire 1810TZ", "v1.3310", 0x55, 0x58, {0x9e, 0x00} }, 198 {"Acer", "Aspire 1810TZ", "v1.3310", 0x55, 0x58, {0x9e, 0x00}, 0},
187 {"Acer", "Aspire 1810T", "v1.3310", 0x55, 0x58, {0x9e, 0x00} }, 199 {"Acer", "Aspire 1810T", "v1.3310", 0x55, 0x58, {0x9e, 0x00}, 0},
188 {"Acer", "Aspire 1810TZ", "v1.3314", 0x55, 0x58, {0x9e, 0x00} }, 200 {"Acer", "Aspire 1810TZ", "v1.3314", 0x55, 0x58, {0x9e, 0x00}, 0},
189 {"Acer", "Aspire 1810T", "v1.3314", 0x55, 0x58, {0x9e, 0x00} }, 201 {"Acer", "Aspire 1810T", "v1.3314", 0x55, 0x58, {0x9e, 0x00}, 0},
202 /* Acer 5755G */
203 {"Acer", "Aspire 5755G", "V1.20", 0xab, 0xb4, {0x00, 0x08}, 0},
204 {"Acer", "Aspire 5755G", "V1.21", 0xab, 0xb3, {0x00, 0x08}, 0},
205 /* Acer 521 */
206 {"Acer", "AO521", "V1.11", 0x55, 0x58, {0x1f, 0x00}, 0},
190 /* Acer 531 */ 207 /* Acer 531 */
191 {"Acer", "AO531h", "v0.3104", 0x55, 0x58, {0x20, 0x00} }, 208 {"Acer", "AO531h", "v0.3104", 0x55, 0x58, {0x20, 0x00}, 0},
192 {"Acer", "AO531h", "v0.3201", 0x55, 0x58, {0x20, 0x00} }, 209 {"Acer", "AO531h", "v0.3201", 0x55, 0x58, {0x20, 0x00}, 0},
193 {"Acer", "AO531h", "v0.3304", 0x55, 0x58, {0x20, 0x00} }, 210 {"Acer", "AO531h", "v0.3304", 0x55, 0x58, {0x20, 0x00}, 0},
194 /* Acer 751 */ 211 /* Acer 751 */
195 {"Acer", "AO751h", "V0.3212", 0x55, 0x58, {0x21, 0x00} }, 212 {"Acer", "AO751h", "V0.3206", 0x55, 0x58, {0x21, 0x00}, 0},
213 {"Acer", "AO751h", "V0.3212", 0x55, 0x58, {0x21, 0x00}, 0},
214 /* Acer 753 */
215 {"Acer", "Aspire One 753", "V1.24", 0x93, 0xac, {0x14, 0x04}, 1},
196 /* Acer 1825 */ 216 /* Acer 1825 */
197 {"Acer", "Aspire 1825PTZ", "V1.3118", 0x55, 0x58, {0x9e, 0x00} }, 217 {"Acer", "Aspire 1825PTZ", "V1.3118", 0x55, 0x58, {0x9e, 0x00}, 0},
198 {"Acer", "Aspire 1825PTZ", "V1.3127", 0x55, 0x58, {0x9e, 0x00} }, 218 {"Acer", "Aspire 1825PTZ", "V1.3127", 0x55, 0x58, {0x9e, 0x00}, 0},
219 /* Acer Extensa 5420 */
220 {"Acer", "Extensa 5420", "V1.17", 0x93, 0xac, {0x14, 0x04}, 1},
221 /* Acer Aspire 5315 */
222 {"Acer", "Aspire 5315", "V1.19", 0x93, 0xac, {0x14, 0x04}, 1},
223 /* Acer Aspire 5739 */
224 {"Acer", "Aspire 5739G", "V1.3311", 0x55, 0x58, {0x20, 0x00}, 0},
199 /* Acer TravelMate 7730 */ 225 /* Acer TravelMate 7730 */
200 {"Acer", "TravelMate 7730G", "v0.3509", 0x55, 0x58, {0xaf, 0x00} }, 226 {"Acer", "TravelMate 7730G", "v0.3509", 0x55, 0x58, {0xaf, 0x00}, 0},
227 /* Acer TravelMate TM8573T */
228 {"Acer", "TM8573T", "V1.13", 0x93, 0xa8, {0x14, 0x04}, 1},
201 /* Gateway */ 229 /* Gateway */
202 {"Gateway", "AOA110", "v0.3103", 0x55, 0x58, {0x21, 0x00} }, 230 {"Gateway", "AOA110", "v0.3103", 0x55, 0x58, {0x21, 0x00}, 0},
203 {"Gateway", "AOA150", "v0.3103", 0x55, 0x58, {0x20, 0x00} }, 231 {"Gateway", "AOA150", "v0.3103", 0x55, 0x58, {0x20, 0x00}, 0},
204 {"Gateway", "LT31", "v1.3103", 0x55, 0x58, {0x9e, 0x00} }, 232 {"Gateway", "LT31", "v1.3103", 0x55, 0x58, {0x9e, 0x00}, 0},
205 {"Gateway", "LT31", "v1.3201", 0x55, 0x58, {0x9e, 0x00} }, 233 {"Gateway", "LT31", "v1.3201", 0x55, 0x58, {0x9e, 0x00}, 0},
206 {"Gateway", "LT31", "v1.3302", 0x55, 0x58, {0x9e, 0x00} }, 234 {"Gateway", "LT31", "v1.3302", 0x55, 0x58, {0x9e, 0x00}, 0},
207 {"Gateway", "LT31", "v1.3303t", 0x55, 0x58, {0x9e, 0x00} }, 235 {"Gateway", "LT31", "v1.3303t", 0x55, 0x58, {0x9e, 0x00}, 0},
208 /* Packard Bell */ 236 /* Packard Bell */
209 {"Packard Bell", "DOA150", "v0.3104", 0x55, 0x58, {0x21, 0x00} }, 237 {"Packard Bell", "DOA150", "v0.3104", 0x55, 0x58, {0x21, 0x00}, 0},
210 {"Packard Bell", "DOA150", "v0.3105", 0x55, 0x58, {0x20, 0x00} }, 238 {"Packard Bell", "DOA150", "v0.3105", 0x55, 0x58, {0x20, 0x00}, 0},
211 {"Packard Bell", "AOA110", "v0.3105", 0x55, 0x58, {0x21, 0x00} }, 239 {"Packard Bell", "AOA110", "v0.3105", 0x55, 0x58, {0x21, 0x00}, 0},
212 {"Packard Bell", "AOA150", "v0.3105", 0x55, 0x58, {0x20, 0x00} }, 240 {"Packard Bell", "AOA150", "v0.3105", 0x55, 0x58, {0x20, 0x00}, 0},
213 {"Packard Bell", "ENBFT", "V1.3118", 0x55, 0x58, {0x9e, 0x00} }, 241 {"Packard Bell", "ENBFT", "V1.3118", 0x55, 0x58, {0x9e, 0x00}, 0},
214 {"Packard Bell", "ENBFT", "V1.3127", 0x55, 0x58, {0x9e, 0x00} }, 242 {"Packard Bell", "ENBFT", "V1.3127", 0x55, 0x58, {0x9e, 0x00}, 0},
215 {"Packard Bell", "DOTMU", "v1.3303", 0x55, 0x58, {0x9e, 0x00} }, 243 {"Packard Bell", "DOTMU", "v1.3303", 0x55, 0x58, {0x9e, 0x00}, 0},
216 {"Packard Bell", "DOTMU", "v0.3120", 0x55, 0x58, {0x9e, 0x00} }, 244 {"Packard Bell", "DOTMU", "v0.3120", 0x55, 0x58, {0x9e, 0x00}, 0},
217 {"Packard Bell", "DOTMU", "v0.3108", 0x55, 0x58, {0x9e, 0x00} }, 245 {"Packard Bell", "DOTMU", "v0.3108", 0x55, 0x58, {0x9e, 0x00}, 0},
218 {"Packard Bell", "DOTMU", "v0.3113", 0x55, 0x58, {0x9e, 0x00} }, 246 {"Packard Bell", "DOTMU", "v0.3113", 0x55, 0x58, {0x9e, 0x00}, 0},
219 {"Packard Bell", "DOTMU", "v0.3115", 0x55, 0x58, {0x9e, 0x00} }, 247 {"Packard Bell", "DOTMU", "v0.3115", 0x55, 0x58, {0x9e, 0x00}, 0},
220 {"Packard Bell", "DOTMU", "v0.3117", 0x55, 0x58, {0x9e, 0x00} }, 248 {"Packard Bell", "DOTMU", "v0.3117", 0x55, 0x58, {0x9e, 0x00}, 0},
221 {"Packard Bell", "DOTMU", "v0.3119", 0x55, 0x58, {0x9e, 0x00} }, 249 {"Packard Bell", "DOTMU", "v0.3119", 0x55, 0x58, {0x9e, 0x00}, 0},
222 {"Packard Bell", "DOTMU", "v1.3204", 0x55, 0x58, {0x9e, 0x00} }, 250 {"Packard Bell", "DOTMU", "v1.3204", 0x55, 0x58, {0x9e, 0x00}, 0},
223 {"Packard Bell", "DOTMA", "v1.3201", 0x55, 0x58, {0x9e, 0x00} }, 251 {"Packard Bell", "DOTMA", "v1.3201", 0x55, 0x58, {0x9e, 0x00}, 0},
224 {"Packard Bell", "DOTMA", "v1.3302", 0x55, 0x58, {0x9e, 0x00} }, 252 {"Packard Bell", "DOTMA", "v1.3302", 0x55, 0x58, {0x9e, 0x00}, 0},
225 {"Packard Bell", "DOTMA", "v1.3303t", 0x55, 0x58, {0x9e, 0x00} }, 253 {"Packard Bell", "DOTMA", "v1.3303t", 0x55, 0x58, {0x9e, 0x00}, 0},
226 {"Packard Bell", "DOTVR46", "v1.3308", 0x55, 0x58, {0x9e, 0x00} }, 254 {"Packard Bell", "DOTVR46", "v1.3308", 0x55, 0x58, {0x9e, 0x00}, 0},
227 /* pewpew-terminator */ 255 /* pewpew-terminator */
228 {"", "", "", 0, 0, {0, 0} } 256 {"", "", "", 0, 0, {0, 0}, 0}
229}; 257};
230 258
231static const struct bios_settings_t *bios_cfg __read_mostly; 259static const struct bios_settings *bios_cfg __read_mostly;
260
261/*
262 * this struct is used to instruct thermal layer to use bang_bang instead of
263 * default governor for acerhdf
264 */
265static struct thermal_zone_params acerhdf_zone_params = {
266 .governor_name = "bang_bang",
267};
232 268
233static int acerhdf_get_temp(int *temp) 269static int acerhdf_get_temp(int *temp)
234{ 270{
@@ -275,6 +311,12 @@ static void acerhdf_change_fanstate(int state)
275 fanstate = state; 311 fanstate = state;
276 312
277 ec_write(bios_cfg->fanreg, cmd); 313 ec_write(bios_cfg->fanreg, cmd);
314
315 if (bios_cfg->mcmd_enable && state == ACERHDF_FAN_OFF) {
316 if (verbose)
317 pr_notice("turning off fan manually\n");
318 ec_write(mcmd.mreg, mcmd.moff);
319 }
278} 320}
279 321
280static void acerhdf_check_param(struct thermal_zone_device *thermal) 322static void acerhdf_check_param(struct thermal_zone_device *thermal)
@@ -401,6 +443,21 @@ static int acerhdf_get_trip_type(struct thermal_zone_device *thermal, int trip,
401{ 443{
402 if (trip == 0) 444 if (trip == 0)
403 *type = THERMAL_TRIP_ACTIVE; 445 *type = THERMAL_TRIP_ACTIVE;
446 else if (trip == 1)
447 *type = THERMAL_TRIP_CRITICAL;
448 else
449 return -EINVAL;
450
451 return 0;
452}
453
454static int acerhdf_get_trip_hyst(struct thermal_zone_device *thermal, int trip,
455 unsigned long *temp)
456{
457 if (trip != 0)
458 return -EINVAL;
459
460 *temp = fanon - fanoff;
404 461
405 return 0; 462 return 0;
406} 463}
@@ -410,6 +467,10 @@ static int acerhdf_get_trip_temp(struct thermal_zone_device *thermal, int trip,
410{ 467{
411 if (trip == 0) 468 if (trip == 0)
412 *temp = fanon; 469 *temp = fanon;
470 else if (trip == 1)
471 *temp = ACERHDF_TEMP_CRIT;
472 else
473 return -EINVAL;
413 474
414 return 0; 475 return 0;
415} 476}
@@ -429,6 +490,7 @@ static struct thermal_zone_device_ops acerhdf_dev_ops = {
429 .get_mode = acerhdf_get_mode, 490 .get_mode = acerhdf_get_mode,
430 .set_mode = acerhdf_set_mode, 491 .set_mode = acerhdf_set_mode,
431 .get_trip_type = acerhdf_get_trip_type, 492 .get_trip_type = acerhdf_get_trip_type,
493 .get_trip_hyst = acerhdf_get_trip_hyst,
432 .get_trip_temp = acerhdf_get_trip_temp, 494 .get_trip_temp = acerhdf_get_trip_temp,
433 .get_crit_temp = acerhdf_get_crit_temp, 495 .get_crit_temp = acerhdf_get_crit_temp,
434}; 496};
@@ -481,9 +543,7 @@ static int acerhdf_set_cur_state(struct thermal_cooling_device *cdev,
481 } 543 }
482 544
483 if (state == 0) { 545 if (state == 0) {
484 /* turn fan off only if below fanoff temperature */ 546 if (cur_state == ACERHDF_FAN_AUTO)
485 if ((cur_state == ACERHDF_FAN_AUTO) &&
486 (cur_temp < fanoff))
487 acerhdf_change_fanstate(ACERHDF_FAN_OFF); 547 acerhdf_change_fanstate(ACERHDF_FAN_OFF);
488 } else { 548 } else {
489 if (cur_state == ACERHDF_FAN_OFF) 549 if (cur_state == ACERHDF_FAN_OFF)
@@ -559,7 +619,7 @@ static int str_starts_with(const char *str, const char *start)
559static int acerhdf_check_hardware(void) 619static int acerhdf_check_hardware(void)
560{ 620{
561 char const *vendor, *version, *product; 621 char const *vendor, *version, *product;
562 const struct bios_settings_t *bt = NULL; 622 const struct bios_settings *bt = NULL;
563 623
564 /* get BIOS data */ 624 /* get BIOS data */
565 vendor = dmi_get_system_info(DMI_SYS_VENDOR); 625 vendor = dmi_get_system_info(DMI_SYS_VENDOR);
@@ -661,12 +721,20 @@ static int acerhdf_register_thermal(void)
661 if (IS_ERR(cl_dev)) 721 if (IS_ERR(cl_dev))
662 return -EINVAL; 722 return -EINVAL;
663 723
664 thz_dev = thermal_zone_device_register("acerhdf", 1, 0, NULL, 724 thz_dev = thermal_zone_device_register("acerhdf", 2, 0, NULL,
665 &acerhdf_dev_ops, NULL, 0, 725 &acerhdf_dev_ops,
726 &acerhdf_zone_params, 0,
666 (kernelmode) ? interval*1000 : 0); 727 (kernelmode) ? interval*1000 : 0);
667 if (IS_ERR(thz_dev)) 728 if (IS_ERR(thz_dev))
668 return -EINVAL; 729 return -EINVAL;
669 730
731 if (strcmp(thz_dev->governor->name,
732 acerhdf_zone_params.governor_name)) {
733 pr_err("Didn't get thermal governor %s, perhaps not compiled into thermal subsystem.\n",
734 acerhdf_zone_params.governor_name);
735 return -EINVAL;
736 }
737
670 return 0; 738 return 0;
671} 739}
672 740
@@ -723,9 +791,15 @@ MODULE_ALIAS("dmi:*:*Acer*:pnAOA*:");
723MODULE_ALIAS("dmi:*:*Acer*:pnAO751h*:"); 791MODULE_ALIAS("dmi:*:*Acer*:pnAO751h*:");
724MODULE_ALIAS("dmi:*:*Acer*:pnAspire*1410*:"); 792MODULE_ALIAS("dmi:*:*Acer*:pnAspire*1410*:");
725MODULE_ALIAS("dmi:*:*Acer*:pnAspire*1810*:"); 793MODULE_ALIAS("dmi:*:*Acer*:pnAspire*1810*:");
794MODULE_ALIAS("dmi:*:*Acer*:pnAspire*5755G:");
726MODULE_ALIAS("dmi:*:*Acer*:pnAspire*1825PTZ:"); 795MODULE_ALIAS("dmi:*:*Acer*:pnAspire*1825PTZ:");
796MODULE_ALIAS("dmi:*:*Acer*:pnAO521*:");
727MODULE_ALIAS("dmi:*:*Acer*:pnAO531*:"); 797MODULE_ALIAS("dmi:*:*Acer*:pnAO531*:");
798MODULE_ALIAS("dmi:*:*Acer*:pnAspire*5739G:");
799MODULE_ALIAS("dmi:*:*Acer*:pnAspire*One*753:");
800MODULE_ALIAS("dmi:*:*Acer*:pnAspire*5315:");
728MODULE_ALIAS("dmi:*:*Acer*:TravelMate*7730G:"); 801MODULE_ALIAS("dmi:*:*Acer*:TravelMate*7730G:");
802MODULE_ALIAS("dmi:*:*Acer*:TM8573T:");
729MODULE_ALIAS("dmi:*:*Gateway*:pnAOA*:"); 803MODULE_ALIAS("dmi:*:*Gateway*:pnAOA*:");
730MODULE_ALIAS("dmi:*:*Gateway*:pnLT31*:"); 804MODULE_ALIAS("dmi:*:*Gateway*:pnLT31*:");
731MODULE_ALIAS("dmi:*:*Packard*Bell*:pnAOA*:"); 805MODULE_ALIAS("dmi:*:*Packard*Bell*:pnAOA*:");
@@ -734,6 +808,7 @@ MODULE_ALIAS("dmi:*:*Packard*Bell*:pnDOTMU*:");
734MODULE_ALIAS("dmi:*:*Packard*Bell*:pnENBFT*:"); 808MODULE_ALIAS("dmi:*:*Packard*Bell*:pnENBFT*:");
735MODULE_ALIAS("dmi:*:*Packard*Bell*:pnDOTMA*:"); 809MODULE_ALIAS("dmi:*:*Packard*Bell*:pnDOTMA*:");
736MODULE_ALIAS("dmi:*:*Packard*Bell*:pnDOTVR46*:"); 810MODULE_ALIAS("dmi:*:*Packard*Bell*:pnDOTVR46*:");
811MODULE_ALIAS("dmi:*:*Acer*:pnExtensa 5420*:");
737 812
738module_init(acerhdf_init); 813module_init(acerhdf_init);
739module_exit(acerhdf_exit); 814module_exit(acerhdf_exit);