diff options
author | Jonathan Marek <jonathan@marek.ca> | 2020-05-20 15:50:37 -0400 |
---|---|---|
committer | Jonathan Marek <jonathan@marek.ca> | 2020-06-11 23:36:29 -0400 |
commit | d946ac1f002b17da6b34678e0bc3733627c7c2f2 (patch) | |
tree | a92b4d4f9682cab566172c1eb45b07c00c90bd31 | |
parent | 93909221e2334db4c76d0b74a980e856848b778c (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.c | 16 |
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; |