From eab9a2b762288029deb49da9c05f507336d9ddec Mon Sep 17 00:00:00 2001 From: Meng Wang Date: Wed, 2 May 2018 14:55:53 +0800 Subject: [PATCH] ipc: apr: use of_platform_populate to add child node of apr Use of_platform_populate to add child node of apr. Change-Id: I9f0ded5e39deaf37c79ecda4d960d64c9c14eec9 Signed-off-by: Meng Wang --- ipc/apr.c | 62 +++++++++---------------------------------------------- 1 file changed, 10 insertions(+), 52 deletions(-) diff --git a/ipc/apr.c b/ipc/apr.c index 3f07f6e87b6c..a8ff3631ee48 100644 --- a/ipc/apr.c +++ b/ipc/apr.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -62,8 +63,6 @@ struct apr_private { spinlock_t apr_lock; bool is_initial_boot; struct work_struct add_chld_dev_work; - spinlock_t apr_chld_lock; - struct list_head apr_chlds; }; static struct apr_private *apr_priv; @@ -290,7 +289,7 @@ enum apr_subsys_state apr_cmpxchg_q6_state(enum apr_subsys_state prev, static void apr_adsp_down(unsigned long opcode) { - pr_debug("%s: Q6 is Down\n", __func__); + pr_info("%s: Q6 is Down\n", __func__); apr_set_q6_state(APR_SUBSYS_DOWN); dispatch_event(opcode, APR_DEST_QDSP6); } @@ -298,49 +297,17 @@ static void apr_adsp_down(unsigned long opcode) static void apr_add_child_devices(struct work_struct *work) { int ret; - struct device_node *node; - struct platform_device *pdev; - struct apr_chld_device *apr_chld_dev; - for_each_child_of_node(apr_priv->dev->of_node, node) { - apr_chld_dev = kzalloc(sizeof(*apr_chld_dev), GFP_KERNEL); - if (!apr_chld_dev) - continue; - pdev = platform_device_alloc(node->name, -1); - if (!pdev) { - dev_err(apr_priv->dev, - "%s: pdev memory alloc failed for %s\n", - __func__, node->name); - kfree(apr_chld_dev); - continue; - } - pdev->dev.parent = apr_priv->dev; - pdev->dev.of_node = node; - - ret = platform_device_add(pdev); - if (ret) { - dev_err(apr_priv->dev, - "%s: Cannot add platform device %s\n", - __func__, node->name); - platform_device_put(pdev); - kfree(apr_chld_dev); - continue; - } - - apr_chld_dev->pdev = pdev; - - spin_lock(&apr_priv->apr_chld_lock); - list_add_tail(&apr_chld_dev->node, &apr_priv->apr_chlds); - spin_unlock(&apr_priv->apr_chld_lock); - - dev_dbg(apr_priv->dev, "%s: Added APR child dev: %s\n", - __func__, dev_name(&pdev->dev)); - } + ret = of_platform_populate(apr_priv->dev->of_node, + NULL, NULL, apr_priv->dev); + if (ret) + dev_err(apr_priv->dev, "%s: failed to add child nodes, ret=%d\n", + __func__, ret); } static void apr_adsp_up(void) { - pr_debug("%s: Q6 is Up\n", __func__); + pr_info("%s: Q6 is Up\n", __func__); if (apr_cmpxchg_q6_state(APR_SUBSYS_DOWN, APR_SUBSYS_LOADED) == APR_SUBSYS_DOWN) wake_up(&dsp_wait); @@ -1165,6 +1132,7 @@ static void apr_cleanup(void) { int i, j, k; + of_platform_depopulate(apr_priv->dev); subsys_notif_deregister("apr_modem"); subsys_notif_deregister("apr_adsp"); if (apr_reset_workqueue) { @@ -1179,6 +1147,7 @@ static void apr_cleanup(void) mutex_destroy(&client[i][j].svc[k].m_lock); } } + debugfs_remove(debugfs_apr_debug); } static int apr_probe(struct platform_device *pdev) @@ -1194,8 +1163,6 @@ static int apr_probe(struct platform_device *pdev) apr_priv->dev = &pdev->dev; spin_lock_init(&apr_priv->apr_lock); - spin_lock_init(&apr_priv->apr_chld_lock); - INIT_LIST_HEAD(&apr_priv->apr_chlds); INIT_WORK(&apr_priv->add_chld_dev_work, apr_add_child_devices); for (i = 0; i < APR_DEST_MAX; i++) @@ -1233,17 +1200,8 @@ static int apr_probe(struct platform_device *pdev) static int apr_remove(struct platform_device *pdev) { - struct apr_chld_device *chld, *tmp; - apr_cleanup(); apr_tal_exit(); - spin_lock(&apr_priv->apr_chld_lock); - list_for_each_entry_safe(chld, tmp, &apr_priv->apr_chlds, node) { - platform_device_unregister(chld->pdev); - list_del(&chld->node); - kfree(chld); - } - spin_unlock(&apr_priv->apr_chld_lock); apr_priv = NULL; return 0; }