]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | /* |
2 | * shutdown.c - power management functions for the device tree. | |
3 | * | |
4 | * Copyright (c) 2002-3 Patrick Mochel | |
5 | * 2002-3 Open Source Development Lab | |
6 | * | |
7 | * This file is released under the GPLv2 | |
8 | * | |
9 | */ | |
10 | ||
11 | #include <linux/config.h> | |
12 | #include <linux/device.h> | |
13 | #include <asm/semaphore.h> | |
14 | ||
15 | #include "power.h" | |
16 | ||
17 | #define to_dev(node) container_of(node, struct device, kobj.entry) | |
18 | ||
19 | extern struct subsystem devices_subsys; | |
20 | ||
21 | ||
22 | int device_detach_shutdown(struct device * dev) | |
23 | { | |
24 | if (!dev->detach_state) | |
25 | return 0; | |
26 | ||
27 | if (dev->detach_state == DEVICE_PM_OFF) { | |
28 | if (dev->driver && dev->driver->shutdown) | |
29 | dev->driver->shutdown(dev); | |
30 | return 0; | |
31 | } | |
32 | return dpm_runtime_suspend(dev, dev->detach_state); | |
33 | } | |
34 | ||
35 | ||
36 | /** | |
37 | * We handle system devices differently - we suspend and shut them | |
38 | * down last and resume them first. That way, we don't do anything stupid like | |
39 | * shutting down the interrupt controller before any devices.. | |
40 | * | |
41 | * Note that there are not different stages for power management calls - | |
42 | * they only get one called once when interrupts are disabled. | |
43 | */ | |
44 | ||
45 | extern int sysdev_shutdown(void); | |
46 | ||
47 | /** | |
48 | * device_shutdown - call ->shutdown() on each device to shutdown. | |
49 | */ | |
50 | void device_shutdown(void) | |
51 | { | |
52 | struct device * dev; | |
53 | ||
54 | down_write(&devices_subsys.rwsem); | |
55 | list_for_each_entry_reverse(dev, &devices_subsys.kset.list, kobj.entry) { | |
56 | pr_debug("shutting down %s: ", dev->bus_id); | |
57 | if (dev->driver && dev->driver->shutdown) { | |
58 | pr_debug("Ok\n"); | |
59 | dev->driver->shutdown(dev); | |
60 | } else | |
61 | pr_debug("Ignored.\n"); | |
62 | } | |
63 | up_write(&devices_subsys.rwsem); | |
64 | ||
65 | sysdev_shutdown(); | |
66 | } | |
67 |