RE: [PATCH 1/3] USB: musb: All each platform to have power hooks

2009-09-05 Thread Pandita, Vikram
Romit

>-Original Message-
>From: Dasgupta, Romit
>Sent: Friday, September 04, 2009 8:42 PM
>To: Pandita, Vikram; linux-...@vger.kernel.org
>Cc: linux-omap@vger.kernel.org; davi...@pacbell.net; Gupta, Ajay Kumar; 
>Gadiyar, Anand;
>felipe.ba...@nokia.com
>Subject: RE: [PATCH 1/3] USB: musb: All each platform to have power hooks
>
>All the platform suspend/resume routines that have been separated out looks 
>same. What about

See the comment in the patch:
In future these platforms can optimize their suspend/resume routines for power.

Each platform of MUSB has its own way of handling suspend. 
Not just clock disable, they need to do PHY specific suspend/resumes that each 
platform can do in future.



>introducing .psuspend, .presume fields in struct musb and then from within 
>musb_suspend() do the
>following? This way code duplication is reduced.
>
> if (musb->psuspend)
> musb->suspend();
>
>  if (musb->set_clock)
>   musb->set_clock(musb->clock, 0);
>   else
>   clk_disable(musb->clock);
>spin_unlock_irqrestore(&musb->lock, flags);
>   return 0;
>
>
>
>From: linux-omap-ow...@vger.kernel.org [linux-omap-ow...@vger.kernel.org] On 
>Behalf Of Pandita,
>Vikram
>Sent: Saturday, September 05, 2009 4:34 AM
>To: linux-...@vger.kernel.org
>Cc: linux-omap@vger.kernel.org; davi...@pacbell.net; Gupta, Ajay Kumar; 
>Gadiyar, Anand;
>felipe.ba...@nokia.com; Pandita, Vikram
>Subject: [PATCH 1/3] USB: musb: All each platform to have power hooks
>
>This patch allows each MUSB platform (Davinci/TUSB/OMAP/Blackfin)
>to have their own musb_platform_suspend/musb_platform_resume hooks
>
>Each platform has its own power handling requirements and hence
>distribute the suspend/resume functionality per platform
>
>No new functionality is added for other platforms (blackfin/davinci/tusb)
>In future these platforms can optimize their suspend/resume routines for
>power.
>
>Signed-off-by: Vikram Pandita 
>Cc: Ajay Kumar Gupta 
>---
> drivers/usb/musb/blackfin.c  |   15 +++
> drivers/usb/musb/davinci.c   |   24 
> drivers/usb/musb/musb_core.c |   15 +++
> drivers/usb/musb/omap2430.c  |4 +---
> drivers/usb/musb/tusb6010.c  |   24 
> include/linux/usb/musb.h |5 +
> 6 files changed, 72 insertions(+), 15 deletions(-)
>
>diff --git a/drivers/usb/musb/blackfin.c b/drivers/usb/musb/blackfin.c
>index f2f66eb..9a716b2 100644
>--- a/drivers/usb/musb/blackfin.c
>+++ b/drivers/usb/musb/blackfin.c
>@@ -305,11 +305,26 @@ int __init musb_platform_init(struct musb *musb)
>
> int musb_platform_suspend(struct musb *musb)
> {
>+   if (!musb->clock)
>+   return 0;
>+
>+   if (musb->set_clock)
>+   musb->set_clock(musb->clock, 0);
>+   else
>+   clk_disable(musb->clock);
>+
>return 0;
> }
>
> int musb_platform_resume(struct musb *musb)
> {
>+   if (!musb->clock)
>+   return 0;
>+
>+   if (musb->set_clock)
>+   musb->set_clock(musb->clock, 1);
>+   else
>+   clk_enable(musb->clock);
>return 0;
> }
>
>diff --git a/drivers/usb/musb/davinci.c b/drivers/usb/musb/davinci.c
>index e16ff60..684e769 100644
>--- a/drivers/usb/musb/davinci.c
>+++ b/drivers/usb/musb/davinci.c
>@@ -499,3 +499,27 @@ int musb_platform_exit(struct musb *musb)
>
>return 0;
> }
>+
>+int musb_platform_suspend(struct musb *musb)
>+{
>+   if (!musb->clock)
>+   return 0;
>+
>+   if (musb->set_clock)
>+   musb->set_clock(musb->clock, 0);
>+   else
>+   clk_disable(musb->clock);
>+   return 0;
>+}
>+
>+int musb_platform_resume(struct musb *musb)
>+{
>+   if (!musb->clock)
>+   return 0;
>+
>+   if (musb->set_clock)
>+   musb->set_clock(musb->clock, 1);
>+   else
>+   clk_enable(musb->clock);
>+   return 0;
>+}
>diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
>index c7c1ca0..ef97a0c 100644
>--- a/drivers/usb/musb/musb_core.c
>+++ b/drivers/usb/musb/musb_core.c
>@@ -2186,13 +2186,9 @@ static int musb_suspend(struct platform_device *pdev, 
>pm_message_t message)
> * they will even be wakeup-enabled.
> */
>}
>-
>-   if (musb->set_clock)
>-   musb->set_clock(musb->clock, 0);
>-   else
>-   clk_disabl

