Skip to content

Commit 19207ea

Browse files
committed
Merge tag 'tegra-for-5.8-of' of git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux into arm/drivers
of: Changes for v5.8-rc1 These changes add support for multiple reserved-memory regions per device. * tag 'tegra-for-5.8-of' of git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux: of: Make <linux/of_reserved_mem.h> self-contained of: reserved-memory: Support multiple regions per device of: reserved-memory: Support lookup of regions by name Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Arnd Bergmann <[email protected]>
2 parents 2e60fac + 4a470f0 commit 19207ea

File tree

2 files changed

+41
-12
lines changed

2 files changed

+41
-12
lines changed

drivers/of/of_reserved_mem.c

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,25 @@ int of_reserved_mem_device_init_by_idx(struct device *dev,
357357
}
358358
EXPORT_SYMBOL_GPL(of_reserved_mem_device_init_by_idx);
359359

360+
/**
361+
* of_reserved_mem_device_init_by_name() - assign named reserved memory region
362+
* to given device
363+
* @dev: pointer to the device to configure
364+
* @np: pointer to the device node with 'memory-region' property
365+
* @name: name of the selected memory region
366+
*
367+
* Returns: 0 on success or a negative error-code on failure.
368+
*/
369+
int of_reserved_mem_device_init_by_name(struct device *dev,
370+
struct device_node *np,
371+
const char *name)
372+
{
373+
int idx = of_property_match_string(np, "memory-region-names", name);
374+
375+
return of_reserved_mem_device_init_by_idx(dev, np, idx);
376+
}
377+
EXPORT_SYMBOL_GPL(of_reserved_mem_device_init_by_name);
378+
360379
/**
361380
* of_reserved_mem_device_release() - release reserved memory device structures
362381
* @dev: Pointer to the device to deconfigure
@@ -366,24 +385,22 @@ EXPORT_SYMBOL_GPL(of_reserved_mem_device_init_by_idx);
366385
*/
367386
void of_reserved_mem_device_release(struct device *dev)
368387
{
369-
struct rmem_assigned_device *rd;
370-
struct reserved_mem *rmem = NULL;
388+
struct rmem_assigned_device *rd, *tmp;
389+
LIST_HEAD(release_list);
371390

372391
mutex_lock(&of_rmem_assigned_device_mutex);
373-
list_for_each_entry(rd, &of_rmem_assigned_device_list, list) {
374-
if (rd->dev == dev) {
375-
rmem = rd->rmem;
376-
list_del(&rd->list);
377-
kfree(rd);
378-
break;
379-
}
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);
380395
}
381396
mutex_unlock(&of_rmem_assigned_device_mutex);
382397

383-
if (!rmem || !rmem->ops || !rmem->ops->device_release)
384-
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);
385401

386-
rmem->ops->device_release(rmem, dev);
402+
kfree(rd);
403+
}
387404
}
388405
EXPORT_SYMBOL_GPL(of_reserved_mem_device_release);
389406

include/linux/of_reserved_mem.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#define __OF_RESERVED_MEM_H
44

55
#include <linux/device.h>
6+
#include <linux/of.h>
67

78
struct of_phandle_args;
89
struct reserved_mem_ops;
@@ -33,6 +34,9 @@ typedef int (*reservedmem_of_init_fn)(struct reserved_mem *rmem);
3334

3435
int of_reserved_mem_device_init_by_idx(struct device *dev,
3536
struct device_node *np, int idx);
37+
int of_reserved_mem_device_init_by_name(struct device *dev,
38+
struct device_node *np,
39+
const char *name);
3640
void of_reserved_mem_device_release(struct device *dev);
3741

3842
void fdt_init_reserved_mem(void);
@@ -45,6 +49,14 @@ static inline int of_reserved_mem_device_init_by_idx(struct device *dev,
4549
{
4650
return -ENOSYS;
4751
}
52+
53+
static inline int of_reserved_mem_device_init_by_name(struct device *dev,
54+
struct device_node *np,
55+
const char *name)
56+
{
57+
return -ENOSYS;
58+
}
59+
4860
static inline void of_reserved_mem_device_release(struct device *pdev) { }
4961

5062
static inline void fdt_init_reserved_mem(void) { }

0 commit comments

Comments
 (0)