summaryrefslogtreecommitdiffstats
path: root/src/soc/qualcomm/qcs405/include/soc/clock.h
blob: 636c8eff8fd3707778605c933f804efbe9cde4b6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
 /* SPDX-License-Identifier: GPL-2.0-only */
#include <soc/addressmap.h>
#include <types.h>

#ifndef __SOC_QUALCOMM_QCS405_CLOCK_H__
#define	__SOC_QUALCOMM_QCS405_CLOCK_H__

#define	BLSP1_AHB_CLK_ENA			10
#define BLSP2_AHB_CLK_ENA			20
#define SRC_XO_19_2MHZ				0
#define SRC_GPLL0_MAIN_800MHZ			1

/**
 *    USB BCR registers
 */
#define GCC_USB_HS_PHY_CFG_AHB_BCR	0x180000C
#define GCC_USB_HS_BCR			0x1841000
#define GCC_USB_30_BCR			0x1839000
#define GCC_USB2A_PHY_BCR		0x180000C
#define GCC_USB2_HS_PHY_ONLY_BCR	0x1841034
#define GCC_QUSB2_PHY_BCR		0x184103C

struct qcs405_rcg {
	u32 cmd;
	u32 cfg;
};

struct qcs405_clock {
	struct qcs405_rcg rcg;
	uint32_t m;
	uint32_t n;
	uint32_t d_2;
};

struct qcs405_bcr {
	uint32_t bcr;
};

struct qcs405_gpll {
	u32 mode;
	u32 l_val;
	u32 gpll_alpha_val;
	u32 gpll_alpha_val_u;
	u32 user_ctl;
	u32 user_ctl_u;
	u32 config_ctl;
	u32 test_ctl;
	u32 test_ctl_u;
};

struct qcs405_gcc {
	u8 _res0[0x1000 - 0x0];
	u32 blsp1_bcr;
	u32 blsp1_sleep_cbcr;
	u32 blsp1_ahb_cbcr;
	struct qcs405_rcg gcc_blsp_uart_sim_rcg;
	u8 _res1[0x2000 - 0x1014];
	u32 blsp1_qup1_bcr;
	u32 blsp1_qup1_spi_apps_cbcr;
	u32 blsp1_qup1_i2c_apps_cbcr;
	struct qcs405_clock blsp1_qup1_i2c_clk;
	u8 _res2[0x2024 - 0x2020];
	struct qcs405_clock blsp1_qup1_spi_clk;
	u8 _res3[0x3008-0x2038];
	u32 blsp1_qup2_bcr;
	u32 blsp1_qup2_spi_apps_cbcr;
	u8 _res4[0x3014 - 0x3010];
	struct qcs405_clock blsp1_qup2_spi_clk;
	u32 blsp1_uart2_bcr;
	u32 blsp1_uart2_apps_cbcr;
	u32 blsp1_uart2_sim_cbcr;
	struct qcs405_clock blsp1_uart2_apps_clk;
	u8 _res5[0x4018 - 0x3048];
	u32 blsp1_qup3_bcr;
	u32 blsp1_qup3_spi_apps_cbcr;
	u8 _res6[0x4024 - 0x4020];
	struct qcs405_clock blsp1_qup3_spi_clk;
	u8 _res7[0x5018 - 0x4038];
	u32 blsp1_qup4_bcr;
	u32 blsp1_qup4_spi_apps_cbcr;
	u8 _res8[0x5024 - 0x5020];
	struct qcs405_clock blsp1_qup4_spi_clk;
	u8 _res9[0x6020 - 0x5038];
	u32 blsp1_qup0_bcr;
	u32 blsp1_qup0_spi_apps_cbcr;
	u8 _res10[0x6034 - 0x6028];
	struct qcs405_clock blsp1_qup0_spi_clk;
	u8 _res11[0xB000 - 0x6048];
	u32 blsp2_bcr;
	u32 blsp2_sleep_cbcr;
	u32 blsp2_ahb_cbcr;
	u8 _res12[0xC000 - 0xB00C];
	u32 blsp2_qup0_bcr;
	u32 blsp2_qup0_spi_apps_cbcr;
	u8 _res13[0xC024 - 0xC008];
	struct qcs405_clock blsp2_qup0_spi_clk;
	u8 _res14[0x21000 - 0xC038];
	struct qcs405_gpll gpll0;
	u8 _res15[0x45004 - 0x21024];
	u32 gcc_apcs_clock_branch_en_vote;
};

