/* SPDX-License-Identifier: GPL-2.0 */ #include <asm/reg.h> #include <asm/ppc_asm.h> #include <asm/processor.h> .text _GLOBAL(mpc52xx_deep_sleep) mpc52xx_deep_sleep: /* args r3-r6: SRAM, SDRAM regs, CDM regs, INTR regs */ /* enable interrupts */ mfmsr r7 ori r7, r7, 0x8000 /* EE */ mtmsr r7 sync; isync; li r10, 0 /* flag that irq handler sets */ /* enable tmr7 (or any other) interrupt */ lwz r8, 0x14(r6) /* intr->main_mask */ ori r8, r8, 0x1 xori r8, r8, 0x1 stw r8, 0x14(r6) sync /* emulate tmr7 interrupt */ li r8, 0x1 stw r8, 0x40(r6) /* intr->main_emulate */ sync /* wait for it to happen */ 1: cmpi cr0, r10, 1 bne cr0, 1b /* lock icache */ mfspr r10, SPRN_HID0 ori r10, r10, 0x2000 sync; isync; mtspr SPRN_HID0, r10 sync; isync; mflr r9 /* save LR */ /* jump to sram */ mtlr r3 blrl mtlr r9 /* restore LR */ /* unlock icache */ mfspr r10, SPRN_HID0 ori r10, r10, 0x2000 xori r10, r10, 0x2000 sync; isync; mtspr SPRN_HID0, r10 sync; isync; /* return to C code */ blr _GLOBAL(mpc52xx_ds_sram) mpc52xx_ds_sram: /* put SDRAM into self-refresh */ lwz r8, 0x4(r4) /* sdram->ctrl */ oris r8, r8, 0x8000 /* mode_en */ stw r8, 0x4(r4) sync ori r8, r8, 0x0002 /* soft_pre */ stw r8, 0x4(r4) sync xori r8, r8, 0x0002 xoris r8, r8, 0x8000 /* !mode_en */ stw r8, 0x4(r4) sync oris r8, r8, 0x5000 xoris r8, r8, 0x4000 /* ref_en !cke */ stw r8, 0x4(r4) sync /* disable SDRAM clock */ lwz r8, 0x14(r5) /* cdm->clkenable */ ori r8, r8, 0x0008 xori r8, r8, 0x0008 stw r8, 0x14(r5) sync /* put mpc5200 to sleep */ mfmsr r10 oris r10, r10, 0x0004 /* POW = 1 */ sync; isync; mtmsr r10 sync; isync; /* enable clock */ lwz r8, 0x14(r5) ori r8, r8, 0x0008 stw r8, 0x14(r5) sync /* get ram out of self-refresh */ lwz r8, 0x4(r4) oris r8, r8, 0x5000 /* cke ref_en */ stw r8, 0x4(r4) sync blr _GLOBAL(mpc52xx_ds_sram_size) mpc52xx_ds_sram_size: .long $-mpc52xx_ds_sram /* ### interrupt handler for wakeup from deep-sleep ### */ _GLOBAL(mpc52xx_ds_cached) mpc52xx_ds_cached: mtspr SPRN_SPRG0, r7 mtspr SPRN_SPRG1, r8 /* disable emulated interrupt */ mfspr r7, 311 /* MBAR */ addi r7, r7, 0x540 /* intr->main_emul */ li r8, 0 stw r8, 0(r7) sync dcbf 0, r7 /* acknowledge wakeup, so CCS releases power pown */ mfspr r7, 311 /* MBAR */ addi r7, r7, 0x524 /* intr->enc_status */ lwz r8, 0(r7) ori r8, r8, 0x0400 stw r8, 0(r7) sync dcbf 0, r7 /* flag - we handled the interrupt */ li r10, 1 mfspr r8, SPRN_SPRG1 mfspr r7, SPRN_SPRG0 rfi _GLOBAL(mpc52xx_ds_cached_size) mpc52xx_ds_cached_size: .long $-mpc52xx_ds_cached