mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-14 16:23:51 +08:00
d2cdc6adc3
The dtpm framework provides an API to allocate a dtpm node. However when a backend dtpm driver needs to allocate a dtpm node it must define its own structure and store the pointer of this structure in the private field of the dtpm structure. It is more elegant to use the container_of macro and add the dtpm structure inside the dtpm backend specific structure. The code will be able to deal properly with the dtpm structure as a generic entity, making all this even more self-encapsulated. The dtpm_alloc() function does no longer make sense as the dtpm structure will be allocated when allocating the device specific dtpm structure. The dtpm_init() is provided instead. Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org> Reviewed-by: Lukasz Luba <lukasz.luba@arm.com> Link: https://lore.kernel.org/r/20210312130411.29833-4-daniel.lezcano@linaro.org
76 lines
1.6 KiB
C
76 lines
1.6 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright (C) 2020 Linaro Ltd
|
|
*
|
|
* Author: Daniel Lezcano <daniel.lezcano@linaro.org>
|
|
*/
|
|
#ifndef ___DTPM_H__
|
|
#define ___DTPM_H__
|
|
|
|
#include <linux/powercap.h>
|
|
|
|
#define MAX_DTPM_DESCR 8
|
|
#define MAX_DTPM_CONSTRAINTS 1
|
|
|
|
struct dtpm {
|
|
struct powercap_zone zone;
|
|
struct dtpm *parent;
|
|
struct list_head sibling;
|
|
struct list_head children;
|
|
struct dtpm_ops *ops;
|
|
unsigned long flags;
|
|
u64 power_limit;
|
|
u64 power_max;
|
|
u64 power_min;
|
|
int weight;
|
|
};
|
|
|
|
struct dtpm_ops {
|
|
u64 (*set_power_uw)(struct dtpm *, u64);
|
|
u64 (*get_power_uw)(struct dtpm *);
|
|
int (*update_power_uw)(struct dtpm *);
|
|
void (*release)(struct dtpm *);
|
|
};
|
|
|
|
typedef int (*dtpm_init_t)(void);
|
|
|
|
struct dtpm_descr {
|
|
dtpm_init_t init;
|
|
};
|
|
|
|
/* Init section thermal table */
|
|
extern struct dtpm_descr __dtpm_table[];
|
|
extern struct dtpm_descr __dtpm_table_end[];
|
|
|
|
#define DTPM_TABLE_ENTRY(name, __init) \
|
|
static struct dtpm_descr __dtpm_table_entry_##name \
|
|
__used __section("__dtpm_table") = { \
|
|
.init = __init, \
|
|
}
|
|
|
|
#define DTPM_DECLARE(name, init) DTPM_TABLE_ENTRY(name, init)
|
|
|
|
#define for_each_dtpm_table(__dtpm) \
|
|
for (__dtpm = __dtpm_table; \
|
|
__dtpm < __dtpm_table_end; \
|
|
__dtpm++)
|
|
|
|
static inline struct dtpm *to_dtpm(struct powercap_zone *zone)
|
|
{
|
|
return container_of(zone, struct dtpm, zone);
|
|
}
|
|
|
|
int dtpm_update_power(struct dtpm *dtpm);
|
|
|
|
int dtpm_release_zone(struct powercap_zone *pcz);
|
|
|
|
void dtpm_init(struct dtpm *dtpm, struct dtpm_ops *ops);
|
|
|
|
void dtpm_unregister(struct dtpm *dtpm);
|
|
|
|
int dtpm_register(const char *name, struct dtpm *dtpm, struct dtpm *parent);
|
|
|
|
int dtpm_register_cpu(struct dtpm *parent);
|
|
|
|
#endif
|