// SPDX-License-Identifier: GPL-2.01/*2* drivers/base/power/generic_ops.c - Generic PM callbacks for subsystems3*4* Copyright (c) 2010 Rafael J. Wysocki <[email protected]>, Novell Inc.5*/6#include <linux/pm.h>7#include <linux/pm_runtime.h>8#include <linux/export.h>910#define CALL_PM_OP(dev, op) \11({ \12struct device *_dev = (dev); \13const struct dev_pm_ops *pm = _dev->driver ? _dev->driver->pm : NULL; \14pm && pm->op ? pm->op(_dev) : 0; \15})1617#ifdef CONFIG_PM18/**19* pm_generic_runtime_suspend - Generic runtime suspend callback for subsystems.20* @dev: Device to suspend.21*22* If PM operations are defined for the @dev's driver and they include23* ->runtime_suspend(), execute it and return its error code. Otherwise,24* return 0.25*/26int pm_generic_runtime_suspend(struct device *dev)27{28return CALL_PM_OP(dev, runtime_suspend);29}30EXPORT_SYMBOL_GPL(pm_generic_runtime_suspend);3132/**33* pm_generic_runtime_resume - Generic runtime resume callback for subsystems.34* @dev: Device to resume.35*36* If PM operations are defined for the @dev's driver and they include37* ->runtime_resume(), execute it and return its error code. Otherwise,38* return 0.39*/40int pm_generic_runtime_resume(struct device *dev)41{42return CALL_PM_OP(dev, runtime_resume);43}44EXPORT_SYMBOL_GPL(pm_generic_runtime_resume);45#endif /* CONFIG_PM */4647#ifdef CONFIG_PM_SLEEP48/**49* pm_generic_prepare - Generic routine preparing a device for power transition.50* @dev: Device to prepare.51*52* Prepare a device for a system-wide power transition.53*/54int pm_generic_prepare(struct device *dev)55{56struct device_driver *drv = dev->driver;57int ret = 0;5859if (drv && drv->pm && drv->pm->prepare)60ret = drv->pm->prepare(dev);6162return ret;63}6465/**66* pm_generic_suspend_noirq - Generic suspend_noirq callback for subsystems.67* @dev: Device to suspend.68*/69int pm_generic_suspend_noirq(struct device *dev)70{71return CALL_PM_OP(dev, suspend_noirq);72}73EXPORT_SYMBOL_GPL(pm_generic_suspend_noirq);7475/**76* pm_generic_suspend_late - Generic suspend_late callback for subsystems.77* @dev: Device to suspend.78*/79int pm_generic_suspend_late(struct device *dev)80{81return CALL_PM_OP(dev, suspend_late);82}83EXPORT_SYMBOL_GPL(pm_generic_suspend_late);8485/**86* pm_generic_suspend - Generic suspend callback for subsystems.87* @dev: Device to suspend.88*/89int pm_generic_suspend(struct device *dev)90{91return CALL_PM_OP(dev, suspend);92}93EXPORT_SYMBOL_GPL(pm_generic_suspend);9495/**96* pm_generic_freeze_noirq - Generic freeze_noirq callback for subsystems.97* @dev: Device to freeze.98*/99int pm_generic_freeze_noirq(struct device *dev)100{101return CALL_PM_OP(dev, freeze_noirq);102}103EXPORT_SYMBOL_GPL(pm_generic_freeze_noirq);104105/**106* pm_generic_freeze - Generic freeze callback for subsystems.107* @dev: Device to freeze.108*/109int pm_generic_freeze(struct device *dev)110{111return CALL_PM_OP(dev, freeze);112}113EXPORT_SYMBOL_GPL(pm_generic_freeze);114115/**116* pm_generic_poweroff_noirq - Generic poweroff_noirq callback for subsystems.117* @dev: Device to handle.118*/119int pm_generic_poweroff_noirq(struct device *dev)120{121return CALL_PM_OP(dev, poweroff_noirq);122}123EXPORT_SYMBOL_GPL(pm_generic_poweroff_noirq);124125/**126* pm_generic_poweroff_late - Generic poweroff_late callback for subsystems.127* @dev: Device to handle.128*/129int pm_generic_poweroff_late(struct device *dev)130{131return CALL_PM_OP(dev, poweroff_late);132}133EXPORT_SYMBOL_GPL(pm_generic_poweroff_late);134135/**136* pm_generic_poweroff - Generic poweroff callback for subsystems.137* @dev: Device to handle.138*/139int pm_generic_poweroff(struct device *dev)140{141return CALL_PM_OP(dev, poweroff);142}143EXPORT_SYMBOL_GPL(pm_generic_poweroff);144145/**146* pm_generic_thaw_noirq - Generic thaw_noirq callback for subsystems.147* @dev: Device to thaw.148*/149int pm_generic_thaw_noirq(struct device *dev)150{151return CALL_PM_OP(dev, thaw_noirq);152}153EXPORT_SYMBOL_GPL(pm_generic_thaw_noirq);154155/**156* pm_generic_thaw - Generic thaw callback for subsystems.157* @dev: Device to thaw.158*/159int pm_generic_thaw(struct device *dev)160{161return CALL_PM_OP(dev, thaw);162}163EXPORT_SYMBOL_GPL(pm_generic_thaw);164165/**166* pm_generic_resume_noirq - Generic resume_noirq callback for subsystems.167* @dev: Device to resume.168*/169int pm_generic_resume_noirq(struct device *dev)170{171return CALL_PM_OP(dev, resume_noirq);172}173EXPORT_SYMBOL_GPL(pm_generic_resume_noirq);174175/**176* pm_generic_resume_early - Generic resume_early callback for subsystems.177* @dev: Device to resume.178*/179int pm_generic_resume_early(struct device *dev)180{181return CALL_PM_OP(dev, resume_early);182}183EXPORT_SYMBOL_GPL(pm_generic_resume_early);184185/**186* pm_generic_resume - Generic resume callback for subsystems.187* @dev: Device to resume.188*/189int pm_generic_resume(struct device *dev)190{191return CALL_PM_OP(dev, resume);192}193EXPORT_SYMBOL_GPL(pm_generic_resume);194195/**196* pm_generic_restore_noirq - Generic restore_noirq callback for subsystems.197* @dev: Device to restore.198*/199int pm_generic_restore_noirq(struct device *dev)200{201return CALL_PM_OP(dev, restore_noirq);202}203EXPORT_SYMBOL_GPL(pm_generic_restore_noirq);204205/**206* pm_generic_restore_early - Generic restore_early callback for subsystems.207* @dev: Device to resume.208*/209int pm_generic_restore_early(struct device *dev)210{211return CALL_PM_OP(dev, restore_early);212}213EXPORT_SYMBOL_GPL(pm_generic_restore_early);214215/**216* pm_generic_restore - Generic restore callback for subsystems.217* @dev: Device to restore.218*/219int pm_generic_restore(struct device *dev)220{221return CALL_PM_OP(dev, restore);222}223EXPORT_SYMBOL_GPL(pm_generic_restore);224225/**226* pm_generic_complete - Generic routine completing a device power transition.227* @dev: Device to handle.228*229* Complete a device power transition during a system-wide power transition.230*/231void pm_generic_complete(struct device *dev)232{233struct device_driver *drv = dev->driver;234235if (drv && drv->pm && drv->pm->complete)236drv->pm->complete(dev);237}238#endif /* CONFIG_PM_SLEEP */239240241