The era of hand-rolled HIWORD_UPDATE macros is over, at least for those
drivers that use constant masks.

Like many other Rockchip drivers, rockchip-dfi brings with it its own
HIWORD_UPDATE macro. This variant doesn't shift the value (and like the
others, doesn't do any checking).

Remove it, and replace instances of it with hw_bitfield.h's
FIELD_PREP_WM16.  Since FIELD_PREP_WM16 requires contiguous masks and
shifts the value for us, some reshuffling of definitions needs to
happen.

This gives us better compile-time error checking, and in my opinion,
nicer code.

Tested on an RK3568 ODROID-M1 board, and an RK3588 ROCK 5B board.

Signed-off-by: Nicolas Frattaroli <nicolas.frattar...@collabora.com>
---
 drivers/devfreq/event/rockchip-dfi.c | 27 +++++++++++++--------------
 1 file changed, 13 insertions(+), 14 deletions(-)

diff --git a/drivers/devfreq/event/rockchip-dfi.c 
b/drivers/devfreq/event/rockchip-dfi.c
index 
54effb63519653d20b40eed88681330983399a77..7ba68b7b7ebe37bef71b6f78abc88e117330d8fc
 100644
--- a/drivers/devfreq/event/rockchip-dfi.c
+++ b/drivers/devfreq/event/rockchip-dfi.c
@@ -20,6 +20,7 @@
 #include <linux/of.h>
 #include <linux/of_device.h>
 #include <linux/bitfield.h>
+#include <linux/hw_bitfield.h>
 #include <linux/bits.h>
 #include <linux/perf_event.h>
 
@@ -30,8 +31,6 @@
 
 #define DMC_MAX_CHANNELS       4
 
-#define HIWORD_UPDATE(val, mask)       ((val) | (mask) << 16)
-
 /* DDRMON_CTRL */
 #define DDRMON_CTRL    0x04
 #define DDRMON_CTRL_DDR4               BIT(5)
@@ -40,9 +39,6 @@
 #define DDRMON_CTRL_LPDDR23            BIT(2)
 #define DDRMON_CTRL_SOFTWARE_EN                BIT(1)
 #define DDRMON_CTRL_TIMER_CNT_EN       BIT(0)
-#define DDRMON_CTRL_DDR_TYPE_MASK      (DDRMON_CTRL_DDR4 | \
-                                        DDRMON_CTRL_LPDDR4 | \
-                                        DDRMON_CTRL_LPDDR23)
 
 #define DDRMON_CH0_WR_NUM              0x20
 #define DDRMON_CH0_RD_NUM              0x24
@@ -143,29 +139,32 @@ static int rockchip_dfi_enable(struct rockchip_dfi *dfi)
                        continue;
 
                /* clear DDRMON_CTRL setting */
-               writel_relaxed(HIWORD_UPDATE(0, DDRMON_CTRL_TIMER_CNT_EN |
-                              DDRMON_CTRL_SOFTWARE_EN | 
DDRMON_CTRL_HARDWARE_EN),
+               writel_relaxed(FIELD_PREP_WM16(DDRMON_CTRL_TIMER_CNT_EN, 0) |
+                              FIELD_PREP_WM16(DDRMON_CTRL_SOFTWARE_EN, 0) |
+                              FIELD_PREP_WM16(DDRMON_CTRL_HARDWARE_EN, 0),
                               dfi_regs + i * dfi->ddrmon_stride + DDRMON_CTRL);
 
                /* set ddr type to dfi */
                switch (dfi->ddr_type) {
                case ROCKCHIP_DDRTYPE_LPDDR2:
                case ROCKCHIP_DDRTYPE_LPDDR3:
-                       ctrl = DDRMON_CTRL_LPDDR23;
+                       ctrl = FIELD_PREP_WM16(DDRMON_CTRL_LPDDR23, 1) |
+                              FIELD_PREP_WM16(DDRMON_CTRL_LPDDR4, 0);
                        break;
                case ROCKCHIP_DDRTYPE_LPDDR4:
                case ROCKCHIP_DDRTYPE_LPDDR4X:
-                       ctrl = DDRMON_CTRL_LPDDR4;
+                       ctrl = FIELD_PREP_WM16(DDRMON_CTRL_LPDDR23, 0) |
+                              FIELD_PREP_WM16(DDRMON_CTRL_LPDDR4, 1);
                        break;
                default:
                        break;
                }
 
-               writel_relaxed(HIWORD_UPDATE(ctrl, DDRMON_CTRL_DDR_TYPE_MASK),
-                              dfi_regs + i * dfi->ddrmon_stride + DDRMON_CTRL);
+               writel_relaxed(ctrl, dfi_regs + i * dfi->ddrmon_stride +
+                              DDRMON_CTRL);
 
                /* enable count, use software mode */
-               writel_relaxed(HIWORD_UPDATE(DDRMON_CTRL_SOFTWARE_EN, 
DDRMON_CTRL_SOFTWARE_EN),
+               writel_relaxed(FIELD_PREP_WM16(DDRMON_CTRL_SOFTWARE_EN, 1),
                               dfi_regs + i * dfi->ddrmon_stride + DDRMON_CTRL);
 
                if (dfi->ddrmon_ctrl_single)
@@ -195,8 +194,8 @@ static void rockchip_dfi_disable(struct rockchip_dfi *dfi)
                if (!(dfi->channel_mask & BIT(i)))
                        continue;
 
-               writel_relaxed(HIWORD_UPDATE(0, DDRMON_CTRL_SOFTWARE_EN),
-                             dfi_regs + i * dfi->ddrmon_stride + DDRMON_CTRL);
+               writel_relaxed(FIELD_PREP_WM16(DDRMON_CTRL_SOFTWARE_EN, 0),
+                              dfi_regs + i * dfi->ddrmon_stride + DDRMON_CTRL);
 
                if (dfi->ddrmon_ctrl_single)
                        break;

-- 
2.50.0

Reply via email to