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

Commit 597151c8 authored by Chris Lew's avatar Chris Lew Committed by Gerrit - the friendly Code Review server
Browse files

rpmsg: glink: Add support for rpmsg glink chrdev



RPMSG provides a char device interface to userspace. Probe the rpmsg
chrdev channel to enable the rpmsg_ctrl device creation on glink
transports.

Change-Id: Ia08c658e36e1aefd9d17a60a372557fae52c1fe1
Signed-off-by: default avatarChris Lew <clew@codeaurora.org>
parent 0f916baa
Loading
Loading
Loading
Loading
+39 −0
Original line number Diff line number Diff line
@@ -133,6 +133,13 @@ enum {
	GLINK_STATE_CLOSING,
};

struct qcom_glink_device {
	struct rpmsg_device rpdev;
	struct qcom_glink *glink;
};

#define to_glink_device(_x) container_of(_x, struct qcom_glink_device, rpdev)

/**
 * struct glink_channel - internal representation of a channel
 * @rpdev:	rpdev reference, only used for primary endpoints
@@ -1340,6 +1347,10 @@ static struct device_node *qcom_glink_match_channel(struct device_node *node,
	return NULL;
}

static const struct rpmsg_device_ops glink_chrdev_ops = {
	.create_ept = qcom_glink_create_ept,
};

static const struct rpmsg_device_ops glink_device_ops = {
	.create_ept = qcom_glink_create_ept,
	.announce_create = qcom_glink_announce_create,
@@ -1548,6 +1559,30 @@ static void qcom_glink_work(struct work_struct *work)
	}
}

static void qcom_glink_device_release(struct device *dev)
{
	struct rpmsg_device *rpdev = to_rpmsg_device(dev);
	struct qcom_glink_device *gdev = to_glink_device(rpdev);

	kfree(gdev);
}

static int qcom_glink_create_chrdev(struct qcom_glink *glink)
{
	struct qcom_glink_device *gdev;

	gdev = kzalloc(sizeof(*gdev), GFP_KERNEL);
	if (!gdev)
		return -ENOMEM;

	gdev->glink = glink;
	gdev->rpdev.ops = &glink_chrdev_ops;
	gdev->rpdev.dev.parent = glink->dev;
	gdev->rpdev.dev.release = qcom_glink_device_release;

	return rpmsg_chrdev_register_device(&gdev->rpdev);
}

struct qcom_glink *qcom_glink_native_probe(struct device *dev,
					   unsigned long features,
					   struct qcom_glink_pipe *rx,
@@ -1606,6 +1641,10 @@ struct qcom_glink *qcom_glink_native_probe(struct device *dev,
	if (ret)
		return ERR_PTR(ret);

	ret = qcom_glink_create_chrdev(glink);
	if (ret)
		dev_err(glink->dev, "failed to register chrdev\n");

	return glink;
}
EXPORT_SYMBOL_GPL(qcom_glink_native_probe);