static LIST_HEAD(devfreq_list);
 static DEFINE_MUTEX(devfreq_list_lock);
 
+static const char timer_name[][DEVFREQ_NAME_LEN] = {
+       [DEVFREQ_TIMER_DEFERRABLE] = { "deferrable" },
+       [DEVFREQ_TIMER_DELAYED] = { "delayed" },
+};
+
 /**
  * find_device_devfreq() - find devfreq struct using device pointer
  * @dev:       device pointer used to lookup device devfreq.
        if (devfreq->governor->interrupt_driven)
                return;
 
-       INIT_DEFERRABLE_WORK(&devfreq->work, devfreq_monitor);
+       switch (devfreq->profile->timer) {
+       case DEVFREQ_TIMER_DEFERRABLE:
+               INIT_DEFERRABLE_WORK(&devfreq->work, devfreq_monitor);
+               break;
+       case DEVFREQ_TIMER_DELAYED:
+               INIT_DELAYED_WORK(&devfreq->work, devfreq_monitor);
+               break;
+       default:
+               return;
+       }
+
        if (devfreq->profile->polling_ms)
                queue_delayed_work(devfreq_wq, &devfreq->work,
                        msecs_to_jiffies(devfreq->profile->polling_ms));
        devfreq->data = data;
        devfreq->nb.notifier_call = devfreq_notifier_call;
 
+       if (devfreq->profile->timer < 0
+               || devfreq->profile->timer >= DEVFREQ_TIMER_NUM) {
+               goto err_out;
+       }
+
        if (!devfreq->profile->max_state && !devfreq->profile->freq_table) {
                mutex_unlock(&devfreq->lock);
                err = set_freq_table(devfreq);
 }
 static DEVICE_ATTR_RW(trans_stat);
 
+static ssize_t timer_show(struct device *dev,
+                            struct device_attribute *attr, char *buf)
+{
+       struct devfreq *df = to_devfreq(dev);
+
+       if (!df->profile)
+               return -EINVAL;
+
+       return sprintf(buf, "%s\n", timer_name[df->profile->timer]);
+}
+
+static ssize_t timer_store(struct device *dev, struct device_attribute *attr,
+                             const char *buf, size_t count)
+{
+       struct devfreq *df = to_devfreq(dev);
+       char str_timer[DEVFREQ_NAME_LEN + 1];
+       int timer = -1;
+       int ret = 0, i;
+
+       if (!df->governor || !df->profile)
+               return -EINVAL;
+
+       ret = sscanf(buf, "%16s", str_timer);
+       if (ret != 1)
+               return -EINVAL;
+
+       for (i = 0; i < DEVFREQ_TIMER_NUM; i++) {
+               if (!strncmp(timer_name[i], str_timer, DEVFREQ_NAME_LEN)) {
+                       timer = i;
+                       break;
+               }
+       }
+
+       if (timer < 0) {
+               ret = -EINVAL;
+               goto out;
+       }
+
+       if (df->profile->timer == timer) {
+               ret = 0;
+               goto out;
+       }
+
+       mutex_lock(&df->lock);
+       df->profile->timer = timer;
+       mutex_unlock(&df->lock);
+
+       ret = df->governor->event_handler(df, DEVFREQ_GOV_STOP, NULL);
+       if (ret) {
+               dev_warn(dev, "%s: Governor %s not stopped(%d)\n",
+                        __func__, df->governor->name, ret);
+               goto out;
+       }
+
+       ret = df->governor->event_handler(df, DEVFREQ_GOV_START, NULL);
+       if (ret)
+               dev_warn(dev, "%s: Governor %s not started(%d)\n",
+                        __func__, df->governor->name, ret);
+out:
+       return ret ? ret : count;
+}
+static DEVICE_ATTR_RW(timer);
+
 static struct attribute *devfreq_attrs[] = {
        &dev_attr_name.attr,
        &dev_attr_governor.attr,
        &dev_attr_min_freq.attr,
        &dev_attr_max_freq.attr,
        &dev_attr_trans_stat.attr,
+       &dev_attr_timer.attr,
        NULL,
 };
 ATTRIBUTE_GROUPS(devfreq);
 
 #define        DEVFREQ_PRECHANGE               (0)
 #define DEVFREQ_POSTCHANGE             (1)
 
+/* DEVFREQ work timers */
+enum devfreq_timer {
+       DEVFREQ_TIMER_DEFERRABLE = 0,
+       DEVFREQ_TIMER_DELAYED,
+       DEVFREQ_TIMER_NUM,
+};
+
 struct devfreq;
 struct devfreq_governor;
 
  * @initial_freq:      The operating frequency when devfreq_add_device() is
  *                     called.
  * @polling_ms:                The polling interval in ms. 0 disables polling.
+ * @timer:             Timer type is either deferrable or delayed timer.
  * @target:            The device should set its operating frequency at
  *                     freq or lowest-upper-than-freq value. If freq is
  *                     higher than any operable frequency, set maximum.
 struct devfreq_dev_profile {
        unsigned long initial_freq;
        unsigned int polling_ms;
+       enum devfreq_timer timer;
 
        int (*target)(struct device *dev, unsigned long *freq, u32 flags);
        int (*get_dev_status)(struct device *dev,