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 */ 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 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); 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 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 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