1 /* SPDX-License-Identifier: GPL-2.0-only */
3 * devfreq-event: a framework to provide raw data and events of devfreq devices
5 * Copyright (C) 2014 Samsung Electronics
6 * Author: Chanwoo Choi <cw00.choi@samsung.com>
9 #ifndef __LINUX_DEVFREQ_EVENT_H__
10 #define __LINUX_DEVFREQ_EVENT_H__
12 #include <linux/device.h>
15 * struct devfreq_event_dev - the devfreq-event device
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.
24 * This structure contains devfreq-event device information.
26 struct devfreq_event_dev
{
27 struct list_head node
;
33 const struct devfreq_event_desc
*desc
;
37 * struct devfreq_event_data - the devfreq-event data
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.
45 * This structure contains the data of devfreq-event device for polling period.
47 struct devfreq_event_data
{
48 unsigned long load_count
;
49 unsigned long total_count
;
53 * struct devfreq_event_ops - the operations of devfreq-event device
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
62 * This structure contains devfreq-event device operations which can be
63 * implemented by devfreq-event device drivers.
65 struct 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
);
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
);
78 * struct devfreq_event_desc - the descriptor of devfreq-event device
80 * @name : the name of devfreq-event device.
81 * @event_type : the type of the event determined and used by driver
82 * @driver_data : the private data for devfreq-event driver.
83 * @ops : the operation to control devfreq-event device.
85 * Each devfreq-event device is described with a this structure.
86 * This structure contains the various data for devfreq-event device.
87 * The event_type describes what is going to be counted in the register.
88 * It might choose to count e.g. read requests, write data in bytes, etc.
89 * The full supported list of types is present in specyfic header in:
90 * include/dt-bindings/pmu/.
92 struct devfreq_event_desc
{
97 const struct devfreq_event_ops
*ops
;
100 #if defined(CONFIG_PM_DEVFREQ_EVENT)
101 extern int devfreq_event_enable_edev(struct devfreq_event_dev
*edev
);
102 extern int devfreq_event_disable_edev(struct devfreq_event_dev
*edev
);
103 extern bool devfreq_event_is_enabled(struct devfreq_event_dev
*edev
);
104 extern int devfreq_event_set_event(struct devfreq_event_dev
*edev
);
105 extern int devfreq_event_get_event(struct devfreq_event_dev
*edev
,
106 struct devfreq_event_data
*edata
);
107 extern int devfreq_event_reset_event(struct devfreq_event_dev
*edev
);
108 extern struct devfreq_event_dev
*devfreq_event_get_edev_by_phandle(
110 const char *phandle_name
,
112 extern int devfreq_event_get_edev_count(struct device
*dev
,
113 const char *phandle_name
);
114 extern struct devfreq_event_dev
*devfreq_event_add_edev(struct device
*dev
,
115 struct devfreq_event_desc
*desc
);
116 extern int devfreq_event_remove_edev(struct devfreq_event_dev
*edev
);
117 extern struct devfreq_event_dev
*devm_devfreq_event_add_edev(struct device
*dev
,
118 struct devfreq_event_desc
*desc
);
119 extern void devm_devfreq_event_remove_edev(struct device
*dev
,
120 struct devfreq_event_dev
*edev
);
121 static inline void *devfreq_event_get_drvdata(struct devfreq_event_dev
*edev
)
123 return edev
->desc
->driver_data
;
126 static inline int devfreq_event_enable_edev(struct devfreq_event_dev
*edev
)
131 static inline int devfreq_event_disable_edev(struct devfreq_event_dev
*edev
)
136 static inline bool devfreq_event_is_enabled(struct devfreq_event_dev
*edev
)
141 static inline int devfreq_event_set_event(struct devfreq_event_dev
*edev
)
146 static inline int devfreq_event_get_event(struct devfreq_event_dev
*edev
,
147 struct devfreq_event_data
*edata
)
152 static inline int devfreq_event_reset_event(struct devfreq_event_dev
*edev
)
157 static inline struct devfreq_event_dev
*devfreq_event_get_edev_by_phandle(
159 const char *phandle_name
,
162 return ERR_PTR(-EINVAL
);
165 static inline int devfreq_event_get_edev_count(struct device
*dev
,
166 const char *phandle_name
)
171 static inline struct devfreq_event_dev
*devfreq_event_add_edev(struct device
*dev
,
172 struct devfreq_event_desc
*desc
)
174 return ERR_PTR(-EINVAL
);
177 static inline int devfreq_event_remove_edev(struct devfreq_event_dev
*edev
)
182 static inline struct devfreq_event_dev
*devm_devfreq_event_add_edev(
184 struct devfreq_event_desc
*desc
)
186 return ERR_PTR(-EINVAL
);
189 static inline void devm_devfreq_event_remove_edev(struct device
*dev
,
190 struct devfreq_event_dev
*edev
)
194 static inline void *devfreq_event_get_drvdata(struct devfreq_event_dev
*edev
)
198 #endif /* CONFIG_PM_DEVFREQ_EVENT */
200 #endif /* __LINUX_DEVFREQ_EVENT_H__ */