static int exynos4_pm_suspend(void) { unsigned long tmp; if (!exynos4_is_c2c_use()) s3c_pm_do_save(exynos4_core_save, ARRAY_SIZE(exynos4_core_save)); s3c_pm_do_save(exynos4_l2cc_save, ARRAY_SIZE(exynos4_l2cc_save)); /* Setting Central Sequence Register for power down mode */ tmp = __raw_readl(S5P_CENTRAL_SEQ_CONFIGURATION); tmp &= ~(S5P_CENTRAL_LOWPWR_CFG); __raw_writel(tmp, S5P_CENTRAL_SEQ_CONFIGURATION); /* When enter sleep mode, USE_DELAYED_RESET_ASSERTION have to disable */ if (!soc_is_exynos4210()) exynos4_reset_assert_ctrl(0); if (!soc_is_exynos4210()) { tmp = S5P_USE_STANDBY_WFI0 | S5P_USE_STANDBY_WFE0; __raw_writel(tmp, S5P_CENTRAL_SEQ_OPTION); if (exynos4_is_c2c_use()) { tmp = __raw_readl(S5P_WAKEUP_MASK_COREBLK); tmp &= ~(1 << 20); __raw_writel(tmp, S5P_WAKEUP_MASK_COREBLK); tmp = __raw_readl(S5P_CENTRAL_SEQ_CONFIGURATION_COREBLK); tmp &= ~S5P_CENTRAL_SEQ_COREBLK_CONF; __raw_writel(tmp, S5P_CENTRAL_SEQ_CONFIGURATION_COREBLK); } } return 0; }
int s5p_irq_suspend(struct sys_device *dev, pm_message_t state) { s3c_pm_do_save(eint_save, ARRAY_SIZE(eint_save)); s3c_pm_do_save(irq_save, ARRAY_SIZE(irq_save)); return 0; }
void s3c_pm_save_core(void) { s3c_pm_do_save(sromc_save, ARRAY_SIZE(sromc_save)); s3c_pm_do_save(core_save, ARRAY_SIZE(core_save)); s3c_pm_do_save(gpio_save_ext, ARRAY_SIZE(gpio_save_ext)); s3c_pm_do_save(gpio_save_gpio_int, ARRAY_SIZE(gpio_save_gpio_int)); s3c_pm_do_save(irq_save, ARRAY_SIZE(irq_save)); }
static int exynos4210_clock_suspend(void) { s3c_pm_do_save(exynos4210_clock_save, ARRAY_SIZE(exynos4210_clock_save)); s3c_pm_do_save(exynos4210_epll_save, ARRAY_SIZE(exynos4210_epll_save)); s3c_pm_do_save(exynos4210_vpll_save, ARRAY_SIZE(exynos4210_vpll_save)); return 0; }
static int exynos4212_clock_suspend(void) { s3c_pm_do_save(exynos4212_clock_save, ARRAY_SIZE(exynos4212_clock_save)); s3c_pm_do_save(exynos4212_vpll_save, ARRAY_SIZE(exynos4212_vpll_save)); #if (defined(CONFIG_MACH_M0) && defined(CONFIG_TARGET_LOCALE_EUR)) || \ ((defined(CONFIG_MACH_C1) || defined(CONFIG_MACH_M0)) && \ defined(CONFIG_TARGET_LOCALE_KOR)) s3c_pm_do_save(exynos4212_epll_save, ARRAY_SIZE(exynos4212_epll_save)); #endif return 0; }
static int exynos3_pd_lcd0_clk_enable_off(struct exynos_pm_domain *domain) { unsigned int tmp; DEBUG_PRINT_INFO("%s pre power off\n", "LCD"); s3c_pm_do_save(exynos_pd_lcd0_clk_save, ARRAY_SIZE(exynos_pd_lcd0_clk_save)); tmp = __raw_readl(EXYNOS3_CLKSRC_MASK_LCD); tmp |= ((0x1 << 12)|(0x1)); __raw_writel(tmp, EXYNOS3_CLKSRC_MASK_LCD); tmp = __raw_readl(EXYNOS3_CLKGATE_BUS_LCD); tmp |= ((0x7F << 14)|(0x3 << 9)|(0x1F << 3)|(0x1)); __raw_writel(tmp, EXYNOS3_CLKGATE_BUS_LCD); tmp = __raw_readl(EXYNOS3_CLKGATE_SCLK_LCD); tmp |= ((0x3 << 3)|(0x3)); __raw_writel(tmp, EXYNOS3_CLKGATE_SCLK_LCD); tmp = __raw_readl(EXYNOS3_CLKGATE_IP_LCD); tmp |= ((0x3F << 2)|(0x1)); __raw_writel(tmp, EXYNOS3_CLKGATE_IP_LCD); return 0; }
static int exynos5_pm_suspend(void) { unsigned long tmp; s3c_pm_do_save(exynos5_core_save, ARRAY_SIZE(exynos5_core_save)); if (!(__raw_readl(EXYNOS5_ISP_STATUS) & S5P_INT_LOCAL_PWR_EN)) { isp_pwr_off = true; /* * Before enter suspend, ISP power domain should be on */ __raw_writel(S5P_INT_LOCAL_PWR_EN, EXYNOS5_ISP_CONFIGURATION); } tmp = __raw_readl(EXYNOS5_CENTRAL_SEQ_CONFIGURATION); tmp &= ~(EXYNOS5_CENTRAL_LOWPWR_CFG); __raw_writel(tmp, EXYNOS5_CENTRAL_SEQ_CONFIGURATION); tmp = __raw_readl(EXYNOS5_CENTRAL_SEQ_OPTION); tmp = (EXYNOS5_USE_STANDBYWFI_ARM_CORE0 | EXYNOS5_USE_STANDBYWFE_ARM_CORE0); __raw_writel(tmp, EXYNOS5_CENTRAL_SEQ_OPTION); return 0; }
static int exynos3_pd_cam_clk_enable_off(struct exynos_pm_domain *domain) { unsigned int tmp; DEBUG_PRINT_INFO("%s pre power off\n", "CAM"); s3c_pm_do_save(exynos_pd_cam_clk_save, ARRAY_SIZE(exynos_pd_cam_clk_save)); tmp = __raw_readl(EXYNOS3_CLKSRC_MASK_CAM); tmp |= ((0x1 << 20)|(0x1)); __raw_writel(tmp, EXYNOS3_CLKSRC_MASK_CAM); tmp = __raw_readl(EXYNOS3_CLKGATE_BUS_CAM0); tmp |= ((0x3 << 29)|(0x1 << 27)|(0xF << 22)|(0x7 << 18)|(0x3 << 14)|(0x7 << 10)|(0xF << 5)|(0x7)); __raw_writel(tmp, EXYNOS3_CLKGATE_BUS_CAM0); tmp = __raw_readl(EXYNOS3_CLKGATE_BUS_CAM1); tmp |= ((0xF << 10)|(0x7)); __raw_writel(tmp, EXYNOS3_CLKGATE_BUS_CAM1); tmp = __raw_readl(EXYNOS3_CLKGATE_SCLK_CAM); tmp |= (0x1 << 8); __raw_writel(tmp, EXYNOS3_CLKGATE_SCLK_CAM); tmp = __raw_readl(EXYNOS3_CLKGATE_IP_CAM); tmp |= ((0xF << 16)|(0xF << 11)|(0xF << 6)|(0x7)); __raw_writel(tmp, EXYNOS3_CLKGATE_IP_CAM); return 0; }
static int s3c_keypad_suspend(struct platform_device *dev, pm_message_t state) { #if defined(CONFIG_MACH_CHIEF) && !defined(CONFIG_TIKAL_MPCS) struct s3c_keypad *s3c_keypad; #endif keyifcon = readl(key_base+S3C_KEYIFCON); keyiffc = readl(key_base+S3C_KEYIFFC); #if defined(CONFIG_TIKAL_MPCS) enable_irq_wake(IRQ_KEYPAD); keyled_timer_stop(); /* keypad_led */ #elif defined(CONFIG_MACH_STEALTHV) if((during_call==1)&&(volume_key_wakeup==0)){ enable_irq_wake(IRQ_KEYPAD); volume_key_wakeup=1; } else if((during_call==0)&&(volume_key_wakeup==1)){ disable_irq_wake(IRQ_KEYPAD); volume_key_wakeup=0; } #else s3c_pm_do_save(s3c_keypad_save, ARRAY_SIZE(s3c_keypad_save)); //writel(~(0xfffffff), KEYPAD_ROW_GPIOCON); //writel(~(0xfffffff), KEYPAD_COL_GPIOCON); disable_irq(IRQ_KEYPAD); clk_disable(keypad_clock); #if defined(CONFIG_MACH_CHIEF) && !defined(CONFIG_TIKAL_MPCS) if((during_call == 1) && (volume_key_wakeup == 0)){ s3c_keypad= platform_get_drvdata(dev); if(!s3c_keypad){ printk(KERN_INFO "failed to get drv data \n "); return ; } volume_key_wakeup = 1; s3c_keygpio_keysense_isr_setup((void * )s3c_keypad); } else if((during_call == 0) && (volume_key_wakeup == 1)){ disable_irq_wake(gpio_to_irq(S5PV210_GPH3(0))); volume_key_wakeup = 0; printk(KERN_INFO "%s:DISABLE IRQ \n ", __func__); /* Set GPIO Port for keypad mode and pull-up disable*/ s3c_setup_keypad_cfg_gpio(KEYPAD_ROWS, KEYPAD_COLUMNS); } else{ //set gpio during normal sleep s3c_setup_keypad_cfg_gpio_sleep(KEYPAD_ROWS, KEYPAD_COLUMNS); } #endif //#if defined(CONFIG_MACH_CHIEF) && !defined(CONFIG_TIKAL_MPCS) in_sleep = 1; #endif return 0; }
void s3c_pm_save_core(void) { #ifdef CONFIG_ARCH_LBOOK_V3 if (machine_is_lbook_v3()) { s3c2410_gpio_setpin(S3C2410_GPC(6), 1); } #endif s3c_pm_do_save(misc_save, ARRAY_SIZE(misc_save)); s3c_pm_do_save(core_save, ARRAY_SIZE(core_save)); #ifdef CONFIG_ARCH_LBOOK_V3 if (machine_is_lbook_v3()) { s3c2410_gpio_setpin(S3C2410_GPC(6), 1); } #endif }
static void exynos_pm_prepare(void) { exynos_set_delayed_reset_assertion(false); /* Set wake-up mask registers */ exynos_pm_set_wakeup_mask(); s3c_pm_do_save(exynos_core_save, ARRAY_SIZE(exynos_core_save)); if (pm_data->extra_save) s3c_pm_do_save(pm_data->extra_save, pm_data->num_extra_save); exynos_pm_enter_sleep_mode(); /* ensure at least INFORM0 has the resume address */ pmu_raw_writel(virt_to_phys(exynos_cpu_resume), S5P_INFORM0); }
static int exynos5_pm_suspend(void) { unsigned long tmp; u32 timeout; s3c_pm_do_save(exynos5_core_save, ARRAY_SIZE(exynos5_core_save)); s3c_pm_do_save(exynos5_regs_save, ARRAY_SIZE(exynos5_regs_save)); if (samsung_rev() < EXYNOS5250_REV_1_0) { if (!(__raw_readl(EXYNOS5_ISP_STATUS) & S5P_INT_LOCAL_PWR_EN)) { isp_pwr_off = true; /* * Before enter suspend, ISP power domain should be on */ __raw_writel(S5P_INT_LOCAL_PWR_EN, EXYNOS5_ISP_CONFIGURATION); timeout = 1000; while (!(__raw_readl(EXYNOS5_ISP_STATUS) & S5P_INT_LOCAL_PWR_EN)) { if (timeout == 0) { printk(KERN_ERR "ISP power domain can not on\n"); } timeout--; udelay(1); } } } tmp = __raw_readl(EXYNOS5_CENTRAL_SEQ_CONFIGURATION); tmp &= ~(EXYNOS5_CENTRAL_LOWPWR_CFG); __raw_writel(tmp, EXYNOS5_CENTRAL_SEQ_CONFIGURATION); tmp = __raw_readl(EXYNOS5_CENTRAL_SEQ_OPTION); tmp = (EXYNOS5_USE_STANDBYWFI_ARM_CORE0 | EXYNOS5_USE_STANDBYWFE_ARM_CORE0); __raw_writel(tmp, EXYNOS5_CENTRAL_SEQ_OPTION); return 0; }
static void s5pv310_cpu_prepare(void) { s3c_pm_do_save(s5pv310_core_save, ARRAY_SIZE(s5pv310_core_save)); /* Set value of power down register for sleep mode */ s3c_pm_do_restore_core(s5pv310_sleep, ARRAY_SIZE(s5pv310_sleep)); __raw_writel(S5P_CHECK_SLEEP, S5P_INFORM1); /* ensure at least INFORM0 has the resume address */ __raw_writel(virt_to_phys(s3c_cpu_resume), S5P_INFORM0); }
static int s3c24xx_serial_suspend(struct platform_device *dev, pm_message_t state) { struct uart_port *port = s3c24xx_dev_to_port(&dev->dev); if (port) { uart_suspend_port(&s3c24xx_uart_drv, port); s3c_pm_do_save(uart_save + port->line * SAVE_UART_PORT, SAVE_UART_PORT); } return 0; }
int s3c24xx_irq_suspend(struct sys_device *dev, pm_message_t state) { unsigned int i; for (i = 0; i < ARRAY_SIZE(save_extint); i++) save_extint[i] = __raw_readl(S3C24XX_EXTINT0 + (i*4)); for (i = 0; i < ARRAY_SIZE(save_eintflt); i++) save_eintflt[i] = __raw_readl(S3C24XX_EINFLT0 + (i*4)); s3c_pm_do_save(irq_save, ARRAY_SIZE(irq_save)); save_eintmask = __raw_readl(S3C24XX_EINTMASK); return 0; }
int s3c24xx_irq_suspend(void) { unsigned int i; for (i = 0; i < ARRAY_SIZE(save_extint); i++) save_extint[i] = __raw_readl(S3C24XX_EXTINT0 + (i*4)); for (i = 0; i < ARRAY_SIZE(save_eintflt); i++) save_eintflt[i] = __raw_readl(S3C24XX_EINFLT0 + (i*4)); s3c_pm_do_save(irq_save, ARRAY_SIZE(irq_save)); save_eintmask = __raw_readl(S3C24XX_EINTMASK); return 0; }
static int exynos5_asv_suspend(void) { struct asv_info *exynos_asv_info; int i; s3c_pm_do_save(exynos5_abb_save, ARRAY_SIZE(exynos5_abb_save)); for (i = 0; i < ARRAY_SIZE(exynos5_asv_member); i++) { exynos_asv_info = &exynos5_asv_member[i]; exynos_asv_info->ops_cal ->set_abb(exynos_asv_info->asv_type, ABB_BYPASS); } return 0; }
static int exynos3_pd_isp_clk_enable_off(struct exynos_pm_domain *domain) { unsigned int tmp; DEBUG_PRINT_INFO("%s pre power off : save clocks and masking\n", "ISP"); s3c_pm_do_save(exynos_pd_isp_clk_save, ARRAY_SIZE(exynos_pd_isp_clk_save)); tmp = __raw_readl(EXYNOS3_CLKGATE_BUS_ISP0); tmp |= ((0x7 << 27)|(0xF << 21)|(0xFFF << 8)|(0x7F)); __raw_writel(tmp, EXYNOS3_CLKGATE_BUS_ISP0); tmp = __raw_readl(EXYNOS3_CLKGATE_BUS_ISP1); tmp |= ((0x7F << 15)|(0x1 << 4)); __raw_writel(tmp, EXYNOS3_CLKGATE_BUS_ISP1); tmp = __raw_readl(EXYNOS3_CLKGATE_BUS_ISP2); tmp |= ((0x3 << 30)|(0x1 << 28)|(0xF << 23)|(0x3 << 20)|(0x1F << 14)|(0xFFF << 1)); __raw_writel(tmp, EXYNOS3_CLKGATE_BUS_ISP2); tmp = __raw_readl(EXYNOS3_CLKGATE_BUS_ISP3); tmp |= ((0x7F << 15)|(0x3 << 12)|(0x3 << 3)|(0x1)); __raw_writel(tmp, EXYNOS3_CLKGATE_BUS_ISP3); tmp = __raw_readl(EXYNOS3_CLKGATE_IP_ISP0); tmp |= ((0x3 << 30)|(0x1 << 28)|(0xF << 23)|(0x3 << 20)|(0x3FFFF)); __raw_writel(tmp, EXYNOS3_CLKGATE_IP_ISP0); tmp = __raw_readl(EXYNOS3_CLKGATE_IP_ISP1); tmp |= ((0x7F << 15)|(0x3 << 12)|(0x1 << 4)|(0x1)); __raw_writel(tmp, EXYNOS3_CLKGATE_IP_ISP1); tmp = __raw_readl(EXYNOS3_CLKSRC_MASK_ISP); tmp |= ((0x1 << 12)|(0x1 << 8)|(0x3 << 4)); __raw_writel(tmp, EXYNOS3_CLKSRC_MASK_ISP); tmp = __raw_readl(EXYNOS3_CLKGATE_SCLK_TOP_ISP); tmp |= (0xF << 1); __raw_writel(tmp, EXYNOS3_CLKGATE_SCLK_TOP_ISP); tmp = __raw_readl(EXYNOS3_CLKGATE_SCLK_ISP); tmp |= (0x1); __raw_writel(tmp, EXYNOS3_CLKGATE_SCLK_ISP); return 0; }
/* * Suspend */ int s3cfb_suspend(struct platform_device *dev, pm_message_t state) { struct fb_info *fbinfo = platform_get_drvdata(dev); s3cfb_info_t *info = fbinfo->par; s3cfb_stop_lcd(); s3c_pm_do_save(s3c_lcd_save, ARRAY_SIZE(s3c_lcd_save)); /* sleep before disabling the clock, we need to ensure * the LCD DMA engine is not going to get back on the bus * before the clock goes off again (bjd) */ msleep(1); clk_disable(info->clk); return 0; }
static void exynos5420_pm_prepare(void) { unsigned int tmp; /* Set wake-up mask registers */ exynos_pm_set_wakeup_mask(); s3c_pm_do_save(exynos_core_save, ARRAY_SIZE(exynos_core_save)); exynos_pmu_spare3 = pmu_raw_readl(S5P_PMU_SPARE3); /* * The cpu state needs to be saved and restored so that the * secondary CPUs will enter low power start. Though the U-Boot * is setting the cpu state with low power flag, the kernel * needs to restore it back in case, the primary cpu fails to * suspend for any reason. */ exynos5420_cpu_state = __raw_readl(sysram_base_addr + EXYNOS5420_CPU_STATE); exynos_pm_enter_sleep_mode(); /* ensure at least INFORM0 has the resume address */ if (IS_ENABLED(CONFIG_EXYNOS5420_MCPM)) pmu_raw_writel(virt_to_phys(mcpm_entry_point), S5P_INFORM0); tmp = pmu_raw_readl(EXYNOS5_ARM_L2_OPTION); tmp &= ~EXYNOS5_USE_RETENTION; pmu_raw_writel(tmp, EXYNOS5_ARM_L2_OPTION); tmp = pmu_raw_readl(EXYNOS5420_SFR_AXI_CGDIS1); tmp |= EXYNOS5420_UFS; pmu_raw_writel(tmp, EXYNOS5420_SFR_AXI_CGDIS1); tmp = pmu_raw_readl(EXYNOS5420_ARM_COMMON_OPTION); tmp &= ~EXYNOS5420_L2RSTDISABLE_VALUE; pmu_raw_writel(tmp, EXYNOS5420_ARM_COMMON_OPTION); tmp = pmu_raw_readl(EXYNOS5420_FSYS2_OPTION); tmp |= EXYNOS5420_EMULATION; pmu_raw_writel(tmp, EXYNOS5420_FSYS2_OPTION); tmp = pmu_raw_readl(EXYNOS5420_PSGEN_OPTION); tmp |= EXYNOS5420_EMULATION; pmu_raw_writel(tmp, EXYNOS5420_PSGEN_OPTION); }
static int s3c_keypad_suspend(struct platform_device *dev, pm_message_t state) { keyifcon = readl(key_base + S3C_KEYIFCON); keyiffc = readl(key_base + S3C_KEYIFFC); s3c_pm_do_save(s3c_keypad_save, ARRAY_SIZE(s3c_keypad_save)); //writel(~(0xfffffff), KEYPAD_ROW_GPIOCON); //writel(~(0xfffffff), KEYPAD_COL_GPIOCON); disable_irq(IRQ_KEYPAD); clk_disable(keypad_clock); in_sleep = 1; return 0; }
static int exynos3_pd_mfc_clk_enable_off(struct exynos_pm_domain *domain) { unsigned int tmp; DEBUG_PRINT_INFO("%s pre power off\n", "MFC"); s3c_pm_do_save(exynos_pd_mfc_clk_save, ARRAY_SIZE(exynos_pd_mfc_clk_save)); tmp = __raw_readl(EXYNOS3_CLKGATE_BUS_MFC); tmp |= ((0x1 << 19)|(0x7 << 15)|(0x1 << 6)|(0x1 << 4)|(0x3 << 1)); __raw_writel(tmp, EXYNOS3_CLKGATE_BUS_MFC); tmp = __raw_readl(EXYNOS3_CLKGATE_IP_MFC); tmp |= ((0x1 << 5)|(0x1 << 3)|(0x3)); __raw_writel(tmp, EXYNOS3_CLKGATE_IP_MFC); return 0; }
static int exynos3_pd_g3d_clk_enable_off(struct exynos_pm_domain *domain) { unsigned int tmp; DEBUG_PRINT_INFO("%s pre power off\n", "G3D"); s3c_pm_do_save(exynos_pd_g3d_clk_save, ARRAY_SIZE(exynos_pd_g3d_clk_save)); tmp = __raw_readl(EXYNOS3_CLKGATE_BUS_G3D); tmp |= ((0x1 << 18)|(0x1 << 16)|(0x7 << 3)); __raw_writel(tmp, EXYNOS3_CLKGATE_BUS_G3D); tmp = __raw_readl(EXYNOS3_CLKGATE_IP_G3D); tmp |= 0xF; __raw_writel(tmp, EXYNOS3_CLKGATE_IP_G3D); return 0; }
static int s3c64xx_irq_pm_suspend(void) { struct irq_grp_save *grp = eint_grp_save; int i; S3C_PMDBG("%s: suspending IRQs\n", __func__); s3c_pm_do_save(irq_save, ARRAY_SIZE(irq_save)); for (i = 0; i < CONFIG_SERIAL_SAMSUNG_UARTS; i++) irq_uart_mask[i] = __raw_readl(S3C_VA_UARTx(i) + S3C64XX_UINTM); for (i = 0; i < ARRAY_SIZE(eint_grp_save); i++, grp++) { grp->con = __raw_readl(S3C64XX_EINT12CON + (i * 4)); grp->mask = __raw_readl(S3C64XX_EINT12MASK + (i * 4)); grp->fltcon = __raw_readl(S3C64XX_EINT12FLTCON + (i * 4)); } return 0; }
static int s3c244x_suspend(void) { s3c_pm_do_save(s3c244x_sleep, ARRAY_SIZE(s3c244x_sleep)); return 0; }
void s3c2410wdt_save(void) { s3c_pm_do_save(wdt_save, ARRAY_SIZE(wdt_save)); }
static int s3c2412_pm_suspend(struct sys_device *dev, pm_message_t state) { s3c_pm_do_save(s3c2412_sleep, ARRAY_SIZE(s3c2412_sleep)); return 0; }
void s3c_pm_save_core(void) { s3c_pm_do_save(sromc_save, ARRAY_SIZE(sromc_save)); s3c_pm_do_save(core_save, ARRAY_SIZE(core_save)); }
int s3c24xx_irq_suspend(void) { s3c_pm_do_save(eint_save, ARRAY_SIZE(eint_save)); return 0; }
static int exynos5_clock_suspend(void) { s3c_pm_do_save(exynos5_clock_save, ARRAY_SIZE(exynos5_clock_save)); return 0; }