blob: 0314aa74d68248ca4886998c1d90bfe497083055 [file] [log] [blame]
Patrick Georgiac959032020-05-05 22:49:26 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Taniya Das0e03aa22019-08-07 11:28:28 +05302
3#include <assert.h>
4#include <commonlib/helpers.h>
5#include <device/mmio.h>
6#include <soc/clock.h>
7#include <types.h>
8
Taniya Dasd37aeb12021-06-23 09:08:57 +05309static struct clock_freq_config qspi_core_cfg[] = {
Taniya Das0e03aa22019-08-07 11:28:28 +053010 {
11 .hz = SRC_XO_HZ, /* 19.2KHz */
12 .src = SRC_XO_19_2MHZ,
Taniya Dasd37aeb12021-06-23 09:08:57 +053013 .div = QCOM_CLOCK_DIV(1),
Taniya Das0e03aa22019-08-07 11:28:28 +053014 },
15 {
16 .hz = 100 * MHz,
17 .src = SRC_GPLL0_EVEN_300MHZ,
Taniya Dasd37aeb12021-06-23 09:08:57 +053018 .div = QCOM_CLOCK_DIV(3),
Taniya Das0e03aa22019-08-07 11:28:28 +053019 },
20 {
21 .hz = 150 * MHz,
22 .src = SRC_GPLL0_EVEN_300MHZ,
Taniya Dasd37aeb12021-06-23 09:08:57 +053023 .div = QCOM_CLOCK_DIV(2),
Taniya Das0e03aa22019-08-07 11:28:28 +053024 },
25 {
26 .hz = GPLL0_EVEN_HZ, /* 300MHz */
27 .src = SRC_GPLL0_EVEN_300MHZ,
Taniya Dasd37aeb12021-06-23 09:08:57 +053028 .div = QCOM_CLOCK_DIV(1),
Taniya Das0e03aa22019-08-07 11:28:28 +053029 }
30};
31
Taniya Dasd37aeb12021-06-23 09:08:57 +053032static struct clock_freq_config qupv3_wrap_cfg[] = {
Taniya Dasece88ab2019-11-05 21:37:32 +053033 {
34 .hz = SRC_XO_HZ, /* 19.2KHz */
35 .src = SRC_XO_19_2MHZ,
Taniya Dasd37aeb12021-06-23 09:08:57 +053036 .div = QCOM_CLOCK_DIV(1),
Taniya Dasece88ab2019-11-05 21:37:32 +053037 },
38 {
39 .hz = 32 * MHz,
40 .src = SRC_GPLL0_EVEN_300MHZ,
Taniya Dasd37aeb12021-06-23 09:08:57 +053041 .div = QCOM_CLOCK_DIV(1),
Taniya Dasece88ab2019-11-05 21:37:32 +053042 .m = 8,
43 .n = 75,
Taniya Das91dc1e72019-12-19 16:41:02 +053044 .d_2 = 75,
Taniya Dasece88ab2019-11-05 21:37:32 +053045 },
46 {
47 .hz = 48 * MHz,
48 .src = SRC_GPLL0_EVEN_300MHZ,
Taniya Dasd37aeb12021-06-23 09:08:57 +053049 .div = QCOM_CLOCK_DIV(1),
Taniya Dasece88ab2019-11-05 21:37:32 +053050 .m = 4,
51 .n = 25,
Taniya Das91dc1e72019-12-19 16:41:02 +053052 .d_2 = 25,
Taniya Dasece88ab2019-11-05 21:37:32 +053053 },
54 {
55 .hz = 64 * MHz,
56 .src = SRC_GPLL0_EVEN_300MHZ,
Taniya Dasd37aeb12021-06-23 09:08:57 +053057 .div = QCOM_CLOCK_DIV(1),
Taniya Dasece88ab2019-11-05 21:37:32 +053058 .m = 16,
59 .n = 75,
Taniya Das91dc1e72019-12-19 16:41:02 +053060 .d_2 = 75,
Taniya Dasece88ab2019-11-05 21:37:32 +053061 },
62 {
63 .hz = 96 * MHz,
64 .src = SRC_GPLL0_EVEN_300MHZ,
Taniya Dasd37aeb12021-06-23 09:08:57 +053065 .div = QCOM_CLOCK_DIV(1),
Taniya Dasece88ab2019-11-05 21:37:32 +053066 .m = 8,
67 .n = 25,
Taniya Das91dc1e72019-12-19 16:41:02 +053068 .d_2 = 25,
Taniya Dasece88ab2019-11-05 21:37:32 +053069 },
70 {
71 .hz = 100 * MHz,
72 .src = SRC_GPLL0_EVEN_300MHZ,
Taniya Dasd37aeb12021-06-23 09:08:57 +053073 .div = QCOM_CLOCK_DIV(3),
Taniya Dasece88ab2019-11-05 21:37:32 +053074 },
75 {
76 .hz = SRC_XO_HZ, /* 19.2KHz */
77 .src = SRC_XO_19_2MHZ,
Taniya Dasd37aeb12021-06-23 09:08:57 +053078 .div = QCOM_CLOCK_DIV(1),
Taniya Dasece88ab2019-11-05 21:37:32 +053079 },
80 {
81 .hz = SRC_XO_HZ, /* 19.2KHz */
82 .src = SRC_XO_19_2MHZ,
Taniya Dasd37aeb12021-06-23 09:08:57 +053083 .div = QCOM_CLOCK_DIV(1),
Taniya Dasece88ab2019-11-05 21:37:32 +053084 },
85};
86
Taniya Dasd37aeb12021-06-23 09:08:57 +053087static struct clock_rcg_mnd *mdss_clock[MDSS_CLK_COUNT] = {
Taniya Dasdc92cea2019-07-08 12:00:51 +053088 [MDSS_CLK_ESC0] = &mdss->esc0,
89 [MDSS_CLK_PCLK0] = &mdss->pclk0,
90 [MDSS_CLK_BYTE0] = &mdss->byte0,
91 [MDSS_CLK_BYTE0_INTF] = &mdss->byte0,
92};
93
94static u32 *mdss_cbcr[MDSS_CLK_COUNT] = {
95 [MDSS_CLK_ESC0] = &mdss->esc0_cbcr,
96 [MDSS_CLK_PCLK0] = &mdss->pclk0_cbcr,
97 [MDSS_CLK_BYTE0] = &mdss->byte0_cbcr,
98 [MDSS_CLK_BYTE0_INTF] = &mdss->byte0_intf_cbcr,
99};
100
Taniya Das0e03aa22019-08-07 11:28:28 +0530101static int clock_configure_gpll0(void)
102{
Taniya Dasd37aeb12021-06-23 09:08:57 +0530103 struct alpha_pll_reg_val_config gpll0_cfg = {0};
Taniya Das0e03aa22019-08-07 11:28:28 +0530104
Taniya Dasd37aeb12021-06-23 09:08:57 +0530105 gpll0_cfg.reg_user_ctl_hi = &gcc->gpll0.user_ctl_u;
106 gpll0_cfg.user_ctl_hi_val = 1 << SCALE_FREQ_SHFT;
Taniya Das0e03aa22019-08-07 11:28:28 +0530107
Taniya Dasd37aeb12021-06-23 09:08:57 +0530108 gpll0_cfg.reg_user_ctl = &gcc->gpll0.user_ctl;
109 gpll0_cfg.user_ctl_val = (1 << PLL_POST_DIV_EVEN_SHFT |
110 1 << PLL_PLLOUT_EVEN_SHFT |
111 1 << PLL_PLLOUT_MAIN_SHFT |
112 1 << PLL_PLLOUT_ODD_SHFT);
Taniya Das0e03aa22019-08-07 11:28:28 +0530113
Taniya Dasd37aeb12021-06-23 09:08:57 +0530114 return clock_configure_enable_gpll(&gpll0_cfg, false, 0);
Taniya Das0e03aa22019-08-07 11:28:28 +0530115}
116
117void clock_configure_qspi(uint32_t hz)
118{
119 clock_configure(&gcc->qspi_core,
120 qspi_core_cfg, hz,
121 ARRAY_SIZE(qspi_core_cfg));
122 clock_enable(&gcc->qspi_cnoc_ahb_cbcr);
Taniya Dasdc92cea2019-07-08 12:00:51 +0530123 clock_enable(&gcc->qspi_core_cbcr);
Taniya Das0e03aa22019-08-07 11:28:28 +0530124}
125
Taniya Das310edec2021-06-23 08:53:39 +0530126void clock_configure_dfsr(int qup)
Taniya Das0e03aa22019-08-07 11:28:28 +0530127{
Taniya Das310edec2021-06-23 08:53:39 +0530128 clock_configure_dfsr_table(qup, qupv3_wrap_cfg,
Taniya Dasd37aeb12021-06-23 09:08:57 +0530129 ARRAY_SIZE(qupv3_wrap_cfg));
Taniya Das0e03aa22019-08-07 11:28:28 +0530130}
131
132void clock_enable_qup(int qup)
133{
134 int s = qup % QUP_WRAP1_S0;
135 int clk_en_off = qup < QUP_WRAP1_S0 ?
136 QUPV3_WRAP0_CLK_ENA_S(s) : QUPV3_WRAP1_CLK_ENA_S(s);
Taniya Dasd37aeb12021-06-23 09:08:57 +0530137 struct qupv3_clock *qup_clk = qup < QUP_WRAP1_S0 ?
Taniya Das0e03aa22019-08-07 11:28:28 +0530138 &gcc->qup_wrap0_s[s] : &gcc->qup_wrap1_s[s];
139
Taniya Dasd37aeb12021-06-23 09:08:57 +0530140 clock_enable_vote(&qup_clk->cbcr, &gcc->apcs_clk_br_en1,
141 clk_en_off);
Taniya Das310edec2021-06-23 08:53:39 +0530142}
143
144static enum cb_err pll_init_and_set(struct sc7180_apss_clock *apss, u32 l_val)
145{
Taniya Dasd37aeb12021-06-23 09:08:57 +0530146 struct alpha_pll_reg_val_config pll_cfg = {0};
Taniya Das310edec2021-06-23 08:53:39 +0530147 int ret;
Taniya Das8ad0c862020-02-28 17:05:49 +0530148 u32 gfmux_val;
149
Taniya Dasd37aeb12021-06-23 09:08:57 +0530150 pll_cfg.reg_config_ctl = &apss->pll.config_ctl_lo;
151 pll_cfg.reg_config_ctl_hi = &apss->pll.config_ctl_hi;
152 pll_cfg.reg_config_ctl_hi1 = &apss->pll.config_ctl_u1;
Taniya Das8ad0c862020-02-28 17:05:49 +0530153
Taniya Dasd37aeb12021-06-23 09:08:57 +0530154 pll_cfg.config_ctl_val = (0x2 << CTUNE_SHFT | 0x2 << K_I_SHFT |
155 0x5 << K_P_SHFT | 0x2 << PFA_MSB_SHFT |
156 0x2 << REF_CONT_SHFT);
157 pll_cfg.config_ctl_hi_val = (0x2 << CUR_ADJ_SHFT | BIT(DMET_SHFT) |
158 0xF << RES_SHFT);
Taniya Das8ad0c862020-02-28 17:05:49 +0530159
160 write32(&apss->pll.config_ctl_u1, 0x0);
Taniya Dasd37aeb12021-06-23 09:08:57 +0530161 pll_cfg.reg_l = &apss->pll.l;
162 pll_cfg.l_val = l_val;
Taniya Das8ad0c862020-02-28 17:05:49 +0530163
Taniya Dasd37aeb12021-06-23 09:08:57 +0530164 ret = clock_configure_enable_gpll(&pll_cfg, false, 0);
Taniya Dase3cf0082021-06-23 09:08:57 +0530165 if (ret != CB_SUCCESS)
Taniya Dasd37aeb12021-06-23 09:08:57 +0530166 return CB_ERR;
167
168 pll_cfg.reg_mode = &apss->pll.mode;
169 ret = agera_pll_enable(&pll_cfg);
Taniya Dase3cf0082021-06-23 09:08:57 +0530170 if (ret != CB_SUCCESS)
Taniya Das310edec2021-06-23 08:53:39 +0530171 return CB_ERR;
Taniya Das8ad0c862020-02-28 17:05:49 +0530172
173 gfmux_val = read32(&apss->cfg_gfmux) & ~GFMUX_SRC_SEL_BMSK;
174 gfmux_val |= APCS_SRC_EARLY;
175 write32(&apss->cfg_gfmux, gfmux_val);
176
Taniya Das310edec2021-06-23 08:53:39 +0530177 return CB_SUCCESS;
Taniya Das8ad0c862020-02-28 17:05:49 +0530178}
179
180static void speed_up_boot_cpu(void)
181{
182 /* 1516.8 MHz */
183 if (!pll_init_and_set(apss_silver, L_VAL_1516P8MHz))
184 printk(BIOS_DEBUG, "Silver Frequency bumped to 1.5168(GHz)\n");
185
186 /* 1209.6 MHz */
187 if (!pll_init_and_set(apss_l3, L_VAL_1209P6MHz))
188 printk(BIOS_DEBUG, "L3 Frequency bumped to 1.2096(GHz)\n");
189}
190
Taniya Das310edec2021-06-23 08:53:39 +0530191enum cb_err mdss_clock_configure(enum mdss_clock clk_type, uint32_t source,
192 uint32_t divider, uint32_t m,
Taniya Dasdc92cea2019-07-08 12:00:51 +0530193 uint32_t n, uint32_t d_2)
194{
Taniya Dasd37aeb12021-06-23 09:08:57 +0530195 struct clock_freq_config mdss_clk_cfg;
Taniya Dasdc92cea2019-07-08 12:00:51 +0530196
197 if (clk_type >= MDSS_CLK_COUNT)
Taniya Das310edec2021-06-23 08:53:39 +0530198 return CB_ERR;
Taniya Dasdc92cea2019-07-08 12:00:51 +0530199
200 /* Initialize it with received arguments */
201 mdss_clk_cfg.hz = 0;
202 mdss_clk_cfg.src = source;
203
204 /*
Taniya Das310edec2021-06-23 08:53:39 +0530205 * Update half_divider passed from display, this is to accommodate
206 * the transition to common clock driver.
207 *
Taniya Dasdc92cea2019-07-08 12:00:51 +0530208 * client is expected to provide 2n divider value,
209 * as the divider value in register is in form "2n-1"
210 */
Taniya Das310edec2021-06-23 08:53:39 +0530211 mdss_clk_cfg.div = divider ? ((divider * 2) - 1) : 0;
Taniya Dasdc92cea2019-07-08 12:00:51 +0530212 mdss_clk_cfg.m = m;
213 mdss_clk_cfg.n = n;
214 mdss_clk_cfg.d_2 = d_2;
215
Taniya Dasd37aeb12021-06-23 09:08:57 +0530216 return clock_configure((struct clock_rcg *)mdss_clock[clk_type],
Shelley Chen420ba8b2022-03-31 18:07:59 -0700217 &mdss_clk_cfg, 0, 1);
Taniya Dasdc92cea2019-07-08 12:00:51 +0530218}
219
220int mdss_clock_enable(enum mdss_clock clk_type)
221{
222 if (clk_type >= MDSS_CLK_COUNT)
Taniya Dasd37aeb12021-06-23 09:08:57 +0530223 return CB_ERR;
Taniya Dasdc92cea2019-07-08 12:00:51 +0530224
Taniya Dase3cf0082021-06-23 09:08:57 +0530225 /* Enable clock */
Taniya Dasd37aeb12021-06-23 09:08:57 +0530226 return clock_enable(mdss_cbcr[clk_type]);
Taniya Dasdc92cea2019-07-08 12:00:51 +0530227}
228
Taniya Das0e03aa22019-08-07 11:28:28 +0530229void clock_init(void)
230{
231 clock_configure_gpll0();
232
Taniya Dasdc92cea2019-07-08 12:00:51 +0530233 clock_enable_vote(&gcc->qup_wrap0_core_2x_cbcr,
Taniya Das0e03aa22019-08-07 11:28:28 +0530234 &gcc->apcs_clk_br_en1,
235 QUPV3_WRAP0_CORE_2X_CLK_ENA);
236 clock_enable_vote(&gcc->qup_wrap0_core_cbcr,
237 &gcc->apcs_clk_br_en1,
238 QUPV3_WRAP0_CORE_CLK_ENA);
239 clock_enable_vote(&gcc->qup_wrap0_m_ahb_cbcr,
240 &gcc->apcs_clk_br_en1,
241 QUPV3_WRAP_0_M_AHB_CLK_ENA);
242 clock_enable_vote(&gcc->qup_wrap0_s_ahb_cbcr,
243 &gcc->apcs_clk_br_en1,
244 QUPV3_WRAP_0_S_AHB_CLK_ENA);
245
246 clock_enable_vote(&gcc->qup_wrap1_core_2x_cbcr,
247 &gcc->apcs_clk_br_en1,
248 QUPV3_WRAP1_CORE_2X_CLK_ENA);
249 clock_enable_vote(&gcc->qup_wrap1_core_cbcr,
250 &gcc->apcs_clk_br_en1,
251 QUPV3_WRAP1_CORE_CLK_ENA);
252 clock_enable_vote(&gcc->qup_wrap1_m_ahb_cbcr,
253 &gcc->apcs_clk_br_en1,
254 QUPV3_WRAP_1_M_AHB_CLK_ENA);
255 clock_enable_vote(&gcc->qup_wrap1_s_ahb_cbcr,
256 &gcc->apcs_clk_br_en1,
257 QUPV3_WRAP_1_S_AHB_CLK_ENA);
Taniya Das8ad0c862020-02-28 17:05:49 +0530258 speed_up_boot_cpu();
Taniya Das0e03aa22019-08-07 11:28:28 +0530259}