Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #ifndef __OF_RESERVED_MEM_H
0003 #define __OF_RESERVED_MEM_H
0004 
0005 #include <linux/device.h>
0006 #include <linux/of.h>
0007 
0008 struct of_phandle_args;
0009 struct reserved_mem_ops;
0010 
0011 struct reserved_mem {
0012     const char          *name;
0013     unsigned long           fdt_node;
0014     unsigned long           phandle;
0015     const struct reserved_mem_ops   *ops;
0016     phys_addr_t         base;
0017     phys_addr_t         size;
0018     void                *priv;
0019 };
0020 
0021 struct reserved_mem_ops {
0022     int (*device_init)(struct reserved_mem *rmem,
0023                    struct device *dev);
0024     void    (*device_release)(struct reserved_mem *rmem,
0025                   struct device *dev);
0026 };
0027 
0028 typedef int (*reservedmem_of_init_fn)(struct reserved_mem *rmem);
0029 
0030 #ifdef CONFIG_OF_RESERVED_MEM
0031 
0032 #define RESERVEDMEM_OF_DECLARE(name, compat, init)          \
0033     _OF_DECLARE(reservedmem, name, compat, init, reservedmem_of_init_fn)
0034 
0035 int of_reserved_mem_device_init_by_idx(struct device *dev,
0036                        struct device_node *np, int idx);
0037 int of_reserved_mem_device_init_by_name(struct device *dev,
0038                     struct device_node *np,
0039                     const char *name);
0040 void of_reserved_mem_device_release(struct device *dev);
0041 
0042 struct reserved_mem *of_reserved_mem_lookup(struct device_node *np);
0043 #else
0044 
0045 #define RESERVEDMEM_OF_DECLARE(name, compat, init)          \
0046     _OF_DECLARE_STUB(reservedmem, name, compat, init, reservedmem_of_init_fn)
0047 
0048 static inline int of_reserved_mem_device_init_by_idx(struct device *dev,
0049                     struct device_node *np, int idx)
0050 {
0051     return -ENOSYS;
0052 }
0053 
0054 static inline int of_reserved_mem_device_init_by_name(struct device *dev,
0055                               struct device_node *np,
0056                               const char *name)
0057 {
0058     return -ENOSYS;
0059 }
0060 
0061 static inline void of_reserved_mem_device_release(struct device *pdev) { }
0062 
0063 static inline struct reserved_mem *of_reserved_mem_lookup(struct device_node *np)
0064 {
0065     return NULL;
0066 }
0067 #endif
0068 
0069 /**
0070  * of_reserved_mem_device_init() - assign reserved memory region to given device
0071  * @dev:    Pointer to the device to configure
0072  *
0073  * This function assigns respective DMA-mapping operations based on the first
0074  * reserved memory region specified by 'memory-region' property in device tree
0075  * node of the given device.
0076  *
0077  * Returns error code or zero on success.
0078  */
0079 static inline int of_reserved_mem_device_init(struct device *dev)
0080 {
0081     return of_reserved_mem_device_init_by_idx(dev, dev->of_node, 0);
0082 }
0083 
0084 #endif /* __OF_RESERVED_MEM_H */