RE: [PATCH 1/3] USB: musb: All each platform to have power hooks

2009-09-04 Thread Dasgupta, Romit
All the platform suspend/resume routines that have been separated out looks 
same. What about introducing .psuspend, .presume fields in struct musb and then 
from within musb_suspend() do the following? This way code duplication is 
reduced.

 if (musb->psuspend) 
 musb->suspend();

  if (musb->set_clock)
   musb->set_clock(musb->clock, 0);
   else
   clk_disable(musb->clock);
spin_unlock_irqrestore(&musb->lock, flags);
   return 0;



From: linux-omap-ow...@vger.kernel.org [linux-omap-ow...@vger.kernel.org] On 
Behalf Of Pandita, Vikram
Sent: Saturday, September 05, 2009 4:34 AM
To: linux-...@vger.kernel.org
Cc: linux-omap@vger.kernel.org; davi...@pacbell.net; Gupta, Ajay Kumar; 
Gadiyar, Anand; felipe.ba...@nokia.com; Pandita, Vikram
Subject: [PATCH 1/3] USB: musb: All each platform to have power hooks

This patch allows each MUSB platform (Davinci/TUSB/OMAP/Blackfin)
to have their own musb_platform_suspend/musb_platform_resume hooks

Each platform has its own power handling requirements and hence
distribute the suspend/resume functionality per platform

No new functionality is added for other platforms (blackfin/davinci/tusb)
In future these platforms can optimize their suspend/resume routines for
power.

Signed-off-by: Vikram Pandita 
Cc: Ajay Kumar Gupta 
---
 drivers/usb/musb/blackfin.c  |   15 +++
 drivers/usb/musb/davinci.c   |   24 
 drivers/usb/musb/musb_core.c |   15 +++
 drivers/usb/musb/omap2430.c  |4 +---
 drivers/usb/musb/tusb6010.c  |   24 
 include/linux/usb/musb.h |5 +
 6 files changed, 72 insertions(+), 15 deletions(-)

diff --git a/drivers/usb/musb/blackfin.c b/drivers/usb/musb/blackfin.c
index f2f66eb..9a716b2 100644
--- a/drivers/usb/musb/blackfin.c
+++ b/drivers/usb/musb/blackfin.c
@@ -305,11 +305,26 @@ int __init musb_platform_init(struct musb *musb)

 int musb_platform_suspend(struct musb *musb)
 {
+   if (!musb->clock)
+   return 0;
+
+   if (musb->set_clock)
+   musb->set_clock(musb->clock, 0);
+   else
+   clk_disable(musb->clock);
+
return 0;
 }

 int musb_platform_resume(struct musb *musb)
 {
+   if (!musb->clock)
+   return 0;
+
+   if (musb->set_clock)
+   musb->set_clock(musb->clock, 1);
+   else
+   clk_enable(musb->clock);
return 0;
 }

