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 --- |