Merge tag 'linux-can-next-for-4.12-20170427' of git://git.kernel.org/pub/scm/linux...
[linux-2.6/btrfs-unstable.git] / include / linux / devfreq-event.h
blob4db00b02ca3f1021ab64466c1000cf187a3de5f9
1 /*
2 * devfreq-event: a framework to provide raw data and events of devfreq devices
4 * Copyright (C) 2014 Samsung Electronics
5 * Author: Chanwoo Choi <cw00.choi@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 #ifndef __LINUX_DEVFREQ_EVENT_H__
13 #define __LINUX_DEVFREQ_EVENT_H__
15 #include <linux/device.h>
17 /**
18 * struct devfreq_event_dev - the devfreq-event device
20 * @node : Contain the devfreq-event device that have been registered.
21 * @dev : the device registered by devfreq-event class. dev.parent is
22 * the device using devfreq-event.
23 * @lock : a mutex to protect accessing devfreq-event.
24 * @enable_count: the number of enable function have been called.
25 * @desc : the description for devfreq-event device.
27 * This structure contains devfreq-event device information.
29 struct devfreq_event_dev {
30 struct list_head node;
32 struct device dev;
33 struct mutex lock;
34 u32 enable_count;
36 const struct devfreq_event_desc *desc;
39 /**
40 * struct devfreq_event_data - the devfreq-event data
42 * @load_count : load count of devfreq-event device for the given period.
43 * @total_count : total count of devfreq-event device for the given period.
44 * each count may represent a clock cycle, a time unit
45 * (ns/us/...), or anything the device driver wants.
46 * Generally, utilization is load_count / total_count.
48 * This structure contains the data of devfreq-event device for polling period.
50 struct devfreq_event_data {
51 unsigned long load_count;
52 unsigned long total_count;
55 /**
56 * struct devfreq_event_ops - the operations of devfreq-event device
58 * @enable : Enable the devfreq-event device.
59 * @disable : Disable the devfreq-event device.
60 * @reset : Reset all setting of the devfreq-event device.
61 * @set_event : Set the specific event type for the devfreq-event device.
62 * @get_event : Get the result of the devfreq-event devie with specific
63 * event type.
65 * This structure contains devfreq-event device operations which can be
66 * implemented by devfreq-event device drivers.
68 struct devfreq_event_ops {
69 /* Optional functions */
70 int (*enable)(struct devfreq_event_dev *edev);
71 int (*disable)(struct devfreq_event_dev *edev);
72 int (*reset)(struct devfreq_event_dev *edev);
74 /* Mandatory functions */
75 int (*set_event)(struct devfreq_event_dev *edev);
76 int (*get_event)(struct devfreq_event_dev *edev,
77 struct devfreq_event_data *edata);
80 /**
81 * struct devfreq_event_desc - the descriptor of devfreq-event device
83 * @name : the name of devfreq-event device.
84 * @driver_data : the private data for devfreq-event driver.
85 * @ops : the operation to control devfreq-event device.
87 * Each devfreq-event device is described with a this structure.
88 * This structure contains the various data for devfreq-event device.
90 struct devfreq_event_desc {
91 const char *name;
92 void *driver_data;
94 const struct devfreq_event_ops *ops;
97 #if defined(CONFIG_PM_DEVFREQ_EVENT)
98 extern int devfreq_event_enable_edev(struct devfreq_event_dev *edev);
99 extern int devfreq_event_disable_edev(struct devfreq_event_dev *edev);
100 extern bool devfreq_event_is_enabled(struct devfreq_event_dev *edev);
101 extern int devfreq_event_set_event(struct devfreq_event_dev *edev);
102 extern int devfreq_event_get_event(struct devfreq_event_dev *edev,
103 struct devfreq_event_data *edata);
104 extern int devfreq_event_reset_event(struct devfreq_event_dev *edev);
105 extern struct devfreq_event_dev *devfreq_event_get_edev_by_phandle(
106 struct device *dev, int index);
107 extern int devfreq_event_get_edev_count(struct device *dev);
108 extern struct devfreq_event_dev *devfreq_event_add_edev(struct device *dev,
109 struct devfreq_event_desc *desc);
110 extern int devfreq_event_remove_edev(struct devfreq_event_dev *edev);
111 extern struct devfreq_event_dev *devm_devfreq_event_add_edev(struct device *dev,
112 struct devfreq_event_desc *desc);
113 extern void devm_devfreq_event_remove_edev(struct device *dev,
114 struct devfreq_event_dev *edev);
115 static inline void *devfreq_event_get_drvdata(struct devfreq_event_dev *edev)
117 return edev->desc->driver_data;
119 #else
120 static inline int devfreq_event_enable_edev(struct devfreq_event_dev *edev)
122 return -EINVAL;
125 static inline int devfreq_event_disable_edev(struct devfreq_event_dev *edev)
127 return -EINVAL;
130 static inline bool devfreq_event_is_enabled(struct devfreq_event_dev *edev)
132 return false;
135 static inline int devfreq_event_set_event(struct devfreq_event_dev *edev)
137 return -EINVAL;
140 static inline int devfreq_event_get_event(struct devfreq_event_dev *edev,
141 struct devfreq_event_data *edata)
143 return -EINVAL;
146 static inline int devfreq_event_reset_event(struct devfreq_event_dev *edev)
148 return -EINVAL;
151 static inline struct devfreq_event_dev *devfreq_event_get_edev_by_phandle(
152 struct device *dev, int index)
154 return ERR_PTR(-EINVAL);
157 static inline int devfreq_event_get_edev_count(struct device *dev)
159 return -EINVAL;
162 static inline struct devfreq_event_dev *devfreq_event_add_edev(struct device *dev,
163 struct devfreq_event_desc *desc)
165 return ERR_PTR(-EINVAL);
168 static inline int devfreq_event_remove_edev(struct devfreq_event_dev *edev)
170 return -EINVAL;
173 static inline struct devfreq_event_dev *devm_devfreq_event_add_edev(
174 struct device *dev,
175 struct devfreq_event_desc *desc)
177 return ERR_PTR(-EINVAL);
180 static inline void devm_devfreq_event_remove_edev(struct device *dev,
181 struct devfreq_event_dev *edev)
185 static inline void *devfreq_event_get_drvdata(struct devfreq_event_dev *edev)
187 return NULL;
189 #endif /* CONFIG_PM_DEVFREQ_EVENT */
191 #endif /* __LINUX_DEVFREQ_EVENT_H__ */