aboutsummaryrefslogtreecommitdiff
path: root/hardinfo/dt_util.c
diff options
context:
space:
mode:
authorBurt P <pburt0@gmail.com>2018-10-20 16:39:13 -0500
committerLeandro A. F. Pereira <leandro@hardinfo.org>2018-10-22 19:45:03 -0700
commitf281f89033b95cce1ac833c30a37d2d5ff396583 (patch)
tree6a035aca4b8183b95bca4d52f8bb742a1413c706 /hardinfo/dt_util.c
parent2e8261216b99ef335dc9d1e04cdcc8ac8fe5f302 (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.c37
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);