diff --git a/drivers/usb/musb/davinci.c b/drivers/usb/musb/davinci.c
index e16ff60..684e769 100644
--- a/drivers/usb/musb/davinci.c
+++ b/drivers/usb/musb/davinci.c
@@ -499,3 +499,27 @@ int musb_platform_exit(struct musb *musb)

return 0;
 }
+
+int musb_platform_suspend(struct musb *musb)
+{
+   if (!musb->clock)
+   return 0;
+
+   if (musb->set_clock)
+   musb->set_clock(musb->clock, 0);
+   else
+   clk_disable(musb->clock);
+   return 0;
+}
+
+int musb_platform_resume(struct musb *musb)
+{
+   if (!musb->clock)
+   return 0;
+
+   if (musb->set_clock)
+   musb->set_clock(musb->clock, 1);
+   else
+   clk_enable(musb->clock);
+   return 0;
+}
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
index c7c1ca0..ef97a0c 100644
--- a/drivers/usb/musb/musb_core.c
+++ b/drivers/usb/musb/musb_core.c
@@ -2186,13 +2186,9 @@ static int musb_suspend(struct platform_device *pdev, 
pm_message_t message)
 * they will even be wakeup-enabled.
 */
}
-
-   if (musb->set_clock)
-   musb->set_clock(musb->clock, 0);
-   else
-   clk_disable(musb->clock);
spin_unlock_irqrestore(&musb->lock, flags);
-   return 0;
+
+   return musb_platform_suspend(musb);
 }

 static int musb_resume_early(struct platform_device *pdev)
@@ -2202,16 +2198,11 @@ static int musb_resume_early(struct platform_device 
*pdev)
if (!musb->clock)
return 0;

-   if (musb->set_clock)
-   musb->set_clock(musb->clock, 1);
-   else
-   clk_enable(musb->clock);
-
/* for static cmos like DaVinci, register values were preserved
 * unless for some reason the whole soc powered down or the USB
 * module got reset through the PSC (vs just being disabled).
 */
-   return 0;
+   return musb_platform_resume(musb);
 }

 #else
diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c
index 3487520..b957575 100644
--- a/drivers/usb/musb/omap2430.c
+++ b/drivers/usb/musb/omap2430.c
@@ -188,8 +188,6 @@ static void omap_set_vbus(struct musb *musb, int is_on)
musb_readb(musb->mregs, MUSB_DEVCTL));
 }

-static int musb_platform_resume(struct musb *musb);
-
 i

[PATCH 1/3] USB: musb: All each platform to have power hooks

2009-09-04 Thread Vikram Pandita
This patch allows each MUSB platform (Davinci/TUSB/OMAP/Blackfin)
to have their own musb_platform_suspend/musb_platform_resume hooks

Each platform has its own power handling requirements and hence
distribute the suspend/resume functionality per platform

No new functionality is added for other platforms (blackfin/davinci/tusb)
In future these platforms can optimize their suspend/resume routines for
power.

Signed-off-by: Vikram Pandita 
Cc: Ajay Kumar Gupta 
---
 drivers/usb/musb/blackfin.c  |   15 +++
 drivers/usb/musb/davinci.c   |   24 
 drivers/usb/musb/musb_core.c |   15 +++
 drivers/usb/musb/omap2430.c  |4 +---
 drivers/usb/musb/tusb6010.c  |   24 
 include/linux/usb/musb.h |5 +
 6 files changed, 72 insertions(+), 15 deletions(-)

diff --git a/drivers/usb/musb/blackfin.c b/drivers/usb/musb/blackfin.c
index f2f66eb..9a716b2 100644
--- a/drivers/usb/musb/blackfin.c
+++ b/drivers/usb/musb/blackfin.c
@@ -305,11 +305,26 @@ int __init musb_platform_init(struct musb *musb)
 
 int musb_platform_suspend(struct musb *musb)
 {
+   if (!musb->clock)
+   return 0;
+
+   if (musb->set_clock)
+   musb->set_clock(musb->clock, 0);
+   else
+   clk_disable(musb->clock);
+
return 0;
 }
 
 int musb_platform_resume(struct musb *musb)
 {
+   if (!musb->clock)
+   return 0;
+
+   if (musb->set_clock)
+   musb->set_clock(musb->clock, 1);
+   else
+   clk_enable(musb->clock);
return 0;
 }
 
