162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2020 Linaro Ltd
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Author: Daniel Lezcano <daniel.lezcano@linaro.org>
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci#ifndef ___DTPM_H__
862306a36Sopenharmony_ci#define ___DTPM_H__
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <linux/powercap.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#define MAX_DTPM_DESCR 8
1362306a36Sopenharmony_ci#define MAX_DTPM_CONSTRAINTS 1
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cistruct dtpm {
1662306a36Sopenharmony_ci	struct powercap_zone zone;
1762306a36Sopenharmony_ci	struct dtpm *parent;
1862306a36Sopenharmony_ci	struct list_head sibling;
1962306a36Sopenharmony_ci	struct list_head children;
2062306a36Sopenharmony_ci	struct dtpm_ops *ops;
2162306a36Sopenharmony_ci	unsigned long flags;
2262306a36Sopenharmony_ci	u64 power_limit;
2362306a36Sopenharmony_ci	u64 power_max;
2462306a36Sopenharmony_ci	u64 power_min;
2562306a36Sopenharmony_ci	int weight;
2662306a36Sopenharmony_ci};
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_cistruct dtpm_ops {
2962306a36Sopenharmony_ci	u64 (*set_power_uw)(struct dtpm *, u64);
3062306a36Sopenharmony_ci	u64 (*get_power_uw)(struct dtpm *);
3162306a36Sopenharmony_ci	int (*update_power_uw)(struct dtpm *);
3262306a36Sopenharmony_ci	void (*release)(struct dtpm *);
3362306a36Sopenharmony_ci};
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_cistruct device_node;
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_cistruct dtpm_subsys_ops {
3862306a36Sopenharmony_ci	const char *name;
3962306a36Sopenharmony_ci	int (*init)(void);
4062306a36Sopenharmony_ci	void (*exit)(void);
4162306a36Sopenharmony_ci	int (*setup)(struct dtpm *, struct device_node *);
4262306a36Sopenharmony_ci};
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cienum DTPM_NODE_TYPE {
4562306a36Sopenharmony_ci	DTPM_NODE_VIRTUAL = 0,
4662306a36Sopenharmony_ci	DTPM_NODE_DT,
4762306a36Sopenharmony_ci};
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_cistruct dtpm_node {
5062306a36Sopenharmony_ci	enum DTPM_NODE_TYPE type;
5162306a36Sopenharmony_ci	const char *name;
5262306a36Sopenharmony_ci	struct dtpm_node *parent;
5362306a36Sopenharmony_ci};
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_cistatic inline struct dtpm *to_dtpm(struct powercap_zone *zone)
5662306a36Sopenharmony_ci{
5762306a36Sopenharmony_ci	return container_of(zone, struct dtpm, zone);
5862306a36Sopenharmony_ci}
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ciint dtpm_update_power(struct dtpm *dtpm);
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ciint dtpm_release_zone(struct powercap_zone *pcz);
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_civoid dtpm_init(struct dtpm *dtpm, struct dtpm_ops *ops);
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_civoid dtpm_unregister(struct dtpm *dtpm);
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ciint dtpm_register(const char *name, struct dtpm *dtpm, struct dtpm *parent);
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ciint dtpm_create_hierarchy(struct of_device_id *dtpm_match_table);
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_civoid dtpm_destroy_hierarchy(void);
7362306a36Sopenharmony_ci#endif
74