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 | ||
