mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
synced 2025-08-27 06:50:37 +00:00

Drivers with "memory-region" properties currently have to do their own parsing of "memory-region" properties. The result is all the drivers have similar patterns of a call to parse "memory-region" and then get the region's address and size. As this is a standard property, it should have common functions for drivers to use. Add new functions to count the number of regions and retrieve the region's address as a resource. Reviewed-by: Daniel Baluta <daniel.baluta@nxp.com> Acked-by: Arnaud Pouliquen <arnaud.pouliquen@foss.st.com> Link: https://lore.kernel.org/r/20250423-dt-memory-region-v2-v2-1-2fbd6ebd3c88@kernel.org Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
110 lines
3.0 KiB
C
110 lines
3.0 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef __OF_RESERVED_MEM_H
|
|
#define __OF_RESERVED_MEM_H
|
|
|
|
#include <linux/device.h>
|
|
#include <linux/of.h>
|
|
|
|
struct of_phandle_args;
|
|
struct reserved_mem_ops;
|
|
struct resource;
|
|
|
|
struct reserved_mem {
|
|
const char *name;
|
|
unsigned long fdt_node;
|
|
const struct reserved_mem_ops *ops;
|
|
phys_addr_t base;
|
|
phys_addr_t size;
|
|
void *priv;
|
|
};
|
|
|
|
struct reserved_mem_ops {
|
|
int (*device_init)(struct reserved_mem *rmem,
|
|
struct device *dev);
|
|
void (*device_release)(struct reserved_mem *rmem,
|
|
struct device *dev);
|
|
};
|
|
|
|
typedef int (*reservedmem_of_init_fn)(struct reserved_mem *rmem);
|
|
|
|
#ifdef CONFIG_OF_RESERVED_MEM
|
|
|
|
#define RESERVEDMEM_OF_DECLARE(name, compat, init) \
|
|
_OF_DECLARE(reservedmem, name, compat, init, reservedmem_of_init_fn)
|
|
|
|
int of_reserved_mem_device_init_by_idx(struct device *dev,
|
|
struct device_node *np, int idx);
|
|
int of_reserved_mem_device_init_by_name(struct device *dev,
|
|
struct device_node *np,
|
|
const char *name);
|
|
void of_reserved_mem_device_release(struct device *dev);
|
|
|
|
struct reserved_mem *of_reserved_mem_lookup(struct device_node *np);
|
|
int of_reserved_mem_region_to_resource(const struct device_node *np,
|
|
unsigned int idx, struct resource *res);
|
|
int of_reserved_mem_region_to_resource_byname(const struct device_node *np,
|
|
const char *name, struct resource *res);
|
|
int of_reserved_mem_region_count(const struct device_node *np);
|
|
|
|
#else
|
|
|
|
#define RESERVEDMEM_OF_DECLARE(name, compat, init) \
|
|
_OF_DECLARE_STUB(reservedmem, name, compat, init, reservedmem_of_init_fn)
|
|
|
|
static inline int of_reserved_mem_device_init_by_idx(struct device *dev,
|
|
struct device_node *np, int idx)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
|
|
static inline int of_reserved_mem_device_init_by_name(struct device *dev,
|
|
struct device_node *np,
|
|
const char *name)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
|
|
static inline void of_reserved_mem_device_release(struct device *pdev) { }
|
|
|
|
static inline struct reserved_mem *of_reserved_mem_lookup(struct device_node *np)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
static inline int of_reserved_mem_region_to_resource(const struct device_node *np,
|
|
unsigned int idx,
|
|
struct resource *res)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
|
|
static inline int of_reserved_mem_region_to_resource_byname(const struct device_node *np,
|
|
const char *name,
|
|
struct resource *res)
|
|
{
|
|
return -ENOSYS;
|
|
}
|
|
|
|
static inline int of_reserved_mem_region_count(const struct device_node *np)
|
|
{
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
/**
|
|
* of_reserved_mem_device_init() - assign reserved memory region to given device
|
|
* @dev: Pointer to the device to configure
|
|
*
|
|
* This function assigns respective DMA-mapping operations based on the first
|
|
* reserved memory region specified by 'memory-region' property in device tree
|
|
* node of the given device.
|
|
*
|
|
* Returns error code or zero on success.
|
|
*/
|
|
static inline int of_reserved_mem_device_init(struct device *dev)
|
|
{
|
|
return of_reserved_mem_device_init_by_idx(dev, dev->of_node, 0);
|
|
}
|
|
|
|
#endif /* __OF_RESERVED_MEM_H */
|