diff options
author | Burt P <pburt0@gmail.com> | 2017-07-19 13:52:26 -0500 |
---|---|---|
committer | Leandro A. F. Pereira <leandro@hardinfo.org> | 2017-07-21 05:14:20 -0700 |
commit | 09a97340826d926f9949f4aa1a99c4f6848c10ac (patch) | |
tree | 05419a19258b432e66f81545abab97dd167f4c80 /modules/devices/devicetree | |
parent | 620997880825682ac43eec3e0fcc9c40407dd5c4 (diff) |
device tree: special handling gpios and clocks
Signed-off-by: Burt P <pburt0@gmail.com>
Diffstat (limited to 'modules/devices/devicetree')
-rw-r--r-- | modules/devices/devicetree/dt_util.c | 52 |
1 files changed, 50 insertions, 2 deletions
diff --git a/modules/devices/devicetree/dt_util.c b/modules/devices/devicetree/dt_util.c index de2d1e37..3440c3a1 100644 --- a/modules/devices/devicetree/dt_util.c +++ b/modules/devices/devicetree/dt_util.c @@ -530,6 +530,43 @@ char *dtr_list_str0(const char *data, uint32_t length) { return strdup(ret); } +uint32_t dtr_get_phref_prop(dtr *s, uint32_t phandle, char *prop) { + const char *ph_path; + char *tmp; + uint32_t ret; + ph_path = dtr_phandle_lookup(s, phandle); + tmp = g_strdup_printf("%s/%s", ph_path, prop); + ret = dtr_get_prop_u32(s, NULL, tmp); + free(tmp); + return ret; +} + +char *dtr_list_phref(dtr_obj *obj, char *ext_cell_prop) { + /* <phref, #XXX-cells> */ + int count = obj->length / 4; + int i = 0, ext_cells = 0; + char *ph_path; + char *ph, *ext, *tmp, *ret; + ret = g_strdup(""); + while (i < count) { + if (ext_cell_prop == NULL) + ext_cells = 0; + else + ext_cells = dtr_get_phref_prop(obj->dt, be32toh(obj->data_int[i]), ext_cell_prop); + ph = dtr_elem_phref(obj->dt, obj->data_int[i], 0); i++; + if (ext_cells > count - i) ext_cells = count - i; + ext = dtr_list_hex((obj->data_int + i), ext_cells); i+=ext_cells; + tmp = g_strdup_printf("%s%s<%s%s%s>", + ret, strlen(ret) ? ", " : "", + ph, (ext_cells) ? " " : "", ext); + g_free(ret); + g_free(ph); + g_free(ext); + ret = tmp; + } + return ret; +} + char* dtr_str(dtr_obj *obj) { char *ret; int type; @@ -552,10 +589,21 @@ char* dtr_str(dtr_obj *obj) { case DTP_STR: ret = dtr_list_str0(obj->data_str, obj->length); break; - case DTP_PH: - case DTP_REG: case DTP_CLOCKS: + /* <phref, #clock-cells"> */ + if (DTEX_MTUP) { + ret = dtr_list_phref(obj, "#clock-cells"); + break; + } case DTP_GPIOS: + /* <phref, #gpio-cells"> */ + if (DTEX_MTUP) { + ret = dtr_list_phref(obj, "#gpio-cells"); + break; + } + case DTP_REG: + /* <#address-cells #size-cells> */ + case DTP_PH: case DTP_HEX: if (obj->length % 4) ret = dtr_list_byte((uint8_t*)obj->data, obj->length); |