Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit eab9a2b7 authored by Meng Wang's avatar Meng Wang
Browse files

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: default avatarMeng Wang <mengw@codeaurora.org>
parent d3070abc
Loading
Loading
Loading
Loading
+10 −52
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@
#include <linux/of.h>
#include <linux/slab.h>
#include <linux/ipc_logging.h>
#include <linux/of_platform.h>
#include <soc/qcom/subsystem_restart.h>
#include <soc/qcom/scm.h>
#include <dsp/apr_audio-v2.h>
@@ -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;
}