s3c-pm-debug.c (1993B)
1// SPDX-License-Identifier: GPL-2.0 2// 3// Copyright (C) 2013 Samsung Electronics Co., Ltd. 4// Tomasz Figa <t.figa@samsung.com> 5// Copyright (C) 2008 Openmoko, Inc. 6// Copyright (C) 2004-2008 Simtec Electronics 7// Ben Dooks <ben@simtec.co.uk> 8// http://armlinux.simtec.co.uk/ 9// 10// Samsung common power management (suspend to RAM) debug support 11 12#include <linux/serial_core.h> 13#include <linux/serial_s3c.h> 14#include <linux/io.h> 15 16#include <asm/mach/map.h> 17 18#include <linux/soc/samsung/s3c-pm.h> 19 20static struct pm_uart_save uart_save; 21 22extern void printascii(const char *); 23 24void s3c_pm_dbg(const char *fmt, ...) 25{ 26 va_list va; 27 char buff[256]; 28 29 va_start(va, fmt); 30 vsnprintf(buff, sizeof(buff), fmt, va); 31 va_end(va); 32 33 printascii(buff); 34} 35 36static inline void __iomem *s3c_pm_uart_base(void) 37{ 38 unsigned long paddr; 39 unsigned long vaddr; 40 41 debug_ll_addr(&paddr, &vaddr); 42 43 return (void __iomem *)vaddr; 44} 45 46void s3c_pm_save_uarts(bool is_s3c2410) 47{ 48 void __iomem *regs = s3c_pm_uart_base(); 49 struct pm_uart_save *save = &uart_save; 50 51 save->ulcon = __raw_readl(regs + S3C2410_ULCON); 52 save->ucon = __raw_readl(regs + S3C2410_UCON); 53 save->ufcon = __raw_readl(regs + S3C2410_UFCON); 54 save->umcon = __raw_readl(regs + S3C2410_UMCON); 55 save->ubrdiv = __raw_readl(regs + S3C2410_UBRDIV); 56 57 if (!is_s3c2410) 58 save->udivslot = __raw_readl(regs + S3C2443_DIVSLOT); 59 60 S3C_PMDBG("UART[%p]: ULCON=%04x, UCON=%04x, UFCON=%04x, UBRDIV=%04x\n", 61 regs, save->ulcon, save->ucon, save->ufcon, save->ubrdiv); 62} 63 64void s3c_pm_restore_uarts(bool is_s3c2410) 65{ 66 void __iomem *regs = s3c_pm_uart_base(); 67 struct pm_uart_save *save = &uart_save; 68 69 s3c_pm_arch_update_uart(regs, save); 70 71 __raw_writel(save->ulcon, regs + S3C2410_ULCON); 72 __raw_writel(save->ucon, regs + S3C2410_UCON); 73 __raw_writel(save->ufcon, regs + S3C2410_UFCON); 74 __raw_writel(save->umcon, regs + S3C2410_UMCON); 75 __raw_writel(save->ubrdiv, regs + S3C2410_UBRDIV); 76 77 if (!is_s3c2410) 78 __raw_writel(save->udivslot, regs + S3C2443_DIVSLOT); 79}