Commit | Line | Data |
---|---|---|
d2912cb1 | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
a3c98b8b MH |
2 | /* |
3 | * governor.h - internal header for devfreq governors. | |
4 | * | |
5 | * Copyright (C) 2011 Samsung Electronics | |
6 | * MyungJoo Ham <myungjoo.ham@samsung.com> | |
7 | * | |
a3c98b8b MH |
8 | * This header is for devfreq governors in drivers/devfreq/ |
9 | */ | |
10 | ||
11 | #ifndef _GOVERNOR_H | |
12 | #define _GOVERNOR_H | |
13 | ||
14 | #include <linux/devfreq.h> | |
15 | ||
96ffcdf2 CC |
16 | #define DEVFREQ_NAME_LEN 16 |
17 | ||
a3c98b8b MH |
18 | #define to_devfreq(DEV) container_of((DEV), struct devfreq, dev) |
19 | ||
7e6fdd4b RV |
20 | /* Devfreq events */ |
21 | #define DEVFREQ_GOV_START 0x1 | |
22 | #define DEVFREQ_GOV_STOP 0x2 | |
3a1ec2e8 | 23 | #define DEVFREQ_GOV_UPDATE_INTERVAL 0x3 |
206c30cf RV |
24 | #define DEVFREQ_GOV_SUSPEND 0x4 |
25 | #define DEVFREQ_GOV_RESUME 0x5 | |
7e6fdd4b | 26 | |
6ff66e2a MK |
27 | #define DEVFREQ_MIN_FREQ 0 |
28 | #define DEVFREQ_MAX_FREQ ULONG_MAX | |
29 | ||
0dd25a0d CC |
30 | /* |
31 | * Definition of the governor feature flags | |
32 | * - DEVFREQ_GOV_FLAG_IMMUTABLE | |
33 | * : This governor is never changeable to other governors. | |
34 | * - DEVFREQ_GOV_FLAG_IRQ_DRIVEN | |
35 | * : The devfreq won't schedule the work for this governor. | |
36 | */ | |
37 | #define DEVFREQ_GOV_FLAG_IMMUTABLE BIT(0) | |
38 | #define DEVFREQ_GOV_FLAG_IRQ_DRIVEN BIT(1) | |
39 | ||
5f1a9066 CC |
40 | /* |
41 | * Definition of governor attribute flags except for common sysfs attributes | |
42 | * - DEVFREQ_GOV_ATTR_POLLING_INTERVAL | |
f40d8123 | 43 | * : Indicate polling_interval sysfs attribute |
5f1a9066 CC |
44 | * - DEVFREQ_GOV_ATTR_TIMER |
45 | * : Indicate timer sysfs attribute | |
46 | */ | |
47 | #define DEVFREQ_GOV_ATTR_POLLING_INTERVAL BIT(0) | |
48 | #define DEVFREQ_GOV_ATTR_TIMER BIT(1) | |
49 | ||
a03dacb0 SK |
50 | /** |
51 | * struct devfreq_cpu_data - Hold the per-cpu data | |
26984d9d | 52 | * @node: list node |
a03dacb0 SK |
53 | * @dev: reference to cpu device. |
54 | * @first_cpu: the cpumask of the first cpu of a policy. | |
55 | * @opp_table: reference to cpu opp table. | |
56 | * @cur_freq: the current frequency of the cpu. | |
57 | * @min_freq: the min frequency of the cpu. | |
58 | * @max_freq: the max frequency of the cpu. | |
59 | * | |
60 | * This structure stores the required cpu_data of a cpu. | |
61 | * This is auto-populated by the governor. | |
62 | */ | |
63 | struct devfreq_cpu_data { | |
26984d9d CC |
64 | struct list_head node; |
65 | ||
a03dacb0 SK |
66 | struct device *dev; |
67 | unsigned int first_cpu; | |
68 | ||
69 | struct opp_table *opp_table; | |
70 | unsigned int cur_freq; | |
71 | unsigned int min_freq; | |
72 | unsigned int max_freq; | |
73 | }; | |
74 | ||
3ea6b700 CC |
75 | /** |
76 | * struct devfreq_governor - Devfreq policy governor | |
77 | * @node: list node - contains registered devfreq governors | |
78 | * @name: Governor's name | |
5f1a9066 | 79 | * @attrs: Governor's sysfs attribute flags |
0dd25a0d | 80 | * @flags: Governor's feature flags |
3ea6b700 CC |
81 | * @get_target_freq: Returns desired operating frequency for the device. |
82 | * Basically, get_target_freq will run | |
83 | * devfreq_dev_profile.get_dev_status() to get the | |
84 | * status of the device (load = busy_time / total_time). | |
3ea6b700 CC |
85 | * @event_handler: Callback for devfreq core framework to notify events |
86 | * to governors. Events include per device governor | |
87 | * init and exit, opp changes out of devfreq, suspend | |
88 | * and resume of per device devfreq during device idle. | |
89 | * | |
90 | * Note that the callbacks are called with devfreq->lock locked by devfreq. | |
91 | */ | |
92 | struct devfreq_governor { | |
93 | struct list_head node; | |
94 | ||
95 | const char name[DEVFREQ_NAME_LEN]; | |
5f1a9066 | 96 | const u64 attrs; |
0dd25a0d | 97 | const u64 flags; |
3ea6b700 CC |
98 | int (*get_target_freq)(struct devfreq *this, unsigned long *freq); |
99 | int (*event_handler)(struct devfreq *devfreq, | |
100 | unsigned int event, void *data); | |
101 | }; | |
102 | ||
6d743493 CC |
103 | void devfreq_monitor_start(struct devfreq *devfreq); |
104 | void devfreq_monitor_stop(struct devfreq *devfreq); | |
105 | void devfreq_monitor_suspend(struct devfreq *devfreq); | |
106 | void devfreq_monitor_resume(struct devfreq *devfreq); | |
3a1ec2e8 | 107 | void devfreq_update_interval(struct devfreq *devfreq, unsigned int *delay); |
3aa173b8 | 108 | |
6d743493 CC |
109 | int devfreq_add_governor(struct devfreq_governor *governor); |
110 | int devfreq_remove_governor(struct devfreq_governor *governor); | |
3aa173b8 | 111 | |
1cc55204 DO |
112 | int devm_devfreq_add_governor(struct device *dev, |
113 | struct devfreq_governor *governor); | |
114 | ||
6d743493 | 115 | int devfreq_update_status(struct devfreq *devfreq, unsigned long freq); |
b4365423 | 116 | int devfreq_update_target(struct devfreq *devfreq, unsigned long freq); |
713472e5 CC |
117 | void devfreq_get_freq_range(struct devfreq *devfreq, unsigned long *min_freq, |
118 | unsigned long *max_freq); | |
30582c25 | 119 | |
f75b0afa CC |
120 | static inline int devfreq_update_stats(struct devfreq *df) |
121 | { | |
b19e1346 DA |
122 | if (!df->profile->get_dev_status) |
123 | return -EINVAL; | |
124 | ||
f75b0afa CC |
125 | return df->profile->get_dev_status(df->dev.parent, &df->last_status); |
126 | } | |
a3c98b8b | 127 | #endif /* _GOVERNOR_H */ |