Skip to content

Commit b0b03b8

Browse files
committed
rpmsg: Release rpmsg devices in backends
The rpmsg devices are allocated in the backends and as such must be freed there as well. Signed-off-by: Bjorn Andersson <[email protected]>
1 parent 2ea659a commit b0b03b8

File tree

2 files changed

+20
-0
lines changed

2 files changed

+20
-0
lines changed

drivers/rpmsg/qcom_smd.c

+11
Original file line numberDiff line numberDiff line change
@@ -969,6 +969,14 @@ static const struct rpmsg_endpoint_ops qcom_smd_endpoint_ops = {
969969
.poll = qcom_smd_poll,
970970
};
971971

972+
static void qcom_smd_release_device(struct device *dev)
973+
{
974+
struct rpmsg_device *rpdev = to_rpmsg_device(dev);
975+
struct qcom_smd_device *qsdev = to_smd_device(rpdev);
976+
977+
kfree(qsdev);
978+
}
979+
972980
/*
973981
* Create a smd client device for channel that is being opened.
974982
*/
@@ -998,6 +1006,7 @@ static int qcom_smd_create_device(struct qcom_smd_channel *channel)
9981006

9991007
rpdev->dev.of_node = qcom_smd_match_channel(edge->of_node, channel->name);
10001008
rpdev->dev.parent = &edge->dev;
1009+
rpdev->dev.release = qcom_smd_release_device;
10011010

10021011
return rpmsg_register_device(rpdev);
10031012
}
@@ -1013,6 +1022,8 @@ static int qcom_smd_create_chrdev(struct qcom_smd_edge *edge)
10131022
qsdev->edge = edge;
10141023
qsdev->rpdev.ops = &qcom_smd_device_ops;
10151024
qsdev->rpdev.dev.parent = &edge->dev;
1025+
qsdev->rpdev.dev.release = qcom_smd_release_device;
1026+
10161027
return rpmsg_chrdev_register_device(&qsdev->rpdev);
10171028
}
10181029

drivers/rpmsg/virtio_rpmsg_bus.c

+9
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,14 @@ static const struct rpmsg_device_ops virtio_rpmsg_ops = {
360360
.announce_destroy = virtio_rpmsg_announce_destroy,
361361
};
362362

363+
static void virtio_rpmsg_release_device(struct device *dev)
364+
{
365+
struct rpmsg_device *rpdev = to_rpmsg_device(dev);
366+
struct virtio_rpmsg_channel *vch = to_virtio_rpmsg_channel(rpdev);
367+
368+
kfree(vch);
369+
}
370+
363371
/*
364372
* create an rpmsg channel using its name and address info.
365373
* this function will be used to create both static and dynamic
@@ -408,6 +416,7 @@ static struct rpmsg_device *rpmsg_create_channel(struct virtproc_info *vrp,
408416
strncpy(rpdev->id.name, chinfo->name, RPMSG_NAME_SIZE);
409417

410418
rpdev->dev.parent = &vrp->vdev->dev;
419+
rpdev->dev.release = virtio_rpmsg_release_device;
411420
ret = rpmsg_register_device(rpdev);
412421
if (ret)
413422
return NULL;

0 commit comments

Comments
 (0)