msm: kgsl: Add functions for enabling / disabling a powerscale policy

Sometimes you want to enable or disable a policy for a bit without
actually swapping out the policy.  These functions allow the kernel
to control the policy functionality.

Change-Id: Ic0dedbad4406e5fffe1ebd8e8ba4e6bf84d82203
Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>
diff --git a/drivers/gpu/msm/kgsl_pwrscale.c b/drivers/gpu/msm/kgsl_pwrscale.c
index ddc641d..b2b3071 100644
--- a/drivers/gpu/msm/kgsl_pwrscale.c
+++ b/drivers/gpu/msm/kgsl_pwrscale.c
@@ -84,10 +84,14 @@
 {
 	int ret;
 
-	if (device->pwrscale.policy)
-		ret = snprintf(buf, PAGE_SIZE, "%s\n",
+	if (device->pwrscale.policy) {
+		ret = snprintf(buf, PAGE_SIZE, "%s",
 			       device->pwrscale.policy->name);
-	else
+		if (device->pwrscale.enabled == 0)
+			ret += snprintf(buf + ret, PAGE_SIZE - ret,
+				" (disabled)");
+		ret += snprintf(buf + ret, PAGE_SIZE - ret, "\n");
+	} else
 		ret = snprintf(buf, PAGE_SIZE, "none\n");
 
 	return ret;
@@ -210,23 +214,26 @@
 	.release = pwrscale_sysfs_release
 };
 
+#define PWRSCALE_ACTIVE(_d) \
+	((_d)->pwrscale.policy && (_d)->pwrscale.enabled)
+
 void kgsl_pwrscale_sleep(struct kgsl_device *device)
 {
-	if (device->pwrscale.policy && device->pwrscale.policy->sleep)
+	if (PWRSCALE_ACTIVE(device) && device->pwrscale.policy->sleep)
 		device->pwrscale.policy->sleep(device, &device->pwrscale);
 }
 EXPORT_SYMBOL(kgsl_pwrscale_sleep);
 
 void kgsl_pwrscale_wake(struct kgsl_device *device)
 {
-	if (device->pwrscale.policy && device->pwrscale.policy->wake)
+	if (PWRSCALE_ACTIVE(device) && device->pwrscale.policy->wake)
 		device->pwrscale.policy->wake(device, &device->pwrscale);
 }
 EXPORT_SYMBOL(kgsl_pwrscale_wake);
 
 void kgsl_pwrscale_busy(struct kgsl_device *device)
 {
-	if (device->pwrscale.policy && device->pwrscale.policy->busy)
+	if (PWRSCALE_ACTIVE(device) && device->pwrscale.policy->busy)
 		if ((!device->pwrscale.gpu_busy) &&
 			(device->requested_state != KGSL_STATE_SLUMBER))
 			device->pwrscale.policy->busy(device,
@@ -236,7 +243,7 @@
 
 void kgsl_pwrscale_idle(struct kgsl_device *device)
 {
-	if (device->pwrscale.policy && device->pwrscale.policy->idle)
+	if (PWRSCALE_ACTIVE(device) && device->pwrscale.policy->idle)
 		if (device->requested_state !=
 			(KGSL_STATE_SLUMBER | KGSL_STATE_SLEEP))
 			device->pwrscale.policy->idle(device,
@@ -245,6 +252,18 @@
 }
 EXPORT_SYMBOL(kgsl_pwrscale_idle);
 
+void kgsl_pwrscale_disable(struct kgsl_device *device)
+{
+	device->pwrscale.enabled = 0;
+}
+EXPORT_SYMBOL(kgsl_pwrscale_disable);
+
+void kgsl_pwrscale_enable(struct kgsl_device *device)
+{
+	device->pwrscale.enabled = 1;
+}
+EXPORT_SYMBOL(kgsl_pwrscale_enable);
+
 int kgsl_pwrscale_policy_add_files(struct kgsl_device *device,
 				   struct kgsl_pwrscale *pwrscale,
 				   struct attribute_group *attr_group)
@@ -314,6 +333,9 @@
 
 	device->pwrscale.policy = policy;
 
+	/* Pwrscale is enabled by default at attach time */
+	kgsl_pwrscale_enable(device);
+
 	if (policy) {
 		ret = device->pwrscale.policy->init(device, &device->pwrscale);
 		if (ret)