1 /*
2 * Copyright 2021-2024 NXP
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7 #include <lib/libc/errno.h>
8 #include <stdint.h>
9 #include <stdlib.h>
10 #include <string.h>
11
12 #include "../../../drivers/scmi-msg/sensor.h"
13
14 #include <common/debug.h>
15 #include <drivers/scmi.h>
16 #include <lib/mmio.h>
17 #include <lib/utils_def.h>
18 #include <scmi.h>
19
20 #include <upower_api.h>
21
22 /* Only Temperature now */
imx_scmi_sensor_count(unsigned int agent_id __unused)23 static uint16_t imx_scmi_sensor_count(unsigned int agent_id __unused)
24 {
25 return 1U;
26 }
27
imx_scmi_sensor_max_requests(unsigned int agent_id __unused)28 uint8_t imx_scmi_sensor_max_requests(unsigned int agent_id __unused)
29 {
30 return 1U;
31 }
32
33 extern int upower_read_temperature(uint32_t sensor_id, int32_t *temperature);
imx_scmi_sensor_reading_get(uint32_t agent_id __unused,uint16_t sensor_id __unused,uint32_t * val)34 int imx_scmi_sensor_reading_get(uint32_t agent_id __unused, uint16_t sensor_id __unused,
35 uint32_t *val)
36 {
37 int32_t temperature;
38 int ret;
39
40 ret = upower_read_temperature(1, &temperature);
41 if (ret != 0U) {
42 val[0] = 0xFFFFFFFF;
43 } else {
44 val[0] = temperature;
45 }
46
47 val[1] = 0;
48 val[2] = 0;
49 val[3] = 0;
50
51 return ret;
52 }
53
54 #define SCMI_SENSOR_NAME_LENGTH_MAX 16U
55
imx_scmi_sensor_state(uint32_t agent_id __unused,uint16_t sensor_id __unused)56 uint32_t imx_scmi_sensor_state(uint32_t agent_id __unused, uint16_t sensor_id __unused)
57 {
58 return 1U;
59 }
60
imx_scmi_sensor_description_get(uint32_t agent_id __unused,uint16_t desc_index __unused,struct scmi_sensor_desc * desc __unused)61 uint32_t imx_scmi_sensor_description_get(uint32_t agent_id __unused, uint16_t desc_index __unused,
62 struct scmi_sensor_desc *desc __unused)
63 {
64 desc->id = 0;
65 desc->attr_low = 0;
66 desc->attr_high = 2;
67 strlcpy((char *)desc->name, "UPOWER-TEMP", 12);
68 desc->power = 0;
69 desc->resolution = 0;
70 desc->min_range_low = 0;
71 desc->min_range_high = 0x80000000;
72 desc->max_range_low = 0xffffffff;
73 desc->max_range_high = 0x7fffffff;
74
75 return 1U;
76 }
77
78 REGISTER_SCMI_SENSOR_OPS(imx_scmi_sensor_count,
79 imx_scmi_sensor_max_requests,
80 NULL,
81 imx_scmi_sensor_reading_get,
82 imx_scmi_sensor_description_get,
83 NULL,
84 imx_scmi_sensor_state,
85 NULL);
86