summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYixuan Jiang <yixuanjiang@google.com>2021-12-01 03:30:33 +0000
committerYixuan Jiang <yixuanjiang@google.com>2021-12-01 03:39:02 +0000
commit57e638a2ed2b7e4c90d2031ae5864f3e76ee5d86 (patch)
tree879e0df68e61e57d5221fc115a5491b6cd764c6c
parent115d998232e9d8846b2a45ddf2c2c95ac6e1fd15 (diff)
downloadaoc-57e638a2ed2b7e4c90d2031ae5864f3e76ee5d86.tar.gz
Revert "aoc: fix aoc process crash issue when aoc service off"
This reverts commit 115d998232e9d8846b2a45ddf2c2c95ac6e1fd15. Reason for revert: regression issue b/208505107 Bug: 207988396 Change-Id: Iea8a765a6410670eaf752e1d0f24de85908df153
-rw-r--r--aoc.c25
1 files changed, 5 insertions, 20 deletions
diff --git a/aoc.c b/aoc.c
index d5a4264..081104b 100644
--- a/aoc.c
+++ b/aoc.c
@@ -111,10 +111,6 @@ struct aoc_prvdata {
struct aoc_service_dev **services;
struct work_struct online_work;
-
- struct work_struct process_work;
- int process_offset;
-
struct resource dram_resource;
aoc_map_handler map_handler;
void *map_handler_ctx;
@@ -251,7 +247,7 @@ static void aoc_take_offline(struct aoc_prvdata *prvdata);
static void signal_aoc(struct mbox_chan *channel);
static void reset_sensor_power(struct aoc_prvdata *prvdata, bool is_init);
-static void aoc_process_services(struct work_struct *work);
+static void aoc_process_services(struct aoc_prvdata *prvdata, int offset);
static irqreturn_t watchdog_int_handler(int irq, void *dev);
static void aoc_watchdog(struct work_struct *work);
@@ -527,8 +523,7 @@ static void aoc_mbox_rx_callback(struct mbox_client *cl, void *mssg)
}
break;
case AOC_STATE_ONLINE:
- prvdata->process_offset = slot->index;
- schedule_work(&prvdata->process_work);
+ aoc_process_services(prvdata, slot->index);
break;
default:
break;
@@ -2222,20 +2217,15 @@ static void aoc_take_offline(struct aoc_prvdata *prvdata)
dev_err(prvdata->dev, "GSA unload firmware failed: %d\n", rc);
}
-static void aoc_process_services(struct work_struct *work)
+static void aoc_process_services(struct aoc_prvdata *prvdata, int offset)
{
- struct aoc_prvdata *prvdata =
- container_of(work, struct aoc_prvdata, process_work);
-
struct aoc_service_dev *service_dev;
- int offset = prvdata->process_offset;
aoc_service *service;
int services;
int i;
- mutex_lock(&aoc_service_lock);
if (aoc_state != AOC_STATE_ONLINE)
- goto exit;
+ return;
services = aoc_num_services();
for (i = 0; i < services; i++) {
@@ -2256,8 +2246,6 @@ static void aoc_process_services(struct work_struct *work)
wake_up(&service_dev->write_queue);
}
}
-exit:
- mutex_unlock(&aoc_service_lock);
}
void aoc_set_map_handler(struct aoc_service_dev *dev, aoc_map_handler handler,
@@ -2345,8 +2333,7 @@ static irqreturn_t aoc_int_handler(int irq, void *dev)
schedule_work(&aoc_online_work);
}
} else if (aoc_state == AOC_STATE_ONLINE) {
- prvdata->process_offset = 0;
- schedule_work(&prvdata->process_work);
+ aoc_process_services(dev_get_drvdata(dev), 0);
}
return IRQ_HANDLED;
@@ -3115,8 +3102,6 @@ static int aoc_platform_probe(struct platform_device *pdev)
INIT_WORK(&prvdata->online_work, aoc_did_become_online);
- INIT_WORK(&prvdata->process_work, aoc_process_services);
-
INIT_DELAYED_WORK(&prvdata->monitor_work, aoc_monitor_online);
aoc_configure_interrupt();