Message ID | 1515484746-10656-4-git-send-email-cw00.choi@samsung.com (mailing list archive) |
---|---|
State | Changes Requested |
Headers | show |
On Tue, Jan 9, 2018 at 8:59 AM, Chanwoo Choi <cw00.choi@samsung.com> wrote: > This patch adds the PMU (Power Management Unit) data of exynos5433 SoC > in order to support the various power modes. Each power mode has > the different value for reducing the power-consumption. > > Signed-off-by: Jonghwa Lee <jonghwa3.lee@samsung.com> > Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com> > --- > arch/arm/mach-exynos/common.h | 2 - > drivers/soc/samsung/Makefile | 3 +- > drivers/soc/samsung/exynos-pmu.c | 1 + > drivers/soc/samsung/exynos-pmu.h | 2 + > drivers/soc/samsung/exynos5433-pmu.c | 286 ++++++++++++++++++++++++++++ > include/linux/soc/samsung/exynos-regs-pmu.h | 148 ++++++++++++++ > 6 files changed, 439 insertions(+), 3 deletions(-) > create mode 100644 drivers/soc/samsung/exynos5433-pmu.c > > diff --git a/arch/arm/mach-exynos/common.h b/arch/arm/mach-exynos/common.h > index 098f84a149a3..afbc143a3d5d 100644 > --- a/arch/arm/mach-exynos/common.h > +++ b/arch/arm/mach-exynos/common.h > @@ -125,8 +125,6 @@ enum { > void exynos_set_boot_flag(unsigned int cpu, unsigned int mode); > void exynos_clear_boot_flag(unsigned int cpu, unsigned int mode); > > -extern u32 exynos_get_eint_wake_mask(void); > - This does not look good. Does it compile without warnings on ARMv7 platforms? > #ifdef CONFIG_PM_SLEEP > extern void __init exynos_pm_init(void); > #else > diff --git a/drivers/soc/samsung/Makefile b/drivers/soc/samsung/Makefile > index 29f294baac6e..d2e637339a45 100644 > --- a/drivers/soc/samsung/Makefile > +++ b/drivers/soc/samsung/Makefile > @@ -2,5 +2,6 @@ > obj-$(CONFIG_EXYNOS_PMU) += exynos-pmu.o > > obj-$(CONFIG_EXYNOS_PMU_ARM_DRIVERS) += exynos3250-pmu.o exynos4-pmu.o \ > - exynos5250-pmu.o exynos5420-pmu.o > + exynos5250-pmu.o exynos5420-pmu.o \ > + exynos5433-pmu.o > obj-$(CONFIG_EXYNOS_PM_DOMAINS) += pm_domains.o > diff --git a/drivers/soc/samsung/exynos-pmu.c b/drivers/soc/samsung/exynos-pmu.c > index cfc9de518344..7112d7b2749b 100644 > --- a/drivers/soc/samsung/exynos-pmu.c > +++ b/drivers/soc/samsung/exynos-pmu.c > @@ -97,6 +97,7 @@ void exynos_sys_powerup_conf(enum sys_powerdown mode) > .data = exynos_pmu_data_arm_ptr(exynos5420_pmu_data), > }, { > .compatible = "samsung,exynos5433-pmu", > + .data = exynos_pmu_data_arm_ptr(exynos5433_pmu_data), > }, > { /*sentinel*/ }, > }; > diff --git a/drivers/soc/samsung/exynos-pmu.h b/drivers/soc/samsung/exynos-pmu.h > index efbaf8929252..895c786a2f4c 100644 > --- a/drivers/soc/samsung/exynos-pmu.h > +++ b/drivers/soc/samsung/exynos-pmu.h > @@ -28,6 +28,7 @@ struct exynos_pmu_data { > }; > > extern void __iomem *pmu_base_addr; > +extern u32 exynos_get_eint_wake_mask(void); > > #ifdef CONFIG_EXYNOS_PMU_ARM_DRIVERS > /* list of all exported SoC specific data */ > @@ -36,6 +37,7 @@ struct exynos_pmu_data { > extern const struct exynos_pmu_data exynos4412_pmu_data; > extern const struct exynos_pmu_data exynos5250_pmu_data; > extern const struct exynos_pmu_data exynos5420_pmu_data; > +extern const struct exynos_pmu_data exynos5433_pmu_data; > #endif > > extern void pmu_raw_writel(u32 val, u32 offset); > diff --git a/drivers/soc/samsung/exynos5433-pmu.c b/drivers/soc/samsung/exynos5433-pmu.c > new file mode 100644 > index 000000000000..2571e61522f0 > --- /dev/null > +++ b/drivers/soc/samsung/exynos5433-pmu.c > @@ -0,0 +1,286 @@ > +// SPDX-License-Identifier: GPL-2.0 > +// > +// Copyright (c) 2018 Samsung Electronics Co., Ltd. > +// Copyright (c) Jonghwa Lee <jonghwa3.lee@samsung.com> > +// Copyright (c) Chanwoo Choi <cw00.choi@samsung.com> Did you want to add here authorship notice or personal copyrights? > +// > +// EXYNOS5433 - CPU PMU (Power Management Unit) support > + > +#include <linux/soc/samsung/exynos-regs-pmu.h> > +#include <linux/soc/samsung/exynos-pmu.h> > + > +#include "exynos-pmu.h" > + > +static struct exynos_pmu_conf exynos5433_pmu_config[] = { This should be also const. > + /* { .offset = address, .val = { AFTR, LPA, SLEEP } } */ > + { EXYNOS5433_ATLAS_CPU0_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, > + { EXYNOS5433_DIS_IRQ_ATLAS_CPU0_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, > + { EXYNOS5433_ATLAS_CPU1_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, > + { EXYNOS5433_DIS_IRQ_ATLAS_CPU1_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, > + { EXYNOS5433_ATLAS_CPU2_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, > + { EXYNOS5433_DIS_IRQ_ATLAS_CPU2_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, > + { EXYNOS5433_ATLAS_CPU3_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, > + { EXYNOS5433_DIS_IRQ_ATLAS_CPU3_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, > + { EXYNOS5433_APOLLO_CPU0_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, > + { EXYNOS5433_DIS_IRQ_APOLLO_CPU0_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, > + { EXYNOS5433_APOLLO_CPU1_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, > + { EXYNOS5433_DIS_IRQ_APOLLO_CPU1_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, > + { EXYNOS5433_APOLLO_CPU2_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, > + { EXYNOS5433_DIS_IRQ_APOLLO_CPU2_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, > + { EXYNOS5433_APOLLO_CPU3_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, > + { EXYNOS5433_DIS_IRQ_APOLLO_CPU3_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, > + { EXYNOS5433_ATLAS_NONCPU_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, > + { EXYNOS5433_APOLLO_NONCPU_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, > + { EXYNOS5433_A5IS_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, > + { EXYNOS5433_DIS_IRQ_A5IS_LOCAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, > + { EXYNOS5433_DIS_IRQ_A5IS_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, > + { EXYNOS5433_ATLAS_L2_SYS_PWR_REG, { 0x0, 0x0, 0x7 } }, > + { EXYNOS5433_APOLLO_L2_SYS_PWR_REG, { 0x0, 0x0, 0x7 } }, > + { EXYNOS5433_CLKSTOP_CMU_TOP_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, > + { EXYNOS5433_CLKRUN_CMU_TOP_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, > + { EXYNOS5433_RESET_CMU_TOP_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, > + { EXYNOS5433_RESET_CPUCLKSTOP_SYS_PWR_REG, { 0x1, 0x1, 0x0 } }, > + { EXYNOS5433_CLKSTOP_CMU_MIF_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, > + { EXYNOS5433_CLKRUN_CMU_MIF_SYS_PWR_REG, { 0x1, 0x1, 0x0 } }, > + { EXYNOS5433_RESET_CMU_MIF_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, > + { EXYNOS5433_DDRPHY_DLLLOCK_SYS_PWR_REG, { 0x1, 0x1, 0x1 } }, > + { EXYNOS5433_DISABLE_PLL_CMU_TOP_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, > + { EXYNOS5433_DISABLE_PLL_AUD_PLL_SYS_PWR_REG, { 0x1, 0x1, 0x0 } }, > + { EXYNOS5433_DISABLE_PLL_CMU_MIF_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, > + { EXYNOS5433_TOP_BUS_SYS_PWR_REG, { 0x7, 0x0, 0x0 } }, > + { EXYNOS5433_TOP_RETENTION_SYS_PWR_REG, { 0x1, 0x0, 0x1 } }, > + { EXYNOS5433_TOP_PWR_SYS_PWR_REG, { 0x3, 0x0, 0x3 } }, > + { EXYNOS5433_TOP_BUS_MIF_SYS_PWR_REG, { 0x7, 0x0, 0x0 } }, > + { EXYNOS5433_TOP_RETENTION_MIF_SYS_PWR_REG, { 0x1, 0x0, 0x1 } }, > + { EXYNOS5433_TOP_PWR_MIF_SYS_PWR_REG, { 0x3, 0x0, 0x3 } }, > + { EXYNOS5433_LOGIC_RESET_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, > + { EXYNOS5433_OSCCLK_GATE_SYS_PWR_REG, { 0x1, 0x0, 0x1 } }, > + { EXYNOS5433_SLEEP_RESET_SYS_PWR_REG, { 0x1, 0x1, 0x0 } }, > + { EXYNOS5433_LOGIC_RESET_MIF_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, > + { EXYNOS5433_OSCCLK_GATE_MIF_SYS_PWR_REG, { 0x1, 0x0, 0x1 } }, > + { EXYNOS5433_SLEEP_RESET_MIF_SYS_PWR_REG, { 0x1, 0x1, 0x0 } }, > + { EXYNOS5433_MEMORY_TOP_SYS_PWR_REG, { 0x3, 0x0, 0x0 } }, > + { EXYNOS5433_PAD_RETENTION_LPDDR3_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, > + { EXYNOS5433_PAD_RETENTION_JTAG_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, > + { EXYNOS5433_PAD_RETENTION_TOP_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, > + { EXYNOS5433_PAD_RETENTION_UART_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, > + { EXYNOS5433_PAD_RETENTION_EBIA_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, > + { EXYNOS5433_PAD_RETENTION_EBIB_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, > + { EXYNOS5433_PAD_RETENTION_SPI_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, > + { EXYNOS5433_PAD_RETENTION_MIF_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, > + { EXYNOS5433_PAD_ISOLATION_SYS_PWR_REG, { 0x1, 0x0, 0x1 } }, > + { EXYNOS5433_PAD_RETENTION_USBXTI_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, > + { EXYNOS5433_PAD_RETENTION_BOOTLDO_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, > + { EXYNOS5433_PAD_ISOLATION_MIF_SYS_PWR_REG, { 0x1, 0x0, 0x1 } }, > + { EXYNOS5433_PAD_RETENTION_FSYSGENIO_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, > + { EXYNOS5433_PAD_ALV_SEL_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, > + { EXYNOS5433_XXTI_SYS_PWR_REG, { 0x1, 0x1, 0x0 } }, > + { EXYNOS5433_XXTI26_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, > + { EXYNOS5433_EXT_REGULATOR_SYS_PWR_REG, { 0x1, 0x1, 0x0 } }, > + { EXYNOS5433_GPIO_MODE_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, > + { EXYNOS5433_GPIO_MODE_FSYS0_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, > + { EXYNOS5433_GPIO_MODE_MIF_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, > + { EXYNOS5433_GPIO_MODE_AUD_SYS_PWR_REG, { 0x1, 0x1, 0x0 } }, > + { EXYNOS5433_GSCL_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, > + { EXYNOS5433_CAM0_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, > + { EXYNOS5433_MSCL_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, > + { EXYNOS5433_G3D_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, > + { EXYNOS5433_DISP_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, > + { EXYNOS5433_CAM1_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, > + { EXYNOS5433_AUD_SYS_PWR_REG, { 0xF, 0xF, 0x0 } }, > + { EXYNOS5433_FSYS_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, > + { EXYNOS5433_BUS2_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, > + { EXYNOS5433_G2D_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, > + { EXYNOS5433_ISP0_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, > + { EXYNOS5433_MFC_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, > + { EXYNOS5433_HEVC_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, > + { EXYNOS5433_RESET_SLEEP_FSYS_SYS_PWR_REG, { 0x1, 0x1, 0x0 } }, > + { EXYNOS5433_RESET_SLEEP_BUS2_SYS_PWR_REG, { 0x1, 0x1, 0x0 } }, > + { PMU_TABLE_END, }, > +}; > + > +static unsigned int const exynos5433_list_feed[] = { > + EXYNOS5433_ATLAS_NONCPU_OPTION, > + EXYNOS5433_APOLLO_NONCPU_OPTION, > + EXYNOS5433_TOP_PWR_OPTION, > + EXYNOS5433_TOP_PWR_MIF_OPTION, > + EXYNOS5433_AUD_OPTION, > + EXYNOS5433_CAM0_OPTION, > + EXYNOS5433_DISP_OPTION, > + EXYNOS5433_G2D_OPTION, > + EXYNOS5433_G3D_OPTION, > + EXYNOS5433_HEVC_OPTION, > + EXYNOS5433_MSCL_OPTION, > + EXYNOS5433_MFC_OPTION, > + EXYNOS5433_GSCL_OPTION, > + EXYNOS5433_FSYS_OPTION, > + EXYNOS5433_ISP_OPTION, > + EXYNOS5433_BUS2_OPTION, > +}; > + > +static unsigned int const exynos5433_list_pad_retention[] = { > + EXYNOS5433_PAD_RETENTION_LPDDR3_OPTION, > + EXYNOS5433_PAD_RETENTION_AUD_OPTION, > + EXYNOS5433_PAD_RETENTION_MMC2_OPTION, > + EXYNOS5433_PAD_RETENTION_TOP_OPTION, > + EXYNOS5433_PAD_RETENTION_UART_OPTION, > + EXYNOS5433_PAD_RETENTION_MMC0_OPTION, > + EXYNOS5433_PAD_RETENTION_MMC1_OPTION, > + EXYNOS5433_PAD_RETENTION_EBIA_OPTION, > + EXYNOS5433_PAD_RETENTION_EBIB_OPTION, > + EXYNOS5433_PAD_RETENTION_SPI_OPTION, > + EXYNOS5433_PAD_RETENTION_MIF_OPTION, > + EXYNOS5433_PAD_RETENTION_USBXTI_OPTION, > + EXYNOS5433_PAD_RETENTION_BOOTLDO_OPTION, > + EXYNOS5433_PAD_RETENTION_UFS_OPTION, > + EXYNOS5433_PAD_RETENTION_FSYSGENIO_OPTION, Looks like conflicting with existing drivers/pinctrl/samsung/pinctrl-exynos-arm64.c... and probably this should be part of pinctrl driver's suspend/resume paths. > +}; > + > +static void exynos5433_set_wakeupmask(enum sys_powerdown mode) > +{ > + u32 intmask = 0; > + > + pmu_raw_writel(exynos_get_eint_wake_mask(), > + EXYNOS5433_EINT_WAKEUP_MASK); > + > + /* Disable WAKEUP event monitor */ > + intmask = pmu_raw_readl(EXYNOS5433_WAKEUP_MASK); > + intmask &= ~(1 << 31); This should have a define. Maybe it is an already defined field like S5P_CORE_AUTOWAKEUP_EN or S5P_PS_HOLD_EN? > + pmu_raw_writel(intmask, EXYNOS5433_WAKEUP_MASK); > + > + pmu_raw_writel(0xFFFF0000, EXYNOS5433_WAKEUP_MASK2); > + pmu_raw_writel(0xFFFF0000, EXYNOS5433_WAKEUP_MASK3); Both need explaining what you are masking, preferably by appropriate comment and maybe also define for raw constants. > +} > + > +static void exynos5433_pmu_central_seq(bool enable) > +{ > + unsigned int tmp; > + > + tmp = pmu_raw_readl(EXYNOS5433_CENTRAL_SEQ_CONFIGURATION); > + if (enable) > + tmp &= ~EXYNOS5433_CENTRALSEQ_PWR_CFG; > + else > + tmp |= EXYNOS5433_CENTRALSEQ_PWR_CFG; > + pmu_raw_writel(tmp, EXYNOS5433_CENTRAL_SEQ_CONFIGURATION); > + > + tmp = pmu_raw_readl(EXYNOS5433_CENTRAL_SEQ_MIF_CONFIGURATION); > + if (enable) > + tmp &= ~EXYNOS5433_CENTRALSEQ_PWR_CFG; > + else > + tmp |= EXYNOS5433_CENTRALSEQ_PWR_CFG; > + pmu_raw_writel(tmp, EXYNOS5433_CENTRAL_SEQ_MIF_CONFIGURATION); > +} > + > +static void exynos5433_pmu_pad_retention_release(void) > +{ > + unsigned int tmp; > + int i; unsigned int i > + > + for (i = 0 ; i < ARRAY_SIZE(exynos5433_list_pad_retention) ; i++) { > + tmp = pmu_raw_readl(exynos5433_list_pad_retention[i]); > + tmp |= EXYNOS5433_INITIATE_WAKEUP_FROM_LOWPOWER; > + pmu_raw_writel(tmp, exynos5433_list_pad_retention[i]); > + } > +} > + > +static void exynos5433_pmu_init(void) > +{ > + unsigned int tmp; > + int i, cluster, cpu; unsigned int i > + > + /* Enable non retention flip-flop reset for wakeup */ > + tmp = pmu_raw_readl(EXYNOS5433_PMU_SPARE0); > + tmp |= EXYNOS5433_EN_NONRET_RESET; > + pmu_raw_writel(tmp, EXYNOS5433_PMU_SPARE0); This is spare register. Who is using it? Firmware? Please add its usage also in Documentation/arm/Samsung/Bootloader-interface.txt. > + > + /* Enable only SC_FEEDBACK for the register list */ > + for (i = 0 ; i < ARRAY_SIZE(exynos5433_list_feed) ; i++) { > + tmp = pmu_raw_readl(exynos5433_list_feed[i]); > + tmp &= ~EXYNOS5_USE_SC_COUNTER; > + tmp |= EXYNOS5_USE_SC_FEEDBACK; > + pmu_raw_writel(tmp, exynos5433_list_feed[i]); > + } > + > + /* > + * Disable automatic L2 flush, Disable L2 retention and > + * Enable STANDBYWFIL2, ACE/ACP > + */ > + for (cluster = 0; cluster < 2; cluster++) { > + tmp = pmu_raw_readl(EXYNOS5433_ATLAS_L2_OPTION + (cluster * 0x20)); I would prefer to follow the convention for similar registers for cores, like: EXYNOS_ARM_CORE_CONFIGURATION EXYNOS_ARM_CORE_STATUS This moves the offset into the header, along to other register offsets. > + tmp &= ~(EXYNOS5433_USE_AUTO_L2FLUSHREQ | EXYNOS5433_USE_RETENTION); > + > + if (cluster == 0) { > + tmp |= (EXYNOS5433_USE_STANDBYWFIL2 | > + EXYNOS5433_USE_DEACTIVATE_ACE | > + EXYNOS5433_USE_DEACTIVATE_ACP); > + } > + pmu_raw_writel(tmp, EXYNOS5433_ATLAS_L2_OPTION + (cluster * 0x20)); > + } > + > + /* > + * Enable both SC_COUNTER and SC_FEEDBACK for the CPUs > + * Use STANDBYWFI and SMPEN to indicate that core is ready to enter > + * low power mode > + */ > + for (cpu = 0; cpu < 8; cpu++) { > + tmp = pmu_raw_readl(EXYNOS5433_CPU_OPTION(cpu)); > + tmp |= (EXYNOS5_USE_SC_FEEDBACK | EXYNOS5_USE_SC_COUNTER); > + tmp |= EXYNOS5433_USE_SMPEN; > + tmp |= EXYNOS5433_USE_STANDBYWFI; > + tmp &= ~EXYNOS5433_USE_STANDBYWFE; > + pmu_raw_writel(tmp, EXYNOS5433_CPU_OPTION(cpu)); > + > + tmp = pmu_raw_readl(EXYNOS5433_CPU_DURATION(cpu)); > + tmp |= EXYNOS5433_DUR_WAIT_RESET; > + tmp &= ~EXYNOS5433_DUR_SCALL; > + tmp |= EXYNOS5433_DUR_SCALL_VALUE; > + pmu_raw_writel(tmp, EXYNOS5433_CPU_DURATION(cpu)); > + } > + > + /* Skip atlas block power-off during automatic power down sequence */ > + tmp = pmu_raw_readl(EXYNOS5433_ATLAS_CPUSEQUENCER_OPTION); > + tmp |= EXYNOS5433_SKIP_BLK_PWR_DOWN; > + pmu_raw_writel(tmp, EXYNOS5433_ATLAS_CPUSEQUENCER_OPTION); > + > + /* Limit in-rush current during local power up of cores */ > + tmp = pmu_raw_readl(EXYNOS5433_UP_SCHEDULER); > + tmp |= EXYNOS5433_ENABLE_ATLAS_CPU; > + pmu_raw_writel(tmp, EXYNOS5433_UP_SCHEDULER); > +} > + > +static void exynos5433_powerdown_conf(enum sys_powerdown mode) > +{ > + switch (mode) { > + case SYS_SLEEP: > + exynos5433_set_wakeupmask(mode); > + exynos5433_pmu_central_seq(true); > + break; > + default: > + break; > + }; > +} > + > +static void exynos5433_powerup_conf(enum sys_powerdown mode) > +{ > + unsigned int wakeup; > + > + switch (mode) { > + case SYS_SLEEP: > + wakeup = pmu_raw_readl(EXYNOS5433_CENTRAL_SEQ_CONFIGURATION); > + wakeup &= EXYNOS5433_CENTRALSEQ_PWR_CFG; > + if (wakeup) > + exynos5433_pmu_pad_retention_release(); > + else > + exynos5433_pmu_central_seq(false); I do not understand what you want to achieve here. Re-suspend? > + break; > + default: > + break; > + }; > +} > + > +const struct exynos_pmu_data exynos5433_pmu_data = { > + .pmu_config = exynos5433_pmu_config, > + .pmu_init = exynos5433_pmu_init, > + .powerdown_conf = exynos5433_powerdown_conf, > + .powerup_conf = exynos5433_powerup_conf, > +}; > diff --git a/include/linux/soc/samsung/exynos-regs-pmu.h b/include/linux/soc/samsung/exynos-regs-pmu.h > index bebdde5dccd6..93a52d133ba1 100644 > --- a/include/linux/soc/samsung/exynos-regs-pmu.h > +++ b/include/linux/soc/samsung/exynos-regs-pmu.h > @@ -645,7 +645,110 @@ > | EXYNOS5420_KFC_USE_STANDBY_WFI3) > > /* For EXYNOS5433 */ > +#define EXYNOS5433_UP_SCHEDULER (0x0120) > +#define EXYNOS5433_CENTRAL_SEQ_CONFIGURATION (0x0200) > +#define EXYNOS5433_CENTRAL_SEQ_MIF_CONFIGURATION (0x0240) > +#define EXYNOS5433_EINT_WAKEUP_MASK (0x060C) > +#define EXYNOS5433_WAKEUP_MASK (0x0610) > +#define EXYNOS5433_WAKEUP_MASK2 (0x0614) > +#define EXYNOS5433_WAKEUP_MASK3 (0x0618) > +#define EXYNOS5433_EINT_WAKEUP_MASK1 (0x062C) > #define EXYNOS5433_USBHOST30_PHY_CONTROL (0x0728) > +#define EXYNOS5433_PMU_SPARE0 (0x0900) > +#define EXYNOS5433_ATLAS_CPU0_SYS_PWR_REG (0x1000) > +#define EXYNOS5433_DIS_IRQ_ATLAS_CPU0_CENTRAL_SYS_PWR_REG (0x1008) > +#define EXYNOS5433_ATLAS_CPU1_SYS_PWR_REG (0x1010) > +#define EXYNOS5433_DIS_IRQ_ATLAS_CPU1_CENTRAL_SYS_PWR_REG (0x1018) > +#define EXYNOS5433_ATLAS_CPU2_SYS_PWR_REG (0x1020) > +#define EXYNOS5433_DIS_IRQ_ATLAS_CPU2_CENTRAL_SYS_PWR_REG (0x1028) > +#define EXYNOS5433_ATLAS_CPU3_SYS_PWR_REG (0x1030) > +#define EXYNOS5433_DIS_IRQ_ATLAS_CPU3_CENTRAL_SYS_PWR_REG (0x1038) > +#define EXYNOS5433_APOLLO_CPU0_SYS_PWR_REG (0x1040) > +#define EXYNOS5433_DIS_IRQ_APOLLO_CPU0_CENTRAL_SYS_PWR_REG (0x1048) > +#define EXYNOS5433_APOLLO_CPU1_SYS_PWR_REG (0x1050) > +#define EXYNOS5433_DIS_IRQ_APOLLO_CPU1_CENTRAL_SYS_PWR_REG (0x1058) > +#define EXYNOS5433_APOLLO_CPU2_SYS_PWR_REG (0x1060) > +#define EXYNOS5433_DIS_IRQ_APOLLO_CPU2_CENTRAL_SYS_PWR_REG (0x1068) > +#define EXYNOS5433_APOLLO_CPU3_SYS_PWR_REG (0x1070) > +#define EXYNOS5433_DIS_IRQ_APOLLO_CPU3_CENTRAL_SYS_PWR_REG (0x1078) > +#define EXYNOS5433_ATLAS_NONCPU_SYS_PWR_REG (0x1080) > +#define EXYNOS5433_ATLAS_L2_SYS_PWR_REG (0x10C0) > +#define EXYNOS5433_APOLLO_L2_SYS_PWR_REG (0x10C4) > +#define EXYNOS5433_APOLLO_NONCPU_SYS_PWR_REG (0x1084) > +#define EXYNOS5433_A5IS_SYS_PWR_REG (0x10B0) > +#define EXYNOS5433_DIS_IRQ_A5IS_LOCAL_SYS_PWR_REG (0x10B4) > +#define EXYNOS5433_DIS_IRQ_A5IS_CENTRAL_SYS_PWR_REG (0x10B8) > +#define EXYNOS5433_CLKSTOP_CMU_TOP_SYS_PWR_REG (0x1100) > +#define EXYNOS5433_CLKRUN_CMU_TOP_SYS_PWR_REG (0x1104) > +#define EXYNOS5433_RESET_CMU_TOP_SYS_PWR_REG (0x110C) > +#define EXYNOS5433_RESET_CPUCLKSTOP_SYS_PWR_REG (0x111C) > +#define EXYNOS5433_CLKSTOP_CMU_MIF_SYS_PWR_REG (0x1120) > +#define EXYNOS5433_CLKRUN_CMU_MIF_SYS_PWR_REG (0x1124) > +#define EXYNOS5433_RESET_CMU_MIF_SYS_PWR_REG (0x112C) > +#define EXYNOS5433_DDRPHY_DLLLOCK_SYS_PWR_REG (0x1138) > +#define EXYNOS5433_DISABLE_PLL_CMU_TOP_SYS_PWR_REG (0x1140) > +#define EXYNOS5433_DISABLE_PLL_AUD_PLL_SYS_PWR_REG (0x1144) > +#define EXYNOS5433_DISABLE_PLL_CMU_MIF_SYS_PWR_REG (0x1160) > +#define EXYNOS5433_TOP_BUS_SYS_PWR_REG (0x1180) > +#define EXYNOS5433_TOP_RETENTION_SYS_PWR_REG (0x1184) > +#define EXYNOS5433_TOP_PWR_SYS_PWR_REG (0x1188) > +#define EXYNOS5433_TOP_BUS_MIF_SYS_PWR_REG (0x1190) > +#define EXYNOS5433_TOP_RETENTION_MIF_SYS_PWR_REG (0x1194) > +#define EXYNOS5433_TOP_PWR_MIF_SYS_PWR_REG (0x1198) > +#define EXYNOS5433_LOGIC_RESET_SYS_PWR_REG (0x11A0) > +#define EXYNOS5433_OSCCLK_GATE_SYS_PWR_REG (0x11A4) > +#define EXYNOS5433_SLEEP_RESET_SYS_PWR_REG (0x11A8) > +#define EXYNOS5433_LOGIC_RESET_MIF_SYS_PWR_REG (0x11B0) > +#define EXYNOS5433_OSCCLK_GATE_MIF_SYS_PWR_REG (0x11B4) > +#define EXYNOS5433_SLEEP_RESET_MIF_SYS_PWR_REG (0x11B8) > +#define EXYNOS5433_MEMORY_TOP_SYS_PWR_REG (0x11C0) > +#define EXYNOS5433_PAD_RETENTION_LPDDR3_SYS_PWR_REG (0x1200) > +#define EXYNOS5433_PAD_RETENTION_JTAG_SYS_PWR_REG (0x1208) > +#define EXYNOS5433_PAD_RETENTION_TOP_SYS_PWR_REG (0x1220) > +#define EXYNOS5433_PAD_RETENTION_UART_SYS_PWR_REG (0x1224) > +#define EXYNOS5433_PAD_RETENTION_EBIA_SYS_PWR_REG (0x1230) > +#define EXYNOS5433_PAD_RETENTION_EBIB_SYS_PWR_REG (0x1234) > +#define EXYNOS5433_PAD_RETENTION_SPI_SYS_PWR_REG (0x1238) > +#define EXYNOS5433_PAD_RETENTION_MIF_SYS_PWR_REG (0x123C) > +#define EXYNOS5433_PAD_ISOLATION_SYS_PWR_REG (0x1240) > +#define EXYNOS5433_PAD_RETENTION_USBXTI_SYS_PWR_REG (0x1244) > +#define EXYNOS5433_PAD_RETENTION_BOOTLDO_SYS_PWR_REG (0x1248) > +#define EXYNOS5433_PAD_ISOLATION_MIF_SYS_PWR_REG (0x1250) > +#define EXYNOS5433_PAD_RETENTION_FSYSGENIO_SYS_PWR_REG (0x1254) > +#define EXYNOS5433_PAD_ALV_SEL_SYS_PWR_REG (0x1260) > +#define EXYNOS5433_XXTI_SYS_PWR_REG (0x1284) > +#define EXYNOS5433_XXTI26_SYS_PWR_REG (0x1288) > +#define EXYNOS5433_EXT_REGULATOR_SYS_PWR_REG (0x12C0) > +#define EXYNOS5433_GPIO_MODE_SYS_PWR_REG (0x1300) > +#define EXYNOS5433_GPIO_MODE_FSYS0_SYS_PWR_REG (0x1304) > +#define EXYNOS5433_GPIO_MODE_MIF_SYS_PWR_REG (0x1320) > +#define EXYNOS5433_GPIO_MODE_AUD_SYS_PWR_REG (0x1340) > +#define EXYNOS5433_GSCL_SYS_PWR_REG (0x1400) > +#define EXYNOS5433_CAM0_SYS_PWR_REG (0x1404) > +#define EXYNOS5433_MSCL_SYS_PWR_REG (0x1408) > +#define EXYNOS5433_G3D_SYS_PWR_REG (0x140C) > +#define EXYNOS5433_DISP_SYS_PWR_REG (0x1410) > +#define EXYNOS5433_CAM1_SYS_PWR_REG (0x1414) > +#define EXYNOS5433_AUD_SYS_PWR_REG (0x1418) > +#define EXYNOS5433_FSYS_SYS_PWR_REG (0x141C) > +#define EXYNOS5433_BUS2_SYS_PWR_REG (0x1420) > +#define EXYNOS5433_G2D_SYS_PWR_REG (0x1424) > +#define EXYNOS5433_ISP0_SYS_PWR_REG (0x1428) > +#define EXYNOS5433_MFC_SYS_PWR_REG (0x1430) > +#define EXYNOS5433_HEVC_SYS_PWR_REG (0x1438) > +#define EXYNOS5433_RESET_SLEEP_FSYS_SYS_PWR_REG (0x15DC) > +#define EXYNOS5433_RESET_SLEEP_BUS2_SYS_PWR_REG (0x15E0) > +#define EXYNOS5433_ATLAS_CPU0_OPTION (0x2008) > +#define EXYNOS5433_CPU_OPTION(_nr) (EXYNOS5433_ATLAS_CPU0_OPTION + (_nr) * 0x80) > +#define EXYNOS5433_ATLAS_CPU0_DURATION0 (0x2010) > +#define EXYNOS5433_CPU_DURATION(_nr) (EXYNOS5433_ATLAS_CPU0_DURATION0 + (_nr) * 0x80) > +#define EXYNOS5433_ATLAS_NONCPU_OPTION (0x2408) > +#define EXYNOS5433_APOLLO_NONCPU_OPTION (0x2428) > +#define EXYNOS5433_ATLAS_CPUSEQUENCER_OPTION (0x2488) > +#define EXYNOS5433_ATLAS_L2_OPTION (0x2608) > +#define EXYNOS5433_TOP_PWR_MIF_OPTION (0x2CC8) > +#define EXYNOS5433_TOP_PWR_OPTION (0x2C48) > +#define EXYNOS5433_PAD_RETENTION_LPDDR3_OPTION (0x3008) > #define EXYNOS5433_PAD_RETENTION_AUD_OPTION (0x3028) > #define EXYNOS5433_PAD_RETENTION_MMC2_OPTION (0x30C8) > #define EXYNOS5433_PAD_RETENTION_TOP_OPTION (0x3108) > @@ -660,5 +763,50 @@ > #define EXYNOS5433_PAD_RETENTION_BOOTLDO_OPTION (0x3248) > #define EXYNOS5433_PAD_RETENTION_UFS_OPTION (0x3268) > #define EXYNOS5433_PAD_RETENTION_FSYSGENIO_OPTION (0x32A8) > +#define EXYNOS5433_PS_HOLD_CONTROL (0x330C) > +#define EXYNOS5433_GSCL_OPTION (0x4008) > +#define EXYNOS5433_CAM0_OPTION (0x4028) > +#define EXYNOS5433_MSCL_OPTION (0x4048) > +#define EXYNOS5433_G3D_OPTION (0x4068) > +#define EXYNOS5433_DISP_OPTION (0x4088) > +#define EXYNOS5433_AUD_OPTION (0x40C8) > +#define EXYNOS5433_FSYS_OPTION (0x40E8) > +#define EXYNOS5433_BUS2_OPTION (0x4108) > +#define EXYNOS5433_G2D_OPTION (0x4128) > +#define EXYNOS5433_ISP_OPTION (0x4148) > +#define EXYNOS5433_MFC_OPTION (0x4188) > +#define EXYNOS5433_HEVC_OPTION (0x41C8) > + > +/* EXYNOS5433_PMU_SPARE0 */ > +#define EXYNOS5433_EN_NONRET_RESET (1 << 0) Use BIT(0) here and in other places. Best regards, Krzysztof > + > +/* EXYNOS5433_CENTRAL_SEQ_CONFIGURATION */ > +#define EXYNOS5433_CENTRALSEQ_PWR_CFG (0x1 << 16) > + > +/* EXYNOS5433_ATLAS_L2_OPTION */ > +#define EXYNOS5433_USE_DEACTIVATE_ACE (0x1 << 19) > +#define EXYNOS5433_USE_DEACTIVATE_ACP (0x1 << 18) > +#define EXYNOS5433_USE_AUTO_L2FLUSHREQ (0x1 << 17) > +#define EXYNOS5433_USE_STANDBYWFIL2 (0x1 << 16) > +#define EXYNOS5433_USE_RETENTION (0x1 << 4) > + > +/* EXYNOS5433_CPU_OPTION */ > +#define EXYNOS5433_USE_SMPEN (0x1 << 28) > +#define EXYNOS5433_USE_STANDBYWFE (0x1 << 24) > +#define EXYNOS5433_USE_STANDBYWFI (0x1 << 16) > + > +/* EXYNOS5433_PAD_RETENTION_*_OPTION */ > +#define EXYNOS5433_INITIATE_WAKEUP_FROM_LOWPOWER (0x1 << 28) > + > +/* EXYNOS5433_CPU_DURATION */ > +#define EXYNOS5433_DUR_WAIT_RESET (0xF << 20) > +#define EXYNOS5433_DUR_SCALL (0xF << 4) > +#define EXYNOS5433_DUR_SCALL_VALUE (0x1 << 4) > + > +/* EXYNOS5433_ATLAS_CPUSEQUENCER_OPTION */ > +#define EXYNOS5433_SKIP_BLK_PWR_DOWN (0x1 << 8) > + > +/* EXYNOS5433_UP_SCHEDULER */ > +#define EXYNOS5433_ENABLE_ATLAS_CPU (0x1 << 0) > > #endif /* __LINUX_SOC_EXYNOS_REGS_PMU_H */ > -- > 1.9.1 > -- To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Tue, Jan 9, 2018 at 8:59 AM, Chanwoo Choi <cw00.choi@samsung.com> wrote: > This patch adds the PMU (Power Management Unit) data of exynos5433 SoC > in order to support the various power modes. Each power mode has > the different value for reducing the power-consumption. > > Signed-off-by: Jonghwa Lee <jonghwa3.lee@samsung.com> > Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com> > --- > arch/arm/mach-exynos/common.h | 2 - > drivers/soc/samsung/Makefile | 3 +- > drivers/soc/samsung/exynos-pmu.c | 1 + > drivers/soc/samsung/exynos-pmu.h | 2 + > drivers/soc/samsung/exynos5433-pmu.c | 286 ++++++++++++++++++++++++++++ > include/linux/soc/samsung/exynos-regs-pmu.h | 148 ++++++++++++++ > 6 files changed, 439 insertions(+), 3 deletions(-) > create mode 100644 drivers/soc/samsung/exynos5433-pmu.c > > diff --git a/arch/arm/mach-exynos/common.h b/arch/arm/mach-exynos/common.h > index 098f84a149a3..afbc143a3d5d 100644 > --- a/arch/arm/mach-exynos/common.h > +++ b/arch/arm/mach-exynos/common.h > @@ -125,8 +125,6 @@ enum { > void exynos_set_boot_flag(unsigned int cpu, unsigned int mode); > void exynos_clear_boot_flag(unsigned int cpu, unsigned int mode); > > -extern u32 exynos_get_eint_wake_mask(void); > - > #ifdef CONFIG_PM_SLEEP > extern void __init exynos_pm_init(void); > #else > diff --git a/drivers/soc/samsung/Makefile b/drivers/soc/samsung/Makefile > index 29f294baac6e..d2e637339a45 100644 > --- a/drivers/soc/samsung/Makefile > +++ b/drivers/soc/samsung/Makefile > @@ -2,5 +2,6 @@ > obj-$(CONFIG_EXYNOS_PMU) += exynos-pmu.o > > obj-$(CONFIG_EXYNOS_PMU_ARM_DRIVERS) += exynos3250-pmu.o exynos4-pmu.o \ > - exynos5250-pmu.o exynos5420-pmu.o > + exynos5250-pmu.o exynos5420-pmu.o \ > + exynos5433-pmu.o ... ah, I forgot. No. Exynos5433 is not ARMv7. Best regards, Krzysztof -- To unsubscribe from this list: send the line "unsubscribe linux-samsung-soc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 09/01/18 07:59, Chanwoo Choi wrote: > This patch adds the PMU (Power Management Unit) data of exynos5433 SoC > in order to support the various power modes. Each power mode has > the different value for reducing the power-consumption. > > Signed-off-by: Jonghwa Lee <jonghwa3.lee@samsung.com> > Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com> > --- > arch/arm/mach-exynos/common.h | 2 - > drivers/soc/samsung/Makefile | 3 +- > drivers/soc/samsung/exynos-pmu.c | 1 + > drivers/soc/samsung/exynos-pmu.h | 2 + > drivers/soc/samsung/exynos5433-pmu.c | 286 ++++++++++++++++++++++++++++ > include/linux/soc/samsung/exynos-regs-pmu.h | 148 ++++++++++++++ > 6 files changed, 439 insertions(+), 3 deletions(-) > create mode 100644 drivers/soc/samsung/exynos5433-pmu.c > > diff --git a/drivers/soc/samsung/exynos5433-pmu.c b/drivers/soc/samsung/exynos5433-pmu.c > new file mode 100644 > index 000000000000..2571e61522f0 > --- /dev/null > +++ b/drivers/soc/samsung/exynos5433-pmu.c > @@ -0,0 +1,286 @@ > +// SPDX-License-Identifier: GPL-2.0 > +// > +// Copyright (c) 2018 Samsung Electronics Co., Ltd. > +// Copyright (c) Jonghwa Lee <jonghwa3.lee@samsung.com> > +// Copyright (c) Chanwoo Choi <cw00.choi@samsung.com> > +// > +// EXYNOS5433 - CPU PMU (Power Management Unit) support > + > +#include <linux/soc/samsung/exynos-regs-pmu.h> > +#include <linux/soc/samsung/exynos-pmu.h> > + > +#include "exynos-pmu.h" > + > +static struct exynos_pmu_conf exynos5433_pmu_config[] = { > + /* { .offset = address, .val = { AFTR, LPA, SLEEP } } */ > + { EXYNOS5433_ATLAS_CPU0_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, > + { EXYNOS5433_DIS_IRQ_ATLAS_CPU0_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, > + { EXYNOS5433_ATLAS_CPU1_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, > + { EXYNOS5433_DIS_IRQ_ATLAS_CPU1_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, > + { EXYNOS5433_ATLAS_CPU2_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, > + { EXYNOS5433_DIS_IRQ_ATLAS_CPU2_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, > + { EXYNOS5433_ATLAS_CPU3_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, > + { EXYNOS5433_DIS_IRQ_ATLAS_CPU3_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, > + { EXYNOS5433_APOLLO_CPU0_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, > + { EXYNOS5433_DIS_IRQ_APOLLO_CPU0_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, > + { EXYNOS5433_APOLLO_CPU1_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, > + { EXYNOS5433_DIS_IRQ_APOLLO_CPU1_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, > + { EXYNOS5433_APOLLO_CPU2_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, > + { EXYNOS5433_DIS_IRQ_APOLLO_CPU2_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, > + { EXYNOS5433_APOLLO_CPU3_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, > + { EXYNOS5433_DIS_IRQ_APOLLO_CPU3_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, > + { EXYNOS5433_ATLAS_NONCPU_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, > + { EXYNOS5433_APOLLO_NONCPU_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, 1. First of all why do you need any of these CPU related PMU config registers in kernel ? From the information I gathered this is ARM64 SoC using PSCI. These are needed just in PSCI implementation and not in kernel. So can you elaborate on why there are present here ? 2. Are there any public documents that these names map to ? If there is none, please replace these codenames(ATLAS, APOLLO) with appropriately. Sorry if these are already answered, just point me to those threads.
On 2018년 01월 09일 23:11, Sudeep Holla wrote: > > > On 09/01/18 07:59, Chanwoo Choi wrote: >> This patch adds the PMU (Power Management Unit) data of exynos5433 SoC >> in order to support the various power modes. Each power mode has >> the different value for reducing the power-consumption. >> >> Signed-off-by: Jonghwa Lee <jonghwa3.lee@samsung.com> >> Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com> >> --- >> arch/arm/mach-exynos/common.h | 2 - >> drivers/soc/samsung/Makefile | 3 +- >> drivers/soc/samsung/exynos-pmu.c | 1 + >> drivers/soc/samsung/exynos-pmu.h | 2 + >> drivers/soc/samsung/exynos5433-pmu.c | 286 ++++++++++++++++++++++++++++ >> include/linux/soc/samsung/exynos-regs-pmu.h | 148 ++++++++++++++ >> 6 files changed, 439 insertions(+), 3 deletions(-) >> create mode 100644 drivers/soc/samsung/exynos5433-pmu.c >> > >> diff --git a/drivers/soc/samsung/exynos5433-pmu.c b/drivers/soc/samsung/exynos5433-pmu.c >> new file mode 100644 >> index 000000000000..2571e61522f0 >> --- /dev/null >> +++ b/drivers/soc/samsung/exynos5433-pmu.c >> @@ -0,0 +1,286 @@ >> +// SPDX-License-Identifier: GPL-2.0 >> +// >> +// Copyright (c) 2018 Samsung Electronics Co., Ltd. >> +// Copyright (c) Jonghwa Lee <jonghwa3.lee@samsung.com> >> +// Copyright (c) Chanwoo Choi <cw00.choi@samsung.com> >> +// >> +// EXYNOS5433 - CPU PMU (Power Management Unit) support >> + >> +#include <linux/soc/samsung/exynos-regs-pmu.h> >> +#include <linux/soc/samsung/exynos-pmu.h> >> + >> +#include "exynos-pmu.h" >> + >> +static struct exynos_pmu_conf exynos5433_pmu_config[] = { >> + /* { .offset = address, .val = { AFTR, LPA, SLEEP } } */ >> + { EXYNOS5433_ATLAS_CPU0_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >> + { EXYNOS5433_DIS_IRQ_ATLAS_CPU0_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >> + { EXYNOS5433_ATLAS_CPU1_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >> + { EXYNOS5433_DIS_IRQ_ATLAS_CPU1_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >> + { EXYNOS5433_ATLAS_CPU2_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >> + { EXYNOS5433_DIS_IRQ_ATLAS_CPU2_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >> + { EXYNOS5433_ATLAS_CPU3_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >> + { EXYNOS5433_DIS_IRQ_ATLAS_CPU3_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >> + { EXYNOS5433_APOLLO_CPU0_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >> + { EXYNOS5433_DIS_IRQ_APOLLO_CPU0_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >> + { EXYNOS5433_APOLLO_CPU1_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >> + { EXYNOS5433_DIS_IRQ_APOLLO_CPU1_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >> + { EXYNOS5433_APOLLO_CPU2_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >> + { EXYNOS5433_DIS_IRQ_APOLLO_CPU2_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >> + { EXYNOS5433_APOLLO_CPU3_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >> + { EXYNOS5433_DIS_IRQ_APOLLO_CPU3_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >> + { EXYNOS5433_ATLAS_NONCPU_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >> + { EXYNOS5433_APOLLO_NONCPU_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, > > > 1. First of all why do you need any of these CPU related PMU config > registers in kernel ? From the information I gathered this is ARM64 > SoC using PSCI. These are needed just in PSCI implementation and not > in kernel. So can you elaborate on why there are present here ? The 32bit Exynos used the 'smc' call to enter the suspend mode and need to handle the PMU registers. Even if PSCI replaces the 'smc' call on the Exynos5433, the Exynos5433's document requires the handling of PMU config related to CPU for the suspend mode. IMHO, If the secure OS implemented the all something related to CPU, it might be unnecessary to handle the PMU registers. I think that it depend on how to design the SoC by H/W Architect. This is just my opinion. > > 2. Are there any public documents that these names map to ? There is no public document. It is confidential. > If there is none, please replace these codenames(ATLAS, APOLLO) with > appropriately. In the Exynos5433, 'apollo' indicates the LITTLE cores (cpu0-3, cortex-a53) and 'atlas' indicates the big cores (cpu4-7, cortex-a57) Exynos5433 already used the 'apollo' and 'atlas' on clk-exynos5433.c driver and thermal device-tree node. It is better to use the original register name in the document in order to reduce the confusion of the change of register name even if document is not public. Also, exynos7 used the 'atlas' word for big cores. > > Sorry if these are already answered, just point me to those threads. >
On 10/01/18 01:46, Chanwoo Choi wrote: > On 2018년 01월 09일 23:11, Sudeep Holla wrote: >> >> >> On 09/01/18 07:59, Chanwoo Choi wrote: >>> This patch adds the PMU (Power Management Unit) data of exynos5433 SoC >>> in order to support the various power modes. Each power mode has >>> the different value for reducing the power-consumption. >>> >>> Signed-off-by: Jonghwa Lee <jonghwa3.lee@samsung.com> >>> Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com> >>> --- >>> arch/arm/mach-exynos/common.h | 2 - >>> drivers/soc/samsung/Makefile | 3 +- >>> drivers/soc/samsung/exynos-pmu.c | 1 + >>> drivers/soc/samsung/exynos-pmu.h | 2 + >>> drivers/soc/samsung/exynos5433-pmu.c | 286 ++++++++++++++++++++++++++++ >>> include/linux/soc/samsung/exynos-regs-pmu.h | 148 ++++++++++++++ >>> 6 files changed, 439 insertions(+), 3 deletions(-) >>> create mode 100644 drivers/soc/samsung/exynos5433-pmu.c >>> >> >>> diff --git a/drivers/soc/samsung/exynos5433-pmu.c b/drivers/soc/samsung/exynos5433-pmu.c >>> new file mode 100644 >>> index 000000000000..2571e61522f0 >>> --- /dev/null >>> +++ b/drivers/soc/samsung/exynos5433-pmu.c >>> @@ -0,0 +1,286 @@ >>> +// SPDX-License-Identifier: GPL-2.0 >>> +// >>> +// Copyright (c) 2018 Samsung Electronics Co., Ltd. >>> +// Copyright (c) Jonghwa Lee <jonghwa3.lee@samsung.com> >>> +// Copyright (c) Chanwoo Choi <cw00.choi@samsung.com> >>> +// >>> +// EXYNOS5433 - CPU PMU (Power Management Unit) support >>> + >>> +#include <linux/soc/samsung/exynos-regs-pmu.h> >>> +#include <linux/soc/samsung/exynos-pmu.h> >>> + >>> +#include "exynos-pmu.h" >>> + >>> +static struct exynos_pmu_conf exynos5433_pmu_config[] = { >>> + /* { .offset = address, .val = { AFTR, LPA, SLEEP } } */ >>> + { EXYNOS5433_ATLAS_CPU0_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >>> + { EXYNOS5433_DIS_IRQ_ATLAS_CPU0_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >>> + { EXYNOS5433_ATLAS_CPU1_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >>> + { EXYNOS5433_DIS_IRQ_ATLAS_CPU1_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >>> + { EXYNOS5433_ATLAS_CPU2_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >>> + { EXYNOS5433_DIS_IRQ_ATLAS_CPU2_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >>> + { EXYNOS5433_ATLAS_CPU3_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >>> + { EXYNOS5433_DIS_IRQ_ATLAS_CPU3_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >>> + { EXYNOS5433_APOLLO_CPU0_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >>> + { EXYNOS5433_DIS_IRQ_APOLLO_CPU0_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >>> + { EXYNOS5433_APOLLO_CPU1_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >>> + { EXYNOS5433_DIS_IRQ_APOLLO_CPU1_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >>> + { EXYNOS5433_APOLLO_CPU2_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >>> + { EXYNOS5433_DIS_IRQ_APOLLO_CPU2_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >>> + { EXYNOS5433_APOLLO_CPU3_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >>> + { EXYNOS5433_DIS_IRQ_APOLLO_CPU3_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >>> + { EXYNOS5433_ATLAS_NONCPU_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >>> + { EXYNOS5433_APOLLO_NONCPU_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >> >> >> 1. First of all why do you need any of these CPU related PMU config >> registers in kernel ? From the information I gathered this is ARM64 >> SoC using PSCI. These are needed just in PSCI implementation and not >> in kernel. So can you elaborate on why there are present here ? > > The 32bit Exynos used the 'smc' call to enter the suspend mode > and need to handle the PMU registers. > OK > Even if PSCI replaces the 'smc' call on the Exynos5433, > the Exynos5433's document requires the handling of PMU config > related to CPU for the suspend mode. > OK but does it state it needs to be in kernel ?(i.e. in EL1 NS) > IMHO, If the secure OS implemented the all something related to CPU, > it might be unnecessary to handle the PMU registers. I think that > it depend on how to design the SoC by H/W Architect. This is just my opinion. > Even if it can be accessed in kernel, better to keep all these in PSCI implementation that does the actual power state management. Mixing them in both kernel and PSCI implementation is just a mess TBH and not easy to maintain the platform if some issues pop up. >> >> 2. Are there any public documents that these names map to ? > > There is no public document. It is confidential. > I guessed so and hence raised to remove it. >> If there is none, please replace these codenames(ATLAS, APOLLO) with >> appropriately. > > In the Exynos5433, 'apollo' indicates the LITTLE cores (cpu0-3, cortex-a53) > and 'atlas' indicates the big cores (cpu4-7, cortex-a57) > > Exynos5433 already used the 'apollo' and 'atlas' on clk-exynos5433.c driver > and thermal device-tree node. It is better to use the original register name > in the document in order to reduce the confusion of the change of register name > even if document is not public. > > Also, exynos7 used the 'atlas' word for big cores. > I disagree. If you don't have any public documents, then better use names other developers are used to and not some code names which otherwise is not seen in any other part of the code base. Grepping just shows Exynos using these code names which are generally restricted for internal use.
On 2018년 01월 10일 19:53, Sudeep Holla wrote: > > > On 10/01/18 01:46, Chanwoo Choi wrote: >> On 2018년 01월 09일 23:11, Sudeep Holla wrote: >>> >>> >>> On 09/01/18 07:59, Chanwoo Choi wrote: >>>> This patch adds the PMU (Power Management Unit) data of exynos5433 SoC >>>> in order to support the various power modes. Each power mode has >>>> the different value for reducing the power-consumption. >>>> >>>> Signed-off-by: Jonghwa Lee <jonghwa3.lee@samsung.com> >>>> Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com> >>>> --- >>>> arch/arm/mach-exynos/common.h | 2 - >>>> drivers/soc/samsung/Makefile | 3 +- >>>> drivers/soc/samsung/exynos-pmu.c | 1 + >>>> drivers/soc/samsung/exynos-pmu.h | 2 + >>>> drivers/soc/samsung/exynos5433-pmu.c | 286 ++++++++++++++++++++++++++++ >>>> include/linux/soc/samsung/exynos-regs-pmu.h | 148 ++++++++++++++ >>>> 6 files changed, 439 insertions(+), 3 deletions(-) >>>> create mode 100644 drivers/soc/samsung/exynos5433-pmu.c >>>> >>> >>>> diff --git a/drivers/soc/samsung/exynos5433-pmu.c b/drivers/soc/samsung/exynos5433-pmu.c >>>> new file mode 100644 >>>> index 000000000000..2571e61522f0 >>>> --- /dev/null >>>> +++ b/drivers/soc/samsung/exynos5433-pmu.c >>>> @@ -0,0 +1,286 @@ >>>> +// SPDX-License-Identifier: GPL-2.0 >>>> +// >>>> +// Copyright (c) 2018 Samsung Electronics Co., Ltd. >>>> +// Copyright (c) Jonghwa Lee <jonghwa3.lee@samsung.com> >>>> +// Copyright (c) Chanwoo Choi <cw00.choi@samsung.com> >>>> +// >>>> +// EXYNOS5433 - CPU PMU (Power Management Unit) support >>>> + >>>> +#include <linux/soc/samsung/exynos-regs-pmu.h> >>>> +#include <linux/soc/samsung/exynos-pmu.h> >>>> + >>>> +#include "exynos-pmu.h" >>>> + >>>> +static struct exynos_pmu_conf exynos5433_pmu_config[] = { >>>> + /* { .offset = address, .val = { AFTR, LPA, SLEEP } } */ >>>> + { EXYNOS5433_ATLAS_CPU0_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >>>> + { EXYNOS5433_DIS_IRQ_ATLAS_CPU0_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >>>> + { EXYNOS5433_ATLAS_CPU1_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >>>> + { EXYNOS5433_DIS_IRQ_ATLAS_CPU1_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >>>> + { EXYNOS5433_ATLAS_CPU2_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >>>> + { EXYNOS5433_DIS_IRQ_ATLAS_CPU2_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >>>> + { EXYNOS5433_ATLAS_CPU3_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >>>> + { EXYNOS5433_DIS_IRQ_ATLAS_CPU3_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >>>> + { EXYNOS5433_APOLLO_CPU0_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >>>> + { EXYNOS5433_DIS_IRQ_APOLLO_CPU0_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >>>> + { EXYNOS5433_APOLLO_CPU1_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >>>> + { EXYNOS5433_DIS_IRQ_APOLLO_CPU1_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >>>> + { EXYNOS5433_APOLLO_CPU2_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >>>> + { EXYNOS5433_DIS_IRQ_APOLLO_CPU2_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >>>> + { EXYNOS5433_APOLLO_CPU3_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >>>> + { EXYNOS5433_DIS_IRQ_APOLLO_CPU3_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >>>> + { EXYNOS5433_ATLAS_NONCPU_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >>>> + { EXYNOS5433_APOLLO_NONCPU_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >>> >>> >>> 1. First of all why do you need any of these CPU related PMU config >>> registers in kernel ? From the information I gathered this is ARM64 >>> SoC using PSCI. These are needed just in PSCI implementation and not >>> in kernel. So can you elaborate on why there are present here ? >> >> The 32bit Exynos used the 'smc' call to enter the suspend mode >> and need to handle the PMU registers. >> > > OK > >> Even if PSCI replaces the 'smc' call on the Exynos5433, >> the Exynos5433's document requires the handling of PMU config >> related to CPU for the suspend mode. >> > > OK but does it state it needs to be in kernel ?(i.e. in EL1 NS) > >> IMHO, If the secure OS implemented the all something related to CPU, >> it might be unnecessary to handle the PMU registers. I think that >> it depend on how to design the SoC by H/W Architect. This is just my opinion. >> > > Even if it can be accessed in kernel, better to keep all these in PSCI > implementation that does the actual power state management. Mixing them > in both kernel and PSCI implementation is just a mess TBH and not easy > to maintain the platform if some issues pop up. > >>> >>> 2. Are there any public documents that these names map to ? >> >> There is no public document. It is confidential. >> > > I guessed so and hence raised to remove it. > >>> If there is none, please replace these codenames(ATLAS, APOLLO) with >>> appropriately. >> >> In the Exynos5433, 'apollo' indicates the LITTLE cores (cpu0-3, cortex-a53) >> and 'atlas' indicates the big cores (cpu4-7, cortex-a57) >> >> Exynos5433 already used the 'apollo' and 'atlas' on clk-exynos5433.c driver >> and thermal device-tree node. It is better to use the original register name >> in the document in order to reduce the confusion of the change of register name >> even if document is not public. >> >> Also, exynos7 used the 'atlas' word for big cores. >> > > I disagree. If you don't have any public documents, then better use > names other developers are used to and not some code names which > otherwise is not seen in any other part of the code base. Grepping > just shows Exynos using these code names which are generally restricted I mentioned, these words were already used on other device drivers. Exynos5433 used them to indicate the big.LITTLE cores consistently. They are an alias for big.LITTLE. Latest Exynos SoC must use these words continuously. I think that each vendor SoC could define the alias or expression for their SoC.
On 2018년 01월 09일 21:23, Krzysztof Kozlowski wrote: > On Tue, Jan 9, 2018 at 8:59 AM, Chanwoo Choi <cw00.choi@samsung.com> wrote: >> This patch adds the PMU (Power Management Unit) data of exynos5433 SoC >> in order to support the various power modes. Each power mode has >> the different value for reducing the power-consumption. >> >> Signed-off-by: Jonghwa Lee <jonghwa3.lee@samsung.com> >> Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com> >> --- >> arch/arm/mach-exynos/common.h | 2 - >> drivers/soc/samsung/Makefile | 3 +- >> drivers/soc/samsung/exynos-pmu.c | 1 + >> drivers/soc/samsung/exynos-pmu.h | 2 + >> drivers/soc/samsung/exynos5433-pmu.c | 286 ++++++++++++++++++++++++++++ >> include/linux/soc/samsung/exynos-regs-pmu.h | 148 ++++++++++++++ >> 6 files changed, 439 insertions(+), 3 deletions(-) >> create mode 100644 drivers/soc/samsung/exynos5433-pmu.c >> >> diff --git a/arch/arm/mach-exynos/common.h b/arch/arm/mach-exynos/common.h >> index 098f84a149a3..afbc143a3d5d 100644 >> --- a/arch/arm/mach-exynos/common.h >> +++ b/arch/arm/mach-exynos/common.h >> @@ -125,8 +125,6 @@ enum { >> void exynos_set_boot_flag(unsigned int cpu, unsigned int mode); >> void exynos_clear_boot_flag(unsigned int cpu, unsigned int mode); >> >> -extern u32 exynos_get_eint_wake_mask(void); >> - > > This does not look good. Does it compile without warnings on ARMv7 platforms? I'll try to consolidate suspend-related code. I'll rework. > >> #ifdef CONFIG_PM_SLEEP >> extern void __init exynos_pm_init(void); >> #else >> diff --git a/drivers/soc/samsung/Makefile b/drivers/soc/samsung/Makefile >> index 29f294baac6e..d2e637339a45 100644 >> --- a/drivers/soc/samsung/Makefile >> +++ b/drivers/soc/samsung/Makefile >> @@ -2,5 +2,6 @@ >> obj-$(CONFIG_EXYNOS_PMU) += exynos-pmu.o >> >> obj-$(CONFIG_EXYNOS_PMU_ARM_DRIVERS) += exynos3250-pmu.o exynos4-pmu.o \ >> - exynos5250-pmu.o exynos5420-pmu.o >> + exynos5250-pmu.o exynos5420-pmu.o \ >> + exynos5433-pmu.o >> obj-$(CONFIG_EXYNOS_PM_DOMAINS) += pm_domains.o >> diff --git a/drivers/soc/samsung/exynos-pmu.c b/drivers/soc/samsung/exynos-pmu.c >> index cfc9de518344..7112d7b2749b 100644 >> --- a/drivers/soc/samsung/exynos-pmu.c >> +++ b/drivers/soc/samsung/exynos-pmu.c >> @@ -97,6 +97,7 @@ void exynos_sys_powerup_conf(enum sys_powerdown mode) >> .data = exynos_pmu_data_arm_ptr(exynos5420_pmu_data), >> }, { >> .compatible = "samsung,exynos5433-pmu", >> + .data = exynos_pmu_data_arm_ptr(exynos5433_pmu_data), >> }, >> { /*sentinel*/ }, >> }; >> diff --git a/drivers/soc/samsung/exynos-pmu.h b/drivers/soc/samsung/exynos-pmu.h >> index efbaf8929252..895c786a2f4c 100644 >> --- a/drivers/soc/samsung/exynos-pmu.h >> +++ b/drivers/soc/samsung/exynos-pmu.h >> @@ -28,6 +28,7 @@ struct exynos_pmu_data { >> }; >> >> extern void __iomem *pmu_base_addr; >> +extern u32 exynos_get_eint_wake_mask(void); >> >> #ifdef CONFIG_EXYNOS_PMU_ARM_DRIVERS >> /* list of all exported SoC specific data */ >> @@ -36,6 +37,7 @@ struct exynos_pmu_data { >> extern const struct exynos_pmu_data exynos4412_pmu_data; >> extern const struct exynos_pmu_data exynos5250_pmu_data; >> extern const struct exynos_pmu_data exynos5420_pmu_data; >> +extern const struct exynos_pmu_data exynos5433_pmu_data; >> #endif >> >> extern void pmu_raw_writel(u32 val, u32 offset); >> diff --git a/drivers/soc/samsung/exynos5433-pmu.c b/drivers/soc/samsung/exynos5433-pmu.c >> new file mode 100644 >> index 000000000000..2571e61522f0 >> --- /dev/null >> +++ b/drivers/soc/samsung/exynos5433-pmu.c >> @@ -0,0 +1,286 @@ >> +// SPDX-License-Identifier: GPL-2.0 >> +// >> +// Copyright (c) 2018 Samsung Electronics Co., Ltd. >> +// Copyright (c) Jonghwa Lee <jonghwa3.lee@samsung.com> >> +// Copyright (c) Chanwoo Choi <cw00.choi@samsung.com> > > Did you want to add here authorship notice or personal copyrights? Remove personal info. > >> +// >> +// EXYNOS5433 - CPU PMU (Power Management Unit) support >> + >> +#include <linux/soc/samsung/exynos-regs-pmu.h> >> +#include <linux/soc/samsung/exynos-pmu.h> >> + >> +#include "exynos-pmu.h" >> + >> +static struct exynos_pmu_conf exynos5433_pmu_config[] = { > > This should be also const. OK. > >> + /* { .offset = address, .val = { AFTR, LPA, SLEEP } } */ >> + { EXYNOS5433_ATLAS_CPU0_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >> + { EXYNOS5433_DIS_IRQ_ATLAS_CPU0_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >> + { EXYNOS5433_ATLAS_CPU1_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >> + { EXYNOS5433_DIS_IRQ_ATLAS_CPU1_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >> + { EXYNOS5433_ATLAS_CPU2_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >> + { EXYNOS5433_DIS_IRQ_ATLAS_CPU2_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >> + { EXYNOS5433_ATLAS_CPU3_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >> + { EXYNOS5433_DIS_IRQ_ATLAS_CPU3_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >> + { EXYNOS5433_APOLLO_CPU0_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >> + { EXYNOS5433_DIS_IRQ_APOLLO_CPU0_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >> + { EXYNOS5433_APOLLO_CPU1_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >> + { EXYNOS5433_DIS_IRQ_APOLLO_CPU1_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >> + { EXYNOS5433_APOLLO_CPU2_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >> + { EXYNOS5433_DIS_IRQ_APOLLO_CPU2_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >> + { EXYNOS5433_APOLLO_CPU3_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >> + { EXYNOS5433_DIS_IRQ_APOLLO_CPU3_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >> + { EXYNOS5433_ATLAS_NONCPU_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >> + { EXYNOS5433_APOLLO_NONCPU_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, >> + { EXYNOS5433_A5IS_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >> + { EXYNOS5433_DIS_IRQ_A5IS_LOCAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >> + { EXYNOS5433_DIS_IRQ_A5IS_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, >> + { EXYNOS5433_ATLAS_L2_SYS_PWR_REG, { 0x0, 0x0, 0x7 } }, >> + { EXYNOS5433_APOLLO_L2_SYS_PWR_REG, { 0x0, 0x0, 0x7 } }, >> + { EXYNOS5433_CLKSTOP_CMU_TOP_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, >> + { EXYNOS5433_CLKRUN_CMU_TOP_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, >> + { EXYNOS5433_RESET_CMU_TOP_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, >> + { EXYNOS5433_RESET_CPUCLKSTOP_SYS_PWR_REG, { 0x1, 0x1, 0x0 } }, >> + { EXYNOS5433_CLKSTOP_CMU_MIF_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, >> + { EXYNOS5433_CLKRUN_CMU_MIF_SYS_PWR_REG, { 0x1, 0x1, 0x0 } }, >> + { EXYNOS5433_RESET_CMU_MIF_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, >> + { EXYNOS5433_DDRPHY_DLLLOCK_SYS_PWR_REG, { 0x1, 0x1, 0x1 } }, >> + { EXYNOS5433_DISABLE_PLL_CMU_TOP_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, >> + { EXYNOS5433_DISABLE_PLL_AUD_PLL_SYS_PWR_REG, { 0x1, 0x1, 0x0 } }, >> + { EXYNOS5433_DISABLE_PLL_CMU_MIF_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, >> + { EXYNOS5433_TOP_BUS_SYS_PWR_REG, { 0x7, 0x0, 0x0 } }, >> + { EXYNOS5433_TOP_RETENTION_SYS_PWR_REG, { 0x1, 0x0, 0x1 } }, >> + { EXYNOS5433_TOP_PWR_SYS_PWR_REG, { 0x3, 0x0, 0x3 } }, >> + { EXYNOS5433_TOP_BUS_MIF_SYS_PWR_REG, { 0x7, 0x0, 0x0 } }, >> + { EXYNOS5433_TOP_RETENTION_MIF_SYS_PWR_REG, { 0x1, 0x0, 0x1 } }, >> + { EXYNOS5433_TOP_PWR_MIF_SYS_PWR_REG, { 0x3, 0x0, 0x3 } }, >> + { EXYNOS5433_LOGIC_RESET_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, >> + { EXYNOS5433_OSCCLK_GATE_SYS_PWR_REG, { 0x1, 0x0, 0x1 } }, >> + { EXYNOS5433_SLEEP_RESET_SYS_PWR_REG, { 0x1, 0x1, 0x0 } }, >> + { EXYNOS5433_LOGIC_RESET_MIF_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, >> + { EXYNOS5433_OSCCLK_GATE_MIF_SYS_PWR_REG, { 0x1, 0x0, 0x1 } }, >> + { EXYNOS5433_SLEEP_RESET_MIF_SYS_PWR_REG, { 0x1, 0x1, 0x0 } }, >> + { EXYNOS5433_MEMORY_TOP_SYS_PWR_REG, { 0x3, 0x0, 0x0 } }, >> + { EXYNOS5433_PAD_RETENTION_LPDDR3_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, >> + { EXYNOS5433_PAD_RETENTION_JTAG_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, >> + { EXYNOS5433_PAD_RETENTION_TOP_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, >> + { EXYNOS5433_PAD_RETENTION_UART_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, >> + { EXYNOS5433_PAD_RETENTION_EBIA_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, >> + { EXYNOS5433_PAD_RETENTION_EBIB_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, >> + { EXYNOS5433_PAD_RETENTION_SPI_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, >> + { EXYNOS5433_PAD_RETENTION_MIF_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, >> + { EXYNOS5433_PAD_ISOLATION_SYS_PWR_REG, { 0x1, 0x0, 0x1 } }, >> + { EXYNOS5433_PAD_RETENTION_USBXTI_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, >> + { EXYNOS5433_PAD_RETENTION_BOOTLDO_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, >> + { EXYNOS5433_PAD_ISOLATION_MIF_SYS_PWR_REG, { 0x1, 0x0, 0x1 } }, >> + { EXYNOS5433_PAD_RETENTION_FSYSGENIO_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, >> + { EXYNOS5433_PAD_ALV_SEL_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, >> + { EXYNOS5433_XXTI_SYS_PWR_REG, { 0x1, 0x1, 0x0 } }, >> + { EXYNOS5433_XXTI26_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, >> + { EXYNOS5433_EXT_REGULATOR_SYS_PWR_REG, { 0x1, 0x1, 0x0 } }, >> + { EXYNOS5433_GPIO_MODE_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, >> + { EXYNOS5433_GPIO_MODE_FSYS0_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, >> + { EXYNOS5433_GPIO_MODE_MIF_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, >> + { EXYNOS5433_GPIO_MODE_AUD_SYS_PWR_REG, { 0x1, 0x1, 0x0 } }, >> + { EXYNOS5433_GSCL_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, >> + { EXYNOS5433_CAM0_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, >> + { EXYNOS5433_MSCL_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, >> + { EXYNOS5433_G3D_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, >> + { EXYNOS5433_DISP_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, >> + { EXYNOS5433_CAM1_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, >> + { EXYNOS5433_AUD_SYS_PWR_REG, { 0xF, 0xF, 0x0 } }, >> + { EXYNOS5433_FSYS_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, >> + { EXYNOS5433_BUS2_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, >> + { EXYNOS5433_G2D_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, >> + { EXYNOS5433_ISP0_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, >> + { EXYNOS5433_MFC_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, >> + { EXYNOS5433_HEVC_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, >> + { EXYNOS5433_RESET_SLEEP_FSYS_SYS_PWR_REG, { 0x1, 0x1, 0x0 } }, >> + { EXYNOS5433_RESET_SLEEP_BUS2_SYS_PWR_REG, { 0x1, 0x1, 0x0 } }, >> + { PMU_TABLE_END, }, >> +}; >> + >> +static unsigned int const exynos5433_list_feed[] = { >> + EXYNOS5433_ATLAS_NONCPU_OPTION, >> + EXYNOS5433_APOLLO_NONCPU_OPTION, >> + EXYNOS5433_TOP_PWR_OPTION, >> + EXYNOS5433_TOP_PWR_MIF_OPTION, >> + EXYNOS5433_AUD_OPTION, >> + EXYNOS5433_CAM0_OPTION, >> + EXYNOS5433_DISP_OPTION, >> + EXYNOS5433_G2D_OPTION, >> + EXYNOS5433_G3D_OPTION, >> + EXYNOS5433_HEVC_OPTION, >> + EXYNOS5433_MSCL_OPTION, >> + EXYNOS5433_MFC_OPTION, >> + EXYNOS5433_GSCL_OPTION, >> + EXYNOS5433_FSYS_OPTION, >> + EXYNOS5433_ISP_OPTION, >> + EXYNOS5433_BUS2_OPTION, >> +}; >> + >> +static unsigned int const exynos5433_list_pad_retention[] = { >> + EXYNOS5433_PAD_RETENTION_LPDDR3_OPTION, >> + EXYNOS5433_PAD_RETENTION_AUD_OPTION, >> + EXYNOS5433_PAD_RETENTION_MMC2_OPTION, >> + EXYNOS5433_PAD_RETENTION_TOP_OPTION, >> + EXYNOS5433_PAD_RETENTION_UART_OPTION, >> + EXYNOS5433_PAD_RETENTION_MMC0_OPTION, >> + EXYNOS5433_PAD_RETENTION_MMC1_OPTION, >> + EXYNOS5433_PAD_RETENTION_EBIA_OPTION, >> + EXYNOS5433_PAD_RETENTION_EBIB_OPTION, >> + EXYNOS5433_PAD_RETENTION_SPI_OPTION, >> + EXYNOS5433_PAD_RETENTION_MIF_OPTION, >> + EXYNOS5433_PAD_RETENTION_USBXTI_OPTION, >> + EXYNOS5433_PAD_RETENTION_BOOTLDO_OPTION, >> + EXYNOS5433_PAD_RETENTION_UFS_OPTION, >> + EXYNOS5433_PAD_RETENTION_FSYSGENIO_OPTION, > > Looks like conflicting with existing > drivers/pinctrl/samsung/pinctrl-exynos-arm64.c... and probably this > should be part of pinctrl driver's suspend/resume paths. OK. I'll remove it from this driver and then I'll handle PAD_RETENTION on pinctrl driver. > >> +}; >> + >> +static void exynos5433_set_wakeupmask(enum sys_powerdown mode) >> +{ >> + u32 intmask = 0; >> + >> + pmu_raw_writel(exynos_get_eint_wake_mask(), >> + EXYNOS5433_EINT_WAKEUP_MASK); >> + >> + /* Disable WAKEUP event monitor */ >> + intmask = pmu_raw_readl(EXYNOS5433_WAKEUP_MASK); >> + intmask &= ~(1 << 31); > > This should have a define. Maybe it is an already defined field like > S5P_CORE_AUTOWAKEUP_EN or S5P_PS_HOLD_EN? [31] bit of WAKEUP_MASK is the reserved bit on TRM. But, when I checked it on released code from Samsung, it is used to disable the wakeup event monitoring circuit. I'll define it for readability. > >> + pmu_raw_writel(intmask, EXYNOS5433_WAKEUP_MASK); >> + >> + pmu_raw_writel(0xFFFF0000, EXYNOS5433_WAKEUP_MASK2); >> + pmu_raw_writel(0xFFFF0000, EXYNOS5433_WAKEUP_MASK3); > > Both need explaining what you are masking, preferably by appropriate > comment and maybe also define for raw constants. Initialize the reset value to EXYNOS5433_WAKEUP_MASK2/MASK3 which have the 0xffff000 as the reset value on Exynos5433's TRM. I'll add the comment. > >> +} >> + >> +static void exynos5433_pmu_central_seq(bool enable) >> +{ >> + unsigned int tmp; >> + >> + tmp = pmu_raw_readl(EXYNOS5433_CENTRAL_SEQ_CONFIGURATION); >> + if (enable) >> + tmp &= ~EXYNOS5433_CENTRALSEQ_PWR_CFG; >> + else >> + tmp |= EXYNOS5433_CENTRALSEQ_PWR_CFG; >> + pmu_raw_writel(tmp, EXYNOS5433_CENTRAL_SEQ_CONFIGURATION); >> + >> + tmp = pmu_raw_readl(EXYNOS5433_CENTRAL_SEQ_MIF_CONFIGURATION); >> + if (enable) >> + tmp &= ~EXYNOS5433_CENTRALSEQ_PWR_CFG; >> + else >> + tmp |= EXYNOS5433_CENTRALSEQ_PWR_CFG; >> + pmu_raw_writel(tmp, EXYNOS5433_CENTRAL_SEQ_MIF_CONFIGURATION); >> +} >> + >> +static void exynos5433_pmu_pad_retention_release(void) >> +{ >> + unsigned int tmp; >> + int i; > > unsigned int i OK. > >> + >> + for (i = 0 ; i < ARRAY_SIZE(exynos5433_list_pad_retention) ; i++) { >> + tmp = pmu_raw_readl(exynos5433_list_pad_retention[i]); >> + tmp |= EXYNOS5433_INITIATE_WAKEUP_FROM_LOWPOWER; >> + pmu_raw_writel(tmp, exynos5433_list_pad_retention[i]); >> + } >> +} >> + >> +static void exynos5433_pmu_init(void) >> +{ >> + unsigned int tmp; >> + int i, cluster, cpu; > > unsigned int i OK. > >> + >> + /* Enable non retention flip-flop reset for wakeup */ >> + tmp = pmu_raw_readl(EXYNOS5433_PMU_SPARE0); >> + tmp |= EXYNOS5433_EN_NONRET_RESET; >> + pmu_raw_writel(tmp, EXYNOS5433_PMU_SPARE0); > > This is spare register. Who is using it? Firmware? Please add its > usage also in Documentation/arm/Samsung/Bootloader-interface.txt. Unfortunately, when I checked the bootloader for the PMU_SPARE0 register, the bootloader doesn't read/write for PMU_SPARE0. I fount this code on code released by Samsung. The document doesn't include the detailed role. > >> + >> + /* Enable only SC_FEEDBACK for the register list */ >> + for (i = 0 ; i < ARRAY_SIZE(exynos5433_list_feed) ; i++) { >> + tmp = pmu_raw_readl(exynos5433_list_feed[i]); >> + tmp &= ~EXYNOS5_USE_SC_COUNTER; >> + tmp |= EXYNOS5_USE_SC_FEEDBACK; >> + pmu_raw_writel(tmp, exynos5433_list_feed[i]); >> + } >> + >> + /* >> + * Disable automatic L2 flush, Disable L2 retention and >> + * Enable STANDBYWFIL2, ACE/ACP >> + */ >> + for (cluster = 0; cluster < 2; cluster++) { >> + tmp = pmu_raw_readl(EXYNOS5433_ATLAS_L2_OPTION + (cluster * 0x20)); > > I would prefer to follow the convention for similar registers for cores, like: > EXYNOS_ARM_CORE_CONFIGURATION > EXYNOS_ARM_CORE_STATUS > > This moves the offset into the header, along to other register offsets. OK. > >> + tmp &= ~(EXYNOS5433_USE_AUTO_L2FLUSHREQ | EXYNOS5433_USE_RETENTION); >> + >> + if (cluster == 0) { >> + tmp |= (EXYNOS5433_USE_STANDBYWFIL2 | >> + EXYNOS5433_USE_DEACTIVATE_ACE | >> + EXYNOS5433_USE_DEACTIVATE_ACP); >> + } >> + pmu_raw_writel(tmp, EXYNOS5433_ATLAS_L2_OPTION + (cluster * 0x20)); >> + } >> + >> + /* >> + * Enable both SC_COUNTER and SC_FEEDBACK for the CPUs >> + * Use STANDBYWFI and SMPEN to indicate that core is ready to enter >> + * low power mode >> + */ >> + for (cpu = 0; cpu < 8; cpu++) { >> + tmp = pmu_raw_readl(EXYNOS5433_CPU_OPTION(cpu)); >> + tmp |= (EXYNOS5_USE_SC_FEEDBACK | EXYNOS5_USE_SC_COUNTER); >> + tmp |= EXYNOS5433_USE_SMPEN; >> + tmp |= EXYNOS5433_USE_STANDBYWFI; >> + tmp &= ~EXYNOS5433_USE_STANDBYWFE; >> + pmu_raw_writel(tmp, EXYNOS5433_CPU_OPTION(cpu)); >> + >> + tmp = pmu_raw_readl(EXYNOS5433_CPU_DURATION(cpu)); >> + tmp |= EXYNOS5433_DUR_WAIT_RESET; >> + tmp &= ~EXYNOS5433_DUR_SCALL; >> + tmp |= EXYNOS5433_DUR_SCALL_VALUE; >> + pmu_raw_writel(tmp, EXYNOS5433_CPU_DURATION(cpu)); >> + } >> + >> + /* Skip atlas block power-off during automatic power down sequence */ >> + tmp = pmu_raw_readl(EXYNOS5433_ATLAS_CPUSEQUENCER_OPTION); >> + tmp |= EXYNOS5433_SKIP_BLK_PWR_DOWN; >> + pmu_raw_writel(tmp, EXYNOS5433_ATLAS_CPUSEQUENCER_OPTION); >> + >> + /* Limit in-rush current during local power up of cores */ >> + tmp = pmu_raw_readl(EXYNOS5433_UP_SCHEDULER); >> + tmp |= EXYNOS5433_ENABLE_ATLAS_CPU; >> + pmu_raw_writel(tmp, EXYNOS5433_UP_SCHEDULER); >> +} >> + >> +static void exynos5433_powerdown_conf(enum sys_powerdown mode) >> +{ >> + switch (mode) { >> + case SYS_SLEEP: >> + exynos5433_set_wakeupmask(mode); >> + exynos5433_pmu_central_seq(true); >> + break; >> + default: >> + break; >> + }; >> +} >> + >> +static void exynos5433_powerup_conf(enum sys_powerdown mode) >> +{ >> + unsigned int wakeup; >> + >> + switch (mode) { >> + case SYS_SLEEP: >> + wakeup = pmu_raw_readl(EXYNOS5433_CENTRAL_SEQ_CONFIGURATION); >> + wakeup &= EXYNOS5433_CENTRALSEQ_PWR_CFG; >> + if (wakeup) >> + exynos5433_pmu_pad_retention_release(); >> + else >> + exynos5433_pmu_central_seq(false); > > I do not understand what you want to achieve here. Re-suspend? The powerup_conf is unneeded anymore. So, I'll remove the powerup_conf. Because - pad_retention should be handled in pinctrl driver according to your comment. - exynos5433_pmu_central_seq(false) set the high for SYS_PWR_CFG field of CENTRAL_SEQ_CONFIGURATION. But, When system-level low-power mode, SYS_PWR_CFG field of CENTRAL_SEQ_CONFIGURATION register is automatically cleared to high. So, exynos5433_pmu_central_seq(false) call is unneeded. > >> + break; >> + default: >> + break; >> + }; >> +} >> + >> +const struct exynos_pmu_data exynos5433_pmu_data = { >> + .pmu_config = exynos5433_pmu_config, >> + .pmu_init = exynos5433_pmu_init, >> + .powerdown_conf = exynos5433_powerdown_conf, >> + .powerup_conf = exynos5433_powerup_conf, >> +}; >> diff --git a/include/linux/soc/samsung/exynos-regs-pmu.h b/include/linux/soc/samsung/exynos-regs-pmu.h >> index bebdde5dccd6..93a52d133ba1 100644 >> --- a/include/linux/soc/samsung/exynos-regs-pmu.h >> +++ b/include/linux/soc/samsung/exynos-regs-pmu.h >> @@ -645,7 +645,110 @@ >> | EXYNOS5420_KFC_USE_STANDBY_WFI3) >> >> /* For EXYNOS5433 */ >> +#define EXYNOS5433_UP_SCHEDULER (0x0120) >> +#define EXYNOS5433_CENTRAL_SEQ_CONFIGURATION (0x0200) >> +#define EXYNOS5433_CENTRAL_SEQ_MIF_CONFIGURATION (0x0240) >> +#define EXYNOS5433_EINT_WAKEUP_MASK (0x060C) >> +#define EXYNOS5433_WAKEUP_MASK (0x0610) >> +#define EXYNOS5433_WAKEUP_MASK2 (0x0614) >> +#define EXYNOS5433_WAKEUP_MASK3 (0x0618) >> +#define EXYNOS5433_EINT_WAKEUP_MASK1 (0x062C) >> #define EXYNOS5433_USBHOST30_PHY_CONTROL (0x0728) >> +#define EXYNOS5433_PMU_SPARE0 (0x0900) >> +#define EXYNOS5433_ATLAS_CPU0_SYS_PWR_REG (0x1000) >> +#define EXYNOS5433_DIS_IRQ_ATLAS_CPU0_CENTRAL_SYS_PWR_REG (0x1008) >> +#define EXYNOS5433_ATLAS_CPU1_SYS_PWR_REG (0x1010) >> +#define EXYNOS5433_DIS_IRQ_ATLAS_CPU1_CENTRAL_SYS_PWR_REG (0x1018) >> +#define EXYNOS5433_ATLAS_CPU2_SYS_PWR_REG (0x1020) >> +#define EXYNOS5433_DIS_IRQ_ATLAS_CPU2_CENTRAL_SYS_PWR_REG (0x1028) >> +#define EXYNOS5433_ATLAS_CPU3_SYS_PWR_REG (0x1030) >> +#define EXYNOS5433_DIS_IRQ_ATLAS_CPU3_CENTRAL_SYS_PWR_REG (0x1038) >> +#define EXYNOS5433_APOLLO_CPU0_SYS_PWR_REG (0x1040) >> +#define EXYNOS5433_DIS_IRQ_APOLLO_CPU0_CENTRAL_SYS_PWR_REG (0x1048) >> +#define EXYNOS5433_APOLLO_CPU1_SYS_PWR_REG (0x1050) >> +#define EXYNOS5433_DIS_IRQ_APOLLO_CPU1_CENTRAL_SYS_PWR_REG (0x1058) >> +#define EXYNOS5433_APOLLO_CPU2_SYS_PWR_REG (0x1060) >> +#define EXYNOS5433_DIS_IRQ_APOLLO_CPU2_CENTRAL_SYS_PWR_REG (0x1068) >> +#define EXYNOS5433_APOLLO_CPU3_SYS_PWR_REG (0x1070) >> +#define EXYNOS5433_DIS_IRQ_APOLLO_CPU3_CENTRAL_SYS_PWR_REG (0x1078) >> +#define EXYNOS5433_ATLAS_NONCPU_SYS_PWR_REG (0x1080) >> +#define EXYNOS5433_ATLAS_L2_SYS_PWR_REG (0x10C0) >> +#define EXYNOS5433_APOLLO_L2_SYS_PWR_REG (0x10C4) >> +#define EXYNOS5433_APOLLO_NONCPU_SYS_PWR_REG (0x1084) >> +#define EXYNOS5433_A5IS_SYS_PWR_REG (0x10B0) >> +#define EXYNOS5433_DIS_IRQ_A5IS_LOCAL_SYS_PWR_REG (0x10B4) >> +#define EXYNOS5433_DIS_IRQ_A5IS_CENTRAL_SYS_PWR_REG (0x10B8) >> +#define EXYNOS5433_CLKSTOP_CMU_TOP_SYS_PWR_REG (0x1100) >> +#define EXYNOS5433_CLKRUN_CMU_TOP_SYS_PWR_REG (0x1104) >> +#define EXYNOS5433_RESET_CMU_TOP_SYS_PWR_REG (0x110C) >> +#define EXYNOS5433_RESET_CPUCLKSTOP_SYS_PWR_REG (0x111C) >> +#define EXYNOS5433_CLKSTOP_CMU_MIF_SYS_PWR_REG (0x1120) >> +#define EXYNOS5433_CLKRUN_CMU_MIF_SYS_PWR_REG (0x1124) >> +#define EXYNOS5433_RESET_CMU_MIF_SYS_PWR_REG (0x112C) >> +#define EXYNOS5433_DDRPHY_DLLLOCK_SYS_PWR_REG (0x1138) >> +#define EXYNOS5433_DISABLE_PLL_CMU_TOP_SYS_PWR_REG (0x1140) >> +#define EXYNOS5433_DISABLE_PLL_AUD_PLL_SYS_PWR_REG (0x1144) >> +#define EXYNOS5433_DISABLE_PLL_CMU_MIF_SYS_PWR_REG (0x1160) >> +#define EXYNOS5433_TOP_BUS_SYS_PWR_REG (0x1180) >> +#define EXYNOS5433_TOP_RETENTION_SYS_PWR_REG (0x1184) >> +#define EXYNOS5433_TOP_PWR_SYS_PWR_REG (0x1188) >> +#define EXYNOS5433_TOP_BUS_MIF_SYS_PWR_REG (0x1190) >> +#define EXYNOS5433_TOP_RETENTION_MIF_SYS_PWR_REG (0x1194) >> +#define EXYNOS5433_TOP_PWR_MIF_SYS_PWR_REG (0x1198) >> +#define EXYNOS5433_LOGIC_RESET_SYS_PWR_REG (0x11A0) >> +#define EXYNOS5433_OSCCLK_GATE_SYS_PWR_REG (0x11A4) >> +#define EXYNOS5433_SLEEP_RESET_SYS_PWR_REG (0x11A8) >> +#define EXYNOS5433_LOGIC_RESET_MIF_SYS_PWR_REG (0x11B0) >> +#define EXYNOS5433_OSCCLK_GATE_MIF_SYS_PWR_REG (0x11B4) >> +#define EXYNOS5433_SLEEP_RESET_MIF_SYS_PWR_REG (0x11B8) >> +#define EXYNOS5433_MEMORY_TOP_SYS_PWR_REG (0x11C0) >> +#define EXYNOS5433_PAD_RETENTION_LPDDR3_SYS_PWR_REG (0x1200) >> +#define EXYNOS5433_PAD_RETENTION_JTAG_SYS_PWR_REG (0x1208) >> +#define EXYNOS5433_PAD_RETENTION_TOP_SYS_PWR_REG (0x1220) >> +#define EXYNOS5433_PAD_RETENTION_UART_SYS_PWR_REG (0x1224) >> +#define EXYNOS5433_PAD_RETENTION_EBIA_SYS_PWR_REG (0x1230) >> +#define EXYNOS5433_PAD_RETENTION_EBIB_SYS_PWR_REG (0x1234) >> +#define EXYNOS5433_PAD_RETENTION_SPI_SYS_PWR_REG (0x1238) >> +#define EXYNOS5433_PAD_RETENTION_MIF_SYS_PWR_REG (0x123C) >> +#define EXYNOS5433_PAD_ISOLATION_SYS_PWR_REG (0x1240) >> +#define EXYNOS5433_PAD_RETENTION_USBXTI_SYS_PWR_REG (0x1244) >> +#define EXYNOS5433_PAD_RETENTION_BOOTLDO_SYS_PWR_REG (0x1248) >> +#define EXYNOS5433_PAD_ISOLATION_MIF_SYS_PWR_REG (0x1250) >> +#define EXYNOS5433_PAD_RETENTION_FSYSGENIO_SYS_PWR_REG (0x1254) >> +#define EXYNOS5433_PAD_ALV_SEL_SYS_PWR_REG (0x1260) >> +#define EXYNOS5433_XXTI_SYS_PWR_REG (0x1284) >> +#define EXYNOS5433_XXTI26_SYS_PWR_REG (0x1288) >> +#define EXYNOS5433_EXT_REGULATOR_SYS_PWR_REG (0x12C0) >> +#define EXYNOS5433_GPIO_MODE_SYS_PWR_REG (0x1300) >> +#define EXYNOS5433_GPIO_MODE_FSYS0_SYS_PWR_REG (0x1304) >> +#define EXYNOS5433_GPIO_MODE_MIF_SYS_PWR_REG (0x1320) >> +#define EXYNOS5433_GPIO_MODE_AUD_SYS_PWR_REG (0x1340) >> +#define EXYNOS5433_GSCL_SYS_PWR_REG (0x1400) >> +#define EXYNOS5433_CAM0_SYS_PWR_REG (0x1404) >> +#define EXYNOS5433_MSCL_SYS_PWR_REG (0x1408) >> +#define EXYNOS5433_G3D_SYS_PWR_REG (0x140C) >> +#define EXYNOS5433_DISP_SYS_PWR_REG (0x1410) >> +#define EXYNOS5433_CAM1_SYS_PWR_REG (0x1414) >> +#define EXYNOS5433_AUD_SYS_PWR_REG (0x1418) >> +#define EXYNOS5433_FSYS_SYS_PWR_REG (0x141C) >> +#define EXYNOS5433_BUS2_SYS_PWR_REG (0x1420) >> +#define EXYNOS5433_G2D_SYS_PWR_REG (0x1424) >> +#define EXYNOS5433_ISP0_SYS_PWR_REG (0x1428) >> +#define EXYNOS5433_MFC_SYS_PWR_REG (0x1430) >> +#define EXYNOS5433_HEVC_SYS_PWR_REG (0x1438) >> +#define EXYNOS5433_RESET_SLEEP_FSYS_SYS_PWR_REG (0x15DC) >> +#define EXYNOS5433_RESET_SLEEP_BUS2_SYS_PWR_REG (0x15E0) >> +#define EXYNOS5433_ATLAS_CPU0_OPTION (0x2008) >> +#define EXYNOS5433_CPU_OPTION(_nr) (EXYNOS5433_ATLAS_CPU0_OPTION + (_nr) * 0x80) >> +#define EXYNOS5433_ATLAS_CPU0_DURATION0 (0x2010) >> +#define EXYNOS5433_CPU_DURATION(_nr) (EXYNOS5433_ATLAS_CPU0_DURATION0 + (_nr) * 0x80) >> +#define EXYNOS5433_ATLAS_NONCPU_OPTION (0x2408) >> +#define EXYNOS5433_APOLLO_NONCPU_OPTION (0x2428) >> +#define EXYNOS5433_ATLAS_CPUSEQUENCER_OPTION (0x2488) >> +#define EXYNOS5433_ATLAS_L2_OPTION (0x2608) >> +#define EXYNOS5433_TOP_PWR_MIF_OPTION (0x2CC8) >> +#define EXYNOS5433_TOP_PWR_OPTION (0x2C48) >> +#define EXYNOS5433_PAD_RETENTION_LPDDR3_OPTION (0x3008) >> #define EXYNOS5433_PAD_RETENTION_AUD_OPTION (0x3028) >> #define EXYNOS5433_PAD_RETENTION_MMC2_OPTION (0x30C8) >> #define EXYNOS5433_PAD_RETENTION_TOP_OPTION (0x3108) >> @@ -660,5 +763,50 @@ >> #define EXYNOS5433_PAD_RETENTION_BOOTLDO_OPTION (0x3248) >> #define EXYNOS5433_PAD_RETENTION_UFS_OPTION (0x3268) >> #define EXYNOS5433_PAD_RETENTION_FSYSGENIO_OPTION (0x32A8) >> +#define EXYNOS5433_PS_HOLD_CONTROL (0x330C) >> +#define EXYNOS5433_GSCL_OPTION (0x4008) >> +#define EXYNOS5433_CAM0_OPTION (0x4028) >> +#define EXYNOS5433_MSCL_OPTION (0x4048) >> +#define EXYNOS5433_G3D_OPTION (0x4068) >> +#define EXYNOS5433_DISP_OPTION (0x4088) >> +#define EXYNOS5433_AUD_OPTION (0x40C8) >> +#define EXYNOS5433_FSYS_OPTION (0x40E8) >> +#define EXYNOS5433_BUS2_OPTION (0x4108) >> +#define EXYNOS5433_G2D_OPTION (0x4128) >> +#define EXYNOS5433_ISP_OPTION (0x4148) >> +#define EXYNOS5433_MFC_OPTION (0x4188) >> +#define EXYNOS5433_HEVC_OPTION (0x41C8) >> + >> +/* EXYNOS5433_PMU_SPARE0 */ >> +#define EXYNOS5433_EN_NONRET_RESET (1 << 0) > > Use BIT(0) here and in other places. OK. [snip] Thanks for the review.
diff --git a/arch/arm/mach-exynos/common.h b/arch/arm/mach-exynos/common.h index 098f84a149a3..afbc143a3d5d 100644 --- a/arch/arm/mach-exynos/common.h +++ b/arch/arm/mach-exynos/common.h @@ -125,8 +125,6 @@ enum { void exynos_set_boot_flag(unsigned int cpu, unsigned int mode); void exynos_clear_boot_flag(unsigned int cpu, unsigned int mode); -extern u32 exynos_get_eint_wake_mask(void); - #ifdef CONFIG_PM_SLEEP extern void __init exynos_pm_init(void); #else diff --git a/drivers/soc/samsung/Makefile b/drivers/soc/samsung/Makefile index 29f294baac6e..d2e637339a45 100644 --- a/drivers/soc/samsung/Makefile +++ b/drivers/soc/samsung/Makefile @@ -2,5 +2,6 @@ obj-$(CONFIG_EXYNOS_PMU) += exynos-pmu.o obj-$(CONFIG_EXYNOS_PMU_ARM_DRIVERS) += exynos3250-pmu.o exynos4-pmu.o \ - exynos5250-pmu.o exynos5420-pmu.o + exynos5250-pmu.o exynos5420-pmu.o \ + exynos5433-pmu.o obj-$(CONFIG_EXYNOS_PM_DOMAINS) += pm_domains.o diff --git a/drivers/soc/samsung/exynos-pmu.c b/drivers/soc/samsung/exynos-pmu.c index cfc9de518344..7112d7b2749b 100644 --- a/drivers/soc/samsung/exynos-pmu.c +++ b/drivers/soc/samsung/exynos-pmu.c @@ -97,6 +97,7 @@ void exynos_sys_powerup_conf(enum sys_powerdown mode) .data = exynos_pmu_data_arm_ptr(exynos5420_pmu_data), }, { .compatible = "samsung,exynos5433-pmu", + .data = exynos_pmu_data_arm_ptr(exynos5433_pmu_data), }, { /*sentinel*/ }, }; diff --git a/drivers/soc/samsung/exynos-pmu.h b/drivers/soc/samsung/exynos-pmu.h index efbaf8929252..895c786a2f4c 100644 --- a/drivers/soc/samsung/exynos-pmu.h +++ b/drivers/soc/samsung/exynos-pmu.h @@ -28,6 +28,7 @@ struct exynos_pmu_data { }; extern void __iomem *pmu_base_addr; +extern u32 exynos_get_eint_wake_mask(void); #ifdef CONFIG_EXYNOS_PMU_ARM_DRIVERS /* list of all exported SoC specific data */ @@ -36,6 +37,7 @@ struct exynos_pmu_data { extern const struct exynos_pmu_data exynos4412_pmu_data; extern const struct exynos_pmu_data exynos5250_pmu_data; extern const struct exynos_pmu_data exynos5420_pmu_data; +extern const struct exynos_pmu_data exynos5433_pmu_data; #endif extern void pmu_raw_writel(u32 val, u32 offset); diff --git a/drivers/soc/samsung/exynos5433-pmu.c b/drivers/soc/samsung/exynos5433-pmu.c new file mode 100644 index 000000000000..2571e61522f0 --- /dev/null +++ b/drivers/soc/samsung/exynos5433-pmu.c @@ -0,0 +1,286 @@ +// SPDX-License-Identifier: GPL-2.0 +// +// Copyright (c) 2018 Samsung Electronics Co., Ltd. +// Copyright (c) Jonghwa Lee <jonghwa3.lee@samsung.com> +// Copyright (c) Chanwoo Choi <cw00.choi@samsung.com> +// +// EXYNOS5433 - CPU PMU (Power Management Unit) support + +#include <linux/soc/samsung/exynos-regs-pmu.h> +#include <linux/soc/samsung/exynos-pmu.h> + +#include "exynos-pmu.h" + +static struct exynos_pmu_conf exynos5433_pmu_config[] = { + /* { .offset = address, .val = { AFTR, LPA, SLEEP } } */ + { EXYNOS5433_ATLAS_CPU0_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, + { EXYNOS5433_DIS_IRQ_ATLAS_CPU0_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, + { EXYNOS5433_ATLAS_CPU1_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, + { EXYNOS5433_DIS_IRQ_ATLAS_CPU1_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, + { EXYNOS5433_ATLAS_CPU2_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, + { EXYNOS5433_DIS_IRQ_ATLAS_CPU2_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, + { EXYNOS5433_ATLAS_CPU3_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, + { EXYNOS5433_DIS_IRQ_ATLAS_CPU3_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, + { EXYNOS5433_APOLLO_CPU0_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, + { EXYNOS5433_DIS_IRQ_APOLLO_CPU0_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, + { EXYNOS5433_APOLLO_CPU1_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, + { EXYNOS5433_DIS_IRQ_APOLLO_CPU1_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, + { EXYNOS5433_APOLLO_CPU2_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, + { EXYNOS5433_DIS_IRQ_APOLLO_CPU2_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, + { EXYNOS5433_APOLLO_CPU3_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, + { EXYNOS5433_DIS_IRQ_APOLLO_CPU3_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, + { EXYNOS5433_ATLAS_NONCPU_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, + { EXYNOS5433_APOLLO_NONCPU_SYS_PWR_REG, { 0x0, 0x0, 0x8 } }, + { EXYNOS5433_A5IS_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, + { EXYNOS5433_DIS_IRQ_A5IS_LOCAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, + { EXYNOS5433_DIS_IRQ_A5IS_CENTRAL_SYS_PWR_REG, { 0x0, 0x0, 0x0 } }, + { EXYNOS5433_ATLAS_L2_SYS_PWR_REG, { 0x0, 0x0, 0x7 } }, + { EXYNOS5433_APOLLO_L2_SYS_PWR_REG, { 0x0, 0x0, 0x7 } }, + { EXYNOS5433_CLKSTOP_CMU_TOP_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, + { EXYNOS5433_CLKRUN_CMU_TOP_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, + { EXYNOS5433_RESET_CMU_TOP_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, + { EXYNOS5433_RESET_CPUCLKSTOP_SYS_PWR_REG, { 0x1, 0x1, 0x0 } }, + { EXYNOS5433_CLKSTOP_CMU_MIF_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, + { EXYNOS5433_CLKRUN_CMU_MIF_SYS_PWR_REG, { 0x1, 0x1, 0x0 } }, + { EXYNOS5433_RESET_CMU_MIF_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, + { EXYNOS5433_DDRPHY_DLLLOCK_SYS_PWR_REG, { 0x1, 0x1, 0x1 } }, + { EXYNOS5433_DISABLE_PLL_CMU_TOP_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, + { EXYNOS5433_DISABLE_PLL_AUD_PLL_SYS_PWR_REG, { 0x1, 0x1, 0x0 } }, + { EXYNOS5433_DISABLE_PLL_CMU_MIF_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, + { EXYNOS5433_TOP_BUS_SYS_PWR_REG, { 0x7, 0x0, 0x0 } }, + { EXYNOS5433_TOP_RETENTION_SYS_PWR_REG, { 0x1, 0x0, 0x1 } }, + { EXYNOS5433_TOP_PWR_SYS_PWR_REG, { 0x3, 0x0, 0x3 } }, + { EXYNOS5433_TOP_BUS_MIF_SYS_PWR_REG, { 0x7, 0x0, 0x0 } }, + { EXYNOS5433_TOP_RETENTION_MIF_SYS_PWR_REG, { 0x1, 0x0, 0x1 } }, + { EXYNOS5433_TOP_PWR_MIF_SYS_PWR_REG, { 0x3, 0x0, 0x3 } }, + { EXYNOS5433_LOGIC_RESET_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, + { EXYNOS5433_OSCCLK_GATE_SYS_PWR_REG, { 0x1, 0x0, 0x1 } }, + { EXYNOS5433_SLEEP_RESET_SYS_PWR_REG, { 0x1, 0x1, 0x0 } }, + { EXYNOS5433_LOGIC_RESET_MIF_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, + { EXYNOS5433_OSCCLK_GATE_MIF_SYS_PWR_REG, { 0x1, 0x0, 0x1 } }, + { EXYNOS5433_SLEEP_RESET_MIF_SYS_PWR_REG, { 0x1, 0x1, 0x0 } }, + { EXYNOS5433_MEMORY_TOP_SYS_PWR_REG, { 0x3, 0x0, 0x0 } }, + { EXYNOS5433_PAD_RETENTION_LPDDR3_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, + { EXYNOS5433_PAD_RETENTION_JTAG_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, + { EXYNOS5433_PAD_RETENTION_TOP_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, + { EXYNOS5433_PAD_RETENTION_UART_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, + { EXYNOS5433_PAD_RETENTION_EBIA_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, + { EXYNOS5433_PAD_RETENTION_EBIB_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, + { EXYNOS5433_PAD_RETENTION_SPI_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, + { EXYNOS5433_PAD_RETENTION_MIF_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, + { EXYNOS5433_PAD_ISOLATION_SYS_PWR_REG, { 0x1, 0x0, 0x1 } }, + { EXYNOS5433_PAD_RETENTION_USBXTI_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, + { EXYNOS5433_PAD_RETENTION_BOOTLDO_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, + { EXYNOS5433_PAD_ISOLATION_MIF_SYS_PWR_REG, { 0x1, 0x0, 0x1 } }, + { EXYNOS5433_PAD_RETENTION_FSYSGENIO_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, + { EXYNOS5433_PAD_ALV_SEL_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, + { EXYNOS5433_XXTI_SYS_PWR_REG, { 0x1, 0x1, 0x0 } }, + { EXYNOS5433_XXTI26_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, + { EXYNOS5433_EXT_REGULATOR_SYS_PWR_REG, { 0x1, 0x1, 0x0 } }, + { EXYNOS5433_GPIO_MODE_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, + { EXYNOS5433_GPIO_MODE_FSYS0_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, + { EXYNOS5433_GPIO_MODE_MIF_SYS_PWR_REG, { 0x1, 0x0, 0x0 } }, + { EXYNOS5433_GPIO_MODE_AUD_SYS_PWR_REG, { 0x1, 0x1, 0x0 } }, + { EXYNOS5433_GSCL_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, + { EXYNOS5433_CAM0_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, + { EXYNOS5433_MSCL_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, + { EXYNOS5433_G3D_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, + { EXYNOS5433_DISP_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, + { EXYNOS5433_CAM1_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, + { EXYNOS5433_AUD_SYS_PWR_REG, { 0xF, 0xF, 0x0 } }, + { EXYNOS5433_FSYS_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, + { EXYNOS5433_BUS2_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, + { EXYNOS5433_G2D_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, + { EXYNOS5433_ISP0_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, + { EXYNOS5433_MFC_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, + { EXYNOS5433_HEVC_SYS_PWR_REG, { 0xF, 0x0, 0x0 } }, + { EXYNOS5433_RESET_SLEEP_FSYS_SYS_PWR_REG, { 0x1, 0x1, 0x0 } }, + { EXYNOS5433_RESET_SLEEP_BUS2_SYS_PWR_REG, { 0x1, 0x1, 0x0 } }, + { PMU_TABLE_END, }, +}; + +static unsigned int const exynos5433_list_feed[] = { + EXYNOS5433_ATLAS_NONCPU_OPTION, + EXYNOS5433_APOLLO_NONCPU_OPTION, + EXYNOS5433_TOP_PWR_OPTION, + EXYNOS5433_TOP_PWR_MIF_OPTION, + EXYNOS5433_AUD_OPTION, + EXYNOS5433_CAM0_OPTION, + EXYNOS5433_DISP_OPTION, + EXYNOS5433_G2D_OPTION, + EXYNOS5433_G3D_OPTION, + EXYNOS5433_HEVC_OPTION, + EXYNOS5433_MSCL_OPTION, + EXYNOS5433_MFC_OPTION, + EXYNOS5433_GSCL_OPTION, + EXYNOS5433_FSYS_OPTION, + EXYNOS5433_ISP_OPTION, + EXYNOS5433_BUS2_OPTION, +}; + +static unsigned int const exynos5433_list_pad_retention[] = { + EXYNOS5433_PAD_RETENTION_LPDDR3_OPTION, + EXYNOS5433_PAD_RETENTION_AUD_OPTION, + EXYNOS5433_PAD_RETENTION_MMC2_OPTION, + EXYNOS5433_PAD_RETENTION_TOP_OPTION, + EXYNOS5433_PAD_RETENTION_UART_OPTION, + EXYNOS5433_PAD_RETENTION_MMC0_OPTION, + EXYNOS5433_PAD_RETENTION_MMC1_OPTION, + EXYNOS5433_PAD_RETENTION_EBIA_OPTION, + EXYNOS5433_PAD_RETENTION_EBIB_OPTION, + EXYNOS5433_PAD_RETENTION_SPI_OPTION, + EXYNOS5433_PAD_RETENTION_MIF_OPTION, + EXYNOS5433_PAD_RETENTION_USBXTI_OPTION, + EXYNOS5433_PAD_RETENTION_BOOTLDO_OPTION, + EXYNOS5433_PAD_RETENTION_UFS_OPTION, + EXYNOS5433_PAD_RETENTION_FSYSGENIO_OPTION, +}; + +static void exynos5433_set_wakeupmask(enum sys_powerdown mode) +{ + u32 intmask = 0; + + pmu_raw_writel(exynos_get_eint_wake_mask(), + EXYNOS5433_EINT_WAKEUP_MASK); + + /* Disable WAKEUP event monitor */ + intmask = pmu_raw_readl(EXYNOS5433_WAKEUP_MASK); + intmask &= ~(1 << 31); + pmu_raw_writel(intmask, EXYNOS5433_WAKEUP_MASK); + + pmu_raw_writel(0xFFFF0000, EXYNOS5433_WAKEUP_MASK2); + pmu_raw_writel(0xFFFF0000, EXYNOS5433_WAKEUP_MASK3); +} + +static void exynos5433_pmu_central_seq(bool enable) +{ + unsigned int tmp; + + tmp = pmu_raw_readl(EXYNOS5433_CENTRAL_SEQ_CONFIGURATION); + if (enable) + tmp &= ~EXYNOS5433_CENTRALSEQ_PWR_CFG; + else + tmp |= EXYNOS5433_CENTRALSEQ_PWR_CFG; + pmu_raw_writel(tmp, EXYNOS5433_CENTRAL_SEQ_CONFIGURATION); + + tmp = pmu_raw_readl(EXYNOS5433_CENTRAL_SEQ_MIF_CONFIGURATION); + if (enable) + tmp &= ~EXYNOS5433_CENTRALSEQ_PWR_CFG; + else + tmp |= EXYNOS5433_CENTRALSEQ_PWR_CFG; + pmu_raw_writel(tmp, EXYNOS5433_CENTRAL_SEQ_MIF_CONFIGURATION); +} + +static void exynos5433_pmu_pad_retention_release(void) +{ + unsigned int tmp; + int i; + + for (i = 0 ; i < ARRAY_SIZE(exynos5433_list_pad_retention) ; i++) { + tmp = pmu_raw_readl(exynos5433_list_pad_retention[i]); + tmp |= EXYNOS5433_INITIATE_WAKEUP_FROM_LOWPOWER; + pmu_raw_writel(tmp, exynos5433_list_pad_retention[i]); + } +} + +static void exynos5433_pmu_init(void) +{ + unsigned int tmp; + int i, cluster, cpu; + + /* Enable non retention flip-flop reset for wakeup */ + tmp = pmu_raw_readl(EXYNOS5433_PMU_SPARE0); + tmp |= EXYNOS5433_EN_NONRET_RESET; + pmu_raw_writel(tmp, EXYNOS5433_PMU_SPARE0); + + /* Enable only SC_FEEDBACK for the register list */ + for (i = 0 ; i < ARRAY_SIZE(exynos5433_list_feed) ; i++) { + tmp = pmu_raw_readl(exynos5433_list_feed[i]); + tmp &= ~EXYNOS5_USE_SC_COUNTER; + tmp |= EXYNOS5_USE_SC_FEEDBACK; + pmu_raw_writel(tmp, exynos5433_list_feed[i]); + } + + /* + * Disable automatic L2 flush, Disable L2 retention and + * Enable STANDBYWFIL2, ACE/ACP + */ + for (cluster = 0; cluster < 2; cluster++) { + tmp = pmu_raw_readl(EXYNOS5433_ATLAS_L2_OPTION + (cluster * 0x20)); + tmp &= ~(EXYNOS5433_USE_AUTO_L2FLUSHREQ | EXYNOS5433_USE_RETENTION); + + if (cluster == 0) { + tmp |= (EXYNOS5433_USE_STANDBYWFIL2 | + EXYNOS5433_USE_DEACTIVATE_ACE | + EXYNOS5433_USE_DEACTIVATE_ACP); + } + pmu_raw_writel(tmp, EXYNOS5433_ATLAS_L2_OPTION + (cluster * 0x20)); + } + + /* + * Enable both SC_COUNTER and SC_FEEDBACK for the CPUs + * Use STANDBYWFI and SMPEN to indicate that core is ready to enter + * low power mode + */ + for (cpu = 0; cpu < 8; cpu++) { + tmp = pmu_raw_readl(EXYNOS5433_CPU_OPTION(cpu)); + tmp |= (EXYNOS5_USE_SC_FEEDBACK | EXYNOS5_USE_SC_COUNTER); + tmp |= EXYNOS5433_USE_SMPEN; + tmp |= EXYNOS5433_USE_STANDBYWFI; + tmp &= ~EXYNOS5433_USE_STANDBYWFE; + pmu_raw_writel(tmp, EXYNOS5433_CPU_OPTION(cpu)); + + tmp = pmu_raw_readl(EXYNOS5433_CPU_DURATION(cpu)); + tmp |= EXYNOS5433_DUR_WAIT_RESET; + tmp &= ~EXYNOS5433_DUR_SCALL; + tmp |= EXYNOS5433_DUR_SCALL_VALUE; + pmu_raw_writel(tmp, EXYNOS5433_CPU_DURATION(cpu)); + } + + /* Skip atlas block power-off during automatic power down sequence */ + tmp = pmu_raw_readl(EXYNOS5433_ATLAS_CPUSEQUENCER_OPTION); + tmp |= EXYNOS5433_SKIP_BLK_PWR_DOWN; + pmu_raw_writel(tmp, EXYNOS5433_ATLAS_CPUSEQUENCER_OPTION); + + /* Limit in-rush current during local power up of cores */ + tmp = pmu_raw_readl(EXYNOS5433_UP_SCHEDULER); + tmp |= EXYNOS5433_ENABLE_ATLAS_CPU; + pmu_raw_writel(tmp, EXYNOS5433_UP_SCHEDULER); +} + +static void exynos5433_powerdown_conf(enum sys_powerdown mode) +{ + switch (mode) { + case SYS_SLEEP: + exynos5433_set_wakeupmask(mode); + exynos5433_pmu_central_seq(true); + break; + default: + break; + }; +} + +static void exynos5433_powerup_conf(enum sys_powerdown mode) +{ + unsigned int wakeup; + + switch (mode) { + case SYS_SLEEP: + wakeup = pmu_raw_readl(EXYNOS5433_CENTRAL_SEQ_CONFIGURATION); + wakeup &= EXYNOS5433_CENTRALSEQ_PWR_CFG; + if (wakeup) + exynos5433_pmu_pad_retention_release(); + else + exynos5433_pmu_central_seq(false); + break; + default: + break; + }; +} + +const struct exynos_pmu_data exynos5433_pmu_data = { + .pmu_config = exynos5433_pmu_config, + .pmu_init = exynos5433_pmu_init, + .powerdown_conf = exynos5433_powerdown_conf, + .powerup_conf = exynos5433_powerup_conf, +}; diff --git a/include/linux/soc/samsung/exynos-regs-pmu.h b/include/linux/soc/samsung/exynos-regs-pmu.h index bebdde5dccd6..93a52d133ba1 100644 --- a/include/linux/soc/samsung/exynos-regs-pmu.h +++ b/include/linux/soc/samsung/exynos-regs-pmu.h @@ -645,7 +645,110 @@ | EXYNOS5420_KFC_USE_STANDBY_WFI3) /* For EXYNOS5433 */ +#define EXYNOS5433_UP_SCHEDULER (0x0120) +#define EXYNOS5433_CENTRAL_SEQ_CONFIGURATION (0x0200) +#define EXYNOS5433_CENTRAL_SEQ_MIF_CONFIGURATION (0x0240) +#define EXYNOS5433_EINT_WAKEUP_MASK (0x060C) +#define EXYNOS5433_WAKEUP_MASK (0x0610) +#define EXYNOS5433_WAKEUP_MASK2 (0x0614) +#define EXYNOS5433_WAKEUP_MASK3 (0x0618) +#define EXYNOS5433_EINT_WAKEUP_MASK1 (0x062C) #define EXYNOS5433_USBHOST30_PHY_CONTROL (0x0728) +#define EXYNOS5433_PMU_SPARE0 (0x0900) +#define EXYNOS5433_ATLAS_CPU0_SYS_PWR_REG (0x1000) +#define EXYNOS5433_DIS_IRQ_ATLAS_CPU0_CENTRAL_SYS_PWR_REG (0x1008) +#define EXYNOS5433_ATLAS_CPU1_SYS_PWR_REG (0x1010) +#define EXYNOS5433_DIS_IRQ_ATLAS_CPU1_CENTRAL_SYS_PWR_REG (0x1018) +#define EXYNOS5433_ATLAS_CPU2_SYS_PWR_REG (0x1020) +#define EXYNOS5433_DIS_IRQ_ATLAS_CPU2_CENTRAL_SYS_PWR_REG (0x1028) +#define EXYNOS5433_ATLAS_CPU3_SYS_PWR_REG (0x1030) +#define EXYNOS5433_DIS_IRQ_ATLAS_CPU3_CENTRAL_SYS_PWR_REG (0x1038) +#define EXYNOS5433_APOLLO_CPU0_SYS_PWR_REG (0x1040) +#define EXYNOS5433_DIS_IRQ_APOLLO_CPU0_CENTRAL_SYS_PWR_REG (0x1048) +#define EXYNOS5433_APOLLO_CPU1_SYS_PWR_REG (0x1050) +#define EXYNOS5433_DIS_IRQ_APOLLO_CPU1_CENTRAL_SYS_PWR_REG (0x1058) +#define EXYNOS5433_APOLLO_CPU2_SYS_PWR_REG (0x1060) +#define EXYNOS5433_DIS_IRQ_APOLLO_CPU2_CENTRAL_SYS_PWR_REG (0x1068) +#define EXYNOS5433_APOLLO_CPU3_SYS_PWR_REG (0x1070) +#define EXYNOS5433_DIS_IRQ_APOLLO_CPU3_CENTRAL_SYS_PWR_REG (0x1078) +#define EXYNOS5433_ATLAS_NONCPU_SYS_PWR_REG (0x1080) +#define EXYNOS5433_ATLAS_L2_SYS_PWR_REG (0x10C0) +#define EXYNOS5433_APOLLO_L2_SYS_PWR_REG (0x10C4) +#define EXYNOS5433_APOLLO_NONCPU_SYS_PWR_REG (0x1084) +#define EXYNOS5433_A5IS_SYS_PWR_REG (0x10B0) +#define EXYNOS5433_DIS_IRQ_A5IS_LOCAL_SYS_PWR_REG (0x10B4) +#define EXYNOS5433_DIS_IRQ_A5IS_CENTRAL_SYS_PWR_REG (0x10B8) +#define EXYNOS5433_CLKSTOP_CMU_TOP_SYS_PWR_REG (0x1100) +#define EXYNOS5433_CLKRUN_CMU_TOP_SYS_PWR_REG (0x1104) +#define EXYNOS5433_RESET_CMU_TOP_SYS_PWR_REG (0x110C) +#define EXYNOS5433_RESET_CPUCLKSTOP_SYS_PWR_REG (0x111C) +#define EXYNOS5433_CLKSTOP_CMU_MIF_SYS_PWR_REG (0x1120) +#define EXYNOS5433_CLKRUN_CMU_MIF_SYS_PWR_REG (0x1124) +#define EXYNOS5433_RESET_CMU_MIF_SYS_PWR_REG (0x112C) +#define EXYNOS5433_DDRPHY_DLLLOCK_SYS_PWR_REG (0x1138) +#define EXYNOS5433_DISABLE_PLL_CMU_TOP_SYS_PWR_REG (0x1140) +#define EXYNOS5433_DISABLE_PLL_AUD_PLL_SYS_PWR_REG (0x1144) +#define EXYNOS5433_DISABLE_PLL_CMU_MIF_SYS_PWR_REG (0x1160) +#define EXYNOS5433_TOP_BUS_SYS_PWR_REG (0x1180) +#define EXYNOS5433_TOP_RETENTION_SYS_PWR_REG (0x1184) +#define EXYNOS5433_TOP_PWR_SYS_PWR_REG (0x1188) +#define EXYNOS5433_TOP_BUS_MIF_SYS_PWR_REG (0x1190) +#define EXYNOS5433_TOP_RETENTION_MIF_SYS_PWR_REG (0x1194) +#define EXYNOS5433_TOP_PWR_MIF_SYS_PWR_REG (0x1198) +#define EXYNOS5433_LOGIC_RESET_SYS_PWR_REG (0x11A0) +#define EXYNOS5433_OSCCLK_GATE_SYS_PWR_REG (0x11A4) +#define EXYNOS5433_SLEEP_RESET_SYS_PWR_REG (0x11A8) +#define EXYNOS5433_LOGIC_RESET_MIF_SYS_PWR_REG (0x11B0) +#define EXYNOS5433_OSCCLK_GATE_MIF_SYS_PWR_REG (0x11B4) +#define EXYNOS5433_SLEEP_RESET_MIF_SYS_PWR_REG (0x11B8) +#define EXYNOS5433_MEMORY_TOP_SYS_PWR_REG (0x11C0) +#define EXYNOS5433_PAD_RETENTION_LPDDR3_SYS_PWR_REG (0x1200) +#define EXYNOS5433_PAD_RETENTION_JTAG_SYS_PWR_REG (0x1208) +#define EXYNOS5433_PAD_RETENTION_TOP_SYS_PWR_REG (0x1220) +#define EXYNOS5433_PAD_RETENTION_UART_SYS_PWR_REG (0x1224) +#define EXYNOS5433_PAD_RETENTION_EBIA_SYS_PWR_REG (0x1230) +#define EXYNOS5433_PAD_RETENTION_EBIB_SYS_PWR_REG (0x1234) +#define EXYNOS5433_PAD_RETENTION_SPI_SYS_PWR_REG (0x1238) +#define EXYNOS5433_PAD_RETENTION_MIF_SYS_PWR_REG (0x123C) +#define EXYNOS5433_PAD_ISOLATION_SYS_PWR_REG (0x1240) +#define EXYNOS5433_PAD_RETENTION_USBXTI_SYS_PWR_REG (0x1244) +#define EXYNOS5433_PAD_RETENTION_BOOTLDO_SYS_PWR_REG (0x1248) +#define EXYNOS5433_PAD_ISOLATION_MIF_SYS_PWR_REG (0x1250) +#define EXYNOS5433_PAD_RETENTION_FSYSGENIO_SYS_PWR_REG (0x1254) +#define EXYNOS5433_PAD_ALV_SEL_SYS_PWR_REG (0x1260) +#define EXYNOS5433_XXTI_SYS_PWR_REG (0x1284) +#define EXYNOS5433_XXTI26_SYS_PWR_REG (0x1288) +#define EXYNOS5433_EXT_REGULATOR_SYS_PWR_REG (0x12C0) +#define EXYNOS5433_GPIO_MODE_SYS_PWR_REG (0x1300) +#define EXYNOS5433_GPIO_MODE_FSYS0_SYS_PWR_REG (0x1304) +#define EXYNOS5433_GPIO_MODE_MIF_SYS_PWR_REG (0x1320) +#define EXYNOS5433_GPIO_MODE_AUD_SYS_PWR_REG (0x1340) +#define EXYNOS5433_GSCL_SYS_PWR_REG (0x1400) +#define EXYNOS5433_CAM0_SYS_PWR_REG (0x1404) +#define EXYNOS5433_MSCL_SYS_PWR_REG (0x1408) +#define EXYNOS5433_G3D_SYS_PWR_REG (0x140C) +#define EXYNOS5433_DISP_SYS_PWR_REG (0x1410) +#define EXYNOS5433_CAM1_SYS_PWR_REG (0x1414) +#define EXYNOS5433_AUD_SYS_PWR_REG (0x1418) +#define EXYNOS5433_FSYS_SYS_PWR_REG (0x141C) +#define EXYNOS5433_BUS2_SYS_PWR_REG (0x1420) +#define EXYNOS5433_G2D_SYS_PWR_REG (0x1424) +#define EXYNOS5433_ISP0_SYS_PWR_REG (0x1428) +#define EXYNOS5433_MFC_SYS_PWR_REG (0x1430) +#define EXYNOS5433_HEVC_SYS_PWR_REG (0x1438) +#define EXYNOS5433_RESET_SLEEP_FSYS_SYS_PWR_REG (0x15DC) +#define EXYNOS5433_RESET_SLEEP_BUS2_SYS_PWR_REG (0x15E0) +#define EXYNOS5433_ATLAS_CPU0_OPTION (0x2008) +#define EXYNOS5433_CPU_OPTION(_nr) (EXYNOS5433_ATLAS_CPU0_OPTION + (_nr) * 0x80) +#define EXYNOS5433_ATLAS_CPU0_DURATION0 (0x2010) +#define EXYNOS5433_CPU_DURATION(_nr) (EXYNOS5433_ATLAS_CPU0_DURATION0 + (_nr) * 0x80) +#define EXYNOS5433_ATLAS_NONCPU_OPTION (0x2408) +#define EXYNOS5433_APOLLO_NONCPU_OPTION (0x2428) +#define EXYNOS5433_ATLAS_CPUSEQUENCER_OPTION (0x2488) +#define EXYNOS5433_ATLAS_L2_OPTION (0x2608) +#define EXYNOS5433_TOP_PWR_MIF_OPTION (0x2CC8) +#define EXYNOS5433_TOP_PWR_OPTION (0x2C48) +#define EXYNOS5433_PAD_RETENTION_LPDDR3_OPTION (0x3008) #define EXYNOS5433_PAD_RETENTION_AUD_OPTION (0x3028) #define EXYNOS5433_PAD_RETENTION_MMC2_OPTION (0x30C8) #define EXYNOS5433_PAD_RETENTION_TOP_OPTION (0x3108) @@ -660,5 +763,50 @@ #define EXYNOS5433_PAD_RETENTION_BOOTLDO_OPTION (0x3248) #define EXYNOS5433_PAD_RETENTION_UFS_OPTION (0x3268) #define EXYNOS5433_PAD_RETENTION_FSYSGENIO_OPTION (0x32A8) +#define EXYNOS5433_PS_HOLD_CONTROL (0x330C) +#define EXYNOS5433_GSCL_OPTION (0x4008) +#define EXYNOS5433_CAM0_OPTION (0x4028) +#define EXYNOS5433_MSCL_OPTION (0x4048) +#define EXYNOS5433_G3D_OPTION (0x4068) +#define EXYNOS5433_DISP_OPTION (0x4088) +#define EXYNOS5433_AUD_OPTION (0x40C8) +#define EXYNOS5433_FSYS_OPTION (0x40E8) +#define EXYNOS5433_BUS2_OPTION (0x4108) +#define EXYNOS5433_G2D_OPTION (0x4128) +#define EXYNOS5433_ISP_OPTION (0x4148) +#define EXYNOS5433_MFC_OPTION (0x4188) +#define EXYNOS5433_HEVC_OPTION (0x41C8) + +/* EXYNOS5433_PMU_SPARE0 */ +#define EXYNOS5433_EN_NONRET_RESET (1 << 0) + +/* EXYNOS5433_CENTRAL_SEQ_CONFIGURATION */ +#define EXYNOS5433_CENTRALSEQ_PWR_CFG (0x1 << 16) + +/* EXYNOS5433_ATLAS_L2_OPTION */ +#define EXYNOS5433_USE_DEACTIVATE_ACE (0x1 << 19) +#define EXYNOS5433_USE_DEACTIVATE_ACP (0x1 << 18) +#define EXYNOS5433_USE_AUTO_L2FLUSHREQ (0x1 << 17) +#define EXYNOS5433_USE_STANDBYWFIL2 (0x1 << 16) +#define EXYNOS5433_USE_RETENTION (0x1 << 4) + +/* EXYNOS5433_CPU_OPTION */ +#define EXYNOS5433_USE_SMPEN (0x1 << 28) +#define EXYNOS5433_USE_STANDBYWFE (0x1 << 24) +#define EXYNOS5433_USE_STANDBYWFI (0x1 << 16) + +/* EXYNOS5433_PAD_RETENTION_*_OPTION */ +#define EXYNOS5433_INITIATE_WAKEUP_FROM_LOWPOWER (0x1 << 28) + +/* EXYNOS5433_CPU_DURATION */ +#define EXYNOS5433_DUR_WAIT_RESET (0xF << 20) +#define EXYNOS5433_DUR_SCALL (0xF << 4) +#define EXYNOS5433_DUR_SCALL_VALUE (0x1 << 4) + +/* EXYNOS5433_ATLAS_CPUSEQUENCER_OPTION */ +#define EXYNOS5433_SKIP_BLK_PWR_DOWN (0x1 << 8) + +/* EXYNOS5433_UP_SCHEDULER */ +#define EXYNOS5433_ENABLE_ATLAS_CPU (0x1 << 0) #endif /* __LINUX_SOC_EXYNOS_REGS_PMU_H */