1 /*
2  * Arm SCP/MCP Software
3  * Copyright (c) 2021-2022, Arm Limited and Contributors. All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #include "morello_alarm_idx.h"
9 
10 #include <config_clock.h>
11 #include <morello_scp_mmap.h>
12 #include <morello_system_clock.h>
13 
14 #include <mod_gtimer.h>
15 #include <mod_timer.h>
16 
17 #include <fwk_id.h>
18 #include <fwk_module.h>
19 #include <fwk_module_idx.h>
20 #include <fwk_time.h>
21 
22 #include <fmw_cmsis.h>
23 
24 /*
25  * Generic timer driver config
26  */
27 static const struct fwk_element gtimer_dev_table[2] = {
28     [0] = {
29         .name = "REFCLK",
30         .data = &((struct mod_gtimer_dev_config){
31             .hw_timer = SCP_REFCLK_CNTBASE0_BASE,
32             .hw_counter = SCP_REFCLK_CNTCTL_BASE,
33             .control = SCP_REFCLK_CNTCONTROL_BASE,
34             .frequency = CLOCK_RATE_REFCLK,
35             .clock_id = FWK_ID_ELEMENT_INIT(
36                 FWK_MODULE_IDX_CLOCK,
37                 CLOCK_IDX_INTERCONNECT) }),
38           },
39     [1] = { 0 },
40 };
41 
42 const struct fwk_module_config config_gtimer = {
43     .elements = FWK_MODULE_STATIC_ELEMENTS_PTR(gtimer_dev_table),
44 };
45 
fmw_time_driver(const void ** ctx)46 struct fwk_time_driver fmw_time_driver(const void **ctx)
47 {
48     return mod_gtimer_driver(ctx, config_gtimer.elements.table[0].data);
49 }
50 
51 /*
52  * Timer HAL config
53  */
54 static const struct fwk_element timer_dev_table[2] = {
55     [0] = {
56         .name = "REFCLK",
57         .data = &((struct mod_timer_dev_config) {
58             .id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_GTIMER, 0),
59             .timer_irq = TIMREFCLK_IRQ,
60         }),
61         .sub_element_count = MORELLO_ALARM_IDX_COUNT, /* Number of alarms */
62     },
63     [1] = { 0 },
64 };
65 
timer_get_dev_table(fwk_id_t module_id)66 static const struct fwk_element *timer_get_dev_table(fwk_id_t module_id)
67 {
68     return timer_dev_table;
69 }
70 
71 const struct fwk_module_config config_timer = {
72     .elements = FWK_MODULE_DYNAMIC_ELEMENTS(timer_get_dev_table),
73 };
74