diff options
Diffstat (limited to 'drivers/acpi/thermal.c')
-rw-r--r-- | drivers/acpi/thermal.c | 57 |
1 files changed, 20 insertions, 37 deletions
diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c index c855f4446b5f..503c0b99db12 100644 --- a/drivers/acpi/thermal.c +++ b/drivers/acpi/thermal.c | |||
@@ -162,7 +162,7 @@ struct acpi_thermal_flags { | |||
162 | }; | 162 | }; |
163 | 163 | ||
164 | struct acpi_thermal { | 164 | struct acpi_thermal { |
165 | acpi_handle handle; | 165 | struct acpi_device * device; |
166 | acpi_bus_id name; | 166 | acpi_bus_id name; |
167 | unsigned long temperature; | 167 | unsigned long temperature; |
168 | unsigned long last_temperature; | 168 | unsigned long last_temperature; |
@@ -229,7 +229,7 @@ static int acpi_thermal_get_temperature(struct acpi_thermal *tz) | |||
229 | tz->last_temperature = tz->temperature; | 229 | tz->last_temperature = tz->temperature; |
230 | 230 | ||
231 | status = | 231 | status = |
232 | acpi_evaluate_integer(tz->handle, "_TMP", NULL, &tz->temperature); | 232 | acpi_evaluate_integer(tz->device->handle, "_TMP", NULL, &tz->temperature); |
233 | if (ACPI_FAILURE(status)) | 233 | if (ACPI_FAILURE(status)) |
234 | return -ENODEV; | 234 | return -ENODEV; |
235 | 235 | ||
@@ -248,7 +248,7 @@ static int acpi_thermal_get_polling_frequency(struct acpi_thermal *tz) | |||
248 | return -EINVAL; | 248 | return -EINVAL; |
249 | 249 | ||
250 | status = | 250 | status = |
251 | acpi_evaluate_integer(tz->handle, "_TZP", NULL, | 251 | acpi_evaluate_integer(tz->device->handle, "_TZP", NULL, |
252 | &tz->polling_frequency); | 252 | &tz->polling_frequency); |
253 | if (ACPI_FAILURE(status)) | 253 | if (ACPI_FAILURE(status)) |
254 | return -ENODEV; | 254 | return -ENODEV; |
@@ -285,7 +285,7 @@ static int acpi_thermal_set_cooling_mode(struct acpi_thermal *tz, int mode) | |||
285 | if (!tz) | 285 | if (!tz) |
286 | return -EINVAL; | 286 | return -EINVAL; |
287 | 287 | ||
288 | status = acpi_get_handle(tz->handle, "_SCP", &handle); | 288 | status = acpi_get_handle(tz->device->handle, "_SCP", &handle); |
289 | if (ACPI_FAILURE(status)) { | 289 | if (ACPI_FAILURE(status)) { |
290 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "_SCP not present\n")); | 290 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "_SCP not present\n")); |
291 | return -ENODEV; | 291 | return -ENODEV; |
@@ -316,7 +316,7 @@ static int acpi_thermal_get_trip_points(struct acpi_thermal *tz) | |||
316 | 316 | ||
317 | /* Critical Shutdown (required) */ | 317 | /* Critical Shutdown (required) */ |
318 | 318 | ||
319 | status = acpi_evaluate_integer(tz->handle, "_CRT", NULL, | 319 | status = acpi_evaluate_integer(tz->device->handle, "_CRT", NULL, |
320 | &tz->trips.critical.temperature); | 320 | &tz->trips.critical.temperature); |
321 | if (ACPI_FAILURE(status)) { | 321 | if (ACPI_FAILURE(status)) { |
322 | tz->trips.critical.flags.valid = 0; | 322 | tz->trips.critical.flags.valid = 0; |
@@ -332,7 +332,7 @@ static int acpi_thermal_get_trip_points(struct acpi_thermal *tz) | |||
332 | /* Critical Sleep (optional) */ | 332 | /* Critical Sleep (optional) */ |
333 | 333 | ||
334 | status = | 334 | status = |
335 | acpi_evaluate_integer(tz->handle, "_HOT", NULL, | 335 | acpi_evaluate_integer(tz->device->handle, "_HOT", NULL, |
336 | &tz->trips.hot.temperature); | 336 | &tz->trips.hot.temperature); |
337 | if (ACPI_FAILURE(status)) { | 337 | if (ACPI_FAILURE(status)) { |
338 | tz->trips.hot.flags.valid = 0; | 338 | tz->trips.hot.flags.valid = 0; |
@@ -346,7 +346,7 @@ static int acpi_thermal_get_trip_points(struct acpi_thermal *tz) | |||
346 | /* Passive: Processors (optional) */ | 346 | /* Passive: Processors (optional) */ |
347 | 347 | ||
348 | status = | 348 | status = |
349 | acpi_evaluate_integer(tz->handle, "_PSV", NULL, | 349 | acpi_evaluate_integer(tz->device->handle, "_PSV", NULL, |
350 | &tz->trips.passive.temperature); | 350 | &tz->trips.passive.temperature); |
351 | if (ACPI_FAILURE(status)) { | 351 | if (ACPI_FAILURE(status)) { |
352 | tz->trips.passive.flags.valid = 0; | 352 | tz->trips.passive.flags.valid = 0; |
@@ -355,25 +355,25 @@ static int acpi_thermal_get_trip_points(struct acpi_thermal *tz) | |||
355 | tz->trips.passive.flags.valid = 1; | 355 | tz->trips.passive.flags.valid = 1; |
356 | 356 | ||
357 | status = | 357 | status = |
358 | acpi_evaluate_integer(tz->handle, "_TC1", NULL, | 358 | acpi_evaluate_integer(tz->device->handle, "_TC1", NULL, |
359 | &tz->trips.passive.tc1); | 359 | &tz->trips.passive.tc1); |
360 | if (ACPI_FAILURE(status)) | 360 | if (ACPI_FAILURE(status)) |
361 | tz->trips.passive.flags.valid = 0; | 361 | tz->trips.passive.flags.valid = 0; |
362 | 362 | ||
363 | status = | 363 | status = |
364 | acpi_evaluate_integer(tz->handle, "_TC2", NULL, | 364 | acpi_evaluate_integer(tz->device->handle, "_TC2", NULL, |
365 | &tz->trips.passive.tc2); | 365 | &tz->trips.passive.tc2); |
366 | if (ACPI_FAILURE(status)) | 366 | if (ACPI_FAILURE(status)) |
367 | tz->trips.passive.flags.valid = 0; | 367 | tz->trips.passive.flags.valid = 0; |
368 | 368 | ||
369 | status = | 369 | status = |
370 | acpi_evaluate_integer(tz->handle, "_TSP", NULL, | 370 | acpi_evaluate_integer(tz->device->handle, "_TSP", NULL, |
371 | &tz->trips.passive.tsp); | 371 | &tz->trips.passive.tsp); |
372 | if (ACPI_FAILURE(status)) | 372 | if (ACPI_FAILURE(status)) |
373 | tz->trips.passive.flags.valid = 0; | 373 | tz->trips.passive.flags.valid = 0; |
374 | 374 | ||
375 | status = | 375 | status = |
376 | acpi_evaluate_reference(tz->handle, "_PSL", NULL, | 376 | acpi_evaluate_reference(tz->device->handle, "_PSL", NULL, |
377 | &tz->trips.passive.devices); | 377 | &tz->trips.passive.devices); |
378 | if (ACPI_FAILURE(status)) | 378 | if (ACPI_FAILURE(status)) |
379 | tz->trips.passive.flags.valid = 0; | 379 | tz->trips.passive.flags.valid = 0; |
@@ -393,14 +393,14 @@ static int acpi_thermal_get_trip_points(struct acpi_thermal *tz) | |||
393 | char name[5] = { '_', 'A', 'C', ('0' + i), '\0' }; | 393 | char name[5] = { '_', 'A', 'C', ('0' + i), '\0' }; |
394 | 394 | ||
395 | status = | 395 | status = |
396 | acpi_evaluate_integer(tz->handle, name, NULL, | 396 | acpi_evaluate_integer(tz->device->handle, name, NULL, |
397 | &tz->trips.active[i].temperature); | 397 | &tz->trips.active[i].temperature); |
398 | if (ACPI_FAILURE(status)) | 398 | if (ACPI_FAILURE(status)) |
399 | break; | 399 | break; |
400 | 400 | ||
401 | name[2] = 'L'; | 401 | name[2] = 'L'; |
402 | status = | 402 | status = |
403 | acpi_evaluate_reference(tz->handle, name, NULL, | 403 | acpi_evaluate_reference(tz->device->handle, name, NULL, |
404 | &tz->trips.active[i].devices); | 404 | &tz->trips.active[i].devices); |
405 | if (ACPI_SUCCESS(status)) { | 405 | if (ACPI_SUCCESS(status)) { |
406 | tz->trips.active[i].flags.valid = 1; | 406 | tz->trips.active[i].flags.valid = 1; |
@@ -424,7 +424,7 @@ static int acpi_thermal_get_devices(struct acpi_thermal *tz) | |||
424 | return -EINVAL; | 424 | return -EINVAL; |
425 | 425 | ||
426 | status = | 426 | status = |
427 | acpi_evaluate_reference(tz->handle, "_TZD", NULL, &tz->devices); | 427 | acpi_evaluate_reference(tz->device->handle, "_TZD", NULL, &tz->devices); |
428 | if (ACPI_FAILURE(status)) | 428 | if (ACPI_FAILURE(status)) |
429 | return -ENODEV; | 429 | return -ENODEV; |
430 | 430 | ||
@@ -453,10 +453,6 @@ static int acpi_thermal_call_usermode(char *path) | |||
453 | 453 | ||
454 | static int acpi_thermal_critical(struct acpi_thermal *tz) | 454 | static int acpi_thermal_critical(struct acpi_thermal *tz) |
455 | { | 455 | { |
456 | int result = 0; | ||
457 | struct acpi_device *device = NULL; | ||
458 | |||
459 | |||
460 | if (!tz || !tz->trips.critical.flags.valid) | 456 | if (!tz || !tz->trips.critical.flags.valid) |
461 | return -EINVAL; | 457 | return -EINVAL; |
462 | 458 | ||
@@ -466,14 +462,10 @@ static int acpi_thermal_critical(struct acpi_thermal *tz) | |||
466 | } else if (tz->trips.critical.flags.enabled) | 462 | } else if (tz->trips.critical.flags.enabled) |
467 | tz->trips.critical.flags.enabled = 0; | 463 | tz->trips.critical.flags.enabled = 0; |
468 | 464 | ||
469 | result = acpi_bus_get_device(tz->handle, &device); | ||
470 | if (result) | ||
471 | return result; | ||
472 | |||
473 | printk(KERN_EMERG | 465 | printk(KERN_EMERG |
474 | "Critical temperature reached (%ld C), shutting down.\n", | 466 | "Critical temperature reached (%ld C), shutting down.\n", |
475 | KELVIN_TO_CELSIUS(tz->temperature)); | 467 | KELVIN_TO_CELSIUS(tz->temperature)); |
476 | acpi_bus_generate_event(device, ACPI_THERMAL_NOTIFY_CRITICAL, | 468 | acpi_bus_generate_event(tz->device, ACPI_THERMAL_NOTIFY_CRITICAL, |
477 | tz->trips.critical.flags.enabled); | 469 | tz->trips.critical.flags.enabled); |
478 | 470 | ||
479 | acpi_thermal_call_usermode(ACPI_THERMAL_PATH_POWEROFF); | 471 | acpi_thermal_call_usermode(ACPI_THERMAL_PATH_POWEROFF); |
@@ -483,10 +475,6 @@ static int acpi_thermal_critical(struct acpi_thermal *tz) | |||
483 | 475 | ||
484 | static int acpi_thermal_hot(struct acpi_thermal *tz) | 476 | static int acpi_thermal_hot(struct acpi_thermal *tz) |
485 | { | 477 | { |
486 | int result = 0; | ||
487 | struct acpi_device *device = NULL; | ||
488 | |||
489 | |||
490 | if (!tz || !tz->trips.hot.flags.valid) | 478 | if (!tz || !tz->trips.hot.flags.valid) |
491 | return -EINVAL; | 479 | return -EINVAL; |
492 | 480 | ||
@@ -496,11 +484,7 @@ static int acpi_thermal_hot(struct acpi_thermal *tz) | |||
496 | } else if (tz->trips.hot.flags.enabled) | 484 | } else if (tz->trips.hot.flags.enabled) |
497 | tz->trips.hot.flags.enabled = 0; | 485 | tz->trips.hot.flags.enabled = 0; |
498 | 486 | ||
499 | result = acpi_bus_get_device(tz->handle, &device); | 487 | acpi_bus_generate_event(tz->device, ACPI_THERMAL_NOTIFY_HOT, |
500 | if (result) | ||
501 | return result; | ||
502 | |||
503 | acpi_bus_generate_event(device, ACPI_THERMAL_NOTIFY_HOT, | ||
504 | tz->trips.hot.flags.enabled); | 488 | tz->trips.hot.flags.enabled); |
505 | 489 | ||
506 | /* TBD: Call user-mode "sleep(S4)" function */ | 490 | /* TBD: Call user-mode "sleep(S4)" function */ |
@@ -1193,8 +1177,7 @@ static void acpi_thermal_notify(acpi_handle handle, u32 event, void *data) | |||
1193 | if (!tz) | 1177 | if (!tz) |
1194 | return; | 1178 | return; |
1195 | 1179 | ||
1196 | if (acpi_bus_get_device(tz->handle, &device)) | 1180 | device = tz->device; |
1197 | return; | ||
1198 | 1181 | ||
1199 | switch (event) { | 1182 | switch (event) { |
1200 | case ACPI_THERMAL_NOTIFY_TEMPERATURE: | 1183 | case ACPI_THERMAL_NOTIFY_TEMPERATURE: |
@@ -1293,7 +1276,7 @@ static int acpi_thermal_add(struct acpi_device *device) | |||
1293 | return -ENOMEM; | 1276 | return -ENOMEM; |
1294 | memset(tz, 0, sizeof(struct acpi_thermal)); | 1277 | memset(tz, 0, sizeof(struct acpi_thermal)); |
1295 | 1278 | ||
1296 | tz->handle = device->handle; | 1279 | tz->device = device; |
1297 | strcpy(tz->name, device->pnp.bus_id); | 1280 | strcpy(tz->name, device->pnp.bus_id); |
1298 | strcpy(acpi_device_name(device), ACPI_THERMAL_DEVICE_NAME); | 1281 | strcpy(acpi_device_name(device), ACPI_THERMAL_DEVICE_NAME); |
1299 | strcpy(acpi_device_class(device), ACPI_THERMAL_CLASS); | 1282 | strcpy(acpi_device_class(device), ACPI_THERMAL_CLASS); |
@@ -1311,7 +1294,7 @@ static int acpi_thermal_add(struct acpi_device *device) | |||
1311 | 1294 | ||
1312 | acpi_thermal_check(tz); | 1295 | acpi_thermal_check(tz); |
1313 | 1296 | ||
1314 | status = acpi_install_notify_handler(tz->handle, | 1297 | status = acpi_install_notify_handler(device->handle, |
1315 | ACPI_DEVICE_NOTIFY, | 1298 | ACPI_DEVICE_NOTIFY, |
1316 | acpi_thermal_notify, tz); | 1299 | acpi_thermal_notify, tz); |
1317 | if (ACPI_FAILURE(status)) { | 1300 | if (ACPI_FAILURE(status)) { |
@@ -1352,7 +1335,7 @@ static int acpi_thermal_remove(struct acpi_device *device, int type) | |||
1352 | /* deferred task may reinsert timer */ | 1335 | /* deferred task may reinsert timer */ |
1353 | del_timer_sync(&(tz->timer)); | 1336 | del_timer_sync(&(tz->timer)); |
1354 | 1337 | ||
1355 | status = acpi_remove_notify_handler(tz->handle, | 1338 | status = acpi_remove_notify_handler(device->handle, |
1356 | ACPI_DEVICE_NOTIFY, | 1339 | ACPI_DEVICE_NOTIFY, |
1357 | acpi_thermal_notify); | 1340 | acpi_thermal_notify); |
1358 | 1341 | ||