18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#include <asm/reg.h>
38c2ecf20Sopenharmony_ci#include <asm/ppc_asm.h>
48c2ecf20Sopenharmony_ci#include <asm/processor.h>
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci.text
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci_GLOBAL(mpc52xx_deep_sleep)
108c2ecf20Sopenharmony_cimpc52xx_deep_sleep: /* args r3-r6: SRAM, SDRAM regs, CDM regs, INTR regs */
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci	/* enable interrupts */
138c2ecf20Sopenharmony_ci	mfmsr	r7
148c2ecf20Sopenharmony_ci	ori	r7, r7, 0x8000 /* EE */
158c2ecf20Sopenharmony_ci	mtmsr	r7
168c2ecf20Sopenharmony_ci	sync; isync;
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci	li	r10, 0 /* flag that irq handler sets */
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci	/* enable tmr7 (or any other) interrupt */
218c2ecf20Sopenharmony_ci	lwz	r8, 0x14(r6) /* intr->main_mask */
228c2ecf20Sopenharmony_ci	ori	r8, r8, 0x1
238c2ecf20Sopenharmony_ci	xori	r8, r8, 0x1
248c2ecf20Sopenharmony_ci	stw	r8, 0x14(r6)
258c2ecf20Sopenharmony_ci	sync
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci	/* emulate tmr7 interrupt */
288c2ecf20Sopenharmony_ci	li	r8, 0x1
298c2ecf20Sopenharmony_ci	stw	r8, 0x40(r6) /* intr->main_emulate */
308c2ecf20Sopenharmony_ci	sync
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_ci	/* wait for it to happen */
338c2ecf20Sopenharmony_ci1:
348c2ecf20Sopenharmony_ci	cmpi	cr0, r10, 1
358c2ecf20Sopenharmony_ci	bne	cr0, 1b
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci	/* lock icache */
388c2ecf20Sopenharmony_ci	mfspr	r10, SPRN_HID0
398c2ecf20Sopenharmony_ci	ori	r10, r10, 0x2000
408c2ecf20Sopenharmony_ci	sync; isync;
418c2ecf20Sopenharmony_ci	mtspr	SPRN_HID0, r10
428c2ecf20Sopenharmony_ci	sync; isync;
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci	mflr	r9 /* save LR */
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci	/* jump to sram */
488c2ecf20Sopenharmony_ci	mtlr	r3
498c2ecf20Sopenharmony_ci	blrl
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_ci	mtlr	r9 /* restore LR */
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_ci	/* unlock icache */
548c2ecf20Sopenharmony_ci	mfspr	r10, SPRN_HID0
558c2ecf20Sopenharmony_ci	ori	r10, r10, 0x2000
568c2ecf20Sopenharmony_ci	xori	r10, r10, 0x2000
578c2ecf20Sopenharmony_ci	sync; isync;
588c2ecf20Sopenharmony_ci	mtspr	SPRN_HID0, r10
598c2ecf20Sopenharmony_ci	sync; isync;
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_ci	/* return to C code */
638c2ecf20Sopenharmony_ci	blr
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_ci_GLOBAL(mpc52xx_ds_sram)
678c2ecf20Sopenharmony_cimpc52xx_ds_sram:
688c2ecf20Sopenharmony_ci	/* put SDRAM into self-refresh */
698c2ecf20Sopenharmony_ci	lwz	r8, 0x4(r4)	/* sdram->ctrl */
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_ci	oris	r8, r8, 0x8000 /* mode_en */
728c2ecf20Sopenharmony_ci	stw	r8, 0x4(r4)
738c2ecf20Sopenharmony_ci	sync
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_ci	ori	r8, r8, 0x0002 /* soft_pre */
768c2ecf20Sopenharmony_ci	stw	r8, 0x4(r4)
778c2ecf20Sopenharmony_ci	sync
788c2ecf20Sopenharmony_ci	xori	r8, r8, 0x0002
798c2ecf20Sopenharmony_ci
808c2ecf20Sopenharmony_ci	xoris	r8, r8, 0x8000 /* !mode_en */
818c2ecf20Sopenharmony_ci	stw	r8, 0x4(r4)
828c2ecf20Sopenharmony_ci	sync
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_ci	oris	r8, r8, 0x5000
858c2ecf20Sopenharmony_ci	xoris	r8, r8, 0x4000 /* ref_en !cke */
868c2ecf20Sopenharmony_ci	stw	r8, 0x4(r4)
878c2ecf20Sopenharmony_ci	sync
888c2ecf20Sopenharmony_ci
898c2ecf20Sopenharmony_ci	/* disable SDRAM clock */
908c2ecf20Sopenharmony_ci	lwz	r8, 0x14(r5) /* cdm->clkenable */
918c2ecf20Sopenharmony_ci	ori	r8, r8, 0x0008
928c2ecf20Sopenharmony_ci	xori	r8, r8, 0x0008
938c2ecf20Sopenharmony_ci	stw	r8, 0x14(r5)
948c2ecf20Sopenharmony_ci	sync
958c2ecf20Sopenharmony_ci
968c2ecf20Sopenharmony_ci
978c2ecf20Sopenharmony_ci	/* put mpc5200 to sleep */
988c2ecf20Sopenharmony_ci	mfmsr	r10
998c2ecf20Sopenharmony_ci	oris	r10, r10, 0x0004	/* POW = 1 */
1008c2ecf20Sopenharmony_ci	sync; isync;
1018c2ecf20Sopenharmony_ci	mtmsr	r10
1028c2ecf20Sopenharmony_ci	sync; isync;
1038c2ecf20Sopenharmony_ci
1048c2ecf20Sopenharmony_ci
1058c2ecf20Sopenharmony_ci	/* enable clock */
1068c2ecf20Sopenharmony_ci	lwz	r8, 0x14(r5)
1078c2ecf20Sopenharmony_ci	ori	r8, r8, 0x0008
1088c2ecf20Sopenharmony_ci	stw	r8, 0x14(r5)
1098c2ecf20Sopenharmony_ci	sync
1108c2ecf20Sopenharmony_ci
1118c2ecf20Sopenharmony_ci	/* get ram out of self-refresh */
1128c2ecf20Sopenharmony_ci	lwz	r8, 0x4(r4)
1138c2ecf20Sopenharmony_ci	oris	r8, r8, 0x5000 /* cke ref_en */
1148c2ecf20Sopenharmony_ci	stw	r8, 0x4(r4)
1158c2ecf20Sopenharmony_ci	sync
1168c2ecf20Sopenharmony_ci
1178c2ecf20Sopenharmony_ci	blr
1188c2ecf20Sopenharmony_ci_GLOBAL(mpc52xx_ds_sram_size)
1198c2ecf20Sopenharmony_cimpc52xx_ds_sram_size:
1208c2ecf20Sopenharmony_ci	.long $-mpc52xx_ds_sram
1218c2ecf20Sopenharmony_ci
1228c2ecf20Sopenharmony_ci
1238c2ecf20Sopenharmony_ci/* ### interrupt handler for wakeup from deep-sleep ### */
1248c2ecf20Sopenharmony_ci_GLOBAL(mpc52xx_ds_cached)
1258c2ecf20Sopenharmony_cimpc52xx_ds_cached:
1268c2ecf20Sopenharmony_ci	mtspr	SPRN_SPRG0, r7
1278c2ecf20Sopenharmony_ci	mtspr	SPRN_SPRG1, r8
1288c2ecf20Sopenharmony_ci
1298c2ecf20Sopenharmony_ci	/* disable emulated interrupt */
1308c2ecf20Sopenharmony_ci	mfspr	r7, 311 /* MBAR */
1318c2ecf20Sopenharmony_ci	addi	r7, r7, 0x540	/* intr->main_emul */
1328c2ecf20Sopenharmony_ci	li	r8, 0
1338c2ecf20Sopenharmony_ci	stw	r8, 0(r7)
1348c2ecf20Sopenharmony_ci	sync
1358c2ecf20Sopenharmony_ci	dcbf	0, r7
1368c2ecf20Sopenharmony_ci
1378c2ecf20Sopenharmony_ci	/* acknowledge wakeup, so CCS releases power pown */
1388c2ecf20Sopenharmony_ci	mfspr	r7, 311	/* MBAR */
1398c2ecf20Sopenharmony_ci	addi	r7, r7, 0x524	/* intr->enc_status */
1408c2ecf20Sopenharmony_ci	lwz	r8, 0(r7)
1418c2ecf20Sopenharmony_ci	ori	r8, r8, 0x0400
1428c2ecf20Sopenharmony_ci	stw	r8, 0(r7)
1438c2ecf20Sopenharmony_ci	sync
1448c2ecf20Sopenharmony_ci	dcbf	0, r7
1458c2ecf20Sopenharmony_ci
1468c2ecf20Sopenharmony_ci	/* flag - we handled the interrupt */
1478c2ecf20Sopenharmony_ci	li	r10, 1
1488c2ecf20Sopenharmony_ci
1498c2ecf20Sopenharmony_ci	mfspr	r8, SPRN_SPRG1
1508c2ecf20Sopenharmony_ci	mfspr	r7, SPRN_SPRG0
1518c2ecf20Sopenharmony_ci
1528c2ecf20Sopenharmony_ci	rfi
1538c2ecf20Sopenharmony_ci_GLOBAL(mpc52xx_ds_cached_size)
1548c2ecf20Sopenharmony_cimpc52xx_ds_cached_size:
1558c2ecf20Sopenharmony_ci	.long $-mpc52xx_ds_cached
156