diff options
Diffstat (limited to 'drivers/base/power/main.c')
| -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 d477f4dc5e5..941fcb87e52 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)  	if (dev->bus && dev->bus->pm) {  		pm_dev_dbg(dev, state, "EARLY ");  		error = pm_noirq_op(dev, dev->bus->pm, state); +		if (error) +			goto End;  	} +	if (dev->type && dev->type->pm) { +		pm_dev_dbg(dev, state, "EARLY type "); +		error = pm_noirq_op(dev, dev->type->pm, state); +		if (error) +			goto End; +	} + +	if (dev->class && dev->class->pm) { +		pm_dev_dbg(dev, state, "EARLY class "); +		error = pm_noirq_op(dev, dev->class->pm, state); +	} + +End:  	TRACE_RESUME(error);  	return error;  } @@ -735,10 +750,26 @@ static int device_suspend_noirq(struct device *dev, pm_message_t state)  {  	int error = 0; +	if (dev->class && dev->class->pm) { +		pm_dev_dbg(dev, state, "LATE class "); +		error = pm_noirq_op(dev, dev->class->pm, state); +		if (error) +			goto End; +	} + +	if (dev->type && dev->type->pm) { +		pm_dev_dbg(dev, state, "LATE type "); +		error = pm_noirq_op(dev, dev->type->pm, state); +		if (error) +			goto End; +	} +  	if (dev->bus && dev->bus->pm) {  		pm_dev_dbg(dev, state, "LATE ");  		error = pm_noirq_op(dev, dev->bus->pm, state);  	} + +End:  	return error;  }  |