diff options
| author | Dominik Brodowski <linux@dominikbrodowski.net> | 2010-03-15 16:43:11 -0400 |
|---|---|---|
| committer | Dominik Brodowski <linux@dominikbrodowski.net> | 2010-03-24 06:00:02 -0400 |
| commit | e7176a37d436a214f6a7727ea7986c654cbee8f0 (patch) | |
| tree | 6efc0a74883b326ff7575a36793120027018195c | |
| parent | 7d7ba8d31eb293016bc91a5c8fc36b21fd917265 (diff) | |
power: support _noirq actions on device types and classes
The new-style dev_pm_ops provide callbacks for both IRQs enabled
and disabled. However, the _noirq variants were only called for
buses registered with a device, not for classes and types.
In order to properly use dev_pm_ops in class pcmcia_socket_class,
support _noirq actions also on classes and types.
Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
Acked-by: Rafael J. Wysocki <rjw@sisk.pl>
| -rw-r--r-- | drivers/base/power/main.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c index d477f4dc5e51..941fcb87e52a 100644 --- a/drivers/base/power/main.c +++ b/drivers/base/power/main.c | |||
| @@ -439,8 +439,23 @@ static int device_resume_noirq(struct device *dev, pm_message_t state) | |||
| 439 | if (dev->bus && dev->bus->pm) { | 439 | if (dev->bus && dev->bus->pm) { |
| 440 | pm_dev_dbg(dev, state, "EARLY "); | 440 | pm_dev_dbg(dev, state, "EARLY "); |
| 441 | error = pm_noirq_op(dev, dev->bus->pm, state); | 441 | error = pm_noirq_op(dev, dev->bus->pm, state); |
| 442 | if (error) | ||
| 443 | goto End; | ||
| 442 | } | 444 | } |
| 443 | 445 | ||
| 446 | if (dev->type && dev->type->pm) { | ||
| 447 | pm_dev_dbg(dev, state, "EARLY type "); | ||
| 448 | error = pm_noirq_op(dev, dev->type->pm, state); | ||
| 449 | if (error) | ||
| 450 | goto End; | ||
| 451 | } | ||
| 452 | |||
| 453 | if (dev->class && dev->class->pm) { | ||
| 454 | pm_dev_dbg(dev, state, "EARLY class "); | ||
| 455 | error = pm_noirq_op(dev, dev->class->pm, state); | ||
| 456 | } | ||
| 457 | |||
| 458 | End: | ||
| 444 | TRACE_RESUME(error); | 459 | TRACE_RESUME(error); |
| 445 | return error; | 460 | return error; |
| 446 | } | 461 | } |
| @@ -735,10 +750,26 @@ static int device_suspend_noirq(struct device *dev, pm_message_t state) | |||
| 735 | { | 750 | { |
| 736 | int error = 0; | 751 | int error = 0; |
| 737 | 752 | ||
| 753 | if (dev->class && dev->class->pm) { | ||
| 754 | pm_dev_dbg(dev, state, "LATE class "); | ||
| 755 | error = pm_noirq_op(dev, dev->class->pm, state); | ||
| 756 | if (error) | ||
| 757 | goto End; | ||
| 758 | } | ||
| 759 | |||
| 760 | if (dev->type && dev->type->pm) { | ||
| 761 | pm_dev_dbg(dev, state, "LATE type "); | ||
| 762 | error = pm_noirq_op(dev, dev->type->pm, state); | ||
| 763 | if (error) | ||
| 764 | goto End; | ||
| 765 | } | ||
| 766 | |||
| 738 | if (dev->bus && dev->bus->pm) { | 767 | if (dev->bus && dev->bus->pm) { |
| 739 | pm_dev_dbg(dev, state, "LATE "); | 768 | pm_dev_dbg(dev, state, "LATE "); |
| 740 | error = pm_noirq_op(dev, dev->bus->pm, state); | 769 | error = pm_noirq_op(dev, dev->bus->pm, state); |
| 741 | } | 770 | } |
| 771 | |||
| 772 | End: | ||
| 742 | return error; | 773 | return error; |
| 743 | } | 774 | } |
| 744 | 775 | ||
