1/* 2 * devfreq-event: a framework to provide raw data and events of devfreq devices 3 * 4 * Copyright (C) 2014 Samsung Electronics 5 * Author: Chanwoo Choi <cw00.choi@samsung.com> 6 * 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. 10 */ 11 12#ifndef __LINUX_DEVFREQ_EVENT_H__ 13#define __LINUX_DEVFREQ_EVENT_H__ 14 15#include <linux/device.h> 16 17/** 18 * struct devfreq_event_dev - the devfreq-event device 19 * 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. 26 * 27 * This structure contains devfreq-event device information. 28 */ 29struct devfreq_event_dev { 30 struct list_head node; 31 32 struct device dev; 33 struct mutex lock; 34 u32 enable_count; 35 36 const struct devfreq_event_desc *desc; 37}; 38 39/** 40 * struct devfreq_event_data - the devfreq-event data 41 * 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. 47 * 48 * This structure contains the data of devfreq-event device for polling period. 49 */ 50struct devfreq_event_data { 51 unsigned long load_count; 52 unsigned long total_count; 53}; 54 55/** 56 * struct devfreq_event_ops - the operations of devfreq-event device 57 * 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. 64 * 65 * This structure contains devfreq-event device operations which can be 66 * implemented by devfreq-event device drivers. 67 */ 68struct 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); 73 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); 78}; 79 80/** 81 * struct devfreq_event_desc - the descriptor of devfreq-event device 82 * 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. 86 * 87 * Each devfreq-event device is described with a this structure. 88 * This structure contains the various data for devfreq-event device. 89 */ 90struct devfreq_event_desc { 91 const char *name; 92 void *driver_data; 93 94 const struct devfreq_event_ops *ops; 95}; 96 97#if defined(CONFIG_PM_DEVFREQ_EVENT) 98extern int devfreq_event_enable_edev(struct devfreq_event_dev *edev); 99extern int devfreq_event_disable_edev(struct devfreq_event_dev *edev); 100extern bool devfreq_event_is_enabled(struct devfreq_event_dev *edev); 101extern int devfreq_event_set_event(struct devfreq_event_dev *edev); 102extern int devfreq_event_get_event(struct devfreq_event_dev *edev, 103 struct devfreq_event_data *edata); 104extern int devfreq_event_reset_event(struct devfreq_event_dev *edev); 105extern struct devfreq_event_dev *devfreq_event_get_edev_by_phandle( 106 struct device *dev, int index); 107extern int devfreq_event_get_edev_count(struct device *dev); 108extern struct devfreq_event_dev *devfreq_event_add_edev(struct device *dev, 109 struct devfreq_event_desc *desc); 110extern int devfreq_event_remove_edev(struct devfreq_event_dev *edev); 111extern struct devfreq_event_dev *devm_devfreq_event_add_edev(struct device *dev, 112 struct devfreq_event_desc *desc); 113extern void devm_devfreq_event_remove_edev(struct device *dev, 114 struct devfreq_event_dev *edev); 115static inline void *devfreq_event_get_drvdata(struct devfreq_event_dev *edev) 116{ 117 return edev->desc->driver_data; 118} 119#else 120static inline int devfreq_event_enable_edev(struct devfreq_event_dev *edev) 121{ 122 return -EINVAL; 123} 124 125static inline int devfreq_event_disable_edev(struct devfreq_event_dev *edev) 126{ 127 return -EINVAL; 128} 129 130static inline bool devfreq_event_is_enabled(struct devfreq_event_dev *edev) 131{ 132 return false; 133} 134 135static inline int devfreq_event_set_event(struct devfreq_event_dev *edev) 136{ 137 return -EINVAL; 138} 139 140static inline int devfreq_event_get_event(struct devfreq_event_dev *edev, 141 struct devfreq_event_data *edata) 142{ 143 return -EINVAL; 144} 145 146static inline int devfreq_event_reset_event(struct devfreq_event_dev *edev) 147{ 148 return -EINVAL; 149} 150 151static inline void *devfreq_event_get_drvdata(struct devfreq_event_dev *edev) 152{ 153 return ERR_PTR(-EINVAL); 154} 155 156static inline struct devfreq_event_dev *devfreq_event_get_edev_by_phandle( 157 struct device *dev, int index) 158{ 159 return ERR_PTR(-EINVAL); 160} 161 162static inline int devfreq_event_get_edev_count(struct device *dev) 163{ 164 return -EINVAL; 165} 166 167static inline struct devfreq_event_dev *devfreq_event_add_edev(struct device *dev, 168 struct devfreq_event_desc *desc) 169{ 170 return ERR_PTR(-EINVAL); 171} 172 173static inline int devfreq_event_remove_edev(struct devfreq_event_dev *edev) 174{ 175 return -EINVAL; 176} 177 178static inline struct devfreq_event_dev *devm_devfreq_event_add_edev( 179 struct device *dev, 180 struct devfreq_event_desc *desc) 181{ 182 return ERR_PTR(-EINVAL); 183} 184 185static inline void devm_devfreq_event_remove_edev(struct device *dev, 186 struct devfreq_event_dev *edev) 187{ 188} 189 190static inline void *devfreq_event_get_drvdata(struct devfreq_event_dev *edev) 191{ 192 return NULL; 193} 194#endif /* CONFIG_PM_DEVFREQ_EVENT */ 195 196#endif /* __LINUX_DEVFREQ_EVENT_H__ */ 197