blob: d6a97b22bf3a68e2b29ca3bde56392a2e94a109b [file] [log] [blame]
Christine Gharzuzi9a772df2018-06-25 13:39:37 +03001/*
2 * Copyright (C) 2018 Marvell International Ltd.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 * https://spdx.org/licenses
6 */
7
Antonio Nino Diaze0f90632018-12-14 00:18:21 +00008#include <drivers/delay_timer.h>
9#include <drivers/marvell/aro.h>
10#include <lib/mmio.h>
11
Christine Gharzuzi9a772df2018-06-25 13:39:37 +030012#include <a8k_plat_def.h>
Christine Gharzuzi9a772df2018-06-25 13:39:37 +030013
14/* Notify bootloader on DRAM setup */
15#define AP807_CPU_ARO_CTRL(cluster) \
16 (MVEBU_RFU_BASE + 0x82A8 + (0xA58 * (cluster)))
17
18/* 0 - ARO clock is enabled, 1 - ARO clock is disabled */
19#define AP807_CPU_ARO_CLK_EN_OFFSET 0
20#define AP807_CPU_ARO_CLK_EN_MASK (0x1 << AP807_CPU_ARO_CLK_EN_OFFSET)
21
22/* 0 - ARO is the clock source, 1 - PLL is the clock source */
23#define AP807_CPU_ARO_SEL_PLL_OFFSET 5
24#define AP807_CPU_ARO_SEL_PLL_MASK (0x1 << AP807_CPU_ARO_SEL_PLL_OFFSET)
25
26/* AP807 clusters count */
27#define AP807_CLUSTER_NUM 2
28
29/* PLL frequency values */
30#define PLL_FREQ_1200 0x2AE5F002 /* 1200 */
31#define PLL_FREQ_2000 0x2FC9F002 /* 2000 */
32#define PLL_FREQ_2200 0x2AC57001 /* 2200 */
33#define PLL_FREQ_2400 0x2AE5F001 /* 2400 */
34
35/* CPU PLL control registers */
36#define AP807_CPU_PLL_CTRL(cluster) \
37 (MVEBU_RFU_BASE + 0x82E0 + (0x8 * (cluster)))
38
39#define AP807_CPU_PLL_PARAM(cluster) AP807_CPU_PLL_CTRL(cluster)
40#define AP807_CPU_PLL_CFG(cluster) (AP807_CPU_PLL_CTRL(cluster) + 0x4)
41#define AP807_CPU_PLL_CFG_BYPASS_MODE (0x1)
42#define AP807_CPU_PLL_CFG_USE_REG_FILE (0x1 << 9)
43
44static void pll_set_freq(unsigned int freq_val)
45{
46 int i;
47
48 for (i = 0 ; i < AP807_CLUSTER_NUM ; i++) {
Christine Gharzuzi9a772df2018-06-25 13:39:37 +030049 mmio_write_32(AP807_CPU_PLL_PARAM(i), freq_val);
50 mmio_write_32(AP807_CPU_PLL_CFG(i),
51 AP807_CPU_PLL_CFG_USE_REG_FILE);
52 }
53}
54
55/* Switch to ARO from PLL in ap807 */
56static void aro_to_pll(void)
57{
58 unsigned int reg;
59 int i;
60
61 for (i = 0 ; i < AP807_CLUSTER_NUM ; i++) {
62 /* switch from ARO to PLL */
63 reg = mmio_read_32(AP807_CPU_ARO_CTRL(i));
64 reg |= AP807_CPU_ARO_SEL_PLL_MASK;
65 mmio_write_32(AP807_CPU_ARO_CTRL(i), reg);
66
67 mdelay(100);
68
69 /* disable ARO clk driver */
70 reg = mmio_read_32(AP807_CPU_ARO_CTRL(i));
71 reg |= (AP807_CPU_ARO_CLK_EN_MASK);
72 mmio_write_32(AP807_CPU_ARO_CTRL(i), reg);
73 }
74}
75
76/* switch from ARO to PLL
77 * in case of default frequency option, configure PLL registers
78 * to be aligned with new default frequency.
79 */
80void ap807_clocks_init(unsigned int freq_option)
81{
Christine Gharzuzi9a772df2018-06-25 13:39:37 +030082 /* Modifications in frequency table:
83 * 0x0: 764x: change to 2000 MHz.
84 * 0x2: 744x change to 1800 MHz, 764x change to 2200/2400.
85 * 0x3: 3900/744x/764x change to 1200 MHz.
86 */
Alex Leibovich605162e2019-02-10 15:08:25 +020087
88 if (freq_option == CPU_2200_DDR_1200_RCLK_1200)
Grzegorz Jaszczyka5d06272018-12-20 17:13:19 +010089 pll_set_freq(PLL_FREQ_2200);
Alex Leibovich605162e2019-02-10 15:08:25 +020090
91 /* Switch from ARO to PLL */
92 aro_to_pll();
93
Christine Gharzuzi9a772df2018-06-25 13:39:37 +030094}