diff options
Diffstat (limited to 'drivers/acpi/bus.c')
| -rw-r--r-- | drivers/acpi/bus.c | 310 |
1 files changed, 151 insertions, 159 deletions
diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c index d77c2307883c..6a4da417c16b 100644 --- a/drivers/acpi/bus.c +++ b/drivers/acpi/bus.c | |||
| @@ -36,19 +36,17 @@ | |||
| 36 | #include <acpi/acpi_bus.h> | 36 | #include <acpi/acpi_bus.h> |
| 37 | #include <acpi/acpi_drivers.h> | 37 | #include <acpi/acpi_drivers.h> |
| 38 | 38 | ||
| 39 | |||
| 40 | #define _COMPONENT ACPI_BUS_COMPONENT | 39 | #define _COMPONENT ACPI_BUS_COMPONENT |
| 41 | ACPI_MODULE_NAME ("acpi_bus") | 40 | ACPI_MODULE_NAME("acpi_bus") |
| 42 | |||
| 43 | #ifdef CONFIG_X86 | 41 | #ifdef CONFIG_X86 |
| 44 | extern void __init acpi_pic_sci_set_trigger(unsigned int irq, u16 trigger); | 42 | extern void __init acpi_pic_sci_set_trigger(unsigned int irq, u16 trigger); |
| 45 | #endif | 43 | #endif |
| 46 | 44 | ||
| 47 | FADT_DESCRIPTOR acpi_fadt; | 45 | FADT_DESCRIPTOR acpi_fadt; |
| 48 | EXPORT_SYMBOL(acpi_fadt); | 46 | EXPORT_SYMBOL(acpi_fadt); |
| 49 | 47 | ||
| 50 | struct acpi_device *acpi_root; | 48 | struct acpi_device *acpi_root; |
| 51 | struct proc_dir_entry *acpi_root_dir; | 49 | struct proc_dir_entry *acpi_root_dir; |
| 52 | EXPORT_SYMBOL(acpi_root_dir); | 50 | EXPORT_SYMBOL(acpi_root_dir); |
| 53 | 51 | ||
| 54 | #define STRUCT_TO_INT(s) (*((int*)&s)) | 52 | #define STRUCT_TO_INT(s) (*((int*)&s)) |
| @@ -57,12 +55,9 @@ EXPORT_SYMBOL(acpi_root_dir); | |||
| 57 | Device Management | 55 | Device Management |
| 58 | -------------------------------------------------------------------------- */ | 56 | -------------------------------------------------------------------------- */ |
| 59 | 57 | ||
| 60 | int | 58 | int acpi_bus_get_device(acpi_handle handle, struct acpi_device **device) |
| 61 | acpi_bus_get_device ( | ||
| 62 | acpi_handle handle, | ||
| 63 | struct acpi_device **device) | ||
| 64 | { | 59 | { |
| 65 | acpi_status status = AE_OK; | 60 | acpi_status status = AE_OK; |
| 66 | 61 | ||
| 67 | ACPI_FUNCTION_TRACE("acpi_bus_get_device"); | 62 | ACPI_FUNCTION_TRACE("acpi_bus_get_device"); |
| 68 | 63 | ||
| @@ -71,24 +66,23 @@ acpi_bus_get_device ( | |||
| 71 | 66 | ||
| 72 | /* TBD: Support fixed-feature devices */ | 67 | /* TBD: Support fixed-feature devices */ |
| 73 | 68 | ||
| 74 | status = acpi_get_data(handle, acpi_bus_data_handler, (void**) device); | 69 | status = acpi_get_data(handle, acpi_bus_data_handler, (void **)device); |
| 75 | if (ACPI_FAILURE(status) || !*device) { | 70 | if (ACPI_FAILURE(status) || !*device) { |
| 76 | ACPI_DEBUG_PRINT((ACPI_DB_WARN, "No context for object [%p]\n", | 71 | ACPI_DEBUG_PRINT((ACPI_DB_WARN, "No context for object [%p]\n", |
| 77 | handle)); | 72 | handle)); |
| 78 | return_VALUE(-ENODEV); | 73 | return_VALUE(-ENODEV); |
| 79 | } | 74 | } |
| 80 | 75 | ||
| 81 | return_VALUE(0); | 76 | return_VALUE(0); |
| 82 | } | 77 | } |
| 78 | |||
| 83 | EXPORT_SYMBOL(acpi_bus_get_device); | 79 | EXPORT_SYMBOL(acpi_bus_get_device); |
| 84 | 80 | ||
| 85 | int | 81 | int acpi_bus_get_status(struct acpi_device *device) |
| 86 | acpi_bus_get_status ( | ||
| 87 | struct acpi_device *device) | ||
| 88 | { | 82 | { |
| 89 | acpi_status status = AE_OK; | 83 | acpi_status status = AE_OK; |
| 90 | unsigned long sta = 0; | 84 | unsigned long sta = 0; |
| 91 | 85 | ||
| 92 | ACPI_FUNCTION_TRACE("acpi_bus_get_status"); | 86 | ACPI_FUNCTION_TRACE("acpi_bus_get_status"); |
| 93 | 87 | ||
| 94 | if (!device) | 88 | if (!device) |
| @@ -98,10 +92,11 @@ acpi_bus_get_status ( | |||
| 98 | * Evaluate _STA if present. | 92 | * Evaluate _STA if present. |
| 99 | */ | 93 | */ |
| 100 | if (device->flags.dynamic_status) { | 94 | if (device->flags.dynamic_status) { |
| 101 | status = acpi_evaluate_integer(device->handle, "_STA", NULL, &sta); | 95 | status = |
| 96 | acpi_evaluate_integer(device->handle, "_STA", NULL, &sta); | ||
| 102 | if (ACPI_FAILURE(status)) | 97 | if (ACPI_FAILURE(status)) |
| 103 | return_VALUE(-ENODEV); | 98 | return_VALUE(-ENODEV); |
| 104 | STRUCT_TO_INT(device->status) = (int) sta; | 99 | STRUCT_TO_INT(device->status) = (int)sta; |
| 105 | } | 100 | } |
| 106 | 101 | ||
| 107 | /* | 102 | /* |
| @@ -115,33 +110,30 @@ acpi_bus_get_status ( | |||
| 115 | 110 | ||
| 116 | if (device->status.functional && !device->status.present) { | 111 | if (device->status.functional && !device->status.present) { |
| 117 | printk(KERN_WARNING PREFIX "Device [%s] status [%08x]: " | 112 | printk(KERN_WARNING PREFIX "Device [%s] status [%08x]: " |
| 118 | "functional but not present; setting present\n", | 113 | "functional but not present; setting present\n", |
| 119 | device->pnp.bus_id, | 114 | device->pnp.bus_id, (u32) STRUCT_TO_INT(device->status)); |
| 120 | (u32) STRUCT_TO_INT(device->status)); | ||
| 121 | device->status.present = 1; | 115 | device->status.present = 1; |
| 122 | } | 116 | } |
| 123 | 117 | ||
| 124 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] status [%08x]\n", | 118 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] status [%08x]\n", |
| 125 | device->pnp.bus_id, (u32) STRUCT_TO_INT(device->status))); | 119 | device->pnp.bus_id, |
| 120 | (u32) STRUCT_TO_INT(device->status))); | ||
| 126 | 121 | ||
| 127 | return_VALUE(0); | 122 | return_VALUE(0); |
| 128 | } | 123 | } |
| 129 | EXPORT_SYMBOL(acpi_bus_get_status); | ||
| 130 | 124 | ||
| 125 | EXPORT_SYMBOL(acpi_bus_get_status); | ||
| 131 | 126 | ||
| 132 | /* -------------------------------------------------------------------------- | 127 | /* -------------------------------------------------------------------------- |
| 133 | Power Management | 128 | Power Management |
| 134 | -------------------------------------------------------------------------- */ | 129 | -------------------------------------------------------------------------- */ |
| 135 | 130 | ||
| 136 | int | 131 | int acpi_bus_get_power(acpi_handle handle, int *state) |
| 137 | acpi_bus_get_power ( | ||
| 138 | acpi_handle handle, | ||
| 139 | int *state) | ||
| 140 | { | 132 | { |
| 141 | int result = 0; | 133 | int result = 0; |
| 142 | acpi_status status = 0; | 134 | acpi_status status = 0; |
| 143 | struct acpi_device *device = NULL; | 135 | struct acpi_device *device = NULL; |
| 144 | unsigned long psc = 0; | 136 | unsigned long psc = 0; |
| 145 | 137 | ||
| 146 | ACPI_FUNCTION_TRACE("acpi_bus_get_power"); | 138 | ACPI_FUNCTION_TRACE("acpi_bus_get_power"); |
| 147 | 139 | ||
| @@ -157,20 +149,18 @@ acpi_bus_get_power ( | |||
| 157 | *state = device->parent->power.state; | 149 | *state = device->parent->power.state; |
| 158 | else | 150 | else |
| 159 | *state = ACPI_STATE_D0; | 151 | *state = ACPI_STATE_D0; |
| 160 | } | 152 | } else { |
| 161 | else { | ||
| 162 | /* | 153 | /* |
| 163 | * Get the device's power state either directly (via _PSC) or | 154 | * Get the device's power state either directly (via _PSC) or |
| 164 | * indirectly (via power resources). | 155 | * indirectly (via power resources). |
| 165 | */ | 156 | */ |
| 166 | if (device->power.flags.explicit_get) { | 157 | if (device->power.flags.explicit_get) { |
| 167 | status = acpi_evaluate_integer(device->handle, "_PSC", | 158 | status = acpi_evaluate_integer(device->handle, "_PSC", |
| 168 | NULL, &psc); | 159 | NULL, &psc); |
| 169 | if (ACPI_FAILURE(status)) | 160 | if (ACPI_FAILURE(status)) |
| 170 | return_VALUE(-ENODEV); | 161 | return_VALUE(-ENODEV); |
| 171 | device->power.state = (int) psc; | 162 | device->power.state = (int)psc; |
| 172 | } | 163 | } else if (device->power.flags.power_resources) { |
| 173 | else if (device->power.flags.power_resources) { | ||
| 174 | result = acpi_power_get_inferred_state(device); | 164 | result = acpi_power_get_inferred_state(device); |
| 175 | if (result) | 165 | if (result) |
| 176 | return_VALUE(result); | 166 | return_VALUE(result); |
| @@ -180,22 +170,19 @@ acpi_bus_get_power ( | |||
| 180 | } | 170 | } |
| 181 | 171 | ||
| 182 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] power state is D%d\n", | 172 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] power state is D%d\n", |
| 183 | device->pnp.bus_id, device->power.state)); | 173 | device->pnp.bus_id, device->power.state)); |
| 184 | 174 | ||
| 185 | return_VALUE(0); | 175 | return_VALUE(0); |
| 186 | } | 176 | } |
| 187 | EXPORT_SYMBOL(acpi_bus_get_power); | ||
| 188 | 177 | ||
| 178 | EXPORT_SYMBOL(acpi_bus_get_power); | ||
| 189 | 179 | ||
| 190 | int | 180 | int acpi_bus_set_power(acpi_handle handle, int state) |
| 191 | acpi_bus_set_power ( | ||
| 192 | acpi_handle handle, | ||
| 193 | int state) | ||
| 194 | { | 181 | { |
| 195 | int result = 0; | 182 | int result = 0; |
| 196 | acpi_status status = AE_OK; | 183 | acpi_status status = AE_OK; |
| 197 | struct acpi_device *device = NULL; | 184 | struct acpi_device *device = NULL; |
| 198 | char object_name[5] = {'_','P','S','0'+state,'\0'}; | 185 | char object_name[5] = { '_', 'P', 'S', '0' + state, '\0' }; |
| 199 | 186 | ||
| 200 | ACPI_FUNCTION_TRACE("acpi_bus_set_power"); | 187 | ACPI_FUNCTION_TRACE("acpi_bus_set_power"); |
| 201 | 188 | ||
| @@ -209,7 +196,8 @@ acpi_bus_set_power ( | |||
| 209 | /* Make sure this is a valid target state */ | 196 | /* Make sure this is a valid target state */ |
| 210 | 197 | ||
| 211 | if (!device->flags.power_manageable) { | 198 | if (!device->flags.power_manageable) { |
| 212 | ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Device is not power manageable\n")); | 199 | ACPI_DEBUG_PRINT((ACPI_DB_WARN, |
| 200 | "Device is not power manageable\n")); | ||
| 213 | return_VALUE(-ENODEV); | 201 | return_VALUE(-ENODEV); |
| 214 | } | 202 | } |
| 215 | /* | 203 | /* |
| @@ -219,15 +207,18 @@ acpi_bus_set_power ( | |||
| 219 | if (device->power.state == ACPI_STATE_UNKNOWN) | 207 | if (device->power.state == ACPI_STATE_UNKNOWN) |
| 220 | acpi_bus_get_power(device->handle, &device->power.state); | 208 | acpi_bus_get_power(device->handle, &device->power.state); |
| 221 | if (state == device->power.state) { | 209 | if (state == device->power.state) { |
| 222 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device is already at D%d\n", state)); | 210 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device is already at D%d\n", |
| 211 | state)); | ||
| 223 | return_VALUE(0); | 212 | return_VALUE(0); |
| 224 | } | 213 | } |
| 225 | if (!device->power.states[state].flags.valid) { | 214 | if (!device->power.states[state].flags.valid) { |
| 226 | ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Device does not support D%d\n", state)); | 215 | ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Device does not support D%d\n", |
| 216 | state)); | ||
| 227 | return_VALUE(-ENODEV); | 217 | return_VALUE(-ENODEV); |
| 228 | } | 218 | } |
| 229 | if (device->parent && (state < device->parent->power.state)) { | 219 | if (device->parent && (state < device->parent->power.state)) { |
| 230 | ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Cannot set device to a higher-powered state than parent\n")); | 220 | ACPI_DEBUG_PRINT((ACPI_DB_WARN, |
| 221 | "Cannot set device to a higher-powered state than parent\n")); | ||
| 231 | return_VALUE(-ENODEV); | 222 | return_VALUE(-ENODEV); |
| 232 | } | 223 | } |
| 233 | 224 | ||
| @@ -245,18 +236,17 @@ acpi_bus_set_power ( | |||
| 245 | goto end; | 236 | goto end; |
| 246 | } | 237 | } |
| 247 | if (device->power.states[state].flags.explicit_set) { | 238 | if (device->power.states[state].flags.explicit_set) { |
| 248 | status = acpi_evaluate_object(device->handle, | 239 | status = acpi_evaluate_object(device->handle, |
| 249 | object_name, NULL, NULL); | 240 | object_name, NULL, NULL); |
| 250 | if (ACPI_FAILURE(status)) { | 241 | if (ACPI_FAILURE(status)) { |
| 251 | result = -ENODEV; | 242 | result = -ENODEV; |
| 252 | goto end; | 243 | goto end; |
| 253 | } | 244 | } |
| 254 | } | 245 | } |
| 255 | } | 246 | } else { |
| 256 | else { | ||
| 257 | if (device->power.states[state].flags.explicit_set) { | 247 | if (device->power.states[state].flags.explicit_set) { |
| 258 | status = acpi_evaluate_object(device->handle, | 248 | status = acpi_evaluate_object(device->handle, |
| 259 | object_name, NULL, NULL); | 249 | object_name, NULL, NULL); |
| 260 | if (ACPI_FAILURE(status)) { | 250 | if (ACPI_FAILURE(status)) { |
| 261 | result = -ENODEV; | 251 | result = -ENODEV; |
| 262 | goto end; | 252 | goto end; |
| @@ -269,19 +259,20 @@ acpi_bus_set_power ( | |||
| 269 | } | 259 | } |
| 270 | } | 260 | } |
| 271 | 261 | ||
| 272 | end: | 262 | end: |
| 273 | if (result) | 263 | if (result) |
| 274 | ACPI_DEBUG_PRINT((ACPI_DB_WARN, "Error transitioning device [%s] to D%d\n", | 264 | ACPI_DEBUG_PRINT((ACPI_DB_WARN, |
| 275 | device->pnp.bus_id, state)); | 265 | "Error transitioning device [%s] to D%d\n", |
| 266 | device->pnp.bus_id, state)); | ||
| 276 | else | 267 | else |
| 277 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] transitioned to D%d\n", | 268 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
| 278 | device->pnp.bus_id, state)); | 269 | "Device [%s] transitioned to D%d\n", |
| 270 | device->pnp.bus_id, state)); | ||
| 279 | 271 | ||
| 280 | return_VALUE(result); | 272 | return_VALUE(result); |
| 281 | } | 273 | } |
| 282 | EXPORT_SYMBOL(acpi_bus_set_power); | ||
| 283 | |||
| 284 | 274 | ||
| 275 | EXPORT_SYMBOL(acpi_bus_set_power); | ||
| 285 | 276 | ||
| 286 | /* -------------------------------------------------------------------------- | 277 | /* -------------------------------------------------------------------------- |
| 287 | Event Management | 278 | Event Management |
| @@ -292,16 +283,12 @@ static DEFINE_SPINLOCK(acpi_bus_event_lock); | |||
| 292 | LIST_HEAD(acpi_bus_event_list); | 283 | LIST_HEAD(acpi_bus_event_list); |
| 293 | DECLARE_WAIT_QUEUE_HEAD(acpi_bus_event_queue); | 284 | DECLARE_WAIT_QUEUE_HEAD(acpi_bus_event_queue); |
| 294 | 285 | ||
| 295 | extern int event_is_open; | 286 | extern int event_is_open; |
| 296 | 287 | ||
| 297 | int | 288 | int acpi_bus_generate_event(struct acpi_device *device, u8 type, int data) |
| 298 | acpi_bus_generate_event ( | ||
| 299 | struct acpi_device *device, | ||
| 300 | u8 type, | ||
| 301 | int data) | ||
| 302 | { | 289 | { |
| 303 | struct acpi_bus_event *event = NULL; | 290 | struct acpi_bus_event *event = NULL; |
| 304 | unsigned long flags = 0; | 291 | unsigned long flags = 0; |
| 305 | 292 | ||
| 306 | ACPI_FUNCTION_TRACE("acpi_bus_generate_event"); | 293 | ACPI_FUNCTION_TRACE("acpi_bus_generate_event"); |
| 307 | 294 | ||
| @@ -329,14 +316,13 @@ acpi_bus_generate_event ( | |||
| 329 | 316 | ||
| 330 | return_VALUE(0); | 317 | return_VALUE(0); |
| 331 | } | 318 | } |
| 319 | |||
| 332 | EXPORT_SYMBOL(acpi_bus_generate_event); | 320 | EXPORT_SYMBOL(acpi_bus_generate_event); |
| 333 | 321 | ||
| 334 | int | 322 | int acpi_bus_receive_event(struct acpi_bus_event *event) |
| 335 | acpi_bus_receive_event ( | ||
| 336 | struct acpi_bus_event *event) | ||
| 337 | { | 323 | { |
| 338 | unsigned long flags = 0; | 324 | unsigned long flags = 0; |
| 339 | struct acpi_bus_event *entry = NULL; | 325 | struct acpi_bus_event *entry = NULL; |
| 340 | 326 | ||
| 341 | DECLARE_WAITQUEUE(wait, current); | 327 | DECLARE_WAITQUEUE(wait, current); |
| 342 | 328 | ||
| @@ -361,7 +347,8 @@ acpi_bus_receive_event ( | |||
| 361 | } | 347 | } |
| 362 | 348 | ||
| 363 | spin_lock_irqsave(&acpi_bus_event_lock, flags); | 349 | spin_lock_irqsave(&acpi_bus_event_lock, flags); |
| 364 | entry = list_entry(acpi_bus_event_list.next, struct acpi_bus_event, node); | 350 | entry = |
| 351 | list_entry(acpi_bus_event_list.next, struct acpi_bus_event, node); | ||
| 365 | if (entry) | 352 | if (entry) |
| 366 | list_del(&entry->node); | 353 | list_del(&entry->node); |
| 367 | spin_unlock_irqrestore(&acpi_bus_event_lock, flags); | 354 | spin_unlock_irqrestore(&acpi_bus_event_lock, flags); |
| @@ -375,19 +362,17 @@ acpi_bus_receive_event ( | |||
| 375 | 362 | ||
| 376 | return_VALUE(0); | 363 | return_VALUE(0); |
| 377 | } | 364 | } |
| 378 | EXPORT_SYMBOL(acpi_bus_receive_event); | ||
| 379 | 365 | ||
| 366 | EXPORT_SYMBOL(acpi_bus_receive_event); | ||
| 380 | 367 | ||
| 381 | /* -------------------------------------------------------------------------- | 368 | /* -------------------------------------------------------------------------- |
| 382 | Notification Handling | 369 | Notification Handling |
| 383 | -------------------------------------------------------------------------- */ | 370 | -------------------------------------------------------------------------- */ |
| 384 | 371 | ||
| 385 | static int | 372 | static int |
| 386 | acpi_bus_check_device ( | 373 | acpi_bus_check_device(struct acpi_device *device, int *status_changed) |
| 387 | struct acpi_device *device, | ||
| 388 | int *status_changed) | ||
| 389 | { | 374 | { |
| 390 | acpi_status status = 0; | 375 | acpi_status status = 0; |
| 391 | struct acpi_device_status old_status; | 376 | struct acpi_device_status old_status; |
| 392 | 377 | ||
| 393 | ACPI_FUNCTION_TRACE("acpi_bus_check_device"); | 378 | ACPI_FUNCTION_TRACE("acpi_bus_check_device"); |
| @@ -422,15 +407,14 @@ acpi_bus_check_device ( | |||
| 422 | 407 | ||
| 423 | if (status_changed) | 408 | if (status_changed) |
| 424 | *status_changed = 1; | 409 | *status_changed = 1; |
| 425 | 410 | ||
| 426 | /* | 411 | /* |
| 427 | * Device Insertion/Removal | 412 | * Device Insertion/Removal |
| 428 | */ | 413 | */ |
| 429 | if ((device->status.present) && !(old_status.present)) { | 414 | if ((device->status.present) && !(old_status.present)) { |
| 430 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device insertion detected\n")); | 415 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device insertion detected\n")); |
| 431 | /* TBD: Handle device insertion */ | 416 | /* TBD: Handle device insertion */ |
| 432 | } | 417 | } else if (!(device->status.present) && (old_status.present)) { |
| 433 | else if (!(device->status.present) && (old_status.present)) { | ||
| 434 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device removal detected\n")); | 418 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device removal detected\n")); |
| 435 | /* TBD: Handle device removal */ | 419 | /* TBD: Handle device removal */ |
| 436 | } | 420 | } |
| @@ -438,13 +422,10 @@ acpi_bus_check_device ( | |||
| 438 | return_VALUE(0); | 422 | return_VALUE(0); |
| 439 | } | 423 | } |
| 440 | 424 | ||
| 441 | 425 | static int acpi_bus_check_scope(struct acpi_device *device) | |
| 442 | static int | ||
| 443 | acpi_bus_check_scope ( | ||
| 444 | struct acpi_device *device) | ||
| 445 | { | 426 | { |
| 446 | int result = 0; | 427 | int result = 0; |
| 447 | int status_changed = 0; | 428 | int status_changed = 0; |
| 448 | 429 | ||
| 449 | ACPI_FUNCTION_TRACE("acpi_bus_check_scope"); | 430 | ACPI_FUNCTION_TRACE("acpi_bus_check_scope"); |
| 450 | 431 | ||
| @@ -467,20 +448,15 @@ acpi_bus_check_scope ( | |||
| 467 | return_VALUE(0); | 448 | return_VALUE(0); |
| 468 | } | 449 | } |
| 469 | 450 | ||
| 470 | |||
| 471 | /** | 451 | /** |
| 472 | * acpi_bus_notify | 452 | * acpi_bus_notify |
| 473 | * --------------- | 453 | * --------------- |
| 474 | * Callback for all 'system-level' device notifications (values 0x00-0x7F). | 454 | * Callback for all 'system-level' device notifications (values 0x00-0x7F). |
| 475 | */ | 455 | */ |
| 476 | static void | 456 | static void acpi_bus_notify(acpi_handle handle, u32 type, void *data) |
| 477 | acpi_bus_notify ( | ||
| 478 | acpi_handle handle, | ||
| 479 | u32 type, | ||
| 480 | void *data) | ||
| 481 | { | 457 | { |
| 482 | int result = 0; | 458 | int result = 0; |
| 483 | struct acpi_device *device = NULL; | 459 | struct acpi_device *device = NULL; |
| 484 | 460 | ||
| 485 | ACPI_FUNCTION_TRACE("acpi_bus_notify"); | 461 | ACPI_FUNCTION_TRACE("acpi_bus_notify"); |
| 486 | 462 | ||
| @@ -490,64 +466,73 @@ acpi_bus_notify ( | |||
| 490 | switch (type) { | 466 | switch (type) { |
| 491 | 467 | ||
| 492 | case ACPI_NOTIFY_BUS_CHECK: | 468 | case ACPI_NOTIFY_BUS_CHECK: |
| 493 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Received BUS CHECK notification for device [%s]\n", | 469 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
| 494 | device->pnp.bus_id)); | 470 | "Received BUS CHECK notification for device [%s]\n", |
| 471 | device->pnp.bus_id)); | ||
| 495 | result = acpi_bus_check_scope(device); | 472 | result = acpi_bus_check_scope(device); |
| 496 | /* | 473 | /* |
| 497 | * TBD: We'll need to outsource certain events to non-ACPI | 474 | * TBD: We'll need to outsource certain events to non-ACPI |
| 498 | * drivers via the device manager (device.c). | 475 | * drivers via the device manager (device.c). |
| 499 | */ | 476 | */ |
| 500 | break; | 477 | break; |
| 501 | 478 | ||
| 502 | case ACPI_NOTIFY_DEVICE_CHECK: | 479 | case ACPI_NOTIFY_DEVICE_CHECK: |
| 503 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Received DEVICE CHECK notification for device [%s]\n", | 480 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
| 504 | device->pnp.bus_id)); | 481 | "Received DEVICE CHECK notification for device [%s]\n", |
| 482 | device->pnp.bus_id)); | ||
| 505 | result = acpi_bus_check_device(device, NULL); | 483 | result = acpi_bus_check_device(device, NULL); |
| 506 | /* | 484 | /* |
| 507 | * TBD: We'll need to outsource certain events to non-ACPI | 485 | * TBD: We'll need to outsource certain events to non-ACPI |
| 508 | * drivers via the device manager (device.c). | 486 | * drivers via the device manager (device.c). |
| 509 | */ | 487 | */ |
| 510 | break; | 488 | break; |
| 511 | 489 | ||
| 512 | case ACPI_NOTIFY_DEVICE_WAKE: | 490 | case ACPI_NOTIFY_DEVICE_WAKE: |
| 513 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Received DEVICE WAKE notification for device [%s]\n", | 491 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
| 514 | device->pnp.bus_id)); | 492 | "Received DEVICE WAKE notification for device [%s]\n", |
| 493 | device->pnp.bus_id)); | ||
| 515 | /* TBD */ | 494 | /* TBD */ |
| 516 | break; | 495 | break; |
| 517 | 496 | ||
| 518 | case ACPI_NOTIFY_EJECT_REQUEST: | 497 | case ACPI_NOTIFY_EJECT_REQUEST: |
| 519 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Received EJECT REQUEST notification for device [%s]\n", | 498 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
| 520 | device->pnp.bus_id)); | 499 | "Received EJECT REQUEST notification for device [%s]\n", |
| 500 | device->pnp.bus_id)); | ||
| 521 | /* TBD */ | 501 | /* TBD */ |
| 522 | break; | 502 | break; |
| 523 | 503 | ||
| 524 | case ACPI_NOTIFY_DEVICE_CHECK_LIGHT: | 504 | case ACPI_NOTIFY_DEVICE_CHECK_LIGHT: |
| 525 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Received DEVICE CHECK LIGHT notification for device [%s]\n", | 505 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
| 526 | device->pnp.bus_id)); | 506 | "Received DEVICE CHECK LIGHT notification for device [%s]\n", |
| 507 | device->pnp.bus_id)); | ||
| 527 | /* TBD: Exactly what does 'light' mean? */ | 508 | /* TBD: Exactly what does 'light' mean? */ |
| 528 | break; | 509 | break; |
| 529 | 510 | ||
| 530 | case ACPI_NOTIFY_FREQUENCY_MISMATCH: | 511 | case ACPI_NOTIFY_FREQUENCY_MISMATCH: |
| 531 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Received FREQUENCY MISMATCH notification for device [%s]\n", | 512 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
| 532 | device->pnp.bus_id)); | 513 | "Received FREQUENCY MISMATCH notification for device [%s]\n", |
| 514 | device->pnp.bus_id)); | ||
| 533 | /* TBD */ | 515 | /* TBD */ |
| 534 | break; | 516 | break; |
| 535 | 517 | ||
| 536 | case ACPI_NOTIFY_BUS_MODE_MISMATCH: | 518 | case ACPI_NOTIFY_BUS_MODE_MISMATCH: |
| 537 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Received BUS MODE MISMATCH notification for device [%s]\n", | 519 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
| 538 | device->pnp.bus_id)); | 520 | "Received BUS MODE MISMATCH notification for device [%s]\n", |
| 521 | device->pnp.bus_id)); | ||
| 539 | /* TBD */ | 522 | /* TBD */ |
| 540 | break; | 523 | break; |
| 541 | 524 | ||
| 542 | case ACPI_NOTIFY_POWER_FAULT: | 525 | case ACPI_NOTIFY_POWER_FAULT: |
| 543 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Received POWER FAULT notification for device [%s]\n", | 526 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
| 544 | device->pnp.bus_id)); | 527 | "Received POWER FAULT notification for device [%s]\n", |
| 528 | device->pnp.bus_id)); | ||
| 545 | /* TBD */ | 529 | /* TBD */ |
| 546 | break; | 530 | break; |
| 547 | 531 | ||
| 548 | default: | 532 | default: |
| 549 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Received unknown/unsupported notification [%08x]\n", | 533 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
| 550 | type)); | 534 | "Received unknown/unsupported notification [%08x]\n", |
| 535 | type)); | ||
| 551 | break; | 536 | break; |
| 552 | } | 537 | } |
| 553 | 538 | ||
| @@ -558,13 +543,12 @@ acpi_bus_notify ( | |||
| 558 | Initialization/Cleanup | 543 | Initialization/Cleanup |
| 559 | -------------------------------------------------------------------------- */ | 544 | -------------------------------------------------------------------------- */ |
| 560 | 545 | ||
| 561 | static int __init | 546 | static int __init acpi_bus_init_irq(void) |
| 562 | acpi_bus_init_irq (void) | ||
| 563 | { | 547 | { |
| 564 | acpi_status status = AE_OK; | 548 | acpi_status status = AE_OK; |
| 565 | union acpi_object arg = {ACPI_TYPE_INTEGER}; | 549 | union acpi_object arg = { ACPI_TYPE_INTEGER }; |
| 566 | struct acpi_object_list arg_list = {1, &arg}; | 550 | struct acpi_object_list arg_list = { 1, &arg }; |
| 567 | char *message = NULL; | 551 | char *message = NULL; |
| 568 | 552 | ||
| 569 | ACPI_FUNCTION_TRACE("acpi_bus_init_irq"); | 553 | ACPI_FUNCTION_TRACE("acpi_bus_init_irq"); |
| 570 | 554 | ||
| @@ -601,12 +585,10 @@ acpi_bus_init_irq (void) | |||
| 601 | return_VALUE(0); | 585 | return_VALUE(0); |
| 602 | } | 586 | } |
| 603 | 587 | ||
| 604 | 588 | void __init acpi_early_init(void) | |
| 605 | void __init | ||
| 606 | acpi_early_init (void) | ||
| 607 | { | 589 | { |
| 608 | acpi_status status = AE_OK; | 590 | acpi_status status = AE_OK; |
| 609 | struct acpi_buffer buffer = {sizeof(acpi_fadt), &acpi_fadt}; | 591 | struct acpi_buffer buffer = { sizeof(acpi_fadt), &acpi_fadt }; |
| 610 | 592 | ||
| 611 | ACPI_FUNCTION_TRACE("acpi_early_init"); | 593 | ACPI_FUNCTION_TRACE("acpi_early_init"); |
| 612 | 594 | ||
| @@ -619,13 +601,15 @@ acpi_early_init (void) | |||
| 619 | 601 | ||
| 620 | status = acpi_initialize_subsystem(); | 602 | status = acpi_initialize_subsystem(); |
| 621 | if (ACPI_FAILURE(status)) { | 603 | if (ACPI_FAILURE(status)) { |
| 622 | printk(KERN_ERR PREFIX "Unable to initialize the ACPI Interpreter\n"); | 604 | printk(KERN_ERR PREFIX |
| 605 | "Unable to initialize the ACPI Interpreter\n"); | ||
| 623 | goto error0; | 606 | goto error0; |
| 624 | } | 607 | } |
| 625 | 608 | ||
| 626 | status = acpi_load_tables(); | 609 | status = acpi_load_tables(); |
| 627 | if (ACPI_FAILURE(status)) { | 610 | if (ACPI_FAILURE(status)) { |
| 628 | printk(KERN_ERR PREFIX "Unable to load the System Description Tables\n"); | 611 | printk(KERN_ERR PREFIX |
| 612 | "Unable to load the System Description Tables\n"); | ||
| 629 | goto error0; | 613 | goto error0; |
| 630 | } | 614 | } |
| 631 | 615 | ||
| @@ -637,7 +621,6 @@ acpi_early_init (void) | |||
| 637 | printk(KERN_ERR PREFIX "Unable to get the FADT\n"); | 621 | printk(KERN_ERR PREFIX "Unable to get the FADT\n"); |
| 638 | goto error0; | 622 | goto error0; |
| 639 | } | 623 | } |
| 640 | |||
| 641 | #ifdef CONFIG_X86 | 624 | #ifdef CONFIG_X86 |
| 642 | if (!acpi_ioapic) { | 625 | if (!acpi_ioapic) { |
| 643 | extern acpi_interrupt_flags acpi_sci_flags; | 626 | extern acpi_interrupt_flags acpi_sci_flags; |
| @@ -647,7 +630,8 @@ acpi_early_init (void) | |||
| 647 | acpi_sci_flags.trigger = 3; | 630 | acpi_sci_flags.trigger = 3; |
| 648 | 631 | ||
| 649 | /* Set PIC-mode SCI trigger type */ | 632 | /* Set PIC-mode SCI trigger type */ |
| 650 | acpi_pic_sci_set_trigger(acpi_fadt.sci_int, acpi_sci_flags.trigger); | 633 | acpi_pic_sci_set_trigger(acpi_fadt.sci_int, |
| 634 | acpi_sci_flags.trigger); | ||
| 651 | } else { | 635 | } else { |
| 652 | extern int acpi_sci_override_gsi; | 636 | extern int acpi_sci_override_gsi; |
| 653 | /* | 637 | /* |
| @@ -658,7 +642,10 @@ acpi_early_init (void) | |||
| 658 | } | 642 | } |
| 659 | #endif | 643 | #endif |
| 660 | 644 | ||
| 661 | status = acpi_enable_subsystem(~(ACPI_NO_HARDWARE_INIT | ACPI_NO_ACPI_ENABLE)); | 645 | status = |
| 646 | acpi_enable_subsystem(~ | ||
| 647 | (ACPI_NO_HARDWARE_INIT | | ||
| 648 | ACPI_NO_ACPI_ENABLE)); | ||
| 662 | if (ACPI_FAILURE(status)) { | 649 | if (ACPI_FAILURE(status)) { |
| 663 | printk(KERN_ERR PREFIX "Unable to enable ACPI\n"); | 650 | printk(KERN_ERR PREFIX "Unable to enable ACPI\n"); |
| 664 | goto error0; | 651 | goto error0; |
| @@ -666,30 +653,32 @@ acpi_early_init (void) | |||
| 666 | 653 | ||
| 667 | return_VOID; | 654 | return_VOID; |
| 668 | 655 | ||
| 669 | error0: | 656 | error0: |
| 670 | disable_acpi(); | 657 | disable_acpi(); |
| 671 | return_VOID; | 658 | return_VOID; |
| 672 | } | 659 | } |
| 673 | 660 | ||
| 674 | static int __init | 661 | static int __init acpi_bus_init(void) |
| 675 | acpi_bus_init (void) | ||
| 676 | { | 662 | { |
| 677 | int result = 0; | 663 | int result = 0; |
| 678 | acpi_status status = AE_OK; | 664 | acpi_status status = AE_OK; |
| 679 | extern acpi_status acpi_os_initialize1(void); | 665 | extern acpi_status acpi_os_initialize1(void); |
| 680 | 666 | ||
| 681 | ACPI_FUNCTION_TRACE("acpi_bus_init"); | 667 | ACPI_FUNCTION_TRACE("acpi_bus_init"); |
| 682 | 668 | ||
| 683 | status = acpi_os_initialize1(); | 669 | status = acpi_os_initialize1(); |
| 684 | 670 | ||
| 685 | status = acpi_enable_subsystem(ACPI_NO_HARDWARE_INIT | ACPI_NO_ACPI_ENABLE); | 671 | status = |
| 672 | acpi_enable_subsystem(ACPI_NO_HARDWARE_INIT | ACPI_NO_ACPI_ENABLE); | ||
| 686 | if (ACPI_FAILURE(status)) { | 673 | if (ACPI_FAILURE(status)) { |
| 687 | printk(KERN_ERR PREFIX "Unable to start the ACPI Interpreter\n"); | 674 | printk(KERN_ERR PREFIX |
| 675 | "Unable to start the ACPI Interpreter\n"); | ||
| 688 | goto error1; | 676 | goto error1; |
| 689 | } | 677 | } |
| 690 | 678 | ||
| 691 | if (ACPI_FAILURE(status)) { | 679 | if (ACPI_FAILURE(status)) { |
| 692 | printk(KERN_ERR PREFIX "Unable to initialize ACPI OS objects\n"); | 680 | printk(KERN_ERR PREFIX |
| 681 | "Unable to initialize ACPI OS objects\n"); | ||
| 693 | goto error1; | 682 | goto error1; |
| 694 | } | 683 | } |
| 695 | #ifdef CONFIG_ACPI_EC | 684 | #ifdef CONFIG_ACPI_EC |
| @@ -723,9 +712,12 @@ acpi_bus_init (void) | |||
| 723 | /* | 712 | /* |
| 724 | * Register the for all standard device notifications. | 713 | * Register the for all standard device notifications. |
| 725 | */ | 714 | */ |
| 726 | status = acpi_install_notify_handler(ACPI_ROOT_OBJECT, ACPI_SYSTEM_NOTIFY, &acpi_bus_notify, NULL); | 715 | status = |
| 716 | acpi_install_notify_handler(ACPI_ROOT_OBJECT, ACPI_SYSTEM_NOTIFY, | ||
| 717 | &acpi_bus_notify, NULL); | ||
| 727 | if (ACPI_FAILURE(status)) { | 718 | if (ACPI_FAILURE(status)) { |
| 728 | printk(KERN_ERR PREFIX "Unable to register for device notifications\n"); | 719 | printk(KERN_ERR PREFIX |
| 720 | "Unable to register for device notifications\n"); | ||
| 729 | goto error1; | 721 | goto error1; |
| 730 | } | 722 | } |
| 731 | 723 | ||
| @@ -737,21 +729,20 @@ acpi_bus_init (void) | |||
| 737 | return_VALUE(0); | 729 | return_VALUE(0); |
| 738 | 730 | ||
| 739 | /* Mimic structured exception handling */ | 731 | /* Mimic structured exception handling */ |
| 740 | error1: | 732 | error1: |
| 741 | acpi_terminate(); | 733 | acpi_terminate(); |
| 742 | return_VALUE(-ENODEV); | 734 | return_VALUE(-ENODEV); |
| 743 | } | 735 | } |
| 744 | 736 | ||
| 745 | decl_subsys(acpi,NULL,NULL); | 737 | decl_subsys(acpi, NULL, NULL); |
| 746 | 738 | ||
| 747 | static int __init acpi_init (void) | 739 | static int __init acpi_init(void) |
| 748 | { | 740 | { |
| 749 | int result = 0; | 741 | int result = 0; |
| 750 | 742 | ||
| 751 | ACPI_FUNCTION_TRACE("acpi_init"); | 743 | ACPI_FUNCTION_TRACE("acpi_init"); |
| 752 | 744 | ||
| 753 | printk(KERN_INFO PREFIX "Subsystem revision %08x\n", | 745 | printk(KERN_INFO PREFIX "Subsystem revision %08x\n", ACPI_CA_VERSION); |
| 754 | ACPI_CA_VERSION); | ||
| 755 | 746 | ||
| 756 | if (acpi_disabled) { | 747 | if (acpi_disabled) { |
| 757 | printk(KERN_INFO PREFIX "Interpreter disabled.\n"); | 748 | printk(KERN_INFO PREFIX "Interpreter disabled.\n"); |
| @@ -767,7 +758,8 @@ static int __init acpi_init (void) | |||
| 767 | if (!PM_IS_ACTIVE()) | 758 | if (!PM_IS_ACTIVE()) |
| 768 | pm_active = 1; | 759 | pm_active = 1; |
| 769 | else { | 760 | else { |
| 770 | printk(KERN_INFO PREFIX "APM is already active, exiting\n"); | 761 | printk(KERN_INFO PREFIX |
| 762 | "APM is already active, exiting\n"); | ||
| 771 | disable_acpi(); | 763 | disable_acpi(); |
| 772 | result = -ENODEV; | 764 | result = -ENODEV; |
| 773 | } | 765 | } |
