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 = ®_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