aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Marek <jonathan@marek.ca>2020-05-20 15:50:37 -0400
committerJonathan Marek <jonathan@marek.ca>2020-06-11 23:36:29 -0400
commitd946ac1f002b17da6b34678e0bc3733627c7c2f2 (patch)
treea92b4d4f9682cab566172c1eb45b07c00c90bd31
parent93909221e2334db4c76d0b74a980e856848b778c (diff)
HACK: call of_register_apr_devices in separate thread
Otherwise apr_callback will never be called when trying to probe ADSP drivers which want to talk to the DSP (clock driver). Signed-off-by: Jonathan Marek <jonathan@marek.ca>
-rw-r--r--drivers/soc/qcom/apr.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/drivers/soc/qcom/apr.c b/drivers/soc/qcom/apr.c
index 1f35b097c6356..8164dc8336fac 100644
--- a/drivers/soc/qcom/apr.c
+++ b/drivers/soc/qcom/apr.c
@@ -24,7 +24,9 @@ struct apr {
int dest_domain_id;
struct pdr_handle *pdr;
struct workqueue_struct *rxwq;
+ struct workqueue_struct *initwq;
struct work_struct rx_work;
+ struct work_struct init_work;
struct list_head rx_list;
};
@@ -412,6 +414,13 @@ static void apr_pd_status(int state, char *svc_path, void *priv)
}
}
+static void apr_init_work(struct work_struct *work)
+{
+ struct apr *apr = container_of(work, struct apr, init_work);
+
+ of_register_apr_devices(apr->dev, NULL);
+}
+
static int apr_probe(struct rpmsg_device *rpdev)
{
struct device *dev = &rpdev->dev;
@@ -454,7 +463,12 @@ static int apr_probe(struct rpmsg_device *rpdev)
if (ret)
goto handle_release;
- of_register_apr_devices(dev, NULL);
+ /// XXX
+ apr->initwq = create_singlethread_workqueue("qcom_apr_init");
+ INIT_WORK(&apr->init_work, apr_init_work);
+ queue_work(apr->initwq, &apr->init_work);
+
+ //of_register_apr_devices(dev, NULL);
return 0;