blob: bd46843b2ef675f70e5fa131ad6a925237fc37f9 [file] [log] [blame]
Xing Zheng93280b72016-10-26 21:25:26 +08001/*
2 * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * Redistributions of source code must retain the above copyright notice, this
8 * list of conditions and the following disclaimer.
9 *
10 * Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 *
14 * Neither the name of ARM nor the names of its contributors may be used
15 * to endorse or promote products derived from this software without specific
16 * prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 * POSSIBILITY OF SUCH DAMAGE.
29 */
30
Xing Zhengb4bcc1d2017-02-24 16:26:11 +080031#include <dram_regs.h>
Xing Zheng93280b72016-10-26 21:25:26 +080032#include <m0_param.h>
Xing Zhengb4bcc1d2017-02-24 16:26:11 +080033#include <pmu_bits.h>
34#include <pmu_regs.h>
35#include "misc_regs.h"
Xing Zheng93280b72016-10-26 21:25:26 +080036#include "rk3399_mcu.h"
37
Xing Zhengb4bcc1d2017-02-24 16:26:11 +080038static uint32_t gatedis_con0;
Lin Huang25103662016-12-30 11:50:01 +080039
Xing Zheng93280b72016-10-26 21:25:26 +080040static void idle_port(void)
41{
Xing Zhengb4bcc1d2017-02-24 16:26:11 +080042 gatedis_con0 = mmio_read_32(PMUCRU_BASE + PMU_CRU_GATEDIS_CON0);
43 mmio_write_32(PMUCRU_BASE + PMU_CRU_GATEDIS_CON0, 0x3fffffff);
44
Xing Zheng93280b72016-10-26 21:25:26 +080045 mmio_setbits_32(PMU_BASE + PMU_BUS_IDLE_REQ,
Xing Zhengb4bcc1d2017-02-24 16:26:11 +080046 (1 << PMU_IDLE_REQ_MSCH0) | (1 << PMU_IDLE_REQ_MSCH1));
Xing Zheng93280b72016-10-26 21:25:26 +080047 while ((mmio_read_32(PMU_BASE + PMU_BUS_IDLE_ST) &
Xing Zhengb4bcc1d2017-02-24 16:26:11 +080048 ((1 << PMU_IDLE_ST_MSCH1) | (1 << PMU_IDLE_ST_MSCH0))) !=
49 ((1 << PMU_IDLE_ST_MSCH1) | (1 << PMU_IDLE_ST_MSCH0)))
Xing Zheng93280b72016-10-26 21:25:26 +080050 continue;
51}
52
53static void deidle_port(void)
54{
55 mmio_clrbits_32(PMU_BASE + PMU_BUS_IDLE_REQ,
Xing Zhengb4bcc1d2017-02-24 16:26:11 +080056 (1 << PMU_IDLE_REQ_MSCH0) | (1 << PMU_IDLE_REQ_MSCH1));
Xing Zheng93280b72016-10-26 21:25:26 +080057 while (mmio_read_32(PMU_BASE + PMU_BUS_IDLE_ST) &
Xing Zhengb4bcc1d2017-02-24 16:26:11 +080058 ((1 << PMU_IDLE_ST_MSCH1) | (1 << PMU_IDLE_ST_MSCH0)))
Xing Zheng93280b72016-10-26 21:25:26 +080059 continue;
Lin Huang25103662016-12-30 11:50:01 +080060
61 /* document is wrong, PMU_CRU_GATEDIS_CON0 do not need set MASK BIT */
Xing Zhengb4bcc1d2017-02-24 16:26:11 +080062 mmio_write_32(PMUCRU_BASE + PMU_CRU_GATEDIS_CON0, gatedis_con0);
Xing Zheng93280b72016-10-26 21:25:26 +080063}
64
65static void ddr_set_pll(void)
66{
Xing Zhengb4bcc1d2017-02-24 16:26:11 +080067 mmio_write_32(CRU_BASE + CRU_DPLL_CON3, PLL_MODE(PLL_SLOW_MODE));
Xing Zheng93280b72016-10-26 21:25:26 +080068
Xing Zhengb4bcc1d2017-02-24 16:26:11 +080069 mmio_write_32(CRU_BASE + CRU_DPLL_CON3, PLL_POWER_DOWN(1));
70 mmio_write_32(CRU_BASE + CRU_DPLL_CON0,
Xing Zheng93280b72016-10-26 21:25:26 +080071 mmio_read_32(PARAM_ADDR + PARAM_DPLL_CON0));
Xing Zhengb4bcc1d2017-02-24 16:26:11 +080072 mmio_write_32(CRU_BASE + CRU_DPLL_CON1,
Xing Zheng93280b72016-10-26 21:25:26 +080073 mmio_read_32(PARAM_ADDR + PARAM_DPLL_CON1));
Xing Zhengb4bcc1d2017-02-24 16:26:11 +080074 mmio_write_32(CRU_BASE + CRU_DPLL_CON3, PLL_POWER_DOWN(0));
Xing Zheng93280b72016-10-26 21:25:26 +080075
Xing Zhengb4bcc1d2017-02-24 16:26:11 +080076 while ((mmio_read_32(CRU_BASE + CRU_DPLL_CON2) & (1u << 31)) == 0)
Xing Zheng93280b72016-10-26 21:25:26 +080077 continue;
78
Xing Zhengb4bcc1d2017-02-24 16:26:11 +080079 mmio_write_32(CRU_BASE + CRU_DPLL_CON3, PLL_MODE(PLL_NORMAL_MODE));
Xing Zheng93280b72016-10-26 21:25:26 +080080}
81
82void handle_dram(void)
83{
Derek Basehore397046c2017-02-01 18:09:13 -080084 mmio_setbits_32(PHY_REG(0, 927), (1 << 22));
85 mmio_setbits_32(PHY_REG(1, 927), (1 << 22));
Xing Zheng93280b72016-10-26 21:25:26 +080086 idle_port();
87
Xing Zhengb4bcc1d2017-02-24 16:26:11 +080088 mmio_write_32(CIC_BASE + CIC_CTRL0,
Xing Zheng93280b72016-10-26 21:25:26 +080089 (((0x3 << 4) | (1 << 2) | 1) << 16) |
90 (1 << 2) | 1 |
91 mmio_read_32(PARAM_ADDR + PARAM_FREQ_SELECT));
Xing Zhengb4bcc1d2017-02-24 16:26:11 +080092 while ((mmio_read_32(CIC_BASE + CIC_STATUS0) & (1 << 2)) == 0)
Xing Zheng93280b72016-10-26 21:25:26 +080093 continue;
94
95 ddr_set_pll();
Xing Zhengb4bcc1d2017-02-24 16:26:11 +080096 mmio_write_32(CIC_BASE + CIC_CTRL0, 0x20002);
97 while ((mmio_read_32(CIC_BASE + CIC_STATUS0) & (1 << 0)) == 0)
Xing Zheng93280b72016-10-26 21:25:26 +080098 continue;
99
100 deidle_port();
Derek Basehore397046c2017-02-01 18:09:13 -0800101 mmio_clrbits_32(PHY_REG(0, 927), (1 << 22));
102 mmio_clrbits_32(PHY_REG(1, 927), (1 << 22));
Xing Zheng93280b72016-10-26 21:25:26 +0800103}