hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
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
/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
/*
 * Copyright (c) 2023 Rockchip Electronics Co., Ltd.
 */
 
#include <linux/linkage.h>
#include <asm/assembler.h>
 
#include "rv1106_pm.h"
 
#define RV1106_GPIO0_INT_ST        0xff380050
#define RV1106_PMUGRF_OS_REG10        0xff020228
#define RV1106_PMUGRF_SOC_CON4        0xff020010
#define RV1106_CRU_GLB_SRST_FST        0xff3b0c08
 
#define RV1106_CRU_GLB_RST_CON_ADDR    0xff3b0c10
#define CRU_FST_RST_PMU_VAL        0x000c000c
 
#if RV1106_SLEEP_DEBUG
/********************* console used for sleep.S ******************************/
#define UART_REG_DLL    (0x00)
#define UART_REG_DLH    (0x04)
#define UART_REG_IER    (0x04)
#define UART_REG_FCR    (0x08)
#define UART_REG_LCR    (0x0c)
#define UART_REG_MCR    (0x10)
 
#define UARTLCR_DLAB    (1 << 7)
#define UARTFCR_DMAEN    (1 << 3)
#define UARTFCR_FIFOEN    (1 << 0)
 
#define CONSOLE_UART_BASE    0xff4c0000
#define CONSOLE_CLKRATE     24000000
#define CONSOLE_BAUDRATE    115200
 
#define GPIO1_B_IOMUX        0xff538008
#define GRF_GPIO1D_VAL        0xff002200
 
.macro early_console_init
   ldr r0, =GPIO1_B_IOMUX
   ldr r1, =GRF_GPIO1D_VAL
   str r1, [r0]
 
   ldr    r0, =CONSOLE_UART_BASE
   ldr    r1, =CONSOLE_CLKRATE
   ldr    r2, =CONSOLE_BAUDRATE
   /* Program the baudrate */
   /* Divisor =  Uart clock / (16 * baudrate) */
   mov    r1, #0xd
   mov    r2, #0x0
   ldr    r3, [r0, #UART_REG_LCR]
   orr    r3, r3, #UARTLCR_DLAB
   str    r3, [r0, #UART_REG_LCR] /* enable DLL, DLH programming */
   str    r1, [r0, #UART_REG_DLL] /* program DLL */
   str    r2, [r0, #UART_REG_DLH] /* program DLH */
   mov    r2, #~UARTLCR_DLAB
   and    r3, r3, r2
   str    r3, [r0, #UART_REG_LCR] /* disable DLL, DLH programming */
 
   /* 8n1 */
   mov    r3, #3
   str    r3, [r0, #UART_REG_LCR]
   /* no interrupt */
   mov    r3, #0
   str    r3, [r0, #UART_REG_IER]
   /* enable fifo, DMA */
   mov    r3, #(UARTFCR_FIFOEN | UARTFCR_DMAEN)
   str    r3, [r0, #UART_REG_FCR]
   /* DTR + RTS */
   mov    r3, #3
   str    r3, [r0, #UART_REG_MCR]
   mov    r0, #1
   dsb    sy
.endm
 
.macro early_console_putc ch
   ldr    r0, =CONSOLE_UART_BASE
   mov    r1, #\ch
   str    r1, [r0]
.endm
/********************* console used for sleep.S ******************************/
#endif
 
.align    2
.arm
 
 
ENTRY(rockchip_slp_cpu_resume)
#if RV1106_SLEEP_DEBUG
   early_console_init
   /* print 'A' */
   early_console_putc 0x41
#endif
 
   setmode    PSR_I_BIT | PSR_F_BIT | SVC_MODE, r1  @ set svc, irqs off
 
#if RV1106_WAKEUP_TO_SYSTEM_RESET
   /* save gpio wakeup src */
   ldr    r0, =RV1106_PMUGRF_OS_REG10
   ldr    r1, =RV1106_GPIO0_INT_ST
   ldr    r1, [r1]
   str    r1, [r0]
 
   /* enable first reset trigger pmu reset */
   ldr    r0, =RV1106_CRU_GLB_RST_CON_ADDR
   ldr    r1, =CRU_FST_RST_PMU_VAL
   str    r1, [r0]
 
   /* clear pmu reset hold */
   ldr    r0, =RV1106_PMUGRF_SOC_CON4
   ldr    r1, =0xffff0000
   str    r1, [r0]
   add    r0, r0, #4
   str    r1, [r0]
 
   /* first reset */
   ldr    r0, =RV1106_CRU_GLB_SRST_FST
   mov    r1, #0xfdb9
   str    r1, [r0]
   b    .
#endif
 
   ldr    r3, rkpm_bootdata_l2ctlr_f
   cmp    r3, #0
   beq    sp_set
   ldr    r3, rkpm_bootdata_l2ctlr
   mcr    p15, 1, r3, c9, c0, 2
sp_set:
   ldr    sp, rkpm_bootdata_cpusp
 
   ldr    r0, rkpm_ddr_data
   ldr    r1, rkpm_ddr_func
   cmp    r1, #0
   beq    boot
   blx    r1
 
boot:
   ldr    r1, rkpm_bootdata_cpu_code
   bx    r1
ENDPROC(rockchip_slp_cpu_resume)
 
/* Parameters filled in by the kernel */
 
/* Flag for whether to restore L2CTLR on resume */
   .global rkpm_bootdata_l2ctlr_f
rkpm_bootdata_l2ctlr_f:
   .long 0
 
/* Saved L2CTLR to restore on resume */
   .global rkpm_bootdata_l2ctlr
rkpm_bootdata_l2ctlr:
   .long 0
 
/* CPU resume SP addr */
   .globl rkpm_bootdata_cpusp
rkpm_bootdata_cpusp:
   .long 0
 
/* CPU resume function (physical address) */
   .globl rkpm_bootdata_cpu_code
rkpm_bootdata_cpu_code:
   .long 0
 
/* ddr resume data */
   .globl rkpm_ddr_data
rkpm_ddr_data:
   .long 0
 
/* ddr resume function (physical address) */
   .globl rkpm_ddr_func
rkpm_ddr_func:
   .long 0
 
ENTRY(rv1106_bootram_sz)
        .word   . - rockchip_slp_cpu_resume