Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
  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}