mirror of
https://github.com/torvalds/linux.git
synced 2024-12-27 13:22:23 +00:00
of: reserved-memory: Support multiple regions per device
While the lookup/initialization code already supports multiple memory regions per device, the release code will only ever release the first matching memory region. Enhance the code to release all matching regions. Each attachment of a region to a device is uniquely identifiable using a struct device pointer and a pointer to the memory region's struct reserved_mem. Reviewed-by: Rob Herring <robh@kernel.org> Signed-off-by: Thierry Reding <treding@nvidia.com>
This commit is contained in:
parent
0da0e31600
commit
081df76a04
@ -385,24 +385,22 @@ EXPORT_SYMBOL_GPL(of_reserved_mem_device_init_by_name);
|
||||
*/
|
||||
void of_reserved_mem_device_release(struct device *dev)
|
||||
{
|
||||
struct rmem_assigned_device *rd;
|
||||
struct reserved_mem *rmem = NULL;
|
||||
struct rmem_assigned_device *rd, *tmp;
|
||||
LIST_HEAD(release_list);
|
||||
|
||||
mutex_lock(&of_rmem_assigned_device_mutex);
|
||||
list_for_each_entry(rd, &of_rmem_assigned_device_list, list) {
|
||||
if (rd->dev == dev) {
|
||||
rmem = rd->rmem;
|
||||
list_del(&rd->list);
|
||||
kfree(rd);
|
||||
break;
|
||||
}
|
||||
list_for_each_entry_safe(rd, tmp, &of_rmem_assigned_device_list, list) {
|
||||
if (rd->dev == dev)
|
||||
list_move_tail(&rd->list, &release_list);
|
||||
}
|
||||
mutex_unlock(&of_rmem_assigned_device_mutex);
|
||||
|
||||
if (!rmem || !rmem->ops || !rmem->ops->device_release)
|
||||
return;
|
||||
list_for_each_entry_safe(rd, tmp, &release_list, list) {
|
||||
if (rd->rmem && rd->rmem->ops && rd->rmem->ops->device_release)
|
||||
rd->rmem->ops->device_release(rd->rmem, dev);
|
||||
|
||||
rmem->ops->device_release(rmem, dev);
|
||||
kfree(rd);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(of_reserved_mem_device_release);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user