^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) //
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) // Copyright (c) 2011-2015 Samsung Electronics Co., Ltd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) // http://www.samsung.com/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) //
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) // Exynos5420 - CPU PMU (Power Management Unit) support
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/pm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/soc/samsung/exynos-regs-pmu.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/soc/samsung/exynos-pmu.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <asm/cputype.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include "exynos-pmu.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) static const struct exynos_pmu_conf exynos5420_pmu_config[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) /* { .offset = offset, .val = { AFTR, LPA, SLEEP } */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) { EXYNOS5_ARM_CORE0_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) { EXYNOS5_DIS_IRQ_ARM_CORE0_LOCAL_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) { EXYNOS5_DIS_IRQ_ARM_CORE0_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) { EXYNOS5_ARM_CORE1_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) { EXYNOS5_DIS_IRQ_ARM_CORE1_LOCAL_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) { EXYNOS5_DIS_IRQ_ARM_CORE1_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) { EXYNOS5420_ARM_CORE2_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) { EXYNOS5420_DIS_IRQ_ARM_CORE2_LOCAL_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) { EXYNOS5420_DIS_IRQ_ARM_CORE2_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) { EXYNOS5420_ARM_CORE3_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) { EXYNOS5420_DIS_IRQ_ARM_CORE3_LOCAL_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) { EXYNOS5420_DIS_IRQ_ARM_CORE3_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) { EXYNOS5420_KFC_CORE0_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) { EXYNOS5420_DIS_IRQ_KFC_CORE0_LOCAL_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) { EXYNOS5420_DIS_IRQ_KFC_CORE0_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) { EXYNOS5420_KFC_CORE1_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) { EXYNOS5420_DIS_IRQ_KFC_CORE1_LOCAL_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) { EXYNOS5420_DIS_IRQ_KFC_CORE1_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) { EXYNOS5420_KFC_CORE2_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) { EXYNOS5420_DIS_IRQ_KFC_CORE2_LOCAL_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) { EXYNOS5420_DIS_IRQ_KFC_CORE2_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) { EXYNOS5420_KFC_CORE3_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) { EXYNOS5420_DIS_IRQ_KFC_CORE3_LOCAL_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) { EXYNOS5420_DIS_IRQ_KFC_CORE3_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) { EXYNOS5_ISP_ARM_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) { EXYNOS5_DIS_IRQ_ISP_ARM_LOCAL_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) { EXYNOS5_DIS_IRQ_ISP_ARM_CENTRAL_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) { EXYNOS5420_ARM_COMMON_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) { EXYNOS5420_KFC_COMMON_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) { EXYNOS5_ARM_L2_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) { EXYNOS5420_KFC_L2_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) { EXYNOS5_CMU_ACLKSTOP_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) { EXYNOS5_CMU_SCLKSTOP_SYS_PWR_REG, { 0x1, 0x0, 0x1} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) { EXYNOS5_CMU_RESET_SYS_PWR_REG, { 0x1, 0x1, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) { EXYNOS5_CMU_ACLKSTOP_SYSMEM_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) { EXYNOS5_CMU_SCLKSTOP_SYSMEM_SYS_PWR_REG, { 0x1, 0x0, 0x1} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) { EXYNOS5_CMU_RESET_SYSMEM_SYS_PWR_REG, { 0x1, 0x1, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) { EXYNOS5_DRAM_FREQ_DOWN_SYS_PWR_REG, { 0x1, 0x0, 0x1} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) { EXYNOS5_DDRPHY_DLLOFF_SYS_PWR_REG, { 0x1, 0x1, 0x1} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) { EXYNOS5_DDRPHY_DLLLOCK_SYS_PWR_REG, { 0x1, 0x0, 0x1} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) { EXYNOS5_APLL_SYSCLK_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) { EXYNOS5_MPLL_SYSCLK_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) { EXYNOS5_VPLL_SYSCLK_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) { EXYNOS5_EPLL_SYSCLK_SYS_PWR_REG, { 0x1, 0x1, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) { EXYNOS5_BPLL_SYSCLK_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) { EXYNOS5_CPLL_SYSCLK_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) { EXYNOS5420_DPLL_SYSCLK_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) { EXYNOS5420_IPLL_SYSCLK_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) { EXYNOS5420_KPLL_SYSCLK_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) { EXYNOS5_MPLLUSER_SYSCLK_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) { EXYNOS5_BPLLUSER_SYSCLK_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) { EXYNOS5420_RPLL_SYSCLK_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) { EXYNOS5420_SPLL_SYSCLK_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) { EXYNOS5_TOP_BUS_SYS_PWR_REG, { 0x3, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) { EXYNOS5_TOP_RETENTION_SYS_PWR_REG, { 0x1, 0x1, 0x1} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) { EXYNOS5_TOP_PWR_SYS_PWR_REG, { 0x3, 0x3, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) { EXYNOS5_TOP_BUS_SYSMEM_SYS_PWR_REG, { 0x3, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) { EXYNOS5_TOP_RETENTION_SYSMEM_SYS_PWR_REG, { 0x1, 0x0, 0x1} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) { EXYNOS5_TOP_PWR_SYSMEM_SYS_PWR_REG, { 0x3, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) { EXYNOS5_LOGIC_RESET_SYS_PWR_REG, { 0x1, 0x1, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) { EXYNOS5_OSCCLK_GATE_SYS_PWR_REG, { 0x1, 0x0, 0x1} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) { EXYNOS5_LOGIC_RESET_SYSMEM_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) { EXYNOS5_OSCCLK_GATE_SYSMEM_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) { EXYNOS5420_INTRAM_MEM_SYS_PWR_REG, { 0x3, 0x0, 0x3} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) { EXYNOS5420_INTROM_MEM_SYS_PWR_REG, { 0x3, 0x0, 0x3} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) { EXYNOS5_PAD_RETENTION_DRAM_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) { EXYNOS5_PAD_RETENTION_MAU_SYS_PWR_REG, { 0x1, 0x1, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) { EXYNOS5420_PAD_RETENTION_JTAG_SYS_PWR_REG, { 0x1, 0x1, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) { EXYNOS5420_PAD_RETENTION_DRAM_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) { EXYNOS5420_PAD_RETENTION_UART_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) { EXYNOS5420_PAD_RETENTION_MMC0_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) { EXYNOS5420_PAD_RETENTION_MMC1_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) { EXYNOS5420_PAD_RETENTION_MMC2_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) { EXYNOS5420_PAD_RETENTION_HSI_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) { EXYNOS5420_PAD_RETENTION_EBIA_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) { EXYNOS5420_PAD_RETENTION_EBIB_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) { EXYNOS5420_PAD_RETENTION_SPI_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) { EXYNOS5420_PAD_RETENTION_DRAM_COREBLK_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) { EXYNOS5_PAD_ISOLATION_SYS_PWR_REG, { 0x1, 0x1, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) { EXYNOS5_PAD_ISOLATION_SYSMEM_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) { EXYNOS5_PAD_ALV_SEL_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) { EXYNOS5_XUSBXTI_SYS_PWR_REG, { 0x1, 0x1, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) { EXYNOS5_XXTI_SYS_PWR_REG, { 0x1, 0x1, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) { EXYNOS5_EXT_REGULATOR_SYS_PWR_REG, { 0x1, 0x1, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) { EXYNOS5_GPIO_MODE_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) { EXYNOS5_GPIO_MODE_SYSMEM_SYS_PWR_REG, { 0x1, 0x1, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) { EXYNOS5_GPIO_MODE_MAU_SYS_PWR_REG, { 0x1, 0x1, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) { EXYNOS5_TOP_ASB_RESET_SYS_PWR_REG, { 0x1, 0x1, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) { EXYNOS5_TOP_ASB_ISOLATION_SYS_PWR_REG, { 0x1, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) { EXYNOS5_GSCL_SYS_PWR_REG, { 0x7, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) { EXYNOS5_ISP_SYS_PWR_REG, { 0x7, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) { EXYNOS5_MFC_SYS_PWR_REG, { 0x7, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) { EXYNOS5_G3D_SYS_PWR_REG, { 0x7, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) { EXYNOS5420_DISP1_SYS_PWR_REG, { 0x7, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) { EXYNOS5420_MAU_SYS_PWR_REG, { 0x7, 0x7, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) { EXYNOS5420_G2D_SYS_PWR_REG, { 0x7, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) { EXYNOS5420_MSC_SYS_PWR_REG, { 0x7, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) { EXYNOS5420_FSYS_SYS_PWR_REG, { 0x7, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) { EXYNOS5420_FSYS2_SYS_PWR_REG, { 0x7, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) { EXYNOS5420_PSGEN_SYS_PWR_REG, { 0x7, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) { EXYNOS5420_PERIC_SYS_PWR_REG, { 0x7, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) { EXYNOS5420_WCORE_SYS_PWR_REG, { 0x7, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) { EXYNOS5_CMU_CLKSTOP_GSCL_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) { EXYNOS5_CMU_CLKSTOP_ISP_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) { EXYNOS5_CMU_CLKSTOP_MFC_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) { EXYNOS5_CMU_CLKSTOP_G3D_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) { EXYNOS5420_CMU_CLKSTOP_DISP1_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) { EXYNOS5420_CMU_CLKSTOP_MAU_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) { EXYNOS5420_CMU_CLKSTOP_G2D_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) { EXYNOS5420_CMU_CLKSTOP_MSC_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) { EXYNOS5420_CMU_CLKSTOP_FSYS_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) { EXYNOS5420_CMU_CLKSTOP_PSGEN_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) { EXYNOS5420_CMU_CLKSTOP_PERIC_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) { EXYNOS5420_CMU_CLKSTOP_WCORE_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) { EXYNOS5_CMU_SYSCLK_GSCL_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) { EXYNOS5_CMU_SYSCLK_ISP_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) { EXYNOS5_CMU_SYSCLK_MFC_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) { EXYNOS5_CMU_SYSCLK_G3D_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) { EXYNOS5420_CMU_SYSCLK_DISP1_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) { EXYNOS5420_CMU_SYSCLK_MAU_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) { EXYNOS5420_CMU_SYSCLK_G2D_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) { EXYNOS5420_CMU_SYSCLK_MSC_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) { EXYNOS5420_CMU_SYSCLK_FSYS_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) { EXYNOS5420_CMU_SYSCLK_FSYS2_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) { EXYNOS5420_CMU_SYSCLK_PSGEN_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) { EXYNOS5420_CMU_SYSCLK_PERIC_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) { EXYNOS5420_CMU_SYSCLK_WCORE_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) { EXYNOS5420_CMU_RESET_FSYS2_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) { EXYNOS5420_CMU_RESET_PSGEN_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) { EXYNOS5420_CMU_RESET_PERIC_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) { EXYNOS5420_CMU_RESET_WCORE_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) { EXYNOS5_CMU_RESET_GSCL_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) { EXYNOS5_CMU_RESET_ISP_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) { EXYNOS5_CMU_RESET_MFC_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) { EXYNOS5_CMU_RESET_G3D_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) { EXYNOS5420_CMU_RESET_DISP1_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) { EXYNOS5420_CMU_RESET_MAU_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) { EXYNOS5420_CMU_RESET_G2D_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) { EXYNOS5420_CMU_RESET_MSC_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) { EXYNOS5420_CMU_RESET_FSYS_SYS_PWR_REG, { 0x0, 0x0, 0x0} },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) { PMU_TABLE_END,},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) static unsigned int const exynos5420_list_disable_pmu_reg[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) EXYNOS5_CMU_CLKSTOP_GSCL_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) EXYNOS5_CMU_CLKSTOP_ISP_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) EXYNOS5_CMU_CLKSTOP_G3D_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) EXYNOS5420_CMU_CLKSTOP_DISP1_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) EXYNOS5420_CMU_CLKSTOP_MAU_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) EXYNOS5420_CMU_CLKSTOP_G2D_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) EXYNOS5420_CMU_CLKSTOP_MSC_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) EXYNOS5420_CMU_CLKSTOP_FSYS_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) EXYNOS5420_CMU_CLKSTOP_PSGEN_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) EXYNOS5420_CMU_CLKSTOP_PERIC_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) EXYNOS5420_CMU_CLKSTOP_WCORE_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) EXYNOS5_CMU_SYSCLK_GSCL_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) EXYNOS5_CMU_SYSCLK_ISP_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) EXYNOS5_CMU_SYSCLK_G3D_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) EXYNOS5420_CMU_SYSCLK_DISP1_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) EXYNOS5420_CMU_SYSCLK_MAU_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) EXYNOS5420_CMU_SYSCLK_G2D_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) EXYNOS5420_CMU_SYSCLK_MSC_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) EXYNOS5420_CMU_SYSCLK_FSYS_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) EXYNOS5420_CMU_SYSCLK_FSYS2_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) EXYNOS5420_CMU_SYSCLK_PSGEN_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) EXYNOS5420_CMU_SYSCLK_PERIC_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) EXYNOS5420_CMU_SYSCLK_WCORE_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) EXYNOS5420_CMU_RESET_FSYS2_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) EXYNOS5420_CMU_RESET_PSGEN_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) EXYNOS5420_CMU_RESET_PERIC_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) EXYNOS5420_CMU_RESET_WCORE_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) EXYNOS5_CMU_RESET_GSCL_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) EXYNOS5_CMU_RESET_ISP_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) EXYNOS5_CMU_RESET_G3D_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) EXYNOS5420_CMU_RESET_DISP1_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) EXYNOS5420_CMU_RESET_MAU_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) EXYNOS5420_CMU_RESET_G2D_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) EXYNOS5420_CMU_RESET_MSC_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) EXYNOS5420_CMU_RESET_FSYS_SYS_PWR_REG,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) static void exynos5420_powerdown_conf(enum sys_powerdown mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) u32 this_cluster;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) this_cluster = MPIDR_AFFINITY_LEVEL(read_cpuid_mpidr(), 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) * set the cluster id to IROM register to ensure that we wake
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) * up with the current cluster.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) pmu_raw_writel(this_cluster, EXYNOS_IROM_DATA2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) static void exynos5420_pmu_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) unsigned int value;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) * Set the CMU_RESET, CMU_SYSCLK and CMU_CLKSTOP registers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) * for local power blocks to Low initially as per Table 8-4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) * "System-Level Power-Down Configuration Registers".
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) for (i = 0; i < ARRAY_SIZE(exynos5420_list_disable_pmu_reg); i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) pmu_raw_writel(0, exynos5420_list_disable_pmu_reg[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) /* Enable USE_STANDBY_WFI for all CORE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) pmu_raw_writel(EXYNOS5420_USE_STANDBY_WFI_ALL, S5P_CENTRAL_SEQ_OPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) value = pmu_raw_readl(EXYNOS_L2_OPTION(0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) value &= ~EXYNOS_L2_USE_RETENTION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) pmu_raw_writel(value, EXYNOS_L2_OPTION(0));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) value = pmu_raw_readl(EXYNOS_L2_OPTION(1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) value &= ~EXYNOS_L2_USE_RETENTION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) pmu_raw_writel(value, EXYNOS_L2_OPTION(1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) * If L2_COMMON is turned off, clocks related to ATB async
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) * bridge are gated. Thus, when ISP power is gated, LPI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) * may get stuck.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) value = pmu_raw_readl(EXYNOS5420_LPI_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) value |= EXYNOS5420_ATB_ISP_ARM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) pmu_raw_writel(value, EXYNOS5420_LPI_MASK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) value = pmu_raw_readl(EXYNOS5420_LPI_MASK1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) value |= EXYNOS5420_ATB_KFC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) pmu_raw_writel(value, EXYNOS5420_LPI_MASK1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) /* Prevent issue of new bus request from L2 memory */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) value = pmu_raw_readl(EXYNOS5420_ARM_COMMON_OPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) value |= EXYNOS5_SKIP_DEACTIVATE_ACEACP_IN_PWDN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) pmu_raw_writel(value, EXYNOS5420_ARM_COMMON_OPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) value = pmu_raw_readl(EXYNOS5420_KFC_COMMON_OPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) value |= EXYNOS5_SKIP_DEACTIVATE_ACEACP_IN_PWDN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) pmu_raw_writel(value, EXYNOS5420_KFC_COMMON_OPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) /* This setting is to reduce suspend/resume time */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) pmu_raw_writel(DUR_WAIT_RESET, EXYNOS5420_LOGIC_RESET_DURATION3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) /* Serialized CPU wakeup of Eagle */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) pmu_raw_writel(SPREAD_ENABLE, EXYNOS5420_ARM_INTR_SPREAD_ENABLE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) pmu_raw_writel(SPREAD_USE_STANDWFI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) EXYNOS5420_ARM_INTR_SPREAD_USE_STANDBYWFI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) pmu_raw_writel(0x1, EXYNOS5420_UP_SCHEDULER);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) pr_info("EXYNOS5420 PMU initialized\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) const struct exynos_pmu_data exynos5420_pmu_data = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) .pmu_config = exynos5420_pmu_config,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) .pmu_init = exynos5420_pmu_init,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) .powerdown_conf = exynos5420_powerdown_conf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) };