Skip to content

Commit 081df76

Browse files
committed
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 <[email protected]> Signed-off-by: Thierry Reding <[email protected]>
1 parent 0da0e31 commit 081df76

File tree

1 file changed

+10
-12
lines changed

1 file changed

+10
-12
lines changed

drivers/of/of_reserved_mem.c

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -385,24 +385,22 @@ EXPORT_SYMBOL_GPL(of_reserved_mem_device_init_by_name);
385385
*/
386386
void of_reserved_mem_device_release(struct device *dev)
387387
{
388-
struct rmem_assigned_device *rd;
389-
struct reserved_mem *rmem = NULL;
388+
struct rmem_assigned_device *rd, *tmp;
389+
LIST_HEAD(release_list);
390390

391391
mutex_lock(&of_rmem_assigned_device_mutex);
392-
list_for_each_entry(rd, &of_rmem_assigned_device_list, list) {
393-
if (rd->dev == dev) {
394-
rmem = rd->rmem;
395-
list_del(&rd->list);
396-
kfree(rd);
397-
break;
398-
}
392+
list_for_each_entry_safe(rd, tmp, &of_rmem_assigned_device_list, list) {
393+
if (rd->dev == dev)
394+
list_move_tail(&rd->list, &release_list);
399395
}
400396
mutex_unlock(&of_rmem_assigned_device_mutex);
401397

402-
if (!rmem || !rmem->ops || !rmem->ops->device_release)
403-
return;
398+
list_for_each_entry_safe(rd, tmp, &release_list, list) {
399+
if (rd->rmem && rd->rmem->ops && rd->rmem->ops->device_release)
400+
rd->rmem->ops->device_release(rd->rmem, dev);
404401

405-
rmem->ops->device_release(rmem, dev);
402+
kfree(rd);
403+
}
406404
}
407405
EXPORT_SYMBOL_GPL(of_reserved_mem_device_release);
408406

0 commit comments

Comments
 (0)