soc/mediatek/mt8196: Add MT6685 Clock IC driver
[coreboot2.git] / src / soc / qualcomm / ipq806x / gsbi.c
blob547ccff21e9944cedeb69323df93ac2d6380aeeb
1 /* SPDX-License-Identifier: BSD-3-Clause */
3 #include <device/mmio.h>
4 #include <soc/iomap.h>
5 #include <soc/gsbi.h>
6 #include <console/console.h>
8 static inline void *gsbi_ctl_reg_addr(gsbi_id_t gsbi_id)
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;
31 gsbi_return_t gsbi_init(gsbi_id_t gsbi_id, gsbi_protocol_t protocol)
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);
41 if (!gsbi_ctl)
42 return GSBI_ID_ERROR;
44 write32(GSBI_HCLK_CTL(gsbi_id),
45 (1 << GSBI_HCLK_CTL_GATE_ENA) | (1 << GSBI_HCLK_CTL_BRANCH_ENA));
47 if (gsbi_init_board(gsbi_id))
48 return GSBI_UNSUPPORTED;
50 write32(GSBI_QUP_APSS_NS_REG(gsbi_id), 0);
51 write32(GSBI_QUP_APSS_MD_REG(gsbi_id), 0);
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);
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);
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);
70 reg_val |= (1 << GSBI_QUP_APPS_BRANCH_ENA_SFT);
71 write32(GSBI_QUP_APSS_NS_REG(gsbi_id), reg_val);
73 /*Select i2c protocol*/
74 write32(gsbi_ctl,
75 ((GSBI_CTL_PROTO_I2C & GSBI_CTL_PROTO_CODE_MSK) << GSBI_CTL_PROTO_CODE_SFT));
77 return GSBI_SUCCESS;