1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3  * TI Wakeup M3 for AMx3 SoCs Power Management Routines
4  *
5  * Copyright (C) 2015 Texas Instruments Incorporated - https://www.ti.com/
6  * Dave Gerlach <d-gerlach@ti.com>
7  */
8 
9 #ifndef _LINUX_WKUP_M3_IPC_H
10 #define _LINUX_WKUP_M3_IPC_H
11 
12 #define WKUP_M3_DEEPSLEEP	1
13 #define WKUP_M3_STANDBY		2
14 #define WKUP_M3_IDLE		3
15 
16 #include <linux/mailbox_client.h>
17 
18 struct wkup_m3_ipc_ops;
19 
20 struct wkup_m3_ipc {
21 	struct rproc *rproc;
22 
23 	void __iomem *ipc_mem_base;
24 	struct device *dev;
25 
26 	int mem_type;
27 	unsigned long resume_addr;
28 	int vtt_conf;
29 	int isolation_conf;
30 	int state;
31 	u32 halt;
32 
33 	unsigned long volt_scale_offsets;
34 	const char *sd_fw_name;
35 
36 	struct completion sync_complete;
37 	struct mbox_client mbox_client;
38 	struct mbox_chan *mbox;
39 
40 	struct wkup_m3_ipc_ops *ops;
41 	int is_rtc_only;
42 	struct dentry *dbg_path;
43 };
44 
45 struct wkup_m3_wakeup_src {
46 	int irq_nr;
47 	char src[10];
48 };
49 
50 struct wkup_m3_scale_data_header {
51 	u16 magic;
52 	u8 sleep_offset;
53 	u8 wake_offset;
54 } __packed;
55 
56 struct wkup_m3_ipc_ops {
57 	void (*set_mem_type)(struct wkup_m3_ipc *m3_ipc, int mem_type);
58 	void (*set_resume_address)(struct wkup_m3_ipc *m3_ipc, void *addr);
59 	int (*prepare_low_power)(struct wkup_m3_ipc *m3_ipc, int state);
60 	int (*finish_low_power)(struct wkup_m3_ipc *m3_ipc);
61 	int (*request_pm_status)(struct wkup_m3_ipc *m3_ipc);
62 	const char *(*request_wake_src)(struct wkup_m3_ipc *m3_ipc);
63 	void (*set_rtc_only)(struct wkup_m3_ipc *m3_ipc);
64 };
65 
66 struct wkup_m3_ipc *wkup_m3_ipc_get(void);
67 void wkup_m3_ipc_put(struct wkup_m3_ipc *m3_ipc);
68 void wkup_m3_set_rtc_only_mode(void);
69 #endif /* _LINUX_WKUP_M3_IPC_H */
70