Loading drivers/devfreq/devfreq.c +36 −14 Original line number Diff line number Diff line Loading @@ -542,7 +542,7 @@ static void devfreq_dev_release(struct device *dev) devfreq->profile->exit(devfreq->dev.parent); mutex_destroy(&devfreq->lock); mutex_destroy(&devfreq->sysfs_lock); mutex_destroy(&devfreq->event_lock); kfree(devfreq); } Loading Loading @@ -585,7 +585,7 @@ struct devfreq *devfreq_add_device(struct device *dev, } mutex_init(&devfreq->lock); mutex_init(&devfreq->sysfs_lock); mutex_init(&devfreq->event_lock); mutex_lock(&devfreq->lock); devfreq->dev.parent = dev; devfreq->dev.class = devfreq_class; Loading @@ -596,6 +596,7 @@ struct devfreq *devfreq_add_device(struct device *dev, devfreq->last_status.current_frequency = profile->initial_freq; devfreq->data = data; devfreq->nb.notifier_call = devfreq_notifier_call; devfreq->dev_suspended = false; if (!devfreq->profile->max_state && !devfreq->profile->freq_table) { mutex_unlock(&devfreq->lock); Loading Loading @@ -817,14 +818,23 @@ EXPORT_SYMBOL(devm_devfreq_remove_device); */ int devfreq_suspend_device(struct devfreq *devfreq) { int ret; if (!devfreq) return -EINVAL; if (!devfreq->governor) mutex_lock(&devfreq->event_lock); if (!devfreq->governor || devfreq->dev_suspended) { mutex_unlock(&devfreq->event_lock); return 0; } return devfreq->governor->event_handler(devfreq, ret = devfreq->governor->event_handler(devfreq, DEVFREQ_GOV_SUSPEND, NULL); if (!ret) devfreq->dev_suspended = true; mutex_unlock(&devfreq->event_lock); return ret; } EXPORT_SYMBOL(devfreq_suspend_device); Loading @@ -838,14 +848,22 @@ EXPORT_SYMBOL(devfreq_suspend_device); */ int devfreq_resume_device(struct devfreq *devfreq) { int ret; if (!devfreq) return -EINVAL; if (!devfreq->governor) mutex_lock(&devfreq->event_lock); if (!devfreq->governor) { mutex_unlock(&devfreq->event_lock); return 0; } return devfreq->governor->event_handler(devfreq, ret = devfreq->governor->event_handler(devfreq, DEVFREQ_GOV_RESUME, NULL); if (!ret) devfreq->dev_suspended = false; mutex_unlock(&devfreq->event_lock); return ret; } EXPORT_SYMBOL(devfreq_resume_device); Loading Loading @@ -1005,7 +1023,11 @@ static ssize_t governor_store(struct device *dev, struct device_attribute *attr, goto out; } mutex_lock(&df->sysfs_lock); mutex_lock(&df->event_lock); if (df->dev_suspended) { ret = -EINVAL; goto gov_stop_out; } if (df->governor) { ret = df->governor->event_handler(df, DEVFREQ_GOV_STOP, NULL); if (ret) { Loading @@ -1031,7 +1053,7 @@ static ssize_t governor_store(struct device *dev, struct device_attribute *attr, } gov_stop_out: mutex_unlock(&df->sysfs_lock); mutex_unlock(&df->event_lock); out: mutex_unlock(&devfreq_list_lock); Loading Loading @@ -1126,10 +1148,10 @@ static ssize_t polling_interval_store(struct device *dev, if (ret != 1) return -EINVAL; mutex_lock(&df->sysfs_lock); mutex_lock(&df->event_lock); df->governor->event_handler(df, DEVFREQ_GOV_INTERVAL, &value); ret = count; mutex_unlock(&df->sysfs_lock); mutex_unlock(&df->event_lock); return ret; } Loading @@ -1147,7 +1169,7 @@ static ssize_t min_freq_store(struct device *dev, struct device_attribute *attr, if (ret != 1) return -EINVAL; mutex_lock(&df->sysfs_lock); mutex_lock(&df->event_lock); mutex_lock(&df->lock); max = df->max_freq; if (value && max && value > max) { Loading @@ -1160,7 +1182,7 @@ static ssize_t min_freq_store(struct device *dev, struct device_attribute *attr, ret = count; unlock: mutex_unlock(&df->lock); mutex_unlock(&df->sysfs_lock); mutex_unlock(&df->event_lock); return ret; } Loading @@ -1184,7 +1206,7 @@ static ssize_t max_freq_store(struct device *dev, struct device_attribute *attr, if (ret != 1) return -EINVAL; mutex_lock(&df->sysfs_lock); mutex_lock(&df->event_lock); mutex_lock(&df->lock); min = df->min_freq; if (value && min && value < min) { Loading @@ -1197,7 +1219,7 @@ static ssize_t max_freq_store(struct device *dev, struct device_attribute *attr, ret = count; unlock: mutex_unlock(&df->lock); mutex_unlock(&df->sysfs_lock); mutex_unlock(&df->event_lock); return ret; } static DEVICE_ATTR_RW(min_freq); Loading drivers/devfreq/governor_memlat.c +1 −1 Original line number Diff line number Diff line Loading @@ -315,7 +315,7 @@ static int devfreq_memlat_get_freq(struct devfreq *df, return 0; } gov_attr(ratio_ceil, 1U, 10000U); gov_attr(ratio_ceil, 1U, 20000U); gov_attr(stall_floor, 0U, 100U); static struct attribute *memlat_dev_attr[] = { Loading drivers/devfreq/governor_simpleondemand.c +2 −1 Original line number Diff line number Diff line Loading @@ -57,7 +57,8 @@ static int devfreq_simple_ondemand_func(struct devfreq *df, stat->total_time * dfso_upthreshold) *freq = max; else if (stat->busy_time * 100 < stat->total_time * dfso_downdifferential) stat->total_time * (dfso_upthreshold - dfso_downdifferential)) *freq = min; else *freq = df->previous_freq; Loading include/linux/devfreq.h +2 −1 Original line number Diff line number Diff line Loading @@ -149,7 +149,7 @@ struct devfreq { struct list_head node; struct mutex lock; struct mutex sysfs_lock; struct mutex event_lock; struct device dev; struct devfreq_dev_profile *profile; const struct devfreq_governor *governor; Loading @@ -175,6 +175,7 @@ struct devfreq { unsigned long last_stat_updated; struct srcu_notifier_head transition_notifier_list; bool dev_suspended; }; struct devfreq_freqs { Loading Loading
drivers/devfreq/devfreq.c +36 −14 Original line number Diff line number Diff line Loading @@ -542,7 +542,7 @@ static void devfreq_dev_release(struct device *dev) devfreq->profile->exit(devfreq->dev.parent); mutex_destroy(&devfreq->lock); mutex_destroy(&devfreq->sysfs_lock); mutex_destroy(&devfreq->event_lock); kfree(devfreq); } Loading Loading @@ -585,7 +585,7 @@ struct devfreq *devfreq_add_device(struct device *dev, } mutex_init(&devfreq->lock); mutex_init(&devfreq->sysfs_lock); mutex_init(&devfreq->event_lock); mutex_lock(&devfreq->lock); devfreq->dev.parent = dev; devfreq->dev.class = devfreq_class; Loading @@ -596,6 +596,7 @@ struct devfreq *devfreq_add_device(struct device *dev, devfreq->last_status.current_frequency = profile->initial_freq; devfreq->data = data; devfreq->nb.notifier_call = devfreq_notifier_call; devfreq->dev_suspended = false; if (!devfreq->profile->max_state && !devfreq->profile->freq_table) { mutex_unlock(&devfreq->lock); Loading Loading @@ -817,14 +818,23 @@ EXPORT_SYMBOL(devm_devfreq_remove_device); */ int devfreq_suspend_device(struct devfreq *devfreq) { int ret; if (!devfreq) return -EINVAL; if (!devfreq->governor) mutex_lock(&devfreq->event_lock); if (!devfreq->governor || devfreq->dev_suspended) { mutex_unlock(&devfreq->event_lock); return 0; } return devfreq->governor->event_handler(devfreq, ret = devfreq->governor->event_handler(devfreq, DEVFREQ_GOV_SUSPEND, NULL); if (!ret) devfreq->dev_suspended = true; mutex_unlock(&devfreq->event_lock); return ret; } EXPORT_SYMBOL(devfreq_suspend_device); Loading @@ -838,14 +848,22 @@ EXPORT_SYMBOL(devfreq_suspend_device); */ int devfreq_resume_device(struct devfreq *devfreq) { int ret; if (!devfreq) return -EINVAL; if (!devfreq->governor) mutex_lock(&devfreq->event_lock); if (!devfreq->governor) { mutex_unlock(&devfreq->event_lock); return 0; } return devfreq->governor->event_handler(devfreq, ret = devfreq->governor->event_handler(devfreq, DEVFREQ_GOV_RESUME, NULL); if (!ret) devfreq->dev_suspended = false; mutex_unlock(&devfreq->event_lock); return ret; } EXPORT_SYMBOL(devfreq_resume_device); Loading Loading @@ -1005,7 +1023,11 @@ static ssize_t governor_store(struct device *dev, struct device_attribute *attr, goto out; } mutex_lock(&df->sysfs_lock); mutex_lock(&df->event_lock); if (df->dev_suspended) { ret = -EINVAL; goto gov_stop_out; } if (df->governor) { ret = df->governor->event_handler(df, DEVFREQ_GOV_STOP, NULL); if (ret) { Loading @@ -1031,7 +1053,7 @@ static ssize_t governor_store(struct device *dev, struct device_attribute *attr, } gov_stop_out: mutex_unlock(&df->sysfs_lock); mutex_unlock(&df->event_lock); out: mutex_unlock(&devfreq_list_lock); Loading Loading @@ -1126,10 +1148,10 @@ static ssize_t polling_interval_store(struct device *dev, if (ret != 1) return -EINVAL; mutex_lock(&df->sysfs_lock); mutex_lock(&df->event_lock); df->governor->event_handler(df, DEVFREQ_GOV_INTERVAL, &value); ret = count; mutex_unlock(&df->sysfs_lock); mutex_unlock(&df->event_lock); return ret; } Loading @@ -1147,7 +1169,7 @@ static ssize_t min_freq_store(struct device *dev, struct device_attribute *attr, if (ret != 1) return -EINVAL; mutex_lock(&df->sysfs_lock); mutex_lock(&df->event_lock); mutex_lock(&df->lock); max = df->max_freq; if (value && max && value > max) { Loading @@ -1160,7 +1182,7 @@ static ssize_t min_freq_store(struct device *dev, struct device_attribute *attr, ret = count; unlock: mutex_unlock(&df->lock); mutex_unlock(&df->sysfs_lock); mutex_unlock(&df->event_lock); return ret; } Loading @@ -1184,7 +1206,7 @@ static ssize_t max_freq_store(struct device *dev, struct device_attribute *attr, if (ret != 1) return -EINVAL; mutex_lock(&df->sysfs_lock); mutex_lock(&df->event_lock); mutex_lock(&df->lock); min = df->min_freq; if (value && min && value < min) { Loading @@ -1197,7 +1219,7 @@ static ssize_t max_freq_store(struct device *dev, struct device_attribute *attr, ret = count; unlock: mutex_unlock(&df->lock); mutex_unlock(&df->sysfs_lock); mutex_unlock(&df->event_lock); return ret; } static DEVICE_ATTR_RW(min_freq); Loading
drivers/devfreq/governor_memlat.c +1 −1 Original line number Diff line number Diff line Loading @@ -315,7 +315,7 @@ static int devfreq_memlat_get_freq(struct devfreq *df, return 0; } gov_attr(ratio_ceil, 1U, 10000U); gov_attr(ratio_ceil, 1U, 20000U); gov_attr(stall_floor, 0U, 100U); static struct attribute *memlat_dev_attr[] = { Loading
drivers/devfreq/governor_simpleondemand.c +2 −1 Original line number Diff line number Diff line Loading @@ -57,7 +57,8 @@ static int devfreq_simple_ondemand_func(struct devfreq *df, stat->total_time * dfso_upthreshold) *freq = max; else if (stat->busy_time * 100 < stat->total_time * dfso_downdifferential) stat->total_time * (dfso_upthreshold - dfso_downdifferential)) *freq = min; else *freq = df->previous_freq; Loading
include/linux/devfreq.h +2 −1 Original line number Diff line number Diff line Loading @@ -149,7 +149,7 @@ struct devfreq { struct list_head node; struct mutex lock; struct mutex sysfs_lock; struct mutex event_lock; struct device dev; struct devfreq_dev_profile *profile; const struct devfreq_governor *governor; Loading @@ -175,6 +175,7 @@ struct devfreq { unsigned long last_stat_updated; struct srcu_notifier_head transition_notifier_list; bool dev_suspended; }; struct devfreq_freqs { Loading