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

Commit bbd18809 authored by Bjorn Andersson's avatar Bjorn Andersson
Browse files

rpmsg: Support drivers without primary endpoint



Some types of rpmsg drivers does not have a primary endpoint to tie
their existence upon, but wishes to create and destroy endpoints
dynamically, e.g. based on user interactions.

Allow rpmsg drivers to omit a driver callback to signal this case and
make the probe path not create a primary endpoint in this case.

Signed-off-by: default avatarBjorn Andersson <bjorn.andersson@linaro.org>
parent e9506047
Loading
Loading
Loading
Loading
+18 −14
Original line number Diff line number Diff line
@@ -347,9 +347,10 @@ static int rpmsg_dev_probe(struct device *dev)
	struct rpmsg_device *rpdev = to_rpmsg_device(dev);
	struct rpmsg_driver *rpdrv = to_rpmsg_driver(rpdev->dev.driver);
	struct rpmsg_channel_info chinfo = {};
	struct rpmsg_endpoint *ept;
	struct rpmsg_endpoint *ept = NULL;
	int err;

	if (rpdrv->callback) {
		strncpy(chinfo.name, rpdev->id.name, RPMSG_NAME_SIZE);
		chinfo.src = rpdev->src;
		chinfo.dst = RPMSG_ADDR_ANY;
@@ -363,10 +364,12 @@ static int rpmsg_dev_probe(struct device *dev)

		rpdev->ept = ept;
		rpdev->src = ept->addr;
	}

	err = rpdrv->probe(rpdev);
	if (err) {
		dev_err(dev, "%s: failed: %d\n", __func__, err);
		if (ept)
			rpmsg_destroy_ept(ept);
		goto out;
	}
@@ -388,6 +391,7 @@ static int rpmsg_dev_remove(struct device *dev)

	rpdrv->remove(rpdev);

	if (rpdev->ept)
		rpmsg_destroy_ept(rpdev->ept);

	return err;