~pmdj/ubuntu/trusty/qemu/2.9+applesmc+fadtv3

« back to all changes in this revision

Viewing changes to roms/u-boot/arch/arm/cpu/armv7/socfpga/freeze_controller.c

  • Committer: Phil Dennis-Jordan
  • Date: 2017-07-21 08:03:43 UTC
  • mfrom: (1.1.1)
  • Revision ID: phil@philjordan.eu-20170721080343-2yr2vdj7713czahv
New upstream release 2.9.0.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 *  Copyright (C) 2013 Altera Corporation <www.altera.com>
 
3
 *
 
4
 * SPDX-License-Identifier:     GPL-2.0+
 
5
 */
 
6
 
 
7
 
 
8
#include <common.h>
 
9
#include <asm/io.h>
 
10
#include <asm/arch/freeze_controller.h>
 
11
#include <asm/arch/timer.h>
 
12
#include <asm/errno.h>
 
13
 
 
14
DECLARE_GLOBAL_DATA_PTR;
 
15
 
 
16
static const struct socfpga_freeze_controller *freeze_controller_base =
 
17
                (void *)(SOCFPGA_SYSMGR_ADDRESS + SYSMGR_FRZCTRL_ADDRESS);
 
18
 
 
19
/*
 
20
 * Default state from cold reset is FREEZE_ALL; the global
 
21
 * flag is set to TRUE to indicate the IO banks are frozen
 
22
 */
 
23
static uint32_t frzctrl_channel_freeze[FREEZE_CHANNEL_NUM]
 
24
        = { FREEZE_CTRL_FROZEN, FREEZE_CTRL_FROZEN,
 
25
        FREEZE_CTRL_FROZEN, FREEZE_CTRL_FROZEN};
 
26
 
 
27
/* Freeze HPS IOs */
 
28
void sys_mgr_frzctrl_freeze_req(void)
 
29
{
 
30
        u32 ioctrl_reg_offset;
 
31
        u32 reg_value;
 
32
        u32 reg_cfg_mask;
 
33
        u32 channel_id;
 
34
 
 
35
        /* select software FSM */
 
36
        writel(SYSMGR_FRZCTRL_SRC_VIO1_ENUM_SW, &freeze_controller_base->src);
 
37
 
 
38
        /* Freeze channel 0 to 2 */
 
39
        for (channel_id = 0; channel_id <= 2; channel_id++) {
 
40
                ioctrl_reg_offset = (u32)(
 
41
                        &freeze_controller_base->vioctrl +
 
42
                        (channel_id << SYSMGR_FRZCTRL_VIOCTRL_SHIFT));
 
43
 
 
44
                /*
 
45
                 * Assert active low enrnsl, plniotri
 
46
                 * and niotri signals
 
47
                 */
 
48
                reg_cfg_mask =
 
49
                        SYSMGR_FRZCTRL_VIOCTRL_SLEW_MASK
 
50
                        | SYSMGR_FRZCTRL_VIOCTRL_WKPULLUP_MASK
 
51
                        | SYSMGR_FRZCTRL_VIOCTRL_TRISTATE_MASK;
 
52
                clrbits_le32(ioctrl_reg_offset, reg_cfg_mask);
 
53
 
 
54
                /*
 
55
                 * Note: Delay for 20ns at min
 
56
                 * Assert active low bhniotri signal and de-assert
 
57
                 * active high csrdone
 
58
                 */
 
59
                reg_cfg_mask
 
60
                        = SYSMGR_FRZCTRL_VIOCTRL_BUSHOLD_MASK
 
61
                        | SYSMGR_FRZCTRL_VIOCTRL_CFG_MASK;
 
62
                clrbits_le32(ioctrl_reg_offset, reg_cfg_mask);
 
63
 
 
64
                /* Set global flag to indicate channel is frozen */
 
65
                frzctrl_channel_freeze[channel_id] = FREEZE_CTRL_FROZEN;
 
66
        }
 
67
 
 
68
        /* Freeze channel 3 */
 
69
        /*
 
70
         * Assert active low enrnsl, plniotri and
 
71
         * niotri signals
 
72
         */
 
73
        reg_cfg_mask
 
74
                = SYSMGR_FRZCTRL_HIOCTRL_SLEW_MASK
 
75
                | SYSMGR_FRZCTRL_HIOCTRL_WKPULLUP_MASK
 
76
                | SYSMGR_FRZCTRL_HIOCTRL_TRISTATE_MASK;
 
77
        clrbits_le32(&freeze_controller_base->hioctrl, reg_cfg_mask);
 
78
 
 
79
        /*
 
80
         * assert active low bhniotri & nfrzdrv signals,
 
81
         * de-assert active high csrdone and assert
 
82
         * active high frzreg and nfrzdrv signals
 
83
         */
 
84
        reg_value = readl(&freeze_controller_base->hioctrl);
 
85
        reg_cfg_mask
 
86
                = SYSMGR_FRZCTRL_HIOCTRL_BUSHOLD_MASK
 
87
                | SYSMGR_FRZCTRL_HIOCTRL_CFG_MASK;
 
88
        reg_value
 
89
                = (reg_value & ~reg_cfg_mask)
 
90
                | SYSMGR_FRZCTRL_HIOCTRL_REGRST_MASK
 
91
                | SYSMGR_FRZCTRL_HIOCTRL_OCTRST_MASK;
 
92
        writel(reg_value, &freeze_controller_base->hioctrl);
 
93
 
 
94
        /*
 
95
         * assert active high reinit signal and de-assert
 
96
         * active high pllbiasen signals
 
97
         */
 
98
        reg_value = readl(&freeze_controller_base->hioctrl);
 
99
        reg_value
 
100
                = (reg_value &
 
101
                ~SYSMGR_FRZCTRL_HIOCTRL_OCT_CFGEN_CALSTART_MASK)
 
102
                | SYSMGR_FRZCTRL_HIOCTRL_DLLRST_MASK;
 
103
        writel(reg_value, &freeze_controller_base->hioctrl);
 
104
 
 
105
        /* Set global flag to indicate channel is frozen */
 
106
        frzctrl_channel_freeze[channel_id] = FREEZE_CTRL_FROZEN;
 
107
}
 
108
 
 
109
/* Unfreeze/Thaw HPS IOs */
 
110
void sys_mgr_frzctrl_thaw_req(void)
 
111
{
 
112
        u32 ioctrl_reg_offset;
 
113
        u32 reg_cfg_mask;
 
114
        u32 reg_value;
 
115
        u32 channel_id;
 
116
 
 
117
        /* select software FSM */
 
118
        writel(SYSMGR_FRZCTRL_SRC_VIO1_ENUM_SW, &freeze_controller_base->src);
 
119
 
 
120
        /* Thaw channel 0 to 2 */
 
121
        for (channel_id = 0; channel_id <= 2; channel_id++) {
 
122
                ioctrl_reg_offset
 
123
                        = (u32)(&freeze_controller_base->vioctrl
 
124
                                + (channel_id << SYSMGR_FRZCTRL_VIOCTRL_SHIFT));
 
125
 
 
126
                /*
 
127
                 * Assert active low bhniotri signal and
 
128
                 * de-assert active high csrdone
 
129
                 */
 
130
                reg_cfg_mask
 
131
                        = SYSMGR_FRZCTRL_VIOCTRL_BUSHOLD_MASK
 
132
                        | SYSMGR_FRZCTRL_VIOCTRL_CFG_MASK;
 
133
                setbits_le32(ioctrl_reg_offset, reg_cfg_mask);
 
134
 
 
135
                /*
 
136
                 * Note: Delay for 20ns at min
 
137
                 * de-assert active low plniotri and niotri signals
 
138
                 */
 
139
                reg_cfg_mask
 
140
                        = SYSMGR_FRZCTRL_VIOCTRL_WKPULLUP_MASK
 
141
                        | SYSMGR_FRZCTRL_VIOCTRL_TRISTATE_MASK;
 
142
                setbits_le32(ioctrl_reg_offset, reg_cfg_mask);
 
143
 
 
144
                /*
 
145
                 * Note: Delay for 20ns at min
 
146
                 * de-assert active low enrnsl signal
 
147
                 */
 
148
                setbits_le32(ioctrl_reg_offset,
 
149
                        SYSMGR_FRZCTRL_VIOCTRL_SLEW_MASK);
 
150
 
 
151
                /* Set global flag to indicate channel is thawed */
 
152
                frzctrl_channel_freeze[channel_id] = FREEZE_CTRL_THAWED;
 
153
        }
 
154
 
 
155
        /* Thaw channel 3 */
 
156
        /* de-assert active high reinit signal */
 
157
        clrbits_le32(&freeze_controller_base->hioctrl,
 
158
                SYSMGR_FRZCTRL_HIOCTRL_DLLRST_MASK);
 
159
 
 
160
        /*
 
161
         * Note: Delay for 40ns at min
 
162
         * assert active high pllbiasen signals
 
163
         */
 
164
        setbits_le32(&freeze_controller_base->hioctrl,
 
165
                SYSMGR_FRZCTRL_HIOCTRL_OCT_CFGEN_CALSTART_MASK);
 
166
 
 
167
        /*
 
168
         * Delay 1000 intosc. intosc is based on eosc1
 
169
         * Use worst case which is fatest eosc1=50MHz, delay required
 
170
         * is 1/50MHz * 1000 = 20us
 
171
         */
 
172
        udelay(20);
 
173
 
 
174
        /*
 
175
         * de-assert active low bhniotri signals,
 
176
         * assert active high csrdone and nfrzdrv signal
 
177
         */
 
178
        reg_value = readl(&freeze_controller_base->hioctrl);
 
179
        reg_value = (reg_value
 
180
                | SYSMGR_FRZCTRL_HIOCTRL_BUSHOLD_MASK
 
181
                | SYSMGR_FRZCTRL_HIOCTRL_CFG_MASK)
 
182
                & ~SYSMGR_FRZCTRL_HIOCTRL_OCTRST_MASK;
 
183
        writel(reg_value, &freeze_controller_base->hioctrl);
 
184
 
 
185
        /*
 
186
         * Delay 33 intosc
 
187
         * Use worst case which is fatest eosc1=50MHz, delay required
 
188
         * is 1/50MHz * 33 = 660ns ~= 1us
 
189
         */
 
190
        udelay(1);
 
191
 
 
192
        /* de-assert active low plniotri and niotri signals */
 
193
        reg_cfg_mask
 
194
                = SYSMGR_FRZCTRL_HIOCTRL_WKPULLUP_MASK
 
195
                | SYSMGR_FRZCTRL_HIOCTRL_TRISTATE_MASK;
 
196
 
 
197
        setbits_le32(&freeze_controller_base->hioctrl, reg_cfg_mask);
 
198
 
 
199
        /*
 
200
         * Note: Delay for 40ns at min
 
201
         * de-assert active high frzreg signal
 
202
         */
 
203
        clrbits_le32(&freeze_controller_base->hioctrl,
 
204
                SYSMGR_FRZCTRL_HIOCTRL_REGRST_MASK);
 
205
 
 
206
        /*
 
207
         * Note: Delay for 40ns at min
 
208
         * de-assert active low enrnsl signal
 
209
         */
 
210
        setbits_le32(&freeze_controller_base->hioctrl,
 
211
                SYSMGR_FRZCTRL_HIOCTRL_SLEW_MASK);
 
212
 
 
213
        /* Set global flag to indicate channel is thawed */
 
214
        frzctrl_channel_freeze[channel_id] = FREEZE_CTRL_THAWED;
 
215
}