runtime.c (6e9041c6ddd6cbdc61d87bcaca8ca7bb17c28377) runtime.c (45f0a85c8258741d11bda25c0a5669c06267204a)
1/*
2 * drivers/base/power/runtime.c - Helper functions for device runtime PM
3 *
4 * Copyright (c) 2009 Rafael J. Wysocki <rjw@sisk.pl>, Novell Inc.
5 * Copyright (C) 2010 Alan Stern <stern@rowland.harvard.edu>
6 *
7 * This file is released under the GPLv2.
8 */

--- 279 unchanged lines hidden (view full) ---

288 else if (dev->power.idle_notification)
289 retval = -EINPROGRESS;
290 if (retval)
291 goto out;
292
293 /* Pending requests need to be canceled. */
294 dev->power.request = RPM_REQ_NONE;
295
1/*
2 * drivers/base/power/runtime.c - Helper functions for device runtime PM
3 *
4 * Copyright (c) 2009 Rafael J. Wysocki <rjw@sisk.pl>, Novell Inc.
5 * Copyright (C) 2010 Alan Stern <stern@rowland.harvard.edu>
6 *
7 * This file is released under the GPLv2.
8 */

--- 279 unchanged lines hidden (view full) ---

288 else if (dev->power.idle_notification)
289 retval = -EINPROGRESS;
290 if (retval)
291 goto out;
292
293 /* Pending requests need to be canceled. */
294 dev->power.request = RPM_REQ_NONE;
295
296 if (dev->power.no_callbacks) {
297 /* Assume ->runtime_idle() callback would have suspended. */
298 retval = rpm_suspend(dev, rpmflags);
296 if (dev->power.no_callbacks)
299 goto out;
297 goto out;
300 }
301
302 /* Carry out an asynchronous or a synchronous idle notification. */
303 if (rpmflags & RPM_ASYNC) {
304 dev->power.request = RPM_REQ_IDLE;
305 if (!dev->power.request_pending) {
306 dev->power.request_pending = true;
307 queue_work(pm_wq, &dev->power.work);
308 }
298
299 /* Carry out an asynchronous or a synchronous idle notification. */
300 if (rpmflags & RPM_ASYNC) {
301 dev->power.request = RPM_REQ_IDLE;
302 if (!dev->power.request_pending) {
303 dev->power.request_pending = true;
304 queue_work(pm_wq, &dev->power.work);
305 }
309 goto out;
306 trace_rpm_return_int(dev, _THIS_IP_, 0);
307 return 0;
310 }
311
312 dev->power.idle_notification = true;
313
314 if (dev->pm_domain)
315 callback = dev->pm_domain->ops.runtime_idle;
316 else if (dev->type && dev->type->pm)
317 callback = dev->type->pm->runtime_idle;
318 else if (dev->class && dev->class->pm)
319 callback = dev->class->pm->runtime_idle;
320 else if (dev->bus && dev->bus->pm)
321 callback = dev->bus->pm->runtime_idle;
322 else
323 callback = NULL;
324
325 if (!callback && dev->driver && dev->driver->pm)
326 callback = dev->driver->pm->runtime_idle;
327
328 if (callback)
308 }
309
310 dev->power.idle_notification = true;
311
312 if (dev->pm_domain)
313 callback = dev->pm_domain->ops.runtime_idle;
314 else if (dev->type && dev->type->pm)
315 callback = dev->type->pm->runtime_idle;
316 else if (dev->class && dev->class->pm)
317 callback = dev->class->pm->runtime_idle;
318 else if (dev->bus && dev->bus->pm)
319 callback = dev->bus->pm->runtime_idle;
320 else
321 callback = NULL;
322
323 if (!callback && dev->driver && dev->driver->pm)
324 callback = dev->driver->pm->runtime_idle;
325
326 if (callback)
329 __rpm_callback(callback, dev);
327 retval = __rpm_callback(callback, dev);
330
331 dev->power.idle_notification = false;
332 wake_up_all(&dev->power.wait_queue);
333
334 out:
335 trace_rpm_return_int(dev, _THIS_IP_, retval);
328
329 dev->power.idle_notification = false;
330 wake_up_all(&dev->power.wait_queue);
331
332 out:
333 trace_rpm_return_int(dev, _THIS_IP_, retval);
336 return retval;
334 return retval ? retval : rpm_suspend(dev, rpmflags);
337}
338
339/**
340 * rpm_callback - Run a given runtime PM callback for a given device.
341 * @cb: Runtime PM callback to run.
342 * @dev: Device to run the callback for.
343 */
344static int rpm_callback(int (*cb)(struct device *), struct device *dev)

--- 1060 unchanged lines hidden ---
335}
336
337/**
338 * rpm_callback - Run a given runtime PM callback for a given device.
339 * @cb: Runtime PM callback to run.
340 * @dev: Device to run the callback for.
341 */
342static int rpm_callback(int (*cb)(struct device *), struct device *dev)

--- 1060 unchanged lines hidden ---