From 3c83b5f06c702fbc4f6672f0cb4b9e4e60b84975 Mon Sep 17 00:00:00 2001 From: Junjie Wu Date: Wed, 12 Aug 2015 17:48:46 -0700 Subject: [PATCH] PM / devfreq: m4m-hwmon: Fix counter limit calculation M4M counters are only 28-bit instead of 32-bit. Fix limit calculation to use the right max value. Change-Id: I91078842b72da80f6b6755bf8d808ff4b4142f10 Signed-off-by: Junjie Wu --- drivers/devfreq/m4m-hwmon.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/drivers/devfreq/m4m-hwmon.c b/drivers/devfreq/m4m-hwmon.c index ceb99575b67c..51b077119cf3 100644 --- a/drivers/devfreq/m4m-hwmon.c +++ b/drivers/devfreq/m4m-hwmon.c @@ -50,6 +50,9 @@ #define CYC_CNTR_IDX 0 #define WASTED_CYC_CNTR_IDX 1 +/* counter is 28-bit */ +#define CNT_MAX 0x0FFFFFFFU + struct m4m_counter { int idx; u32 event_mask; @@ -144,7 +147,7 @@ static unsigned long _mon_get_count(struct m4m_hwmon *m, } if (ov) - cnt = U32_MAX - start + cur_cnt; + cnt = CNT_MAX - start + cur_cnt; else cnt = cur_cnt - start; @@ -160,7 +163,11 @@ static unsigned long mon_get_count(struct m4m_hwmon *m, static inline void mon_set_limit(struct m4m_hwmon *m, enum request_group grp, unsigned int limit) { - u32 start = U32_MAX - limit; + u32 start; + + if (limit >= CNT_MAX) + limit = CNT_MAX; + start = CNT_MAX - limit; writel_relaxed(start, EVCNTR(m, m->cntr[grp].idx)); m->cntr[grp].last_start = start;