summaryrefslogtreecommitdiff
path: root/drivers/firmware/arm_scmi/driver.c
diff options
context:
space:
mode:
authorCristian Marussi <cristian.marussi@arm.com>2022-12-22 18:50:47 +0000
committerSudeep Holla <sudeep.holla@arm.com>2023-01-19 09:49:54 +0000
commit2c3e674465e73e2f7eb52c39dc5c5e97e78e68ea (patch)
tree7a795053d0208a3685c61071ccf51a41accc0907 /drivers/firmware/arm_scmi/driver.c
parent971fc0665f1361f23251e4d85fac4aed1b683505 (diff)
downloadlinux-next-2c3e674465e73e2f7eb52c39dc5c5e97e78e68ea.tar.gz
firmware: arm_scmi: Refactor device create/destroy helpers
Refactor SCMI device create/destroy helpers: it is now possible to ask for the creation of all the currently requested devices for a whole protocol, not only for the creation of a single well-defined device. While at that, re-instate uniqueness checks on the creation of SCMI SystemPower devices. Signed-off-by: Cristian Marussi <cristian.marussi@arm.com> Link: https://lore.kernel.org/r/20221222185049.737625-8-cristian.marussi@arm.com Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
Diffstat (limited to 'drivers/firmware/arm_scmi/driver.c')
-rw-r--r--drivers/firmware/arm_scmi/driver.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c
index 8591b2c740c6..83a43a5f7bb4 100644
--- a/drivers/firmware/arm_scmi/driver.c
+++ b/drivers/firmware/arm_scmi/driver.c
@@ -2091,6 +2091,8 @@ static int scmi_chan_setup(struct scmi_info *info, struct device_node *of_node,
/* Create a uniquely named, dedicated transport device for this chan */
tdev = scmi_device_create(of_node, info->dev, prot_id, name);
if (!tdev) {
+ dev_err(info->dev,
+ "failed to create transport device (%s)\n", name);
devm_kfree(info->dev, cinfo);
return -EINVAL;
}
@@ -2100,7 +2102,7 @@ static int scmi_chan_setup(struct scmi_info *info, struct device_node *of_node,
ret = info->desc->ops->chan_setup(cinfo, info->dev, tx);
if (ret) {
of_node_put(of_node);
- scmi_device_destroy(tdev);
+ scmi_device_destroy(info->dev, prot_id, name);
devm_kfree(info->dev, cinfo);
return ret;
}
@@ -2123,7 +2125,7 @@ idr_alloc:
/* Destroy channel and device only if created by this call. */
if (tdev) {
of_node_put(of_node);
- scmi_device_destroy(tdev);
+ scmi_device_destroy(info->dev, prot_id, name);
devm_kfree(info->dev, cinfo);
}
return ret;
@@ -2202,10 +2204,11 @@ static int scmi_chan_destroy(int id, void *p, void *idr)
struct scmi_chan_info *cinfo = p;
if (cinfo->dev) {
+ struct scmi_info *info = handle_to_scmi_info(cinfo->handle);
struct scmi_device *sdev = to_scmi_dev(cinfo->dev);
of_node_put(cinfo->dev->of_node);
- scmi_device_destroy(sdev);
+ scmi_device_destroy(info->dev, id, sdev->name);
cinfo->dev = NULL;
}