2005-04-16 15:20:36 -07:00
/*
* 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/config.h>
# include <linux/device.h>
# include <asm/semaphore.h>
# include "power.h"
# define to_dev(node) container_of(node, struct device, kobj.entry)
extern struct subsystem devices_subsys ;
/**
* 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 .
*/
extern int sysdev_shutdown ( void ) ;
/**
* device_shutdown - call - > shutdown ( ) on each device to shutdown .
*/
void device_shutdown ( void )
{
2006-01-09 01:04:51 -08:00
struct device * dev , * devn ;
2005-04-16 15:20:36 -07:00
down_write ( & devices_subsys . rwsem ) ;
2006-01-09 01:04:51 -08:00
list_for_each_entry_safe_reverse ( dev , devn , & devices_subsys . kset . list ,
2005-05-09 08:07:00 -07:00
kobj . entry ) {
2006-01-05 14:29:51 +00:00
if ( dev - > bus & & dev - > bus - > shutdown ) {
dev_dbg ( dev , " shutdown \n " ) ;
dev - > bus - > shutdown ( dev ) ;
} else if ( dev - > driver & & dev - > driver - > shutdown ) {
2005-05-09 08:07:00 -07:00
dev_dbg ( dev , " shutdown \n " ) ;
2005-04-16 15:20:36 -07:00
dev - > driver - > shutdown ( dev ) ;
2005-05-09 08:07:00 -07:00
}
2005-04-16 15:20:36 -07:00
}
up_write ( & devices_subsys . rwsem ) ;
sysdev_shutdown ( ) ;
}