Path: blob/master/drivers/cpufreq/cpufreq_governor_attr_set.c
26278 views
// SPDX-License-Identifier: GPL-2.0-only1/*2* Abstract code for CPUFreq governor tunable sysfs attributes.3*4* Copyright (C) 2016, Intel Corporation5* Author: Rafael J. Wysocki <[email protected]>6*/78#include "cpufreq_governor.h"910static inline struct governor_attr *to_gov_attr(struct attribute *attr)11{12return container_of(attr, struct governor_attr, attr);13}1415static ssize_t governor_show(struct kobject *kobj, struct attribute *attr,16char *buf)17{18struct governor_attr *gattr = to_gov_attr(attr);1920return gattr->show(to_gov_attr_set(kobj), buf);21}2223static ssize_t governor_store(struct kobject *kobj, struct attribute *attr,24const char *buf, size_t count)25{26struct gov_attr_set *attr_set = to_gov_attr_set(kobj);27struct governor_attr *gattr = to_gov_attr(attr);28int ret;2930mutex_lock(&attr_set->update_lock);31ret = attr_set->usage_count ? gattr->store(attr_set, buf, count) : -EBUSY;32mutex_unlock(&attr_set->update_lock);33return ret;34}3536const struct sysfs_ops governor_sysfs_ops = {37.show = governor_show,38.store = governor_store,39};40EXPORT_SYMBOL_GPL(governor_sysfs_ops);4142void gov_attr_set_init(struct gov_attr_set *attr_set, struct list_head *list_node)43{44INIT_LIST_HEAD(&attr_set->policy_list);45mutex_init(&attr_set->update_lock);46attr_set->usage_count = 1;47list_add(list_node, &attr_set->policy_list);48}49EXPORT_SYMBOL_GPL(gov_attr_set_init);5051void gov_attr_set_get(struct gov_attr_set *attr_set, struct list_head *list_node)52{53mutex_lock(&attr_set->update_lock);54attr_set->usage_count++;55list_add(list_node, &attr_set->policy_list);56mutex_unlock(&attr_set->update_lock);57}58EXPORT_SYMBOL_GPL(gov_attr_set_get);5960unsigned int gov_attr_set_put(struct gov_attr_set *attr_set, struct list_head *list_node)61{62unsigned int count;6364mutex_lock(&attr_set->update_lock);65list_del(list_node);66count = --attr_set->usage_count;67mutex_unlock(&attr_set->update_lock);68if (count)69return count;7071mutex_destroy(&attr_set->update_lock);72kobject_put(&attr_set->kobj);73return 0;74}75EXPORT_SYMBOL_GPL(gov_attr_set_put);767778