]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
PM / devfreq: Add suspend and resume apis
authorRajagopal Venkat <rajagopal.venkat@linaro.org>
Wed, 24 Oct 2012 00:38:02 +0000 (02:38 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 24 Oct 2012 00:38:02 +0000 (02:38 +0200)
Add devfreq suspend/resume apis for devfreq users. This patch
supports suspend and resume of devfreq load monitoring, required
for devices which can idle.

Signed-off-by: Rajagopal Venkat <rajagopal.venkat@linaro.org>
Acked-by: MyungJoo Ham <myungjoo.ham@samsung.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/devfreq/devfreq.c
drivers/devfreq/governor.h
drivers/devfreq/governor_simpleondemand.c
include/linux/devfreq.h

index 41a4099096c87bc699788f7f21196c0673f34d0d..63e075eab8af364a9dc4eaf99d5a92a159d9bfba 100644 (file)
@@ -428,6 +428,34 @@ int devfreq_remove_device(struct devfreq *devfreq)
 }
 EXPORT_SYMBOL(devfreq_remove_device);
 
+/**
+ * devfreq_suspend_device() - Suspend devfreq of a device.
+ * @devfreq    the devfreq instance to be suspended
+ */
+int devfreq_suspend_device(struct devfreq *devfreq)
+{
+       if (!devfreq)
+               return -EINVAL;
+
+       return devfreq->governor->event_handler(devfreq,
+                               DEVFREQ_GOV_SUSPEND, NULL);
+}
+EXPORT_SYMBOL(devfreq_suspend_device);
+
+/**
+ * devfreq_resume_device() - Resume devfreq of a device.
+ * @devfreq    the devfreq instance to be resumed
+ */
+int devfreq_resume_device(struct devfreq *devfreq)
+{
+       if (!devfreq)
+               return -EINVAL;
+
+       return devfreq->governor->event_handler(devfreq,
+                               DEVFREQ_GOV_RESUME, NULL);
+}
+EXPORT_SYMBOL(devfreq_resume_device);
+
 static ssize_t show_governor(struct device *dev,
                             struct device_attribute *attr, char *buf)
 {
index bb3aff32d62770607ea460a342b469c5d3f428df..26432ac0a398f069c747a16cda78e6241ac7cfc3 100644 (file)
@@ -22,6 +22,8 @@
 #define DEVFREQ_GOV_START                      0x1
 #define DEVFREQ_GOV_STOP                       0x2
 #define DEVFREQ_GOV_INTERVAL                   0x3
+#define DEVFREQ_GOV_SUSPEND                    0x4
+#define DEVFREQ_GOV_RESUME                     0x5
 
 /* Caution: devfreq->lock must be locked before calling update_devfreq */
 extern int update_devfreq(struct devfreq *devfreq);
index 3716a659122bdfabbc3f6a06ed30e6b55c4fd0c4..b5cf0fb24efeb4d15ed762bf6df5a28a49bfc73b 100644 (file)
@@ -104,6 +104,15 @@ static int devfreq_simple_ondemand_handler(struct devfreq *devfreq,
        case DEVFREQ_GOV_INTERVAL:
                devfreq_interval_update(devfreq, (unsigned int *)data);
                break;
+
+       case DEVFREQ_GOV_SUSPEND:
+               devfreq_monitor_suspend(devfreq);
+               break;
+
+       case DEVFREQ_GOV_RESUME:
+               devfreq_monitor_resume(devfreq);
+               break;
+
        default:
                break;
        }
index 9cdffde74bb50e5d5cc9ae97fa09da23f32cecad..ee243a3229b8042dc79e5f56e5d459ce9a06f3b5 100644 (file)
@@ -158,6 +158,8 @@ extern struct devfreq *devfreq_add_device(struct device *dev,
                                  const struct devfreq_governor *governor,
                                  void *data);
 extern int devfreq_remove_device(struct devfreq *devfreq);
+extern int devfreq_suspend_device(struct devfreq *devfreq);
+extern int devfreq_resume_device(struct devfreq *devfreq);
 
 /* Helper functions for devfreq user device driver with OPP. */
 extern struct opp *devfreq_recommended_opp(struct device *dev,
@@ -211,6 +213,16 @@ static int devfreq_remove_device(struct devfreq *devfreq)
        return 0;
 }
 
+static int devfreq_suspend_device(struct devfreq *devfreq)
+{
+       return 0;
+}
+
+static int devfreq_resume_device(struct devfreq *devfreq)
+{
+       return 0;
+}
+
 static struct opp *devfreq_recommended_opp(struct device *dev,
                                           unsigned long *freq, u32 flags)
 {