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

Commit 95990aa4 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "soc: qcom: glink_probe: Defer SSR unregister"

parents 6cfa2449 5078b14d
Loading
Loading
Loading
Loading
+27 −7
Original line number Diff line number Diff line
@@ -63,8 +63,23 @@ struct glink_ssr {

	u32 seq_num;
	struct completion completion;
	struct work_struct unreg_work;
};

static void glink_ssr_ssr_unreg_work(struct work_struct *work)
{
	struct glink_ssr *ssr = container_of(work, struct glink_ssr,
						unreg_work);
	struct glink_ssr_nb *nb, *tmp;

	list_for_each_entry_safe(nb, tmp, &ssr->notify_list, list) {
		subsys_notif_unregister_notifier(nb->ssr_register_handle,
						&nb->nb);
		kfree(nb);
	}
	kfree(ssr);
}

static int glink_ssr_ssr_cb(struct notifier_block *this,
			    unsigned long code, void *data)
{
@@ -74,6 +89,9 @@ static int glink_ssr_ssr_cb(struct notifier_block *this,
	struct do_cleanup_msg msg;
	int ret;

	if (!dev || !ssr->ept)
		return NOTIFY_DONE;

	if (code == SUBSYS_AFTER_SHUTDOWN || code == SUBSYS_POWERUP_FAILURE) {
		ssr->seq_num++;
		reinit_completion(&ssr->completion);
@@ -150,7 +168,7 @@ static void glink_ssr_init_notify(struct glink_ssr *ssr)
			    NULL, 0) {
		node = it.node;

		nb = devm_kzalloc(dev, sizeof(*nb), GFP_KERNEL);
		nb = kzalloc(sizeof(*nb), GFP_KERNEL);
		if (!nb) {
			of_node_put(node);
			return;
@@ -166,6 +184,7 @@ static void glink_ssr_init_notify(struct glink_ssr *ssr)
			MSM_SSR_ERR(dev, "no qcom,glink-label for %s\n",
				  nb->ssr_label);
			of_node_put(node);
			kfree(nb);
			continue;
		}

@@ -178,6 +197,7 @@ static void glink_ssr_init_notify(struct glink_ssr *ssr)
			MSM_SSR_ERR(dev, "register fail for %s SSR notifier\n",
				  nb->ssr_label);
			of_node_put(node);
			kfree(nb);
			continue;
		}

@@ -190,12 +210,13 @@ static int glink_ssr_probe(struct rpmsg_device *rpdev)
{
	struct glink_ssr *ssr;

	ssr = devm_kzalloc(&rpdev->dev, sizeof(*ssr), GFP_KERNEL);
	ssr = kzalloc(sizeof(*ssr), GFP_KERNEL);
	if (!ssr)
		return -ENOMEM;

	INIT_LIST_HEAD(&ssr->notify_list);
	init_completion(&ssr->completion);
	INIT_WORK(&ssr->unreg_work, glink_ssr_ssr_unreg_work);

	ssr->dev = &rpdev->dev;
	ssr->ept = rpdev->ept;
@@ -213,14 +234,13 @@ static int glink_ssr_probe(struct rpmsg_device *rpdev)
static void glink_ssr_remove(struct rpmsg_device *rpdev)
{
	struct glink_ssr *ssr = dev_get_drvdata(&rpdev->dev);
	struct glink_ssr_nb *nb;

	list_for_each_entry(nb, &ssr->notify_list, list) {
		subsys_notif_unregister_notifier(nb->ssr_register_handle,
						 &nb->nb);
	}
	ssr->dev = NULL;
	ssr->ept = NULL;

	dev_set_drvdata(&rpdev->dev, NULL);

	schedule_work(&ssr->unreg_work);
}

static const struct rpmsg_device_id glink_ssr_match[] = {