Lines Matching +full:devfreq +full:- +full:events

1 // SPDX-License-Identifier: GPL-2.0-only
3 * devfreq-event: a framework to provide raw data and events of devfreq devices
8 * This driver is based on drivers/devfreq/devfreq.c.
11 #include <linux/devfreq-event.h>
22 /* The list of all devfreq event list */
29 * devfreq_event_enable_edev() - Enable the devfreq-event dev and increase
30 * the enable_count of devfreq-event dev.
31 * @edev : the devfreq-event device
34 * devfreq-event device. The devfreq-event device should be enabled before
35 * using it by devfreq device.
41 if (!edev || !edev->desc) in devfreq_event_enable_edev()
42 return -EINVAL; in devfreq_event_enable_edev()
44 mutex_lock(&edev->lock); in devfreq_event_enable_edev()
45 if (edev->desc->ops && edev->desc->ops->enable in devfreq_event_enable_edev()
46 && edev->enable_count == 0) { in devfreq_event_enable_edev()
47 ret = edev->desc->ops->enable(edev); in devfreq_event_enable_edev()
51 edev->enable_count++; in devfreq_event_enable_edev()
53 mutex_unlock(&edev->lock); in devfreq_event_enable_edev()
60 * devfreq_event_disable_edev() - Disable the devfreq-event dev and decrease
61 * the enable_count of the devfreq-event dev.
62 * @edev : the devfreq-event device
65 * devfreq-event device. After the devfreq-event device is disabled,
66 * devfreq device can't use the devfreq-event device for get/set/reset
73 if (!edev || !edev->desc) in devfreq_event_disable_edev()
74 return -EINVAL; in devfreq_event_disable_edev()
76 mutex_lock(&edev->lock); in devfreq_event_disable_edev()
77 if (edev->enable_count <= 0) { in devfreq_event_disable_edev()
78 dev_warn(&edev->dev, "unbalanced enable_count\n"); in devfreq_event_disable_edev()
79 ret = -EIO; in devfreq_event_disable_edev()
83 if (edev->desc->ops && edev->desc->ops->disable in devfreq_event_disable_edev()
84 && edev->enable_count == 1) { in devfreq_event_disable_edev()
85 ret = edev->desc->ops->disable(edev); in devfreq_event_disable_edev()
89 edev->enable_count--; in devfreq_event_disable_edev()
91 mutex_unlock(&edev->lock); in devfreq_event_disable_edev()
98 * devfreq_event_is_enabled() - Check whether devfreq-event dev is enabled or
100 * @edev : the devfreq-event device
102 * Note that this function check whether devfreq-event dev is enabled or not.
103 * If return true, the devfreq-event dev is enabeld. If return false, the
104 * devfreq-event dev is disabled.
110 if (!edev || !edev->desc) in devfreq_event_is_enabled()
113 mutex_lock(&edev->lock); in devfreq_event_is_enabled()
115 if (edev->enable_count > 0) in devfreq_event_is_enabled()
118 mutex_unlock(&edev->lock); in devfreq_event_is_enabled()
125 * devfreq_event_set_event() - Set event to devfreq-event dev to start.
126 * @edev : the devfreq-event device
128 * Note that this function set the event to the devfreq-event device to start
135 if (!edev || !edev->desc) in devfreq_event_set_event()
136 return -EINVAL; in devfreq_event_set_event()
138 if (!edev->desc->ops || !edev->desc->ops->set_event) in devfreq_event_set_event()
139 return -EINVAL; in devfreq_event_set_event()
142 return -EPERM; in devfreq_event_set_event()
144 mutex_lock(&edev->lock); in devfreq_event_set_event()
145 ret = edev->desc->ops->set_event(edev); in devfreq_event_set_event()
146 mutex_unlock(&edev->lock); in devfreq_event_set_event()
153 * devfreq_event_get_event() - Get {load|total}_count from devfreq-event dev.
154 * @edev : the devfreq-event device
155 * @edata : the calculated data of devfreq-event device
157 * Note that this function get the calculated event data from devfreq-event dev
158 * after stoping the progress of whole sequence of devfreq-event dev.
165 if (!edev || !edev->desc) in devfreq_event_get_event()
166 return -EINVAL; in devfreq_event_get_event()
168 if (!edev->desc->ops || !edev->desc->ops->get_event) in devfreq_event_get_event()
169 return -EINVAL; in devfreq_event_get_event()
172 return -EINVAL; in devfreq_event_get_event()
174 edata->total_count = edata->load_count = 0; in devfreq_event_get_event()
176 mutex_lock(&edev->lock); in devfreq_event_get_event()
177 ret = edev->desc->ops->get_event(edev, edata); in devfreq_event_get_event()
179 edata->total_count = edata->load_count = 0; in devfreq_event_get_event()
180 mutex_unlock(&edev->lock); in devfreq_event_get_event()
187 * devfreq_event_reset_event() - Reset all opeations of devfreq-event dev.
188 * @edev : the devfreq-event device
190 * Note that this function stop all operations of devfreq-event dev and reset
191 * the current event data to make the devfreq-event device into initial state.
197 if (!edev || !edev->desc) in devfreq_event_reset_event()
198 return -EINVAL; in devfreq_event_reset_event()
201 return -EPERM; in devfreq_event_reset_event()
203 mutex_lock(&edev->lock); in devfreq_event_reset_event()
204 if (edev->desc->ops && edev->desc->ops->reset) in devfreq_event_reset_event()
205 ret = edev->desc->ops->reset(edev); in devfreq_event_reset_event()
206 mutex_unlock(&edev->lock); in devfreq_event_reset_event()
213 * devfreq_event_get_edev_by_phandle() - Get the devfreq-event dev from
217 * @index : the index into list of devfreq-event device
219 * Note that this function return the pointer of devfreq-event device.
227 if (!dev->of_node || !phandle_name) in devfreq_event_get_edev_by_phandle()
228 return ERR_PTR(-EINVAL); in devfreq_event_get_edev_by_phandle()
230 node = of_parse_phandle(dev->of_node, phandle_name, index); in devfreq_event_get_edev_by_phandle()
232 return ERR_PTR(-ENODEV); in devfreq_event_get_edev_by_phandle()
236 if (edev->dev.parent && device_match_of_node(edev->dev.parent, node)) in devfreq_event_get_edev_by_phandle()
241 if (of_node_name_eq(node, edev->desc->name)) in devfreq_event_get_edev_by_phandle()
250 return ERR_PTR(-ENODEV); in devfreq_event_get_edev_by_phandle()
260 * devfreq_event_get_edev_count() - Get the count of devfreq-event dev
264 * Note that this function return the count of devfreq-event devices.
270 if (!dev->of_node || !phandle_name) { in devfreq_event_get_edev_count()
272 return -EINVAL; in devfreq_event_get_edev_count()
275 count = of_property_count_elems_of_size(dev->of_node, phandle_name, in devfreq_event_get_edev_count()
279 "failed to get the count of devfreq-event in %pOF node\n", in devfreq_event_get_edev_count()
280 dev->of_node); in devfreq_event_get_edev_count()
296 * devfreq_event_add_edev() - Add new devfreq-event device.
297 * @dev : the device owning the devfreq-event device being created
298 * @desc : the devfreq-event device's descriptor which include essential
299 * data for devfreq-event device.
301 * Note that this function add new devfreq-event device to devfreq-event class
302 * list and register the device of the devfreq-event device.
308 static atomic_t event_no = ATOMIC_INIT(-1); in devfreq_event_add_edev()
312 return ERR_PTR(-EINVAL); in devfreq_event_add_edev()
314 if (!desc->name || !desc->ops) in devfreq_event_add_edev()
315 return ERR_PTR(-EINVAL); in devfreq_event_add_edev()
317 if (!desc->ops->set_event || !desc->ops->get_event) in devfreq_event_add_edev()
318 return ERR_PTR(-EINVAL); in devfreq_event_add_edev()
322 return ERR_PTR(-ENOMEM); in devfreq_event_add_edev()
324 mutex_init(&edev->lock); in devfreq_event_add_edev()
325 edev->desc = desc; in devfreq_event_add_edev()
326 edev->enable_count = 0; in devfreq_event_add_edev()
327 edev->dev.parent = dev; in devfreq_event_add_edev()
328 edev->dev.class = devfreq_event_class; in devfreq_event_add_edev()
329 edev->dev.release = devfreq_event_release_edev; in devfreq_event_add_edev()
331 dev_set_name(&edev->dev, "event%d", atomic_inc_return(&event_no)); in devfreq_event_add_edev()
332 ret = device_register(&edev->dev); in devfreq_event_add_edev()
334 put_device(&edev->dev); in devfreq_event_add_edev()
337 dev_set_drvdata(&edev->dev, edev); in devfreq_event_add_edev()
339 INIT_LIST_HEAD(&edev->node); in devfreq_event_add_edev()
342 list_add(&edev->node, &devfreq_event_list); in devfreq_event_add_edev()
350 * devfreq_event_remove_edev() - Remove the devfreq-event device registered.
351 * @edev : the devfreq-event device
353 * Note that this function removes the registered devfreq-event device.
358 return -EINVAL; in devfreq_event_remove_edev()
360 WARN_ON(edev->enable_count); in devfreq_event_remove_edev()
363 list_del(&edev->node); in devfreq_event_remove_edev()
366 device_unregister(&edev->dev); in devfreq_event_remove_edev()
388 * devm_devfreq_event_add_edev() - Resource-managed devfreq_event_add_edev()
389 * @dev : the device owning the devfreq-event device being created
390 * @desc : the devfreq-event device's descriptor which include essential
391 * data for devfreq-event device.
393 * Note that this function manages automatically the memory of devfreq-event
395 * for memory of devfreq-event device.
405 return ERR_PTR(-ENOMEM); in devm_devfreq_event_add_edev()
410 return ERR_PTR(-ENOMEM); in devm_devfreq_event_add_edev()
421 * devm_devfreq_event_remove_edev()- Resource-managed devfreq_event_remove_edev()
422 * @dev : the device owning the devfreq-event device being created
423 * @edev : the devfreq-event device
425 * Note that this function manages automatically the memory of devfreq-event
437 * Device attributes for devfreq-event class.
444 if (!edev || !edev->desc) in name_show()
445 return -EINVAL; in name_show()
447 return sprintf(buf, "%s\n", edev->desc->name); in name_show()
456 if (!edev || !edev->desc) in enable_count_show()
457 return -EINVAL; in enable_count_show()
459 return sprintf(buf, "%d\n", edev->enable_count); in enable_count_show()
472 devfreq_event_class = class_create("devfreq-event"); in devfreq_event_init()
478 devfreq_event_class->dev_groups = devfreq_event_groups; in devfreq_event_init()