s3c-pm-debug.c 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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. #include <linux/serial_core.h>
  12. #include <linux/serial_s3c.h>
  13. #include <linux/io.h>
  14. #include <asm/mach/map.h>
  15. #include <linux/soc/samsung/s3c-pm.h>
  16. static struct pm_uart_save uart_save;
  17. extern void printascii(const char *);
  18. void s3c_pm_dbg(const char *fmt, ...)
  19. {
  20. va_list va;
  21. char buff[256];
  22. va_start(va, fmt);
  23. vsnprintf(buff, sizeof(buff), fmt, va);
  24. va_end(va);
  25. printascii(buff);
  26. }
  27. static inline void __iomem *s3c_pm_uart_base(void)
  28. {
  29. unsigned long paddr;
  30. unsigned long vaddr;
  31. debug_ll_addr(&paddr, &vaddr);
  32. return (void __iomem *)vaddr;
  33. }
  34. void s3c_pm_save_uarts(bool is_s3c2410)
  35. {
  36. void __iomem *regs = s3c_pm_uart_base();
  37. struct pm_uart_save *save = &uart_save;
  38. save->ulcon = __raw_readl(regs + S3C2410_ULCON);
  39. save->ucon = __raw_readl(regs + S3C2410_UCON);
  40. save->ufcon = __raw_readl(regs + S3C2410_UFCON);
  41. save->umcon = __raw_readl(regs + S3C2410_UMCON);
  42. save->ubrdiv = __raw_readl(regs + S3C2410_UBRDIV);
  43. if (!is_s3c2410)
  44. save->udivslot = __raw_readl(regs + S3C2443_DIVSLOT);
  45. S3C_PMDBG("UART[%p]: ULCON=%04x, UCON=%04x, UFCON=%04x, UBRDIV=%04x\n",
  46. regs, save->ulcon, save->ucon, save->ufcon, save->ubrdiv);
  47. }
  48. void s3c_pm_restore_uarts(bool is_s3c2410)
  49. {
  50. void __iomem *regs = s3c_pm_uart_base();
  51. struct pm_uart_save *save = &uart_save;
  52. s3c_pm_arch_update_uart(regs, save);
  53. __raw_writel(save->ulcon, regs + S3C2410_ULCON);
  54. __raw_writel(save->ucon, regs + S3C2410_UCON);
  55. __raw_writel(save->ufcon, regs + S3C2410_UFCON);
  56. __raw_writel(save->umcon, regs + S3C2410_UMCON);
  57. __raw_writel(save->ubrdiv, regs + S3C2410_UBRDIV);
  58. if (!is_s3c2410)
  59. __raw_writel(save->udivslot, regs + S3C2443_DIVSLOT);
  60. }