1c9347101SJongpill Lee /* 20d713cf1SBartlomiej Zolnierkiewicz * Copyright (c) 2011-2014 Samsung Electronics Co., Ltd. 383014579SKukjin Kim * http://www.samsung.com 483014579SKukjin Kim * 5c9347101SJongpill Lee * EXYNOS - Power Management support 683014579SKukjin Kim * 783014579SKukjin Kim * Based on arch/arm/mach-s3c2410/pm.c 883014579SKukjin Kim * Copyright (c) 2006 Simtec Electronics 983014579SKukjin Kim * Ben Dooks <ben@simtec.co.uk> 1083014579SKukjin Kim * 1183014579SKukjin Kim * This program is free software; you can redistribute it and/or modify 1283014579SKukjin Kim * it under the terms of the GNU General Public License version 2 as 1383014579SKukjin Kim * published by the Free Software Foundation. 1483014579SKukjin Kim */ 1583014579SKukjin Kim 1683014579SKukjin Kim #include <linux/init.h> 1783014579SKukjin Kim #include <linux/suspend.h> 1885f9f908SDaniel Lezcano #include <linux/cpu_pm.h> 1983014579SKukjin Kim #include <linux/io.h> 20a4781441SPankaj Dubey #include <linux/of.h> 212262d6efSPankaj Dubey #include <linux/soc/samsung/exynos-regs-pmu.h> 222262d6efSPankaj Dubey #include <linux/soc/samsung/exynos-pmu.h> 2383014579SKukjin Kim 242b9d9c32STomasz Figa #include <asm/firmware.h> 2563b870f1SShawn Guo #include <asm/smp_scu.h> 26d710aa31STomasz Figa #include <asm/suspend.h> 27af997114SBartlomiej Zolnierkiewicz #include <asm/cacheflush.h> 2883014579SKukjin Kim 2932b0aa9aSPankaj Dubey #include <mach/map.h> 3032b0aa9aSPankaj Dubey 31ccd458c1SKukjin Kim #include "common.h" 3283014579SKukjin Kim 33134abc29SBartlomiej Zolnierkiewicz static inline void __iomem *exynos_boot_vector_addr(void) 34134abc29SBartlomiej Zolnierkiewicz { 35134abc29SBartlomiej Zolnierkiewicz if (samsung_rev() == EXYNOS4210_REV_1_1) 36134abc29SBartlomiej Zolnierkiewicz return pmu_base_addr + S5P_INFORM7; 37134abc29SBartlomiej Zolnierkiewicz else if (samsung_rev() == EXYNOS4210_REV_1_0) 38134abc29SBartlomiej Zolnierkiewicz return sysram_base_addr + 0x24; 39134abc29SBartlomiej Zolnierkiewicz return pmu_base_addr + S5P_INFORM0; 40134abc29SBartlomiej Zolnierkiewicz } 41134abc29SBartlomiej Zolnierkiewicz 42134abc29SBartlomiej Zolnierkiewicz static inline void __iomem *exynos_boot_vector_flag(void) 43134abc29SBartlomiej Zolnierkiewicz { 44134abc29SBartlomiej Zolnierkiewicz if (samsung_rev() == EXYNOS4210_REV_1_1) 45134abc29SBartlomiej Zolnierkiewicz return pmu_base_addr + S5P_INFORM6; 46134abc29SBartlomiej Zolnierkiewicz else if (samsung_rev() == EXYNOS4210_REV_1_0) 47134abc29SBartlomiej Zolnierkiewicz return sysram_base_addr + 0x20; 48134abc29SBartlomiej Zolnierkiewicz return pmu_base_addr + S5P_INFORM1; 49134abc29SBartlomiej Zolnierkiewicz } 503681bafeSDaniel Lezcano 513681bafeSDaniel Lezcano #define S5P_CHECK_AFTR 0xFCBA0D10 523681bafeSDaniel Lezcano 5383014579SKukjin Kim /* For Cortex-A9 Diagnostic and Power control register */ 5483014579SKukjin Kim static unsigned int save_arm_register[2]; 5583014579SKukjin Kim 560d713cf1SBartlomiej Zolnierkiewicz void exynos_cpu_save_register(void) 57309e08c4SDaniel Lezcano { 58309e08c4SDaniel Lezcano unsigned long tmp; 59309e08c4SDaniel Lezcano 60309e08c4SDaniel Lezcano /* Save Power control register */ 61309e08c4SDaniel Lezcano asm ("mrc p15, 0, %0, c15, c0, 0" 62309e08c4SDaniel Lezcano : "=r" (tmp) : : "cc"); 63309e08c4SDaniel Lezcano 64309e08c4SDaniel Lezcano save_arm_register[0] = tmp; 65309e08c4SDaniel Lezcano 66309e08c4SDaniel Lezcano /* Save Diagnostic register */ 67309e08c4SDaniel Lezcano asm ("mrc p15, 0, %0, c15, c0, 1" 68309e08c4SDaniel Lezcano : "=r" (tmp) : : "cc"); 69309e08c4SDaniel Lezcano 70309e08c4SDaniel Lezcano save_arm_register[1] = tmp; 71309e08c4SDaniel Lezcano } 72309e08c4SDaniel Lezcano 730d713cf1SBartlomiej Zolnierkiewicz void exynos_cpu_restore_register(void) 74309e08c4SDaniel Lezcano { 75309e08c4SDaniel Lezcano unsigned long tmp; 76309e08c4SDaniel Lezcano 77309e08c4SDaniel Lezcano /* Restore Power control register */ 78309e08c4SDaniel Lezcano tmp = save_arm_register[0]; 79309e08c4SDaniel Lezcano 80309e08c4SDaniel Lezcano asm volatile ("mcr p15, 0, %0, c15, c0, 0" 81309e08c4SDaniel Lezcano : : "r" (tmp) 82309e08c4SDaniel Lezcano : "cc"); 83309e08c4SDaniel Lezcano 84309e08c4SDaniel Lezcano /* Restore Diagnostic register */ 85309e08c4SDaniel Lezcano tmp = save_arm_register[1]; 86309e08c4SDaniel Lezcano 87309e08c4SDaniel Lezcano asm volatile ("mcr p15, 0, %0, c15, c0, 1" 88309e08c4SDaniel Lezcano : : "r" (tmp) 89309e08c4SDaniel Lezcano : "cc"); 90309e08c4SDaniel Lezcano } 91309e08c4SDaniel Lezcano 920d713cf1SBartlomiej Zolnierkiewicz void exynos_pm_central_suspend(void) 9301601b34STomasz Figa { 9401601b34STomasz Figa unsigned long tmp; 9501601b34STomasz Figa 9601601b34STomasz Figa /* Setting Central Sequence Register for power down mode */ 9701601b34STomasz Figa tmp = pmu_raw_readl(S5P_CENTRAL_SEQ_CONFIGURATION); 9801601b34STomasz Figa tmp &= ~S5P_CENTRAL_LOWPWR_CFG; 9901601b34STomasz Figa pmu_raw_writel(tmp, S5P_CENTRAL_SEQ_CONFIGURATION); 10001601b34STomasz Figa } 10101601b34STomasz Figa 1020d713cf1SBartlomiej Zolnierkiewicz int exynos_pm_central_resume(void) 10301601b34STomasz Figa { 10401601b34STomasz Figa unsigned long tmp; 10501601b34STomasz Figa 10601601b34STomasz Figa /* 10701601b34STomasz Figa * If PMU failed while entering sleep mode, WFI will be 10801601b34STomasz Figa * ignored by PMU and then exiting cpu_do_idle(). 10901601b34STomasz Figa * S5P_CENTRAL_LOWPWR_CFG bit will not be set automatically 11001601b34STomasz Figa * in this situation. 11101601b34STomasz Figa */ 11201601b34STomasz Figa tmp = pmu_raw_readl(S5P_CENTRAL_SEQ_CONFIGURATION); 11301601b34STomasz Figa if (!(tmp & S5P_CENTRAL_LOWPWR_CFG)) { 11401601b34STomasz Figa tmp |= S5P_CENTRAL_LOWPWR_CFG; 11501601b34STomasz Figa pmu_raw_writel(tmp, S5P_CENTRAL_SEQ_CONFIGURATION); 11601601b34STomasz Figa /* clear the wakeup state register */ 11701601b34STomasz Figa pmu_raw_writel(0x0, S5P_WAKEUP_STAT); 11801601b34STomasz Figa /* No need to perform below restore code */ 11901601b34STomasz Figa return -1; 12001601b34STomasz Figa } 12101601b34STomasz Figa 12201601b34STomasz Figa return 0; 12301601b34STomasz Figa } 12401601b34STomasz Figa 12501601b34STomasz Figa /* Ext-GIC nIRQ/nFIQ is the only wakeup source in AFTR */ 12601601b34STomasz Figa static void exynos_set_wakeupmask(long mask) 12701601b34STomasz Figa { 12801601b34STomasz Figa pmu_raw_writel(mask, S5P_WAKEUP_MASK); 12989366409SBartlomiej Zolnierkiewicz if (soc_is_exynos3250()) 13089366409SBartlomiej Zolnierkiewicz pmu_raw_writel(0x0, S5P_WAKEUP_MASK2); 13101601b34STomasz Figa } 13201601b34STomasz Figa 13301601b34STomasz Figa static void exynos_cpu_set_boot_vector(long flags) 13401601b34STomasz Figa { 13564fc2a94SFlorian Fainelli writel_relaxed(__pa_symbol(exynos_cpu_resume), 136134abc29SBartlomiej Zolnierkiewicz exynos_boot_vector_addr()); 137d0ceee0bSBen Dooks writel_relaxed(flags, exynos_boot_vector_flag()); 13801601b34STomasz Figa } 13901601b34STomasz Figa 14001601b34STomasz Figa static int exynos_aftr_finisher(unsigned long flags) 14101601b34STomasz Figa { 142a135e201SBartlomiej Zolnierkiewicz int ret; 143a135e201SBartlomiej Zolnierkiewicz 14489366409SBartlomiej Zolnierkiewicz exynos_set_wakeupmask(soc_is_exynos3250() ? 0x40003ffe : 0x0000ff3e); 14501601b34STomasz Figa /* Set value of power down register for aftr mode */ 14601601b34STomasz Figa exynos_sys_powerdown_conf(SYS_AFTR); 147a135e201SBartlomiej Zolnierkiewicz 148a135e201SBartlomiej Zolnierkiewicz ret = call_firmware_op(do_idle, FW_DO_IDLE_AFTR); 149a135e201SBartlomiej Zolnierkiewicz if (ret == -ENOSYS) { 150a135e201SBartlomiej Zolnierkiewicz if (read_cpuid_part() == ARM_CPU_PART_CORTEX_A9) 151a135e201SBartlomiej Zolnierkiewicz exynos_cpu_save_register(); 152a135e201SBartlomiej Zolnierkiewicz exynos_cpu_set_boot_vector(S5P_CHECK_AFTR); 15301601b34STomasz Figa cpu_do_idle(); 154a135e201SBartlomiej Zolnierkiewicz } 15501601b34STomasz Figa 15601601b34STomasz Figa return 1; 15701601b34STomasz Figa } 15801601b34STomasz Figa 15901601b34STomasz Figa void exynos_enter_aftr(void) 16001601b34STomasz Figa { 16189366409SBartlomiej Zolnierkiewicz unsigned int cpuid = smp_processor_id(); 16289366409SBartlomiej Zolnierkiewicz 16301601b34STomasz Figa cpu_pm_enter(); 16401601b34STomasz Figa 16589366409SBartlomiej Zolnierkiewicz if (soc_is_exynos3250()) 16689366409SBartlomiej Zolnierkiewicz exynos_set_boot_flag(cpuid, C2_STATE); 16789366409SBartlomiej Zolnierkiewicz 16801601b34STomasz Figa exynos_pm_central_suspend(); 16901601b34STomasz Figa 170865e8b76SBartlomiej Zolnierkiewicz if (of_machine_is_compatible("samsung,exynos4212") || 171865e8b76SBartlomiej Zolnierkiewicz of_machine_is_compatible("samsung,exynos4412")) { 172865e8b76SBartlomiej Zolnierkiewicz /* Setting SEQ_OPTION register */ 173865e8b76SBartlomiej Zolnierkiewicz pmu_raw_writel(S5P_USE_STANDBY_WFI0 | S5P_USE_STANDBY_WFE0, 174865e8b76SBartlomiej Zolnierkiewicz S5P_CENTRAL_SEQ_OPTION); 175865e8b76SBartlomiej Zolnierkiewicz } 176865e8b76SBartlomiej Zolnierkiewicz 17701601b34STomasz Figa cpu_suspend(0, exynos_aftr_finisher); 17801601b34STomasz Figa 17901601b34STomasz Figa if (read_cpuid_part() == ARM_CPU_PART_CORTEX_A9) { 18001601b34STomasz Figa scu_enable(S5P_VA_SCU); 181a135e201SBartlomiej Zolnierkiewicz if (call_firmware_op(resume) == -ENOSYS) 18201601b34STomasz Figa exynos_cpu_restore_register(); 18301601b34STomasz Figa } 18401601b34STomasz Figa 18501601b34STomasz Figa exynos_pm_central_resume(); 18601601b34STomasz Figa 18789366409SBartlomiej Zolnierkiewicz if (soc_is_exynos3250()) 18889366409SBartlomiej Zolnierkiewicz exynos_clear_boot_flag(cpuid, C2_STATE); 18989366409SBartlomiej Zolnierkiewicz 19001601b34STomasz Figa cpu_pm_exit(); 19101601b34STomasz Figa } 192712eddf7SBartlomiej Zolnierkiewicz 193cfdda353SBartlomiej Zolnierkiewicz #if defined(CONFIG_SMP) && defined(CONFIG_ARM_EXYNOS_CPUIDLE) 194712eddf7SBartlomiej Zolnierkiewicz static atomic_t cpu1_wakeup = ATOMIC_INIT(0); 195712eddf7SBartlomiej Zolnierkiewicz 196712eddf7SBartlomiej Zolnierkiewicz static int exynos_cpu0_enter_aftr(void) 197712eddf7SBartlomiej Zolnierkiewicz { 198712eddf7SBartlomiej Zolnierkiewicz int ret = -1; 199712eddf7SBartlomiej Zolnierkiewicz 200712eddf7SBartlomiej Zolnierkiewicz /* 201712eddf7SBartlomiej Zolnierkiewicz * If the other cpu is powered on, we have to power it off, because 202712eddf7SBartlomiej Zolnierkiewicz * the AFTR state won't work otherwise 203712eddf7SBartlomiej Zolnierkiewicz */ 204712eddf7SBartlomiej Zolnierkiewicz if (cpu_online(1)) { 205712eddf7SBartlomiej Zolnierkiewicz /* 206712eddf7SBartlomiej Zolnierkiewicz * We reach a sync point with the coupled idle state, we know 207712eddf7SBartlomiej Zolnierkiewicz * the other cpu will power down itself or will abort the 208712eddf7SBartlomiej Zolnierkiewicz * sequence, let's wait for one of these to happen 209712eddf7SBartlomiej Zolnierkiewicz */ 210712eddf7SBartlomiej Zolnierkiewicz while (exynos_cpu_power_state(1)) { 211af997114SBartlomiej Zolnierkiewicz unsigned long boot_addr; 212af997114SBartlomiej Zolnierkiewicz 213712eddf7SBartlomiej Zolnierkiewicz /* 214712eddf7SBartlomiej Zolnierkiewicz * The other cpu may skip idle and boot back 215712eddf7SBartlomiej Zolnierkiewicz * up again 216712eddf7SBartlomiej Zolnierkiewicz */ 217712eddf7SBartlomiej Zolnierkiewicz if (atomic_read(&cpu1_wakeup)) 218712eddf7SBartlomiej Zolnierkiewicz goto abort; 219712eddf7SBartlomiej Zolnierkiewicz 220712eddf7SBartlomiej Zolnierkiewicz /* 221712eddf7SBartlomiej Zolnierkiewicz * The other cpu may bounce through idle and 222712eddf7SBartlomiej Zolnierkiewicz * boot back up again, getting stuck in the 223712eddf7SBartlomiej Zolnierkiewicz * boot rom code 224712eddf7SBartlomiej Zolnierkiewicz */ 225af997114SBartlomiej Zolnierkiewicz ret = exynos_get_boot_addr(1, &boot_addr); 226af997114SBartlomiej Zolnierkiewicz if (ret) 227af997114SBartlomiej Zolnierkiewicz goto fail; 228af997114SBartlomiej Zolnierkiewicz ret = -1; 229af997114SBartlomiej Zolnierkiewicz if (boot_addr == 0) 230712eddf7SBartlomiej Zolnierkiewicz goto abort; 231712eddf7SBartlomiej Zolnierkiewicz 232712eddf7SBartlomiej Zolnierkiewicz cpu_relax(); 233712eddf7SBartlomiej Zolnierkiewicz } 234712eddf7SBartlomiej Zolnierkiewicz } 235712eddf7SBartlomiej Zolnierkiewicz 236712eddf7SBartlomiej Zolnierkiewicz exynos_enter_aftr(); 237712eddf7SBartlomiej Zolnierkiewicz ret = 0; 238712eddf7SBartlomiej Zolnierkiewicz 239712eddf7SBartlomiej Zolnierkiewicz abort: 240712eddf7SBartlomiej Zolnierkiewicz if (cpu_online(1)) { 24164fc2a94SFlorian Fainelli unsigned long boot_addr = __pa_symbol(exynos_cpu_resume); 242af997114SBartlomiej Zolnierkiewicz 243712eddf7SBartlomiej Zolnierkiewicz /* 244712eddf7SBartlomiej Zolnierkiewicz * Set the boot vector to something non-zero 245712eddf7SBartlomiej Zolnierkiewicz */ 246af997114SBartlomiej Zolnierkiewicz ret = exynos_set_boot_addr(1, boot_addr); 247af997114SBartlomiej Zolnierkiewicz if (ret) 248af997114SBartlomiej Zolnierkiewicz goto fail; 249712eddf7SBartlomiej Zolnierkiewicz dsb(); 250712eddf7SBartlomiej Zolnierkiewicz 251712eddf7SBartlomiej Zolnierkiewicz /* 252712eddf7SBartlomiej Zolnierkiewicz * Turn on cpu1 and wait for it to be on 253712eddf7SBartlomiej Zolnierkiewicz */ 254712eddf7SBartlomiej Zolnierkiewicz exynos_cpu_power_up(1); 255712eddf7SBartlomiej Zolnierkiewicz while (exynos_cpu_power_state(1) != S5P_CORE_LOCAL_PWR_EN) 256712eddf7SBartlomiej Zolnierkiewicz cpu_relax(); 257712eddf7SBartlomiej Zolnierkiewicz 258af997114SBartlomiej Zolnierkiewicz if (soc_is_exynos3250()) { 259af997114SBartlomiej Zolnierkiewicz while (!pmu_raw_readl(S5P_PMU_SPARE2) && 260af997114SBartlomiej Zolnierkiewicz !atomic_read(&cpu1_wakeup)) 261af997114SBartlomiej Zolnierkiewicz cpu_relax(); 262af997114SBartlomiej Zolnierkiewicz 263af997114SBartlomiej Zolnierkiewicz if (!atomic_read(&cpu1_wakeup)) 264af997114SBartlomiej Zolnierkiewicz exynos_core_restart(1); 265af997114SBartlomiej Zolnierkiewicz } 266af997114SBartlomiej Zolnierkiewicz 267712eddf7SBartlomiej Zolnierkiewicz while (!atomic_read(&cpu1_wakeup)) { 268af997114SBartlomiej Zolnierkiewicz smp_rmb(); 269af997114SBartlomiej Zolnierkiewicz 270712eddf7SBartlomiej Zolnierkiewicz /* 271712eddf7SBartlomiej Zolnierkiewicz * Poke cpu1 out of the boot rom 272712eddf7SBartlomiej Zolnierkiewicz */ 273712eddf7SBartlomiej Zolnierkiewicz 274af997114SBartlomiej Zolnierkiewicz ret = exynos_set_boot_addr(1, boot_addr); 275af997114SBartlomiej Zolnierkiewicz if (ret) 276af997114SBartlomiej Zolnierkiewicz goto fail; 277af997114SBartlomiej Zolnierkiewicz 278af997114SBartlomiej Zolnierkiewicz call_firmware_op(cpu_boot, 1); 279af997114SBartlomiej Zolnierkiewicz 280af997114SBartlomiej Zolnierkiewicz if (soc_is_exynos3250()) 281af997114SBartlomiej Zolnierkiewicz dsb_sev(); 282af997114SBartlomiej Zolnierkiewicz else 283712eddf7SBartlomiej Zolnierkiewicz arch_send_wakeup_ipi_mask(cpumask_of(1)); 284712eddf7SBartlomiej Zolnierkiewicz } 285712eddf7SBartlomiej Zolnierkiewicz } 286af997114SBartlomiej Zolnierkiewicz fail: 287712eddf7SBartlomiej Zolnierkiewicz return ret; 288712eddf7SBartlomiej Zolnierkiewicz } 289712eddf7SBartlomiej Zolnierkiewicz 290712eddf7SBartlomiej Zolnierkiewicz static int exynos_wfi_finisher(unsigned long flags) 291712eddf7SBartlomiej Zolnierkiewicz { 292af997114SBartlomiej Zolnierkiewicz if (soc_is_exynos3250()) 293af997114SBartlomiej Zolnierkiewicz flush_cache_all(); 294712eddf7SBartlomiej Zolnierkiewicz cpu_do_idle(); 295712eddf7SBartlomiej Zolnierkiewicz 296712eddf7SBartlomiej Zolnierkiewicz return -1; 297712eddf7SBartlomiej Zolnierkiewicz } 298712eddf7SBartlomiej Zolnierkiewicz 299712eddf7SBartlomiej Zolnierkiewicz static int exynos_cpu1_powerdown(void) 300712eddf7SBartlomiej Zolnierkiewicz { 301712eddf7SBartlomiej Zolnierkiewicz int ret = -1; 302712eddf7SBartlomiej Zolnierkiewicz 303712eddf7SBartlomiej Zolnierkiewicz /* 304712eddf7SBartlomiej Zolnierkiewicz * Idle sequence for cpu1 305712eddf7SBartlomiej Zolnierkiewicz */ 306712eddf7SBartlomiej Zolnierkiewicz if (cpu_pm_enter()) 307712eddf7SBartlomiej Zolnierkiewicz goto cpu1_aborted; 308712eddf7SBartlomiej Zolnierkiewicz 309712eddf7SBartlomiej Zolnierkiewicz /* 310712eddf7SBartlomiej Zolnierkiewicz * Turn off cpu 1 311712eddf7SBartlomiej Zolnierkiewicz */ 312712eddf7SBartlomiej Zolnierkiewicz exynos_cpu_power_down(1); 313712eddf7SBartlomiej Zolnierkiewicz 314af997114SBartlomiej Zolnierkiewicz if (soc_is_exynos3250()) 315af997114SBartlomiej Zolnierkiewicz pmu_raw_writel(0, S5P_PMU_SPARE2); 316af997114SBartlomiej Zolnierkiewicz 317712eddf7SBartlomiej Zolnierkiewicz ret = cpu_suspend(0, exynos_wfi_finisher); 318712eddf7SBartlomiej Zolnierkiewicz 319712eddf7SBartlomiej Zolnierkiewicz cpu_pm_exit(); 320712eddf7SBartlomiej Zolnierkiewicz 321712eddf7SBartlomiej Zolnierkiewicz cpu1_aborted: 322712eddf7SBartlomiej Zolnierkiewicz dsb(); 323712eddf7SBartlomiej Zolnierkiewicz /* 324712eddf7SBartlomiej Zolnierkiewicz * Notify cpu 0 that cpu 1 is awake 325712eddf7SBartlomiej Zolnierkiewicz */ 326712eddf7SBartlomiej Zolnierkiewicz atomic_set(&cpu1_wakeup, 1); 327712eddf7SBartlomiej Zolnierkiewicz 328712eddf7SBartlomiej Zolnierkiewicz return ret; 329712eddf7SBartlomiej Zolnierkiewicz } 330712eddf7SBartlomiej Zolnierkiewicz 331712eddf7SBartlomiej Zolnierkiewicz static void exynos_pre_enter_aftr(void) 332712eddf7SBartlomiej Zolnierkiewicz { 33364fc2a94SFlorian Fainelli unsigned long boot_addr = __pa_symbol(exynos_cpu_resume); 334af997114SBartlomiej Zolnierkiewicz 335af997114SBartlomiej Zolnierkiewicz (void)exynos_set_boot_addr(1, boot_addr); 336712eddf7SBartlomiej Zolnierkiewicz } 337712eddf7SBartlomiej Zolnierkiewicz 338712eddf7SBartlomiej Zolnierkiewicz static void exynos_post_enter_aftr(void) 339712eddf7SBartlomiej Zolnierkiewicz { 340712eddf7SBartlomiej Zolnierkiewicz atomic_set(&cpu1_wakeup, 0); 341712eddf7SBartlomiej Zolnierkiewicz } 342712eddf7SBartlomiej Zolnierkiewicz 343712eddf7SBartlomiej Zolnierkiewicz struct cpuidle_exynos_data cpuidle_coupled_exynos_data = { 344712eddf7SBartlomiej Zolnierkiewicz .cpu0_enter_aftr = exynos_cpu0_enter_aftr, 345712eddf7SBartlomiej Zolnierkiewicz .cpu1_powerdown = exynos_cpu1_powerdown, 346712eddf7SBartlomiej Zolnierkiewicz .pre_enter_aftr = exynos_pre_enter_aftr, 347712eddf7SBartlomiej Zolnierkiewicz .post_enter_aftr = exynos_post_enter_aftr, 348712eddf7SBartlomiej Zolnierkiewicz }; 349cfdda353SBartlomiej Zolnierkiewicz #endif /* CONFIG_SMP && CONFIG_ARM_EXYNOS_CPUIDLE */ 350