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