1*b45b5bacSMarek Vasut /*
2*b45b5bacSMarek Vasut * Copyright (c) 2015-2025, Renesas Electronics Corporation. All rights reserved.
3*b45b5bacSMarek Vasut *
4*b45b5bacSMarek Vasut * SPDX-License-Identifier: BSD-3-Clause
5*b45b5bacSMarek Vasut */
6*b45b5bacSMarek Vasut
7*b45b5bacSMarek Vasut #include <common/debug.h>
8*b45b5bacSMarek Vasut #include <lib/mmio.h>
9*b45b5bacSMarek Vasut #include <lib/utils_def.h>
10*b45b5bacSMarek Vasut
11*b45b5bacSMarek Vasut #define CPG_BASE 0xE6150000U
12*b45b5bacSMarek Vasut #define CPG_CPGWPR (CPG_BASE + 0x000U)
13*b45b5bacSMarek Vasut
14*b45b5bacSMarek Vasut #define MSSR_BASE CPG_BASE
15*b45b5bacSMarek Vasut #define MSSR_SRCR(n) (MSSR_BASE + 0x2C00U + (n) * 4)
16*b45b5bacSMarek Vasut #define MSSR_SRSTCLR(n) (MSSR_BASE + 0x2C80U + (n) * 4)
17*b45b5bacSMarek Vasut #define MSSR_MSTPCR(n) (MSSR_BASE + 0x2D00U + (n) * 4)
18*b45b5bacSMarek Vasut #define MSSR_MSTPSR(n) (MSSR_BASE + 0x2E00U + (n) * 4)
19*b45b5bacSMarek Vasut
cpg_write_32(uint32_t addr,uint32_t val)20*b45b5bacSMarek Vasut static void cpg_write_32(uint32_t addr, uint32_t val)
21*b45b5bacSMarek Vasut {
22*b45b5bacSMarek Vasut mmio_write_32(CPG_CPGWPR, ~val);
23*b45b5bacSMarek Vasut mmio_write_32(addr, val);
24*b45b5bacSMarek Vasut }
25*b45b5bacSMarek Vasut
rcar_mssr_clock(unsigned int n,uint32_t data,bool on,bool force)26*b45b5bacSMarek Vasut void rcar_mssr_clock(unsigned int n, uint32_t data, bool on, bool force)
27*b45b5bacSMarek Vasut {
28*b45b5bacSMarek Vasut uint32_t prev_status, next_status;
29*b45b5bacSMarek Vasut
30*b45b5bacSMarek Vasut prev_status = mmio_read_32(MSSR_MSTPSR(n));
31*b45b5bacSMarek Vasut
32*b45b5bacSMarek Vasut if (on)
33*b45b5bacSMarek Vasut next_status = prev_status & ~data;
34*b45b5bacSMarek Vasut else
35*b45b5bacSMarek Vasut next_status = prev_status | data;
36*b45b5bacSMarek Vasut
37*b45b5bacSMarek Vasut if (!force && (prev_status == next_status))
38*b45b5bacSMarek Vasut return;
39*b45b5bacSMarek Vasut
40*b45b5bacSMarek Vasut cpg_write_32(MSSR_MSTPCR(n), next_status);
41*b45b5bacSMarek Vasut
42*b45b5bacSMarek Vasut if (on)
43*b45b5bacSMarek Vasut while ((data & mmio_read_32(MSSR_MSTPSR(n))) != 0)
44*b45b5bacSMarek Vasut ;
45*b45b5bacSMarek Vasut else
46*b45b5bacSMarek Vasut while ((data & mmio_read_32(MSSR_MSTPSR(n))) == 0)
47*b45b5bacSMarek Vasut ;
48*b45b5bacSMarek Vasut }
49*b45b5bacSMarek Vasut
rcar_mssr_soft_reset(unsigned int n,uint32_t data,bool assert,bool force)50*b45b5bacSMarek Vasut void rcar_mssr_soft_reset(unsigned int n, uint32_t data, bool assert, bool force)
51*b45b5bacSMarek Vasut {
52*b45b5bacSMarek Vasut uint32_t prev_status, next_status;
53*b45b5bacSMarek Vasut
54*b45b5bacSMarek Vasut prev_status = mmio_read_32(MSSR_SRCR(n));
55*b45b5bacSMarek Vasut
56*b45b5bacSMarek Vasut if (assert)
57*b45b5bacSMarek Vasut next_status = prev_status | data;
58*b45b5bacSMarek Vasut else
59*b45b5bacSMarek Vasut next_status = prev_status & ~data;
60*b45b5bacSMarek Vasut
61*b45b5bacSMarek Vasut if (!force && (prev_status == next_status))
62*b45b5bacSMarek Vasut return;
63*b45b5bacSMarek Vasut
64*b45b5bacSMarek Vasut if (assert)
65*b45b5bacSMarek Vasut cpg_write_32(MSSR_SRCR(n), data);
66*b45b5bacSMarek Vasut else
67*b45b5bacSMarek Vasut cpg_write_32(MSSR_SRSTCLR(n), data);
68*b45b5bacSMarek Vasut }
69*b45b5bacSMarek Vasut
rcar_mssr_setup(void)70*b45b5bacSMarek Vasut void rcar_mssr_setup(void)
71*b45b5bacSMarek Vasut {
72*b45b5bacSMarek Vasut /* INTC-AP de-assert */
73*b45b5bacSMarek Vasut rcar_mssr_soft_reset(5, BIT(31), 0, 0);
74*b45b5bacSMarek Vasut rcar_mssr_soft_reset(11, BIT(19), 0, 0);
75*b45b5bacSMarek Vasut
76*b45b5bacSMarek Vasut /* INTC-AP clock on */
77*b45b5bacSMarek Vasut rcar_mssr_clock(5, BIT(31), 1, 0);
78*b45b5bacSMarek Vasut }
79