Re: [PATCH v3 10/12] OMAP: Serial: Use resume call from prcm to enable uart

2011-06-27 Thread Govindraj
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

2011-06-24 Thread Kevin Hilman
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

2011-06-08 Thread Govindraj.R
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