msm: clock-rpm: Support clock dependencies for enable/disable
In order to do this, we must fix up rpm_clk_enable() to properly
roll back RPM calls in the event of errors. Otherwise, the
dependency could be disabled while an RPM clock needing it is
still enabled.
Signed-off-by: Matt Wagantall <mattw@codeaurora.org>
diff --git a/arch/arm/mach-msm/clock-8960.c b/arch/arm/mach-msm/clock-8960.c
index 6411723..60bd42d 100644
--- a/arch/arm/mach-msm/clock-8960.c
+++ b/arch/arm/mach-msm/clock-8960.c
@@ -3393,14 +3393,14 @@
},
};
-DEFINE_CLK_RPM(afab_clk, afab_a_clk, APPS_FABRIC);
-DEFINE_CLK_RPM(cfpb_clk, cfpb_a_clk, CFPB);
-DEFINE_CLK_RPM(dfab_clk, dfab_a_clk, DAYTONA_FABRIC);
-DEFINE_CLK_RPM(ebi1_clk, ebi1_a_clk, EBI1);
-DEFINE_CLK_RPM(mmfab_clk, mmfab_a_clk, MM_FABRIC);
-DEFINE_CLK_RPM(mmfpb_clk, mmfpb_a_clk, MMFPB);
-DEFINE_CLK_RPM(sfab_clk, sfab_a_clk, SYSTEM_FABRIC);
-DEFINE_CLK_RPM(sfpb_clk, sfpb_a_clk, SFPB);
+DEFINE_CLK_RPM(afab_clk, afab_a_clk, APPS_FABRIC, NULL);
+DEFINE_CLK_RPM(cfpb_clk, cfpb_a_clk, CFPB, NULL);
+DEFINE_CLK_RPM(dfab_clk, dfab_a_clk, DAYTONA_FABRIC, NULL);
+DEFINE_CLK_RPM(ebi1_clk, ebi1_a_clk, EBI1, NULL);
+DEFINE_CLK_RPM(mmfab_clk, mmfab_a_clk, MM_FABRIC, NULL);
+DEFINE_CLK_RPM(mmfpb_clk, mmfpb_a_clk, MMFPB, NULL);
+DEFINE_CLK_RPM(sfab_clk, sfab_a_clk, SYSTEM_FABRIC, NULL);
+DEFINE_CLK_RPM(sfpb_clk, sfpb_a_clk, SFPB, NULL);
static DEFINE_CLK_VOTER(dfab_dsps_clk, &dfab_clk.c);
static DEFINE_CLK_VOTER(dfab_usb_hs_clk, &dfab_clk.c);
diff --git a/arch/arm/mach-msm/clock-8x60.c b/arch/arm/mach-msm/clock-8x60.c
index fe56dd9..a1bf439 100644
--- a/arch/arm/mach-msm/clock-8x60.c
+++ b/arch/arm/mach-msm/clock-8x60.c
@@ -3096,15 +3096,15 @@
},
};
-DEFINE_CLK_RPM(afab_clk, afab_a_clk, APPS_FABRIC);
-DEFINE_CLK_RPM(cfpb_clk, cfpb_a_clk, CFPB);
-DEFINE_CLK_RPM(dfab_clk, dfab_a_clk, DAYTONA_FABRIC);
-DEFINE_CLK_RPM(ebi1_clk, ebi1_a_clk, EBI1);
-DEFINE_CLK_RPM(mmfab_clk, mmfab_a_clk, MM_FABRIC);
-DEFINE_CLK_RPM(mmfpb_clk, mmfpb_a_clk, MMFPB);
-DEFINE_CLK_RPM(sfab_clk, sfab_a_clk, SYSTEM_FABRIC);
-DEFINE_CLK_RPM(sfpb_clk, sfpb_a_clk, SFPB);
-DEFINE_CLK_RPM(smi_clk, smi_a_clk, SMI);
+DEFINE_CLK_RPM(afab_clk, afab_a_clk, APPS_FABRIC, NULL);
+DEFINE_CLK_RPM(cfpb_clk, cfpb_a_clk, CFPB, NULL);
+DEFINE_CLK_RPM(dfab_clk, dfab_a_clk, DAYTONA_FABRIC, NULL);
+DEFINE_CLK_RPM(ebi1_clk, ebi1_a_clk, EBI1, NULL);
+DEFINE_CLK_RPM(mmfab_clk, mmfab_a_clk, MM_FABRIC, NULL);
+DEFINE_CLK_RPM(mmfpb_clk, mmfpb_a_clk, MMFPB, NULL);
+DEFINE_CLK_RPM(sfab_clk, sfab_a_clk, SYSTEM_FABRIC, NULL);
+DEFINE_CLK_RPM(sfpb_clk, sfpb_a_clk, SFPB, NULL);
+DEFINE_CLK_RPM(smi_clk, smi_a_clk, SMI, NULL);
static DEFINE_CLK_VOTER(dfab_dsps_clk, &dfab_clk.c);
static DEFINE_CLK_VOTER(dfab_usb_hs_clk, &dfab_clk.c);
diff --git a/arch/arm/mach-msm/clock-rpm.c b/arch/arm/mach-msm/clock-rpm.c
index 1326344..286b3d0 100644
--- a/arch/arm/mach-msm/clock-rpm.c
+++ b/arch/arm/mach-msm/clock-rpm.c
@@ -54,6 +54,11 @@
iv.value = max(this_sleep_khz, peer_sleep_khz);
rc = msm_rpmrs_set_noirq(MSM_RPM_CTX_SET_SLEEP, &iv, 1);
+ if (rc) {
+ iv.value = peer_khz;
+ msm_rpmrs_set_noirq(MSM_RPM_CTX_SET_0, &iv, 1);
+ }
+
out:
if (!rc)
r->enabled = true;
diff --git a/arch/arm/mach-msm/clock-rpm.h b/arch/arm/mach-msm/clock-rpm.h
index 3490143..0a99a6d 100644
--- a/arch/arm/mach-msm/clock-rpm.h
+++ b/arch/arm/mach-msm/clock-rpm.h
@@ -37,7 +37,7 @@
return container_of(clk, struct rpm_clk, c);
}
-#define DEFINE_CLK_RPM(name, active, r_id) \
+#define DEFINE_CLK_RPM(name, active, r_id, dep) \
static struct rpm_clk active; \
static struct rpm_clk name = { \
.rpm_clk_id = MSM_RPM_ID_##r_id##_CLK, \
@@ -48,6 +48,7 @@
.flags = CLKFLAG_SKIP_AUTO_OFF | CLKFLAG_MIN, \
.dbg_name = #name, \
CLK_INIT(name.c), \
+ .depends = dep, \
}, \
}; \
static struct rpm_clk active = { \
@@ -60,6 +61,7 @@
.flags = CLKFLAG_SKIP_AUTO_OFF | CLKFLAG_MIN, \
.dbg_name = #active, \
CLK_INIT(active.c), \
+ .depends = dep, \
}, \
};