2 * linux/drivers/devfreq/governor_simpleondemand.c
4 * Copyright (C) 2011 Samsung Electronics
5 * MyungJoo Ham <myungjoo.ham@samsung.com>
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
12 #include <linux/slab.h>
13 #include <linux/device.h>
14 #include <linux/devfreq.h>
16 #include <linux/mutex.h>
19 struct userspace_data
{
20 unsigned long user_frequency
;
24 static int devfreq_userspace_func(struct devfreq
*df
, unsigned long *freq
)
26 struct userspace_data
*data
= df
->data
;
29 *freq
= df
->previous_freq
; /* No user freq specified yet */
31 *freq
= data
->user_frequency
;
35 static ssize_t
store_freq(struct device
*dev
, struct device_attribute
*attr
,
36 const char *buf
, size_t count
)
38 struct devfreq
*devfreq
= to_devfreq(dev
);
39 struct userspace_data
*data
;
44 mutex_lock(&devfreq
->lock
);
47 sscanf(buf
, "%lu", &wanted
);
48 data
->user_frequency
= wanted
;
50 err
= update_devfreq(devfreq
);
53 mutex_unlock(&devfreq
->lock
);
57 static ssize_t
show_freq(struct device
*dev
, struct device_attribute
*attr
,
60 struct devfreq
*devfreq
= to_devfreq(dev
);
61 struct userspace_data
*data
;
64 mutex_lock(&devfreq
->lock
);
68 err
= sprintf(buf
, "%lu\n", data
->user_frequency
);
70 err
= sprintf(buf
, "undefined\n");
71 mutex_unlock(&devfreq
->lock
);
75 static DEVICE_ATTR(set_freq
, 0644, show_freq
, store_freq
);
76 static struct attribute
*dev_entries
[] = {
77 &dev_attr_set_freq
.attr
,
80 static struct attribute_group dev_attr_group
= {
85 static int userspace_init(struct devfreq
*devfreq
)
88 struct userspace_data
*data
= kzalloc(sizeof(struct userspace_data
),
98 err
= sysfs_create_group(&devfreq
->dev
.kobj
, &dev_attr_group
);
103 static void userspace_exit(struct devfreq
*devfreq
)
105 sysfs_remove_group(&devfreq
->dev
.kobj
, &dev_attr_group
);
106 kfree(devfreq
->data
);
107 devfreq
->data
= NULL
;
110 const struct devfreq_governor devfreq_userspace
= {
112 .get_target_freq
= devfreq_userspace_func
,
113 .init
= userspace_init
,
114 .exit
= userspace_exit
,
115 .no_central_polling
= true,