summaryrefslogtreecommitdiff
path: root/aoc.c
diff options
context:
space:
mode:
authorYixuan Jiang <yixuanjiang@google.com>2021-12-01 03:28:11 +0000
committerTreeHugger Robot <treehugger-gerrit@google.com>2021-12-01 04:00:45 +0000
commit8305a211745685bd891b43acad36c65dac6bf530 (patch)
treecaa8cb8d401614ed8ab23d24ddf66dc83a08be4c /aoc.c
parent570ea9354a753bf41c4fb5c1198537c79f0c1d9f (diff)
downloadaoc-8305a211745685bd891b43acad36c65dac6bf530.tar.gz
Revert "aoc: fix aoc process crash issue when aoc service off"
This reverts commit 4fa575068991f45bbe0eb24f3693bd1e2bbd2e7c. Reason for revert: regression on b/208500586 Change-Id: I6ee8ef57744d2e06f5bb34a196c823714ce5c88b
Diffstat (limited to 'aoc.c')
-rw-r--r--aoc.c25
1 files changed, 5 insertions, 20 deletions
diff --git a/aoc.c b/aoc.c
index e8e61fc..90572f7 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);
@@ -526,8 +522,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;
@@ -2221,20 +2216,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++) {
@@ -2255,8 +2245,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,
@@ -2344,8 +2332,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;
@@ -3114,8 +3101,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();