]> git.ipfire.org Git - thirdparty/kernel/stable.git/blame - include/linux/devfreq-event.h
treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 503
[thirdparty/kernel/stable.git] / include / linux / devfreq-event.h
CommitLineData
d2912cb1 1/* SPDX-License-Identifier: GPL-2.0-only */
f262f28c
CC
2/*
3 * devfreq-event: a framework to provide raw data and events of devfreq devices
4 *
5 * Copyright (C) 2014 Samsung Electronics
6 * Author: Chanwoo Choi <cw00.choi@samsung.com>
f262f28c
CC
7 */
8
9#ifndef __LINUX_DEVFREQ_EVENT_H__
10#define __LINUX_DEVFREQ_EVENT_H__
11
12#include <linux/device.h>
13
14/**
15 * struct devfreq_event_dev - the devfreq-event device
16 *
17 * @node : Contain the devfreq-event device that have been registered.
18 * @dev : the device registered by devfreq-event class. dev.parent is
19 * the device using devfreq-event.
20 * @lock : a mutex to protect accessing devfreq-event.
21 * @enable_count: the number of enable function have been called.
22 * @desc : the description for devfreq-event device.
23 *
24 * This structure contains devfreq-event device information.
25 */
26struct devfreq_event_dev {
27 struct list_head node;
28
29 struct device dev;
30 struct mutex lock;
31 u32 enable_count;
32
33 const struct devfreq_event_desc *desc;
34};
35
36/**
37 * struct devfreq_event_data - the devfreq-event data
38 *
39 * @load_count : load count of devfreq-event device for the given period.
40 * @total_count : total count of devfreq-event device for the given period.
41 * each count may represent a clock cycle, a time unit
42 * (ns/us/...), or anything the device driver wants.
43 * Generally, utilization is load_count / total_count.
44 *
45 * This structure contains the data of devfreq-event device for polling period.
46 */
47struct devfreq_event_data {
48 unsigned long load_count;
49 unsigned long total_count;
50};
51
52/**
53 * struct devfreq_event_ops - the operations of devfreq-event device
54 *
55 * @enable : Enable the devfreq-event device.
56 * @disable : Disable the devfreq-event device.
57 * @reset : Reset all setting of the devfreq-event device.
58 * @set_event : Set the specific event type for the devfreq-event device.
59 * @get_event : Get the result of the devfreq-event devie with specific
60 * event type.
61 *
62 * This structure contains devfreq-event device operations which can be
63 * implemented by devfreq-event device drivers.
64 */
65struct devfreq_event_ops {
66 /* Optional functions */
67 int (*enable)(struct devfreq_event_dev *edev);
68 int (*disable)(struct devfreq_event_dev *edev);
69 int (*reset)(struct devfreq_event_dev *edev);
70
71 /* Mandatory functions */
72 int (*set_event)(struct devfreq_event_dev *edev);
73 int (*get_event)(struct devfreq_event_dev *edev,
74 struct devfreq_event_data *edata);
75};
76
77/**
78 * struct devfreq_event_desc - the descriptor of devfreq-event device
79 *
80 * @name : the name of devfreq-event device.
81 * @driver_data : the private data for devfreq-event driver.
82 * @ops : the operation to control devfreq-event device.
83 *
84 * Each devfreq-event device is described with a this structure.
85 * This structure contains the various data for devfreq-event device.
86 */
87struct devfreq_event_desc {
88 const char *name;
89 void *driver_data;
90
6f240fbc 91 const struct devfreq_event_ops *ops;
f262f28c
CC
92};
93
94#if defined(CONFIG_PM_DEVFREQ_EVENT)
95extern int devfreq_event_enable_edev(struct devfreq_event_dev *edev);
96extern int devfreq_event_disable_edev(struct devfreq_event_dev *edev);
97extern bool devfreq_event_is_enabled(struct devfreq_event_dev *edev);
98extern int devfreq_event_set_event(struct devfreq_event_dev *edev);
99extern int devfreq_event_get_event(struct devfreq_event_dev *edev,
100 struct devfreq_event_data *edata);
101extern int devfreq_event_reset_event(struct devfreq_event_dev *edev);
102extern struct devfreq_event_dev *devfreq_event_get_edev_by_phandle(
103 struct device *dev, int index);
104extern int devfreq_event_get_edev_count(struct device *dev);
105extern struct devfreq_event_dev *devfreq_event_add_edev(struct device *dev,
106 struct devfreq_event_desc *desc);
107extern int devfreq_event_remove_edev(struct devfreq_event_dev *edev);
108extern struct devfreq_event_dev *devm_devfreq_event_add_edev(struct device *dev,
109 struct devfreq_event_desc *desc);
110extern void devm_devfreq_event_remove_edev(struct device *dev,
111 struct devfreq_event_dev *edev);
112static inline void *devfreq_event_get_drvdata(struct devfreq_event_dev *edev)
113{
114 return edev->desc->driver_data;
115}
116#else
117static inline int devfreq_event_enable_edev(struct devfreq_event_dev *edev)
118{
119 return -EINVAL;
120}
121
122static inline int devfreq_event_disable_edev(struct devfreq_event_dev *edev)
123{
124 return -EINVAL;
125}
126
127static inline bool devfreq_event_is_enabled(struct devfreq_event_dev *edev)
128{
129 return false;
130}
131
132static inline int devfreq_event_set_event(struct devfreq_event_dev *edev)
133{
134 return -EINVAL;
135}
136
137static inline int devfreq_event_get_event(struct devfreq_event_dev *edev,
138 struct devfreq_event_data *edata)
139{
140 return -EINVAL;
141}
142
143static inline int devfreq_event_reset_event(struct devfreq_event_dev *edev)
144{
145 return -EINVAL;
146}
147
f262f28c
CC
148static inline struct devfreq_event_dev *devfreq_event_get_edev_by_phandle(
149 struct device *dev, int index)
150{
151 return ERR_PTR(-EINVAL);
152}
153
154static inline int devfreq_event_get_edev_count(struct device *dev)
155{
156 return -EINVAL;
157}
158
159static inline struct devfreq_event_dev *devfreq_event_add_edev(struct device *dev,
160 struct devfreq_event_desc *desc)
161{
162 return ERR_PTR(-EINVAL);
163}
164
165static inline int devfreq_event_remove_edev(struct devfreq_event_dev *edev)
166{
167 return -EINVAL;
168}
169
170static inline struct devfreq_event_dev *devm_devfreq_event_add_edev(
171 struct device *dev,
172 struct devfreq_event_desc *desc)
173{
174 return ERR_PTR(-EINVAL);
175}
176
177static inline void devm_devfreq_event_remove_edev(struct device *dev,
178 struct devfreq_event_dev *edev)
179{
180}
181
182static inline void *devfreq_event_get_drvdata(struct devfreq_event_dev *edev)
183{
184 return NULL;
185}
186#endif /* CONFIG_PM_DEVFREQ_EVENT */
187
188#endif /* __LINUX_DEVFREQ_EVENT_H__ */