Commit 5d38998e authored by Rene Herman's avatar Rene Herman Committed by Linus Torvalds

PNP: do not test PNP_DRIVER_RES_DO_NOT_CHANGE on suspend/resume

The PNP_DRIVER_RES_DO_NOT_CHANGE flag is meant to signify that the PNP core
should not change resources for the device -- not that it shouldn't
disable/enable the device on suspend/resume.

ALSA ISAPnP drivers set PNP_DRIVER_RES_DO_NOT_CHANAGE (0x0001) through
setting PNP_DRIVER_RES_DISABLE (0x0003).  The latter including the former
may in itself be considered rather unexpected but doesn't change that
suspend/resume wouldn't seem to have any business testing the flag.

As reported by Ondrej Zary for snd-cs4236, ALSA driven ISAPnP cards don't
survive swsusp hibernation with the resume skipping setting the resources
due to testing the flag -- the same test in the suspend path isn't enough
to keep hibernation from disabling the card it seems.

These tests were added (in 2005) by Piere Ossman in commit
68094e32, "alsa: Improved PnP suspend
support" who doesn't remember why.  This deletes them.
Signed-off-by: default avatarRene Herman <rene.herman@gmail.com>
Tested-by: default avatarOndrej Zary <linux@rainbow-software.org>
Cc: Bjorn Helgaas <bjorn.helgaas@hp.com>
Cc: Pierre Ossman <drzeus@drzeus.cx>
Cc: Adam Belay <ambx1@neo.rr.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent b3bd86e2
...@@ -161,8 +161,7 @@ static int pnp_bus_suspend(struct device *dev, pm_message_t state) ...@@ -161,8 +161,7 @@ static int pnp_bus_suspend(struct device *dev, pm_message_t state)
return error; return error;
} }
if (!(pnp_drv->flags & PNP_DRIVER_RES_DO_NOT_CHANGE) && if (pnp_can_disable(pnp_dev)) {
pnp_can_disable(pnp_dev)) {
error = pnp_stop_dev(pnp_dev); error = pnp_stop_dev(pnp_dev);
if (error) if (error)
return error; return error;
...@@ -185,14 +184,17 @@ static int pnp_bus_resume(struct device *dev) ...@@ -185,14 +184,17 @@ static int pnp_bus_resume(struct device *dev)
if (pnp_dev->protocol && pnp_dev->protocol->resume) if (pnp_dev->protocol && pnp_dev->protocol->resume)
pnp_dev->protocol->resume(pnp_dev); pnp_dev->protocol->resume(pnp_dev);
if (!(pnp_drv->flags & PNP_DRIVER_RES_DO_NOT_CHANGE)) { if (pnp_can_write(pnp_dev)) {
error = pnp_start_dev(pnp_dev); error = pnp_start_dev(pnp_dev);
if (error) if (error)
return error; return error;
} }
if (pnp_drv->resume) if (pnp_drv->resume) {
return pnp_drv->resume(pnp_dev); error = pnp_drv->resume(pnp_dev);
if (error)
return error;
}
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment