2 <:copyright-BRCM:2020:DUAL/GPL:standard
4 Copyright (c) 2020 Broadcom
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License, version 2, as published by
9 the Free Software Foundation (the "GPL").
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
17 A copy of the GPL is available at http://www.broadcom.com/licenses/GPLv2.php, or by
18 writing to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA.
24 #include <platform_def.h>
25 #include <delay_timer.h>
27 #include "pmc_cpu_core.h"
30 void udelay(uint32_t usec
);
32 #if defined (PLATFORM_FLAVOR_63138)
33 /* this power up function is implemented with assumption that cpu#0 will always
34 * be the first one that's powered up. */
35 int pmc_cpu_core_power_up(unsigned cpu
)
38 ARM_CONTROL_REG arm_ctrl
;
39 ARM_CPUx_PWR_CTRL_REG arm_pwr_ctrl
;
42 /* in 63138, cpu#0 should've been powered on either by default or by PMC ROM.
43 * This code is for the future if PMC can shut down all the CPUs in
44 * hibernation and power them back up from other blocks. */
47 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
48 ARMBPCMRegOffset(arm_control
),
52 arm_ctrl
.Bits
.pll_ldo_pwr_on
= 1;
54 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
55 ARMBPCMRegOffset(arm_control
),
60 /* wait at least 1.0 usec */
63 arm_ctrl
.Bits
.pll_pwr_on
= 1;
64 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
65 ARMBPCMRegOffset(arm_control
),
70 /* 2) Power up CPU0 */
71 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
72 ARMBPCMRegOffset(arm_pwr_ctrl_0
),
76 arm_pwr_ctrl
.Bits
.pwr_on
= 0xf;
78 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
79 ARMBPCMRegOffset(arm_pwr_ctrl_0
),
85 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
86 ARMBPCMRegOffset(arm_pwr_ctrl_0
),
90 } while (arm_pwr_ctrl
.Bits
.pwr_on_status
!= 0xf);
92 arm_pwr_ctrl
.Bits
.pwr_ok
= 0xf;
94 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
95 ARMBPCMRegOffset(arm_pwr_ctrl_0
),
101 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
102 ARMBPCMRegOffset(arm_pwr_ctrl_0
),
103 &arm_pwr_ctrl
.Reg32
);
106 } while (arm_pwr_ctrl
.Bits
.pwr_ok_status
!= 0xf);
108 arm_ctrl
.Bits
.pll_clamp_on
= 0;
110 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
111 ARMBPCMRegOffset(arm_control
),
116 arm_pwr_ctrl
.Bits
.clamp_on
= 0;
118 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
119 ARMBPCMRegOffset(arm_pwr_ctrl_0
),
124 /* 3) Power up CPU0 RAM */
125 arm_pwr_ctrl
.Bits
.mem_pda
&= 0xe;
127 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
128 ARMBPCMRegOffset(arm_pwr_ctrl_0
), arm_pwr_ctrl
.Reg32
);
132 arm_pwr_ctrl
.Bits
.mem_pwr_on
= 1;
134 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
135 ARMBPCMRegOffset(arm_pwr_ctrl_0
), arm_pwr_ctrl
.Reg32
);
140 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
141 ARMBPCMRegOffset(arm_pwr_ctrl_0
), &arm_pwr_ctrl
.Reg32
);
144 } while (arm_pwr_ctrl
.Bits
.mem_pwr_on_status
== 0);
146 arm_pwr_ctrl
.Bits
.mem_pwr_ok
= 1;
148 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
149 ARMBPCMRegOffset(arm_pwr_ctrl_0
), arm_pwr_ctrl
.Reg32
);
154 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
155 ARMBPCMRegOffset(arm_pwr_ctrl_0
), &arm_pwr_ctrl
.Reg32
);
158 } while (arm_pwr_ctrl
.Bits
.mem_pwr_ok_status
== 0);
160 arm_pwr_ctrl
.Bits
.mem_clamp_on
= 0;
162 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
163 ARMBPCMRegOffset(arm_pwr_ctrl_0
),
168 /* 4) Power up L2 cache */
169 pmc_cpu_l2cache_power_up();
171 /* 5) de-assert CPU0 reset */
172 arm_ctrl
.Bits
.cpu0_reset_n
= 1;
174 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
175 ARMBPCMRegOffset(arm_control
),
179 } else if (cpu
== 1) {
180 /* check whether CPU1 is up and running already.
181 * Assuming once cpu1_reset_n is set, cpu1 is powered on
183 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
184 ARMBPCMRegOffset(arm_control
),
188 if (arm_ctrl
.Bits
.cpu1_reset_n
== 1)
191 /* 1) Power up CPU1 */
192 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
193 ARMBPCMRegOffset(arm_pwr_ctrl_1
),
194 &arm_pwr_ctrl
.Reg32
);
197 arm_pwr_ctrl
.Bits
.pwr_on
|= 0x3;
199 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
200 ARMBPCMRegOffset(arm_pwr_ctrl_1
),
206 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
207 ARMBPCMRegOffset(arm_pwr_ctrl_1
),
208 &arm_pwr_ctrl
.Reg32
);
211 } while ((arm_pwr_ctrl
.Bits
.pwr_on_status
& 0x3) != 0x3);
213 arm_pwr_ctrl
.Bits
.pwr_ok
|= 0x3;
215 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
216 ARMBPCMRegOffset(arm_pwr_ctrl_1
),
222 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
223 ARMBPCMRegOffset(arm_pwr_ctrl_1
),
224 &arm_pwr_ctrl
.Reg32
);
227 } while ((arm_pwr_ctrl
.Bits
.pwr_ok_status
& 0x3) != 0x3);
229 arm_pwr_ctrl
.Bits
.clamp_on
= 0;
231 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
232 ARMBPCMRegOffset(arm_pwr_ctrl_1
),
237 /* 2) Power up CPU1 RAM */
238 arm_pwr_ctrl
.Bits
.mem_pda
&= 0xe;
240 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
241 ARMBPCMRegOffset(arm_pwr_ctrl_1
),
246 arm_pwr_ctrl
.Bits
.mem_pwr_on
= 1;
248 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
249 ARMBPCMRegOffset(arm_pwr_ctrl_1
),
255 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
256 ARMBPCMRegOffset(arm_pwr_ctrl_1
),
257 &arm_pwr_ctrl
.Reg32
);
260 } while (arm_pwr_ctrl
.Bits
.mem_pwr_on_status
== 0);
262 arm_pwr_ctrl
.Bits
.mem_pwr_ok
= 1;
264 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
265 ARMBPCMRegOffset(arm_pwr_ctrl_1
),
271 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
272 ARMBPCMRegOffset(arm_pwr_ctrl_1
),
273 &arm_pwr_ctrl
.Reg32
);
276 } while (arm_pwr_ctrl
.Bits
.mem_pwr_ok_status
== 0);
278 arm_pwr_ctrl
.Bits
.mem_clamp_on
= 0;
280 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
281 ARMBPCMRegOffset(arm_pwr_ctrl_1
),
286 /* 3) de-assert reset to CPU1 */
287 arm_ctrl
.Bits
.cpu1_reset_n
= 1;
289 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
290 ARMBPCMRegOffset(arm_control
),
295 printk("error in %s: we do not have CPU#%d\n", __func__
, cpu
);
302 /* this power_down function is implemented with assumption that CPU#0 will
303 * always be the last one to be powered down */
304 /* Note: all the power_down codes have never been tested in 63138 */
305 int pmc_cpu_core_power_down(unsigned cpu
)
308 ARM_CONTROL_REG arm_ctrl
;
309 ARM_CPUx_PWR_CTRL_REG arm_pwr_ctrl
;
312 /* 1) assert reset to CPU0 */
313 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
314 ARMBPCMRegOffset(arm_control
),
318 arm_ctrl
.Bits
.cpu0_reset_n
= 0;
320 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
321 ARMBPCMRegOffset(arm_control
),
326 /* 2) power down L2 cache */
327 pmc_cpu_l2cache_power_down();
329 /* 3) power down CPU0 RAM */
330 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
331 ARMBPCMRegOffset(arm_pwr_ctrl_0
),
332 &arm_pwr_ctrl
.Reg32
);
335 arm_pwr_ctrl
.Bits
.mem_clamp_on
= 1;
337 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
338 ARMBPCMRegOffset(arm_pwr_ctrl_0
),
343 arm_pwr_ctrl
.Bits
.mem_pwr_ok
= 0;
345 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
346 ARMBPCMRegOffset(arm_pwr_ctrl_0
),
352 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
353 ARMBPCMRegOffset(arm_pwr_ctrl_0
),
354 &arm_pwr_ctrl
.Reg32
);
357 } while (arm_pwr_ctrl
.Bits
.mem_pwr_ok_status
== 0);
359 arm_pwr_ctrl
.Bits
.mem_pwr_on
= 0;
361 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
362 ARMBPCMRegOffset(arm_pwr_ctrl_0
),
368 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
369 ARMBPCMRegOffset(arm_pwr_ctrl_0
),
370 &arm_pwr_ctrl
.Reg32
);
373 } while (arm_pwr_ctrl
.Bits
.mem_pwr_on_status
== 0);
375 arm_pwr_ctrl
.Bits
.mem_pda
|= 0x1;
377 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
378 ARMBPCMRegOffset(arm_pwr_ctrl_0
),
383 /* 4) Power down CPU0 */
385 arm_pwr_ctrl
.Bits
.clamp_on
= 1;
387 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
388 ARMBPCMRegOffset(arm_pwr_ctrl_0
),
393 arm_ctrl
.Bits
.pll_clamp_on
= 1;
395 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
396 ARMBPCMRegOffset(arm_control
),
401 arm_pwr_ctrl
.Bits
.pwr_ok
= 0x0;
403 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
404 ARMBPCMRegOffset(arm_pwr_ctrl_0
),
410 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
411 ARMBPCMRegOffset(arm_pwr_ctrl_0
),
412 &arm_pwr_ctrl
.Reg32
);
415 } while (arm_pwr_ctrl
.Bits
.pwr_ok_status
!= 0xf);
417 arm_pwr_ctrl
.Bits
.pwr_on
= 0x0;
419 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
420 ARMBPCMRegOffset(arm_pwr_ctrl_0
),
426 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
427 ARMBPCMRegOffset(arm_pwr_ctrl_0
),
428 &arm_pwr_ctrl
.Reg32
);
431 } while (arm_pwr_ctrl
.Bits
.pwr_on_status
!= 0xf);
433 /* 5) power down PLL */
434 arm_ctrl
.Bits
.pll_pwr_on
= 0;
435 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
436 ARMBPCMRegOffset(arm_control
),
441 /* wait at least 1.0 usec */
444 arm_ctrl
.Bits
.pll_ldo_pwr_on
= 0;
445 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
446 ARMBPCMRegOffset(arm_control
),
450 } else if (cpu
== 1) {
451 /* 1) assert reset to CPU1 */
452 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
453 ARMBPCMRegOffset(arm_control
),
457 arm_ctrl
.Bits
.cpu1_reset_n
= 0;
459 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
460 ARMBPCMRegOffset(arm_control
),
465 /* 2) Power down RAM CPU1 */
466 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
467 ARMBPCMRegOffset(arm_pwr_ctrl_1
),
468 &arm_pwr_ctrl
.Reg32
);
471 arm_pwr_ctrl
.Bits
.mem_clamp_on
= 1;
473 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
474 ARMBPCMRegOffset(arm_pwr_ctrl_1
),
479 arm_pwr_ctrl
.Bits
.mem_pwr_ok
= 0;
481 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
482 ARMBPCMRegOffset(arm_pwr_ctrl_1
),
488 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
489 ARMBPCMRegOffset(arm_pwr_ctrl_1
),
490 &arm_pwr_ctrl
.Reg32
);
493 } while (arm_pwr_ctrl
.Bits
.mem_pwr_ok_status
== 0);
495 arm_pwr_ctrl
.Bits
.mem_pwr_on
= 0;
497 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
498 ARMBPCMRegOffset(arm_pwr_ctrl_1
),
504 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
505 ARMBPCMRegOffset(arm_pwr_ctrl_1
),
506 &arm_pwr_ctrl
.Reg32
);
509 } while (arm_pwr_ctrl
.Bits
.mem_pwr_on_status
== 0);
511 arm_pwr_ctrl
.Bits
.mem_pda
|= 0x1;
513 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
514 ARMBPCMRegOffset(arm_pwr_ctrl_1
),
519 /* 3) Power Down CPU1 */
520 arm_pwr_ctrl
.Bits
.clamp_on
= 1;
522 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
523 ARMBPCMRegOffset(arm_pwr_ctrl_1
),
528 arm_pwr_ctrl
.Bits
.pwr_ok
&= 0xc;
530 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
531 ARMBPCMRegOffset(arm_pwr_ctrl_1
),
537 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
538 ARMBPCMRegOffset(arm_pwr_ctrl_1
),
539 &arm_pwr_ctrl
.Reg32
);
542 } while ((arm_pwr_ctrl
.Bits
.pwr_ok_status
& 0x3) != 0x3);
544 arm_pwr_ctrl
.Bits
.pwr_on
&= 0xc;
546 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
547 ARMBPCMRegOffset(arm_pwr_ctrl_1
),
553 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
554 ARMBPCMRegOffset(arm_pwr_ctrl_1
),
555 &arm_pwr_ctrl
.Reg32
);
558 } while ((arm_pwr_ctrl
.Bits
.pwr_on_status
& 0x3) != 0x3);
560 printk("error in %s: we do not have CPU#%d\n", __func__
, cpu
);
567 int pmc_cpu_l2cache_power_up(void)
570 ARM_CPUx_PWR_CTRL_REG arm_pwr_ctrl
;
572 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
573 ARMBPCMRegOffset(arm_neon_l2
),
574 &arm_pwr_ctrl
.Reg32
);
578 /* check if L2 cache is already power on. If it is, then just return 0 */
579 if ((arm_pwr_ctrl
.Bits
.mem_clamp_on
== 0) &&
580 (arm_pwr_ctrl
.Bits
.mem_clamp_on
== 0) &&
581 (arm_pwr_ctrl
.Bits
.mem_pwr_ok
== 0x1) &&
582 (arm_pwr_ctrl
.Bits
.mem_pwr_on
== 0x1))
585 arm_pwr_ctrl
.Bits
.mem_pda
= 0x0; /* set 0 to bit#8:11 */
587 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
588 ARMBPCMRegOffset(arm_neon_l2
),
593 arm_pwr_ctrl
.Bits
.mem_pwr_on
= 1;
595 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
596 ARMBPCMRegOffset(arm_neon_l2
),
602 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
603 ARMBPCMRegOffset(arm_neon_l2
),
604 &arm_pwr_ctrl
.Reg32
);
607 } while (arm_pwr_ctrl
.Bits
.mem_pwr_on_status
== 0);
609 arm_pwr_ctrl
.Bits
.mem_pwr_ok
= 1;
611 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
612 ARMBPCMRegOffset(arm_neon_l2
),
618 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
619 ARMBPCMRegOffset(arm_neon_l2
),
620 &arm_pwr_ctrl
.Reg32
);
623 } while (arm_pwr_ctrl
.Bits
.mem_pwr_ok_status
== 0);
625 arm_pwr_ctrl
.Bits
.mem_clamp_on
= 0;
627 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
628 ARMBPCMRegOffset(arm_neon_l2
),
636 int pmc_cpu_l2cache_power_down(void)
639 ARM_CPUx_PWR_CTRL_REG arm_pwr_ctrl
;
641 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
642 ARMBPCMRegOffset(arm_neon_l2
),
643 &arm_pwr_ctrl
.Reg32
);
647 arm_pwr_ctrl
.Bits
.mem_clamp_on
= 1;
649 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
650 ARMBPCMRegOffset(arm_neon_l2
),
655 arm_pwr_ctrl
.Bits
.mem_pwr_ok
= 0;
657 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
658 ARMBPCMRegOffset(arm_neon_l2
),
664 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
665 ARMBPCMRegOffset(arm_neon_l2
),
666 &arm_pwr_ctrl
.Reg32
);
669 } while (arm_pwr_ctrl
.Bits
.mem_pwr_ok_status
== 0);
671 arm_pwr_ctrl
.Bits
.mem_pwr_on
= 0;
673 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
674 ARMBPCMRegOffset(arm_neon_l2
),
680 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
681 ARMBPCMRegOffset(arm_neon_l2
),
682 &arm_pwr_ctrl
.Reg32
);
685 } while (arm_pwr_ctrl
.Bits
.mem_pwr_on_status
== 0);
687 arm_pwr_ctrl
.Bits
.mem_pda
= 0xf; /* set 0xf to bit#8:11 */
689 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
690 ARMBPCMRegOffset(arm_neon_l2
),
698 int pmc_cpu_neon_power_up(unsigned cpu
)
701 ARM_CONTROL_REG arm_ctrl
;
702 ARM_CPUx_PWR_CTRL_REG arm_pwr_ctrl
;
704 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
705 ARMBPCMRegOffset(arm_control
),
710 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
711 ARMBPCMRegOffset(arm_neon_l2
),
712 &arm_pwr_ctrl
.Reg32
);
716 /* check if neon is on and running aready. */
717 if ((arm_ctrl
.Bits
.neon_reset_n
== 1) &&
718 (arm_pwr_ctrl
.Bits
.clamp_on
== 0) &&
719 (arm_pwr_ctrl
.Bits
.pwr_ok
& 0x1) &&
720 (arm_pwr_ctrl
.Bits
.pwr_on
& 0x1))
723 /* 1) Power up Neon */
724 arm_pwr_ctrl
.Bits
.pwr_on
|= 1;
726 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
727 ARMBPCMRegOffset(arm_neon_l2
),
733 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
734 ARMBPCMRegOffset(arm_neon_l2
),
735 &arm_pwr_ctrl
.Reg32
);
738 } while ((arm_pwr_ctrl
.Bits
.pwr_on_status
& 0x1) == 0);
740 arm_pwr_ctrl
.Bits
.pwr_ok
|= 1;
742 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
743 ARMBPCMRegOffset(arm_neon_l2
),
749 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
750 ARMBPCMRegOffset(arm_neon_l2
),
751 &arm_pwr_ctrl
.Reg32
);
754 } while ((arm_pwr_ctrl
.Bits
.pwr_ok_status
& 0x1) == 0);
756 arm_pwr_ctrl
.Bits
.clamp_on
= 0;
758 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
759 ARMBPCMRegOffset(arm_neon_l2
),
764 /* 2) De-assert reset to Neon */
765 arm_ctrl
.Bits
.neon_reset_n
= 1;
767 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
768 ARMBPCMRegOffset(arm_control
),
776 int pmc_cpu_neon_power_down(unsigned cpu
)
779 ARM_CONTROL_REG arm_ctrl
;
780 ARM_CPUx_PWR_CTRL_REG arm_pwr_ctrl
;
782 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
783 ARMBPCMRegOffset(arm_control
),
788 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
789 ARMBPCMRegOffset(arm_neon_l2
),
790 &arm_pwr_ctrl
.Reg32
);
794 /* 1) assert reset to Neon */
795 arm_ctrl
.Bits
.neon_reset_n
= 0;
797 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
798 ARMBPCMRegOffset(arm_control
),
803 /* 2) Power down Neon */
804 arm_pwr_ctrl
.Bits
.clamp_on
= 1;
806 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
807 ARMBPCMRegOffset(arm_neon_l2
),
812 arm_pwr_ctrl
.Bits
.pwr_ok
&= 0xe;
814 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
815 ARMBPCMRegOffset(arm_neon_l2
),
821 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
822 ARMBPCMRegOffset(arm_neon_l2
),
823 &arm_pwr_ctrl
.Reg32
);
826 } while ((arm_pwr_ctrl
.Bits
.pwr_ok_status
& 0x1) == 1);
828 arm_pwr_ctrl
.Bits
.pwr_on
&= 0xe;
830 ret
= WriteBPCMRegister(PMB_ADDR_AIP
,
831 ARMBPCMRegOffset(arm_neon_l2
),
837 ret
= ReadBPCMRegister(PMB_ADDR_AIP
,
838 ARMBPCMRegOffset(arm_neon_l2
),
839 &arm_pwr_ctrl
.Reg32
);
842 } while ((arm_pwr_ctrl
.Bits
.pwr_on_status
& 0x1) == 1);
849 #if defined (PMB_ADDR_ORION_CPU0)
850 static uint32_t pmb_cpu_id
[] = {
853 #if defined(PMB_ADDR_ORION_CPU2)
856 #if defined(PMB_ADDR_ORION_CPU3)
862 int pmc_cpu_core_power_up(unsigned cpu
)
864 #if defined (PLATFORM_FLAVOR_63148)
865 B15CTRL
->cpu_ctrl
.cpu1_pwr_zone_ctrl
|= 0x400;
866 B15CTRL
->cpu_ctrl
.reset_cfg
&= 0xfffffffd;
867 #elif defined (PMB_ADDR_ORION_CPU0) || defined (PLATFORM_FLAVOR_6846)
869 uint32_t arm_control
;
871 #if defined (PMB_ADDR_ORION_CPU0)
872 error
= ResetDevice(pmb_cpu_id
[cpu
]);
874 ERROR("unable to power on CPU%d\n", cpu
);
879 error
= ReadBPCMRegister(PMB_ADDR_BIU_BPCM
,
880 ARMBPCMRegOffset(arm_control
),
883 ERROR("unable to release CPU%d reset.\n", cpu
);
886 arm_control
&= ~(1 << cpu
);
887 error
= WriteBPCMRegister(PMB_ADDR_BIU_BPCM
,
888 ARMBPCMRegOffset(arm_control
),
891 ERROR("unable to release CPU%d reset.\n", cpu
);
894 udelay(100); // wait for cpu to come out of reset
895 INFO("pmc_cpu: powered up CPU%d\n", cpu
);
896 #elif defined (BIUCTRL_BASE)
897 if (BIUCTRL
->cpu_pwr_zone_ctrl
[cpu
] & BIU_CPU_CTRL_PWR_ZONE_CTRL_ZONE_RESET
) {
898 BIUCTRL
->power_cfg
|= BIU_CPU_CTRL_PWR_CFG_CPU0_BPCM_INIT_ON
<< cpu
;
899 BIUCTRL
->cpu_pwr_zone_ctrl
[cpu
] = BIU_CPU_CTRL_PWR_ZONE_CTRL_PWR_UP_REQ
|
900 (BIUCTRL
->cpu_pwr_zone_ctrl
[cpu
] & ~BIU_CPU_CTRL_PWR_ZONE_CTRL_PWR_DN_REQ
);
902 udelay(100); // wait for cpu to come out of reset
908 int pmc_cpu_core_power_down(unsigned cpu
)
910 #if defined (BIUCTRL_BASE)
911 BIUCTRL
->power_cfg
&= ~(BIU_CPU_CTRL_PWR_CFG_CPU0_BPCM_INIT_ON
<< cpu
);
912 BIUCTRL
->cpu_pwr_zone_ctrl
[cpu
] = BIU_CPU_CTRL_PWR_ZONE_CTRL_PWR_DN_REQ
|
913 (BIUCTRL
->cpu_pwr_zone_ctrl
[cpu
] & ~BIU_CPU_CTRL_PWR_ZONE_CTRL_PWR_UP_REQ
);
917 #endif /* PLATFORM_FLAVOR_63138 */