1179f82a2SJacky Bai /* 244dea544SJacky Bai * Copyright (c) 2019-2022, ARM Limited and Contributors. All rights reserved. 3179f82a2SJacky Bai * 4179f82a2SJacky Bai * SPDX-License-Identifier: BSD-3-Clause 5179f82a2SJacky Bai */ 6179f82a2SJacky Bai 7179f82a2SJacky Bai #include <stdlib.h> 8179f82a2SJacky Bai #include <stdint.h> 9179f82a2SJacky Bai #include <stdbool.h> 10179f82a2SJacky Bai 11179f82a2SJacky Bai #include <common/debug.h> 12179f82a2SJacky Bai #include <drivers/delay_timer.h> 13179f82a2SJacky Bai #include <lib/mmio.h> 14179f82a2SJacky Bai #include <lib/psci/psci.h> 15179f82a2SJacky Bai #include <lib/smccc.h> 16179f82a2SJacky Bai #include <platform_def.h> 17179f82a2SJacky Bai #include <services/std_svc.h> 18179f82a2SJacky Bai 19179f82a2SJacky Bai #include <gpc.h> 20179f82a2SJacky Bai #include <imx_sip_svc.h> 21179f82a2SJacky Bai 2244dea544SJacky Bai #define MIPI_PWR_REQ BIT(0) 2344dea544SJacky Bai #define PCIE_PWR_REQ BIT(1) 2444dea544SJacky Bai #define OTG1_PWR_REQ BIT(2) 2544dea544SJacky Bai #define OTG2_PWR_REQ BIT(3) 2644dea544SJacky Bai #define HSIOMIX_PWR_REQ BIT(4) 2744dea544SJacky Bai #define GPU2D_PWR_REQ BIT(6) 2844dea544SJacky Bai #define GPUMIX_PWR_REQ BIT(7) 2944dea544SJacky Bai #define VPUMIX_PWR_REQ BIT(8) 3044dea544SJacky Bai #define GPU3D_PWR_REQ BIT(9) 3144dea544SJacky Bai #define DISPMIX_PWR_REQ BIT(10) 3244dea544SJacky Bai #define VPU_G1_PWR_REQ BIT(11) 3344dea544SJacky Bai #define VPU_G2_PWR_REQ BIT(12) 3444dea544SJacky Bai #define VPU_H1_PWR_REQ BIT(13) 3544dea544SJacky Bai 3644dea544SJacky Bai #define HSIOMIX_ADB400_SYNC (0x3 << 5) 3744dea544SJacky Bai #define DISPMIX_ADB400_SYNC BIT(7) 3844dea544SJacky Bai #define VPUMIX_ADB400_SYNC BIT(8) 3944dea544SJacky Bai #define GPU3D_ADB400_SYNC BIT(9) 4044dea544SJacky Bai #define GPU2D_ADB400_SYNC BIT(10) 4144dea544SJacky Bai #define GPUMIX_ADB400_SYNC BIT(11) 4244dea544SJacky Bai #define HSIOMIX_ADB400_ACK (0x3 << 23) 4344dea544SJacky Bai #define DISPMIX_ADB400_ACK BIT(25) 4444dea544SJacky Bai #define VPUMIX_ADB400_ACK BIT(26) 4544dea544SJacky Bai #define GPU3D_ADB400_ACK BIT(27) 4644dea544SJacky Bai #define GPU2D_ADB400_ACK BIT(28) 4744dea544SJacky Bai #define GPUMIX_ADB400_ACK BIT(29) 4844dea544SJacky Bai 4944dea544SJacky Bai #define MIPI_PGC 0xc00 5044dea544SJacky Bai #define PCIE_PGC 0xc40 5144dea544SJacky Bai #define OTG1_PGC 0xc80 5244dea544SJacky Bai #define OTG2_PGC 0xcc0 5344dea544SJacky Bai #define HSIOMIX_PGC 0xd00 5444dea544SJacky Bai #define GPU2D_PGC 0xd80 5544dea544SJacky Bai #define GPUMIX_PGC 0xdc0 5644dea544SJacky Bai #define VPUMIX_PGC 0xe00 5744dea544SJacky Bai #define GPU3D_PGC 0xe40 5844dea544SJacky Bai #define DISPMIX_PGC 0xe80 5944dea544SJacky Bai #define VPU_G1_PGC 0xec0 6044dea544SJacky Bai #define VPU_G2_PGC 0xf00 6144dea544SJacky Bai #define VPU_H1_PGC 0xf40 6244dea544SJacky Bai 6344dea544SJacky Bai enum pu_domain_id { 6444dea544SJacky Bai HSIOMIX, 6544dea544SJacky Bai PCIE, 6644dea544SJacky Bai OTG1, 6744dea544SJacky Bai OTG2, 6844dea544SJacky Bai GPUMIX, 6944dea544SJacky Bai VPUMIX, 7044dea544SJacky Bai VPU_G1, 7144dea544SJacky Bai VPU_G2, 7244dea544SJacky Bai VPU_H1, 7344dea544SJacky Bai DISPMIX, 7444dea544SJacky Bai MIPI, 7544dea544SJacky Bai /* below two domain only for ATF internal use */ 7644dea544SJacky Bai GPU2D, 7744dea544SJacky Bai GPU3D, 7844dea544SJacky Bai MAX_DOMAINS, 7944dea544SJacky Bai }; 8044dea544SJacky Bai 8144dea544SJacky Bai /* PU domain */ 8244dea544SJacky Bai static struct imx_pwr_domain pu_domains[] = { 8344dea544SJacky Bai IMX_MIX_DOMAIN(HSIOMIX, false), 8444dea544SJacky Bai IMX_PD_DOMAIN(PCIE, false), 8544dea544SJacky Bai IMX_PD_DOMAIN(OTG1, true), 8644dea544SJacky Bai IMX_PD_DOMAIN(OTG2, true), 8744dea544SJacky Bai IMX_MIX_DOMAIN(GPUMIX, false), 8844dea544SJacky Bai IMX_MIX_DOMAIN(VPUMIX, false), 8944dea544SJacky Bai IMX_PD_DOMAIN(VPU_G1, false), 9044dea544SJacky Bai IMX_PD_DOMAIN(VPU_G2, false), 9144dea544SJacky Bai IMX_PD_DOMAIN(VPU_H1, false), 9244dea544SJacky Bai IMX_MIX_DOMAIN(DISPMIX, false), 9344dea544SJacky Bai IMX_PD_DOMAIN(MIPI, false), 9444dea544SJacky Bai /* below two domain only for ATF internal use */ 9544dea544SJacky Bai IMX_MIX_DOMAIN(GPU2D, false), 9644dea544SJacky Bai IMX_MIX_DOMAIN(GPU3D, false), 9744dea544SJacky Bai }; 9844dea544SJacky Bai 9944dea544SJacky Bai static unsigned int pu_domain_status; 10044dea544SJacky Bai 10144dea544SJacky Bai #define GPU_RCR 0x40 10244dea544SJacky Bai #define VPU_RCR 0x44 10344dea544SJacky Bai 10444dea544SJacky Bai #define VPU_CTL_BASE 0x38330000 10544dea544SJacky Bai #define BLK_SFT_RSTN_CSR 0x0 10644dea544SJacky Bai #define H1_SFT_RSTN BIT(2) 10744dea544SJacky Bai #define G1_SFT_RSTN BIT(1) 10844dea544SJacky Bai #define G2_SFT_RSTN BIT(0) 10944dea544SJacky Bai 11044dea544SJacky Bai #define DISP_CTL_BASE 0x32e28000 11144dea544SJacky Bai 11244dea544SJacky Bai void vpu_sft_reset_assert(uint32_t domain_id) 11344dea544SJacky Bai { 11444dea544SJacky Bai uint32_t val; 11544dea544SJacky Bai 11644dea544SJacky Bai val = mmio_read_32(VPU_CTL_BASE + BLK_SFT_RSTN_CSR); 11744dea544SJacky Bai 11844dea544SJacky Bai switch (domain_id) { 11944dea544SJacky Bai case VPU_G1: 12044dea544SJacky Bai val &= ~G1_SFT_RSTN; 12144dea544SJacky Bai mmio_write_32(VPU_CTL_BASE + BLK_SFT_RSTN_CSR, val); 12244dea544SJacky Bai break; 12344dea544SJacky Bai case VPU_G2: 12444dea544SJacky Bai val &= ~G2_SFT_RSTN; 12544dea544SJacky Bai mmio_write_32(VPU_CTL_BASE + BLK_SFT_RSTN_CSR, val); 12644dea544SJacky Bai break; 12744dea544SJacky Bai case VPU_H1: 12844dea544SJacky Bai val &= ~H1_SFT_RSTN; 12944dea544SJacky Bai mmio_write_32(VPU_CTL_BASE + BLK_SFT_RSTN_CSR, val); 13044dea544SJacky Bai break; 13144dea544SJacky Bai default: 13244dea544SJacky Bai break; 13344dea544SJacky Bai } 13444dea544SJacky Bai } 13544dea544SJacky Bai 13644dea544SJacky Bai void vpu_sft_reset_deassert(uint32_t domain_id) 13744dea544SJacky Bai { 13844dea544SJacky Bai uint32_t val; 13944dea544SJacky Bai 14044dea544SJacky Bai val = mmio_read_32(VPU_CTL_BASE + BLK_SFT_RSTN_CSR); 14144dea544SJacky Bai 14244dea544SJacky Bai switch (domain_id) { 14344dea544SJacky Bai case VPU_G1: 14444dea544SJacky Bai val |= G1_SFT_RSTN; 14544dea544SJacky Bai mmio_write_32(VPU_CTL_BASE + BLK_SFT_RSTN_CSR, val); 14644dea544SJacky Bai break; 14744dea544SJacky Bai case VPU_G2: 14844dea544SJacky Bai val |= G2_SFT_RSTN; 14944dea544SJacky Bai mmio_write_32(VPU_CTL_BASE + BLK_SFT_RSTN_CSR, val); 15044dea544SJacky Bai break; 15144dea544SJacky Bai case VPU_H1: 15244dea544SJacky Bai val |= H1_SFT_RSTN; 15344dea544SJacky Bai mmio_write_32(VPU_CTL_BASE + BLK_SFT_RSTN_CSR, val); 15444dea544SJacky Bai break; 15544dea544SJacky Bai default: 15644dea544SJacky Bai break; 15744dea544SJacky Bai } 15844dea544SJacky Bai } 15944dea544SJacky Bai 16044dea544SJacky Bai void imx_gpc_pm_domain_enable(uint32_t domain_id, bool on) 16144dea544SJacky Bai { 16244dea544SJacky Bai if (domain_id >= MAX_DOMAINS) { 16344dea544SJacky Bai return; 16444dea544SJacky Bai } 16544dea544SJacky Bai 16644dea544SJacky Bai struct imx_pwr_domain *pwr_domain = &pu_domains[domain_id]; 16744dea544SJacky Bai 16844dea544SJacky Bai if (on) { 16944dea544SJacky Bai pu_domain_status |= (1 << domain_id); 17044dea544SJacky Bai 17144dea544SJacky Bai if (domain_id == VPU_G1 || domain_id == VPU_G2 || 17244dea544SJacky Bai domain_id == VPU_H1) { 17344dea544SJacky Bai vpu_sft_reset_assert(domain_id); 17444dea544SJacky Bai } 17544dea544SJacky Bai 17644dea544SJacky Bai /* HSIOMIX has no PU bit, so skip for it */ 17744dea544SJacky Bai if (domain_id != HSIOMIX) { 17844dea544SJacky Bai /* clear the PGC bit */ 17944dea544SJacky Bai mmio_clrbits_32(IMX_GPC_BASE + pwr_domain->pgc_offset, 0x1); 18044dea544SJacky Bai 18144dea544SJacky Bai /* power up the domain */ 18244dea544SJacky Bai mmio_setbits_32(IMX_GPC_BASE + PU_PGC_UP_TRG, pwr_domain->pwr_req); 18344dea544SJacky Bai 18444dea544SJacky Bai /* wait for power request done */ 18544dea544SJacky Bai while (mmio_read_32(IMX_GPC_BASE + PU_PGC_UP_TRG) & pwr_domain->pwr_req) { 18644dea544SJacky Bai ; 18744dea544SJacky Bai } 18844dea544SJacky Bai } 18944dea544SJacky Bai 19044dea544SJacky Bai if (domain_id == VPU_G1 || domain_id == VPU_G2 || 19144dea544SJacky Bai domain_id == VPU_H1) { 19244dea544SJacky Bai vpu_sft_reset_deassert(domain_id); 19344dea544SJacky Bai /* dealy for a while to make sure reset done */ 19444dea544SJacky Bai udelay(100); 19544dea544SJacky Bai } 19644dea544SJacky Bai 19744dea544SJacky Bai if (domain_id == GPUMIX) { 19844dea544SJacky Bai /* assert reset */ 19944dea544SJacky Bai mmio_write_32(IMX_SRC_BASE + GPU_RCR, 0x1); 20044dea544SJacky Bai 20144dea544SJacky Bai /* power up GPU2D */ 20244dea544SJacky Bai mmio_clrbits_32(IMX_GPC_BASE + GPU2D_PGC, 0x1); 20344dea544SJacky Bai 20444dea544SJacky Bai mmio_setbits_32(IMX_GPC_BASE + PU_PGC_UP_TRG, GPU2D_PWR_REQ); 20544dea544SJacky Bai 20644dea544SJacky Bai /* wait for power request done */ 20744dea544SJacky Bai while (mmio_read_32(IMX_GPC_BASE + PU_PGC_UP_TRG) & GPU2D_PWR_REQ) { 20844dea544SJacky Bai ; 20944dea544SJacky Bai } 21044dea544SJacky Bai 21144dea544SJacky Bai udelay(1); 21244dea544SJacky Bai 21344dea544SJacky Bai /* power up GPU3D */ 21444dea544SJacky Bai mmio_clrbits_32(IMX_GPC_BASE + GPU3D_PGC, 0x1); 21544dea544SJacky Bai 21644dea544SJacky Bai mmio_setbits_32(IMX_GPC_BASE + PU_PGC_UP_TRG, GPU3D_PWR_REQ); 21744dea544SJacky Bai 21844dea544SJacky Bai /* wait for power request done */ 21944dea544SJacky Bai while (mmio_read_32(IMX_GPC_BASE + PU_PGC_UP_TRG) & GPU3D_PWR_REQ) { 22044dea544SJacky Bai ; 22144dea544SJacky Bai } 22244dea544SJacky Bai 22344dea544SJacky Bai udelay(10); 22444dea544SJacky Bai /* release the gpumix reset */ 22544dea544SJacky Bai mmio_write_32(IMX_SRC_BASE + GPU_RCR, 0x0); 22644dea544SJacky Bai udelay(10); 22744dea544SJacky Bai } 22844dea544SJacky Bai 22944dea544SJacky Bai /* vpu sft clock enable */ 23044dea544SJacky Bai if (domain_id == VPUMIX) { 23144dea544SJacky Bai mmio_write_32(IMX_SRC_BASE + VPU_RCR, 0x1); 23244dea544SJacky Bai udelay(5); 23344dea544SJacky Bai mmio_write_32(IMX_SRC_BASE + VPU_RCR, 0x0); 23444dea544SJacky Bai udelay(5); 23544dea544SJacky Bai 23644dea544SJacky Bai /* enable all clock */ 23744dea544SJacky Bai mmio_write_32(VPU_CTL_BASE + 0x4, 0x7); 23844dea544SJacky Bai } 23944dea544SJacky Bai 24044dea544SJacky Bai if (domain_id == DISPMIX) { 24144dea544SJacky Bai /* special setting for DISPMIX */ 24244dea544SJacky Bai mmio_write_32(DISP_CTL_BASE + 0x4, 0x1fff); 24344dea544SJacky Bai mmio_write_32(DISP_CTL_BASE, 0x7f); 24444dea544SJacky Bai mmio_write_32(DISP_CTL_BASE + 0x8, 0x30000); 24544dea544SJacky Bai } 24644dea544SJacky Bai 24744dea544SJacky Bai /* handle the ADB400 sync */ 24844dea544SJacky Bai if (pwr_domain->need_sync) { 24944dea544SJacky Bai /* clear adb power down request */ 25044dea544SJacky Bai mmio_setbits_32(IMX_GPC_BASE + GPC_PU_PWRHSK, pwr_domain->adb400_sync); 25144dea544SJacky Bai 25244dea544SJacky Bai /* wait for adb power request ack */ 25344dea544SJacky Bai while (!(mmio_read_32(IMX_GPC_BASE + GPC_PU_PWRHSK) & pwr_domain->adb400_ack)) { 25444dea544SJacky Bai ; 25544dea544SJacky Bai } 25644dea544SJacky Bai } 25744dea544SJacky Bai 25844dea544SJacky Bai if (domain_id == GPUMIX) { 25944dea544SJacky Bai /* power up GPU2D ADB */ 26044dea544SJacky Bai mmio_setbits_32(IMX_GPC_BASE + GPC_PU_PWRHSK, GPU2D_ADB400_SYNC); 26144dea544SJacky Bai 26244dea544SJacky Bai /* wait for adb power request ack */ 26344dea544SJacky Bai while (!(mmio_read_32(IMX_GPC_BASE + GPC_PU_PWRHSK) & GPU2D_ADB400_ACK)) { 26444dea544SJacky Bai ; 26544dea544SJacky Bai } 26644dea544SJacky Bai 26744dea544SJacky Bai /* power up GPU3D ADB */ 26844dea544SJacky Bai mmio_setbits_32(IMX_GPC_BASE + GPC_PU_PWRHSK, GPU3D_ADB400_SYNC); 26944dea544SJacky Bai 27044dea544SJacky Bai /* wait for adb power request ack */ 27144dea544SJacky Bai while (!(mmio_read_32(IMX_GPC_BASE + GPC_PU_PWRHSK) & GPU3D_ADB400_ACK)) { 27244dea544SJacky Bai ; 27344dea544SJacky Bai } 27444dea544SJacky Bai } 27544dea544SJacky Bai } else { 27644dea544SJacky Bai pu_domain_status &= ~(1 << domain_id); 27744dea544SJacky Bai 27844dea544SJacky Bai if (domain_id == OTG1 || domain_id == OTG2) { 27944dea544SJacky Bai return; 28044dea544SJacky Bai } 28144dea544SJacky Bai 28244dea544SJacky Bai /* GPU2D & GPU3D ADB power down */ 28344dea544SJacky Bai if (domain_id == GPUMIX) { 28444dea544SJacky Bai mmio_clrbits_32(IMX_GPC_BASE + GPC_PU_PWRHSK, GPU2D_ADB400_SYNC); 28544dea544SJacky Bai 28644dea544SJacky Bai /* wait for adb power request ack */ 28744dea544SJacky Bai while ((mmio_read_32(IMX_GPC_BASE + GPC_PU_PWRHSK) & GPU2D_ADB400_ACK)) { 28844dea544SJacky Bai ; 28944dea544SJacky Bai } 29044dea544SJacky Bai 29144dea544SJacky Bai mmio_clrbits_32(IMX_GPC_BASE + GPC_PU_PWRHSK, GPU3D_ADB400_SYNC); 29244dea544SJacky Bai 29344dea544SJacky Bai /* wait for adb power request ack */ 29444dea544SJacky Bai while ((mmio_read_32(IMX_GPC_BASE + GPC_PU_PWRHSK) & GPU3D_ADB400_ACK)) { 29544dea544SJacky Bai ; 29644dea544SJacky Bai } 29744dea544SJacky Bai } 29844dea544SJacky Bai 29944dea544SJacky Bai /* handle the ADB400 sync */ 30044dea544SJacky Bai if (pwr_domain->need_sync) { 30144dea544SJacky Bai /* set adb power down request */ 30244dea544SJacky Bai mmio_clrbits_32(IMX_GPC_BASE + GPC_PU_PWRHSK, pwr_domain->adb400_sync); 30344dea544SJacky Bai 30444dea544SJacky Bai /* wait for adb power request ack */ 30544dea544SJacky Bai while ((mmio_read_32(IMX_GPC_BASE + GPC_PU_PWRHSK) & pwr_domain->adb400_ack)) { 30644dea544SJacky Bai ; 30744dea544SJacky Bai } 30844dea544SJacky Bai } 30944dea544SJacky Bai 31044dea544SJacky Bai if (domain_id == GPUMIX) { 31144dea544SJacky Bai /* power down GPU2D */ 31244dea544SJacky Bai mmio_setbits_32(IMX_GPC_BASE + GPU2D_PGC, 0x1); 31344dea544SJacky Bai 31444dea544SJacky Bai mmio_setbits_32(IMX_GPC_BASE + PU_PGC_DN_TRG, GPU2D_PWR_REQ); 31544dea544SJacky Bai 31644dea544SJacky Bai /* wait for power request done */ 31744dea544SJacky Bai while (mmio_read_32(IMX_GPC_BASE + PU_PGC_DN_TRG) & GPU2D_PWR_REQ) { 31844dea544SJacky Bai ; 31944dea544SJacky Bai } 32044dea544SJacky Bai 32144dea544SJacky Bai /* power down GPU3D */ 32244dea544SJacky Bai mmio_setbits_32(IMX_GPC_BASE + GPU3D_PGC, 0x1); 32344dea544SJacky Bai 32444dea544SJacky Bai mmio_setbits_32(IMX_GPC_BASE + PU_PGC_DN_TRG, GPU3D_PWR_REQ); 32544dea544SJacky Bai 32644dea544SJacky Bai /* wait for power request done */ 32744dea544SJacky Bai while (mmio_read_32(IMX_GPC_BASE + PU_PGC_DN_TRG) & GPU3D_PWR_REQ) { 32844dea544SJacky Bai ; 32944dea544SJacky Bai } 33044dea544SJacky Bai } 33144dea544SJacky Bai 33244dea544SJacky Bai /* HSIOMIX has no PU bit, so skip for it */ 33344dea544SJacky Bai if (domain_id != HSIOMIX) { 33444dea544SJacky Bai /* set the PGC bit */ 33544dea544SJacky Bai mmio_setbits_32(IMX_GPC_BASE + pwr_domain->pgc_offset, 0x1); 33644dea544SJacky Bai 33744dea544SJacky Bai /* power down the domain */ 33844dea544SJacky Bai mmio_setbits_32(IMX_GPC_BASE + PU_PGC_DN_TRG, pwr_domain->pwr_req); 33944dea544SJacky Bai 34044dea544SJacky Bai /* wait for power request done */ 34144dea544SJacky Bai while (mmio_read_32(IMX_GPC_BASE + PU_PGC_DN_TRG) & pwr_domain->pwr_req) { 34244dea544SJacky Bai ; 34344dea544SJacky Bai } 34444dea544SJacky Bai } 34544dea544SJacky Bai } 34644dea544SJacky Bai } 34744dea544SJacky Bai 348179f82a2SJacky Bai void imx_gpc_init(void) 349179f82a2SJacky Bai { 350179f82a2SJacky Bai unsigned int val; 351179f82a2SJacky Bai int i; 352179f82a2SJacky Bai 353179f82a2SJacky Bai /* mask all the wakeup irq by default */ 354179f82a2SJacky Bai for (i = 0; i < 4; i++) { 355179f82a2SJacky Bai mmio_write_32(IMX_GPC_BASE + IMR1_CORE0_A53 + i * 4, ~0x0); 356179f82a2SJacky Bai mmio_write_32(IMX_GPC_BASE + IMR1_CORE1_A53 + i * 4, ~0x0); 357179f82a2SJacky Bai mmio_write_32(IMX_GPC_BASE + IMR1_CORE2_A53 + i * 4, ~0x0); 358179f82a2SJacky Bai mmio_write_32(IMX_GPC_BASE + IMR1_CORE3_A53 + i * 4, ~0x0); 359179f82a2SJacky Bai mmio_write_32(IMX_GPC_BASE + IMR1_CORE0_M4 + i * 4, ~0x0); 360179f82a2SJacky Bai } 361179f82a2SJacky Bai 362179f82a2SJacky Bai val = mmio_read_32(IMX_GPC_BASE + LPCR_A53_BSC); 363179f82a2SJacky Bai /* use GIC wake_request to wakeup C0~C3 from LPM */ 364179f82a2SJacky Bai val |= 0x30c00000; 365179f82a2SJacky Bai /* clear the MASTER0 LPM handshake */ 366179f82a2SJacky Bai val &= ~(1 << 6); 367179f82a2SJacky Bai mmio_write_32(IMX_GPC_BASE + LPCR_A53_BSC, val); 368179f82a2SJacky Bai 369179f82a2SJacky Bai /* clear MASTER1 & MASTER2 mapping in CPU0(A53) */ 370179f82a2SJacky Bai mmio_clrbits_32(IMX_GPC_BASE + MST_CPU_MAPPING, (MASTER1_MAPPING | 371179f82a2SJacky Bai MASTER2_MAPPING)); 372179f82a2SJacky Bai 373179f82a2SJacky Bai /* set all mix/PU in A53 domain */ 374179f82a2SJacky Bai mmio_write_32(IMX_GPC_BASE + PGC_CPU_0_1_MAPPING, 0xffff); 375179f82a2SJacky Bai 376179f82a2SJacky Bai /* 377179f82a2SJacky Bai * Set the CORE & SCU power up timing: 378179f82a2SJacky Bai * SW = 0x1, SW2ISO = 0x1; 379*1b491eeaSElyes Haouas * the CPU CORE and SCU power up timing counter 380179f82a2SJacky Bai * is drived by 32K OSC, each domain's power up 381179f82a2SJacky Bai * latency is (SW + SW2ISO) / 32768 382179f82a2SJacky Bai */ 383179f82a2SJacky Bai mmio_write_32(IMX_GPC_BASE + COREx_PGC_PCR(0) + 0x4, 0x81); 384179f82a2SJacky Bai mmio_write_32(IMX_GPC_BASE + COREx_PGC_PCR(1) + 0x4, 0x81); 385179f82a2SJacky Bai mmio_write_32(IMX_GPC_BASE + COREx_PGC_PCR(2) + 0x4, 0x81); 386179f82a2SJacky Bai mmio_write_32(IMX_GPC_BASE + COREx_PGC_PCR(3) + 0x4, 0x81); 387179f82a2SJacky Bai mmio_write_32(IMX_GPC_BASE + PLAT_PGC_PCR + 0x4, 0x81); 388179f82a2SJacky Bai mmio_write_32(IMX_GPC_BASE + PGC_SCU_TIMING, 389179f82a2SJacky Bai (0x59 << 10) | 0x5B | (0x2 << 20)); 390179f82a2SJacky Bai 391179f82a2SJacky Bai /* set DUMMY PDN/PUP ACK by default for A53 domain */ 392179f82a2SJacky Bai mmio_write_32(IMX_GPC_BASE + PGC_ACK_SEL_A53, 393179f82a2SJacky Bai A53_DUMMY_PUP_ACK | A53_DUMMY_PDN_ACK); 394179f82a2SJacky Bai 395179f82a2SJacky Bai /* clear DSM by default */ 396179f82a2SJacky Bai val = mmio_read_32(IMX_GPC_BASE + SLPCR); 397179f82a2SJacky Bai val &= ~SLPCR_EN_DSM; 398179f82a2SJacky Bai /* enable the fast wakeup wait mode */ 399179f82a2SJacky Bai val |= SLPCR_A53_FASTWUP_WAIT_MODE; 400179f82a2SJacky Bai /* clear the RBC */ 401179f82a2SJacky Bai val &= ~(0x3f << SLPCR_RBC_COUNT_SHIFT); 402179f82a2SJacky Bai /* set the STBY_COUNT to 0x5, (128 * 30)us */ 403179f82a2SJacky Bai val &= ~(0x7 << SLPCR_STBY_COUNT_SHFT); 404179f82a2SJacky Bai val |= (0x5 << SLPCR_STBY_COUNT_SHFT); 405179f82a2SJacky Bai mmio_write_32(IMX_GPC_BASE + SLPCR, val); 406179f82a2SJacky Bai 407179f82a2SJacky Bai /* 408179f82a2SJacky Bai * USB PHY power up needs to make sure RESET bit in SRC is clear, 409179f82a2SJacky Bai * otherwise, the PU power up bit in GPC will NOT self-cleared. 410179f82a2SJacky Bai * only need to do it once. 411179f82a2SJacky Bai */ 412179f82a2SJacky Bai mmio_clrbits_32(IMX_SRC_BASE + SRC_OTG1PHY_SCR, 0x1); 413179f82a2SJacky Bai mmio_clrbits_32(IMX_SRC_BASE + SRC_OTG2PHY_SCR, 0x1); 414179f82a2SJacky Bai } 415