msm: clock-8974: Add measurement-only clocks for CPUs and L2
The CPU and L2 clocks are not managed by the clock driver, but
are measurable using the clock driver's measurement hardware.
Add support for these measurement-only clocks.
Change-Id: Ia8ec54da3064d168f71ea863f60a34598cdc7a62
Signed-off-by: Matt Wagantall <mattw@codeaurora.org>
diff --git a/arch/arm/mach-msm/clock-8974.c b/arch/arm/mach-msm/clock-8974.c
index ad8ae6e..c0ee569 100644
--- a/arch/arm/mach-msm/clock-8974.c
+++ b/arch/arm/mach-msm/clock-8974.c
@@ -33,6 +33,7 @@
MMSS_BASE,
LPASS_BASE,
MSS_BASE,
+ APCS_BASE,
N_BASES,
};
@@ -42,6 +43,7 @@
#define MMSS_REG_BASE(x) (void __iomem *)(virt_bases[MMSS_BASE] + (x))
#define LPASS_REG_BASE(x) (void __iomem *)(virt_bases[LPASS_BASE] + (x))
#define MSS_REG_BASE(x) (void __iomem *)(virt_bases[MSS_BASE] + (x))
+#define APCS_REG_BASE(x) (void __iomem *)(virt_bases[APCS_BASE] + (x))
#define GPLL0_MODE_REG 0x0000
#define GPLL0_L_REG 0x0004
@@ -108,6 +110,8 @@
#define LPASS_LPA_PLL_VOTE_APPS_REG 0x2000
#define MSS_DEBUG_CLK_CTL_REG 0x0078
+#define GLB_CLK_DIAG_REG 0x001C
+
#define USB30_MASTER_CMD_RCGR 0x03D4
#define USB30_MOCK_UTMI_CMD_RCGR 0x03E8
#define USB_HSIC_SYSTEM_CMD_RCGR 0x041C
@@ -4347,6 +4351,12 @@
},
};
+static DEFINE_CLK_MEASURE(l2_m_clk);
+static DEFINE_CLK_MEASURE(krait0_m_clk);
+static DEFINE_CLK_MEASURE(krait1_m_clk);
+static DEFINE_CLK_MEASURE(krait2_m_clk);
+static DEFINE_CLK_MEASURE(krait3_m_clk);
+
#ifdef CONFIG_DEBUG_FS
struct measure_mux_entry {
@@ -4510,6 +4520,12 @@
{&mss_bus_q6_clk.c, MSS_BASE, 0x003c},
{&mss_xo_q6_clk.c, MSS_BASE, 0x0007},
+ {&l2_m_clk, APCS_BASE, 0x0081},
+ {&krait0_m_clk, APCS_BASE, 0x0080},
+ {&krait1_m_clk, APCS_BASE, 0x0088},
+ {&krait2_m_clk, APCS_BASE, 0x0090},
+ {&krait3_m_clk, APCS_BASE, 0x0098},
+
{&dummy_clk, N_BASES, 0x0000},
};
@@ -4574,6 +4590,13 @@
writel_relaxed(regval, MSS_REG_BASE(MSS_DEBUG_CLK_CTL_REG));
break;
+ case APCS_BASE:
+ clk->multiplier = 4;
+ clk_sel = 0x16A;
+ regval = measure_mux[i].debug_mux;
+ writel_relaxed(regval, APCS_REG_BASE(GLB_CLK_DIAG_REG));
+ break;
+
default:
return -EINVAL;
}
@@ -5045,6 +5068,12 @@
CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "coresight-etm1"),
CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "coresight-etm2"),
CLK_LOOKUP("core_a_clk", qdss_a_clk.c, "coresight-etm3"),
+
+ CLK_LOOKUP("l2_m_clk", l2_m_clk, ""),
+ CLK_LOOKUP("krait0_m_clk", krait0_m_clk, ""),
+ CLK_LOOKUP("krait1_m_clk", krait1_m_clk, ""),
+ CLK_LOOKUP("krait2_m_clk", krait2_m_clk, ""),
+ CLK_LOOKUP("krait3_m_clk", krait3_m_clk, ""),
};
static struct pll_config_regs gpll0_regs __initdata = {
@@ -5291,17 +5320,20 @@
audio_core_slimbus_core_clk_src.freq_tbl[0].freq_hz);
}
-#define GCC_CC_PHYS 0xFC400000
-#define GCC_CC_SIZE SZ_16K
+#define GCC_CC_PHYS 0xFC400000
+#define GCC_CC_SIZE SZ_16K
-#define MMSS_CC_PHYS 0xFD8C0000
-#define MMSS_CC_SIZE SZ_256K
+#define MMSS_CC_PHYS 0xFD8C0000
+#define MMSS_CC_SIZE SZ_256K
-#define LPASS_CC_PHYS 0xFE000000
-#define LPASS_CC_SIZE SZ_256K
+#define LPASS_CC_PHYS 0xFE000000
+#define LPASS_CC_SIZE SZ_256K
-#define MSS_CC_PHYS 0xFC980000
-#define MSS_CC_SIZE SZ_16K
+#define MSS_CC_PHYS 0xFC980000
+#define MSS_CC_SIZE SZ_16K
+
+#define APCS_GCC_CC_PHYS 0xF9011000
+#define APCS_GCC_CC_SIZE SZ_4K
static void __init msm8974_clock_pre_init(void)
{
@@ -5321,6 +5353,10 @@
if (!virt_bases[MSS_BASE])
panic("clock-8974: Unable to ioremap MSS_CC memory!");
+ virt_bases[APCS_BASE] = ioremap(APCS_GCC_CC_PHYS, APCS_GCC_CC_SIZE);
+ if (!virt_bases[APCS_BASE])
+ panic("clock-8974: Unable to ioremap APCS_GCC_CC memory!");
+
clk_ops_local_pll.enable = msm8974_pll_clk_enable;
vdd_dig_reg = rpm_regulator_get(NULL, "vdd_dig");