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 | ||
1da177e4 LT |
11 | #include <linux/device.h> |
12 | #include <asm/semaphore.h> | |
13 | ||
f67d115f | 14 | #include "../base.h" |
1da177e4 LT |
15 | #include "power.h" |
16 | ||
17 | #define to_dev(node) container_of(node, struct device, kobj.entry) | |
18 | ||
1da177e4 | 19 | |
1da177e4 LT |
20 | /** |
21 | * We handle system devices differently - we suspend and shut them | |
22 | * down last and resume them first. That way, we don't do anything stupid like | |
23 | * shutting down the interrupt controller before any devices.. | |
24 | * | |
25 | * Note that there are not different stages for power management calls - | |
26 | * they only get one called once when interrupts are disabled. | |
27 | */ | |
28 | ||
1da177e4 LT |
29 | |
30 | /** | |
31 | * device_shutdown - call ->shutdown() on each device to shutdown. | |
32 | */ | |
33 | void device_shutdown(void) | |
34 | { | |
9c08a938 | 35 | struct device * dev, *devn; |
1da177e4 | 36 | |
823bccfc | 37 | list_for_each_entry_safe_reverse(dev, devn, &devices_subsys.list, |
82428b62 | 38 | kobj.entry) { |
594c8281 RK |
39 | if (dev->bus && dev->bus->shutdown) { |
40 | dev_dbg(dev, "shutdown\n"); | |
41 | dev->bus->shutdown(dev); | |
42 | } else if (dev->driver && dev->driver->shutdown) { | |
82428b62 | 43 | dev_dbg(dev, "shutdown\n"); |
1da177e4 | 44 | dev->driver->shutdown(dev); |
82428b62 | 45 | } |
1da177e4 | 46 | } |
1da177e4 LT |
47 | } |
48 |