1 /*
2  * Arm SCP/MCP Software
3  * Copyright (c) 2017-2022, Arm Limited and Contributors. All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #include <mod_reg_sensor.h>
9 #include <mod_sensor.h>
10 
11 #include <fwk_assert.h>
12 #include <fwk_id.h>
13 #include <fwk_mm.h>
14 #include <fwk_module.h>
15 #include <fwk_status.h>
16 
17 #include <stddef.h>
18 #include <stdint.h>
19 
20 static struct mod_reg_sensor_dev_config **config_table;
21 
22 /*
23  * Module API
24  */
get_value(fwk_id_t id,mod_sensor_value_t * value)25 static int get_value(fwk_id_t id, mod_sensor_value_t *value)
26 {
27     struct mod_reg_sensor_dev_config *config;
28 
29     config = config_table[fwk_id_get_element_idx(id)];
30     fwk_assert(config != NULL);
31 
32     if (value == NULL) {
33         return FWK_E_PARAM;
34     }
35 
36     *value = *(mod_sensor_value_t *)config->reg;
37 
38     return FWK_SUCCESS;
39 }
40 
get_info(fwk_id_t id,struct mod_sensor_info * info)41 static int get_info(fwk_id_t id, struct mod_sensor_info *info)
42 {
43     struct mod_reg_sensor_dev_config *config;
44 
45     config = config_table[fwk_id_get_element_idx(id)];
46     fwk_assert(config != NULL);
47 
48     if (info == NULL) {
49         return FWK_E_PARAM;
50     }
51 
52     *info = *(config->info);
53 
54     return FWK_SUCCESS;
55 }
56 
57 static const struct mod_sensor_driver_api reg_sensor_api = {
58     .get_value = get_value,
59     .get_info = get_info,
60 };
61 
62 /*
63  * Framework handlers
64  */
reg_sensor_init(fwk_id_t module_id,unsigned int element_count,const void * unused)65 static int reg_sensor_init(fwk_id_t module_id,
66                            unsigned int element_count,
67                            const void *unused)
68 {
69     config_table = fwk_mm_alloc(element_count, sizeof(*config_table));
70 
71     return FWK_SUCCESS;
72 }
73 
reg_sensor_element_init(fwk_id_t element_id,unsigned int sub_element_count,const void * data)74 static int reg_sensor_element_init(fwk_id_t element_id,
75                                    unsigned int sub_element_count,
76                                    const void *data)
77 {
78     struct mod_reg_sensor_dev_config *config =
79         (struct mod_reg_sensor_dev_config *)data;
80 
81     if (config->reg == 0) {
82         return FWK_E_DATA;
83     }
84 
85     config_table[fwk_id_get_element_idx(element_id)] = config;
86 
87     return FWK_SUCCESS;
88 }
89 
reg_sensor_process_bind_request(fwk_id_t source_id,fwk_id_t target_id,fwk_id_t api_type,const void ** api)90 static int reg_sensor_process_bind_request(fwk_id_t source_id,
91                                            fwk_id_t target_id,
92                                            fwk_id_t api_type,
93                                            const void **api)
94 {
95     *api = &reg_sensor_api;
96     return FWK_SUCCESS;
97 }
98 
99 const struct fwk_module module_reg_sensor = {
100     .api_count = 1,
101     .type = FWK_MODULE_TYPE_DRIVER,
102     .init = reg_sensor_init,
103     .element_init = reg_sensor_element_init,
104     .process_bind_request = reg_sensor_process_bind_request,
105 };
106