1 /*
2  * Arm SCP/MCP Software
3  * Copyright (c) 2018-2021, Arm Limited and Contributors. All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #include "synquacer_ddr.h"
9 
10 #include <mod_synquacer_memc.h>
11 
12 #include <fwk_id.h>
13 #include <fwk_log.h>
14 #include <fwk_module.h>
15 #include <fwk_module_idx.h>
16 #include <fwk_status.h>
17 
18 const struct mod_f_i2c_api *f_i2c_api;
19 const struct mod_timer_api *synquacer_memc_timer_api;
20 static int synquacer_memc_config(void);
21 
22 /* Framework API */
mod_synquacer_memc_init(fwk_id_t module_id,unsigned int element_count,const void * config)23 static int mod_synquacer_memc_init(
24     fwk_id_t module_id,
25     unsigned int element_count,
26     const void *config)
27 {
28     return FWK_SUCCESS;
29 }
30 
mod_synquacer_memc_element_init(fwk_id_t element_id,unsigned int unused,const void * data)31 static int mod_synquacer_memc_element_init(
32     fwk_id_t element_id,
33     unsigned int unused,
34     const void *data)
35 {
36     return FWK_SUCCESS;
37 }
38 
mod_synquacer_memc_bind(fwk_id_t id,unsigned int round)39 static int mod_synquacer_memc_bind(fwk_id_t id, unsigned int round)
40 {
41     int status;
42 
43     /* Nothing to do in the second round of calls. */
44     if (round == 1)
45         return FWK_SUCCESS;
46 
47     /* Nothing to do in case of elements. */
48     if (fwk_module_is_valid_element_id(id))
49         return FWK_SUCCESS;
50 
51     status = fwk_module_bind(
52         FWK_ID_MODULE(FWK_MODULE_IDX_F_I2C),
53         FWK_ID_API(FWK_MODULE_IDX_F_I2C, 0),
54         &f_i2c_api);
55     if (status != FWK_SUCCESS)
56         return status;
57 
58     status = fwk_module_bind(
59         FWK_ID_ELEMENT(FWK_MODULE_IDX_TIMER, 0),
60         FWK_ID_API(FWK_MODULE_IDX_TIMER, MOD_TIMER_API_IDX_TIMER),
61         &synquacer_memc_timer_api);
62     if (status != FWK_SUCCESS) {
63         return status;
64     }
65 
66     return FWK_SUCCESS;
67 }
68 
mod_synquacer_memc_start(fwk_id_t id)69 static int mod_synquacer_memc_start(fwk_id_t id)
70 {
71     synquacer_memc_config();
72     return FWK_SUCCESS;
73 }
74 
synquacer_memc_config(void)75 static int synquacer_memc_config(void)
76 {
77     fw_ddr_init();
78 
79     FWK_LOG_INFO("[SYNQUACER MEMC] DMC init done.");
80 
81     return FWK_SUCCESS;
82 }
83 
84 const struct fwk_module module_synquacer_memc = {
85     .type = FWK_MODULE_TYPE_DRIVER,
86     .init = mod_synquacer_memc_init,
87     .element_init = mod_synquacer_memc_element_init,
88     .bind = mod_synquacer_memc_bind,
89     .start = mod_synquacer_memc_start,
90     .api_count = 0,
91     .event_count = 0,
92 };
93