From 20c5a70a258c5b8e0db5d964fb2915a180a88b25 Mon Sep 17 00:00:00 2001 From: Deepak Katragadda Date: Wed, 27 Jan 2016 16:48:14 -0800 Subject: [PATCH] clk: msm: clock-gpu-cobalt: Add the CRC programming sequence The clock ramp controller helps in mitigating PDN droop during low power use cases. Add the sequence to enable it in the clock driver. CRs-Fixed: 942848 Change-Id: Ia9afcd6492ddb38e3371a469c15ea07143c3c358 Signed-off-by: Deepak Katragadda --- arch/arm/boot/dts/qcom/msmcobalt.dtsi | 5 +++-- drivers/clk/msm/clock-gpu-cobalt.c | 26 ++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/arch/arm/boot/dts/qcom/msmcobalt.dtsi b/arch/arm/boot/dts/qcom/msmcobalt.dtsi index 29982f9cec24..c47682d8bf38 100644 --- a/arch/arm/boot/dts/qcom/msmcobalt.dtsi +++ b/arch/arm/boot/dts/qcom/msmcobalt.dtsi @@ -410,8 +410,9 @@ clock_gpu: qcom,gpucc@5065000 { compatible = "qcom,gpucc-cobalt"; - reg = <0x5065000 0x9000>; - reg-names = "cc_base"; + reg = <0x5065000 0x9000>, + <0x50660a0 0x8>; + reg-names = "cc_base", "crc_sid_fsm"; vdd_gpucc-supply = <&pm8005_s1>; vdd_dig-supply = <&pmcobalt_s1_level>; vdd_mx-supply = <&pmcobalt_s9_level>; diff --git a/drivers/clk/msm/clock-gpu-cobalt.c b/drivers/clk/msm/clock-gpu-cobalt.c index 5c8994463151..c1bf686474db 100644 --- a/drivers/clk/msm/clock-gpu-cobalt.c +++ b/drivers/clk/msm/clock-gpu-cobalt.c @@ -39,6 +39,8 @@ static void __iomem *virt_base; #define gpu_pll0_pll_out_even_source_val 1 #define gpu_pll0_pll_out_odd_source_val 2 +#define CRC_MND_CFG_OFFSET 0x4 + #define F(f, s, div, m, n) \ { \ .freq_hz = (f), \ @@ -393,6 +395,7 @@ int msm_gpucc_cobalt_probe(struct platform_device *pdev) { struct resource *res; struct device_node *of_node = pdev->dev.of_node; + void __iomem *crc_sid_fsm_ctrl; int rc; struct regulator *reg; u32 regval; @@ -410,6 +413,19 @@ int msm_gpucc_cobalt_probe(struct platform_device *pdev) return -ENOMEM; } + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "crc_sid_fsm"); + if (!res) { + dev_err(&pdev->dev, "Unable to retrieve crc_sid_fsm base\n"); + return -ENOMEM; + } + + crc_sid_fsm_ctrl = devm_ioremap(&pdev->dev, res->start, + resource_size(res)); + if (!crc_sid_fsm_ctrl) { + dev_err(&pdev->dev, "Failed to map crc_sid_fsm_ctrl\n"); + return -ENOMEM; + } + reg = vdd_dig.regulator[0] = devm_regulator_get(&pdev->dev, "vdd_dig"); if (IS_ERR(reg)) { if (PTR_ERR(reg) != -EPROBE_DEFER) @@ -484,6 +500,16 @@ int msm_gpucc_cobalt_probe(struct platform_device *pdev) */ clk_prepare_enable(&gpucc_cxo_clk.c); + /* CRC ENABLE SEQUENCE */ + clk_set_rate(&gpucc_gfx3d_clk.c, 650000000); + clk_prepare_enable(&gpucc_gfx3d_clk.c); + /* Enabling MND RC in Bypass mode */ + writel_relaxed(0x00015010, crc_sid_fsm_ctrl + CRC_MND_CFG_OFFSET); + writel_relaxed(0x00800000, crc_sid_fsm_ctrl); + /* Wait for 16 cycles before continuing */ + udelay(1); + clk_disable_unprepare(&gpucc_gfx3d_clk.c); + dev_info(&pdev->dev, "Registered GPU clocks\n"); return 0; }