The async_suspend_noirq, async_suspend_late, async_suspend functions are basically the same. As we have seen:
static void async_xxx(void *data, async_cookie_t cookie) { struct device *dev = (struct device *)data; int error; error = __device_xxx(dev, pm_transition, true); if (error) { dpm_save_failed_dev(dev_name(dev)); pm_dev_err(dev, pm_transition, " async", error); } put_device(dev); } The ASYNC_SUSPEND_FUNC() helper macro can decrease code duplication. Signed-off-by: Yangtao Li <tiny.win...@gmail.com> --- drivers/base/power/main.c | 55 ++++++++++++--------------------------- 1 file changed, 16 insertions(+), 39 deletions(-) diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c index d512bee9d9ca..3882dc5fee9f 100644 --- a/drivers/base/power/main.c +++ b/drivers/base/power/main.c @@ -1348,20 +1348,22 @@ static int __device_suspend_noirq(struct device *dev, pm_message_t state, bool a return error; } -static void async_suspend_noirq(void *data, async_cookie_t cookie) -{ - struct device *dev = (struct device *)data; - int error; - - error = __device_suspend_noirq(dev, pm_transition, true); - if (error) { - dpm_save_failed_dev(dev_name(dev)); - pm_dev_err(dev, pm_transition, " async", error); - } - - put_device(dev); +#define ASYNC_SUSPEND_FUNC(__func, __name) \ +static void __func(void *data, async_cookie_t cookie) \ +{ \ + struct device *dev = (struct device *)data; \ + int error; \ + \ + error = __device_ ## __name(dev, pm_transition, true); \ + if (error) { \ + dpm_save_failed_dev(dev_name(dev)); \ + pm_dev_err(dev, pm_transition, " async", error); \ + } \ + \ + put_device(dev); \ } +ASYNC_SUSPEND_FUNC(async_suspend_noirq, suspend_noirq); DEVICE_SUSPEND_FUNC(device_suspend_noirq, suspend_noirq); void dpm_noirq_begin(void) @@ -1542,19 +1544,7 @@ static int __device_suspend_late(struct device *dev, pm_message_t state, bool as return error; } -static void async_suspend_late(void *data, async_cookie_t cookie) -{ - struct device *dev = (struct device *)data; - int error; - - error = __device_suspend_late(dev, pm_transition, true); - if (error) { - dpm_save_failed_dev(dev_name(dev)); - pm_dev_err(dev, pm_transition, " async", error); - } - put_device(dev); -} - +ASYNC_SUSPEND_FUNC(async_suspend_late, suspend_late); DEVICE_SUSPEND_FUNC(device_suspend_late, suspend_late); /** @@ -1796,20 +1786,7 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async) return error; } -static void async_suspend(void *data, async_cookie_t cookie) -{ - struct device *dev = (struct device *)data; - int error; - - error = __device_suspend(dev, pm_transition, true); - if (error) { - dpm_save_failed_dev(dev_name(dev)); - pm_dev_err(dev, pm_transition, " async", error); - } - - put_device(dev); -} - +ASYNC_SUSPEND_FUNC(async_suspend, suspend); DEVICE_SUSPEND_FUNC(device_suspend, suspend); /** -- 2.17.0