• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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