diff --git a/drivers/usb/musb/davinci.c b/drivers/usb/musb/davinci.c
index e16ff60..684e769 100644
--- a/drivers/usb/musb/davinci.c
+++ b/drivers/usb/musb/davinci.c
@@ -499,3 +499,27 @@ int musb_platform_exit(struct musb *musb)
 
return 0;
 }
+
+int musb_platform_suspend(struct musb *musb)
+{
+   if (!musb->clock)
+   return 0;
+
+   if (musb->set_clock)
+   musb->set_clock(musb->clock, 0);
+   else
+   clk_disable(musb->clock);
+   return 0;
+}
+
+int musb_platform_resume(struct musb *musb)
+{
+   if (!musb->clock)
+   return 0;
+
+   if (musb->set_clock)
+   musb->set_clock(musb->clock, 1);
+   else
+   clk_enable(musb->clock);
+   return 0;
+}
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
index c7c1ca0..ef97a0c 100644
--- a/drivers/usb/musb/musb_core.c
+++ b/drivers/usb/musb/musb_core.c
@@ -2186,13 +2186,9 @@ static int musb_suspend(struct platform_device *pdev, 
pm_message_t message)
 * they will even be wakeup-enabled.
 */
}
-
-   if (musb->set_clock)
-   musb->set_clock(musb->clock, 0);
-   else
-   clk_disable(musb->clock);
spin_unlock_irqrestore(&musb->lock, flags);
-   return 0;
+
+   return musb_platform_suspend(musb);
 }
 
 static int musb_resume_early(struct platform_device *pdev)
@@ -2202,16 +2198,11 @@ static int musb_resume_early(struct platform_device 
*pdev)
if (!musb->clock)
return 0;
 
-   if (musb->set_clock)
-   musb->set_clock(musb->clock, 1);
-   else
-   clk_enable(musb->clock);
-
/* for static cmos like DaVinci, register values were preserved
 * unless for some reason the whole soc powered down or the USB
 * module got reset through the PSC (vs just being disabled).
 */
-   return 0;
+   return musb_platform_resume(musb);
 }
 
 #else
diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c
index 3487520..b957575 100644
--- a/drivers/usb/musb/omap2430.c
+++ b/drivers/usb/musb/omap2430.c
@@ -188,8 +188,6 @@ static void omap_set_vbus(struct musb *musb, int is_on)
musb_readb(musb->mregs, MUSB_DEVCTL));
 }
 
-static int musb_platform_resume(struct musb *musb);
-
 int musb_platform_set_mode(struct musb *musb, u8 musb_mode)
 {
u8  devctl = musb_readb(musb->mregs, MUSB_DEVCTL);
@@ -281,7 +279,7 @@ int musb_platform_suspend(struct musb *musb)
return 0;
 }
 
-static int musb_platform_resume(struct musb *musb)
+int musb_platform_resume(struct musb *musb)
 {
u32 l;
 
diff --git a/drivers/usb/musb/tusb6010.c b/drivers/usb/musb/tusb6010.c
index 88b587c..7da5272 100644
--- a/drivers/usb/musb/tusb6010.c
+++ b/drivers/usb/musb/tusb6010.c
@@ -1169,3 +1169,27 @@ int musb_platform_exit(struct musb *musb)
usb_nop_xceiv_unregister();
return 0;
 }
+
+int musb_platform_suspend(struct musb *musb)
+{
+   if (!musb->clock)
+   return 0;
+
+   if (musb->set_clock)
+   musb->set_clock(musb->clock, 0);
+   else
+   clk_disable(musb->clock);
+   return 0;
+}
+
+int musb_platform_resume(struct musb *musb)
+{
+   if (!musb->clock)
+   return 0;
+
+   if (musb->set_clock)
+   mu