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