diff options
author | Burt P <pburt0@gmail.com> | 2018-10-20 16:39:13 -0500 |
---|---|---|
committer | Leandro A. F. Pereira <leandro@hardinfo.org> | 2018-10-22 19:45:03 -0700 |
commit | f281f89033b95cce1ac833c30a37d2d5ff396583 (patch) | |
tree | 6a035aca4b8183b95bca4d52f8bb742a1413c706 /hardinfo/dt_util.c | |
parent | 2e8261216b99ef335dc9d1e04cdcc8ac8fe5f302 (diff) |
devicetree: add oppv1 and clock-frequency to opp support
I don't have any hardware to test, this is based only on the
OPP kernel docs.
https://www.kernel.org/doc/Documentation/devicetree/bindings/opp/opp.txt
Signed-off-by: Burt P <pburt0@gmail.com>
Diffstat (limited to 'hardinfo/dt_util.c')
-rw-r--r-- | hardinfo/dt_util.c | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/hardinfo/dt_util.c b/hardinfo/dt_util.c index 60f84553..78ee2128 100644 --- a/hardinfo/dt_util.c +++ b/hardinfo/dt_util.c @@ -942,6 +942,7 @@ dt_opp_range *dtr_get_opp_range(dtr *s, const char *name) { uint64_t khz = 0; uint32_t lns = 0; char *row_status = NULL; + uint32_t i = 0; if (!s) return NULL; @@ -950,9 +951,40 @@ dt_opp_range *dtr_get_opp_range(dtr *s, const char *name) { if (!obj) goto get_opp_finish; - opp_ph = dtr_get_prop_u32(s, obj, "operating-points-v2"); - if (!opp_ph) + opp_ph = dtr_get_prop_u32(s, obj, "operating-points-v2"); /* OPPv2 */ + table_obj = dtr_get_prop_obj(s, obj, "operating-points"); /* OPPv1 */ + if (!opp_ph) { + if (table_obj) { + /* only v1 */ + ret = g_new0(dt_opp_range, 1); + ret->version = 1; + ret->clock_latency_ns = dtr_get_prop_u32(s, obj, "clock-latency"); + + /* pairs of (kHz,uV) */ + for (i = 0; i < table_obj->length; i += 2) { + khz = table_obj->data_int[i]; + if (khz > ret->khz_max) + ret->khz_max = khz; + if (khz < ret->khz_min || ret->khz_min == 0) + ret->khz_min = khz; + } + + } else { + /* is clock-frequency available? */ + khz = dtr_get_prop_u32(s, obj, "clock-frequency"); + if (khz) { + ret = g_new0(dt_opp_range, 1); + ret->version = 0; + ret->khz_max = khz; + ret->clock_latency_ns = dtr_get_prop_u32(s, obj, "clock-latency"); + } + } goto get_opp_finish; + } else { + /* use v2 if both available */ + dtr_obj_free(table_obj); + table_obj = NULL; + } opp_table_path = dtr_phandle_lookup(s, opp_ph); if (!opp_table_path) @@ -971,6 +1003,7 @@ dt_opp_range *dtr_get_opp_range(dtr *s, const char *name) { goto get_opp_finish; ret = g_new0(dt_opp_range, 1); + ret->version = 2; ret->phandle = opp_ph; full_path = dtr_obj_full_path(table_obj); |