Re: [PATCH v3 10/12] OMAP: Serial: Use resume call from prcm to enable uart
On Sat, Jun 25, 2011 at 5:53 AM, Kevin Hilman khil...@ti.com wrote: Govindraj.R govindraj.r...@ti.com writes: 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? 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) 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 Signed-off-by: Govindraj.R govindraj.r...@ti.com --- 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/ +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
Re: [PATCH v3 10/12] OMAP: Serial: Use resume call from prcm to enable uart
Govindraj.R govindraj.r...@ti.com writes: 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? 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) UART_Resume func. can be removed once we have irq_chaining functionality available. Have you tested removing this when using with Tero's series? Signed-off-by: Govindraj.R govindraj.r...@ti.com --- 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/ +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 intauto_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 interrata; 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
[PATCH v3 10/12] OMAP: Serial: Use resume call from prcm to enable uart
Use resume idle call from prcm_irq to enable uart_port from low power states. 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. UART_Resume func. can be removed once we have irq_chaining functionality available. Signed-off-by: Govindraj.R govindraj.r...@ti.com --- 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 */ +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 intauto_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 interrata; 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 #endif diff --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