static void mtk_rpmsg_stop()

in mtk_rpmsg.c [337:373]


static void mtk_rpmsg_stop(struct rproc_subdev *subdev, bool crashed)
{
	struct mtk_rpmsg_channel_info *info, *next;
	struct mtk_rpmsg_rproc_subdev *mtk_subdev = to_mtk_subdev(subdev);
	struct device *dev = &mtk_subdev->pdev->dev;

	/*
	 * Destroy the name service endpoint here, to avoid new channel being
	 * created after the rpmsg_unregister_device loop below.
	 */
	if (mtk_subdev->ns_ept) {
		mtk_rpmsg_destroy_ept(mtk_subdev->ns_ept);
		mtk_subdev->ns_ept = NULL;
	}

	cancel_work_sync(&mtk_subdev->register_work);

	mutex_lock(&mtk_subdev->channels_lock);
	list_for_each_entry(info, &mtk_subdev->channels, list) {
		if (!info->registered)
			continue;
		if (rpmsg_unregister_device(dev, &info->info)) {
			dev_warn(
				dev,
				"rpmsg_unregister_device failed for %s.%d.%d\n",
				info->info.name, info->info.src,
				info->info.dst);
		}
	}

	list_for_each_entry_safe(info, next,
				 &mtk_subdev->channels, list) {
		list_del(&info->list);
		kfree(info);
	}
	mutex_unlock(&mtk_subdev->channels_lock);
}