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 357a89d7eaSDaniel Lezcano typedef int (*dtpm_init_t)(void); 36a20d0ef9SDaniel Lezcano 37a20d0ef9SDaniel Lezcano struct dtpm_descr { 38a20d0ef9SDaniel Lezcano dtpm_init_t init; 39a20d0ef9SDaniel Lezcano }; 40a20d0ef9SDaniel Lezcano 41a20d0ef9SDaniel Lezcano /* Init section thermal table */ 427a89d7eaSDaniel Lezcano extern struct dtpm_descr __dtpm_table[]; 437a89d7eaSDaniel Lezcano extern struct dtpm_descr __dtpm_table_end[]; 44a20d0ef9SDaniel Lezcano 457a89d7eaSDaniel Lezcano #define DTPM_TABLE_ENTRY(name, __init) \ 467a89d7eaSDaniel Lezcano static struct dtpm_descr __dtpm_table_entry_##name \ 477a89d7eaSDaniel Lezcano __used __section("__dtpm_table") = { \ 487a89d7eaSDaniel Lezcano .init = __init, \ 497a89d7eaSDaniel Lezcano } 50a20d0ef9SDaniel Lezcano 517a89d7eaSDaniel Lezcano #define DTPM_DECLARE(name, init) DTPM_TABLE_ENTRY(name, init) 52a20d0ef9SDaniel Lezcano 53a20d0ef9SDaniel Lezcano #define for_each_dtpm_table(__dtpm) \ 54a20d0ef9SDaniel Lezcano for (__dtpm = __dtpm_table; \ 55a20d0ef9SDaniel Lezcano __dtpm < __dtpm_table_end; \ 56a20d0ef9SDaniel Lezcano __dtpm++) 57a20d0ef9SDaniel Lezcano 58a20d0ef9SDaniel Lezcano static inline struct dtpm *to_dtpm(struct powercap_zone *zone) 59a20d0ef9SDaniel Lezcano { 60a20d0ef9SDaniel Lezcano return container_of(zone, struct dtpm, zone); 61a20d0ef9SDaniel Lezcano } 62a20d0ef9SDaniel Lezcano 634570dddaSDaniel Lezcano int dtpm_update_power(struct dtpm *dtpm); 64a20d0ef9SDaniel Lezcano 65a20d0ef9SDaniel Lezcano int dtpm_release_zone(struct powercap_zone *pcz); 66a20d0ef9SDaniel Lezcano 67*d2cdc6adSDaniel Lezcano void dtpm_init(struct dtpm *dtpm, struct dtpm_ops *ops); 68a20d0ef9SDaniel Lezcano 69a20d0ef9SDaniel Lezcano void dtpm_unregister(struct dtpm *dtpm); 70a20d0ef9SDaniel Lezcano 71a20d0ef9SDaniel Lezcano int dtpm_register(const char *name, struct dtpm *dtpm, struct dtpm *parent); 72a20d0ef9SDaniel Lezcano 730e8f68d7SDaniel Lezcano int dtpm_register_cpu(struct dtpm *parent); 740e8f68d7SDaniel Lezcano 75a20d0ef9SDaniel Lezcano #endif 76