823bccfc40
We need to work on cleaning up the relationship between kobjects, ksets and ktypes. The removal of 'struct subsystem' is the first step of this, especially as it is not really needed at all. Thanks to Kay for fixing the bugs in this patch. Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
51 lines
1.2 KiB
C
51 lines
1.2 KiB
C
/*
|
|
* shutdown.c - power management functions for the device tree.
|
|
*
|
|
* Copyright (c) 2002-3 Patrick Mochel
|
|
* 2002-3 Open Source Development Lab
|
|
*
|
|
* This file is released under the GPLv2
|
|
*
|
|
*/
|
|
|
|
#include <linux/device.h>
|
|
#include <asm/semaphore.h>
|
|
|
|
#include "../base.h"
|
|
#include "power.h"
|
|
|
|
#define to_dev(node) container_of(node, struct device, kobj.entry)
|
|
|
|
|
|
/**
|
|
* We handle system devices differently - we suspend and shut them
|
|
* down last and resume them first. That way, we don't do anything stupid like
|
|
* shutting down the interrupt controller before any devices..
|
|
*
|
|
* Note that there are not different stages for power management calls -
|
|
* they only get one called once when interrupts are disabled.
|
|
*/
|
|
|
|
|
|
/**
|
|
* device_shutdown - call ->shutdown() on each device to shutdown.
|
|
*/
|
|
void device_shutdown(void)
|
|
{
|
|
struct device * dev, *devn;
|
|
|
|
list_for_each_entry_safe_reverse(dev, devn, &devices_subsys.list,
|
|
kobj.entry) {
|
|
if (dev->bus && dev->bus->shutdown) {
|
|
dev_dbg(dev, "shutdown\n");
|
|
dev->bus->shutdown(dev);
|
|
} else if (dev->driver && dev->driver->shutdown) {
|
|
dev_dbg(dev, "shutdown\n");
|
|
dev->driver->shutdown(dev);
|
|
}
|
|
}
|
|
|
|
sysdev_shutdown();
|
|
}
|
|
|