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