aboutsummaryrefslogtreecommitdiff
path: root/modules/devices/devicetree
diff options
context:
space:
mode:
authorBurt P <pburt0@gmail.com>2017-07-19 16:15:36 -0500
committerLeandro A. F. Pereira <leandro@hardinfo.org>2017-07-21 05:14:20 -0700
commit9f658f1b22f3167e817edadfec1bb23b6c6469e3 (patch)
treedc052b8ceefa4a3973b46bd2956e2eba32fd43ab /modules/devices/devicetree
parent8bc918eaf6d8a2f3aea56b7a23662ffaece9c87b (diff)
device tree: decode /__overrides__ fields
Signed-off-by: Burt P <pburt0@gmail.com>
Diffstat (limited to 'modules/devices/devicetree')
-rw-r--r--modules/devices/devicetree/dt_util.c46
1 files changed, 44 insertions, 2 deletions
diff --git a/modules/devices/devicetree/dt_util.c b/modules/devices/devicetree/dt_util.c
index 0bbf26a0..dbeda3a6 100644
--- a/modules/devices/devicetree/dt_util.c
+++ b/modules/devices/devicetree/dt_util.c
@@ -398,12 +398,17 @@ int dtr_guess_type(dtr_obj *obj) {
}
}
- /* /aliases/* and /__symbols/* are always strings */
+ /* /aliases/* and /__symbols__/* are always strings */
if (strncmp(obj->path, "/aliases/", strlen("/aliases/") ) == 0)
return DTP_STR;
if (strncmp(obj->path, "/__symbols__/", strlen("/__symbols__/") ) == 0)
return DTP_STR;
+ /* /__overrides__/* */
+ if (strncmp(obj->path, "/__overrides__/", strlen("/__overrides__/") ) == 0)
+ if (strcmp(obj->name, "name") != 0)
+ return DTP_OVR;
+
/* lookup known type */
while (prop_types[i].name != NULL) {
if (strcmp(obj->name, prop_types[i].name) == 0)
@@ -413,7 +418,7 @@ int dtr_guess_type(dtr_obj *obj) {
/* maybe a string? */
for (i = 0; i < obj->length; i++) {
- tmp = (char*)obj->data + i;
+ tmp = obj->data_str + i;
if ( isalnum(*tmp) ) anc++; /* count the alpha-nums */
if ( isprint(*tmp) || *tmp == 0 )
continue;
@@ -528,6 +533,40 @@ char *dtr_list_str0(const char *data, uint32_t length) {
return strdup(ret);
}
+char *dtr_list_override(dtr_obj *obj) {
+ /* <phref, string "property:value"> ... */
+ char *tmp, *ret;
+ char *ph, *str;
+ char *src;
+ int l, consumed = 0;
+ ret = strdup("");
+ src = obj->data_str;
+ while (consumed + 5 <= obj->length) {
+ ph = dtr_elem_phref(obj->dt, *(dt_uint*)src, 1);
+ src += 4; consumed += 4;
+ l = strlen(src) + 1; /* consume the null */
+ str = dtr_list_str0(src, l);
+ tmp = g_strdup_printf("%s%s<%s -> %s>",
+ ret, strlen(ret) ? " " : "",
+ ph, str);
+ src += l; consumed += l;
+ free(ph);
+ free(str);
+ free(ret);
+ ret = tmp;
+ }
+ if (consumed < obj->length) {
+ str = dtr_list_byte(src, obj->length - consumed);
+ tmp = g_strdup_printf("%s%s%s",
+ ret, strlen(ret) ? " " : "",
+ str);
+ free(str);
+ free(ret);
+ ret = tmp;
+ }
+ return ret;
+}
+
uint32_t dtr_get_phref_prop(dtr *s, uint32_t phandle, char *prop) {
const char *ph_path;
char *tmp;
@@ -587,6 +626,9 @@ char* dtr_str(dtr_obj *obj) {
case DTP_STR:
ret = dtr_list_str0(obj->data_str, obj->length);
break;
+ case DTP_OVR:
+ ret = dtr_list_override(obj);
+ break;
case DTP_CLOCKS:
/* <phref, #clock-cells"> */
if (DTEX_MTUP) {