Commit afb77422 authored by Ioana Ciornei's avatar Ioana Ciornei Committed by Li Yang

bus: fsl-mc: automatically add a device_link on fsl_mc_[portal,object]_allocate

Allocatable devices can be acquired by drivers on the fsl-mc bus using
the fsl_mc_portal_allocate or fsl_mc_object_allocate functions. Add a
device link between the consumer device and the supplier device so that
proper resource management is achieved.
Also, adding a link between these devices ensures that a proper unbind
order is respected (ie before the supplier device is unbound from its
respective driver all consumer devices will be notified and unbound
first).
Signed-off-by: default avatarIoana Ciornei <ioana.ciornei@nxp.com>
Reviewed-by: default avatarLaurentiu Tudor <laurentiu.tudor@nxp.com>
Signed-off-by: default avatarLi Yang <leoyang.li@nxp.com>
parent 47441f7f
...@@ -295,6 +295,14 @@ int __must_check fsl_mc_object_allocate(struct fsl_mc_device *mc_dev, ...@@ -295,6 +295,14 @@ int __must_check fsl_mc_object_allocate(struct fsl_mc_device *mc_dev,
if (!mc_adev) if (!mc_adev)
goto error; goto error;
mc_adev->consumer_link = device_link_add(&mc_dev->dev,
&mc_adev->dev,
DL_FLAG_AUTOREMOVE_CONSUMER);
if (!mc_adev->consumer_link) {
error = -EINVAL;
goto error;
}
*new_mc_adev = mc_adev; *new_mc_adev = mc_adev;
return 0; return 0;
error: error:
...@@ -321,6 +329,9 @@ void fsl_mc_object_free(struct fsl_mc_device *mc_adev) ...@@ -321,6 +329,9 @@ void fsl_mc_object_free(struct fsl_mc_device *mc_adev)
return; return;
fsl_mc_resource_free(resource); fsl_mc_resource_free(resource);
device_link_del(mc_adev->consumer_link);
mc_adev->consumer_link = NULL;
} }
EXPORT_SYMBOL_GPL(fsl_mc_object_free); EXPORT_SYMBOL_GPL(fsl_mc_object_free);
......
...@@ -209,9 +209,19 @@ int __must_check fsl_mc_portal_allocate(struct fsl_mc_device *mc_dev, ...@@ -209,9 +209,19 @@ int __must_check fsl_mc_portal_allocate(struct fsl_mc_device *mc_dev,
if (error < 0) if (error < 0)
goto error_cleanup_resource; goto error_cleanup_resource;
dpmcp_dev->consumer_link = device_link_add(&mc_dev->dev,
&dpmcp_dev->dev,
DL_FLAG_AUTOREMOVE_CONSUMER);
if (!dpmcp_dev->consumer_link) {
error = -EINVAL;
goto error_cleanup_mc_io;
}
*new_mc_io = mc_io; *new_mc_io = mc_io;
return 0; return 0;
error_cleanup_mc_io:
fsl_destroy_mc_io(mc_io);
error_cleanup_resource: error_cleanup_resource:
fsl_mc_resource_free(resource); fsl_mc_resource_free(resource);
return error; return error;
...@@ -244,6 +254,9 @@ void fsl_mc_portal_free(struct fsl_mc_io *mc_io) ...@@ -244,6 +254,9 @@ void fsl_mc_portal_free(struct fsl_mc_io *mc_io)
fsl_destroy_mc_io(mc_io); fsl_destroy_mc_io(mc_io);
fsl_mc_resource_free(resource); fsl_mc_resource_free(resource);
device_link_del(dpmcp_dev->consumer_link);
dpmcp_dev->consumer_link = NULL;
} }
EXPORT_SYMBOL_GPL(fsl_mc_portal_free); EXPORT_SYMBOL_GPL(fsl_mc_portal_free);
......
...@@ -193,6 +193,7 @@ struct fsl_mc_device { ...@@ -193,6 +193,7 @@ struct fsl_mc_device {
struct resource *regions; struct resource *regions;
struct fsl_mc_device_irq **irqs; struct fsl_mc_device_irq **irqs;
struct fsl_mc_resource *resource; struct fsl_mc_resource *resource;
struct device_link *consumer_link;
}; };
#define to_fsl_mc_device(_dev) \ #define to_fsl_mc_device(_dev) \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment