forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
1.9 KiB
79 lines
1.9 KiB
// SPDX-License-Identifier: GPL-2.0 |
|
// |
|
// Copyright (C) 2013 Samsung Electronics Co., Ltd. |
|
// Tomasz Figa <[email protected]> |
|
// Copyright (C) 2008 Openmoko, Inc. |
|
// Copyright (C) 2004-2008 Simtec Electronics |
|
// Ben Dooks <[email protected]> |
|
// http://armlinux.simtec.co.uk/ |
|
// |
|
// Samsung common power management (suspend to RAM) debug support |
|
|
|
#include <linux/serial_core.h> |
|
#include <linux/serial_s3c.h> |
|
#include <linux/io.h> |
|
|
|
#include <asm/mach/map.h> |
|
|
|
#include <linux/soc/samsung/s3c-pm.h> |
|
|
|
static struct pm_uart_save uart_save; |
|
|
|
extern void printascii(const char *); |
|
|
|
void s3c_pm_dbg(const char *fmt, ...) |
|
{ |
|
va_list va; |
|
char buff[256]; |
|
|
|
va_start(va, fmt); |
|
vsnprintf(buff, sizeof(buff), fmt, va); |
|
va_end(va); |
|
|
|
printascii(buff); |
|
} |
|
|
|
static inline void __iomem *s3c_pm_uart_base(void) |
|
{ |
|
unsigned long paddr; |
|
unsigned long vaddr; |
|
|
|
debug_ll_addr(&paddr, &vaddr); |
|
|
|
return (void __iomem *)vaddr; |
|
} |
|
|
|
void s3c_pm_save_uarts(bool is_s3c2410) |
|
{ |
|
void __iomem *regs = s3c_pm_uart_base(); |
|
struct pm_uart_save *save = &uart_save; |
|
|
|
save->ulcon = __raw_readl(regs + S3C2410_ULCON); |
|
save->ucon = __raw_readl(regs + S3C2410_UCON); |
|
save->ufcon = __raw_readl(regs + S3C2410_UFCON); |
|
save->umcon = __raw_readl(regs + S3C2410_UMCON); |
|
save->ubrdiv = __raw_readl(regs + S3C2410_UBRDIV); |
|
|
|
if (!is_s3c2410) |
|
save->udivslot = __raw_readl(regs + S3C2443_DIVSLOT); |
|
|
|
S3C_PMDBG("UART[%p]: ULCON=%04x, UCON=%04x, UFCON=%04x, UBRDIV=%04x\n", |
|
regs, save->ulcon, save->ucon, save->ufcon, save->ubrdiv); |
|
} |
|
|
|
void s3c_pm_restore_uarts(bool is_s3c2410) |
|
{ |
|
void __iomem *regs = s3c_pm_uart_base(); |
|
struct pm_uart_save *save = &uart_save; |
|
|
|
s3c_pm_arch_update_uart(regs, save); |
|
|
|
__raw_writel(save->ulcon, regs + S3C2410_ULCON); |
|
__raw_writel(save->ucon, regs + S3C2410_UCON); |
|
__raw_writel(save->ufcon, regs + S3C2410_UFCON); |
|
__raw_writel(save->umcon, regs + S3C2410_UMCON); |
|
__raw_writel(save->ubrdiv, regs + S3C2410_UBRDIV); |
|
|
|
if (!is_s3c2410) |
|
__raw_writel(save->udivslot, regs + S3C2443_DIVSLOT); |
|
}
|
|
|