|
@@ -347,27 +347,30 @@ static int rpmsg_dev_probe(struct device *dev)
|
|
struct rpmsg_device *rpdev = to_rpmsg_device(dev);
|
|
struct rpmsg_device *rpdev = to_rpmsg_device(dev);
|
|
struct rpmsg_driver *rpdrv = to_rpmsg_driver(rpdev->dev.driver);
|
|
struct rpmsg_driver *rpdrv = to_rpmsg_driver(rpdev->dev.driver);
|
|
struct rpmsg_channel_info chinfo = {};
|
|
struct rpmsg_channel_info chinfo = {};
|
|
- struct rpmsg_endpoint *ept;
|
|
|
|
|
|
+ struct rpmsg_endpoint *ept = NULL;
|
|
int err;
|
|
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);
|
|
err = rpdrv->probe(rpdev);
|
|
if (err) {
|
|
if (err) {
|
|
dev_err(dev, "%s: failed: %d\n", __func__, err);
|
|
dev_err(dev, "%s: failed: %d\n", __func__, err);
|
|
- rpmsg_destroy_ept(ept);
|
|
|
|
|
|
+ if (ept)
|
|
|
|
+ rpmsg_destroy_ept(ept);
|
|
goto out;
|
|
goto out;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -388,7 +391,8 @@ static int rpmsg_dev_remove(struct device *dev)
|
|
|
|
|
|
rpdrv->remove(rpdev);
|
|
rpdrv->remove(rpdev);
|
|
|
|
|
|
- rpmsg_destroy_ept(rpdev->ept);
|
|
|
|
|
|
+ if (rpdev->ept)
|
|
|
|
+ rpmsg_destroy_ept(rpdev->ept);
|
|
|
|
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|