msm: clock-local2: Modify halt check to account for NOC FSM handshake
When enabling certain branch clocks, there may be a handshake
performed with an FSM that indicates that the slave off of a
NOC is ready for traffic from that NOC. Modify the branch
clock halt checking to account for this additional handshake.
Note that only a few clocks have this requirement, and hence
the previously used halt check must still be preserved.
Change-Id: I0cdb454e5a89444e3ed9edadb88a7bc5a88c7a99
Signed-off-by: Vikram Mulukutla <markivx@codeaurora.org>
diff --git a/arch/arm/mach-msm/clock-local2.c b/arch/arm/mach-msm/clock-local2.c
index 23b4723..ef3ec3e 100644
--- a/arch/arm/mach-msm/clock-local2.c
+++ b/arch/arm/mach-msm/clock-local2.c
@@ -305,6 +305,11 @@
return _rcg_clk_handoff(to_rcg_clk(c), 0);
}
+#define BRANCH_CHECK_MASK BM(31, 28)
+#define BRANCH_ON_VAL BVAL(31, 28, 0x0)
+#define BRANCH_OFF_VAL BVAL(31, 28, 0x8)
+#define BRANCH_NOC_FSM_ON_VAL BVAL(31, 28, 0x2)
+
/*
* Branch clock functions
*/
@@ -326,15 +331,22 @@
udelay(HALT_CHECK_DELAY_US);
} else if (halt_check == HALT) {
int count;
+ u32 val;
for (count = HALT_CHECK_MAX_LOOPS; count > 0; count--) {
- if (br_status == BRANCH_ON
- && !(readl_relaxed(cbcr_reg)
- & CBCR_BRANCH_OFF_BIT))
- return;
- if (br_status == BRANCH_OFF
- && (readl_relaxed(cbcr_reg)
- & CBCR_BRANCH_OFF_BIT))
- return;
+ val = readl_relaxed(cbcr_reg);
+ val &= BRANCH_CHECK_MASK;
+ switch (br_status) {
+ case BRANCH_ON:
+ if (val == BRANCH_ON_VAL
+ || val == BRANCH_NOC_FSM_ON_VAL)
+ return;
+ break;
+
+ case BRANCH_OFF:
+ if (val == BRANCH_OFF_VAL)
+ return;
+ break;
+ };
udelay(1);
}
WARN(count == 0, "%s status stuck %s", clk_name, status_str);