From: Hans de Goede Date: Thu, 24 Nov 2022 10:53:05 +0000 (+0100) Subject: PNP: Do not disable devices on suspend when they cannot be re-enabled on resume X-Git-Tag: v6.2-rc1~188^2^5 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=62a0ec9dc1dfb0f58138f1e2527e4a26567268e5;p=thirdparty%2Fkernel%2Flinux.git PNP: Do not disable devices on suspend when they cannot be re-enabled on resume On an Advantech MICA-071 tablet, with a builtin barcode scanner connected to ttyS0, the following message is shown on suspend: serial 00:02: disabled And after suspend/resume trying to use the barcode scanner / ttyS0 shows: serial 00:02: LSR safety check engaged! Indicating that the UARTs io-ports are no longer reachable. This is caused by __pnp_bus_suspend() calling pnp_stop_dev() on the "00:02" pnp device on suspend (this outputs the disabled message). The problem is that pnp_can_write() returns false for the "00:02" pnp device, so after disabling it (disabling its decoding of IO addresses) during suspend, it cannot be re-enabled. Add a pnp_can_write() check to the suspend path and only disable devices which can actually be re-enabled on resume. This fixes the Advantech MICA-071's ttyS0 no longer working after a suspend/resume. Signed-off-by: Hans de Goede Signed-off-by: Rafael J. Wysocki --- diff --git a/drivers/pnp/driver.c b/drivers/pnp/driver.c index c02e7bf643a6b..46c534f6b1c97 100644 --- a/drivers/pnp/driver.c +++ b/drivers/pnp/driver.c @@ -182,7 +182,8 @@ static int __pnp_bus_suspend(struct device *dev, pm_message_t state) return error; } - if (pnp_can_disable(pnp_dev)) { + /* can_write is necessary to be able to re-start the device on resume */ + if (pnp_can_disable(pnp_dev) && pnp_can_write(pnp_dev)) { error = pnp_stop_dev(pnp_dev); if (error) return error;