1 // SPDX-License-Identifier: GPL-2.0+ 2 /* 3 * Copyright (c) 2017 Google, Inc 4 * Written by Simon Glass <sjg@chromium.org> 5 */ 6 7 #include <asm/types.h> 8 #include <asm/io.h> 9 #include <common.h> 10 #include <dm.h> 11 #include <mapmem.h> 12 #include <dm/of_access.h> 13 14 int dev_read_u32(struct udevice *dev, const char *propname, u32 *outp) 15 { 16 return ofnode_read_u32(dev_ofnode(dev), propname, outp); 17 } 18 19 int dev_read_u32_default(struct udevice *dev, const char *propname, int def) 20 { 21 return ofnode_read_u32_default(dev_ofnode(dev), propname, def); 22 } 23 24 const char *dev_read_string(struct udevice *dev, const char *propname) 25 { 26 return ofnode_read_string(dev_ofnode(dev), propname); 27 } 28 29 bool dev_read_bool(struct udevice *dev, const char *propname) 30 { 31 return ofnode_read_bool(dev_ofnode(dev), propname); 32 } 33 34 ofnode dev_read_subnode(struct udevice *dev, const char *subnode_name) 35 { 36 return ofnode_find_subnode(dev_ofnode(dev), subnode_name); 37 } 38 39 ofnode dev_read_first_subnode(struct udevice *dev) 40 { 41 return ofnode_first_subnode(dev_ofnode(dev)); 42 } 43 44 ofnode dev_read_next_subnode(ofnode node) 45 { 46 return ofnode_next_subnode(node); 47 } 48 49 int dev_read_size(struct udevice *dev, const char *propname) 50 { 51 return ofnode_read_size(dev_ofnode(dev), propname); 52 } 53 54 fdt_addr_t dev_read_addr_index(struct udevice *dev, int index) 55 { 56 if (ofnode_is_np(dev_ofnode(dev))) 57 return ofnode_get_addr_index(dev_ofnode(dev), index); 58 else 59 return devfdt_get_addr_index(dev, index); 60 } 61 62 void *dev_remap_addr_index(struct udevice *dev, int index) 63 { 64 fdt_addr_t addr = dev_read_addr_index(dev, index); 65 66 if (addr == FDT_ADDR_T_NONE) 67 return NULL; 68 69 return map_physmem(addr, 0, MAP_NOCACHE); 70 } 71 72 fdt_addr_t dev_read_addr_name(struct udevice *dev, const char *name) 73 { 74 int index = dev_read_stringlist_search(dev, "reg-names", name); 75 76 if (index < 0) 77 return FDT_ADDR_T_NONE; 78 else 79 return dev_read_addr_index(dev, index); 80 } 81 82 void *dev_remap_addr_name(struct udevice *dev, const char *name) 83 { 84 fdt_addr_t addr = dev_read_addr_name(dev, name); 85 86 if (addr == FDT_ADDR_T_NONE) 87 return NULL; 88 89 return map_physmem(addr, 0, MAP_NOCACHE); 90 } 91 92 fdt_addr_t dev_read_addr(struct udevice *dev) 93 { 94 return dev_read_addr_index(dev, 0); 95 } 96 97 void *dev_read_addr_ptr(struct udevice *dev) 98 { 99 fdt_addr_t addr = dev_read_addr(dev); 100 101 return (addr == FDT_ADDR_T_NONE) ? NULL : map_sysmem(addr, 0); 102 } 103 104 void *dev_remap_addr(struct udevice *dev) 105 { 106 return dev_remap_addr_index(dev, 0); 107 } 108 109 fdt_addr_t dev_read_addr_size(struct udevice *dev, const char *property, 110 fdt_size_t *sizep) 111 { 112 return ofnode_get_addr_size(dev_ofnode(dev), property, sizep); 113 } 114 115 const char *dev_read_name(struct udevice *dev) 116 { 117 return ofnode_get_name(dev_ofnode(dev)); 118 } 119 120 int dev_read_stringlist_search(struct udevice *dev, const char *property, 121 const char *string) 122 { 123 return ofnode_stringlist_search(dev_ofnode(dev), property, string); 124 } 125 126 int dev_read_string_index(struct udevice *dev, const char *propname, int index, 127 const char **outp) 128 { 129 return ofnode_read_string_index(dev_ofnode(dev), propname, index, outp); 130 } 131 132 int dev_read_string_count(struct udevice *dev, const char *propname) 133 { 134 return ofnode_read_string_count(dev_ofnode(dev), propname); 135 } 136 137 int dev_read_phandle_with_args(struct udevice *dev, const char *list_name, 138 const char *cells_name, int cell_count, 139 int index, struct ofnode_phandle_args *out_args) 140 { 141 return ofnode_parse_phandle_with_args(dev_ofnode(dev), list_name, 142 cells_name, cell_count, index, 143 out_args); 144 } 145 146 int dev_count_phandle_with_args(struct udevice *dev, const char *list_name, 147 const char *cells_name) 148 { 149 return ofnode_count_phandle_with_args(dev_ofnode(dev), list_name, 150 cells_name); 151 } 152 153 int dev_read_addr_cells(struct udevice *dev) 154 { 155 return ofnode_read_addr_cells(dev_ofnode(dev)); 156 } 157 158 int dev_read_size_cells(struct udevice *dev) 159 { 160 return ofnode_read_size_cells(dev_ofnode(dev)); 161 } 162 163 int dev_read_simple_addr_cells(struct udevice *dev) 164 { 165 return ofnode_read_simple_addr_cells(dev_ofnode(dev)); 166 } 167 168 int dev_read_simple_size_cells(struct udevice *dev) 169 { 170 return ofnode_read_simple_size_cells(dev_ofnode(dev)); 171 } 172 173 int dev_read_phandle(struct udevice *dev) 174 { 175 ofnode node = dev_ofnode(dev); 176 177 if (ofnode_is_np(node)) 178 return ofnode_to_np(node)->phandle; 179 else 180 return fdt_get_phandle(gd->fdt_blob, ofnode_to_offset(node)); 181 } 182 183 const void *dev_read_prop(struct udevice *dev, const char *propname, int *lenp) 184 { 185 return ofnode_get_property(dev_ofnode(dev), propname, lenp); 186 } 187 188 int dev_read_alias_seq(struct udevice *dev, int *devnump) 189 { 190 ofnode node = dev_ofnode(dev); 191 const char *uc_name = dev->uclass->uc_drv->name; 192 int ret; 193 194 if (ofnode_is_np(node)) { 195 ret = of_alias_get_id(ofnode_to_np(node), uc_name); 196 if (ret >= 0) 197 *devnump = ret; 198 } else { 199 ret = fdtdec_get_alias_seq(gd->fdt_blob, uc_name, 200 ofnode_to_offset(node), devnump); 201 } 202 203 return ret; 204 } 205 206 int dev_read_u32_array(struct udevice *dev, const char *propname, 207 u32 *out_values, size_t sz) 208 { 209 return ofnode_read_u32_array(dev_ofnode(dev), propname, out_values, sz); 210 } 211 212 const uint8_t *dev_read_u8_array_ptr(struct udevice *dev, const char *propname, 213 size_t sz) 214 { 215 return ofnode_read_u8_array_ptr(dev_ofnode(dev), propname, sz); 216 } 217 218 int dev_read_enabled(struct udevice *dev) 219 { 220 ofnode node = dev_ofnode(dev); 221 222 if (ofnode_is_np(node)) 223 return of_device_is_available(ofnode_to_np(node)); 224 else 225 return fdtdec_get_is_enabled(gd->fdt_blob, 226 ofnode_to_offset(node)); 227 } 228 229 int dev_read_resource(struct udevice *dev, uint index, struct resource *res) 230 { 231 return ofnode_read_resource(dev_ofnode(dev), index, res); 232 } 233 234 int dev_read_resource_byname(struct udevice *dev, const char *name, 235 struct resource *res) 236 { 237 return ofnode_read_resource_byname(dev_ofnode(dev), name, res); 238 } 239 240 u64 dev_translate_address(struct udevice *dev, const fdt32_t *in_addr) 241 { 242 return ofnode_translate_address(dev_ofnode(dev), in_addr); 243 } 244