summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Chung <nickchung@google.com>2023-01-18 12:21:59 +0800
committerHolmes Chou <holmeschou@google.com>2023-03-06 06:45:34 +0000
commitfcaadf35d92064949387aa7e26918e5dd48d23d7 (patch)
tree7aa84b6782af95c9f68e47aa3f25d64284bb2261
parent1542c4d7d38b46862dafbd99a9ab187b8b0d2149 (diff)
downloadlwis-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.c48
-rw-r--r--lwis_device_ioreg.c48
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;
}