Use separate wake sources for dequeuing vs wake events
Bug: 234897999
Signed-off-by: Craig Dooley <dooleyc@google.com>
Change-Id: I15c96c6da6fe1a5a2e0f4ecada1e4416bbe63c2a
diff --git a/aoc_channel_dev.c b/aoc_channel_dev.c
index 5911e1f..d09d6f6 100644
--- a/aoc_channel_dev.c
+++ b/aoc_channel_dev.c
@@ -36,7 +36,8 @@
module_param(sent_msg_count, long, S_IRUGO);
struct chan_prvdata {
- struct wakeup_source *wakelock;
+ struct wakeup_source *queue_wakelock;
+ struct wakeup_source *user_wakelock;
};
struct aocc_device_entry {
@@ -245,9 +246,9 @@
* reading a waking message at the end.
*/
if (take_wake_lock) {
- pm_wakeup_ws_event(service_prvdata->wakelock, 200, true);
+ pm_wakeup_ws_event(service_prvdata->user_wakelock, 200, true);
} else if (aoc_service_can_read(service)) {
- pm_wakeup_ws_event(service_prvdata->wakelock, 10, true);
+ pm_wakeup_ws_event(service_prvdata->queue_wakelock, 10, true);
}
if (!handler_found) {
@@ -773,7 +774,8 @@
return -ENOMEM;
if (strcmp(dev_name(&dev->dev), "usf_sh_mem_doorbell") != 0) {
- prvdata->wakelock = wakeup_source_register(&dev->dev, dev_name(&dev->dev));
+ prvdata->user_wakelock = wakeup_source_register(&dev->dev, dev_name(&dev->dev));
+ prvdata->queue_wakelock = wakeup_source_register(&dev->dev, "usf_queue");
dev->prvdata = prvdata;
ret = create_character_device(dev);
@@ -808,9 +810,14 @@
sh_mem_doorbell_service_dev = NULL;
} else {
prvdata = dev->prvdata;
- if (prvdata->wakelock) {
- wakeup_source_unregister(prvdata->wakelock);
- prvdata->wakelock = NULL;
+ if (prvdata->queue_wakelock) {
+ wakeup_source_unregister(prvdata->queue_wakelock);
+ prvdata->queue_wakelock = NULL;
+ }
+
+ if (prvdata->user_wakelock) {
+ wakeup_source_unregister(prvdata->user_wakelock);
+ prvdata->user_wakelock = NULL;
}
}