Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ec3bebc6 authored by Govindraj.R's avatar Govindraj.R Committed by Kevin Hilman
Browse files

ARM: OMAP2+: UART: Get context loss count to context restore



Avoid unconditional context restore every time we gate uart
clocks. Check whether context loss happened based on which
we can context restore uart regs from uart_port structure.

Signed-off-by: default avatarGovindraj.R <govindraj.raja@ti.com>
Acked-by: Greg Kroah-Hartman <gregkh@suse.de> (for drivers/tty changes)
Signed-off-by: default avatarKevin Hilman <khilman@ti.com>
parent 32212897
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -33,6 +33,7 @@
#include <plat/dma.h>
#include <plat/dma.h>
#include <plat/omap_hwmod.h>
#include <plat/omap_hwmod.h>
#include <plat/omap_device.h>
#include <plat/omap_device.h>
#include <plat/omap-pm.h>


#include "prm2xxx_3xxx.h"
#include "prm2xxx_3xxx.h"
#include "pm.h"
#include "pm.h"
@@ -478,6 +479,7 @@ void __init omap_serial_init_port(struct omap_board_data *bdata)
	omap_up.dma_enabled = uart->dma_enabled;
	omap_up.dma_enabled = uart->dma_enabled;
	omap_up.uartclk = OMAP24XX_BASE_BAUD * 16;
	omap_up.uartclk = OMAP24XX_BASE_BAUD * 16;
	omap_up.flags = UPF_BOOT_AUTOCONF;
	omap_up.flags = UPF_BOOT_AUTOCONF;
	omap_up.get_context_loss_count = omap_pm_get_dev_context_loss_count;


	pdata = &omap_up;
	pdata = &omap_up;
	pdata_size = sizeof(struct omap_uart_port_info);
	pdata_size = sizeof(struct omap_uart_port_info);
+3 −0
Original line number Original line Diff line number Diff line
@@ -62,6 +62,8 @@ struct omap_uart_port_info {
	bool			dma_enabled;	/* To specify DMA Mode */
	bool			dma_enabled;	/* To specify DMA Mode */
	unsigned int		uartclk;	/* UART clock rate */
	unsigned int		uartclk;	/* UART clock rate */
	upf_t			flags;		/* UPF_* flags */
	upf_t			flags;		/* UPF_* flags */

	int (*get_context_loss_count)(struct device *);
};
};


struct uart_omap_dma {
struct uart_omap_dma {
@@ -114,6 +116,7 @@ struct uart_omap_port {
	unsigned char		msr_saved_flags;
	unsigned char		msr_saved_flags;
	char			name[20];
	char			name[20];
	unsigned long		port_activity;
	unsigned long		port_activity;
	u32			context_loss_cnt;
};
};


#endif /* __OMAP_SERIAL_H__ */
#endif /* __OMAP_SERIAL_H__ */
+18 −2
Original line number Original line Diff line number Diff line
@@ -1440,15 +1440,31 @@ static void serial_omap_restore_context(struct uart_omap_port *up)
#ifdef CONFIG_PM_RUNTIME
#ifdef CONFIG_PM_RUNTIME
static int serial_omap_runtime_suspend(struct device *dev)
static int serial_omap_runtime_suspend(struct device *dev)
{
{
	struct uart_omap_port *up = dev_get_drvdata(dev);
	struct omap_uart_port_info *pdata = dev->platform_data;

	if (!up)
		return -EINVAL;

	if (pdata->get_context_loss_count)
		up->context_loss_cnt = pdata->get_context_loss_count(dev);

	return 0;
	return 0;
}
}


static int serial_omap_runtime_resume(struct device *dev)
static int serial_omap_runtime_resume(struct device *dev)
{
{
	struct uart_omap_port *up = dev_get_drvdata(dev);
	struct uart_omap_port *up = dev_get_drvdata(dev);
	struct omap_uart_port_info *pdata = dev->platform_data;


	if (up)
	if (up) {
		if (pdata->get_context_loss_count) {
			u32 loss_cnt = pdata->get_context_loss_count(dev);

			if (up->context_loss_cnt != loss_cnt)
				serial_omap_restore_context(up);
				serial_omap_restore_context(up);
		}
	}


	return 0;
	return 0;
}
}