1a20d0ef9SDaniel Lezcano /* SPDX-License-Identifier: GPL-2.0-only */ 2a20d0ef9SDaniel Lezcano /* 3a20d0ef9SDaniel Lezcano * Copyright (C) 2020 Linaro Ltd 4a20d0ef9SDaniel Lezcano * 5a20d0ef9SDaniel Lezcano * Author: Daniel Lezcano <daniel.lezcano@linaro.org> 6a20d0ef9SDaniel Lezcano */ 7a20d0ef9SDaniel Lezcano #ifndef ___DTPM_H__ 8a20d0ef9SDaniel Lezcano #define ___DTPM_H__ 9a20d0ef9SDaniel Lezcano 10a20d0ef9SDaniel Lezcano #include <linux/powercap.h> 11a20d0ef9SDaniel Lezcano 12a20d0ef9SDaniel Lezcano #define MAX_DTPM_DESCR 8 13a20d0ef9SDaniel Lezcano #define MAX_DTPM_CONSTRAINTS 1 14a20d0ef9SDaniel Lezcano 15a20d0ef9SDaniel Lezcano struct dtpm { 16a20d0ef9SDaniel Lezcano struct powercap_zone zone; 17a20d0ef9SDaniel Lezcano struct dtpm *parent; 18a20d0ef9SDaniel Lezcano struct list_head sibling; 19a20d0ef9SDaniel Lezcano struct list_head children; 20a20d0ef9SDaniel Lezcano struct dtpm_ops *ops; 21a20d0ef9SDaniel Lezcano unsigned long flags; 22a20d0ef9SDaniel Lezcano u64 power_limit; 23a20d0ef9SDaniel Lezcano u64 power_max; 24a20d0ef9SDaniel Lezcano u64 power_min; 25a20d0ef9SDaniel Lezcano int weight; 26a20d0ef9SDaniel Lezcano }; 27a20d0ef9SDaniel Lezcano 28a20d0ef9SDaniel Lezcano struct dtpm_ops { 29a20d0ef9SDaniel Lezcano u64 (*set_power_uw)(struct dtpm *, u64); 30a20d0ef9SDaniel Lezcano u64 (*get_power_uw)(struct dtpm *); 314570dddaSDaniel Lezcano int (*update_power_uw)(struct dtpm *); 32a20d0ef9SDaniel Lezcano void (*release)(struct dtpm *); 33a20d0ef9SDaniel Lezcano }; 34a20d0ef9SDaniel Lezcano 35*3759ec67SDaniel Lezcano struct device_node; 36*3759ec67SDaniel Lezcano 37b9794a82SDaniel Lezcano struct dtpm_subsys_ops { 38b9794a82SDaniel Lezcano const char *name; 39b9794a82SDaniel Lezcano int (*init)(void); 40*3759ec67SDaniel Lezcano int (*setup)(struct dtpm *, struct device_node *); 41*3759ec67SDaniel Lezcano }; 42*3759ec67SDaniel Lezcano 43*3759ec67SDaniel Lezcano enum DTPM_NODE_TYPE { 44*3759ec67SDaniel Lezcano DTPM_NODE_VIRTUAL = 0, 45*3759ec67SDaniel Lezcano DTPM_NODE_DT, 46*3759ec67SDaniel Lezcano }; 47*3759ec67SDaniel Lezcano 48*3759ec67SDaniel Lezcano struct dtpm_node { 49*3759ec67SDaniel Lezcano enum DTPM_NODE_TYPE type; 50*3759ec67SDaniel Lezcano const char *name; 51*3759ec67SDaniel Lezcano struct dtpm_node *parent; 52a20d0ef9SDaniel Lezcano }; 53a20d0ef9SDaniel Lezcano 54a20d0ef9SDaniel Lezcano static inline struct dtpm *to_dtpm(struct powercap_zone *zone) 55a20d0ef9SDaniel Lezcano { 56a20d0ef9SDaniel Lezcano return container_of(zone, struct dtpm, zone); 57a20d0ef9SDaniel Lezcano } 58a20d0ef9SDaniel Lezcano 594570dddaSDaniel Lezcano int dtpm_update_power(struct dtpm *dtpm); 60a20d0ef9SDaniel Lezcano 61a20d0ef9SDaniel Lezcano int dtpm_release_zone(struct powercap_zone *pcz); 62a20d0ef9SDaniel Lezcano 63d2cdc6adSDaniel Lezcano void dtpm_init(struct dtpm *dtpm, struct dtpm_ops *ops); 64a20d0ef9SDaniel Lezcano 65a20d0ef9SDaniel Lezcano void dtpm_unregister(struct dtpm *dtpm); 66a20d0ef9SDaniel Lezcano 67a20d0ef9SDaniel Lezcano int dtpm_register(const char *name, struct dtpm *dtpm, struct dtpm *parent); 68a20d0ef9SDaniel Lezcano 69*3759ec67SDaniel Lezcano int dtpm_create_hierarchy(struct of_device_id *dtpm_match_table); 70a20d0ef9SDaniel Lezcano #endif 71