xref: /linux/drivers/acpi/power.c (revision 95e9fd10f06cb5642028b6b851e32b8c8afb4571)
1 /*
2  *  acpi_power.c - ACPI Bus Power Management ($Revision: 39 $)
3  *
4  *  Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
5  *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
6  *
7  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8  *
9  *  This program is free software; you can redistribute it and/or modify
10  *  it under the terms of the GNU General Public License as published by
11  *  the Free Software Foundation; either version 2 of the License, or (at
12  *  your option) any later version.
13  *
14  *  This program is distributed in the hope that it will be useful, but
15  *  WITHOUT ANY WARRANTY; without even the implied warranty of
16  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  *  General Public License for more details.
18  *
19  *  You should have received a copy of the GNU General Public License along
20  *  with this program; if not, write to the Free Software Foundation, Inc.,
21  *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
22  *
23  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
24  */
25 
26 /*
27  * ACPI power-managed devices may be controlled in two ways:
28  * 1. via "Device Specific (D-State) Control"
29  * 2. via "Power Resource Control".
30  * This module is used to manage devices relying on Power Resource Control.
31  *
32  * An ACPI "power resource object" describes a software controllable power
33  * plane, clock plane, or other resource used by a power managed device.
34  * A device may rely on multiple power resources, and a power resource
35  * may be shared by multiple devices.
36  */
37 
38 #include <linux/kernel.h>
39 #include <linux/module.h>
40 #include <linux/init.h>
41 #include <linux/types.h>
42 #include <linux/slab.h>
43 #include <linux/pm_runtime.h>
44 #include <acpi/acpi_bus.h>
45 #include <acpi/acpi_drivers.h>
46 #include "sleep.h"
47 #include "internal.h"
48 
49 #define PREFIX "ACPI: "
50 
51 #define _COMPONENT			ACPI_POWER_COMPONENT
52 ACPI_MODULE_NAME("power");
53 #define ACPI_POWER_CLASS		"power_resource"
54 #define ACPI_POWER_DEVICE_NAME		"Power Resource"
55 #define ACPI_POWER_FILE_INFO		"info"
56 #define ACPI_POWER_FILE_STATUS		"state"
57 #define ACPI_POWER_RESOURCE_STATE_OFF	0x00
58 #define ACPI_POWER_RESOURCE_STATE_ON	0x01
59 #define ACPI_POWER_RESOURCE_STATE_UNKNOWN 0xFF
60 
61 static int acpi_power_add(struct acpi_device *device);
62 static int acpi_power_remove(struct acpi_device *device, int type);
63 
64 static const struct acpi_device_id power_device_ids[] = {
65 	{ACPI_POWER_HID, 0},
66 	{"", 0},
67 };
68 MODULE_DEVICE_TABLE(acpi, power_device_ids);
69 
70 #ifdef CONFIG_PM_SLEEP
71 static int acpi_power_resume(struct device *dev);
72 #endif
73 static SIMPLE_DEV_PM_OPS(acpi_power_pm, NULL, acpi_power_resume);
74 
75 static struct acpi_driver acpi_power_driver = {
76 	.name = "power",
77 	.class = ACPI_POWER_CLASS,
78 	.ids = power_device_ids,
79 	.ops = {
80 		.add = acpi_power_add,
81 		.remove = acpi_power_remove,
82 		},
83 	.drv.pm = &acpi_power_pm,
84 };
85 
86 /*
87  * A power managed device
88  * A device may rely on multiple power resources.
89  * */
90 struct acpi_power_managed_device {
91 	struct device *dev; /* The physical device */
92 	acpi_handle *handle;
93 };
94 
95 struct acpi_power_resource_device {
96 	struct acpi_power_managed_device *device;
97 	struct acpi_power_resource_device *next;
98 };
99 
100 struct acpi_power_resource {
101 	struct acpi_device * device;
102 	acpi_bus_id name;
103 	u32 system_level;
104 	u32 order;
105 	unsigned int ref_count;
106 	struct mutex resource_lock;
107 
108 	/* List of devices relying on this power resource */
109 	struct acpi_power_resource_device *devices;
110 };
111 
112 static struct list_head acpi_power_resource_list;
113 
114 /* --------------------------------------------------------------------------
115                              Power Resource Management
116    -------------------------------------------------------------------------- */
117 
118 static int
119 acpi_power_get_context(acpi_handle handle,
120 		       struct acpi_power_resource **resource)
121 {
122 	int result = 0;
123 	struct acpi_device *device = NULL;
124 
125 
126 	if (!resource)
127 		return -ENODEV;
128 
129 	result = acpi_bus_get_device(handle, &device);
130 	if (result) {
131 		printk(KERN_WARNING PREFIX "Getting context [%p]\n", handle);
132 		return result;
133 	}
134 
135 	*resource = acpi_driver_data(device);
136 	if (!*resource)
137 		return -ENODEV;
138 
139 	return 0;
140 }
141 
142 static int acpi_power_get_state(acpi_handle handle, int *state)
143 {
144 	acpi_status status = AE_OK;
145 	unsigned long long sta = 0;
146 	char node_name[5];
147 	struct acpi_buffer buffer = { sizeof(node_name), node_name };
148 
149 
150 	if (!handle || !state)
151 		return -EINVAL;
152 
153 	status = acpi_evaluate_integer(handle, "_STA", NULL, &sta);
154 	if (ACPI_FAILURE(status))
155 		return -ENODEV;
156 
157 	*state = (sta & 0x01)?ACPI_POWER_RESOURCE_STATE_ON:
158 			      ACPI_POWER_RESOURCE_STATE_OFF;
159 
160 	acpi_get_name(handle, ACPI_SINGLE_NAME, &buffer);
161 
162 	ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Resource [%s] is %s\n",
163 			  node_name,
164 				*state ? "on" : "off"));
165 
166 	return 0;
167 }
168 
169 static int acpi_power_get_list_state(struct acpi_handle_list *list, int *state)
170 {
171 	int cur_state;
172 	int i = 0;
173 
174 	if (!list || !state)
175 		return -EINVAL;
176 
177 	/* The state of the list is 'on' IFF all resources are 'on'. */
178 
179 	for (i = 0; i < list->count; i++) {
180 		struct acpi_power_resource *resource;
181 		acpi_handle handle = list->handles[i];
182 		int result;
183 
184 		result = acpi_power_get_context(handle, &resource);
185 		if (result)
186 			return result;
187 
188 		mutex_lock(&resource->resource_lock);
189 
190 		result = acpi_power_get_state(handle, &cur_state);
191 
192 		mutex_unlock(&resource->resource_lock);
193 
194 		if (result)
195 			return result;
196 
197 		if (cur_state != ACPI_POWER_RESOURCE_STATE_ON)
198 			break;
199 	}
200 
201 	ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Resource list is %s\n",
202 			  cur_state ? "on" : "off"));
203 
204 	*state = cur_state;
205 
206 	return 0;
207 }
208 
209 /* Resume the device when all power resources in _PR0 are on */
210 static void acpi_power_on_device(struct acpi_power_managed_device *device)
211 {
212 	struct acpi_device *acpi_dev;
213 	acpi_handle handle = device->handle;
214 	int state;
215 
216 	if (acpi_bus_get_device(handle, &acpi_dev))
217 		return;
218 
219 	if(acpi_power_get_inferred_state(acpi_dev, &state))
220 		return;
221 
222 	if (state == ACPI_STATE_D0 && pm_runtime_suspended(device->dev))
223 		pm_request_resume(device->dev);
224 }
225 
226 static int __acpi_power_on(struct acpi_power_resource *resource)
227 {
228 	struct acpi_power_resource_device *device_list = resource->devices;
229 	acpi_status status = AE_OK;
230 
231 	status = acpi_evaluate_object(resource->device->handle, "_ON", NULL, NULL);
232 	if (ACPI_FAILURE(status))
233 		return -ENODEV;
234 
235 	/* Update the power resource's _device_ power state */
236 	resource->device->power.state = ACPI_STATE_D0;
237 
238 	ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Power resource [%s] turned on\n",
239 			  resource->name));
240 
241 	while (device_list) {
242 		acpi_power_on_device(device_list->device);
243 
244 		device_list = device_list->next;
245 	}
246 
247 	return 0;
248 }
249 
250 static int acpi_power_on(acpi_handle handle)
251 {
252 	int result = 0;
253 	struct acpi_power_resource *resource = NULL;
254 
255 	result = acpi_power_get_context(handle, &resource);
256 	if (result)
257 		return result;
258 
259 	mutex_lock(&resource->resource_lock);
260 
261 	if (resource->ref_count++) {
262 		ACPI_DEBUG_PRINT((ACPI_DB_INFO,
263 				  "Power resource [%s] already on",
264 				  resource->name));
265 	} else {
266 		result = __acpi_power_on(resource);
267 		if (result)
268 			resource->ref_count--;
269 	}
270 
271 	mutex_unlock(&resource->resource_lock);
272 
273 	return result;
274 }
275 
276 static int acpi_power_off(acpi_handle handle)
277 {
278 	int result = 0;
279 	acpi_status status = AE_OK;
280 	struct acpi_power_resource *resource = NULL;
281 
282 	result = acpi_power_get_context(handle, &resource);
283 	if (result)
284 		return result;
285 
286 	mutex_lock(&resource->resource_lock);
287 
288 	if (!resource->ref_count) {
289 		ACPI_DEBUG_PRINT((ACPI_DB_INFO,
290 				  "Power resource [%s] already off",
291 				  resource->name));
292 		goto unlock;
293 	}
294 
295 	if (--resource->ref_count) {
296 		ACPI_DEBUG_PRINT((ACPI_DB_INFO,
297 				  "Power resource [%s] still in use\n",
298 				  resource->name));
299 		goto unlock;
300 	}
301 
302 	status = acpi_evaluate_object(resource->device->handle, "_OFF", NULL, NULL);
303 	if (ACPI_FAILURE(status)) {
304 		result = -ENODEV;
305 	} else {
306 		/* Update the power resource's _device_ power state */
307 		resource->device->power.state = ACPI_STATE_D3;
308 
309 		ACPI_DEBUG_PRINT((ACPI_DB_INFO,
310 				  "Power resource [%s] turned off\n",
311 				  resource->name));
312 	}
313 
314  unlock:
315 	mutex_unlock(&resource->resource_lock);
316 
317 	return result;
318 }
319 
320 static void __acpi_power_off_list(struct acpi_handle_list *list, int num_res)
321 {
322 	int i;
323 
324 	for (i = num_res - 1; i >= 0 ; i--)
325 		acpi_power_off(list->handles[i]);
326 }
327 
328 static void acpi_power_off_list(struct acpi_handle_list *list)
329 {
330 	__acpi_power_off_list(list, list->count);
331 }
332 
333 static int acpi_power_on_list(struct acpi_handle_list *list)
334 {
335 	int result = 0;
336 	int i;
337 
338 	for (i = 0; i < list->count; i++) {
339 		result = acpi_power_on(list->handles[i]);
340 		if (result) {
341 			__acpi_power_off_list(list, i);
342 			break;
343 		}
344 	}
345 
346 	return result;
347 }
348 
349 static void __acpi_power_resource_unregister_device(struct device *dev,
350 		acpi_handle res_handle)
351 {
352 	struct acpi_power_resource *resource = NULL;
353 	struct acpi_power_resource_device *prev, *curr;
354 
355 	if (acpi_power_get_context(res_handle, &resource))
356 		return;
357 
358 	mutex_lock(&resource->resource_lock);
359 	prev = NULL;
360 	curr = resource->devices;
361 	while (curr) {
362 		if (curr->device->dev == dev) {
363 			if (!prev)
364 				resource->devices = curr->next;
365 			else
366 				prev->next = curr->next;
367 
368 			kfree(curr);
369 			break;
370 		}
371 
372 		prev = curr;
373 		curr = curr->next;
374 	}
375 	mutex_unlock(&resource->resource_lock);
376 }
377 
378 /* Unlink dev from all power resources in _PR0 */
379 void acpi_power_resource_unregister_device(struct device *dev, acpi_handle handle)
380 {
381 	struct acpi_device *acpi_dev;
382 	struct acpi_handle_list *list;
383 	int i;
384 
385 	if (!dev || !handle)
386 		return;
387 
388 	if (acpi_bus_get_device(handle, &acpi_dev))
389 		return;
390 
391 	list = &acpi_dev->power.states[ACPI_STATE_D0].resources;
392 
393 	for (i = 0; i < list->count; i++)
394 		__acpi_power_resource_unregister_device(dev,
395 			list->handles[i]);
396 }
397 EXPORT_SYMBOL_GPL(acpi_power_resource_unregister_device);
398 
399 static int __acpi_power_resource_register_device(
400 	struct acpi_power_managed_device *powered_device, acpi_handle handle)
401 {
402 	struct acpi_power_resource *resource = NULL;
403 	struct acpi_power_resource_device *power_resource_device;
404 	int result;
405 
406 	result = acpi_power_get_context(handle, &resource);
407 	if (result)
408 		return result;
409 
410 	power_resource_device = kzalloc(
411 		sizeof(*power_resource_device), GFP_KERNEL);
412 	if (!power_resource_device)
413 		return -ENOMEM;
414 
415 	power_resource_device->device = powered_device;
416 
417 	mutex_lock(&resource->resource_lock);
418 	power_resource_device->next = resource->devices;
419 	resource->devices = power_resource_device;
420 	mutex_unlock(&resource->resource_lock);
421 
422 	return 0;
423 }
424 
425 /* Link dev to all power resources in _PR0 */
426 int acpi_power_resource_register_device(struct device *dev, acpi_handle handle)
427 {
428 	struct acpi_device *acpi_dev;
429 	struct acpi_handle_list *list;
430 	struct acpi_power_managed_device *powered_device;
431 	int i, ret;
432 
433 	if (!dev || !handle)
434 		return -ENODEV;
435 
436 	ret = acpi_bus_get_device(handle, &acpi_dev);
437 	if (ret)
438 		goto no_power_resource;
439 
440 	if (!acpi_dev->power.flags.power_resources)
441 		goto no_power_resource;
442 
443 	powered_device = kzalloc(sizeof(*powered_device), GFP_KERNEL);
444 	if (!powered_device)
445 		return -ENOMEM;
446 
447 	powered_device->dev = dev;
448 	powered_device->handle = handle;
449 
450 	list = &acpi_dev->power.states[ACPI_STATE_D0].resources;
451 
452 	for (i = 0; i < list->count; i++) {
453 		ret = __acpi_power_resource_register_device(powered_device,
454 			list->handles[i]);
455 
456 		if (ret) {
457 			acpi_power_resource_unregister_device(dev, handle);
458 			break;
459 		}
460 	}
461 
462 	return ret;
463 
464 no_power_resource:
465 	printk(KERN_WARNING PREFIX "Invalid Power Resource to register!");
466 	return -ENODEV;
467 }
468 EXPORT_SYMBOL_GPL(acpi_power_resource_register_device);
469 
470 /**
471  * acpi_device_sleep_wake - execute _DSW (Device Sleep Wake) or (deprecated in
472  *                          ACPI 3.0) _PSW (Power State Wake)
473  * @dev: Device to handle.
474  * @enable: 0 - disable, 1 - enable the wake capabilities of the device.
475  * @sleep_state: Target sleep state of the system.
476  * @dev_state: Target power state of the device.
477  *
478  * Execute _DSW (Device Sleep Wake) or (deprecated in ACPI 3.0) _PSW (Power
479  * State Wake) for the device, if present.  On failure reset the device's
480  * wakeup.flags.valid flag.
481  *
482  * RETURN VALUE:
483  * 0 if either _DSW or _PSW has been successfully executed
484  * 0 if neither _DSW nor _PSW has been found
485  * -ENODEV if the execution of either _DSW or _PSW has failed
486  */
487 int acpi_device_sleep_wake(struct acpi_device *dev,
488                            int enable, int sleep_state, int dev_state)
489 {
490 	union acpi_object in_arg[3];
491 	struct acpi_object_list arg_list = { 3, in_arg };
492 	acpi_status status = AE_OK;
493 
494 	/*
495 	 * Try to execute _DSW first.
496 	 *
497 	 * Three agruments are needed for the _DSW object:
498 	 * Argument 0: enable/disable the wake capabilities
499 	 * Argument 1: target system state
500 	 * Argument 2: target device state
501 	 * When _DSW object is called to disable the wake capabilities, maybe
502 	 * the first argument is filled. The values of the other two agruments
503 	 * are meaningless.
504 	 */
505 	in_arg[0].type = ACPI_TYPE_INTEGER;
506 	in_arg[0].integer.value = enable;
507 	in_arg[1].type = ACPI_TYPE_INTEGER;
508 	in_arg[1].integer.value = sleep_state;
509 	in_arg[2].type = ACPI_TYPE_INTEGER;
510 	in_arg[2].integer.value = dev_state;
511 	status = acpi_evaluate_object(dev->handle, "_DSW", &arg_list, NULL);
512 	if (ACPI_SUCCESS(status)) {
513 		return 0;
514 	} else if (status != AE_NOT_FOUND) {
515 		printk(KERN_ERR PREFIX "_DSW execution failed\n");
516 		dev->wakeup.flags.valid = 0;
517 		return -ENODEV;
518 	}
519 
520 	/* Execute _PSW */
521 	arg_list.count = 1;
522 	in_arg[0].integer.value = enable;
523 	status = acpi_evaluate_object(dev->handle, "_PSW", &arg_list, NULL);
524 	if (ACPI_FAILURE(status) && (status != AE_NOT_FOUND)) {
525 		printk(KERN_ERR PREFIX "_PSW execution failed\n");
526 		dev->wakeup.flags.valid = 0;
527 		return -ENODEV;
528 	}
529 
530 	return 0;
531 }
532 
533 /*
534  * Prepare a wakeup device, two steps (Ref ACPI 2.0:P229):
535  * 1. Power on the power resources required for the wakeup device
536  * 2. Execute _DSW (Device Sleep Wake) or (deprecated in ACPI 3.0) _PSW (Power
537  *    State Wake) for the device, if present
538  */
539 int acpi_enable_wakeup_device_power(struct acpi_device *dev, int sleep_state)
540 {
541 	int i, err = 0;
542 
543 	if (!dev || !dev->wakeup.flags.valid)
544 		return -EINVAL;
545 
546 	mutex_lock(&acpi_device_lock);
547 
548 	if (dev->wakeup.prepare_count++)
549 		goto out;
550 
551 	/* Open power resource */
552 	for (i = 0; i < dev->wakeup.resources.count; i++) {
553 		int ret = acpi_power_on(dev->wakeup.resources.handles[i]);
554 		if (ret) {
555 			printk(KERN_ERR PREFIX "Transition power state\n");
556 			dev->wakeup.flags.valid = 0;
557 			err = -ENODEV;
558 			goto err_out;
559 		}
560 	}
561 
562 	/*
563 	 * Passing 3 as the third argument below means the device may be placed
564 	 * in arbitrary power state afterwards.
565 	 */
566 	err = acpi_device_sleep_wake(dev, 1, sleep_state, 3);
567 
568  err_out:
569 	if (err)
570 		dev->wakeup.prepare_count = 0;
571 
572  out:
573 	mutex_unlock(&acpi_device_lock);
574 	return err;
575 }
576 
577 /*
578  * Shutdown a wakeup device, counterpart of above method
579  * 1. Execute _DSW (Device Sleep Wake) or (deprecated in ACPI 3.0) _PSW (Power
580  *    State Wake) for the device, if present
581  * 2. Shutdown down the power resources
582  */
583 int acpi_disable_wakeup_device_power(struct acpi_device *dev)
584 {
585 	int i, err = 0;
586 
587 	if (!dev || !dev->wakeup.flags.valid)
588 		return -EINVAL;
589 
590 	mutex_lock(&acpi_device_lock);
591 
592 	if (--dev->wakeup.prepare_count > 0)
593 		goto out;
594 
595 	/*
596 	 * Executing the code below even if prepare_count is already zero when
597 	 * the function is called may be useful, for example for initialisation.
598 	 */
599 	if (dev->wakeup.prepare_count < 0)
600 		dev->wakeup.prepare_count = 0;
601 
602 	err = acpi_device_sleep_wake(dev, 0, 0, 0);
603 	if (err)
604 		goto out;
605 
606 	/* Close power resource */
607 	for (i = 0; i < dev->wakeup.resources.count; i++) {
608 		int ret = acpi_power_off(dev->wakeup.resources.handles[i]);
609 		if (ret) {
610 			printk(KERN_ERR PREFIX "Transition power state\n");
611 			dev->wakeup.flags.valid = 0;
612 			err = -ENODEV;
613 			goto out;
614 		}
615 	}
616 
617  out:
618 	mutex_unlock(&acpi_device_lock);
619 	return err;
620 }
621 
622 /* --------------------------------------------------------------------------
623                              Device Power Management
624    -------------------------------------------------------------------------- */
625 
626 int acpi_power_get_inferred_state(struct acpi_device *device, int *state)
627 {
628 	int result = 0;
629 	struct acpi_handle_list *list = NULL;
630 	int list_state = 0;
631 	int i = 0;
632 
633 	if (!device || !state)
634 		return -EINVAL;
635 
636 	/*
637 	 * We know a device's inferred power state when all the resources
638 	 * required for a given D-state are 'on'.
639 	 */
640 	for (i = ACPI_STATE_D0; i <= ACPI_STATE_D3_HOT; i++) {
641 		list = &device->power.states[i].resources;
642 		if (list->count < 1)
643 			continue;
644 
645 		result = acpi_power_get_list_state(list, &list_state);
646 		if (result)
647 			return result;
648 
649 		if (list_state == ACPI_POWER_RESOURCE_STATE_ON) {
650 			*state = i;
651 			return 0;
652 		}
653 	}
654 
655 	*state = ACPI_STATE_D3;
656 	return 0;
657 }
658 
659 int acpi_power_on_resources(struct acpi_device *device, int state)
660 {
661 	if (!device || state < ACPI_STATE_D0 || state > ACPI_STATE_D3)
662 		return -EINVAL;
663 
664 	return acpi_power_on_list(&device->power.states[state].resources);
665 }
666 
667 int acpi_power_transition(struct acpi_device *device, int state)
668 {
669 	int result = 0;
670 
671 	if (!device || (state < ACPI_STATE_D0) || (state > ACPI_STATE_D3_COLD))
672 		return -EINVAL;
673 
674 	if (device->power.state == state)
675 		return 0;
676 
677 	if ((device->power.state < ACPI_STATE_D0)
678 	    || (device->power.state > ACPI_STATE_D3_COLD))
679 		return -ENODEV;
680 
681 	/* TBD: Resources must be ordered. */
682 
683 	/*
684 	 * First we reference all power resources required in the target list
685 	 * (e.g. so the device doesn't lose power while transitioning).  Then,
686 	 * we dereference all power resources used in the current list.
687 	 */
688 	if (state < ACPI_STATE_D3_COLD)
689 		result = acpi_power_on_list(
690 			&device->power.states[state].resources);
691 
692 	if (!result && device->power.state < ACPI_STATE_D3_COLD)
693 		acpi_power_off_list(
694 			&device->power.states[device->power.state].resources);
695 
696 	/* We shouldn't change the state unless the above operations succeed. */
697 	device->power.state = result ? ACPI_STATE_UNKNOWN : state;
698 
699 	return result;
700 }
701 
702 /* --------------------------------------------------------------------------
703                                 Driver Interface
704    -------------------------------------------------------------------------- */
705 
706 static int acpi_power_add(struct acpi_device *device)
707 {
708 	int result = 0, state;
709 	acpi_status status = AE_OK;
710 	struct acpi_power_resource *resource = NULL;
711 	union acpi_object acpi_object;
712 	struct acpi_buffer buffer = { sizeof(acpi_object), &acpi_object };
713 
714 
715 	if (!device)
716 		return -EINVAL;
717 
718 	resource = kzalloc(sizeof(struct acpi_power_resource), GFP_KERNEL);
719 	if (!resource)
720 		return -ENOMEM;
721 
722 	resource->device = device;
723 	mutex_init(&resource->resource_lock);
724 	strcpy(resource->name, device->pnp.bus_id);
725 	strcpy(acpi_device_name(device), ACPI_POWER_DEVICE_NAME);
726 	strcpy(acpi_device_class(device), ACPI_POWER_CLASS);
727 	device->driver_data = resource;
728 
729 	/* Evalute the object to get the system level and resource order. */
730 	status = acpi_evaluate_object(device->handle, NULL, NULL, &buffer);
731 	if (ACPI_FAILURE(status)) {
732 		result = -ENODEV;
733 		goto end;
734 	}
735 	resource->system_level = acpi_object.power_resource.system_level;
736 	resource->order = acpi_object.power_resource.resource_order;
737 
738 	result = acpi_power_get_state(device->handle, &state);
739 	if (result)
740 		goto end;
741 
742 	switch (state) {
743 	case ACPI_POWER_RESOURCE_STATE_ON:
744 		device->power.state = ACPI_STATE_D0;
745 		break;
746 	case ACPI_POWER_RESOURCE_STATE_OFF:
747 		device->power.state = ACPI_STATE_D3;
748 		break;
749 	default:
750 		device->power.state = ACPI_STATE_UNKNOWN;
751 		break;
752 	}
753 
754 	printk(KERN_INFO PREFIX "%s [%s] (%s)\n", acpi_device_name(device),
755 	       acpi_device_bid(device), state ? "on" : "off");
756 
757       end:
758 	if (result)
759 		kfree(resource);
760 
761 	return result;
762 }
763 
764 static int acpi_power_remove(struct acpi_device *device, int type)
765 {
766 	struct acpi_power_resource *resource;
767 
768 	if (!device)
769 		return -EINVAL;
770 
771 	resource = acpi_driver_data(device);
772 	if (!resource)
773 		return -EINVAL;
774 
775 	kfree(resource);
776 
777 	return 0;
778 }
779 
780 #ifdef CONFIG_PM_SLEEP
781 static int acpi_power_resume(struct device *dev)
782 {
783 	int result = 0, state;
784 	struct acpi_device *device;
785 	struct acpi_power_resource *resource;
786 
787 	if (!dev)
788 		return -EINVAL;
789 
790 	device = to_acpi_device(dev);
791 	resource = acpi_driver_data(device);
792 	if (!resource)
793 		return -EINVAL;
794 
795 	mutex_lock(&resource->resource_lock);
796 
797 	result = acpi_power_get_state(device->handle, &state);
798 	if (result)
799 		goto unlock;
800 
801 	if (state == ACPI_POWER_RESOURCE_STATE_OFF && resource->ref_count)
802 		result = __acpi_power_on(resource);
803 
804  unlock:
805 	mutex_unlock(&resource->resource_lock);
806 
807 	return result;
808 }
809 #endif
810 
811 int __init acpi_power_init(void)
812 {
813 	INIT_LIST_HEAD(&acpi_power_resource_list);
814 	return acpi_bus_register_driver(&acpi_power_driver);
815 }
816