diff options
author | Nick Chung <nickchung@google.com> | 2023-01-18 12:21:59 +0800 |
---|---|---|
committer | Holmes Chou <holmeschou@google.com> | 2023-03-06 06:45:34 +0000 |
commit | fcaadf35d92064949387aa7e26918e5dd48d23d7 (patch) | |
tree | 7aa84b6782af95c9f68e47aa3f25d64284bb2261 | |
parent | 1542c4d7d38b46862dafbd99a9ab187b8b0d2149 (diff) | |
download | lwis-fcaadf35d92064949387aa7e26918e5dd48d23d7.tar.gz |
LWIS: Return -EBUSY status on suspend
Returns -EBUSY status if the lwis device was still enabled
on suspend
Bug: 248836763
Test: System suspned mode, GCA.
Change-Id: Ia9fb33ea164f9d7e235d2cad57545531c9ac47d7
Signed-off-by: Nick Chung <nickchung@google.com>
-rw-r--r-- | lwis_device_i2c.c | 48 | ||||
-rw-r--r-- | lwis_device_ioreg.c | 48 |
2 files changed, 6 insertions, 90 deletions
diff --git a/lwis_device_i2c.c b/lwis_device_i2c.c index 02fbaf6..1400d2e 100644 --- a/lwis_device_i2c.c +++ b/lwis_device_i2c.c @@ -304,59 +304,17 @@ error_probe: static int lwis_i2c_device_suspend(struct device *dev) { struct lwis_device *lwis_dev = dev_get_drvdata(dev); - struct lwis_client *lwis_client, *n; - int ret = 0; - - if (lwis_dev->enabled == 0) { - return ret; - } if (lwis_dev->pm_hibernation == 0) { /* TODO(b/265688764): Cleaning up system deep sleep for flash driver. */ return 0; } - /* Send an error event to userspace to handle the system suspend */ - lwis_device_error_event_emit(lwis_dev, LWIS_ERROR_EVENT_ID_SYSTEM_SUSPEND, - /*payload=*/NULL, /*payload_size=*/0); - - list_for_each_entry_safe (lwis_client, n, &lwis_dev->clients, node) { - if (!lwis_client->is_enabled) { - continue; - } - - /* Clear event states for this client */ - lwis_client_event_states_clear(lwis_client); - - /* Flush all periodic io to complete */ - ret = lwis_periodic_io_client_flush(lwis_client); - if (ret) { - dev_err(lwis_dev->dev, - "Failed to wait for in-process periodic io to complete\n"); - } - - /* Flush all pending transactions */ - ret = lwis_transaction_client_flush(lwis_client); - if (ret) { - dev_err(lwis_dev->dev, "Failed to flush pending transactions\n"); - } - - /* Run cleanup transactions. */ - lwis_transaction_client_cleanup(lwis_client); - - lwis_client->is_enabled = false; - } - - mutex_lock(&lwis_dev->client_lock); - ret = lwis_dev_power_down_locked(lwis_dev); - if (ret < 0) { - dev_err(lwis_dev->dev, "Failed to power down device\n"); + if (lwis_dev->enabled != 0) { + dev_warn(lwis_dev->dev, "Can't suspend because %s is in use!\n", lwis_dev->name); + return -EBUSY; } - lwis_device_event_states_clear_locked(lwis_dev); - lwis_dev->enabled = 0; - dev_warn(lwis_dev->dev, "Device disabled when system suspend\n"); - mutex_unlock(&lwis_dev->client_lock); return 0; } diff --git a/lwis_device_ioreg.c b/lwis_device_ioreg.c index c6fa44c..ed98410 100644 --- a/lwis_device_ioreg.c +++ b/lwis_device_ioreg.c @@ -162,54 +162,12 @@ error_probe: static int lwis_ioreg_device_suspend(struct device *dev) { struct lwis_device *lwis_dev = dev_get_drvdata(dev); - struct lwis_client *lwis_client, *n; - int ret = 0; - - if (lwis_dev->enabled == 0) { - return ret; - } - - /* Send an error event to userspace to handle the system suspend */ - lwis_device_error_event_emit(lwis_dev, LWIS_ERROR_EVENT_ID_SYSTEM_SUSPEND, - /*payload=*/NULL, /*payload_size=*/0); - - list_for_each_entry_safe (lwis_client, n, &lwis_dev->clients, node) { - if (!lwis_client->is_enabled) { - continue; - } - - /* Clear event states for this client */ - lwis_client_event_states_clear(lwis_client); - - /* Flush all periodic io to complete */ - ret = lwis_periodic_io_client_flush(lwis_client); - if (ret) { - dev_err(lwis_dev->dev, - "Failed to wait for in-process periodic io to complete\n"); - } - - /* Flush all pending transactions */ - ret = lwis_transaction_client_flush(lwis_client); - if (ret) { - dev_err(lwis_dev->dev, "Failed to flush pending transactions\n"); - } - - /* Run cleanup transactions. */ - lwis_transaction_client_cleanup(lwis_client); - - lwis_client->is_enabled = false; - } - mutex_lock(&lwis_dev->client_lock); - ret = lwis_dev_power_down_locked(lwis_dev); - if (ret < 0) { - dev_err(lwis_dev->dev, "Failed to power down device\n"); + if (lwis_dev->enabled != 0) { + dev_warn(lwis_dev->dev, "Can't suspend because %s is in use!\n", lwis_dev->name); + return -EBUSY; } - lwis_device_event_states_clear_locked(lwis_dev); - lwis_dev->enabled = 0; - dev_warn(lwis_dev->dev, "Device disabled when system suspend\n"); - mutex_unlock(&lwis_dev->client_lock); return 0; } |