1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _DEVICE_DEVRES_H_ 3 #define _DEVICE_DEVRES_H_ 4 5 #include <linux/err.h> 6 #include <linux/gfp_types.h> 7 #include <linux/numa.h> 8 #include <linux/overflow.h> 9 #include <linux/stdarg.h> 10 #include <linux/types.h> 11 12 struct device; 13 struct device_node; 14 struct resource; 15 16 /* device resource management */ 17 typedef void (*dr_release_t)(struct device *dev, void *res); 18 typedef int (*dr_match_t)(struct device *dev, void *res, void *match_data); 19 20 void * __malloc 21 __devres_alloc_node(dr_release_t release, size_t size, gfp_t gfp, int nid, const char *name); 22 #define devres_alloc(release, size, gfp) \ 23 __devres_alloc_node(release, size, gfp, NUMA_NO_NODE, #release) 24 #define devres_alloc_node(release, size, gfp, nid) \ 25 __devres_alloc_node(release, size, gfp, nid, #release) 26 27 void devres_for_each_res(struct device *dev, dr_release_t release, 28 dr_match_t match, void *match_data, 29 void (*fn)(struct device *, void *, void *), 30 void *data); 31 void devres_free(void *res); 32 void devres_add(struct device *dev, void *res); 33 void *devres_find(struct device *dev, dr_release_t release, dr_match_t match, void *match_data); 34 void *devres_get(struct device *dev, void *new_res, dr_match_t match, void *match_data); 35 void *devres_remove(struct device *dev, dr_release_t release, dr_match_t match, void *match_data); 36 int devres_destroy(struct device *dev, dr_release_t release, dr_match_t match, void *match_data); 37 int devres_release(struct device *dev, dr_release_t release, dr_match_t match, void *match_data); 38 39 /* devres group */ 40 void * __must_check devres_open_group(struct device *dev, void *id, gfp_t gfp); 41 void devres_close_group(struct device *dev, void *id); 42 void devres_remove_group(struct device *dev, void *id); 43 int devres_release_group(struct device *dev, void *id); 44 45 /* managed devm_k.alloc/kfree for device drivers */ 46 void * __alloc_size(2) 47 devm_kmalloc(struct device *dev, size_t size, gfp_t gfp); 48 void * __must_check __realloc_size(3) 49 devm_krealloc(struct device *dev, void *ptr, size_t size, gfp_t gfp); 50 static inline void *devm_kzalloc(struct device *dev, size_t size, gfp_t gfp) 51 { 52 return devm_kmalloc(dev, size, gfp | __GFP_ZERO); 53 } 54 static inline void *devm_kmalloc_array(struct device *dev, size_t n, size_t size, gfp_t flags) 55 { 56 size_t bytes; 57 58 if (unlikely(check_mul_overflow(n, size, &bytes))) 59 return NULL; 60 61 return devm_kmalloc(dev, bytes, flags); 62 } 63 static inline void *devm_kcalloc(struct device *dev, size_t n, size_t size, gfp_t flags) 64 { 65 return devm_kmalloc_array(dev, n, size, flags | __GFP_ZERO); 66 } 67 static inline __realloc_size(3, 4) void * __must_check 68 devm_krealloc_array(struct device *dev, void *p, size_t new_n, size_t new_size, gfp_t flags) 69 { 70 size_t bytes; 71 72 if (unlikely(check_mul_overflow(new_n, new_size, &bytes))) 73 return NULL; 74 75 return devm_krealloc(dev, p, bytes, flags); 76 } 77 78 void devm_kfree(struct device *dev, const void *p); 79 80 void * __realloc_size(3) 81 devm_kmemdup(struct device *dev, const void *src, size_t len, gfp_t gfp); 82 static inline void *devm_kmemdup_array(struct device *dev, const void *src, 83 size_t n, size_t size, gfp_t flags) 84 { 85 return devm_kmemdup(dev, src, size_mul(size, n), flags); 86 } 87 88 char * __malloc 89 devm_kstrdup(struct device *dev, const char *s, gfp_t gfp); 90 const char *devm_kstrdup_const(struct device *dev, const char *s, gfp_t gfp); 91 char * __printf(3, 0) __malloc 92 devm_kvasprintf(struct device *dev, gfp_t gfp, const char *fmt, va_list ap); 93 char * __printf(3, 4) __malloc 94 devm_kasprintf(struct device *dev, gfp_t gfp, const char *fmt, ...); 95 96 unsigned long devm_get_free_pages(struct device *dev, gfp_t gfp_mask, unsigned int order); 97 void devm_free_pages(struct device *dev, unsigned long addr); 98 99 #ifdef CONFIG_HAS_IOMEM 100 101 void __iomem *devm_ioremap_resource(struct device *dev, const struct resource *res); 102 void __iomem *devm_ioremap_resource_wc(struct device *dev, const struct resource *res); 103 104 void __iomem *devm_of_iomap(struct device *dev, struct device_node *node, int index, 105 resource_size_t *size); 106 #else 107 108 static inline 109 void __iomem *devm_ioremap_resource(struct device *dev, const struct resource *res) 110 { 111 return IOMEM_ERR_PTR(-EINVAL); 112 } 113 114 static inline 115 void __iomem *devm_ioremap_resource_wc(struct device *dev, const struct resource *res) 116 { 117 return IOMEM_ERR_PTR(-EINVAL); 118 } 119 120 static inline 121 void __iomem *devm_of_iomap(struct device *dev, struct device_node *node, int index, 122 resource_size_t *size) 123 { 124 return IOMEM_ERR_PTR(-EINVAL); 125 } 126 127 #endif 128 129 #endif /* _DEVICE_DEVRES_H_ */ 130