struct mdss_clock_config {
	const char *clk_name;
	struct qcs405_clock *rcgr;
	uint32_t  *cbcr;
};

enum clk_ctl_gpll_user_ctl {
	CLK_CTL_GPLL_PLLOUT_LV_EARLY_BMSK	= 0x8,
	CLK_CTL_GPLL_PLLOUT_AUX2_BMSK		= 0x4,
	CLK_CTL_GPLL_PLLOUT_AUX_BMSK		= 0x2,
	CLK_CTL_GPLL_PLLOUT_MAIN_BMSK		= 0x1,
	CLK_CTL_GPLL_PLLOUT_LV_EARLY_SHFT	= 3,
	CLK_CTL_GPLL_PLLOUT_AUX2_SHFT		= 2,
	CLK_CTL_GPLL_PLLOUT_AUX_SHFT		= 1,
	CLK_CTL_GPLL_PLLOUT_MAIN_SHFT		= 0,
};

enum clk_ctl_cfg_rcgr {
	CLK_CTL_CFG_MODE_BMSK		= 0x3000,
	CLK_CTL_CFG_MODE_SHFT		= 12,
	CLK_CTL_CFG_SRC_SEL_BMSK	= 0x700,
	CLK_CTL_CFG_SRC_SEL_SHFT	= 8,
	CLK_CTL_CFG_SRC_DIV_BMSK	= 0x1F,
	CLK_CTL_CFG_SRC_DIV_SHFT	= 0
};

enum clk_ctl_cmd_rcgr {
	CLK_CTL_CMD_ROOT_OFF_BMSK	= 0x80000000,
	CLK_CTL_CMD_ROOT_OFF_SHFT	= 31,
	CLK_CTL_CMD_ROOT_EN_BMSK	= 0x2,
	CLK_CTL_CMD_ROOT_EN_SHFT	= 1,
	CLK_CTL_CMD_UPDATE_BMSK		= 0x1,
	CLK_CTL_CMD_UPDATE_SHFT		= 0
};

enum clk_ctl_cbcr {
	CLK_CTL_CBC_CLK_OFF_BMSK	= 0x80000000,
	CLK_CTL_CBC_CLK_OFF_SHFT	= 31,
	CLK_CTL_CBC_CLK_EN_BMSK		= 0x1,
	CLK_CTL_CBC_CLK_EN_SHFT		= 0
};

enum clk_ctl_rcg_mnd {
	CLK_CTL_RCG_MND_BMSK		= 0xFFFF,
	CLK_CTL_RCG_MND_SHFT		= 0,
};

enum clk_ctl_bcr {
	CLK_CTL_BCR_BLK_ARES_BMSK	= 0x1,
	CLK_CTL_BCR_BLK_ARES_SHFT	= 0,
};

struct clock_config {
	uint32_t hz;
	uint32_t hw_ctl;
	uint32_t src;
	uint32_t div;
	uint32_t m;
	uint32_t n;
	uint32_t d_2;
};

static struct qcs405_gcc *const gcc = (void *)GCC_BASE;

void clock_init(void);
void clock_reset_aop(void);
int clock_configure_qspi(uint32_t hz);
int clock_reset_bcr(void *bcr_addr, bool reset);
void clock_configure_uart(uint32_t hz);
void clock_configure_i2c(uint32_t hz);
void clock_configure_spi(int blsp, int qup, uint32_t hz);
void clock_enable_uart(void);
void clock_disable_uart(void);
void clock_enable_spi(int blsp, int qup);
void clock_disable_spi(int blsp, int qup);
void clock_enable_i2c(void);
void clock_disable_i2c(void);

#endif	// __SOC_QUALCOMM_QCS405_CLOCK_H__