1*b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 22ef7f0daSMagnus Damm #ifndef _ASM_SH_SUSPEND_H 32ef7f0daSMagnus Damm #define _ASM_SH_SUSPEND_H 42ef7f0daSMagnus Damm 577594912SMagnus Damm #ifndef __ASSEMBLY__ 649f42644SMagnus Damm #include <linux/notifier.h> 72ef7f0daSMagnus Damm 82ef7f0daSMagnus Damm #include <asm/ptrace.h> 92ef7f0daSMagnus Damm 102ef7f0daSMagnus Damm struct swsusp_arch_regs { 112ef7f0daSMagnus Damm struct pt_regs user_regs; 122ef7f0daSMagnus Damm unsigned long bank1_regs[8]; 132ef7f0daSMagnus Damm }; 147426394fSMagnus Damm 157426394fSMagnus Damm void sh_mobile_call_standby(unsigned long mode); 167426394fSMagnus Damm 177426394fSMagnus Damm #ifdef CONFIG_CPU_IDLE 1838a94f41SDaniel Lezcano int sh_mobile_setup_cpuidle(void); 197426394fSMagnus Damm #else sh_mobile_setup_cpuidle(void)2038a94f41SDaniel Lezcanostatic inline int sh_mobile_setup_cpuidle(void) { return 0; } 217426394fSMagnus Damm #endif 227426394fSMagnus Damm 2349f42644SMagnus Damm /* notifier chains for pre/post sleep hooks */ 2449f42644SMagnus Damm extern struct atomic_notifier_head sh_mobile_pre_sleep_notifier_list; 2549f42644SMagnus Damm extern struct atomic_notifier_head sh_mobile_post_sleep_notifier_list; 2649f42644SMagnus Damm 2749f42644SMagnus Damm /* priority levels for notifiers */ 2849f42644SMagnus Damm #define SH_MOBILE_SLEEP_BOARD 0 2949f42644SMagnus Damm #define SH_MOBILE_SLEEP_CPU 1 3049f42644SMagnus Damm #define SH_MOBILE_PRE(x) (x) 3149f42644SMagnus Damm #define SH_MOBILE_POST(x) (-(x)) 3249f42644SMagnus Damm 33159f8cd9SMagnus Damm /* board code registration function for self-refresh assembly snippets */ 34159f8cd9SMagnus Damm void sh_mobile_register_self_refresh(unsigned long flags, 35159f8cd9SMagnus Damm void *pre_start, void *pre_end, 36159f8cd9SMagnus Damm void *post_start, void *post_end); 37323ef8dbSMagnus Damm 38323ef8dbSMagnus Damm /* register structure for address/data information */ 39323ef8dbSMagnus Damm struct sh_sleep_regs { 40323ef8dbSMagnus Damm unsigned long stbcr; 41bb3e0eedSMagnus Damm unsigned long bar; 4299675a7aSMagnus Damm 4399675a7aSMagnus Damm /* MMU */ 4499675a7aSMagnus Damm unsigned long pteh; 4599675a7aSMagnus Damm unsigned long ptel; 4699675a7aSMagnus Damm unsigned long ttb; 4799675a7aSMagnus Damm unsigned long tea; 4899675a7aSMagnus Damm unsigned long mmucr; 4999675a7aSMagnus Damm unsigned long ptea; 5099675a7aSMagnus Damm unsigned long pascr; 5199675a7aSMagnus Damm unsigned long irmcr; 5299675a7aSMagnus Damm 5399675a7aSMagnus Damm /* Cache */ 5499675a7aSMagnus Damm unsigned long ccr; 5599675a7aSMagnus Damm unsigned long ramcr; 56323ef8dbSMagnus Damm }; 57323ef8dbSMagnus Damm 58323ef8dbSMagnus Damm /* data area for low-level sleep code */ 59323ef8dbSMagnus Damm struct sh_sleep_data { 60323ef8dbSMagnus Damm /* current sleep mode (SUSP_SH_...) */ 61323ef8dbSMagnus Damm unsigned long mode; 62323ef8dbSMagnus Damm 63323ef8dbSMagnus Damm /* addresses of board specific self-refresh snippets */ 64323ef8dbSMagnus Damm unsigned long sf_pre; 65323ef8dbSMagnus Damm unsigned long sf_post; 66323ef8dbSMagnus Damm 67bb3e0eedSMagnus Damm /* address of resume code */ 68bb3e0eedSMagnus Damm unsigned long resume; 69bb3e0eedSMagnus Damm 70323ef8dbSMagnus Damm /* register state saved and restored by the assembly code */ 71323ef8dbSMagnus Damm unsigned long vbr; 72323ef8dbSMagnus Damm unsigned long spc; 73323ef8dbSMagnus Damm unsigned long sr; 74bb3e0eedSMagnus Damm unsigned long sp; 75323ef8dbSMagnus Damm 76323ef8dbSMagnus Damm /* structure for keeping register addresses */ 77323ef8dbSMagnus Damm struct sh_sleep_regs addr; 78323ef8dbSMagnus Damm 79323ef8dbSMagnus Damm /* structure for saving/restoring register state */ 80323ef8dbSMagnus Damm struct sh_sleep_regs data; 81323ef8dbSMagnus Damm }; 82323ef8dbSMagnus Damm 8302bf8934SMagnus Damm /* a bitmap of supported sleep modes (SUSP_SH..) */ 8402bf8934SMagnus Damm extern unsigned long sh_mobile_sleep_supported; 8502bf8934SMagnus Damm 8677594912SMagnus Damm #endif 8777594912SMagnus Damm 8877594912SMagnus Damm /* flags passed to assembly suspend code */ 8977594912SMagnus Damm #define SUSP_SH_SLEEP (1 << 0) /* Regular sleep mode */ 9077594912SMagnus Damm #define SUSP_SH_STANDBY (1 << 1) /* SH-Mobile Software standby mode */ 9177594912SMagnus Damm #define SUSP_SH_RSTANDBY (1 << 2) /* SH-Mobile R-standby mode */ 9277594912SMagnus Damm #define SUSP_SH_USTANDBY (1 << 3) /* SH-Mobile U-standby mode */ 9377594912SMagnus Damm #define SUSP_SH_SF (1 << 4) /* Enable self-refresh */ 9499675a7aSMagnus Damm #define SUSP_SH_MMU (1 << 5) /* Save/restore MMU and cache */ 9541bfb7d7SMagnus Damm #define SUSP_SH_REGS (1 << 6) /* Save/restore registers */ 962ef7f0daSMagnus Damm 972ef7f0daSMagnus Damm #endif /* _ASM_SH_SUSPEND_H */ 98