Exemple #1
0
static void s3c_pm_drain_uart(int uart)
{
	void __iomem *regs = S3C_VA_UARTx(uart);
	unsigned long ufstat;

	do {
		ufstat = __raw_readl(regs + S3C2410_UTRSTAT);
	} while (!(ufstat & S3C2410_UTRSTAT_TXE));
}
Exemple #2
0
static void s3c_pm_restore_uart(unsigned int uart, struct pm_uart_save *save)
{
	void __iomem *regs = S3C_VA_UARTx(uart);

	__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);
}
Exemple #3
0
static void s3c_pm_save_uart(unsigned int uart, struct pm_uart_save *save)
{
	void __iomem *regs = S3C_VA_UARTx(uart);

	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);
}
Exemple #4
0
static void s3c_pm_clear_uarts(void) 
{ 
	unsigned int uart;
	for (uart = 0; uart < CONFIG_SERIAL_SAMSUNG_UARTS; uart++) {
		void __iomem *regs = S3C_VA_UARTx(uart);
		__raw_writel(0, regs + S3C2410_ULCON);
		__raw_writel(0,  regs + S3C2410_UCON);
		__raw_writel(0, regs + S3C2410_UFCON);
		__raw_writel(0, regs + S3C2410_UMCON);
		__raw_writel(0, regs + S3C2410_UBRDIV);
		__raw_writel(0xf, regs + S3C64XX_UINTSP);
		__raw_writel(0xf, regs + S3C64XX_UINTP);
	}
}
Exemple #5
0
static void s3c_pm_restore_uart(unsigned int uart, struct pm_uart_save *save)
{
	void __iomem *regs = S3C_VA_UARTx(uart);

	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 (pm_uart_udivslot)
		__raw_writel(save->udivslot, regs + S3C2443_DIVSLOT);
}
Exemple #6
0
static void s3c_pm_save_uart(unsigned int uart, struct pm_uart_save *save)
{
	void __iomem *regs = S3C_VA_UARTx(uart);

	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 (pm_uart_udivslot)
		save->udivslot = __raw_readl(regs + S3C2443_DIVSLOT);

	S3C_PMDBG("UART[%d]: ULCON=%04x, UCON=%04x, UFCON=%04x, UBRDIV=%04x\n",
		  uart, save->ulcon, save->ucon, save->ufcon, save->ubrdiv);
}
Exemple #7
0
static void s3c64xx_irq_pm_resume(void)
{
	struct irq_grp_save *grp = eint_grp_save;
	int i;

	S3C_PMDBG("%s: resuming IRQs\n", __func__);

	s3c_pm_do_restore(irq_save, ARRAY_SIZE(irq_save));

	for (i = 0; i < CONFIG_SERIAL_SAMSUNG_UARTS; i++)
		__raw_writel(irq_uart_mask[i], S3C_VA_UARTx(i) + S3C64XX_UINTM);

	for (i = 0; i < ARRAY_SIZE(eint_grp_save); i++, grp++) {
		__raw_writel(grp->con, S3C64XX_EINT12CON + (i * 4));
		__raw_writel(grp->mask, S3C64XX_EINT12MASK + (i * 4));
		__raw_writel(grp->fltcon, S3C64XX_EINT12FLTCON + (i * 4));
	}

	S3C_PMDBG("%s: IRQ configuration restored\n", __func__);
}
Exemple #8
0
static int s3c64xx_irq_pm_suspend(void)
{
	struct irq_grp_save *grp = eint_grp_save;
	int i;

	S3C_PMDBG("%s: suspending IRQs\n", __func__);

	s3c_pm_do_save(irq_save, ARRAY_SIZE(irq_save));

	for (i = 0; i < CONFIG_SERIAL_SAMSUNG_UARTS; i++)
		irq_uart_mask[i] = __raw_readl(S3C_VA_UARTx(i) + S3C64XX_UINTM);

	for (i = 0; i < ARRAY_SIZE(eint_grp_save); i++, grp++) {
		grp->con = __raw_readl(S3C64XX_EINT12CON + (i * 4));
		grp->mask = __raw_readl(S3C64XX_EINT12MASK + (i * 4));
		grp->fltcon = __raw_readl(S3C64XX_EINT12FLTCON + (i * 4));
	}

	return 0;
}
Exemple #9
0
static void s3c_pm_restore_uarts(void)
{
	void __iomem *regs = S3C_VA_UARTx(CONFIG_S3C_LOWLEVEL_UART_PORT);
	struct pm_uart_save *save = &console_uart_save;
	u32 uart_clk_gate;
	
//	if(console_suspend_enabled)
//		return;	

	/* make sure CONSOLE UART clock  it be enabled*/
	uart_clk_gate = __raw_readl(EXYNOS4_CLKGATE_IP_PERIL);
	__raw_writel((uart_clk_gate | 0x1 << CONFIG_S3C_LOWLEVEL_UART_PORT), EXYNOS4_CLKGATE_IP_PERIL);

	__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);
	__raw_writel(save->udivslot, regs + S3C2443_DIVSLOT);
}
Exemple #10
0
#ifdef CONFIG_PM

#include <plat/pm.h>

#define SAVE_UART(va) \
	 SAVE_ITEM((va) + S3C2410_ULCON), \
	 SAVE_ITEM((va) + S3C2410_UCON), \
	 SAVE_ITEM((va) + S3C2410_UFCON), \
	 SAVE_ITEM((va) + S3C2410_UMCON), \
	 SAVE_ITEM((va) + S3C2410_UBRDIV), \
	 SAVE_ITEM((va) + S3C2410_UDIVSLOT), \
	 SAVE_ITEM((va) + S3C2410_UINTMSK)

static struct sleep_save uart_save[] = {
	SAVE_UART(S3C_VA_UARTx(0)),
	SAVE_UART(S3C_VA_UARTx(1)),
	SAVE_UART(S3C_VA_UARTx(2)),
	SAVE_UART(S3C_VA_UARTx(3)),
};

#define SAVE_UART_PORT (ARRAY_SIZE(uart_save) / 4)

static int
s3c24xx_serial_suspend(struct platform_device *dev, pm_message_t state)
{
	struct uart_port *port = s3c24xx_dev_to_port(&dev->dev);

	if (port) {
		uart_suspend_port(&s3c24xx_uart_drv, port);
		s3c_pm_do_save(uart_save + port->line * SAVE_UART_PORT,