File Index
Files and directories
Sign in
FILE

devfreq-event.h

File preview with syntax highlighting.

linux-6.19.14/include/linux/devfreq-event.h C
  1/* SPDX-License-Identifier: GPL-2.0-only */
  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>
  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 * @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.
 84 *
 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/.
 91 */
 92struct devfreq_event_desc {
 93	const char *name;
 94	u32 event_type;
 95	void *driver_data;
 96
 97	const struct devfreq_event_ops *ops;
 98};
 99
100#if defined(CONFIG_PM_DEVFREQ_EVENT)
101extern int devfreq_event_enable_edev(struct devfreq_event_dev *edev);
102extern int devfreq_event_disable_edev(struct devfreq_event_dev *edev);
103extern bool devfreq_event_is_enabled(struct devfreq_event_dev *edev);
104extern int devfreq_event_set_event(struct devfreq_event_dev *edev);
105extern int devfreq_event_get_event(struct devfreq_event_dev *edev,
106				struct devfreq_event_data *edata);
107extern int devfreq_event_reset_event(struct devfreq_event_dev *edev);
108extern struct devfreq_event_dev *devfreq_event_get_edev_by_phandle(
109				struct device *dev,
110				const char *phandle_name,
111				int index);
112extern int devfreq_event_get_edev_count(struct device *dev,
113				const char *phandle_name);
114extern struct devfreq_event_dev *devfreq_event_add_edev(struct device *dev,
115				struct devfreq_event_desc *desc);
116extern int devfreq_event_remove_edev(struct devfreq_event_dev *edev);
117extern struct devfreq_event_dev *devm_devfreq_event_add_edev(struct device *dev,
118				struct devfreq_event_desc *desc);
119extern void devm_devfreq_event_remove_edev(struct device *dev,
120				struct devfreq_event_dev *edev);
121static inline void *devfreq_event_get_drvdata(struct devfreq_event_dev *edev)
122{
123	return edev->desc->driver_data;
124}
125#else
126static inline int devfreq_event_enable_edev(struct devfreq_event_dev *edev)
127{
128	return -EINVAL;
129}
130
131static inline int devfreq_event_disable_edev(struct devfreq_event_dev *edev)
132{
133	return -EINVAL;
134}
135
136static inline bool devfreq_event_is_enabled(struct devfreq_event_dev *edev)
137{
138	return false;
139}
140
141static inline int devfreq_event_set_event(struct devfreq_event_dev *edev)
142{
143	return -EINVAL;
144}
145
146static inline int devfreq_event_get_event(struct devfreq_event_dev *edev,
147					struct devfreq_event_data *edata)
148{
149	return -EINVAL;
150}
151
152static inline int devfreq_event_reset_event(struct devfreq_event_dev *edev)
153{
154	return -EINVAL;
155}
156
157static inline struct devfreq_event_dev *devfreq_event_get_edev_by_phandle(
158					struct device *dev,
159					const char *phandle_name,
160					int index)
161{
162	return ERR_PTR(-EINVAL);
163}
164
165static inline int devfreq_event_get_edev_count(struct device *dev,
166					const char *phandle_name)
167{
168	return -EINVAL;
169}
170
171static inline struct devfreq_event_dev *devfreq_event_add_edev(struct device *dev,
172					struct devfreq_event_desc *desc)
173{
174	return ERR_PTR(-EINVAL);
175}
176
177static inline int devfreq_event_remove_edev(struct devfreq_event_dev *edev)
178{
179	return -EINVAL;
180}
181
182static inline struct devfreq_event_dev *devm_devfreq_event_add_edev(
183					struct device *dev,
184					struct devfreq_event_desc *desc)
185{
186	return ERR_PTR(-EINVAL);
187}
188
189static inline void devm_devfreq_event_remove_edev(struct device *dev,
190					struct devfreq_event_dev *edev)
191{
192}
193
194static inline void *devfreq_event_get_drvdata(struct devfreq_event_dev *edev)
195{
196	return NULL;
197}
198#endif /* CONFIG_PM_DEVFREQ_EVENT */
199
200#endif /* __LINUX_DEVFREQ_EVENT_H__ */
~/ Read-only file preview.