On 07/27/2017 04:10 AM, Abhishek Sahu wrote:
The current driver hardcodes the RCG2 register offsets. Some of
the RCG2âs use different offsets from the default one.
This patch adds the support to provide the register offsets array in
RCG2 clock node. If RCG2 clock node contains the register offsets
then this will be used instead of default one.
@@ -43,22 +41,34 @@
#define CFG_MODE_MASK (0x3 << CFG_MODE_SHIFT)
#define CFG_MODE_DUAL_EDGE (0x2 << CFG_MODE_SHIFT)
-#define M_REG 0x8
-#define N_REG 0xc
-#define D_REG 0x10
+#define rcg2_cmd(rcg, offsets) (rcg->cmd_rcgr)
+#define rcg2_cfg(rcg, offsets) (rcg->cmd_rcgr + offsets[CLK_RCG2_CFG])
+#define rcg2_m(rcg, offsets) (rcg->cmd_rcgr + offsets[CLK_RCG2_M])
+#define rcg2_n(rcg, offsets) (rcg->cmd_rcgr + offsets[CLK_RCG2_N])
+#define rcg2_d(rcg, offsets) (rcg->cmd_rcgr + offsets[CLK_RCG2_D])
+
+#define to_rcg2_offsets(rcg) (rcg->offsets ? \
+ rcg->offsets : rcg2_default_offsets)
enum freq_policy {
FLOOR,
CEIL,
};
+static const u8 rcg2_default_offsets[] = {
+ [CLK_RCG2_CFG] = 0x4,
+ [CLK_RCG2_M] = 0x8,
+ [CLK_RCG2_N] = 0xc,
+ [CLK_RCG2_D] = 0x10,
+};
It looks like the two UBI clks that messed this up don't have an MN
counter, so instead of doing this maddness, just add a flag like
m_is_cfg and then make a rcg2_crmd() function that checks this flag and
returns cmd_rcg + CFG_REG or cmd_rgcr + M_REG depending on the flag. We
can also optimize further, and ifdef this whole branch out unless the
specific IPQ GCC driver is enabled. Also only update the generic RCG
code, and not the display/gpu specific ones. Then the diff is much
smaller, and we can go yell at hardware team to never do this again.