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 8 int 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 21 int 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 34 int 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 47 struct 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 63 struct 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 78 static 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 89 struct 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 102 void 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 111 struct 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 131 out_free: 132 free(th); 133 134 return NULL; 135 } 136