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); | 
