linux/include/linux/devfreq-event.h
<<
>>
Prefs
   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 * @driver_data : the private data for devfreq-event driver.
  82 * @ops         : the operation to control devfreq-event device.
  83 *
  84 * Each devfreq-event device is described with a this structure.
  85 * This structure contains the various data for devfreq-event device.
  86 */
  87struct devfreq_event_desc {
  88        const char *name;
  89        void *driver_data;
  90
  91        const struct devfreq_event_ops *ops;
  92};
  93
  94#if defined(CONFIG_PM_DEVFREQ_EVENT)
  95extern int devfreq_event_enable_edev(struct devfreq_event_dev *edev);
  96extern int devfreq_event_disable_edev(struct devfreq_event_dev *edev);
  97extern bool devfreq_event_is_enabled(struct devfreq_event_dev *edev);
  98extern int devfreq_event_set_event(struct devfreq_event_dev *edev);
  99extern int devfreq_event_get_event(struct devfreq_event_dev *edev,
 100                                struct devfreq_event_data *edata);
 101extern int devfreq_event_reset_event(struct devfreq_event_dev *edev);
 102extern struct devfreq_event_dev *devfreq_event_get_edev_by_phandle(
 103                                struct device *dev, int index);
 104extern int devfreq_event_get_edev_count(struct device *dev);
 105extern struct devfreq_event_dev *devfreq_event_add_edev(struct device *dev,
 106                                struct devfreq_event_desc *desc);
 107extern int devfreq_event_remove_edev(struct devfreq_event_dev *edev);
 108extern struct devfreq_event_dev *devm_devfreq_event_add_edev(struct device *dev,
 109                                struct devfreq_event_desc *desc);
 110extern void devm_devfreq_event_remove_edev(struct device *dev,
 111                                struct devfreq_event_dev *edev);
 112static inline void *devfreq_event_get_drvdata(struct devfreq_event_dev *edev)
 113{
 114        return edev->desc->driver_data;
 115}
 116#else
 117static inline int devfreq_event_enable_edev(struct devfreq_event_dev *edev)
 118{
 119        return -EINVAL;
 120}
 121
 122static inline int devfreq_event_disable_edev(struct devfreq_event_dev *edev)
 123{
 124        return -EINVAL;
 125}
 126
 127static inline bool devfreq_event_is_enabled(struct devfreq_event_dev *edev)
 128{
 129        return false;
 130}
 131
 132static inline int devfreq_event_set_event(struct devfreq_event_dev *edev)
 133{
 134        return -EINVAL;
 135}
 136
 137static inline int devfreq_event_get_event(struct devfreq_event_dev *edev,
 138                                        struct devfreq_event_data *edata)
 139{
 140        return -EINVAL;
 141}
 142
 143static inline int devfreq_event_reset_event(struct devfreq_event_dev *edev)
 144{
 145        return -EINVAL;
 146}
 147
 148static inline struct devfreq_event_dev *devfreq_event_get_edev_by_phandle(
 149                                        struct device *dev, int index)
 150{
 151        return ERR_PTR(-EINVAL);
 152}
 153
 154static inline int devfreq_event_get_edev_count(struct device *dev)
 155{
 156        return -EINVAL;
 157}
 158
 159static inline struct devfreq_event_dev *devfreq_event_add_edev(struct device *dev,
 160                                        struct devfreq_event_desc *desc)
 161{
 162        return ERR_PTR(-EINVAL);
 163}
 164
 165static inline int devfreq_event_remove_edev(struct devfreq_event_dev *edev)
 166{
 167        return -EINVAL;
 168}
 169
 170static inline struct devfreq_event_dev *devm_devfreq_event_add_edev(
 171                                        struct device *dev,
 172                                        struct devfreq_event_desc *desc)
 173{
 174        return ERR_PTR(-EINVAL);
 175}
 176
 177static inline void devm_devfreq_event_remove_edev(struct device *dev,
 178                                        struct devfreq_event_dev *edev)
 179{
 180}
 181
 182static inline void *devfreq_event_get_drvdata(struct devfreq_event_dev *edev)
 183{
 184        return NULL;
 185}
 186#endif /* CONFIG_PM_DEVFREQ_EVENT */
 187
 188#endif /* __LINUX_DEVFREQ_EVENT_H__ */
 189