172551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa/*
272551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa * Copyright (C) 2013 Samsung Electronics Co., Ltd.
372551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa *	Tomasz Figa <t.figa@samsung.com>
472551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa * Copyright (c) 2004 Simtec Electronics
572551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa *	http://armlinux.simtec.co.uk/
672551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa *	Written by Ben Dooks, <ben@simtec.co.uk>
772551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa *
872551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa * This program is free software; you can redistribute it and/or modify
972551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa * it under the terms of the GNU General Public License version 2 as
1072551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa * published by the Free Software Foundation.
1172551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa*/
1272551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa
1372551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa#ifndef __PLAT_SAMSUNG_PM_COMMON_H
1472551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa#define __PLAT_SAMSUNG_PM_COMMON_H __FILE__
1572551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa
16b27899178c53226a5ff780a17657c84eb5e32338Tomasz Figa#include <linux/irq.h>
17b27899178c53226a5ff780a17657c84eb5e32338Tomasz Figa
18b27899178c53226a5ff780a17657c84eb5e32338Tomasz Figa/* sleep save info */
19b27899178c53226a5ff780a17657c84eb5e32338Tomasz Figa
20b27899178c53226a5ff780a17657c84eb5e32338Tomasz Figa/**
21b27899178c53226a5ff780a17657c84eb5e32338Tomasz Figa * struct sleep_save - save information for shared peripherals.
22b27899178c53226a5ff780a17657c84eb5e32338Tomasz Figa * @reg: Pointer to the register to save.
23b27899178c53226a5ff780a17657c84eb5e32338Tomasz Figa * @val: Holder for the value saved from reg.
24b27899178c53226a5ff780a17657c84eb5e32338Tomasz Figa *
25b27899178c53226a5ff780a17657c84eb5e32338Tomasz Figa * This describes a list of registers which is used by the pm core and
26b27899178c53226a5ff780a17657c84eb5e32338Tomasz Figa * other subsystem to save and restore register values over suspend.
27b27899178c53226a5ff780a17657c84eb5e32338Tomasz Figa */
28b27899178c53226a5ff780a17657c84eb5e32338Tomasz Figastruct sleep_save {
29b27899178c53226a5ff780a17657c84eb5e32338Tomasz Figa	void __iomem	*reg;
30b27899178c53226a5ff780a17657c84eb5e32338Tomasz Figa	unsigned long	val;
31b27899178c53226a5ff780a17657c84eb5e32338Tomasz Figa};
32b27899178c53226a5ff780a17657c84eb5e32338Tomasz Figa
33b27899178c53226a5ff780a17657c84eb5e32338Tomasz Figa#define SAVE_ITEM(x) \
34b27899178c53226a5ff780a17657c84eb5e32338Tomasz Figa	{ .reg = (x) }
35b27899178c53226a5ff780a17657c84eb5e32338Tomasz Figa
36b27899178c53226a5ff780a17657c84eb5e32338Tomasz Figa/* helper functions to save/restore lists of registers. */
37b27899178c53226a5ff780a17657c84eb5e32338Tomasz Figa
38b27899178c53226a5ff780a17657c84eb5e32338Tomasz Figaextern void s3c_pm_do_save(struct sleep_save *ptr, int count);
39b27899178c53226a5ff780a17657c84eb5e32338Tomasz Figaextern void s3c_pm_do_restore(const struct sleep_save *ptr, int count);
40b27899178c53226a5ff780a17657c84eb5e32338Tomasz Figaextern void s3c_pm_do_restore_core(const struct sleep_save *ptr, int count);
41b27899178c53226a5ff780a17657c84eb5e32338Tomasz Figa
4272551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa/* PM debug functions */
4372551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa
4472551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa/**
4572551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa * struct pm_uart_save - save block for core UART
4672551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa * @ulcon: Save value for S3C2410_ULCON
4772551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa * @ucon: Save value for S3C2410_UCON
4872551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa * @ufcon: Save value for S3C2410_UFCON
4972551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa * @umcon: Save value for S3C2410_UMCON
5072551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa * @ubrdiv: Save value for S3C2410_UBRDIV
5172551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa *
5272551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa * Save block for UART registers to be held over sleep and restored if they
5372551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa * are needed (say by debug).
5472551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa*/
5572551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figastruct pm_uart_save {
5672551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa	u32	ulcon;
5772551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa	u32	ucon;
5872551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa	u32	ufcon;
5972551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa	u32	umcon;
6072551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa	u32	ubrdiv;
6172551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa	u32	udivslot;
6272551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa};
6372551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa
6472551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa#ifdef CONFIG_SAMSUNG_PM_DEBUG
6572551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa/**
6672551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa * s3c_pm_dbg() - low level debug function for use in suspend/resume.
6772551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa * @msg: The message to print.
6872551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa *
6972551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa * This function is used mainly to debug the resume process before the system
7072551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa * can rely on printk/console output. It uses the low-level debugging output
7172551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa * routine printascii() to do its work.
7272551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa */
7372551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figaextern void s3c_pm_dbg(const char *msg, ...);
7472551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa
7572551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa/**
7672551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa * s3c_pm_debug_init() - suspend/resume low level debug initialization.
7772551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa * @base: Virtual base of UART to use for suspend/resume debugging.
7872551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa *
7972551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa * This function needs to be called before S3C_PMDBG() can be used, to set up
8072551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa * UART port base address and configuration.
8172551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa */
8272551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figaextern void s3c_pm_debug_init(void);
8372551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa
8472551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa#define S3C_PMDBG(fmt...) s3c_pm_dbg(fmt)
8572551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa
8672551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figaextern void s3c_pm_save_uarts(void);
8772551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figaextern void s3c_pm_restore_uarts(void);
8872551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa#else
8972551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa#define S3C_PMDBG(fmt...) pr_debug(fmt)
9072551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa#define s3c_pm_debug_init() do { } while (0)
9172551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa
9272551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figastatic inline void s3c_pm_save_uarts(void) { }
9372551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figastatic inline void s3c_pm_restore_uarts(void) { }
9472551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa#endif
9572551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa
96f682426630c620a2b8ae488a4f0d85ec6c272d66Tomasz Figa/* suspend memory checking */
97f682426630c620a2b8ae488a4f0d85ec6c272d66Tomasz Figa
98f682426630c620a2b8ae488a4f0d85ec6c272d66Tomasz Figa#ifdef CONFIG_SAMSUNG_PM_CHECK
99f682426630c620a2b8ae488a4f0d85ec6c272d66Tomasz Figaextern void s3c_pm_check_prepare(void);
100f682426630c620a2b8ae488a4f0d85ec6c272d66Tomasz Figaextern void s3c_pm_check_restore(void);
101f682426630c620a2b8ae488a4f0d85ec6c272d66Tomasz Figaextern void s3c_pm_check_cleanup(void);
102f682426630c620a2b8ae488a4f0d85ec6c272d66Tomasz Figaextern void s3c_pm_check_store(void);
103f682426630c620a2b8ae488a4f0d85ec6c272d66Tomasz Figa#else
104f682426630c620a2b8ae488a4f0d85ec6c272d66Tomasz Figa#define s3c_pm_check_prepare() do { } while (0)
105f682426630c620a2b8ae488a4f0d85ec6c272d66Tomasz Figa#define s3c_pm_check_restore() do { } while (0)
106f682426630c620a2b8ae488a4f0d85ec6c272d66Tomasz Figa#define s3c_pm_check_cleanup() do { } while (0)
107f682426630c620a2b8ae488a4f0d85ec6c272d66Tomasz Figa#define s3c_pm_check_store()   do { } while (0)
108f682426630c620a2b8ae488a4f0d85ec6c272d66Tomasz Figa#endif
109f682426630c620a2b8ae488a4f0d85ec6c272d66Tomasz Figa
11072551f6cf13e2f3a1d273b7007b5d7d7fd69c554Tomasz Figa#endif
111