brintos

brintos / linux-shallow public Read only

0
0
Text · 2.1 KiB · 72a76dc Raw
136 lines · c
1// SPDX-License-Identifier: LGPL-2.1+2// Copyright (C) 2022, Linaro Ltd - Daniel Lezcano <daniel.lezcano@linaro.org>3#include <stdio.h>4#include <thermal.h>5 6#include "thermal_nl.h"7 8int for_each_thermal_cdev(struct thermal_cdev *cdev, cb_tc_t cb, void *arg)9{10	int i, ret = 0;11 12	if (!cdev)13		return 0;14 15	for (i = 0; cdev[i].id != -1; i++)16		ret |= cb(&cdev[i], arg);17 18	return ret;19}20 21int for_each_thermal_trip(struct thermal_trip *tt, cb_tt_t cb, void *arg)22{23	int i, ret = 0;24 25	if (!tt)26		return 0;27 28	for (i = 0; tt[i].id != -1; i++)29		ret |= cb(&tt[i], arg);30 31	return ret;32}33 34int for_each_thermal_zone(struct thermal_zone *tz, cb_tz_t cb, void *arg)35{36	int i, ret = 0;37 38	if (!tz)39		return 0;40 41	for (i = 0; tz[i].id != -1; i++)42		ret |= cb(&tz[i], arg);43 44	return ret;45}46 47struct thermal_zone *thermal_zone_find_by_name(struct thermal_zone *tz,48					       const char *name)49{50	int i;51 52	if (!tz || !name)53		return NULL;54 55	for (i = 0; tz[i].id != -1; i++) {56		if (!strcmp(tz[i].name, name))57			return &tz[i];58	}59 60	return NULL;61}62 63struct thermal_zone *thermal_zone_find_by_id(struct thermal_zone *tz, int id)64{65	int i;66 67	if (!tz || id < 0)68		return NULL;69 70	for (i = 0; tz[i].id != -1; i++) {71		if (tz[i].id == id)72			return &tz[i];73	}74 75	return NULL;76}77 78static int __thermal_zone_discover(struct thermal_zone *tz, void *th)79{80	if (thermal_cmd_get_trip(th, tz) < 0)81		return -1;82 83	if (thermal_cmd_get_governor(th, tz))84		return -1;85 86	return 0;87}88 89struct thermal_zone *thermal_zone_discover(struct thermal_handler *th)90{91	struct thermal_zone *tz;92 93	if (thermal_cmd_get_tz(th, &tz) < 0)94		return NULL;95 96	if (for_each_thermal_zone(tz, __thermal_zone_discover, th))97		return NULL;98 99	return tz;100}101 102void thermal_exit(struct thermal_handler *th)103{104	thermal_cmd_exit(th);105	thermal_events_exit(th);106	thermal_sampling_exit(th);107 108	free(th);109}110 111struct thermal_handler *thermal_init(struct thermal_ops *ops)112{113	struct thermal_handler *th;114 115	th = malloc(sizeof(*th));116	if (!th)117		return NULL;118	th->ops = ops;119 120	if (thermal_events_init(th))121		goto out_free;122 123	if (thermal_sampling_init(th))124		goto out_free;125 126	if (thermal_cmd_init(th))127		goto out_free;128 129	return th;130 131out_free:132	free(th);133 134	return NULL;135}136