Skip to content

Commit

Permalink
rpmsg: Support drivers without primary endpoint
Browse files Browse the repository at this point in the history
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: Bjorn Andersson <[email protected]>
  • Loading branch information
andersson committed Oct 31, 2016
1 parent e950604 commit bbd1880
Showing 1 changed file with 18 additions and 14 deletions.
32 changes: 18 additions & 14 deletions drivers/rpmsg/rpmsg_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -347,27 +347,30 @@ 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;

strncpy(chinfo.name, rpdev->id.name, RPMSG_NAME_SIZE);
chinfo.src = rpdev->src;
chinfo.dst = RPMSG_ADDR_ANY;
if (rpdrv->callback) {
strncpy(chinfo.name, rpdev->id.name, RPMSG_NAME_SIZE);
chinfo.src = rpdev->src;
chinfo.dst = RPMSG_ADDR_ANY;

ept = rpmsg_create_ept(rpdev, rpdrv->callback, NULL, chinfo);
if (!ept) {
dev_err(dev, "failed to create endpoint\n");
err = -ENOMEM;
goto out;
}
ept = rpmsg_create_ept(rpdev, rpdrv->callback, NULL, chinfo);
if (!ept) {
dev_err(dev, "failed to create endpoint\n");
err = -ENOMEM;
goto out;
}

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

err = rpdrv->probe(rpdev);
if (err) {
dev_err(dev, "%s: failed: %d\n", __func__, err);
rpmsg_destroy_ept(ept);
if (ept)
rpmsg_destroy_ept(ept);
goto out;
}

Expand All @@ -388,7 +391,8 @@ static int rpmsg_dev_remove(struct device *dev)

rpdrv->remove(rpdev);

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

return err;
}
Expand Down

0 comments on commit bbd1880

Please sign in to comment.