[PATCH v3 10/12] OMAP: Serial: Use resume call from prcm to enable uart
From: Govindraj <hidden>
Date: 2011-06-27 15:03:48
Also in:
linux-omap, linux-serial
On Sat, Jun 25, 2011 at 5:53 AM, Kevin Hilman [off-list ref] wrote:
"Govindraj.R" [off-list ref] writes:quoted
Use resume idle call from prcm_irq to enable uart_port from low power states.Comment is valid for OMAP3 but not for OMAP2. ?Maybe [01/12] should just leave this call in for OMAP2 instead of having to add it back here?quoted
Add api to check pad wakeup status which will we used from uart_resume func. to enable back uart port if a wakeup event occurred.s/api/API/ ?(same for PRCM, UART, int subject)quoted
UART_Resume func. can be removed once we have irq_chaining functionality available.Have you tested removing this when using with Tero's series?
I added Tero's v3 patch 1,2,3,4 on top of my runtime changes console gets looped with below prints during bootup [1] not sure whats happening need to look into it. [1]: http://pastebin.com/C55gtGhp <<SNIP>> [ 2.740692] Registering the dns_resolver key type [ 2.746490] VFP support v0.3: implementor 41 architecture 3 part 30 variant c rev 1 [ 2.754669] ThumbEE CPU extension supported. [ 2.772583] irq 368, desc: c0635540, depth: 1, count: 0, unhandled: 0 [ 2.779388] ->handle_irq(): c00e494c, handle_bad_irq+0x0/0x260 [ 2.785675] ->irq_data.chip(): c067f254, no_irq_chip+0x0/0x5c [ 2.791748] ->action(): (null) [ 2.795166] IRQ_NOPROBE set [ 2.798370] IRQ_NOREQUEST set [ 2.801605] irq 368, desc: c0635540, depth: 1, count: 0, unhandled: 0 [ 2.808380] ->handle_irq(): c00e494c, handle_bad_irq+0x0/0x260 [ 2.814636] ->irq_data.chip(): c067f254, no_irq_chip+0x0/0x5c [ 2.820709] ->action(): (null) [ 2.824127] IRQ_NOPROBE set [ 2.827331] IRQ_NOREQUEST set [ 2.830566] irq 368, desc: c0635540, depth: 1, count: 0, unhandled: 0 [ 2.837371] ->handle_irq(): c00e494c, handle_bad_irq+0x0/0x260 [ 2.843627] ->irq_data.chip(): c067f254, no_irq_chip+0x0/0x5c [ 2.849700] ->action(): (null) <<SNIP>> -- Thanks, Govindraj.R
quoted
Signed-off-by: Govindraj.R <redacted> --- ?arch/arm/mach-omap2/pm24xx.c ? ? ? ? ? ? ? ? ?| ? ?2 ++ ?arch/arm/mach-omap2/pm34xx.c ? ? ? ? ? ? ? ? ?| ? ?2 ++ ?arch/arm/mach-omap2/serial.c ? ? ? ? ? ? ? ? ?| ? 23 +++++++++++++++++++++++ ?arch/arm/plat-omap/include/plat/omap-serial.h | ? ?2 ++ ?arch/arm/plat-omap/include/plat/serial.h ? ? ?| ? ?1 + ?drivers/tty/serial/omap-serial.c ? ? ? ? ? ? ?| ? 23 +++++++++++++++++++++++ ?6 files changed, 53 insertions(+), 0 deletions(-)diff --git a/arch/arm/mach-omap2/pm24xx.c b/arch/arm/mach-omap2/pm24xx.c index c405bda..ba58a1d 100644 --- a/arch/arm/mach-omap2/pm24xx.c +++ b/arch/arm/mach-omap2/pm24xx.c@@ -137,6 +137,8 @@ static void omap2_enter_full_retention(void)? ? ? ? ? ? ? ? ? ? ? ? ?OMAP_SDRC_REGADDR(SDRC_DLLA_CTRL), ? ? ? ? ? ? ? ? ? ? ? ? ?OMAP_SDRC_REGADDR(SDRC_POWER)); + ? ? omap_uart_resume_idle(); + ?no_sleep: ? ? ? if (omap2_pm_debug) { ? ? ? ? ? ? ? unsigned long long tmp;diff --git a/arch/arm/mach-omap2/pm34xx.c b/arch/arm/mach-omap2/pm34xx.c index ac7b7f8..3997e92 100644 --- a/arch/arm/mach-omap2/pm34xx.c +++ b/arch/arm/mach-omap2/pm34xx.c@@ -216,6 +216,8 @@ static int prcm_clear_mod_irqs(s16 module, u8 regs)? ? ? wkst = omap2_prm_read_mod_reg(module, wkst_off); ? ? ? wkst &= omap2_prm_read_mod_reg(module, grpsel_off); + + ? ? c += omap_uart_resume_idle(); ? ? ? if (wkst) { ? ? ? ? ? ? ? iclk = omap2_cm_read_mod_reg(module, iclk_off); ? ? ? ? ? ? ? fclk = omap2_cm_read_mod_reg(module, fclk_off);diff --git a/arch/arm/mach-omap2/serial.c b/arch/arm/mach-omap2/serial.c index 6ac078f..4bc5914 100644 --- a/arch/arm/mach-omap2/serial.c +++ b/arch/arm/mach-omap2/serial.c@@ -199,6 +199,28 @@ static void omap_serial_fill_default_pads(struct omap_board_data *bdata)? ? ? } ?} +/* TBD: Will be removed once we have irq-chaing mechanism */s/TBD/FIXME/quoted
+static bool omap_uart_chk_wakeup(struct platform_device *pdev) +{ + ? ? struct omap_uart_port_info *up = pdev->dev.platform_data; + ? ? struct omap_device *od; + ? ? u32 wkst = 0; + ? ? bool ret = false; + + ? ? od = to_omap_device(pdev); + ? ? if (omap_hmwod_pad_get_wakeup_status(od->hwmods[0])) + ? ? ? ? ? ? ret = true; + + ? ? /* Check for normal UART wakeup (and clear it) */ + ? ? wkst = __raw_readl(up->wk_st) & up->wk_mask; + ? ? if (wkst) { + ? ? ? ? ? ? __raw_writel(wkst, up->wk_st); + ? ? ? ? ? ? ret = true; + ? ? } + + ? ? return ret; +} + ?static void omap_uart_wakeup_enable(struct platform_device *pdev, bool enable) ?{ ? ? ? struct omap_uart_port_info *up = pdev->dev.platform_data;@@ -369,6 +391,7 @@ void __init omap_serial_init_port(struct omap_board_data *bdata,? ? ? pdata->uartclk = OMAP24XX_BASE_BAUD * 16; ? ? ? pdata->flags = UPF_BOOT_AUTOCONF; ? ? ? pdata->enable_wakeup = omap_uart_wakeup_enable; + ? ? pdata->chk_wakeup = omap_uart_chk_wakeup; ? ? ? pdata->dma_enabled = info->dma_enabled; ? ? ? pdata->dma_rx_buf_size = info->dma_rx_buf_size; ? ? ? pdata->dma_rx_poll_rate = info->dma_rx_poll_rate;diff --git a/arch/arm/plat-omap/include/plat/omap-serial.h b/arch/arm/plat-omap/include/plat/omap-serial.h index c5f4dd9..b5117bd 100644 --- a/arch/arm/plat-omap/include/plat/omap-serial.h +++ b/arch/arm/plat-omap/include/plat/omap-serial.h@@ -75,6 +75,7 @@ struct omap_uart_port_info {? ? ? unsigned int ? ? ? ? ? ?auto_sus_timeout; /* Auto_suspend timeout */ ? ? ? void (*enable_wakeup)(struct platform_device *, bool); + ? ? bool (*chk_wakeup)(struct platform_device *); ? ? ? void __iomem *wk_st; ? ? ? void __iomem *wk_en; ? ? ? u32 wk_mask;@@ -132,6 +133,7 @@ struct uart_omap_port {? ? ? unsigned long ? ? ? ? ? port_activity; ? ? ? unsigned int ? ? ? ? ? ?errata; ? ? ? void (*enable_wakeup)(struct platform_device *, bool); + ? ? bool (*chk_wakeup)(struct platform_device *); ?}; ?#endif /* __OMAP_SERIAL_H__ */diff --git a/arch/arm/plat-omap/include/plat/serial.h b/arch/arm/plat-omap/include/plat/serial.h index ee758d4..44a42aa 100644 --- a/arch/arm/plat-omap/include/plat/serial.h +++ b/arch/arm/plat-omap/include/plat/serial.h@@ -109,6 +109,7 @@ extern void omap_serial_init(void);?extern void omap_serial_board_init(struct omap_uart_port_info *platform_data); ?extern void omap_serial_init_port(struct omap_board_data *bdata, ? ? ? ? ? ? ? struct omap_uart_port_info *platform_data); +extern u32 omap_uart_resume_idle(void); ?#endif ?#endifdiff --git a/drivers/tty/serial/omap-serial.c b/drivers/tty/serial/omap-serial.c index 307b7c6..c3561dd 100644 --- a/drivers/tty/serial/omap-serial.c +++ b/drivers/tty/serial/omap-serial.c@@ -43,6 +43,7 @@?#include <plat/dmtimer.h> ?#include <plat/omap-serial.h> ?#include <plat/omap_device.h> +#include <plat/serial.h> ?static struct uart_omap_port *ui[OMAP_MAX_HSUART_PORTS];@@ -108,6 +109,27 @@ static inline void serial_omap_port_enable(struct uart_omap_port *up)? ? ? pm_runtime_get_sync(&up->pdev->dev); ?} +/* TBD: Should be removed once we irq-chaining mechanism in place */ +u32 omap_uart_resume_idle() +{ + ? ? int i; + ? ? u32 ret = 0; + + ? ? for (i = 0; i < OMAP_MAX_HSUART_PORTS; i++) { + ? ? ? ? ? ? struct uart_omap_port *up = ui[i]; + + ? ? ? ? ? ? if (!up) + ? ? ? ? ? ? ? ? ? ? continue; + + ? ? ? ? ? ? if (up->chk_wakeup(up->pdev)) { + ? ? ? ? ? ? ? ? ? ? serial_omap_port_enable(up); + ? ? ? ? ? ? ? ? ? ? serial_omap_port_disable(up); + ? ? ? ? ? ? ? ? ? ? ret++; + ? ? ? ? ? ? } + ? ? } + ? ? return ret; +} + ?static void serial_omap_stop_rxdma(struct uart_omap_port *up) ?{ ? ? ? if (up->uart_dma.rx_dma_used) {@@ -1392,6 +1414,7 @@ static int serial_omap_probe(struct platform_device *pdev)? ? ? up->uart_dma.uart_base = mem->start; ? ? ? up->errata = omap_up_info->errata; ? ? ? up->enable_wakeup = omap_up_info->enable_wakeup; + ? ? up->chk_wakeup = omap_up_info->chk_wakeup; ? ? ? if (omap_up_info->dma_enabled) { ? ? ? ? ? ? ? up->uart_dma.uart_dma_tx = dma_tx->start;Kevin -- To unsubscribe from this list: send the line "unsubscribe linux-serial" in the body of a message to majordomo at vger.kernel.org More majordomo info at ?http://vger.kernel.org/majordomo-info.html