^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-only */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * governor.h - internal header for devfreq governors.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 2011 Samsung Electronics
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * MyungJoo Ham <myungjoo.ham@samsung.com>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * This header is for devfreq governors in drivers/devfreq/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #ifndef _GOVERNOR_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #define _GOVERNOR_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/devfreq.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #define to_devfreq(DEV) container_of((DEV), struct devfreq, dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) /* Devfreq events */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define DEVFREQ_GOV_START 0x1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define DEVFREQ_GOV_STOP 0x2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define DEVFREQ_GOV_UPDATE_INTERVAL 0x3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define DEVFREQ_GOV_SUSPEND 0x4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define DEVFREQ_GOV_RESUME 0x5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define DEVFREQ_MIN_FREQ 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define DEVFREQ_MAX_FREQ ULONG_MAX
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) * struct devfreq_governor - Devfreq policy governor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) * @node: list node - contains registered devfreq governors
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) * @name: Governor's name
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) * @immutable: Immutable flag for governor. If the value is 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) * this governor is never changeable to other governor.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) * @interrupt_driven: Devfreq core won't schedule polling work for this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) * governor if value is set to 1.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) * @get_target_freq: Returns desired operating frequency for the device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) * Basically, get_target_freq will run
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) * devfreq_dev_profile.get_dev_status() to get the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) * status of the device (load = busy_time / total_time).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) * If no_central_polling is set, this callback is called
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) * only with update_devfreq() notified by OPP.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) * @event_handler: Callback for devfreq core framework to notify events
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) * to governors. Events include per device governor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) * init and exit, opp changes out of devfreq, suspend
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) * and resume of per device devfreq during device idle.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) * Note that the callbacks are called with devfreq->lock locked by devfreq.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) struct devfreq_governor {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) struct list_head node;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) const char name[DEVFREQ_NAME_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) const unsigned int immutable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) const unsigned int interrupt_driven;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) int (*get_target_freq)(struct devfreq *this, unsigned long *freq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) int (*event_handler)(struct devfreq *devfreq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) unsigned int event, void *data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) void devfreq_monitor_start(struct devfreq *devfreq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) void devfreq_monitor_stop(struct devfreq *devfreq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) void devfreq_monitor_suspend(struct devfreq *devfreq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) void devfreq_monitor_resume(struct devfreq *devfreq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) void devfreq_update_interval(struct devfreq *devfreq, unsigned int *delay);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) int devfreq_add_governor(struct devfreq_governor *governor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) int devfreq_remove_governor(struct devfreq_governor *governor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) int devfreq_update_status(struct devfreq *devfreq, unsigned long freq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) static inline int devfreq_update_stats(struct devfreq *df)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) return df->profile->get_dev_status(df->dev.parent, &df->last_status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) #endif /* _GOVERNOR_H */