diff options
Diffstat (limited to 'drivers/base/sys.c')
| -rw-r--r-- | drivers/base/sys.c | 202 | 
1 files changed, 2 insertions, 200 deletions
| diff --git a/drivers/base/sys.c b/drivers/base/sys.c index acde9b5ee131..9dff77bfe1e3 100644 --- a/drivers/base/sys.c +++ b/drivers/base/sys.c @@ -328,203 +328,8 @@ void sysdev_unregister(struct sys_device *sysdev)  	kobject_put(&sysdev->kobj);  } - -#ifndef CONFIG_ARCH_NO_SYSDEV_OPS -/** - *	sysdev_shutdown - Shut down all system devices. - * - *	Loop over each class of system devices, and the devices in each - *	of those classes. For each device, we call the shutdown method for - *	each driver registered for the device - the auxiliaries, - *	and the class driver. - * - *	Note: The list is iterated in reverse order, so that we shut down - *	child devices before we shut down their parents. The list ordering - *	is guaranteed by virtue of the fact that child devices are registered - *	after their parents. - */ -void sysdev_shutdown(void) -{ -	struct sysdev_class *cls; - -	pr_debug("Shutting Down System Devices\n"); - -	mutex_lock(&sysdev_drivers_lock); -	list_for_each_entry_reverse(cls, &system_kset->list, kset.kobj.entry) { -		struct sys_device *sysdev; - -		pr_debug("Shutting down type '%s':\n", -			 kobject_name(&cls->kset.kobj)); - -		list_for_each_entry(sysdev, &cls->kset.list, kobj.entry) { -			struct sysdev_driver *drv; -			pr_debug(" %s\n", kobject_name(&sysdev->kobj)); - -			/* Call auxiliary drivers first */ -			list_for_each_entry(drv, &cls->drivers, entry) { -				if (drv->shutdown) -					drv->shutdown(sysdev); -			} - -			/* Now call the generic one */ -			if (cls->shutdown) -				cls->shutdown(sysdev); -		} -	} -	mutex_unlock(&sysdev_drivers_lock); -} - -static void __sysdev_resume(struct sys_device *dev) -{ -	struct sysdev_class *cls = dev->cls; -	struct sysdev_driver *drv; - -	/* First, call the class-specific one */ -	if (cls->resume) -		cls->resume(dev); -	WARN_ONCE(!irqs_disabled(), -		"Interrupts enabled after %pF\n", cls->resume); - -	/* Call auxiliary drivers next. */ -	list_for_each_entry(drv, &cls->drivers, entry) { -		if (drv->resume) -			drv->resume(dev); -		WARN_ONCE(!irqs_disabled(), -			"Interrupts enabled after %pF\n", drv->resume); -	} -} - -/** - *	sysdev_suspend - Suspend all system devices. - *	@state:		Power state to enter. - * - *	We perform an almost identical operation as sysdev_shutdown() - *	above, though calling ->suspend() instead. Interrupts are disabled - *	when this called. Devices are responsible for both saving state and - *	quiescing or powering down the device. - * - *	This is only called by the device PM core, so we let them handle - *	all synchronization. - */ -int sysdev_suspend(pm_message_t state) -{ -	struct sysdev_class *cls; -	struct sys_device *sysdev, *err_dev; -	struct sysdev_driver *drv, *err_drv; -	int ret; - -	pr_debug("Checking wake-up interrupts\n"); - -	/* Return error code if there are any wake-up interrupts pending */ -	ret = check_wakeup_irqs(); -	if (ret) -		return ret; - -	WARN_ONCE(!irqs_disabled(), -		"Interrupts enabled while suspending system devices\n"); - -	pr_debug("Suspending System Devices\n"); - -	list_for_each_entry_reverse(cls, &system_kset->list, kset.kobj.entry) { -		pr_debug("Suspending type '%s':\n", -			 kobject_name(&cls->kset.kobj)); - -		list_for_each_entry(sysdev, &cls->kset.list, kobj.entry) { -			pr_debug(" %s\n", kobject_name(&sysdev->kobj)); - -			/* Call auxiliary drivers first */ -			list_for_each_entry(drv, &cls->drivers, entry) { -				if (drv->suspend) { -					ret = drv->suspend(sysdev, state); -					if (ret) -						goto aux_driver; -				} -				WARN_ONCE(!irqs_disabled(), -					"Interrupts enabled after %pF\n", -					drv->suspend); -			} - -			/* Now call the generic one */ -			if (cls->suspend) { -				ret = cls->suspend(sysdev, state); -				if (ret) -					goto cls_driver; -				WARN_ONCE(!irqs_disabled(), -					"Interrupts enabled after %pF\n", -					cls->suspend); -			} -		} -	} -	return 0; -	/* resume current sysdev */ -cls_driver: -	drv = NULL; -	printk(KERN_ERR "Class suspend failed for %s: %d\n", -		kobject_name(&sysdev->kobj), ret); - -aux_driver: -	if (drv) -		printk(KERN_ERR "Class driver suspend failed for %s: %d\n", -				kobject_name(&sysdev->kobj), ret); -	list_for_each_entry(err_drv, &cls->drivers, entry) { -		if (err_drv == drv) -			break; -		if (err_drv->resume) -			err_drv->resume(sysdev); -	} - -	/* resume other sysdevs in current class */ -	list_for_each_entry(err_dev, &cls->kset.list, kobj.entry) { -		if (err_dev == sysdev) -			break; -		pr_debug(" %s\n", kobject_name(&err_dev->kobj)); -		__sysdev_resume(err_dev); -	} - -	/* resume other classes */ -	list_for_each_entry_continue(cls, &system_kset->list, kset.kobj.entry) { -		list_for_each_entry(err_dev, &cls->kset.list, kobj.entry) { -			pr_debug(" %s\n", kobject_name(&err_dev->kobj)); -			__sysdev_resume(err_dev); -		} -	} -	return ret; -} -EXPORT_SYMBOL_GPL(sysdev_suspend); - -/** - *	sysdev_resume - Bring system devices back to life. - * - *	Similar to sysdev_suspend(), but we iterate the list forwards - *	to guarantee that parent devices are resumed before their children. - * - *	Note: Interrupts are disabled when called. - */ -int sysdev_resume(void) -{ -	struct sysdev_class *cls; - -	WARN_ONCE(!irqs_disabled(), -		"Interrupts enabled while resuming system devices\n"); - -	pr_debug("Resuming System Devices\n"); - -	list_for_each_entry(cls, &system_kset->list, kset.kobj.entry) { -		struct sys_device *sysdev; - -		pr_debug("Resuming type '%s':\n", -			 kobject_name(&cls->kset.kobj)); - -		list_for_each_entry(sysdev, &cls->kset.list, kobj.entry) { -			pr_debug(" %s\n", kobject_name(&sysdev->kobj)); - -			__sysdev_resume(sysdev); -		} -	} -	return 0; -} -EXPORT_SYMBOL_GPL(sysdev_resume); -#endif /* CONFIG_ARCH_NO_SYSDEV_OPS */ +EXPORT_SYMBOL_GPL(sysdev_register); +EXPORT_SYMBOL_GPL(sysdev_unregister);  int __init system_bus_init(void)  { @@ -534,9 +339,6 @@ int __init system_bus_init(void)  	return 0;  } -EXPORT_SYMBOL_GPL(sysdev_register); -EXPORT_SYMBOL_GPL(sysdev_unregister); -  #define to_ext_attr(x) container_of(x, struct sysdev_ext_attribute, attr)  ssize_t sysdev_store_ulong(struct sys_device *sysdev, |