diff options
-rw-r--r-- | drivers/platform/x86/Kconfig | 3 | ||||
-rw-r--r-- | drivers/platform/x86/acerhdf.c | 265 |
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 | ||
39 | config ACERHDF | 39 | config 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 | ||
122 | struct manualcmd { | ||
123 | u8 mreg; | ||
124 | u8 moff; | ||
125 | }; | ||
126 | |||
127 | /* default register and command to disable fan in manual mode */ | ||
128 | static const struct manualcmd mcmd = { | ||
129 | .mreg = 0x94, | ||
130 | .moff = 0xff, | ||
131 | }; | ||
132 | |||
122 | /* BIOS settings */ | 133 | /* BIOS settings */ |
123 | struct bios_settings_t { | 134 | struct 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 */ |
133 | static const struct bios_settings_t bios_tbl[] = { | 145 | static 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 | ||
231 | static const struct bios_settings_t *bios_cfg __read_mostly; | 259 | static 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 | */ | ||
265 | static struct thermal_zone_params acerhdf_zone_params = { | ||
266 | .governor_name = "bang_bang", | ||
267 | }; | ||
232 | 268 | ||
233 | static int acerhdf_get_temp(int *temp) | 269 | static 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 | ||
280 | static void acerhdf_check_param(struct thermal_zone_device *thermal) | 322 | static 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 | |||
454 | static 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) | |||
559 | static int acerhdf_check_hardware(void) | 619 | static 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*:"); | |||
723 | MODULE_ALIAS("dmi:*:*Acer*:pnAO751h*:"); | 791 | MODULE_ALIAS("dmi:*:*Acer*:pnAO751h*:"); |
724 | MODULE_ALIAS("dmi:*:*Acer*:pnAspire*1410*:"); | 792 | MODULE_ALIAS("dmi:*:*Acer*:pnAspire*1410*:"); |
725 | MODULE_ALIAS("dmi:*:*Acer*:pnAspire*1810*:"); | 793 | MODULE_ALIAS("dmi:*:*Acer*:pnAspire*1810*:"); |
794 | MODULE_ALIAS("dmi:*:*Acer*:pnAspire*5755G:"); | ||
726 | MODULE_ALIAS("dmi:*:*Acer*:pnAspire*1825PTZ:"); | 795 | MODULE_ALIAS("dmi:*:*Acer*:pnAspire*1825PTZ:"); |
796 | MODULE_ALIAS("dmi:*:*Acer*:pnAO521*:"); | ||
727 | MODULE_ALIAS("dmi:*:*Acer*:pnAO531*:"); | 797 | MODULE_ALIAS("dmi:*:*Acer*:pnAO531*:"); |
798 | MODULE_ALIAS("dmi:*:*Acer*:pnAspire*5739G:"); | ||
799 | MODULE_ALIAS("dmi:*:*Acer*:pnAspire*One*753:"); | ||
800 | MODULE_ALIAS("dmi:*:*Acer*:pnAspire*5315:"); | ||
728 | MODULE_ALIAS("dmi:*:*Acer*:TravelMate*7730G:"); | 801 | MODULE_ALIAS("dmi:*:*Acer*:TravelMate*7730G:"); |
802 | MODULE_ALIAS("dmi:*:*Acer*:TM8573T:"); | ||
729 | MODULE_ALIAS("dmi:*:*Gateway*:pnAOA*:"); | 803 | MODULE_ALIAS("dmi:*:*Gateway*:pnAOA*:"); |
730 | MODULE_ALIAS("dmi:*:*Gateway*:pnLT31*:"); | 804 | MODULE_ALIAS("dmi:*:*Gateway*:pnLT31*:"); |
731 | MODULE_ALIAS("dmi:*:*Packard*Bell*:pnAOA*:"); | 805 | MODULE_ALIAS("dmi:*:*Packard*Bell*:pnAOA*:"); |
@@ -734,6 +808,7 @@ MODULE_ALIAS("dmi:*:*Packard*Bell*:pnDOTMU*:"); | |||
734 | MODULE_ALIAS("dmi:*:*Packard*Bell*:pnENBFT*:"); | 808 | MODULE_ALIAS("dmi:*:*Packard*Bell*:pnENBFT*:"); |
735 | MODULE_ALIAS("dmi:*:*Packard*Bell*:pnDOTMA*:"); | 809 | MODULE_ALIAS("dmi:*:*Packard*Bell*:pnDOTMA*:"); |
736 | MODULE_ALIAS("dmi:*:*Packard*Bell*:pnDOTVR46*:"); | 810 | MODULE_ALIAS("dmi:*:*Packard*Bell*:pnDOTVR46*:"); |
811 | MODULE_ALIAS("dmi:*:*Acer*:pnExtensa 5420*:"); | ||
737 | 812 | ||
738 | module_init(acerhdf_init); | 813 | module_init(acerhdf_init); |
739 | module_exit(acerhdf_exit); | 814 | module_exit(acerhdf_exit); |