1 /* SPDX-License-Identifier: BSD-3-Clause */
2
3 #include <device/mmio.h>
4 #include <soc/iomap.h>
5 #include <soc/gsbi.h>
6 #include <console/console.h>
7
gsbi_ctl_reg_addr(gsbi_id_t gsbi_id)8 static inline void *gsbi_ctl_reg_addr(gsbi_id_t gsbi_id)
9 {
10 switch (gsbi_id) {
11 case GSBI_ID_1:
12 return GSBI1_CTL_REG;
13 case GSBI_ID_2:
14 return GSBI2_CTL_REG;
15 case GSBI_ID_3:
16 return GSBI3_CTL_REG;
17 case GSBI_ID_4:
18 return GSBI4_CTL_REG;
19 case GSBI_ID_5:
20 return GSBI5_CTL_REG;
21 case GSBI_ID_6:
22 return GSBI6_CTL_REG;
23 case GSBI_ID_7:
24 return GSBI7_CTL_REG;
25 default:
26 printk(BIOS_ERR, "Unsupported GSBI%d\n", gsbi_id);
27 return 0;
28 }
29 }
30
gsbi_init(gsbi_id_t gsbi_id,gsbi_protocol_t protocol)31 gsbi_return_t gsbi_init(gsbi_id_t gsbi_id, gsbi_protocol_t protocol)
32 {
33 unsigned int reg_val;
34 unsigned int m = 1;
35 unsigned int n = 4;
36 unsigned int pre_div = 4;
37 unsigned int src = 3;
38 unsigned int mnctr_mode = 2;
39 void *gsbi_ctl = gsbi_ctl_reg_addr(gsbi_id);
40
41 if (!gsbi_ctl)
42 return GSBI_ID_ERROR;
43
44 write32(GSBI_HCLK_CTL(gsbi_id),
45 (1 << GSBI_HCLK_CTL_GATE_ENA) | (1 << GSBI_HCLK_CTL_BRANCH_ENA));
46
47 if (gsbi_init_board(gsbi_id))
48 return GSBI_UNSUPPORTED;
49
50 write32(GSBI_QUP_APSS_NS_REG(gsbi_id), 0);
51 write32(GSBI_QUP_APSS_MD_REG(gsbi_id), 0);
52
53 reg_val = ((m & GSBI_QUP_APPS_M_MASK) << GSBI_QUP_APPS_M_SHFT) |
54 ((~n & GSBI_QUP_APPS_D_MASK) << GSBI_QUP_APPS_D_SHFT);
55 write32(GSBI_QUP_APSS_MD_REG(gsbi_id), reg_val);
56
57 reg_val = (((~(n - m)) & GSBI_QUP_APPS_N_MASK) <<
58 GSBI_QUP_APPS_N_SHFT) |
59 ((mnctr_mode & GSBI_QUP_APPS_MNCTR_MODE_MSK) <<
60 GSBI_QUP_APPS_MNCTR_MODE_SFT) |
61 (((pre_div - 1) & GSBI_QUP_APPS_PRE_DIV_MSK) <<
62 GSBI_QUP_APPS_PRE_DIV_SFT) |
63 (src & GSBI_QUP_APPS_SRC_SEL_MSK);
64 write32(GSBI_QUP_APSS_NS_REG(gsbi_id), reg_val);
65
66 reg_val |= (1 << GSBI_QUP_APPS_ROOT_ENA_SFT) |
67 (1 << GSBI_QUP_APPS_MNCTR_EN_SFT);
68 write32(GSBI_QUP_APSS_NS_REG(gsbi_id), reg_val);
69
70 reg_val |= (1 << GSBI_QUP_APPS_BRANCH_ENA_SFT);
71 write32(GSBI_QUP_APSS_NS_REG(gsbi_id), reg_val);
72
73 /*Select i2c protocol*/
74 write32(gsbi_ctl,
75 ((GSBI_CTL_PROTO_I2C & GSBI_CTL_PROTO_CODE_MSK) << GSBI_CTL_PROTO_CODE_SFT));
76
77 return GSBI_SUCCESS;
78 }
79