static int vrtc_mrst_rpmsg_probe(struct rpmsg_channel *rpdev)
{
	int ret;

	if (rpdev == NULL) {
		pr_err("vrtc_mrst rpmsg channel not created\n");
		ret = -ENODEV;
		goto out;
	}

	dev_info(&rpdev->dev, "Probed vrtc_mrst rpmsg device\n");

	/* Allocate rpmsg instance for fw_update*/
	ret = alloc_rpmsg_instance(rpdev, &vrtc_mrst_instance);
	if (!vrtc_mrst_instance) {
		dev_err(&rpdev->dev, "kzalloc vrtc_mrst instance failed\n");
		goto out;
	}

	/* Initialize rpmsg instance */
	init_rpmsg_instance(vrtc_mrst_instance);

	ret = vrtc_mrst_init();
	if (ret)
		free_rpmsg_instance(rpdev, &vrtc_mrst_instance);

out:
	return ret;
}
static void mip_rpmsg_remove(struct rpmsg_channel *rpdev)
{
	scu_mip_exit();
	iounmap(intel_mip_base);
	free_rpmsg_instance(rpdev, &mip_instance);
	sysfs_remove_group(scu_mip_kobj, &mip_attr_group);
	kobject_put(scu_mip_kobj);
	dev_info(&rpdev->dev, "Removed mip rpmsg device\n");
}
static int mip_rpmsg_probe(struct rpmsg_channel *rpdev)
{
	int ret = 0;

	if (rpdev == NULL) {
		pr_err("rpmsg channel not created\n");
		ret = -ENODEV;
		goto out;
	}

	dev_info(&rpdev->dev, "Probed mip rpmsg device\n");

	/* Allocate rpmsg instance for mip*/
	ret = alloc_rpmsg_instance(rpdev, &mip_instance);
	if (!mip_instance) {
		dev_err(&rpdev->dev, "kzalloc mip instance failed\n");
		goto out;
	}
	/* Initialize rpmsg instance */
	init_rpmsg_instance(mip_instance);

	/* Init mip base */
	intel_mip_base = ioremap_nocache(IPC_MIP_BASE, IPC_MIP_MAX_ADDR);
	if (!intel_mip_base) {
		ret = -ENOMEM;
		goto rpmsg_err;
	}

	/* Create debugfs for mip regs */
	scu_mip_kobj = kobject_create_and_add(mip_attr_group.name,
						kernel_kobj);

	if (!scu_mip_kobj) {
		ret = -ENOMEM;
		goto mip_base_err;
	}

	ret = sysfs_create_group(scu_mip_kobj, &mip_attr_group);

	if (ret) {
		kobject_put(scu_mip_kobj);
		goto mip_base_err;
	}

	ret = scu_mip_init();
	goto out;
mip_base_err:
	iounmap(intel_mip_base);
rpmsg_err:
	free_rpmsg_instance(rpdev, &mip_instance);
out:
	return ret;
}
static void rpmsg_ipc_remove(struct rpmsg_channel *rpdev)
{
	int i;
	struct rpmsg_device_data *ddata = rpmsg_ddata;

	for (i = RPMSG_IPC_COMMAND; i < RPMSG_IPC_COMMAND_TYPE_NUM; i++) {
		if (!strncmp(rpdev->id.name, ddata[i].name, RPMSG_NAME_SIZE)) {
			free_rpmsg_instance(rpdev, &ddata[i].rpmsg_instance);
			break;
		}
	}
	dev_info(&rpdev->dev, "Removed rpmsg_ipc device\n");
}
static void vrtc_mrst_rpmsg_remove(struct rpmsg_channel *rpdev)
{
	vrtc_mrst_exit();
	free_rpmsg_instance(rpdev, &vrtc_mrst_instance);
	dev_info(&rpdev->dev, "Removed vrtc_mrst rpmsg device\n");
}