1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef _ASM_SH_SUSPEND_H 3*4882a593Smuzhiyun #define _ASM_SH_SUSPEND_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #ifndef __ASSEMBLY__ 6*4882a593Smuzhiyun #include <linux/notifier.h> 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #include <asm/ptrace.h> 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun struct swsusp_arch_regs { 11*4882a593Smuzhiyun struct pt_regs user_regs; 12*4882a593Smuzhiyun unsigned long bank1_regs[8]; 13*4882a593Smuzhiyun }; 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun void sh_mobile_call_standby(unsigned long mode); 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #ifdef CONFIG_CPU_IDLE 18*4882a593Smuzhiyun int sh_mobile_setup_cpuidle(void); 19*4882a593Smuzhiyun #else sh_mobile_setup_cpuidle(void)20*4882a593Smuzhiyunstatic inline int sh_mobile_setup_cpuidle(void) { return 0; } 21*4882a593Smuzhiyun #endif 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun /* notifier chains for pre/post sleep hooks */ 24*4882a593Smuzhiyun extern struct atomic_notifier_head sh_mobile_pre_sleep_notifier_list; 25*4882a593Smuzhiyun extern struct atomic_notifier_head sh_mobile_post_sleep_notifier_list; 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun /* priority levels for notifiers */ 28*4882a593Smuzhiyun #define SH_MOBILE_SLEEP_BOARD 0 29*4882a593Smuzhiyun #define SH_MOBILE_SLEEP_CPU 1 30*4882a593Smuzhiyun #define SH_MOBILE_PRE(x) (x) 31*4882a593Smuzhiyun #define SH_MOBILE_POST(x) (-(x)) 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun /* board code registration function for self-refresh assembly snippets */ 34*4882a593Smuzhiyun void sh_mobile_register_self_refresh(unsigned long flags, 35*4882a593Smuzhiyun void *pre_start, void *pre_end, 36*4882a593Smuzhiyun void *post_start, void *post_end); 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun /* register structure for address/data information */ 39*4882a593Smuzhiyun struct sh_sleep_regs { 40*4882a593Smuzhiyun unsigned long stbcr; 41*4882a593Smuzhiyun unsigned long bar; 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun /* MMU */ 44*4882a593Smuzhiyun unsigned long pteh; 45*4882a593Smuzhiyun unsigned long ptel; 46*4882a593Smuzhiyun unsigned long ttb; 47*4882a593Smuzhiyun unsigned long tea; 48*4882a593Smuzhiyun unsigned long mmucr; 49*4882a593Smuzhiyun unsigned long ptea; 50*4882a593Smuzhiyun unsigned long pascr; 51*4882a593Smuzhiyun unsigned long irmcr; 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun /* Cache */ 54*4882a593Smuzhiyun unsigned long ccr; 55*4882a593Smuzhiyun unsigned long ramcr; 56*4882a593Smuzhiyun }; 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun /* data area for low-level sleep code */ 59*4882a593Smuzhiyun struct sh_sleep_data { 60*4882a593Smuzhiyun /* current sleep mode (SUSP_SH_...) */ 61*4882a593Smuzhiyun unsigned long mode; 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun /* addresses of board specific self-refresh snippets */ 64*4882a593Smuzhiyun unsigned long sf_pre; 65*4882a593Smuzhiyun unsigned long sf_post; 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun /* address of resume code */ 68*4882a593Smuzhiyun unsigned long resume; 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun /* register state saved and restored by the assembly code */ 71*4882a593Smuzhiyun unsigned long vbr; 72*4882a593Smuzhiyun unsigned long spc; 73*4882a593Smuzhiyun unsigned long sr; 74*4882a593Smuzhiyun unsigned long sp; 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun /* structure for keeping register addresses */ 77*4882a593Smuzhiyun struct sh_sleep_regs addr; 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun /* structure for saving/restoring register state */ 80*4882a593Smuzhiyun struct sh_sleep_regs data; 81*4882a593Smuzhiyun }; 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun /* a bitmap of supported sleep modes (SUSP_SH..) */ 84*4882a593Smuzhiyun extern unsigned long sh_mobile_sleep_supported; 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun #endif 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun /* flags passed to assembly suspend code */ 89*4882a593Smuzhiyun #define SUSP_SH_SLEEP (1 << 0) /* Regular sleep mode */ 90*4882a593Smuzhiyun #define SUSP_SH_STANDBY (1 << 1) /* SH-Mobile Software standby mode */ 91*4882a593Smuzhiyun #define SUSP_SH_RSTANDBY (1 << 2) /* SH-Mobile R-standby mode */ 92*4882a593Smuzhiyun #define SUSP_SH_USTANDBY (1 << 3) /* SH-Mobile U-standby mode */ 93*4882a593Smuzhiyun #define SUSP_SH_SF (1 << 4) /* Enable self-refresh */ 94*4882a593Smuzhiyun #define SUSP_SH_MMU (1 << 5) /* Save/restore MMU and cache */ 95*4882a593Smuzhiyun #define SUSP_SH_REGS (1 << 6) /* Save/restore registers */ 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun #endif /* _ASM_SH_SUSPEND_H */ 98