drivers/cpufreq/cpufreq_userspace.c

Source file repositories/reference/linux-study-clean/drivers/cpufreq/cpufreq_userspace.c

File Facts

System
Linux kernel
Corpus path
drivers/cpufreq/cpufreq_userspace.c
Extension
.c
Size
4055 bytes
Lines
156
Domain
Driver Families
Bucket
drivers/cpufreq
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

struct userspace_policy {
	unsigned int is_managed;
	unsigned int setspeed;
	struct mutex mutex;
};

/**
 * cpufreq_set - set the CPU frequency
 * @policy: pointer to policy struct where freq is being set
 * @freq: target frequency in kHz
 *
 * Sets the CPU frequency to freq.
 */
static int cpufreq_set(struct cpufreq_policy *policy, unsigned int freq)
{
	int ret = -EINVAL;
	struct userspace_policy *userspace = policy->governor_data;

	pr_debug("cpufreq_set for cpu %u, freq %u kHz\n", policy->cpu, freq);

	mutex_lock(&userspace->mutex);
	if (!userspace->is_managed)
		goto err;

	userspace->setspeed = freq;

	ret = __cpufreq_driver_target(policy, freq, CPUFREQ_RELATION_L);
 err:
	mutex_unlock(&userspace->mutex);
	return ret;
}

static ssize_t show_speed(struct cpufreq_policy *policy, char *buf)
{
	struct userspace_policy *userspace = policy->governor_data;

	return sprintf(buf, "%u\n", userspace->setspeed);
}

static int cpufreq_userspace_policy_init(struct cpufreq_policy *policy)
{
	struct userspace_policy *userspace;

	userspace = kzalloc_obj(*userspace);
	if (!userspace)
		return -ENOMEM;

	mutex_init(&userspace->mutex);

	policy->governor_data = userspace;
	return 0;
}

/*
 * Any routine that writes to the policy struct will hold the "rwsem" of
 * policy struct that means it is free to free "governor_data" here.
 */
static void cpufreq_userspace_policy_exit(struct cpufreq_policy *policy)
{
	kfree(policy->governor_data);
	policy->governor_data = NULL;
}

static int cpufreq_userspace_policy_start(struct cpufreq_policy *policy)
{
	struct userspace_policy *userspace = policy->governor_data;

	BUG_ON(!policy->cur);
	pr_debug("started managing cpu %u\n", policy->cpu);

	mutex_lock(&userspace->mutex);
	userspace->is_managed = 1;
	userspace->setspeed = policy->cur;
	mutex_unlock(&userspace->mutex);
	return 0;
}

static void cpufreq_userspace_policy_stop(struct cpufreq_policy *policy)
{
	struct userspace_policy *userspace = policy->governor_data;

	pr_debug("managing cpu %u stopped\n", policy->cpu);

	mutex_lock(&userspace->mutex);
	userspace->is_managed = 0;
	userspace->setspeed = 0;
	mutex_unlock(&userspace->mutex);
}

static void cpufreq_userspace_policy_limits(struct cpufreq_policy *policy)

Annotation

Implementation Notes