public inbox for linux-omap@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/5 v4] mfd: omap: usb: Runtime PM support for EHCI and OHCI drivers
@ 2011-08-09 14:15 Keshava Munegowda
  2011-08-09 14:15 ` [PATCH 1/5 v4] arm: omap: usb: ehci and ohci hwmod structures for omap4 Keshava Munegowda
  0 siblings, 1 reply; 20+ messages in thread
From: Keshava Munegowda @ 2011-08-09 14:15 UTC (permalink / raw)
  To: linux-usb, linux-omap, linux-kernel
  Cc: Keshava Munegowda, balbi, gadiyar, sameo, parthab, tony, khilman,
	b-cousson, paul, johnstul, vishwanath.bs, Keshava Munegowda

From: Keshava Munegowda <Keshava_mgowda@ti.com>

The Hwmod structures and Runtime PM features are implemented
For EHCI and OHCI drivers of OMAP3 and OMAP4.
The global suspend/resume of EHCI and OHCI
is validated on OMAP3430 sdp board with these patches.

these patches are rebased to kevin's pm branch and
usbhs latest mainline kernel patches

TODO:
       - Aggressive clock cutting in usb bus suspends
       - Remote Wakeup implementation using irq-chaing

Benoit Cousson (1):
  arm: omap: usb: ehci and ohci hwmod structures for omap4

Keshava Munegowda (4):
  arm: omap: usb: ehci and ohci hwmod structures for omap3
  arm: omap: usb: register hwmods of usbhs
  arm: omap: usb: device name change for the clk names of usbhs
  mfd: omap: usb: Runtime PM support

 arch/arm/mach-omap2/clock3xxx_data.c       |   26 +-
 arch/arm/mach-omap2/clock44xx_data.c       |   10 +-
 arch/arm/mach-omap2/omap_hwmod_3xxx_data.c |  279 +++++++++++
 arch/arm/mach-omap2/omap_hwmod_44xx_data.c |  244 ++++++++++
 arch/arm/mach-omap2/usb-host.c             |  114 ++---
 arch/arm/plat-omap/include/plat/usb.h      |    3 -
 drivers/mfd/omap-usb-host.c                |  724 +++++++++++-----------------
 drivers/usb/host/ehci-omap.c               |   19 +-
 drivers/usb/host/ohci-omap3.c              |   14 +-
 9 files changed, 877 insertions(+), 556 deletions(-)

^ permalink raw reply	[flat|nested] 20+ messages in thread

* [PATCH 1/5 v4] arm: omap: usb: ehci and ohci hwmod structures for omap4
  2011-08-09 14:15 [PATCH 0/5 v4] mfd: omap: usb: Runtime PM support for EHCI and OHCI drivers Keshava Munegowda
@ 2011-08-09 14:15 ` Keshava Munegowda
  2011-08-09 14:15   ` [PATCH 2/5 v4] arm: omap: usb: ehci and ohci hwmod structures for omap3 Keshava Munegowda
  0 siblings, 1 reply; 20+ messages in thread
From: Keshava Munegowda @ 2011-08-09 14:15 UTC (permalink / raw)
  To: linux-usb, linux-omap, linux-kernel
  Cc: Keshava Munegowda, balbi, gadiyar, sameo, parthab, tony, khilman,
	b-cousson, paul, johnstul, vishwanath.bs

From: Benoit Cousson <b-cousson@ti.com>

Following 4 hwmod strcuture are added:
UHH hwmod of usbhs with uhh base address and functional clock,
EHCI hwmod with irq and base address,
OHCI hwmod with irq and base address,
TLL hwmod of usbhs with the TLL base address and irq.

Signed-off-by: Benoit Cousson <b-cousson@ti.com>
Signed-off-by: Keshava Munegowda <keshava_mgowda@ti.com>
---
 arch/arm/mach-omap2/omap_hwmod_44xx_data.c |  244 ++++++++++++++++++++++++++++
 1 files changed, 244 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
index 6201422..d8f08fa 100644
--- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
@@ -68,6 +68,10 @@ static struct omap_hwmod omap44xx_mmc2_hwmod;
 static struct omap_hwmod omap44xx_mpu_hwmod;
 static struct omap_hwmod omap44xx_mpu_private_hwmod;
 static struct omap_hwmod omap44xx_usb_otg_hs_hwmod;
+static struct omap_hwmod omap44xx_usb_host_hs_hwmod;
+static struct omap_hwmod omap44xx_usbhs_ohci_hwmod;
+static struct omap_hwmod omap44xx_usbhs_ehci_hwmod;
+static struct omap_hwmod omap44xx_usb_tll_hs_hwmod;
 
 /*
  * Interconnects omap_hwmod structures
@@ -5336,6 +5340,242 @@ static struct omap_hwmod omap44xx_wd_timer3_hwmod = {
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
 };
 
+/*
+ * 'usb_host_hs' class
+ * high-speed multi-port usb host controller
+ */
+static struct omap_hwmod_ocp_if omap44xx_usb_host_hs__l3_main_2 = {
+	.master		= &omap44xx_usb_host_hs_hwmod,
+	.slave		= &omap44xx_l3_main_2_hwmod,
+	.clk		= "l3_div_ck",
+	.user		= OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+static struct omap_hwmod_class_sysconfig omap44xx_usb_host_hs_sysc = {
+	.rev_offs	= 0x0000,
+	.sysc_offs	= 0x0010,
+	.syss_offs	= 0x0014,
+	.sysc_flags	= (SYSC_HAS_MIDLEMODE | SYSC_HAS_SIDLEMODE),
+	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
+			   MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART |
+				MSTANDBY_SMART_WKUP),
+	.sysc_fields	= &omap_hwmod_sysc_type2,
+};
+
+static struct omap_hwmod_class omap44xx_usb_host_hs_hwmod_class = {
+	.name = "usbhs_uhh",
+	.sysc = &omap44xx_usb_host_hs_sysc,
+};
+
+static struct omap_hwmod_ocp_if *omap44xx_usb_host_hs_masters[] = {
+	&omap44xx_usb_host_hs__l3_main_2,
+};
+
+static struct omap_hwmod_addr_space omap44xx_usb_host_hs_addrs[] = {
+	{
+		.name		= "uhh",
+		.pa_start	= 0x4a064000,
+		.pa_end		= 0x4a0647ff,
+		.flags		= ADDR_TYPE_RT
+	},
+	{} /* Terminating Entry */
+};
+
+static struct omap_hwmod_ocp_if omap44xx_l4_cfg__usb_host_hs = {
+	.master		= &omap44xx_l4_cfg_hwmod,
+	.slave		= &omap44xx_usb_host_hs_hwmod,
+	.clk		= "l4_div_ck",
+	.addr		= omap44xx_usb_host_hs_addrs,
+	.user		= OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+static struct omap_hwmod_ocp_if *omap44xx_usb_host_hs_slaves[] = {
+	&omap44xx_l4_cfg__usb_host_hs,
+};
+
+static struct omap_hwmod omap44xx_usb_host_hs_hwmod = {
+	.name		= "usbhs_uhh",
+	.class		= &omap44xx_usb_host_hs_hwmod_class,
+	.clkdm_name	= "l3_init_clkdm",
+	.main_clk	= "usb_host_hs_fck",
+	.prcm = {
+		.omap4 = {
+			.clkctrl_offs = OMAP4_CM_L3INIT_USB_HOST_CLKCTRL_OFFSET,
+			.context_offs = OMAP4_RM_L3INIT_USB_HOST_CONTEXT_OFFSET,
+			.modulemode   = MODULEMODE_SWCTRL,
+		},
+	},
+	.slaves		= omap44xx_usb_host_hs_slaves,
+	.slaves_cnt	= ARRAY_SIZE(omap44xx_usb_host_hs_slaves),
+	.masters	= omap44xx_usb_host_hs_masters,
+	.masters_cnt	= ARRAY_SIZE(omap44xx_usb_host_hs_masters),
+	.flags		= HWMOD_SWSUP_SIDLE | HWMOD_SWSUP_MSTANDBY,
+	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
+};
+
+/* 'usbhs_ohci' class */
+static struct omap_hwmod_class omap44xx_usbhs_ohci_hwmod_class = {
+	.name = "usbhs_ohci",
+};
+
+static struct omap_hwmod_irq_info omap44xx_usbhs_ohci_irqs[] = {
+	{ .name = "ohci-irq", .irq = 76 + OMAP44XX_IRQ_GIC_START },
+	{ .irq = -1 } /* Terminating IRQ */
+};
+
+static struct omap_hwmod_addr_space omap44xx_usbhs_ohci_addrs[] = {
+	{
+		.name		= "ohci",
+		.pa_start	= 0x4A064800,
+		.pa_end		= 0x4A064BFF,
+		.flags		= ADDR_MAP_ON_INIT
+	},
+	{}
+};
+
+static struct omap_hwmod_ocp_if omap44xx_l4_cfg__usbhs_ohci = {
+	.master		= &omap44xx_l4_cfg_hwmod,
+	.slave		= &omap44xx_usbhs_ohci_hwmod,
+	.clk		= "l4_div_ck",
+	.addr		= omap44xx_usbhs_ohci_addrs,
+	.user		= OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+static struct omap_hwmod_ocp_if *omap44xx_usbhs_ohci_slaves[] = {
+	&omap44xx_l4_cfg__usbhs_ohci,
+};
+
+static struct omap_hwmod_ocp_if *omap44xx_usbhs_ohci_masters[] = {
+	&omap44xx_usb_host_hs__l3_main_2,
+};
+
+static struct omap_hwmod omap44xx_usbhs_ohci_hwmod = {
+	.name		= "usbhs_ohci",
+	.class		= &omap44xx_usbhs_ohci_hwmod_class,
+	.clkdm_name	= "l3_init_clkdm",
+	.mpu_irqs	= omap44xx_usbhs_ohci_irqs,
+	.slaves		= omap44xx_usbhs_ohci_slaves,
+	.slaves_cnt	= ARRAY_SIZE(omap44xx_usbhs_ohci_slaves),
+	.masters	= omap44xx_usbhs_ohci_masters,
+	.masters_cnt	= ARRAY_SIZE(omap44xx_usbhs_ohci_masters),
+	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
+	.flags		= HWMOD_INIT_NO_RESET | HWMOD_NO_IDLEST,
+};
+
+/* 'usbhs_ehci' class */
+static struct omap_hwmod_class omap44xx_usbhs_ehci_hwmod_class = {
+	.name = "usbhs_ehci",
+};
+
+static struct omap_hwmod_irq_info omap44xx_usbhs_ehci_irqs[] = {
+	{ .name = "ehci-irq", .irq = 77 + OMAP44XX_IRQ_GIC_START },
+	{ .irq = -1 } /* Terminating IRQ */
+};
+
+static struct omap_hwmod_addr_space omap44xx_usbhs_ehci_addrs[] = {
+	{
+		.name		= "ehci",
+		.pa_start	= 0x4A064C00,
+		.pa_end		= 0x4A064FFF,
+		.flags		= ADDR_MAP_ON_INIT
+	},
+	{} /* Terminating Entry */
+};
+
+static struct omap_hwmod_ocp_if omap44xx_l4_cfg__usbhs_ehci = {
+	.master		= &omap44xx_l4_cfg_hwmod,
+	.slave		= &omap44xx_usbhs_ehci_hwmod,
+	.clk		= "l4_div_ck",
+	.addr		= omap44xx_usbhs_ehci_addrs,
+	.user		= OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+static struct omap_hwmod_ocp_if *omap44xx_usbhs_ehci_slaves[] = {
+	&omap44xx_l4_cfg__usbhs_ehci,
+};
+
+static struct omap_hwmod_ocp_if *omap44xx_usbhs_ehci_masters[] = {
+	&omap44xx_usb_host_hs__l3_main_2,
+};
+
+
+static struct omap_hwmod omap44xx_usbhs_ehci_hwmod = {
+	.name		= "usbhs_ehci",
+	.class		= &omap44xx_usbhs_ehci_hwmod_class,
+	.clkdm_name	= "l3_init_clkdm",
+	.mpu_irqs	= omap44xx_usbhs_ehci_irqs,
+	.slaves		= omap44xx_usbhs_ehci_slaves,
+	.slaves_cnt	= ARRAY_SIZE(omap44xx_usbhs_ehci_slaves),
+	.masters	= omap44xx_usbhs_ehci_masters,
+	.masters_cnt	= ARRAY_SIZE(omap44xx_usbhs_ehci_masters),
+	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
+	.flags		= HWMOD_INIT_NO_RESET | HWMOD_NO_IDLEST,
+};
+
+/*
+ * 'usb_tll_hs' class
+ * usb_tll_hs module is the adapter on the usb_host_hs ports
+ */
+static struct omap_hwmod_class_sysconfig omap44xx_usb_tll_hs_sysc = {
+	.rev_offs	= 0x0000,
+	.sysc_offs	= 0x0010,
+	.syss_offs	= 0x0014,
+	.sysc_flags	= (SYSC_HAS_AUTOIDLE | SYSC_HAS_SIDLEMODE),
+	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
+	.sysc_fields	= &omap_hwmod_sysc_type1,
+};
+
+static struct omap_hwmod_class omap44xx_usb_tll_hs_hwmod_class = {
+	.name = "usbhs_tll",
+	.sysc = &omap44xx_usb_tll_hs_sysc,
+};
+
+static struct omap_hwmod_irq_info omap44xx_usb_tll_hs_irqs[] = {
+	{ .name = "tll-irq", .irq = 78 + OMAP44XX_IRQ_GIC_START },
+	{ .irq = -1 } /* Terminating IRQ */
+};
+
+static struct omap_hwmod_addr_space omap44xx_usb_tll_hs_addrs[] = {
+	{
+		.name		= "tll",
+		.pa_start	= 0x4a062000,
+		.pa_end		= 0x4a063fff,
+		.flags		= ADDR_TYPE_RT
+	},
+	{} /* Terminating Entry */
+};
+
+static struct omap_hwmod_ocp_if omap44xx_l4_cfg__usb_tll_hs = {
+	.master		= &omap44xx_l4_cfg_hwmod,
+	.slave		= &omap44xx_usb_tll_hs_hwmod,
+	.clk		= "l4_div_ck",
+	.addr		= omap44xx_usb_tll_hs_addrs,
+	.user		= OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+static struct omap_hwmod_ocp_if *omap44xx_usb_tll_hs_slaves[] = {
+	&omap44xx_l4_cfg__usb_tll_hs,
+};
+
+static struct omap_hwmod omap44xx_usb_tll_hs_hwmod = {
+	.name		= "usbhs_tll",
+	.class		= &omap44xx_usb_tll_hs_hwmod_class,
+	.clkdm_name	= "l3_init_clkdm",
+	.mpu_irqs	= omap44xx_usb_tll_hs_irqs,
+	.main_clk	= "usb_tll_hs_ick",
+	.prcm = {
+		.omap4 = {
+			.clkctrl_offs = OMAP4_CM_L3INIT_USB_TLL_CLKCTRL_OFFSET,
+			.context_offs = OMAP4_RM_L3INIT_USB_TLL_CONTEXT_OFFSET,
+			.modulemode   = MODULEMODE_HWCTRL,
+		},
+	},
+	.slaves		= omap44xx_usb_tll_hs_slaves,
+	.slaves_cnt	= ARRAY_SIZE(omap44xx_usb_tll_hs_slaves),
+	.flags		= HWMOD_SWSUP_SIDLE,
+	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
+};
+
 static __initdata struct omap_hwmod *omap44xx_hwmods[] = {
 
 	/* dmm class */
@@ -5482,6 +5722,10 @@ static __initdata struct omap_hwmod *omap44xx_hwmods[] = {
 	&omap44xx_wd_timer2_hwmod,
 	&omap44xx_wd_timer3_hwmod,
 
+	&omap44xx_usb_host_hs_hwmod,
+	&omap44xx_usbhs_ohci_hwmod,
+	&omap44xx_usbhs_ehci_hwmod,
+	&omap44xx_usb_tll_hs_hwmod,
 	NULL,
 };
 
-- 
1.6.0.4

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 2/5 v4] arm: omap: usb: ehci and ohci hwmod structures for omap3
  2011-08-09 14:15 ` [PATCH 1/5 v4] arm: omap: usb: ehci and ohci hwmod structures for omap4 Keshava Munegowda
@ 2011-08-09 14:15   ` Keshava Munegowda
  2011-08-09 14:15     ` [PATCH 3/5 v4] arm: omap: usb: register hwmods of usbhs Keshava Munegowda
       [not found]     ` <1312899309-24067-3-git-send-email-keshava_mgowda-l0cyMroinI0@public.gmane.org>
  0 siblings, 2 replies; 20+ messages in thread
From: Keshava Munegowda @ 2011-08-09 14:15 UTC (permalink / raw)
  To: linux-usb, linux-omap, linux-kernel
  Cc: Keshava Munegowda, balbi, gadiyar, sameo, parthab, tony, khilman,
	b-cousson, paul, johnstul, vishwanath.bs

Following 4 hwmod strcuture are added:
UHH hwmod of usbhs with uhh base address and functional clock,
EHCI hwmod with irq and base address,
OHCI hwmod with irq and base address,
TLL hwmod of usbhs with the TLL base address and irq.

Signed-off-by: Keshava Munegowda <keshava_mgowda@ti.com>
---
 arch/arm/mach-omap2/omap_hwmod_3xxx_data.c |  279 ++++++++++++++++++++++++++++
 1 files changed, 279 insertions(+), 0 deletions(-)

diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
index 59fdb9f..d7316b3 100644
--- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
@@ -84,6 +84,10 @@ static struct omap_hwmod omap3xxx_mcbsp4_hwmod;
 static struct omap_hwmod omap3xxx_mcbsp5_hwmod;
 static struct omap_hwmod omap3xxx_mcbsp2_sidetone_hwmod;
 static struct omap_hwmod omap3xxx_mcbsp3_sidetone_hwmod;
+static struct omap_hwmod omap34xx_usb_host_hs_hwmod;
+static struct omap_hwmod omap34xx_usbhs_ohci_hwmod;
+static struct omap_hwmod omap34xx_usbhs_ehci_hwmod;
+static struct omap_hwmod omap34xx_usb_tll_hs_hwmod;
 
 /* L3 -> L4_CORE interface */
 static struct omap_hwmod_ocp_if omap3xxx_l3_main__l4_core = {
@@ -3196,6 +3200,276 @@ static struct omap_hwmod omap3xxx_mmc3_hwmod = {
 	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
 };
 
+/*
+ * 'usb_host_hs' class
+ * high-speed multi-port usb host controller
+ */
+static struct omap_hwmod_ocp_if omap34xx_usb_host_hs__l3_main_2 = {
+	.master		= &omap34xx_usb_host_hs_hwmod,
+	.slave		= &omap3xxx_l3_main_hwmod,
+	.clk		= "core_l3_ick",
+	.user		= OCP_USER_MPU,
+};
+
+static struct omap_hwmod_class_sysconfig omap34xx_usb_host_hs_sysc = {
+	.rev_offs	= 0x0000,
+	.sysc_offs	= 0x0010,
+	.syss_offs	= 0x0014,
+	.sysc_flags	= (SYSC_HAS_MIDLEMODE | SYSC_HAS_SIDLEMODE),
+	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
+			   MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
+	.sysc_fields	= &omap_hwmod_sysc_type1,
+};
+
+static struct omap_hwmod_class omap34xx_usb_host_hs_hwmod_class = {
+	.name = "usbhs_uhh",
+	.sysc = &omap34xx_usb_host_hs_sysc,
+};
+
+static struct omap_hwmod_ocp_if *omap34xx_usb_host_hs_masters[] = {
+	&omap34xx_usb_host_hs__l3_main_2,
+};
+
+static struct omap_hwmod_addr_space omap34xx_usb_host_hs_addrs[] = {
+	{
+		.name		= "uhh",
+		.pa_start	= 0x48064000,
+		.pa_end		= 0x480643ff,
+		.flags		= ADDR_TYPE_RT
+	},
+	{} /* Terminating Entry */
+};
+
+static struct omap_hwmod_ocp_if omap34xx_l4_cfg__usb_host_hs = {
+	.master		= &omap3xxx_l4_core_hwmod,
+	.slave		= &omap34xx_usb_host_hs_hwmod,
+	.clk		= "l4_ick",
+	.addr		= omap34xx_usb_host_hs_addrs,
+	.user		= OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+static struct omap_hwmod_ocp_if omap34xx_f128m_cfg__usb_host_hs = {
+	.clk		= "usbhost_120m_fck",
+	.user		= OCP_USER_MPU,
+	.flags		= OCPIF_SWSUP_IDLE,
+};
+
+static struct omap_hwmod_ocp_if omap34xx_f48m_cfg__usb_host_hs = {
+	.clk		= "usbhost_48m_fck",
+	.user		= OCP_USER_MPU,
+	.flags		= OCPIF_SWSUP_IDLE,
+};
+
+static struct omap_hwmod_ocp_if *omap34xx_usb_host_hs_slaves[] = {
+	&omap34xx_l4_cfg__usb_host_hs,
+	&omap34xx_f128m_cfg__usb_host_hs,
+	&omap34xx_f48m_cfg__usb_host_hs,
+};
+
+static struct omap_hwmod omap34xx_usb_host_hs_hwmod = {
+	.name		= "usbhs_uhh",
+	.class		= &omap34xx_usb_host_hs_hwmod_class,
+	.main_clk	= "usbhost_ick",
+	.prcm = {
+		.omap2 = {
+			.module_offs = OMAP3430ES2_USBHOST_MOD,
+			.prcm_reg_id = 1,
+			.module_bit = 0,
+			.idlest_reg_id = 1,
+			.idlest_idle_bit = 1,
+			.idlest_stdby_bit = 0,
+		},
+	},
+	.slaves		= omap34xx_usb_host_hs_slaves,
+	.slaves_cnt	= ARRAY_SIZE(omap34xx_usb_host_hs_slaves),
+	.masters	= omap34xx_usb_host_hs_masters,
+	.masters_cnt	= ARRAY_SIZE(omap34xx_usb_host_hs_masters),
+	.flags		= HWMOD_SWSUP_SIDLE | HWMOD_SWSUP_MSTANDBY,
+	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
+};
+
+/* 'usbhs_ohci' class  */
+static struct omap_hwmod_ocp_if omap34xx_usbhs_ohci__l3_main_2 = {
+	.master		= &omap34xx_usbhs_ohci_hwmod,
+	.slave		= &omap3xxx_l3_main_hwmod,
+	.clk		= "core_l3_ick",
+	.user		= OCP_USER_MPU,
+};
+
+static struct omap_hwmod_class omap34xx_usbhs_ohci_hwmod_class = {
+	.name = "usbhs_ohci",
+};
+
+static struct omap_hwmod_ocp_if *omap34xx_usbhs_ohci_masters[] = {
+	&omap34xx_usbhs_ohci__l3_main_2,
+};
+
+static struct omap_hwmod_irq_info omap34xx_usbhs_ohci_irqs[] = {
+	{ .name = "ohci-irq", .irq = 76 },
+	{ .irq = -1 } /* Terminating IRQ */
+};
+
+static struct omap_hwmod_addr_space omap34xx_usbhs_ohci_addrs[] = {
+	{
+		.name		= "ohci",
+		.pa_start	= 0x48064400,
+		.pa_end		= 0x480647FF,
+		.flags		= ADDR_MAP_ON_INIT
+	},
+	{} /* Terminating Entry */
+};
+
+static struct omap_hwmod_ocp_if omap34xx_l4_cfg__usbhs_ohci = {
+	.master		= &omap3xxx_l4_core_hwmod,
+	.slave		= &omap34xx_usbhs_ohci_hwmod,
+	.clk		= "l4_ick",
+	.addr		= omap34xx_usbhs_ohci_addrs,
+	.user		= OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+static struct omap_hwmod_ocp_if *omap34xx_usbhs_ohci_slaves[] = {
+	&omap34xx_l4_cfg__usbhs_ohci,
+};
+
+static struct omap_hwmod omap34xx_usbhs_ohci_hwmod = {
+	.name		= "usbhs_ohci",
+	.class		= &omap34xx_usbhs_ohci_hwmod_class,
+	.mpu_irqs	= omap34xx_usbhs_ohci_irqs,
+	.slaves		= omap34xx_usbhs_ohci_slaves,
+	.slaves_cnt	= ARRAY_SIZE(omap34xx_usbhs_ohci_slaves),
+	.masters	= omap34xx_usbhs_ohci_masters,
+	.masters_cnt	= ARRAY_SIZE(omap34xx_usbhs_ohci_masters),
+	.flags		= HWMOD_INIT_NO_RESET | HWMOD_NO_IDLEST,
+	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
+};
+
+/* 'usbhs_ehci' class  */
+static struct omap_hwmod_ocp_if omap34xx_usbhs_ehci__l3_main_2 = {
+	.master		= &omap34xx_usbhs_ehci_hwmod,
+	.slave		= &omap3xxx_l3_main_hwmod,
+	.clk		= "core_l3_ick",
+	.user		= OCP_USER_MPU,
+};
+
+static struct omap_hwmod_class omap34xx_usbhs_ehci_hwmod_class = {
+	.name = "usbhs_ehci",
+};
+
+static struct omap_hwmod_ocp_if *omap34xx_usbhs_ehci_masters[] = {
+	&omap34xx_usbhs_ehci__l3_main_2,
+};
+
+static struct omap_hwmod_irq_info omap34xx_usbhs_ehci_irqs[] = {
+	{ .name = "ehci-irq", .irq = 77 },
+	{ .irq = -1 } /* Terminating IRQ */
+};
+
+static struct omap_hwmod_addr_space omap34xx_usbhs_ehci_addrs[] = {
+	{
+		.name		= "ehci",
+		.pa_start	= 0x48064800,
+		.pa_end		= 0x48064CFF,
+		.flags		= ADDR_MAP_ON_INIT
+	},
+	{} /* Terminating Entry */
+};
+
+static struct omap_hwmod_ocp_if omap34xx_l4_cfg__usbhs_ehci = {
+	.master		= &omap3xxx_l4_core_hwmod,
+	.slave		= &omap34xx_usbhs_ehci_hwmod,
+	.clk		= "l4_ick",
+	.addr		= omap34xx_usbhs_ehci_addrs,
+	.user		= OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+static struct omap_hwmod_ocp_if *omap34xx_usbhs_ehci_slaves[] = {
+	&omap34xx_l4_cfg__usbhs_ehci,
+};
+
+static struct omap_hwmod omap34xx_usbhs_ehci_hwmod = {
+	.name		= "usbhs_ehci",
+	.class		= &omap34xx_usbhs_ehci_hwmod_class,
+	.mpu_irqs	= omap34xx_usbhs_ehci_irqs,
+	.slaves		= omap34xx_usbhs_ehci_slaves,
+	.slaves_cnt	= ARRAY_SIZE(omap34xx_usbhs_ehci_slaves),
+	.masters	= omap34xx_usbhs_ehci_masters,
+	.masters_cnt	= ARRAY_SIZE(omap34xx_usbhs_ehci_masters),
+	.flags		= HWMOD_INIT_NO_RESET | HWMOD_NO_IDLEST,
+	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
+};
+
+/*
+ * 'usb_tll_hs' class
+ * usb_tll_hs module is the adapter on the usb_host_hs ports
+ */
+static struct omap_hwmod_class_sysconfig omap34xx_usb_tll_hs_sysc = {
+	.rev_offs	= 0x0000,
+	.sysc_offs	= 0x0010,
+	.syss_offs	= 0x0014,
+	.sysc_flags	= (SYSC_HAS_AUTOIDLE | SYSC_HAS_SIDLEMODE),
+	.idlemodes	= (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
+	.sysc_fields	= &omap_hwmod_sysc_type1,
+};
+
+static struct omap_hwmod_class omap34xx_usb_tll_hs_hwmod_class = {
+	.name = "usbhs_tll",
+	.sysc = &omap34xx_usb_tll_hs_sysc,
+};
+
+static struct omap_hwmod_irq_info omap34xx_usb_tll_hs_irqs[] = {
+	{ .name = "tll-irq", .irq = 78 },
+	{ .irq = -1 } /* Terminating IRQ */
+};
+
+static struct omap_hwmod_addr_space omap34xx_usb_tll_hs_addrs[] = {
+	{
+		.name		= "tll",
+		.pa_start	= 0x48062000,
+		.pa_end		= 0x48062fff,
+		.flags		= ADDR_TYPE_RT
+	},
+	{} /* Terminating Entry */
+};
+
+static struct omap_hwmod_ocp_if omap34xx_f_cfg__usb_tll_hs = {
+	.clk		= "usbtll_fck",
+	.user		= OCP_USER_MPU,
+	.flags		= OCPIF_SWSUP_IDLE,
+};
+
+static struct omap_hwmod_ocp_if omap34xx_l4_cfg__usb_tll_hs = {
+	.master		= &omap3xxx_l4_core_hwmod,
+	.slave		= &omap34xx_usb_tll_hs_hwmod,
+	.clk		= "l4_ick",
+	.addr		= omap34xx_usb_tll_hs_addrs,
+	.user		= OCP_USER_MPU | OCP_USER_SDMA,
+};
+
+static struct omap_hwmod_ocp_if *omap34xx_usb_tll_hs_slaves[] = {
+	&omap34xx_l4_cfg__usb_tll_hs,
+	&omap34xx_f_cfg__usb_tll_hs,
+};
+
+static struct omap_hwmod omap34xx_usb_tll_hs_hwmod = {
+	.name		= "usbhs_tll",
+	.class		= &omap34xx_usb_tll_hs_hwmod_class,
+	.mpu_irqs	= omap34xx_usb_tll_hs_irqs,
+	.main_clk	= "usbtll_ick",
+	.prcm = {
+		.omap2 = {
+			.module_offs = CORE_MOD,
+			.prcm_reg_id = 3,
+			.module_bit = 2,
+			.idlest_reg_id = 3,
+			.idlest_idle_bit = 2,
+		},
+	},
+	.slaves		= omap34xx_usb_tll_hs_slaves,
+	.slaves_cnt	= ARRAY_SIZE(omap34xx_usb_tll_hs_slaves),
+	.flags		= HWMOD_SWSUP_SIDLE | HWMOD_SWSUP_MSTANDBY,
+	.omap_chip	= OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
+};
+
 static __initdata struct omap_hwmod *omap3xxx_hwmods[] = {
 	&omap3xxx_l3_main_hwmod,
 	&omap3xxx_l4_core_hwmod,
@@ -3278,6 +3552,11 @@ static __initdata struct omap_hwmod *omap3xxx_hwmods[] = {
 	/* usbotg for am35x */
 	&am35xx_usbhsotg_hwmod,
 
+	&omap34xx_usb_host_hs_hwmod,
+	&omap34xx_usbhs_ohci_hwmod,
+	&omap34xx_usbhs_ehci_hwmod,
+	&omap34xx_usb_tll_hs_hwmod,
+
 	NULL,
 };
 
-- 
1.6.0.4


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 3/5 v4] arm: omap: usb: register hwmods of usbhs
  2011-08-09 14:15   ` [PATCH 2/5 v4] arm: omap: usb: ehci and ohci hwmod structures for omap3 Keshava Munegowda
@ 2011-08-09 14:15     ` Keshava Munegowda
  2011-08-09 14:15       ` [PATCH 4/5 v4] arm: omap: usb: device name change for the clk names " Keshava Munegowda
       [not found]     ` <1312899309-24067-3-git-send-email-keshava_mgowda-l0cyMroinI0@public.gmane.org>
  1 sibling, 1 reply; 20+ messages in thread
From: Keshava Munegowda @ 2011-08-09 14:15 UTC (permalink / raw)
  To: linux-usb, linux-omap, linux-kernel
  Cc: Keshava Munegowda, balbi, gadiyar, sameo, parthab, tony, khilman,
	b-cousson, paul, johnstul, vishwanath.bs

The hwmod structure of uhh, ohci, ehci and tll are
retrived and registered with omap device

Signed-off-by: Keshava Munegowda <keshava_mgowda@ti.com>
---
 arch/arm/mach-omap2/usb-host.c |  114 +++++++++++++++++----------------------
 1 files changed, 50 insertions(+), 64 deletions(-)

diff --git a/arch/arm/mach-omap2/usb-host.c b/arch/arm/mach-omap2/usb-host.c
index 89ae298..9c37db9 100644
--- a/arch/arm/mach-omap2/usb-host.c
+++ b/arch/arm/mach-omap2/usb-host.c
@@ -28,51 +28,30 @@
 #include <mach/hardware.h>
 #include <mach/irqs.h>
 #include <plat/usb.h>
+#include <plat/omap_device.h>
 
 #include "mux.h"
 
 #ifdef CONFIG_MFD_OMAP_USB_HOST
 
-#define OMAP_USBHS_DEVICE	"usbhs-omap"
-
-static struct resource usbhs_resources[] = {
-	{
-		.name	= "uhh",
-		.flags	= IORESOURCE_MEM,
-	},
-	{
-		.name	= "tll",
-		.flags	= IORESOURCE_MEM,
-	},
-	{
-		.name	= "ehci",
-		.flags	= IORESOURCE_MEM,
-	},
-	{
-		.name	= "ehci-irq",
-		.flags	= IORESOURCE_IRQ,
-	},
-	{
-		.name	= "ohci",
-		.flags	= IORESOURCE_MEM,
-	},
-	{
-		.name	= "ohci-irq",
-		.flags	= IORESOURCE_IRQ,
-	}
-};
-
-static struct platform_device usbhs_device = {
-	.name		= OMAP_USBHS_DEVICE,
-	.id		= 0,
-	.num_resources	= ARRAY_SIZE(usbhs_resources),
-	.resource	= usbhs_resources,
-};
+#define OMAP_USBHS_DEVICE	"usbhs_omap"
+#define	USBHS_UHH_HWMODNAME	"usbhs_uhh"
+#define	USBHS_OHCI_HWMODNAME	"usbhs_ohci"
+#define USBHS_EHCI_HWMODNAME	"usbhs_ehci"
+#define USBHS_TLL_HWMODNAME	"usbhs_tll"
 
 static struct usbhs_omap_platform_data		usbhs_data;
 static struct ehci_hcd_omap_platform_data	ehci_data;
 static struct ohci_hcd_omap_platform_data	ohci_data;
 
+static struct omap_device_pm_latency omap_uhhtll_latency[] = {
+	  {
+		.deactivate_func = omap_device_idle_hwmods,
+		.activate_func	 = omap_device_enable_hwmods,
+		.flags = OMAP_DEVICE_LATENCY_AUTO_ADJUST,
+	  },
+};
+
 /* MUX settings for EHCI pins */
 /*
  * setup_ehci_io_mux - initialize IO pad mux for USBHOST
@@ -508,7 +487,10 @@ static void setup_4430ohci_io_mux(const enum usbhs_omap_port_mode *port_mode)
 
 void __init usbhs_init(const struct usbhs_omap_board_data *pdata)
 {
-	int	i;
+	struct omap_hwmod	*oh[4];
+	struct omap_device	*od;
+	int			bus_id = -1;
+	int			i;
 
 	for (i = 0; i < OMAP3_HS_USB_PORTS; i++) {
 		usbhs_data.port_mode[i] = pdata->port_mode[i];
@@ -523,44 +505,48 @@ void __init usbhs_init(const struct usbhs_omap_board_data *pdata)
 	usbhs_data.ohci_data = &ohci_data;
 
 	if (cpu_is_omap34xx()) {
-		usbhs_resources[0].start = OMAP34XX_UHH_CONFIG_BASE;
-		usbhs_resources[0].end = OMAP34XX_UHH_CONFIG_BASE + SZ_1K - 1;
-		usbhs_resources[1].start = OMAP34XX_USBTLL_BASE;
-		usbhs_resources[1].end = OMAP34XX_USBTLL_BASE + SZ_4K - 1;
-		usbhs_resources[2].start	= OMAP34XX_EHCI_BASE;
-		usbhs_resources[2].end	= OMAP34XX_EHCI_BASE + SZ_1K - 1;
-		usbhs_resources[3].start = INT_34XX_EHCI_IRQ;
-		usbhs_resources[4].start	= OMAP34XX_OHCI_BASE;
-		usbhs_resources[4].end	= OMAP34XX_OHCI_BASE + SZ_1K - 1;
-		usbhs_resources[5].start = INT_34XX_OHCI_IRQ;
 		setup_ehci_io_mux(pdata->port_mode);
 		setup_ohci_io_mux(pdata->port_mode);
 	} else if (cpu_is_omap44xx()) {
-		usbhs_resources[0].start = OMAP44XX_UHH_CONFIG_BASE;
-		usbhs_resources[0].end = OMAP44XX_UHH_CONFIG_BASE + SZ_1K - 1;
-		usbhs_resources[1].start = OMAP44XX_USBTLL_BASE;
-		usbhs_resources[1].end = OMAP44XX_USBTLL_BASE + SZ_4K - 1;
-		usbhs_resources[2].start = OMAP44XX_HSUSB_EHCI_BASE;
-		usbhs_resources[2].end = OMAP44XX_HSUSB_EHCI_BASE + SZ_1K - 1;
-		usbhs_resources[3].start = OMAP44XX_IRQ_EHCI;
-		usbhs_resources[4].start = OMAP44XX_HSUSB_OHCI_BASE;
-		usbhs_resources[4].end = OMAP44XX_HSUSB_OHCI_BASE + SZ_1K - 1;
-		usbhs_resources[5].start = OMAP44XX_IRQ_OHCI;
 		setup_4430ehci_io_mux(pdata->port_mode);
 		setup_4430ohci_io_mux(pdata->port_mode);
 	}
 
-	if (platform_device_add_data(&usbhs_device,
-				&usbhs_data, sizeof(usbhs_data)) < 0) {
-		printk(KERN_ERR "USBHS platform_device_add_data failed\n");
-		goto init_end;
+	oh[0] = omap_hwmod_lookup(USBHS_UHH_HWMODNAME);
+	if (!oh[0]) {
+		pr_err("Could not look up %s\n", USBHS_UHH_HWMODNAME);
+		return;
+	}
+
+	oh[1] = omap_hwmod_lookup(USBHS_OHCI_HWMODNAME);
+	if (!oh[1]) {
+		pr_err("Could not look up %s\n", USBHS_UHH_HWMODNAME);
+		return;
 	}
 
-	if (platform_device_register(&usbhs_device) < 0)
-		printk(KERN_ERR "USBHS platform_device_register failed\n");
+	oh[2] = omap_hwmod_lookup(USBHS_EHCI_HWMODNAME);
+	if (!oh[2]) {
+		pr_err("Could not look up %s\n", USBHS_TLL_HWMODNAME);
+		return;
+	}
 
-init_end:
-	return;
+	oh[3] = omap_hwmod_lookup(USBHS_TLL_HWMODNAME);
+	if (!oh[3]) {
+		pr_err("Could not look up %s\n", USBHS_TLL_HWMODNAME);
+		return;
+	}
+
+	od = omap_device_build_ss(OMAP_USBHS_DEVICE, bus_id, oh, 4,
+				(void *)&usbhs_data, sizeof(usbhs_data),
+				omap_uhhtll_latency,
+				ARRAY_SIZE(omap_uhhtll_latency), false);
+
+	if (IS_ERR(od)) {
+		pr_err("Could not build hwmod devices %s, %s, %s, %s\n",
+			USBHS_UHH_HWMODNAME, USBHS_OHCI_HWMODNAME,
+			USBHS_EHCI_HWMODNAME, USBHS_TLL_HWMODNAME);
+		return;
+	}
 }
 
 #else
-- 
1.6.0.4

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 4/5 v4] arm: omap: usb: device name change for the clk names of usbhs
  2011-08-09 14:15     ` [PATCH 3/5 v4] arm: omap: usb: register hwmods of usbhs Keshava Munegowda
@ 2011-08-09 14:15       ` Keshava Munegowda
  2011-08-09 14:15         ` [PATCH 5/5 v4] mfd: omap: usb: Runtime PM support Keshava Munegowda
  0 siblings, 1 reply; 20+ messages in thread
From: Keshava Munegowda @ 2011-08-09 14:15 UTC (permalink / raw)
  To: linux-usb, linux-omap, linux-kernel
  Cc: Keshava Munegowda, balbi, gadiyar, sameo, parthab, tony, khilman,
	b-cousson, paul, johnstul, vishwanath.bs, Keshava Munegowda

From: Keshava Munegowda <Keshava_mgowda@ti.com>

device name usbhs clocks are changed from
usbhs-omap.0 to usbhs_omap; this is because
in the hwmod registration the device name is set
as usbhs_omap; The redudant clock nodes are removed.

Signed-off-by: Keshava Munegowda <keshava_mgowda@ti.com>
---
 arch/arm/mach-omap2/clock3xxx_data.c |   26 ++++++++++++--------------
 arch/arm/mach-omap2/clock44xx_data.c |   10 +++++-----
 drivers/mfd/omap-usb-host.c          |    2 +-
 3 files changed, 18 insertions(+), 20 deletions(-)

diff --git a/arch/arm/mach-omap2/clock3xxx_data.c b/arch/arm/mach-omap2/clock3xxx_data.c
index ffd55b1..63a822f 100644
--- a/arch/arm/mach-omap2/clock3xxx_data.c
+++ b/arch/arm/mach-omap2/clock3xxx_data.c
@@ -3285,7 +3285,7 @@ static struct omap_clk omap3xxx_clks[] = {
 	CLK(NULL,	"cpefuse_fck",	&cpefuse_fck,	CK_3430ES2PLUS | CK_AM35XX | CK_36XX),
 	CLK(NULL,	"ts_fck",	&ts_fck,	CK_3430ES2PLUS | CK_AM35XX | CK_36XX),
 	CLK(NULL,	"usbtll_fck",	&usbtll_fck,	CK_3430ES2PLUS | CK_AM35XX | CK_36XX),
-	CLK("usbhs-omap.0",	"usbtll_fck",	&usbtll_fck,	CK_3430ES2PLUS | CK_AM35XX | CK_36XX),
+	CLK("usbhs_omap",	"usbtll_fck",	&usbtll_fck,	CK_3430ES2PLUS | CK_AM35XX | CK_36XX),
 	CLK("omap-mcbsp.1",	"prcm_fck",	&core_96m_fck,	CK_3XXX),
 	CLK("omap-mcbsp.5",	"prcm_fck",	&core_96m_fck,	CK_3XXX),
 	CLK(NULL,	"core_96m_fck",	&core_96m_fck,	CK_3XXX),
@@ -3321,7 +3321,7 @@ static struct omap_clk omap3xxx_clks[] = {
 	CLK(NULL,	"pka_ick",	&pka_ick,	CK_34XX | CK_36XX),
 	CLK(NULL,	"core_l4_ick",	&core_l4_ick,	CK_3XXX),
 	CLK(NULL,	"usbtll_ick",	&usbtll_ick,	CK_3430ES2PLUS | CK_AM35XX | CK_36XX),
-	CLK("usbhs-omap.0",	"usbtll_ick",	&usbtll_ick,	CK_3430ES2PLUS | CK_AM35XX | CK_36XX),
+	CLK("usbhs_omap",	"usbtll_ick",	&usbtll_ick,	CK_3430ES2PLUS | CK_AM35XX | CK_36XX),
 	CLK("omap_hsmmc.2",	"ick",	&mmchs3_ick,	CK_3430ES2PLUS | CK_AM35XX | CK_36XX),
 	CLK(NULL,	"icr_ick",	&icr_ick,	CK_34XX | CK_36XX),
 	CLK("omap-aes",	"ick",	&aes2_ick,	CK_34XX | CK_36XX),
@@ -3367,20 +3367,18 @@ static struct omap_clk omap3xxx_clks[] = {
 	CLK(NULL,	"cam_ick",	&cam_ick,	CK_34XX | CK_36XX),
 	CLK(NULL,	"csi2_96m_fck",	&csi2_96m_fck,	CK_34XX | CK_36XX),
 	CLK(NULL,	"usbhost_120m_fck", &usbhost_120m_fck, CK_3430ES2PLUS | CK_AM35XX | CK_36XX),
-	CLK("usbhs-omap.0",	"hs_fck", &usbhost_120m_fck, CK_3430ES2PLUS | CK_AM35XX | CK_36XX),
 	CLK(NULL,	"usbhost_48m_fck", &usbhost_48m_fck, CK_3430ES2PLUS | CK_AM35XX | CK_36XX),
-	CLK("usbhs-omap.0",	"fs_fck", &usbhost_48m_fck, CK_3430ES2PLUS | CK_AM35XX | CK_36XX),
 	CLK(NULL,	"usbhost_ick",	&usbhost_ick,	CK_3430ES2PLUS | CK_AM35XX | CK_36XX),
-	CLK("usbhs-omap.0",	"usbhost_ick",	&usbhost_ick,	CK_3430ES2PLUS | CK_AM35XX | CK_36XX),
-	CLK("usbhs-omap.0",	"utmi_p1_gfclk",	&dummy_ck,	CK_3XXX),
-	CLK("usbhs-omap.0",	"utmi_p2_gfclk",	&dummy_ck,	CK_3XXX),
-	CLK("usbhs-omap.0",	"xclk60mhsp1_ck",	&dummy_ck,	CK_3XXX),
-	CLK("usbhs-omap.0",	"xclk60mhsp2_ck",	&dummy_ck,	CK_3XXX),
-	CLK("usbhs-omap.0",	"usb_host_hs_utmi_p1_clk",	&dummy_ck,	CK_3XXX),
-	CLK("usbhs-omap.0",	"usb_host_hs_utmi_p2_clk",	&dummy_ck,	CK_3XXX),
-	CLK("usbhs-omap.0",	"usb_tll_hs_usb_ch0_clk",	&dummy_ck,	CK_3XXX),
-	CLK("usbhs-omap.0",	"usb_tll_hs_usb_ch1_clk",	&dummy_ck,	CK_3XXX),
-	CLK("usbhs-omap.0",	"init_60m_fclk",	&dummy_ck,	CK_3XXX),
+	CLK("usbhs_omap",	"usbhost_ick",	&usbhost_ick,	CK_3430ES2PLUS | CK_AM35XX | CK_36XX),
+	CLK("usbhs_omap",	"utmi_p1_gfclk",	&dummy_ck,	CK_3XXX),
+	CLK("usbhs_omap",	"utmi_p2_gfclk",	&dummy_ck,	CK_3XXX),
+	CLK("usbhs_omap",	"xclk60mhsp1_ck",	&dummy_ck,	CK_3XXX),
+	CLK("usbhs_omap",	"xclk60mhsp2_ck",	&dummy_ck,	CK_3XXX),
+	CLK("usbhs_omap",	"usb_host_hs_utmi_p1_clk",	&dummy_ck,	CK_3XXX),
+	CLK("usbhs_omap",	"usb_host_hs_utmi_p2_clk",	&dummy_ck,	CK_3XXX),
+	CLK("usbhs_omap",	"usb_tll_hs_usb_ch0_clk",	&dummy_ck,	CK_3XXX),
+	CLK("usbhs_omap",	"usb_tll_hs_usb_ch1_clk",	&dummy_ck,	CK_3XXX),
+	CLK("usbhs_omap",	"init_60m_fclk",	&dummy_ck,	CK_3XXX),
 	CLK(NULL,	"usim_fck",	&usim_fck,	CK_3430ES2PLUS | CK_36XX),
 	CLK(NULL,	"gpt1_fck",	&gpt1_fck,	CK_3XXX),
 	CLK(NULL,	"wkup_32k_fck",	&wkup_32k_fck,	CK_3XXX),
diff --git a/arch/arm/mach-omap2/clock44xx_data.c b/arch/arm/mach-omap2/clock44xx_data.c
index 2af0e3f..088977a 100644
--- a/arch/arm/mach-omap2/clock44xx_data.c
+++ b/arch/arm/mach-omap2/clock44xx_data.c
@@ -3281,7 +3281,7 @@ static struct omap_clk omap44xx_clks[] = {
 	CLK(NULL,	"uart2_fck",			&uart2_fck,	CK_443X),
 	CLK(NULL,	"uart3_fck",			&uart3_fck,	CK_443X),
 	CLK(NULL,	"uart4_fck",			&uart4_fck,	CK_443X),
-	CLK("usbhs-omap.0",	"fs_fck",		&usb_host_fs_fck,	CK_443X),
+	CLK("usbhs_omap",	"fs_fck",		&usb_host_fs_fck,	CK_443X),
 	CLK(NULL,	"utmi_p1_gfclk",		&utmi_p1_gfclk,	CK_443X),
 	CLK(NULL,	"usb_host_hs_utmi_p1_clk",	&usb_host_hs_utmi_p1_clk,	CK_443X),
 	CLK(NULL,	"utmi_p2_gfclk",		&utmi_p2_gfclk,	CK_443X),
@@ -3292,7 +3292,7 @@ static struct omap_clk omap44xx_clks[] = {
 	CLK(NULL,	"usb_host_hs_hsic60m_p2_clk",	&usb_host_hs_hsic60m_p2_clk,	CK_443X),
 	CLK(NULL,	"usb_host_hs_hsic480m_p2_clk",	&usb_host_hs_hsic480m_p2_clk,	CK_443X),
 	CLK(NULL,	"usb_host_hs_func48mclk",	&usb_host_hs_func48mclk,	CK_443X),
-	CLK("usbhs-omap.0",	"hs_fck",		&usb_host_hs_fck,	CK_443X),
+	CLK("usbhs_omap",	"hs_fck",		&usb_host_hs_fck,	CK_443X),
 	CLK(NULL,	"otg_60m_gfclk",		&otg_60m_gfclk,	CK_443X),
 	CLK(NULL,	"usb_otg_hs_xclk",		&usb_otg_hs_xclk,	CK_443X),
 	CLK("musb-omap2430",	"ick",				&usb_otg_hs_ick,	CK_443X),
@@ -3300,7 +3300,7 @@ static struct omap_clk omap44xx_clks[] = {
 	CLK(NULL,	"usb_tll_hs_usb_ch2_clk",	&usb_tll_hs_usb_ch2_clk,	CK_443X),
 	CLK(NULL,	"usb_tll_hs_usb_ch0_clk",	&usb_tll_hs_usb_ch0_clk,	CK_443X),
 	CLK(NULL,	"usb_tll_hs_usb_ch1_clk",	&usb_tll_hs_usb_ch1_clk,	CK_443X),
-	CLK("usbhs-omap.0",	"usbtll_ick",		&usb_tll_hs_ick,	CK_443X),
+	CLK("usbhs_omap",	"usbtll_ick",		&usb_tll_hs_ick,	CK_443X),
 	CLK(NULL,	"usim_ck",			&usim_ck,	CK_443X),
 	CLK(NULL,	"usim_fclk",			&usim_fclk,	CK_443X),
 	CLK(NULL,	"usim_fck",			&usim_fck,	CK_443X),
@@ -3360,8 +3360,8 @@ static struct omap_clk omap44xx_clks[] = {
 	CLK(NULL,	"uart2_ick",			&dummy_ck,	CK_443X),
 	CLK(NULL,	"uart3_ick",			&dummy_ck,	CK_443X),
 	CLK(NULL,	"uart4_ick",			&dummy_ck,	CK_443X),
-	CLK("usbhs-omap.0",	"usbhost_ick",		&dummy_ck,		CK_443X),
-	CLK("usbhs-omap.0",	"usbtll_fck",		&dummy_ck,	CK_443X),
+	CLK("usbhs_omap",	"usbhost_ick",		&dummy_ck,		CK_443X),
+	CLK("usbhs_omap",	"usbtll_fck",		&dummy_ck,	CK_443X),
 	CLK("omap_wdt",	"ick",				&dummy_ck,	CK_443X),
 };
 
diff --git a/drivers/mfd/omap-usb-host.c b/drivers/mfd/omap-usb-host.c
index 29601e7..5def51c 100644
--- a/drivers/mfd/omap-usb-host.c
+++ b/drivers/mfd/omap-usb-host.c
@@ -27,7 +27,7 @@
 #include <linux/gpio.h>
 #include <plat/usb.h>
 
-#define USBHS_DRIVER_NAME	"usbhs-omap"
+#define USBHS_DRIVER_NAME	"usbhs_omap"
 #define OMAP_EHCI_DEVICE	"ehci-omap"
 #define OMAP_OHCI_DEVICE	"ohci-omap3"
 
-- 
1.6.0.4

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 5/5 v4] mfd: omap: usb: Runtime PM support
  2011-08-09 14:15       ` [PATCH 4/5 v4] arm: omap: usb: device name change for the clk names " Keshava Munegowda
@ 2011-08-09 14:15         ` Keshava Munegowda
  2011-08-10 16:31           ` Todd Poynor
                             ` (2 more replies)
  0 siblings, 3 replies; 20+ messages in thread
From: Keshava Munegowda @ 2011-08-09 14:15 UTC (permalink / raw)
  To: linux-usb, linux-omap, linux-kernel
  Cc: Keshava Munegowda, balbi, gadiyar, sameo, parthab, tony, khilman,
	b-cousson, paul, johnstul, vishwanath.bs, Keshava Munegowda

From: Keshava Munegowda <Keshava_mgowda@ti.com>

The usbhs core driver does not enable/disable the intefrace and
fucntional clocks; These clocks are handled by hwmod and runtime pm,
hence insted of the clock enable/disable, the runtime pm APIS are
used. however,the port clocks are handled by the usbhs core.

Signed-off-by: Keshava Munegowda <keshava_mgowda@ti.com>
---
 arch/arm/plat-omap/include/plat/usb.h |    3 -
 drivers/mfd/omap-usb-host.c           |  722 +++++++++++++--------------------
 drivers/usb/host/ehci-omap.c          |   19 +-
 drivers/usb/host/ohci-omap3.c         |   14 +-
 4 files changed, 286 insertions(+), 472 deletions(-)

diff --git a/arch/arm/plat-omap/include/plat/usb.h b/arch/arm/plat-omap/include/plat/usb.h
index 17d3c93..2b66dc2 100644
--- a/arch/arm/plat-omap/include/plat/usb.h
+++ b/arch/arm/plat-omap/include/plat/usb.h
@@ -100,9 +100,6 @@ extern void usb_musb_init(struct omap_musb_board_data *board_data);
 
 extern void usbhs_init(const struct usbhs_omap_board_data *pdata);
 
-extern int omap_usbhs_enable(struct device *dev);
-extern void omap_usbhs_disable(struct device *dev);
-
 extern int omap4430_phy_power(struct device *dev, int ID, int on);
 extern int omap4430_phy_set_clk(struct device *dev, int on);
 extern int omap4430_phy_init(struct device *dev);
diff --git a/drivers/mfd/omap-usb-host.c b/drivers/mfd/omap-usb-host.c
index 5def51c..39cfae6 100644
--- a/drivers/mfd/omap-usb-host.c
+++ b/drivers/mfd/omap-usb-host.c
@@ -26,6 +26,7 @@
 #include <linux/spinlock.h>
 #include <linux/gpio.h>
 #include <plat/usb.h>
+#include <linux/pm_runtime.h>
 
 #define USBHS_DRIVER_NAME	"usbhs_omap"
 #define OMAP_EHCI_DEVICE	"ehci-omap"
@@ -146,9 +147,6 @@
 
 
 struct usbhs_hcd_omap {
-	struct clk			*usbhost_ick;
-	struct clk			*usbhost_hs_fck;
-	struct clk			*usbhost_fs_fck;
 	struct clk			*xclk60mhsp1_ck;
 	struct clk			*xclk60mhsp2_ck;
 	struct clk			*utmi_p1_fck;
@@ -158,8 +156,6 @@ struct usbhs_hcd_omap {
 	struct clk			*usbhost_p2_fck;
 	struct clk			*usbtll_p2_fck;
 	struct clk			*init_60m_fclk;
-	struct clk			*usbtll_fck;
-	struct clk			*usbtll_ick;
 
 	void __iomem			*uhh_base;
 	void __iomem			*tll_base;
@@ -168,7 +164,6 @@ struct usbhs_hcd_omap {
 
 	u32				usbhs_rev;
 	spinlock_t			lock;
-	int				count;
 };
 /*-------------------------------------------------------------------------*/
 
@@ -318,269 +313,6 @@ err_end:
 	return ret;
 }
 
-/**
- * usbhs_omap_probe - initialize TI-based HCDs
- *
- * Allocates basic resources for this USB host controller.
- */
-static int __devinit usbhs_omap_probe(struct platform_device *pdev)
-{
-	struct device			*dev =  &pdev->dev;
-	struct usbhs_omap_platform_data	*pdata = dev->platform_data;
-	struct usbhs_hcd_omap		*omap;
-	struct resource			*res;
-	int				ret = 0;
-	int				i;
-
-	if (!pdata) {
-		dev_err(dev, "Missing platform data\n");
-		ret = -ENOMEM;
-		goto end_probe;
-	}
-
-	omap = kzalloc(sizeof(*omap), GFP_KERNEL);
-	if (!omap) {
-		dev_err(dev, "Memory allocation failed\n");
-		ret = -ENOMEM;
-		goto end_probe;
-	}
-
-	spin_lock_init(&omap->lock);
-
-	for (i = 0; i < OMAP3_HS_USB_PORTS; i++)
-		omap->platdata.port_mode[i] = pdata->port_mode[i];
-
-	omap->platdata.ehci_data = pdata->ehci_data;
-	omap->platdata.ohci_data = pdata->ohci_data;
-
-	omap->usbhost_ick = clk_get(dev, "usbhost_ick");
-	if (IS_ERR(omap->usbhost_ick)) {
-		ret =  PTR_ERR(omap->usbhost_ick);
-		dev_err(dev, "usbhost_ick failed error:%d\n", ret);
-		goto err_end;
-	}
-
-	omap->usbhost_hs_fck = clk_get(dev, "hs_fck");
-	if (IS_ERR(omap->usbhost_hs_fck)) {
-		ret = PTR_ERR(omap->usbhost_hs_fck);
-		dev_err(dev, "usbhost_hs_fck failed error:%d\n", ret);
-		goto err_usbhost_ick;
-	}
-
-	omap->usbhost_fs_fck = clk_get(dev, "fs_fck");
-	if (IS_ERR(omap->usbhost_fs_fck)) {
-		ret = PTR_ERR(omap->usbhost_fs_fck);
-		dev_err(dev, "usbhost_fs_fck failed error:%d\n", ret);
-		goto err_usbhost_hs_fck;
-	}
-
-	omap->usbtll_fck = clk_get(dev, "usbtll_fck");
-	if (IS_ERR(omap->usbtll_fck)) {
-		ret = PTR_ERR(omap->usbtll_fck);
-		dev_err(dev, "usbtll_fck failed error:%d\n", ret);
-		goto err_usbhost_fs_fck;
-	}
-
-	omap->usbtll_ick = clk_get(dev, "usbtll_ick");
-	if (IS_ERR(omap->usbtll_ick)) {
-		ret = PTR_ERR(omap->usbtll_ick);
-		dev_err(dev, "usbtll_ick failed error:%d\n", ret);
-		goto err_usbtll_fck;
-	}
-
-	omap->utmi_p1_fck = clk_get(dev, "utmi_p1_gfclk");
-	if (IS_ERR(omap->utmi_p1_fck)) {
-		ret = PTR_ERR(omap->utmi_p1_fck);
-		dev_err(dev, "utmi_p1_gfclk failed error:%d\n",	ret);
-		goto err_usbtll_ick;
-	}
-
-	omap->xclk60mhsp1_ck = clk_get(dev, "xclk60mhsp1_ck");
-	if (IS_ERR(omap->xclk60mhsp1_ck)) {
-		ret = PTR_ERR(omap->xclk60mhsp1_ck);
-		dev_err(dev, "xclk60mhsp1_ck failed error:%d\n", ret);
-		goto err_utmi_p1_fck;
-	}
-
-	omap->utmi_p2_fck = clk_get(dev, "utmi_p2_gfclk");
-	if (IS_ERR(omap->utmi_p2_fck)) {
-		ret = PTR_ERR(omap->utmi_p2_fck);
-		dev_err(dev, "utmi_p2_gfclk failed error:%d\n", ret);
-		goto err_xclk60mhsp1_ck;
-	}
-
-	omap->xclk60mhsp2_ck = clk_get(dev, "xclk60mhsp2_ck");
-	if (IS_ERR(omap->xclk60mhsp2_ck)) {
-		ret = PTR_ERR(omap->xclk60mhsp2_ck);
-		dev_err(dev, "xclk60mhsp2_ck failed error:%d\n", ret);
-		goto err_utmi_p2_fck;
-	}
-
-	omap->usbhost_p1_fck = clk_get(dev, "usb_host_hs_utmi_p1_clk");
-	if (IS_ERR(omap->usbhost_p1_fck)) {
-		ret = PTR_ERR(omap->usbhost_p1_fck);
-		dev_err(dev, "usbhost_p1_fck failed error:%d\n", ret);
-		goto err_xclk60mhsp2_ck;
-	}
-
-	omap->usbtll_p1_fck = clk_get(dev, "usb_tll_hs_usb_ch0_clk");
-	if (IS_ERR(omap->usbtll_p1_fck)) {
-		ret = PTR_ERR(omap->usbtll_p1_fck);
-		dev_err(dev, "usbtll_p1_fck failed error:%d\n", ret);
-		goto err_usbhost_p1_fck;
-	}
-
-	omap->usbhost_p2_fck = clk_get(dev, "usb_host_hs_utmi_p2_clk");
-	if (IS_ERR(omap->usbhost_p2_fck)) {
-		ret = PTR_ERR(omap->usbhost_p2_fck);
-		dev_err(dev, "usbhost_p2_fck failed error:%d\n", ret);
-		goto err_usbtll_p1_fck;
-	}
-
-	omap->usbtll_p2_fck = clk_get(dev, "usb_tll_hs_usb_ch1_clk");
-	if (IS_ERR(omap->usbtll_p2_fck)) {
-		ret = PTR_ERR(omap->usbtll_p2_fck);
-		dev_err(dev, "usbtll_p2_fck failed error:%d\n", ret);
-		goto err_usbhost_p2_fck;
-	}
-
-	omap->init_60m_fclk = clk_get(dev, "init_60m_fclk");
-	if (IS_ERR(omap->init_60m_fclk)) {
-		ret = PTR_ERR(omap->init_60m_fclk);
-		dev_err(dev, "init_60m_fclk failed error:%d\n", ret);
-		goto err_usbtll_p2_fck;
-	}
-
-	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "uhh");
-	if (!res) {
-		dev_err(dev, "UHH EHCI get resource failed\n");
-		ret = -ENODEV;
-		goto err_init_60m_fclk;
-	}
-
-	omap->uhh_base = ioremap(res->start, resource_size(res));
-	if (!omap->uhh_base) {
-		dev_err(dev, "UHH ioremap failed\n");
-		ret = -ENOMEM;
-		goto err_init_60m_fclk;
-	}
-
-	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "tll");
-	if (!res) {
-		dev_err(dev, "UHH EHCI get resource failed\n");
-		ret = -ENODEV;
-		goto err_tll;
-	}
-
-	omap->tll_base = ioremap(res->start, resource_size(res));
-	if (!omap->tll_base) {
-		dev_err(dev, "TLL ioremap failed\n");
-		ret = -ENOMEM;
-		goto err_tll;
-	}
-
-	platform_set_drvdata(pdev, omap);
-
-	ret = omap_usbhs_alloc_children(pdev);
-	if (ret) {
-		dev_err(dev, "omap_usbhs_alloc_children failed\n");
-		goto err_alloc;
-	}
-
-	goto end_probe;
-
-err_alloc:
-	iounmap(omap->tll_base);
-
-err_tll:
-	iounmap(omap->uhh_base);
-
-err_init_60m_fclk:
-	clk_put(omap->init_60m_fclk);
-
-err_usbtll_p2_fck:
-	clk_put(omap->usbtll_p2_fck);
-
-err_usbhost_p2_fck:
-	clk_put(omap->usbhost_p2_fck);
-
-err_usbtll_p1_fck:
-	clk_put(omap->usbtll_p1_fck);
-
-err_usbhost_p1_fck:
-	clk_put(omap->usbhost_p1_fck);
-
-err_xclk60mhsp2_ck:
-	clk_put(omap->xclk60mhsp2_ck);
-
-err_utmi_p2_fck:
-	clk_put(omap->utmi_p2_fck);
-
-err_xclk60mhsp1_ck:
-	clk_put(omap->xclk60mhsp1_ck);
-
-err_utmi_p1_fck:
-	clk_put(omap->utmi_p1_fck);
-
-err_usbtll_ick:
-	clk_put(omap->usbtll_ick);
-
-err_usbtll_fck:
-	clk_put(omap->usbtll_fck);
-
-err_usbhost_fs_fck:
-	clk_put(omap->usbhost_fs_fck);
-
-err_usbhost_hs_fck:
-	clk_put(omap->usbhost_hs_fck);
-
-err_usbhost_ick:
-	clk_put(omap->usbhost_ick);
-
-err_end:
-	kfree(omap);
-
-end_probe:
-	return ret;
-}
-
-/**
- * usbhs_omap_remove - shutdown processing for UHH & TLL HCDs
- * @pdev: USB Host Controller being removed
- *
- * Reverses the effect of usbhs_omap_probe().
- */
-static int __devexit usbhs_omap_remove(struct platform_device *pdev)
-{
-	struct usbhs_hcd_omap *omap = platform_get_drvdata(pdev);
-
-	if (omap->count != 0) {
-		dev_err(&pdev->dev,
-			"Either EHCI or OHCI is still using usbhs core\n");
-		return -EBUSY;
-	}
-
-	iounmap(omap->tll_base);
-	iounmap(omap->uhh_base);
-	clk_put(omap->init_60m_fclk);
-	clk_put(omap->usbtll_p2_fck);
-	clk_put(omap->usbhost_p2_fck);
-	clk_put(omap->usbtll_p1_fck);
-	clk_put(omap->usbhost_p1_fck);
-	clk_put(omap->xclk60mhsp2_ck);
-	clk_put(omap->utmi_p2_fck);
-	clk_put(omap->xclk60mhsp1_ck);
-	clk_put(omap->utmi_p1_fck);
-	clk_put(omap->usbtll_ick);
-	clk_put(omap->usbtll_fck);
-	clk_put(omap->usbhost_fs_fck);
-	clk_put(omap->usbhost_hs_fck);
-	clk_put(omap->usbhost_ick);
-	kfree(omap);
-
-	return 0;
-}
-
 static bool is_ohci_port(enum usbhs_omap_port_mode pmode)
 {
 	switch (pmode) {
@@ -689,30 +421,70 @@ static void usbhs_omap_tll_init(struct device *dev, u8 tll_channel_count)
 	}
 }
 
-static int usbhs_enable(struct device *dev)
+static int usbhs_runtime_resume(struct device *dev)
 {
 	struct usbhs_hcd_omap		*omap = dev_get_drvdata(dev);
 	struct usbhs_omap_platform_data	*pdata = &omap->platdata;
-	unsigned long			flags = 0;
-	int				ret = 0;
-	unsigned long			timeout;
-	unsigned			reg;
 
-	dev_dbg(dev, "starting TI HSUSB Controller\n");
+	dev_dbg(dev, "usbhs_runtime_resume\n");
+
+	if (!pdata) {
+		dev_dbg(dev, "missing platform_data\n");
+		return  -ENODEV;
+	}
+
+	if (is_ehci_tll_mode(pdata->port_mode[0])) {
+		clk_enable(omap->usbhost_p1_fck);
+		clk_enable(omap->usbtll_p1_fck);
+	}
+	if (is_ehci_tll_mode(pdata->port_mode[1])) {
+		clk_enable(omap->usbhost_p2_fck);
+		clk_enable(omap->usbtll_p2_fck);
+	}
+	clk_enable(omap->utmi_p1_fck);
+	clk_enable(omap->utmi_p2_fck);
+
+	return 0;
+}
+
+static int usbhs_runtime_suspend(struct device *dev)
+{
+	struct usbhs_hcd_omap		*omap = dev_get_drvdata(dev);
+	struct usbhs_omap_platform_data	*pdata = &omap->platdata;
+
+	dev_dbg(dev, "usbhs_runtime_suspend\n");
+
 	if (!pdata) {
 		dev_dbg(dev, "missing platform_data\n");
 		return  -ENODEV;
 	}
 
+	if (is_ehci_tll_mode(pdata->port_mode[0])) {
+		clk_disable(omap->usbhost_p1_fck);
+		clk_disable(omap->usbtll_p1_fck);
+	}
+	if (is_ehci_tll_mode(pdata->port_mode[1])) {
+		clk_disable(omap->usbhost_p2_fck);
+		clk_disable(omap->usbtll_p2_fck);
+	}
+	clk_disable(omap->utmi_p2_fck);
+	clk_disable(omap->utmi_p1_fck);
+
+	return 0;
+}
+
+static void omap_usbhs_init(struct device *dev)
+{
+	struct usbhs_hcd_omap		*omap = dev_get_drvdata(dev);
+	struct usbhs_omap_platform_data	*pdata = &omap->platdata;
+	unsigned long			flags = 0;
+	unsigned			reg;
+
+	dev_dbg(dev, "starting TI HSUSB Controller\n");
+
 	spin_lock_irqsave(&omap->lock, flags);
-	if (omap->count > 0)
-		goto end_count;
 
-	clk_enable(omap->usbhost_ick);
-	clk_enable(omap->usbhost_hs_fck);
-	clk_enable(omap->usbhost_fs_fck);
-	clk_enable(omap->usbtll_fck);
-	clk_enable(omap->usbtll_ick);
+	pm_runtime_get_sync(dev);
 
 	if (pdata->ehci_data->phy_reset) {
 		if (gpio_is_valid(pdata->ehci_data->reset_gpio_port[0])) {
@@ -736,50 +508,6 @@ static int usbhs_enable(struct device *dev)
 	omap->usbhs_rev = usbhs_read(omap->uhh_base, OMAP_UHH_REVISION);
 	dev_dbg(dev, "OMAP UHH_REVISION 0x%x\n", omap->usbhs_rev);
 
-	/* perform TLL soft reset, and wait until reset is complete */
-	usbhs_write(omap->tll_base, OMAP_USBTLL_SYSCONFIG,
-			OMAP_USBTLL_SYSCONFIG_SOFTRESET);
-
-	/* Wait for TLL reset to complete */
-	timeout = jiffies + msecs_to_jiffies(1000);
-	while (!(usbhs_read(omap->tll_base, OMAP_USBTLL_SYSSTATUS)
-			& OMAP_USBTLL_SYSSTATUS_RESETDONE)) {
-		cpu_relax();
-
-		if (time_after(jiffies, timeout)) {
-			dev_dbg(dev, "operation timed out\n");
-			ret = -EINVAL;
-			goto err_tll;
-		}
-	}
-
-	dev_dbg(dev, "TLL RESET DONE\n");
-
-	/* (1<<3) = no idle mode only for initial debugging */
-	usbhs_write(omap->tll_base, OMAP_USBTLL_SYSCONFIG,
-			OMAP_USBTLL_SYSCONFIG_ENAWAKEUP |
-			OMAP_USBTLL_SYSCONFIG_SIDLEMODE |
-			OMAP_USBTLL_SYSCONFIG_AUTOIDLE);
-
-	/* Put UHH in NoIdle/NoStandby mode */
-	reg = usbhs_read(omap->uhh_base, OMAP_UHH_SYSCONFIG);
-	if (is_omap_usbhs_rev1(omap)) {
-		reg |= (OMAP_UHH_SYSCONFIG_ENAWAKEUP
-				| OMAP_UHH_SYSCONFIG_SIDLEMODE
-				| OMAP_UHH_SYSCONFIG_CACTIVITY
-				| OMAP_UHH_SYSCONFIG_MIDLEMODE);
-		reg &= ~OMAP_UHH_SYSCONFIG_AUTOIDLE;
-
-
-	} else if (is_omap_usbhs_rev2(omap)) {
-		reg &= ~OMAP4_UHH_SYSCONFIG_IDLEMODE_CLEAR;
-		reg |= OMAP4_UHH_SYSCONFIG_NOIDLE;
-		reg &= ~OMAP4_UHH_SYSCONFIG_STDBYMODE_CLEAR;
-		reg |= OMAP4_UHH_SYSCONFIG_NOSTDBY;
-	}
-
-	usbhs_write(omap->uhh_base, OMAP_UHH_SYSCONFIG, reg);
-
 	reg = usbhs_read(omap->uhh_base, OMAP_UHH_HOSTCONFIG);
 	/* setup ULPI bypass and burst configurations */
 	reg |= (OMAP_UHH_HOSTCONFIG_INCR4_BURST_EN
@@ -825,49 +553,6 @@ static int usbhs_enable(struct device *dev)
 		reg &= ~OMAP4_P1_MODE_CLEAR;
 		reg &= ~OMAP4_P2_MODE_CLEAR;
 
-		if (is_ehci_phy_mode(pdata->port_mode[0])) {
-			ret = clk_set_parent(omap->utmi_p1_fck,
-						omap->xclk60mhsp1_ck);
-			if (ret != 0) {
-				dev_err(dev, "xclk60mhsp1_ck set parent"
-				"failed error:%d\n", ret);
-				goto err_tll;
-			}
-		} else if (is_ehci_tll_mode(pdata->port_mode[0])) {
-			ret = clk_set_parent(omap->utmi_p1_fck,
-						omap->init_60m_fclk);
-			if (ret != 0) {
-				dev_err(dev, "init_60m_fclk set parent"
-				"failed error:%d\n", ret);
-				goto err_tll;
-			}
-			clk_enable(omap->usbhost_p1_fck);
-			clk_enable(omap->usbtll_p1_fck);
-		}
-
-		if (is_ehci_phy_mode(pdata->port_mode[1])) {
-			ret = clk_set_parent(omap->utmi_p2_fck,
-						omap->xclk60mhsp2_ck);
-			if (ret != 0) {
-				dev_err(dev, "xclk60mhsp1_ck set parent"
-					"failed error:%d\n", ret);
-				goto err_tll;
-			}
-		} else if (is_ehci_tll_mode(pdata->port_mode[1])) {
-			ret = clk_set_parent(omap->utmi_p2_fck,
-						omap->init_60m_fclk);
-			if (ret != 0) {
-				dev_err(dev, "init_60m_fclk set parent"
-				"failed error:%d\n", ret);
-				goto err_tll;
-			}
-			clk_enable(omap->usbhost_p2_fck);
-			clk_enable(omap->usbtll_p2_fck);
-		}
-
-		clk_enable(omap->utmi_p1_fck);
-		clk_enable(omap->utmi_p2_fck);
-
 		if (is_ehci_tll_mode(pdata->port_mode[0]) ||
 			(is_ohci_port(pdata->port_mode[0])))
 			reg |= OMAP4_P1_MODE_TLL;
@@ -913,12 +598,15 @@ static int usbhs_enable(struct device *dev)
 				(pdata->ehci_data->reset_gpio_port[1], 1);
 	}
 
-end_count:
-	omap->count++;
+	pm_runtime_put_sync(dev);
 	spin_unlock_irqrestore(&omap->lock, flags);
-	return 0;
+}
+
+static void omap_usbhs_deinit(struct device *dev)
+{
+	struct usbhs_hcd_omap		*omap = dev_get_drvdata(dev);
+	struct usbhs_omap_platform_data	*pdata = &omap->platdata;
 
-err_tll:
 	if (pdata->ehci_data->phy_reset) {
 		if (gpio_is_valid(pdata->ehci_data->reset_gpio_port[0]))
 			gpio_free(pdata->ehci_data->reset_gpio_port[0]);
@@ -926,123 +614,257 @@ err_tll:
 		if (gpio_is_valid(pdata->ehci_data->reset_gpio_port[1]))
 			gpio_free(pdata->ehci_data->reset_gpio_port[1]);
 	}
-
-	clk_disable(omap->usbtll_ick);
-	clk_disable(omap->usbtll_fck);
-	clk_disable(omap->usbhost_fs_fck);
-	clk_disable(omap->usbhost_hs_fck);
-	clk_disable(omap->usbhost_ick);
-	spin_unlock_irqrestore(&omap->lock, flags);
-	return ret;
 }
 
-static void usbhs_disable(struct device *dev)
+
+/**
+ * usbhs_omap_probe - initialize TI-based HCDs
+ *
+ * Allocates basic resources for this USB host controller.
+ */
+static int __devinit usbhs_omap_probe(struct platform_device *pdev)
 {
-	struct usbhs_hcd_omap		*omap = dev_get_drvdata(dev);
-	struct usbhs_omap_platform_data	*pdata = &omap->platdata;
-	unsigned long			flags = 0;
-	unsigned long			timeout;
+	struct device			*dev =  &pdev->dev;
+	struct usbhs_omap_platform_data	*pdata = dev->platform_data;
+	struct usbhs_hcd_omap		*omap;
+	struct resource			*res;
+	int				ret = 0;
+	int				i;
 
-	dev_dbg(dev, "stopping TI HSUSB Controller\n");
+	if (!pdata) {
+		dev_err(dev, "Missing platform data\n");
+		ret = -ENOMEM;
+		goto end_probe;
+	}
 
-	spin_lock_irqsave(&omap->lock, flags);
+	omap = kzalloc(sizeof(*omap), GFP_KERNEL);
+	if (!omap) {
+		dev_err(dev, "Memory allocation failed\n");
+		ret = -ENOMEM;
+		goto end_probe;
+	}
+
+	spin_lock_init(&omap->lock);
+
+	for (i = 0; i < OMAP3_HS_USB_PORTS; i++)
+		omap->platdata.port_mode[i] = pdata->port_mode[i];
 
-	if (omap->count == 0)
-		goto end_disble;
+	omap->platdata.ehci_data = pdata->ehci_data;
+	omap->platdata.ohci_data = pdata->ohci_data;
 
-	omap->count--;
+	pm_runtime_enable(dev);
 
-	if (omap->count != 0)
-		goto end_disble;
+	omap->utmi_p1_fck = clk_get(dev, "utmi_p1_gfclk");
+	if (IS_ERR(omap->utmi_p1_fck)) {
+		ret = PTR_ERR(omap->utmi_p1_fck);
+		dev_err(dev, "utmi_p1_gfclk failed error:%d\n",	ret);
+		goto err_end;
+	}
+
+	omap->xclk60mhsp1_ck = clk_get(dev, "xclk60mhsp1_ck");
+	if (IS_ERR(omap->xclk60mhsp1_ck)) {
+		ret = PTR_ERR(omap->xclk60mhsp1_ck);
+		dev_err(dev, "xclk60mhsp1_ck failed error:%d\n", ret);
+		goto err_utmi_p1_fck;
+	}
 
-	/* Reset OMAP modules for insmod/rmmod to work */
-	usbhs_write(omap->uhh_base, OMAP_UHH_SYSCONFIG,
-			is_omap_usbhs_rev2(omap) ?
-			OMAP4_UHH_SYSCONFIG_SOFTRESET :
-			OMAP_UHH_SYSCONFIG_SOFTRESET);
+	omap->utmi_p2_fck = clk_get(dev, "utmi_p2_gfclk");
+	if (IS_ERR(omap->utmi_p2_fck)) {
+		ret = PTR_ERR(omap->utmi_p2_fck);
+		dev_err(dev, "utmi_p2_gfclk failed error:%d\n", ret);
+		goto err_xclk60mhsp1_ck;
+	}
 
-	timeout = jiffies + msecs_to_jiffies(100);
-	while (!(usbhs_read(omap->uhh_base, OMAP_UHH_SYSSTATUS)
-				& (1 << 0))) {
-		cpu_relax();
+	omap->xclk60mhsp2_ck = clk_get(dev, "xclk60mhsp2_ck");
+	if (IS_ERR(omap->xclk60mhsp2_ck)) {
+		ret = PTR_ERR(omap->xclk60mhsp2_ck);
+		dev_err(dev, "xclk60mhsp2_ck failed error:%d\n", ret);
+		goto err_utmi_p2_fck;
+	}
 
-		if (time_after(jiffies, timeout))
-			dev_dbg(dev, "operation timed out\n");
+	omap->usbhost_p1_fck = clk_get(dev, "usb_host_hs_utmi_p1_clk");
+	if (IS_ERR(omap->usbhost_p1_fck)) {
+		ret = PTR_ERR(omap->usbhost_p1_fck);
+		dev_err(dev, "usbhost_p1_fck failed error:%d\n", ret);
+		goto err_xclk60mhsp2_ck;
 	}
 
-	while (!(usbhs_read(omap->uhh_base, OMAP_UHH_SYSSTATUS)
-				& (1 << 1))) {
-		cpu_relax();
+	omap->usbtll_p1_fck = clk_get(dev, "usb_tll_hs_usb_ch0_clk");
+	if (IS_ERR(omap->usbtll_p1_fck)) {
+		ret = PTR_ERR(omap->usbtll_p1_fck);
+		dev_err(dev, "usbtll_p1_fck failed error:%d\n", ret);
+		goto err_usbhost_p1_fck;
+	}
 
-		if (time_after(jiffies, timeout))
-			dev_dbg(dev, "operation timed out\n");
+	omap->usbhost_p2_fck = clk_get(dev, "usb_host_hs_utmi_p2_clk");
+	if (IS_ERR(omap->usbhost_p2_fck)) {
+		ret = PTR_ERR(omap->usbhost_p2_fck);
+		dev_err(dev, "usbhost_p2_fck failed error:%d\n", ret);
+		goto err_usbtll_p1_fck;
 	}
 
-	while (!(usbhs_read(omap->uhh_base, OMAP_UHH_SYSSTATUS)
-				& (1 << 2))) {
-		cpu_relax();
+	omap->usbtll_p2_fck = clk_get(dev, "usb_tll_hs_usb_ch1_clk");
+	if (IS_ERR(omap->usbtll_p2_fck)) {
+		ret = PTR_ERR(omap->usbtll_p2_fck);
+		dev_err(dev, "usbtll_p2_fck failed error:%d\n", ret);
+		goto err_usbhost_p2_fck;
+	}
 
-		if (time_after(jiffies, timeout))
-			dev_dbg(dev, "operation timed out\n");
+	omap->init_60m_fclk = clk_get(dev, "init_60m_fclk");
+	if (IS_ERR(omap->init_60m_fclk)) {
+		ret = PTR_ERR(omap->init_60m_fclk);
+		dev_err(dev, "init_60m_fclk failed error:%d\n", ret);
+		goto err_usbtll_p2_fck;
 	}
 
-	usbhs_write(omap->tll_base, OMAP_USBTLL_SYSCONFIG, (1 << 1));
+	if (is_ehci_phy_mode(pdata->port_mode[0])) {
+		/* for OMAP3 , the clk set paretn fails */
+		ret = clk_set_parent(omap->utmi_p1_fck,
+					omap->xclk60mhsp1_ck);
+		if (ret != 0)
+			dev_err(dev, "xclk60mhsp1_ck set parent"
+				"failed error:%d\n", ret);
+	} else if (is_ehci_tll_mode(pdata->port_mode[0])) {
+		ret = clk_set_parent(omap->utmi_p1_fck,
+					omap->init_60m_fclk);
+		if (ret != 0)
+			dev_err(dev, "init_60m_fclk set parent"
+				"failed error:%d\n", ret);
+	}
 
-	while (!(usbhs_read(omap->tll_base, OMAP_USBTLL_SYSSTATUS)
-				& (1 << 0))) {
-		cpu_relax();
+	if (is_ehci_phy_mode(pdata->port_mode[1])) {
+		ret = clk_set_parent(omap->utmi_p2_fck,
+					omap->xclk60mhsp2_ck);
+		if (ret != 0)
+			dev_err(dev, "xclk60mhsp2_ck set parent"
+					"failed error:%d\n", ret);
+	} else if (is_ehci_tll_mode(pdata->port_mode[1])) {
+		ret = clk_set_parent(omap->utmi_p2_fck,
+						omap->init_60m_fclk);
+		if (ret != 0)
+			dev_err(dev, "init_60m_fclk set parent"
+				"failed error:%d\n", ret);
+	}
 
-		if (time_after(jiffies, timeout))
-			dev_dbg(dev, "operation timed out\n");
+	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "uhh");
+	if (!res) {
+		dev_err(dev, "UHH EHCI get resource failed\n");
+		ret = -ENODEV;
+		goto err_init_60m_fclk;
 	}
 
-	if (is_omap_usbhs_rev2(omap)) {
-		if (is_ehci_tll_mode(pdata->port_mode[0]))
-			clk_disable(omap->usbtll_p1_fck);
-		if (is_ehci_tll_mode(pdata->port_mode[1]))
-			clk_disable(omap->usbtll_p2_fck);
-		clk_disable(omap->utmi_p2_fck);
-		clk_disable(omap->utmi_p1_fck);
+	omap->uhh_base = ioremap(res->start, resource_size(res));
+	if (!omap->uhh_base) {
+		dev_err(dev, "UHH ioremap failed\n");
+		ret = -ENOMEM;
+		goto err_init_60m_fclk;
 	}
 
-	clk_disable(omap->usbtll_ick);
-	clk_disable(omap->usbtll_fck);
-	clk_disable(omap->usbhost_fs_fck);
-	clk_disable(omap->usbhost_hs_fck);
-	clk_disable(omap->usbhost_ick);
+	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "tll");
+	if (!res) {
+		dev_err(dev, "UHH EHCI get resource failed\n");
+		ret = -ENODEV;
+		goto err_tll;
+	}
 
-	/* The gpio_free migh sleep; so unlock the spinlock */
-	spin_unlock_irqrestore(&omap->lock, flags);
+	omap->tll_base = ioremap(res->start, resource_size(res));
+	if (!omap->tll_base) {
+		dev_err(dev, "TLL ioremap failed\n");
+		ret = -ENOMEM;
+		goto err_tll;
+	}
 
-	if (pdata->ehci_data->phy_reset) {
-		if (gpio_is_valid(pdata->ehci_data->reset_gpio_port[0]))
-			gpio_free(pdata->ehci_data->reset_gpio_port[0]);
+	platform_set_drvdata(pdev, omap);
 
-		if (gpio_is_valid(pdata->ehci_data->reset_gpio_port[1]))
-			gpio_free(pdata->ehci_data->reset_gpio_port[1]);
+	ret = omap_usbhs_alloc_children(pdev);
+	if (ret) {
+		dev_err(dev, "omap_usbhs_alloc_children failed\n");
+		goto err_alloc;
 	}
-	return;
 
-end_disble:
-	spin_unlock_irqrestore(&omap->lock, flags);
-}
+	omap_usbhs_init(dev);
 
-int omap_usbhs_enable(struct device *dev)
-{
-	return  usbhs_enable(dev->parent);
+	goto end_probe;
+
+err_alloc:
+	iounmap(omap->tll_base);
+
+err_tll:
+	iounmap(omap->uhh_base);
+
+err_init_60m_fclk:
+	clk_put(omap->init_60m_fclk);
+
+err_usbtll_p2_fck:
+	clk_put(omap->usbtll_p2_fck);
+
+err_usbhost_p2_fck:
+	clk_put(omap->usbhost_p2_fck);
+
+err_usbtll_p1_fck:
+	clk_put(omap->usbtll_p1_fck);
+
+err_usbhost_p1_fck:
+	clk_put(omap->usbhost_p1_fck);
+
+err_xclk60mhsp2_ck:
+	clk_put(omap->xclk60mhsp2_ck);
+
+err_utmi_p2_fck:
+	clk_put(omap->utmi_p2_fck);
+
+err_xclk60mhsp1_ck:
+	clk_put(omap->xclk60mhsp1_ck);
+
+err_utmi_p1_fck:
+	clk_put(omap->utmi_p1_fck);
+
+err_end:
+	pm_runtime_disable(dev);
+	kfree(omap);
+
+end_probe:
+	return ret;
 }
-EXPORT_SYMBOL_GPL(omap_usbhs_enable);
 
-void omap_usbhs_disable(struct device *dev)
+/**
+ * usbhs_omap_remove - shutdown processing for UHH & TLL HCDs
+ * @pdev: USB Host Controller being removed
+ *
+ * Reverses the effect of usbhs_omap_probe().
+ */
+static int __devexit usbhs_omap_remove(struct platform_device *pdev)
 {
-	usbhs_disable(dev->parent);
+	struct usbhs_hcd_omap *omap = platform_get_drvdata(pdev);
+
+	omap_usbhs_deinit(&pdev->dev);
+	iounmap(omap->tll_base);
+	iounmap(omap->uhh_base);
+	clk_put(omap->init_60m_fclk);
+	clk_put(omap->usbtll_p2_fck);
+	clk_put(omap->usbhost_p2_fck);
+	clk_put(omap->usbtll_p1_fck);
+	clk_put(omap->usbhost_p1_fck);
+	clk_put(omap->xclk60mhsp2_ck);
+	clk_put(omap->utmi_p2_fck);
+	clk_put(omap->xclk60mhsp1_ck);
+	clk_put(omap->utmi_p1_fck);
+	pm_runtime_disable(&pdev->dev);
+	kfree(omap);
+
+	return 0;
 }
-EXPORT_SYMBOL_GPL(omap_usbhs_disable);
+
+static const struct dev_pm_ops usbhsomap_dev_pm_ops = {
+	.runtime_suspend	= usbhs_runtime_suspend,
+	.runtime_resume		= usbhs_runtime_resume,
+};
 
 static struct platform_driver usbhs_omap_driver = {
 	.driver = {
 		.name		= (char *)usbhs_driver_name,
 		.owner		= THIS_MODULE,
+		.pm		= &usbhsomap_dev_pm_ops,
 	},
 	.remove		= __exit_p(usbhs_omap_remove),
 };
diff --git a/drivers/usb/host/ehci-omap.c b/drivers/usb/host/ehci-omap.c
index 4524032..6551d30 100644
--- a/drivers/usb/host/ehci-omap.c
+++ b/drivers/usb/host/ehci-omap.c
@@ -41,6 +41,7 @@
 #include <linux/usb/ulpi.h>
 #include <plat/usb.h>
 #include <linux/regulator/consumer.h>
+#include <linux/pm_runtime.h>
 
 /* EHCI Register Set */
 #define EHCI_INSNREG04					(0xA0)
@@ -190,11 +191,8 @@ static int ehci_hcd_omap_probe(struct platform_device *pdev)
 		}
 	}
 
-	ret = omap_usbhs_enable(dev);
-	if (ret) {
-		dev_err(dev, "failed to start usbhs with err %d\n", ret);
-		goto err_enable;
-	}
+	pm_runtime_enable(dev);
+	pm_runtime_get_sync(dev);
 
 	/*
 	 * An undocumented "feature" in the OMAP3 EHCI controller,
@@ -240,11 +238,8 @@ static int ehci_hcd_omap_probe(struct platform_device *pdev)
 	return 0;
 
 err_add_hcd:
-	omap_usbhs_disable(dev);
-
-err_enable:
 	disable_put_regulator(pdata);
-	usb_put_hcd(hcd);
+	pm_runtime_put_sync(dev);
 
 err_io:
 	iounmap(regs);
@@ -266,10 +261,12 @@ static int ehci_hcd_omap_remove(struct platform_device *pdev)
 	struct usb_hcd *hcd	= dev_get_drvdata(dev);
 
 	usb_remove_hcd(hcd);
-	omap_usbhs_disable(dev);
 	disable_put_regulator(dev->platform_data);
-	iounmap(hcd->regs);
 	usb_put_hcd(hcd);
+	iounmap(hcd->regs);
+	pm_runtime_put_sync(dev);
+	pm_runtime_disable(dev);
+
 	return 0;
 }
 
diff --git a/drivers/usb/host/ohci-omap3.c b/drivers/usb/host/ohci-omap3.c
index 6048f2f..58e3dae 100644
--- a/drivers/usb/host/ohci-omap3.c
+++ b/drivers/usb/host/ohci-omap3.c
@@ -31,6 +31,7 @@
 
 #include <linux/platform_device.h>
 #include <plat/usb.h>
+#include <linux/pm_runtime.h>
 
 /*-------------------------------------------------------------------------*/
 
@@ -172,11 +173,8 @@ static int __devinit ohci_hcd_omap3_probe(struct platform_device *pdev)
 	hcd->rsrc_len = resource_size(res);
 	hcd->regs =  regs;
 
-	ret = omap_usbhs_enable(dev);
-	if (ret) {
-		dev_dbg(dev, "failed to start ohci\n");
-		goto err_end;
-	}
+	pm_runtime_enable(dev);
+	pm_runtime_get_sync(dev);
 
 	ohci_hcd_init(hcd_to_ohci(hcd));
 
@@ -189,7 +187,7 @@ static int __devinit ohci_hcd_omap3_probe(struct platform_device *pdev)
 	return 0;
 
 err_add_hcd:
-	omap_usbhs_disable(dev);
+	pm_runtime_get_sync(dev);
 
 err_end:
 	usb_put_hcd(hcd);
@@ -220,9 +218,9 @@ static int __devexit ohci_hcd_omap3_remove(struct platform_device *pdev)
 
 	iounmap(hcd->regs);
 	usb_remove_hcd(hcd);
-	omap_usbhs_disable(dev);
+	pm_runtime_put_sync(dev);
+	pm_runtime_disable(dev);
 	usb_put_hcd(hcd);
-
 	return 0;
 }
 
-- 
1.6.0.4

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* Re: [PATCH 5/5 v4] mfd: omap: usb: Runtime PM support
  2011-08-09 14:15         ` [PATCH 5/5 v4] mfd: omap: usb: Runtime PM support Keshava Munegowda
@ 2011-08-10 16:31           ` Todd Poynor
  2011-08-12  6:50             ` Munegowda, Keshava
  2011-08-11 15:20           ` Ming Lei
       [not found]           ` <1312899309-24067-6-git-send-email-keshava_mgowda-l0cyMroinI0@public.gmane.org>
  2 siblings, 1 reply; 20+ messages in thread
From: Todd Poynor @ 2011-08-10 16:31 UTC (permalink / raw)
  To: Keshava Munegowda
  Cc: linux-usb, linux-omap, linux-kernel, balbi, gadiyar, sameo,
	parthab, tony, khilman, b-cousson, paul, johnstul, vishwanath.bs

On Tue, Aug 09, 2011 at 07:45:09PM +0530, Keshava Munegowda wrote:
> From: Keshava Munegowda <Keshava_mgowda@ti.com>
> 
> The usbhs core driver does not enable/disable the intefrace and


typo: interface

> fucntional clocks; These clocks are handled by hwmod and runtime pm,


typo: functional

> hence insted of the clock enable/disable, the runtime pm APIS are
> used. however,the port clocks are handled by the usbhs core.
> 
> Signed-off-by: Keshava Munegowda <keshava_mgowda@ti.com>

...
> @@ -913,12 +598,15 @@ static int usbhs_enable(struct device *dev)
>  				(pdata->ehci_data->reset_gpio_port[1], 1);
>  	}
>  
> -end_count:
> -	omap->count++;
> +	pm_runtime_put_sync(dev);
>  	spin_unlock_irqrestore(&omap->lock, flags);

Is pm_runtime_irq_safe() needed (else I think runtime PM callbacks may
re-enable IRQs... or there's the new *_suspend runtime PM calls that
may avoid this)?

...
> @@ -266,10 +261,12 @@ static int ehci_hcd_omap_remove(struct platform_device *pdev)
>  	struct usb_hcd *hcd	= dev_get_drvdata(dev);
>  
>  	usb_remove_hcd(hcd);
> -	omap_usbhs_disable(dev);
>  	disable_put_regulator(dev->platform_data);
> -	iounmap(hcd->regs);
>  	usb_put_hcd(hcd);
> +	iounmap(hcd->regs);


usb_put_hcd may release the hcd, needs to be after the deref for
iounmap.

> +	pm_runtime_put_sync(dev);
> +	pm_runtime_disable(dev);


Todd

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 5/5 v4] mfd: omap: usb: Runtime PM support
  2011-08-09 14:15         ` [PATCH 5/5 v4] mfd: omap: usb: Runtime PM support Keshava Munegowda
  2011-08-10 16:31           ` Todd Poynor
@ 2011-08-11 15:20           ` Ming Lei
       [not found]           ` <1312899309-24067-6-git-send-email-keshava_mgowda-l0cyMroinI0@public.gmane.org>
  2 siblings, 0 replies; 20+ messages in thread
From: Ming Lei @ 2011-08-11 15:20 UTC (permalink / raw)
  To: Keshava Munegowda
  Cc: linux-usb, linux-omap, linux-kernel, balbi, gadiyar, sameo,
	parthab, tony, khilman, b-cousson, paul, johnstul, vishwanath.bs

Hi,

On Tue, Aug 9, 2011 at 10:15 PM, Keshava Munegowda
<keshava_mgowda@ti.com> wrote:
> From: Keshava Munegowda <Keshava_mgowda@ti.com>
>
> The usbhs core driver does not enable/disable the intefrace and
> fucntional clocks; These clocks are handled by hwmod and runtime pm,
> hence insted of the clock enable/disable, the runtime pm APIS are
> used. however,the port clocks are handled by the usbhs core.
>
> Signed-off-by: Keshava Munegowda <keshava_mgowda@ti.com>
> ---
>  arch/arm/plat-omap/include/plat/usb.h |    3 -
>  drivers/mfd/omap-usb-host.c           |  722 +++++++++++++--------------------
>  drivers/usb/host/ehci-omap.c          |   19 +-
>  drivers/usb/host/ohci-omap3.c         |   14 +-
>  4 files changed, 286 insertions(+), 472 deletions(-)
>
> diff --git a/arch/arm/plat-omap/include/plat/usb.h b/arch/arm/plat-omap/include/plat/usb.h
> index 17d3c93..2b66dc2 100644
> --- a/arch/arm/plat-omap/include/plat/usb.h
> +++ b/arch/arm/plat-omap/include/plat/usb.h
> @@ -100,9 +100,6 @@ extern void usb_musb_init(struct omap_musb_board_data *board_data);
>
>  extern void usbhs_init(const struct usbhs_omap_board_data *pdata);
>
> -extern int omap_usbhs_enable(struct device *dev);
> -extern void omap_usbhs_disable(struct device *dev);
> -
>  extern int omap4430_phy_power(struct device *dev, int ID, int on);
>  extern int omap4430_phy_set_clk(struct device *dev, int on);
>  extern int omap4430_phy_init(struct device *dev);
> diff --git a/drivers/mfd/omap-usb-host.c b/drivers/mfd/omap-usb-host.c
> index 5def51c..39cfae6 100644
> --- a/drivers/mfd/omap-usb-host.c
> +++ b/drivers/mfd/omap-usb-host.c
> @@ -26,6 +26,7 @@
>  #include <linux/spinlock.h>
>  #include <linux/gpio.h>
>  #include <plat/usb.h>
> +#include <linux/pm_runtime.h>
>
>  #define USBHS_DRIVER_NAME      "usbhs_omap"
>  #define OMAP_EHCI_DEVICE       "ehci-omap"
> @@ -146,9 +147,6 @@
>
>
>  struct usbhs_hcd_omap {
> -       struct clk                      *usbhost_ick;
> -       struct clk                      *usbhost_hs_fck;
> -       struct clk                      *usbhost_fs_fck;
>        struct clk                      *xclk60mhsp1_ck;
>        struct clk                      *xclk60mhsp2_ck;
>        struct clk                      *utmi_p1_fck;
> @@ -158,8 +156,6 @@ struct usbhs_hcd_omap {
>        struct clk                      *usbhost_p2_fck;
>        struct clk                      *usbtll_p2_fck;
>        struct clk                      *init_60m_fclk;
> -       struct clk                      *usbtll_fck;
> -       struct clk                      *usbtll_ick;
>
>        void __iomem                    *uhh_base;
>        void __iomem                    *tll_base;
> @@ -168,7 +164,6 @@ struct usbhs_hcd_omap {
>
>        u32                             usbhs_rev;
>        spinlock_t                      lock;
> -       int                             count;
>  };
>  /*-------------------------------------------------------------------------*/
>
> @@ -318,269 +313,6 @@ err_end:
>        return ret;
>  }
>
> -/**
> - * usbhs_omap_probe - initialize TI-based HCDs
> - *
> - * Allocates basic resources for this USB host controller.
> - */
> -static int __devinit usbhs_omap_probe(struct platform_device *pdev)
> -{
> -       struct device                   *dev =  &pdev->dev;
> -       struct usbhs_omap_platform_data *pdata = dev->platform_data;
> -       struct usbhs_hcd_omap           *omap;
> -       struct resource                 *res;
> -       int                             ret = 0;
> -       int                             i;
> -
> -       if (!pdata) {
> -               dev_err(dev, "Missing platform data\n");
> -               ret = -ENOMEM;
> -               goto end_probe;
> -       }
> -
> -       omap = kzalloc(sizeof(*omap), GFP_KERNEL);
> -       if (!omap) {
> -               dev_err(dev, "Memory allocation failed\n");
> -               ret = -ENOMEM;
> -               goto end_probe;
> -       }
> -
> -       spin_lock_init(&omap->lock);
> -
> -       for (i = 0; i < OMAP3_HS_USB_PORTS; i++)
> -               omap->platdata.port_mode[i] = pdata->port_mode[i];
> -
> -       omap->platdata.ehci_data = pdata->ehci_data;
> -       omap->platdata.ohci_data = pdata->ohci_data;
> -
> -       omap->usbhost_ick = clk_get(dev, "usbhost_ick");
> -       if (IS_ERR(omap->usbhost_ick)) {
> -               ret =  PTR_ERR(omap->usbhost_ick);
> -               dev_err(dev, "usbhost_ick failed error:%d\n", ret);
> -               goto err_end;
> -       }
> -
> -       omap->usbhost_hs_fck = clk_get(dev, "hs_fck");
> -       if (IS_ERR(omap->usbhost_hs_fck)) {
> -               ret = PTR_ERR(omap->usbhost_hs_fck);
> -               dev_err(dev, "usbhost_hs_fck failed error:%d\n", ret);
> -               goto err_usbhost_ick;
> -       }
> -
> -       omap->usbhost_fs_fck = clk_get(dev, "fs_fck");
> -       if (IS_ERR(omap->usbhost_fs_fck)) {
> -               ret = PTR_ERR(omap->usbhost_fs_fck);
> -               dev_err(dev, "usbhost_fs_fck failed error:%d\n", ret);
> -               goto err_usbhost_hs_fck;
> -       }
> -
> -       omap->usbtll_fck = clk_get(dev, "usbtll_fck");
> -       if (IS_ERR(omap->usbtll_fck)) {
> -               ret = PTR_ERR(omap->usbtll_fck);
> -               dev_err(dev, "usbtll_fck failed error:%d\n", ret);
> -               goto err_usbhost_fs_fck;
> -       }
> -
> -       omap->usbtll_ick = clk_get(dev, "usbtll_ick");
> -       if (IS_ERR(omap->usbtll_ick)) {
> -               ret = PTR_ERR(omap->usbtll_ick);
> -               dev_err(dev, "usbtll_ick failed error:%d\n", ret);
> -               goto err_usbtll_fck;
> -       }
> -
> -       omap->utmi_p1_fck = clk_get(dev, "utmi_p1_gfclk");
> -       if (IS_ERR(omap->utmi_p1_fck)) {
> -               ret = PTR_ERR(omap->utmi_p1_fck);
> -               dev_err(dev, "utmi_p1_gfclk failed error:%d\n", ret);
> -               goto err_usbtll_ick;
> -       }
> -
> -       omap->xclk60mhsp1_ck = clk_get(dev, "xclk60mhsp1_ck");
> -       if (IS_ERR(omap->xclk60mhsp1_ck)) {
> -               ret = PTR_ERR(omap->xclk60mhsp1_ck);
> -               dev_err(dev, "xclk60mhsp1_ck failed error:%d\n", ret);
> -               goto err_utmi_p1_fck;
> -       }
> -
> -       omap->utmi_p2_fck = clk_get(dev, "utmi_p2_gfclk");
> -       if (IS_ERR(omap->utmi_p2_fck)) {
> -               ret = PTR_ERR(omap->utmi_p2_fck);
> -               dev_err(dev, "utmi_p2_gfclk failed error:%d\n", ret);
> -               goto err_xclk60mhsp1_ck;
> -       }
> -
> -       omap->xclk60mhsp2_ck = clk_get(dev, "xclk60mhsp2_ck");
> -       if (IS_ERR(omap->xclk60mhsp2_ck)) {
> -               ret = PTR_ERR(omap->xclk60mhsp2_ck);
> -               dev_err(dev, "xclk60mhsp2_ck failed error:%d\n", ret);
> -               goto err_utmi_p2_fck;
> -       }
> -
> -       omap->usbhost_p1_fck = clk_get(dev, "usb_host_hs_utmi_p1_clk");
> -       if (IS_ERR(omap->usbhost_p1_fck)) {
> -               ret = PTR_ERR(omap->usbhost_p1_fck);
> -               dev_err(dev, "usbhost_p1_fck failed error:%d\n", ret);
> -               goto err_xclk60mhsp2_ck;
> -       }
> -
> -       omap->usbtll_p1_fck = clk_get(dev, "usb_tll_hs_usb_ch0_clk");
> -       if (IS_ERR(omap->usbtll_p1_fck)) {
> -               ret = PTR_ERR(omap->usbtll_p1_fck);
> -               dev_err(dev, "usbtll_p1_fck failed error:%d\n", ret);
> -               goto err_usbhost_p1_fck;
> -       }
> -
> -       omap->usbhost_p2_fck = clk_get(dev, "usb_host_hs_utmi_p2_clk");
> -       if (IS_ERR(omap->usbhost_p2_fck)) {
> -               ret = PTR_ERR(omap->usbhost_p2_fck);
> -               dev_err(dev, "usbhost_p2_fck failed error:%d\n", ret);
> -               goto err_usbtll_p1_fck;
> -       }
> -
> -       omap->usbtll_p2_fck = clk_get(dev, "usb_tll_hs_usb_ch1_clk");
> -       if (IS_ERR(omap->usbtll_p2_fck)) {
> -               ret = PTR_ERR(omap->usbtll_p2_fck);
> -               dev_err(dev, "usbtll_p2_fck failed error:%d\n", ret);
> -               goto err_usbhost_p2_fck;
> -       }
> -
> -       omap->init_60m_fclk = clk_get(dev, "init_60m_fclk");
> -       if (IS_ERR(omap->init_60m_fclk)) {
> -               ret = PTR_ERR(omap->init_60m_fclk);
> -               dev_err(dev, "init_60m_fclk failed error:%d\n", ret);
> -               goto err_usbtll_p2_fck;
> -       }
> -
> -       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "uhh");
> -       if (!res) {
> -               dev_err(dev, "UHH EHCI get resource failed\n");
> -               ret = -ENODEV;
> -               goto err_init_60m_fclk;
> -       }
> -
> -       omap->uhh_base = ioremap(res->start, resource_size(res));
> -       if (!omap->uhh_base) {
> -               dev_err(dev, "UHH ioremap failed\n");
> -               ret = -ENOMEM;
> -               goto err_init_60m_fclk;
> -       }
> -
> -       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "tll");
> -       if (!res) {
> -               dev_err(dev, "UHH EHCI get resource failed\n");
> -               ret = -ENODEV;
> -               goto err_tll;
> -       }
> -
> -       omap->tll_base = ioremap(res->start, resource_size(res));
> -       if (!omap->tll_base) {
> -               dev_err(dev, "TLL ioremap failed\n");
> -               ret = -ENOMEM;
> -               goto err_tll;
> -       }
> -
> -       platform_set_drvdata(pdev, omap);
> -
> -       ret = omap_usbhs_alloc_children(pdev);
> -       if (ret) {
> -               dev_err(dev, "omap_usbhs_alloc_children failed\n");
> -               goto err_alloc;
> -       }
> -
> -       goto end_probe;
> -
> -err_alloc:
> -       iounmap(omap->tll_base);
> -
> -err_tll:
> -       iounmap(omap->uhh_base);
> -
> -err_init_60m_fclk:
> -       clk_put(omap->init_60m_fclk);
> -
> -err_usbtll_p2_fck:
> -       clk_put(omap->usbtll_p2_fck);
> -
> -err_usbhost_p2_fck:
> -       clk_put(omap->usbhost_p2_fck);
> -
> -err_usbtll_p1_fck:
> -       clk_put(omap->usbtll_p1_fck);
> -
> -err_usbhost_p1_fck:
> -       clk_put(omap->usbhost_p1_fck);
> -
> -err_xclk60mhsp2_ck:
> -       clk_put(omap->xclk60mhsp2_ck);
> -
> -err_utmi_p2_fck:
> -       clk_put(omap->utmi_p2_fck);
> -
> -err_xclk60mhsp1_ck:
> -       clk_put(omap->xclk60mhsp1_ck);
> -
> -err_utmi_p1_fck:
> -       clk_put(omap->utmi_p1_fck);
> -
> -err_usbtll_ick:
> -       clk_put(omap->usbtll_ick);
> -
> -err_usbtll_fck:
> -       clk_put(omap->usbtll_fck);
> -
> -err_usbhost_fs_fck:
> -       clk_put(omap->usbhost_fs_fck);
> -
> -err_usbhost_hs_fck:
> -       clk_put(omap->usbhost_hs_fck);
> -
> -err_usbhost_ick:
> -       clk_put(omap->usbhost_ick);
> -
> -err_end:
> -       kfree(omap);
> -
> -end_probe:
> -       return ret;
> -}
> -
> -/**
> - * usbhs_omap_remove - shutdown processing for UHH & TLL HCDs
> - * @pdev: USB Host Controller being removed
> - *
> - * Reverses the effect of usbhs_omap_probe().
> - */
> -static int __devexit usbhs_omap_remove(struct platform_device *pdev)
> -{
> -       struct usbhs_hcd_omap *omap = platform_get_drvdata(pdev);
> -
> -       if (omap->count != 0) {
> -               dev_err(&pdev->dev,
> -                       "Either EHCI or OHCI is still using usbhs core\n");
> -               return -EBUSY;
> -       }
> -
> -       iounmap(omap->tll_base);
> -       iounmap(omap->uhh_base);
> -       clk_put(omap->init_60m_fclk);
> -       clk_put(omap->usbtll_p2_fck);
> -       clk_put(omap->usbhost_p2_fck);
> -       clk_put(omap->usbtll_p1_fck);
> -       clk_put(omap->usbhost_p1_fck);
> -       clk_put(omap->xclk60mhsp2_ck);
> -       clk_put(omap->utmi_p2_fck);
> -       clk_put(omap->xclk60mhsp1_ck);
> -       clk_put(omap->utmi_p1_fck);
> -       clk_put(omap->usbtll_ick);
> -       clk_put(omap->usbtll_fck);
> -       clk_put(omap->usbhost_fs_fck);
> -       clk_put(omap->usbhost_hs_fck);
> -       clk_put(omap->usbhost_ick);
> -       kfree(omap);
> -
> -       return 0;
> -}
> -
>  static bool is_ohci_port(enum usbhs_omap_port_mode pmode)
>  {
>        switch (pmode) {
> @@ -689,30 +421,70 @@ static void usbhs_omap_tll_init(struct device *dev, u8 tll_channel_count)
>        }
>  }
>
> -static int usbhs_enable(struct device *dev)
> +static int usbhs_runtime_resume(struct device *dev)
>  {
>        struct usbhs_hcd_omap           *omap = dev_get_drvdata(dev);
>        struct usbhs_omap_platform_data *pdata = &omap->platdata;
> -       unsigned long                   flags = 0;
> -       int                             ret = 0;
> -       unsigned long                   timeout;
> -       unsigned                        reg;
>
> -       dev_dbg(dev, "starting TI HSUSB Controller\n");
> +       dev_dbg(dev, "usbhs_runtime_resume\n");
> +
> +       if (!pdata) {
> +               dev_dbg(dev, "missing platform_data\n");
> +               return  -ENODEV;
> +       }
> +
> +       if (is_ehci_tll_mode(pdata->port_mode[0])) {
> +               clk_enable(omap->usbhost_p1_fck);
> +               clk_enable(omap->usbtll_p1_fck);
> +       }
> +       if (is_ehci_tll_mode(pdata->port_mode[1])) {
> +               clk_enable(omap->usbhost_p2_fck);
> +               clk_enable(omap->usbtll_p2_fck);
> +       }
> +       clk_enable(omap->utmi_p1_fck);
> +       clk_enable(omap->utmi_p2_fck);
> +
> +       return 0;
> +}
> +
> +static int usbhs_runtime_suspend(struct device *dev)
> +{
> +       struct usbhs_hcd_omap           *omap = dev_get_drvdata(dev);
> +       struct usbhs_omap_platform_data *pdata = &omap->platdata;
> +
> +       dev_dbg(dev, "usbhs_runtime_suspend\n");
> +
>        if (!pdata) {
>                dev_dbg(dev, "missing platform_data\n");
>                return  -ENODEV;
>        }
>
> +       if (is_ehci_tll_mode(pdata->port_mode[0])) {
> +               clk_disable(omap->usbhost_p1_fck);
> +               clk_disable(omap->usbtll_p1_fck);
> +       }
> +       if (is_ehci_tll_mode(pdata->port_mode[1])) {
> +               clk_disable(omap->usbhost_p2_fck);
> +               clk_disable(omap->usbtll_p2_fck);
> +       }
> +       clk_disable(omap->utmi_p2_fck);
> +       clk_disable(omap->utmi_p1_fck);
> +
> +       return 0;
> +}
> +
> +static void omap_usbhs_init(struct device *dev)
> +{
> +       struct usbhs_hcd_omap           *omap = dev_get_drvdata(dev);
> +       struct usbhs_omap_platform_data *pdata = &omap->platdata;
> +       unsigned long                   flags = 0;
> +       unsigned                        reg;
> +
> +       dev_dbg(dev, "starting TI HSUSB Controller\n");
> +
>        spin_lock_irqsave(&omap->lock, flags);
> -       if (omap->count > 0)
> -               goto end_count;
>
> -       clk_enable(omap->usbhost_ick);
> -       clk_enable(omap->usbhost_hs_fck);
> -       clk_enable(omap->usbhost_fs_fck);
> -       clk_enable(omap->usbtll_fck);
> -       clk_enable(omap->usbtll_ick);
> +       pm_runtime_get_sync(dev);
>
>        if (pdata->ehci_data->phy_reset) {
>                if (gpio_is_valid(pdata->ehci_data->reset_gpio_port[0])) {
> @@ -736,50 +508,6 @@ static int usbhs_enable(struct device *dev)
>        omap->usbhs_rev = usbhs_read(omap->uhh_base, OMAP_UHH_REVISION);
>        dev_dbg(dev, "OMAP UHH_REVISION 0x%x\n", omap->usbhs_rev);
>
> -       /* perform TLL soft reset, and wait until reset is complete */
> -       usbhs_write(omap->tll_base, OMAP_USBTLL_SYSCONFIG,
> -                       OMAP_USBTLL_SYSCONFIG_SOFTRESET);
> -
> -       /* Wait for TLL reset to complete */
> -       timeout = jiffies + msecs_to_jiffies(1000);
> -       while (!(usbhs_read(omap->tll_base, OMAP_USBTLL_SYSSTATUS)
> -                       & OMAP_USBTLL_SYSSTATUS_RESETDONE)) {
> -               cpu_relax();
> -
> -               if (time_after(jiffies, timeout)) {
> -                       dev_dbg(dev, "operation timed out\n");
> -                       ret = -EINVAL;
> -                       goto err_tll;
> -               }
> -       }
> -
> -       dev_dbg(dev, "TLL RESET DONE\n");
> -
> -       /* (1<<3) = no idle mode only for initial debugging */
> -       usbhs_write(omap->tll_base, OMAP_USBTLL_SYSCONFIG,
> -                       OMAP_USBTLL_SYSCONFIG_ENAWAKEUP |
> -                       OMAP_USBTLL_SYSCONFIG_SIDLEMODE |
> -                       OMAP_USBTLL_SYSCONFIG_AUTOIDLE);
> -
> -       /* Put UHH in NoIdle/NoStandby mode */
> -       reg = usbhs_read(omap->uhh_base, OMAP_UHH_SYSCONFIG);
> -       if (is_omap_usbhs_rev1(omap)) {
> -               reg |= (OMAP_UHH_SYSCONFIG_ENAWAKEUP
> -                               | OMAP_UHH_SYSCONFIG_SIDLEMODE
> -                               | OMAP_UHH_SYSCONFIG_CACTIVITY
> -                               | OMAP_UHH_SYSCONFIG_MIDLEMODE);
> -               reg &= ~OMAP_UHH_SYSCONFIG_AUTOIDLE;
> -
> -
> -       } else if (is_omap_usbhs_rev2(omap)) {
> -               reg &= ~OMAP4_UHH_SYSCONFIG_IDLEMODE_CLEAR;
> -               reg |= OMAP4_UHH_SYSCONFIG_NOIDLE;
> -               reg &= ~OMAP4_UHH_SYSCONFIG_STDBYMODE_CLEAR;
> -               reg |= OMAP4_UHH_SYSCONFIG_NOSTDBY;
> -       }
> -
> -       usbhs_write(omap->uhh_base, OMAP_UHH_SYSCONFIG, reg);
> -
>        reg = usbhs_read(omap->uhh_base, OMAP_UHH_HOSTCONFIG);
>        /* setup ULPI bypass and burst configurations */
>        reg |= (OMAP_UHH_HOSTCONFIG_INCR4_BURST_EN
> @@ -825,49 +553,6 @@ static int usbhs_enable(struct device *dev)
>                reg &= ~OMAP4_P1_MODE_CLEAR;
>                reg &= ~OMAP4_P2_MODE_CLEAR;
>
> -               if (is_ehci_phy_mode(pdata->port_mode[0])) {
> -                       ret = clk_set_parent(omap->utmi_p1_fck,
> -                                               omap->xclk60mhsp1_ck);
> -                       if (ret != 0) {
> -                               dev_err(dev, "xclk60mhsp1_ck set parent"
> -                               "failed error:%d\n", ret);
> -                               goto err_tll;
> -                       }
> -               } else if (is_ehci_tll_mode(pdata->port_mode[0])) {
> -                       ret = clk_set_parent(omap->utmi_p1_fck,
> -                                               omap->init_60m_fclk);
> -                       if (ret != 0) {
> -                               dev_err(dev, "init_60m_fclk set parent"
> -                               "failed error:%d\n", ret);
> -                               goto err_tll;
> -                       }
> -                       clk_enable(omap->usbhost_p1_fck);
> -                       clk_enable(omap->usbtll_p1_fck);
> -               }
> -
> -               if (is_ehci_phy_mode(pdata->port_mode[1])) {
> -                       ret = clk_set_parent(omap->utmi_p2_fck,
> -                                               omap->xclk60mhsp2_ck);
> -                       if (ret != 0) {
> -                               dev_err(dev, "xclk60mhsp1_ck set parent"
> -                                       "failed error:%d\n", ret);
> -                               goto err_tll;
> -                       }
> -               } else if (is_ehci_tll_mode(pdata->port_mode[1])) {
> -                       ret = clk_set_parent(omap->utmi_p2_fck,
> -                                               omap->init_60m_fclk);
> -                       if (ret != 0) {
> -                               dev_err(dev, "init_60m_fclk set parent"
> -                               "failed error:%d\n", ret);
> -                               goto err_tll;
> -                       }
> -                       clk_enable(omap->usbhost_p2_fck);
> -                       clk_enable(omap->usbtll_p2_fck);
> -               }
> -
> -               clk_enable(omap->utmi_p1_fck);
> -               clk_enable(omap->utmi_p2_fck);
> -
>                if (is_ehci_tll_mode(pdata->port_mode[0]) ||
>                        (is_ohci_port(pdata->port_mode[0])))
>                        reg |= OMAP4_P1_MODE_TLL;
> @@ -913,12 +598,15 @@ static int usbhs_enable(struct device *dev)
>                                (pdata->ehci_data->reset_gpio_port[1], 1);
>        }
>
> -end_count:
> -       omap->count++;
> +       pm_runtime_put_sync(dev);
>        spin_unlock_irqrestore(&omap->lock, flags);
> -       return 0;
> +}
> +
> +static void omap_usbhs_deinit(struct device *dev)
> +{
> +       struct usbhs_hcd_omap           *omap = dev_get_drvdata(dev);
> +       struct usbhs_omap_platform_data *pdata = &omap->platdata;
>
> -err_tll:
>        if (pdata->ehci_data->phy_reset) {
>                if (gpio_is_valid(pdata->ehci_data->reset_gpio_port[0]))
>                        gpio_free(pdata->ehci_data->reset_gpio_port[0]);
> @@ -926,123 +614,257 @@ err_tll:
>                if (gpio_is_valid(pdata->ehci_data->reset_gpio_port[1]))
>                        gpio_free(pdata->ehci_data->reset_gpio_port[1]);
>        }
> -
> -       clk_disable(omap->usbtll_ick);
> -       clk_disable(omap->usbtll_fck);
> -       clk_disable(omap->usbhost_fs_fck);
> -       clk_disable(omap->usbhost_hs_fck);
> -       clk_disable(omap->usbhost_ick);
> -       spin_unlock_irqrestore(&omap->lock, flags);
> -       return ret;
>  }
>
> -static void usbhs_disable(struct device *dev)
> +
> +/**
> + * usbhs_omap_probe - initialize TI-based HCDs
> + *
> + * Allocates basic resources for this USB host controller.
> + */
> +static int __devinit usbhs_omap_probe(struct platform_device *pdev)
>  {
> -       struct usbhs_hcd_omap           *omap = dev_get_drvdata(dev);
> -       struct usbhs_omap_platform_data *pdata = &omap->platdata;
> -       unsigned long                   flags = 0;
> -       unsigned long                   timeout;
> +       struct device                   *dev =  &pdev->dev;
> +       struct usbhs_omap_platform_data *pdata = dev->platform_data;
> +       struct usbhs_hcd_omap           *omap;
> +       struct resource                 *res;
> +       int                             ret = 0;
> +       int                             i;
>
> -       dev_dbg(dev, "stopping TI HSUSB Controller\n");
> +       if (!pdata) {
> +               dev_err(dev, "Missing platform data\n");
> +               ret = -ENOMEM;
> +               goto end_probe;
> +       }
>
> -       spin_lock_irqsave(&omap->lock, flags);
> +       omap = kzalloc(sizeof(*omap), GFP_KERNEL);
> +       if (!omap) {
> +               dev_err(dev, "Memory allocation failed\n");
> +               ret = -ENOMEM;
> +               goto end_probe;
> +       }
> +
> +       spin_lock_init(&omap->lock);
> +
> +       for (i = 0; i < OMAP3_HS_USB_PORTS; i++)
> +               omap->platdata.port_mode[i] = pdata->port_mode[i];
>
> -       if (omap->count == 0)
> -               goto end_disble;
> +       omap->platdata.ehci_data = pdata->ehci_data;
> +       omap->platdata.ohci_data = pdata->ohci_data;
>
> -       omap->count--;
> +       pm_runtime_enable(dev);
>
> -       if (omap->count != 0)
> -               goto end_disble;
> +       omap->utmi_p1_fck = clk_get(dev, "utmi_p1_gfclk");
> +       if (IS_ERR(omap->utmi_p1_fck)) {
> +               ret = PTR_ERR(omap->utmi_p1_fck);
> +               dev_err(dev, "utmi_p1_gfclk failed error:%d\n", ret);
> +               goto err_end;
> +       }
> +
> +       omap->xclk60mhsp1_ck = clk_get(dev, "xclk60mhsp1_ck");
> +       if (IS_ERR(omap->xclk60mhsp1_ck)) {
> +               ret = PTR_ERR(omap->xclk60mhsp1_ck);
> +               dev_err(dev, "xclk60mhsp1_ck failed error:%d\n", ret);
> +               goto err_utmi_p1_fck;
> +       }
>
> -       /* Reset OMAP modules for insmod/rmmod to work */
> -       usbhs_write(omap->uhh_base, OMAP_UHH_SYSCONFIG,
> -                       is_omap_usbhs_rev2(omap) ?
> -                       OMAP4_UHH_SYSCONFIG_SOFTRESET :
> -                       OMAP_UHH_SYSCONFIG_SOFTRESET);
> +       omap->utmi_p2_fck = clk_get(dev, "utmi_p2_gfclk");
> +       if (IS_ERR(omap->utmi_p2_fck)) {
> +               ret = PTR_ERR(omap->utmi_p2_fck);
> +               dev_err(dev, "utmi_p2_gfclk failed error:%d\n", ret);
> +               goto err_xclk60mhsp1_ck;
> +       }
>
> -       timeout = jiffies + msecs_to_jiffies(100);
> -       while (!(usbhs_read(omap->uhh_base, OMAP_UHH_SYSSTATUS)
> -                               & (1 << 0))) {
> -               cpu_relax();
> +       omap->xclk60mhsp2_ck = clk_get(dev, "xclk60mhsp2_ck");
> +       if (IS_ERR(omap->xclk60mhsp2_ck)) {
> +               ret = PTR_ERR(omap->xclk60mhsp2_ck);
> +               dev_err(dev, "xclk60mhsp2_ck failed error:%d\n", ret);
> +               goto err_utmi_p2_fck;
> +       }
>
> -               if (time_after(jiffies, timeout))
> -                       dev_dbg(dev, "operation timed out\n");
> +       omap->usbhost_p1_fck = clk_get(dev, "usb_host_hs_utmi_p1_clk");
> +       if (IS_ERR(omap->usbhost_p1_fck)) {
> +               ret = PTR_ERR(omap->usbhost_p1_fck);
> +               dev_err(dev, "usbhost_p1_fck failed error:%d\n", ret);
> +               goto err_xclk60mhsp2_ck;
>        }
>
> -       while (!(usbhs_read(omap->uhh_base, OMAP_UHH_SYSSTATUS)
> -                               & (1 << 1))) {
> -               cpu_relax();
> +       omap->usbtll_p1_fck = clk_get(dev, "usb_tll_hs_usb_ch0_clk");
> +       if (IS_ERR(omap->usbtll_p1_fck)) {
> +               ret = PTR_ERR(omap->usbtll_p1_fck);
> +               dev_err(dev, "usbtll_p1_fck failed error:%d\n", ret);
> +               goto err_usbhost_p1_fck;
> +       }
>
> -               if (time_after(jiffies, timeout))
> -                       dev_dbg(dev, "operation timed out\n");
> +       omap->usbhost_p2_fck = clk_get(dev, "usb_host_hs_utmi_p2_clk");
> +       if (IS_ERR(omap->usbhost_p2_fck)) {
> +               ret = PTR_ERR(omap->usbhost_p2_fck);
> +               dev_err(dev, "usbhost_p2_fck failed error:%d\n", ret);
> +               goto err_usbtll_p1_fck;
>        }
>
> -       while (!(usbhs_read(omap->uhh_base, OMAP_UHH_SYSSTATUS)
> -                               & (1 << 2))) {
> -               cpu_relax();
> +       omap->usbtll_p2_fck = clk_get(dev, "usb_tll_hs_usb_ch1_clk");
> +       if (IS_ERR(omap->usbtll_p2_fck)) {
> +               ret = PTR_ERR(omap->usbtll_p2_fck);
> +               dev_err(dev, "usbtll_p2_fck failed error:%d\n", ret);
> +               goto err_usbhost_p2_fck;
> +       }
>
> -               if (time_after(jiffies, timeout))
> -                       dev_dbg(dev, "operation timed out\n");
> +       omap->init_60m_fclk = clk_get(dev, "init_60m_fclk");
> +       if (IS_ERR(omap->init_60m_fclk)) {
> +               ret = PTR_ERR(omap->init_60m_fclk);
> +               dev_err(dev, "init_60m_fclk failed error:%d\n", ret);
> +               goto err_usbtll_p2_fck;
>        }
>
> -       usbhs_write(omap->tll_base, OMAP_USBTLL_SYSCONFIG, (1 << 1));
> +       if (is_ehci_phy_mode(pdata->port_mode[0])) {
> +               /* for OMAP3 , the clk set paretn fails */
> +               ret = clk_set_parent(omap->utmi_p1_fck,
> +                                       omap->xclk60mhsp1_ck);
> +               if (ret != 0)
> +                       dev_err(dev, "xclk60mhsp1_ck set parent"
> +                               "failed error:%d\n", ret);
> +       } else if (is_ehci_tll_mode(pdata->port_mode[0])) {
> +               ret = clk_set_parent(omap->utmi_p1_fck,
> +                                       omap->init_60m_fclk);
> +               if (ret != 0)
> +                       dev_err(dev, "init_60m_fclk set parent"
> +                               "failed error:%d\n", ret);
> +       }
>
> -       while (!(usbhs_read(omap->tll_base, OMAP_USBTLL_SYSSTATUS)
> -                               & (1 << 0))) {
> -               cpu_relax();
> +       if (is_ehci_phy_mode(pdata->port_mode[1])) {
> +               ret = clk_set_parent(omap->utmi_p2_fck,
> +                                       omap->xclk60mhsp2_ck);
> +               if (ret != 0)
> +                       dev_err(dev, "xclk60mhsp2_ck set parent"
> +                                       "failed error:%d\n", ret);
> +       } else if (is_ehci_tll_mode(pdata->port_mode[1])) {
> +               ret = clk_set_parent(omap->utmi_p2_fck,
> +                                               omap->init_60m_fclk);
> +               if (ret != 0)
> +                       dev_err(dev, "init_60m_fclk set parent"
> +                               "failed error:%d\n", ret);
> +       }
>
> -               if (time_after(jiffies, timeout))
> -                       dev_dbg(dev, "operation timed out\n");
> +       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "uhh");
> +       if (!res) {
> +               dev_err(dev, "UHH EHCI get resource failed\n");
> +               ret = -ENODEV;
> +               goto err_init_60m_fclk;
>        }
>
> -       if (is_omap_usbhs_rev2(omap)) {
> -               if (is_ehci_tll_mode(pdata->port_mode[0]))
> -                       clk_disable(omap->usbtll_p1_fck);
> -               if (is_ehci_tll_mode(pdata->port_mode[1]))
> -                       clk_disable(omap->usbtll_p2_fck);
> -               clk_disable(omap->utmi_p2_fck);
> -               clk_disable(omap->utmi_p1_fck);
> +       omap->uhh_base = ioremap(res->start, resource_size(res));
> +       if (!omap->uhh_base) {
> +               dev_err(dev, "UHH ioremap failed\n");
> +               ret = -ENOMEM;
> +               goto err_init_60m_fclk;
>        }
>
> -       clk_disable(omap->usbtll_ick);
> -       clk_disable(omap->usbtll_fck);
> -       clk_disable(omap->usbhost_fs_fck);
> -       clk_disable(omap->usbhost_hs_fck);
> -       clk_disable(omap->usbhost_ick);
> +       res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "tll");
> +       if (!res) {
> +               dev_err(dev, "UHH EHCI get resource failed\n");
> +               ret = -ENODEV;
> +               goto err_tll;
> +       }
>
> -       /* The gpio_free migh sleep; so unlock the spinlock */
> -       spin_unlock_irqrestore(&omap->lock, flags);
> +       omap->tll_base = ioremap(res->start, resource_size(res));
> +       if (!omap->tll_base) {
> +               dev_err(dev, "TLL ioremap failed\n");
> +               ret = -ENOMEM;
> +               goto err_tll;
> +       }
>
> -       if (pdata->ehci_data->phy_reset) {
> -               if (gpio_is_valid(pdata->ehci_data->reset_gpio_port[0]))
> -                       gpio_free(pdata->ehci_data->reset_gpio_port[0]);
> +       platform_set_drvdata(pdev, omap);
>
> -               if (gpio_is_valid(pdata->ehci_data->reset_gpio_port[1]))
> -                       gpio_free(pdata->ehci_data->reset_gpio_port[1]);
> +       ret = omap_usbhs_alloc_children(pdev);
> +       if (ret) {
> +               dev_err(dev, "omap_usbhs_alloc_children failed\n");
> +               goto err_alloc;
>        }
> -       return;
>
> -end_disble:
> -       spin_unlock_irqrestore(&omap->lock, flags);
> -}
> +       omap_usbhs_init(dev);
>
> -int omap_usbhs_enable(struct device *dev)
> -{
> -       return  usbhs_enable(dev->parent);
> +       goto end_probe;
> +
> +err_alloc:
> +       iounmap(omap->tll_base);
> +
> +err_tll:
> +       iounmap(omap->uhh_base);
> +
> +err_init_60m_fclk:
> +       clk_put(omap->init_60m_fclk);
> +
> +err_usbtll_p2_fck:
> +       clk_put(omap->usbtll_p2_fck);
> +
> +err_usbhost_p2_fck:
> +       clk_put(omap->usbhost_p2_fck);
> +
> +err_usbtll_p1_fck:
> +       clk_put(omap->usbtll_p1_fck);
> +
> +err_usbhost_p1_fck:
> +       clk_put(omap->usbhost_p1_fck);
> +
> +err_xclk60mhsp2_ck:
> +       clk_put(omap->xclk60mhsp2_ck);
> +
> +err_utmi_p2_fck:
> +       clk_put(omap->utmi_p2_fck);
> +
> +err_xclk60mhsp1_ck:
> +       clk_put(omap->xclk60mhsp1_ck);
> +
> +err_utmi_p1_fck:
> +       clk_put(omap->utmi_p1_fck);
> +
> +err_end:
> +       pm_runtime_disable(dev);
> +       kfree(omap);
> +
> +end_probe:
> +       return ret;
>  }
> -EXPORT_SYMBOL_GPL(omap_usbhs_enable);
>
> -void omap_usbhs_disable(struct device *dev)
> +/**
> + * usbhs_omap_remove - shutdown processing for UHH & TLL HCDs
> + * @pdev: USB Host Controller being removed
> + *
> + * Reverses the effect of usbhs_omap_probe().
> + */
> +static int __devexit usbhs_omap_remove(struct platform_device *pdev)
>  {
> -       usbhs_disable(dev->parent);
> +       struct usbhs_hcd_omap *omap = platform_get_drvdata(pdev);
> +
> +       omap_usbhs_deinit(&pdev->dev);
> +       iounmap(omap->tll_base);
> +       iounmap(omap->uhh_base);
> +       clk_put(omap->init_60m_fclk);
> +       clk_put(omap->usbtll_p2_fck);
> +       clk_put(omap->usbhost_p2_fck);
> +       clk_put(omap->usbtll_p1_fck);
> +       clk_put(omap->usbhost_p1_fck);
> +       clk_put(omap->xclk60mhsp2_ck);
> +       clk_put(omap->utmi_p2_fck);
> +       clk_put(omap->xclk60mhsp1_ck);
> +       clk_put(omap->utmi_p1_fck);
> +       pm_runtime_disable(&pdev->dev);
> +       kfree(omap);
> +
> +       return 0;
>  }
> -EXPORT_SYMBOL_GPL(omap_usbhs_disable);
> +
> +static const struct dev_pm_ops usbhsomap_dev_pm_ops = {
> +       .runtime_suspend        = usbhs_runtime_suspend,
> +       .runtime_resume         = usbhs_runtime_resume,
> +};
>
>  static struct platform_driver usbhs_omap_driver = {
>        .driver = {
>                .name           = (char *)usbhs_driver_name,
>                .owner          = THIS_MODULE,
> +               .pm             = &usbhsomap_dev_pm_ops,
>        },
>        .remove         = __exit_p(usbhs_omap_remove),
>  };
> diff --git a/drivers/usb/host/ehci-omap.c b/drivers/usb/host/ehci-omap.c
> index 4524032..6551d30 100644
> --- a/drivers/usb/host/ehci-omap.c
> +++ b/drivers/usb/host/ehci-omap.c
> @@ -41,6 +41,7 @@
>  #include <linux/usb/ulpi.h>
>  #include <plat/usb.h>
>  #include <linux/regulator/consumer.h>
> +#include <linux/pm_runtime.h>
>
>  /* EHCI Register Set */
>  #define EHCI_INSNREG04                                 (0xA0)
> @@ -190,11 +191,8 @@ static int ehci_hcd_omap_probe(struct platform_device *pdev)
>                }
>        }
>
> -       ret = omap_usbhs_enable(dev);
> -       if (ret) {
> -               dev_err(dev, "failed to start usbhs with err %d\n", ret);
> -               goto err_enable;
> -       }
> +       pm_runtime_enable(dev);
> +       pm_runtime_get_sync(dev);
>
>        /*
>         * An undocumented "feature" in the OMAP3 EHCI controller,
> @@ -240,11 +238,8 @@ static int ehci_hcd_omap_probe(struct platform_device *pdev)
>        return 0;
>
>  err_add_hcd:
> -       omap_usbhs_disable(dev);
> -
> -err_enable:
>        disable_put_regulator(pdata);
> -       usb_put_hcd(hcd);

This seems to be put before 'err_io' and after pm_runtime_put_sync,
doesn't it?

> +       pm_runtime_put_sync(dev);
>
>  err_io:
>        iounmap(regs);
> @@ -266,10 +261,12 @@ static int ehci_hcd_omap_remove(struct platform_device *pdev)
>        struct usb_hcd *hcd     = dev_get_drvdata(dev);
>
>        usb_remove_hcd(hcd);
> -       omap_usbhs_disable(dev);
>        disable_put_regulator(dev->platform_data);
> -       iounmap(hcd->regs);
>        usb_put_hcd(hcd);
> +       iounmap(hcd->regs);
> +       pm_runtime_put_sync(dev);
> +       pm_runtime_disable(dev);
> +
>        return 0;
>  }
>
> diff --git a/drivers/usb/host/ohci-omap3.c b/drivers/usb/host/ohci-omap3.c
> index 6048f2f..58e3dae 100644
> --- a/drivers/usb/host/ohci-omap3.c
> +++ b/drivers/usb/host/ohci-omap3.c
> @@ -31,6 +31,7 @@
>
>  #include <linux/platform_device.h>
>  #include <plat/usb.h>
> +#include <linux/pm_runtime.h>
>
>  /*-------------------------------------------------------------------------*/
>
> @@ -172,11 +173,8 @@ static int __devinit ohci_hcd_omap3_probe(struct platform_device *pdev)
>        hcd->rsrc_len = resource_size(res);
>        hcd->regs =  regs;
>
> -       ret = omap_usbhs_enable(dev);
> -       if (ret) {
> -               dev_dbg(dev, "failed to start ohci\n");
> -               goto err_end;
> -       }
> +       pm_runtime_enable(dev);
> +       pm_runtime_get_sync(dev);
>
>        ohci_hcd_init(hcd_to_ohci(hcd));
>
> @@ -189,7 +187,7 @@ static int __devinit ohci_hcd_omap3_probe(struct platform_device *pdev)
>        return 0;
>
>  err_add_hcd:
> -       omap_usbhs_disable(dev);
> +       pm_runtime_get_sync(dev);

should be pm_runtime_put_sync?

>
>  err_end:
>        usb_put_hcd(hcd);
> @@ -220,9 +218,9 @@ static int __devexit ohci_hcd_omap3_remove(struct platform_device *pdev)
>
>        iounmap(hcd->regs);
>        usb_remove_hcd(hcd);
> -       omap_usbhs_disable(dev);
> +       pm_runtime_put_sync(dev);
> +       pm_runtime_disable(dev);
>        usb_put_hcd(hcd);
> -
>        return 0;
>  }
>
> --
> 1.6.0.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>



-- 
Ming Lei
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 2/5 v4] arm: omap: usb: ehci and ohci hwmod structures for omap3
       [not found]     ` <1312899309-24067-3-git-send-email-keshava_mgowda-l0cyMroinI0@public.gmane.org>
@ 2011-08-11 15:23       ` Ming Lei
  2011-08-12  5:46         ` Munegowda, Keshava
  0 siblings, 1 reply; 20+ messages in thread
From: Ming Lei @ 2011-08-11 15:23 UTC (permalink / raw)
  To: Keshava Munegowda
  Cc: linux-usb-u79uwXL29TY76Z2rM5mHXA,
	linux-omap-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA, balbi-l0cyMroinI0,
	gadiyar-l0cyMroinI0, sameo-VuQAYsv1563Yd54FQh9/CA,
	parthab-PpE0FKYn9XJWk0Htik3J/w, tony-4v6yS6AI5VpBDgjK7y7TUQ,
	khilman-l0cyMroinI0, b-cousson-l0cyMroinI0,
	paul-DWxLp4Yu+b8AvxtiuMwx3w, johnstul-r/Jw6+rmf7HQT0dZR+AlfA,
	vishwanath.bs-l0cyMroinI0

Hi,

On Tue, Aug 9, 2011 at 10:15 PM, Keshava Munegowda
<keshava_mgowda-l0cyMroinI0@public.gmane.org> wrote:
> Following 4 hwmod strcuture are added:
> UHH hwmod of usbhs with uhh base address and functional clock,
> EHCI hwmod with irq and base address,
> OHCI hwmod with irq and base address,
> TLL hwmod of usbhs with the TLL base address and irq.
>
> Signed-off-by: Keshava Munegowda <keshava_mgowda-l0cyMroinI0@public.gmane.org>
> ---
>  arch/arm/mach-omap2/omap_hwmod_3xxx_data.c |  279 ++++++++++++++++++++++++++++
>  1 files changed, 279 insertions(+), 0 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
> index 59fdb9f..d7316b3 100644
> --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
> +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
> @@ -84,6 +84,10 @@ static struct omap_hwmod omap3xxx_mcbsp4_hwmod;
>  static struct omap_hwmod omap3xxx_mcbsp5_hwmod;
>  static struct omap_hwmod omap3xxx_mcbsp2_sidetone_hwmod;
>  static struct omap_hwmod omap3xxx_mcbsp3_sidetone_hwmod;
> +static struct omap_hwmod omap34xx_usb_host_hs_hwmod;
> +static struct omap_hwmod omap34xx_usbhs_ohci_hwmod;
> +static struct omap_hwmod omap34xx_usbhs_ehci_hwmod;
> +static struct omap_hwmod omap34xx_usb_tll_hs_hwmod;
>
>  /* L3 -> L4_CORE interface */
>  static struct omap_hwmod_ocp_if omap3xxx_l3_main__l4_core = {
> @@ -3196,6 +3200,276 @@ static struct omap_hwmod omap3xxx_mmc3_hwmod = {
>        .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
>  };
>
> +/*
> + * 'usb_host_hs' class
> + * high-speed multi-port usb host controller
> + */
> +static struct omap_hwmod_ocp_if omap34xx_usb_host_hs__l3_main_2 = {
> +       .master         = &omap34xx_usb_host_hs_hwmod,
> +       .slave          = &omap3xxx_l3_main_hwmod,
> +       .clk            = "core_l3_ick",
> +       .user           = OCP_USER_MPU,
> +};
> +
> +static struct omap_hwmod_class_sysconfig omap34xx_usb_host_hs_sysc = {
> +       .rev_offs       = 0x0000,
> +       .sysc_offs      = 0x0010,
> +       .syss_offs      = 0x0014,
> +       .sysc_flags     = (SYSC_HAS_MIDLEMODE | SYSC_HAS_SIDLEMODE),

SYSC_HAS_ENAWAKEUP is missed or not needed?

> +       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
> +                          MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
> +       .sysc_fields    = &omap_hwmod_sysc_type1,
> +};
> +
> +static struct omap_hwmod_class omap34xx_usb_host_hs_hwmod_class = {
> +       .name = "usbhs_uhh",
> +       .sysc = &omap34xx_usb_host_hs_sysc,
> +};
> +
> +static struct omap_hwmod_ocp_if *omap34xx_usb_host_hs_masters[] = {
> +       &omap34xx_usb_host_hs__l3_main_2,
> +};
> +
> +static struct omap_hwmod_addr_space omap34xx_usb_host_hs_addrs[] = {
> +       {
> +               .name           = "uhh",
> +               .pa_start       = 0x48064000,
> +               .pa_end         = 0x480643ff,
> +               .flags          = ADDR_TYPE_RT
> +       },
> +       {} /* Terminating Entry */
> +};
> +
> +static struct omap_hwmod_ocp_if omap34xx_l4_cfg__usb_host_hs = {
> +       .master         = &omap3xxx_l4_core_hwmod,
> +       .slave          = &omap34xx_usb_host_hs_hwmod,
> +       .clk            = "l4_ick",
> +       .addr           = omap34xx_usb_host_hs_addrs,
> +       .user           = OCP_USER_MPU | OCP_USER_SDMA,
> +};

Even USBHOST_L4_ICLK is used only by USBHOST_SICLK, it is better to
define a "usbhost_siclk" clk for consistence with TRM.

> +
> +static struct omap_hwmod_ocp_if omap34xx_f128m_cfg__usb_host_hs = {
> +       .clk            = "usbhost_120m_fck",
> +       .user           = OCP_USER_MPU,
> +       .flags          = OCPIF_SWSUP_IDLE,
> +};
> +
> +static struct omap_hwmod_ocp_if omap34xx_f48m_cfg__usb_host_hs = {
> +       .clk            = "usbhost_48m_fck",
> +       .user           = OCP_USER_MPU,
> +       .flags          = OCPIF_SWSUP_IDLE,
> +};
> +
> +static struct omap_hwmod_ocp_if *omap34xx_usb_host_hs_slaves[] = {
> +       &omap34xx_l4_cfg__usb_host_hs,
> +       &omap34xx_f128m_cfg__usb_host_hs,
> +       &omap34xx_f48m_cfg__usb_host_hs,
> +};
> +
> +static struct omap_hwmod omap34xx_usb_host_hs_hwmod = {
> +       .name           = "usbhs_uhh",
> +       .class          = &omap34xx_usb_host_hs_hwmod_class,
> +       .main_clk       = "usbhost_ick",
> +       .prcm = {
> +               .omap2 = {
> +                       .module_offs = OMAP3430ES2_USBHOST_MOD,
> +                       .prcm_reg_id = 1,
> +                       .module_bit = 0,
> +                       .idlest_reg_id = 1,
> +                       .idlest_idle_bit = 1,
> +                       .idlest_stdby_bit = 0,
> +               },
> +       },
> +       .slaves         = omap34xx_usb_host_hs_slaves,
> +       .slaves_cnt     = ARRAY_SIZE(omap34xx_usb_host_hs_slaves),
> +       .masters        = omap34xx_usb_host_hs_masters,
> +       .masters_cnt    = ARRAY_SIZE(omap34xx_usb_host_hs_masters),
> +       .flags          = HWMOD_SWSUP_SIDLE | HWMOD_SWSUP_MSTANDBY,
> +       .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
> +};
> +
> +/* 'usbhs_ohci' class  */
> +static struct omap_hwmod_ocp_if omap34xx_usbhs_ohci__l3_main_2 = {
> +       .master         = &omap34xx_usbhs_ohci_hwmod,
> +       .slave          = &omap3xxx_l3_main_hwmod,
> +       .clk            = "core_l3_ick",
> +       .user           = OCP_USER_MPU,
> +};
> +
> +static struct omap_hwmod_class omap34xx_usbhs_ohci_hwmod_class = {
> +       .name = "usbhs_ohci",
> +};
> +
> +static struct omap_hwmod_ocp_if *omap34xx_usbhs_ohci_masters[] = {
> +       &omap34xx_usbhs_ohci__l3_main_2,
> +};
> +
> +static struct omap_hwmod_irq_info omap34xx_usbhs_ohci_irqs[] = {
> +       { .name = "ohci-irq", .irq = 76 },
> +       { .irq = -1 } /* Terminating IRQ */
> +};
> +
> +static struct omap_hwmod_addr_space omap34xx_usbhs_ohci_addrs[] = {
> +       {
> +               .name           = "ohci",
> +               .pa_start       = 0x48064400,
> +               .pa_end         = 0x480647FF,
> +               .flags          = ADDR_MAP_ON_INIT
> +       },
> +       {} /* Terminating Entry */
> +};
> +
> +static struct omap_hwmod_ocp_if omap34xx_l4_cfg__usbhs_ohci = {
> +       .master         = &omap3xxx_l4_core_hwmod,
> +       .slave          = &omap34xx_usbhs_ohci_hwmod,
> +       .clk            = "l4_ick",
> +       .addr           = omap34xx_usbhs_ohci_addrs,
> +       .user           = OCP_USER_MPU | OCP_USER_SDMA,
> +};
> +
> +static struct omap_hwmod_ocp_if *omap34xx_usbhs_ohci_slaves[] = {
> +       &omap34xx_l4_cfg__usbhs_ohci,
> +};
> +
> +static struct omap_hwmod omap34xx_usbhs_ohci_hwmod = {
> +       .name           = "usbhs_ohci",
> +       .class          = &omap34xx_usbhs_ohci_hwmod_class,
> +       .mpu_irqs       = omap34xx_usbhs_ohci_irqs,
> +       .slaves         = omap34xx_usbhs_ohci_slaves,
> +       .slaves_cnt     = ARRAY_SIZE(omap34xx_usbhs_ohci_slaves),
> +       .masters        = omap34xx_usbhs_ohci_masters,
> +       .masters_cnt    = ARRAY_SIZE(omap34xx_usbhs_ohci_masters),
> +       .flags          = HWMOD_INIT_NO_RESET | HWMOD_NO_IDLEST,
> +       .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
> +};
> +
> +/* 'usbhs_ehci' class  */
> +static struct omap_hwmod_ocp_if omap34xx_usbhs_ehci__l3_main_2 = {
> +       .master         = &omap34xx_usbhs_ehci_hwmod,
> +       .slave          = &omap3xxx_l3_main_hwmod,
> +       .clk            = "core_l3_ick",
> +       .user           = OCP_USER_MPU,
> +};
> +
> +static struct omap_hwmod_class omap34xx_usbhs_ehci_hwmod_class = {
> +       .name = "usbhs_ehci",
> +};
> +
> +static struct omap_hwmod_ocp_if *omap34xx_usbhs_ehci_masters[] = {
> +       &omap34xx_usbhs_ehci__l3_main_2,
> +};
> +
> +static struct omap_hwmod_irq_info omap34xx_usbhs_ehci_irqs[] = {
> +       { .name = "ehci-irq", .irq = 77 },
> +       { .irq = -1 } /* Terminating IRQ */
> +};
> +
> +static struct omap_hwmod_addr_space omap34xx_usbhs_ehci_addrs[] = {
> +       {
> +               .name           = "ehci",
> +               .pa_start       = 0x48064800,
> +               .pa_end         = 0x48064CFF,
> +               .flags          = ADDR_MAP_ON_INIT
> +       },
> +       {} /* Terminating Entry */
> +};
> +
> +static struct omap_hwmod_ocp_if omap34xx_l4_cfg__usbhs_ehci = {
> +       .master         = &omap3xxx_l4_core_hwmod,
> +       .slave          = &omap34xx_usbhs_ehci_hwmod,
> +       .clk            = "l4_ick",
> +       .addr           = omap34xx_usbhs_ehci_addrs,
> +       .user           = OCP_USER_MPU | OCP_USER_SDMA,
> +};
> +
> +static struct omap_hwmod_ocp_if *omap34xx_usbhs_ehci_slaves[] = {
> +       &omap34xx_l4_cfg__usbhs_ehci,
> +};
> +
> +static struct omap_hwmod omap34xx_usbhs_ehci_hwmod = {
> +       .name           = "usbhs_ehci",
> +       .class          = &omap34xx_usbhs_ehci_hwmod_class,
> +       .mpu_irqs       = omap34xx_usbhs_ehci_irqs,
> +       .slaves         = omap34xx_usbhs_ehci_slaves,
> +       .slaves_cnt     = ARRAY_SIZE(omap34xx_usbhs_ehci_slaves),
> +       .masters        = omap34xx_usbhs_ehci_masters,
> +       .masters_cnt    = ARRAY_SIZE(omap34xx_usbhs_ehci_masters),
> +       .flags          = HWMOD_INIT_NO_RESET | HWMOD_NO_IDLEST,
> +       .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
> +};
> +
> +/*
> + * 'usb_tll_hs' class
> + * usb_tll_hs module is the adapter on the usb_host_hs ports
> + */
> +static struct omap_hwmod_class_sysconfig omap34xx_usb_tll_hs_sysc = {
> +       .rev_offs       = 0x0000,
> +       .sysc_offs      = 0x0010,
> +       .syss_offs      = 0x0014,
> +       .sysc_flags     = (SYSC_HAS_AUTOIDLE | SYSC_HAS_SIDLEMODE),
> +       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
> +       .sysc_fields    = &omap_hwmod_sysc_type1,
> +};
> +
> +static struct omap_hwmod_class omap34xx_usb_tll_hs_hwmod_class = {
> +       .name = "usbhs_tll",
> +       .sysc = &omap34xx_usb_tll_hs_sysc,
> +};
> +
> +static struct omap_hwmod_irq_info omap34xx_usb_tll_hs_irqs[] = {
> +       { .name = "tll-irq", .irq = 78 },
> +       { .irq = -1 } /* Terminating IRQ */
> +};
> +
> +static struct omap_hwmod_addr_space omap34xx_usb_tll_hs_addrs[] = {
> +       {
> +               .name           = "tll",
> +               .pa_start       = 0x48062000,
> +               .pa_end         = 0x48062fff,
> +               .flags          = ADDR_TYPE_RT
> +       },
> +       {} /* Terminating Entry */
> +};
> +
> +static struct omap_hwmod_ocp_if omap34xx_f_cfg__usb_tll_hs = {
> +       .clk            = "usbtll_fck",
> +       .user           = OCP_USER_MPU,
> +       .flags          = OCPIF_SWSUP_IDLE,
> +};
> +
> +static struct omap_hwmod_ocp_if omap34xx_l4_cfg__usb_tll_hs = {
> +       .master         = &omap3xxx_l4_core_hwmod,
> +       .slave          = &omap34xx_usb_tll_hs_hwmod,
> +       .clk            = "l4_ick",
> +       .addr           = omap34xx_usb_tll_hs_addrs,
> +       .user           = OCP_USER_MPU | OCP_USER_SDMA,
> +};
> +
> +static struct omap_hwmod_ocp_if *omap34xx_usb_tll_hs_slaves[] = {
> +       &omap34xx_l4_cfg__usb_tll_hs,
> +       &omap34xx_f_cfg__usb_tll_hs,
> +};
> +
> +static struct omap_hwmod omap34xx_usb_tll_hs_hwmod = {
> +       .name           = "usbhs_tll",
> +       .class          = &omap34xx_usb_tll_hs_hwmod_class,
> +       .mpu_irqs       = omap34xx_usb_tll_hs_irqs,
> +       .main_clk       = "usbtll_ick",
> +       .prcm = {
> +               .omap2 = {
> +                       .module_offs = CORE_MOD,
> +                       .prcm_reg_id = 3,
> +                       .module_bit = 2,
> +                       .idlest_reg_id = 3,
> +                       .idlest_idle_bit = 2,
> +               },
> +       },
> +       .slaves         = omap34xx_usb_tll_hs_slaves,
> +       .slaves_cnt     = ARRAY_SIZE(omap34xx_usb_tll_hs_slaves),
> +       .flags          = HWMOD_SWSUP_SIDLE | HWMOD_SWSUP_MSTANDBY,
> +       .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
> +};
> +
>  static __initdata struct omap_hwmod *omap3xxx_hwmods[] = {
>        &omap3xxx_l3_main_hwmod,
>        &omap3xxx_l4_core_hwmod,
> @@ -3278,6 +3552,11 @@ static __initdata struct omap_hwmod *omap3xxx_hwmods[] = {
>        /* usbotg for am35x */
>        &am35xx_usbhsotg_hwmod,
>
> +       &omap34xx_usb_host_hs_hwmod,
> +       &omap34xx_usbhs_ohci_hwmod,
> +       &omap34xx_usbhs_ehci_hwmod,
> +       &omap34xx_usb_tll_hs_hwmod,
> +
>        NULL,
>  };
>
> --
> 1.6.0.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
>



-- 
Ming Lei
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 2/5 v4] arm: omap: usb: ehci and ohci hwmod structures for omap3
  2011-08-11 15:23       ` [PATCH 2/5 v4] arm: omap: usb: ehci and ohci hwmod structures for omap3 Ming Lei
@ 2011-08-12  5:46         ` Munegowda, Keshava
  2011-08-12  7:25           ` Ming Lei
  0 siblings, 1 reply; 20+ messages in thread
From: Munegowda, Keshava @ 2011-08-12  5:46 UTC (permalink / raw)
  To: Ming Lei
  Cc: linux-usb, linux-omap, linux-kernel, balbi, gadiyar, sameo,
	parthab, tony, khilman, b-cousson, paul, johnstul, vishwanath.bs

On Thu, Aug 11, 2011 at 8:53 PM, Ming Lei <tom.leiming@gmail.com> wrote:
> Hi,
>
> On Tue, Aug 9, 2011 at 10:15 PM, Keshava Munegowda
> <keshava_mgowda@ti.com> wrote:
>> Following 4 hwmod strcuture are added:
>> UHH hwmod of usbhs with uhh base address and functional clock,
>> EHCI hwmod with irq and base address,
>> OHCI hwmod with irq and base address,
>> TLL hwmod of usbhs with the TLL base address and irq.
>>
>> Signed-off-by: Keshava Munegowda <keshava_mgowda@ti.com>
>> ---
>>  arch/arm/mach-omap2/omap_hwmod_3xxx_data.c |  279 ++++++++++++++++++++++++++++
>>  1 files changed, 279 insertions(+), 0 deletions(-)
>>
>> diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
>> index 59fdb9f..d7316b3 100644
>> --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
>> +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
>> @@ -84,6 +84,10 @@ static struct omap_hwmod omap3xxx_mcbsp4_hwmod;
>>  static struct omap_hwmod omap3xxx_mcbsp5_hwmod;
>>  static struct omap_hwmod omap3xxx_mcbsp2_sidetone_hwmod;
>>  static struct omap_hwmod omap3xxx_mcbsp3_sidetone_hwmod;
>> +static struct omap_hwmod omap34xx_usb_host_hs_hwmod;
>> +static struct omap_hwmod omap34xx_usbhs_ohci_hwmod;
>> +static struct omap_hwmod omap34xx_usbhs_ehci_hwmod;
>> +static struct omap_hwmod omap34xx_usb_tll_hs_hwmod;
>>
>>  /* L3 -> L4_CORE interface */
>>  static struct omap_hwmod_ocp_if omap3xxx_l3_main__l4_core = {
>> @@ -3196,6 +3200,276 @@ static struct omap_hwmod omap3xxx_mmc3_hwmod = {
>>        .omap_chip      = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
>>  };
>>
>> +/*
>> + * 'usb_host_hs' class
>> + * high-speed multi-port usb host controller
>> + */
>> +static struct omap_hwmod_ocp_if omap34xx_usb_host_hs__l3_main_2 = {
>> +       .master         = &omap34xx_usb_host_hs_hwmod,
>> +       .slave          = &omap3xxx_l3_main_hwmod,
>> +       .clk            = "core_l3_ick",
>> +       .user           = OCP_USER_MPU,
>> +};
>> +
>> +static struct omap_hwmod_class_sysconfig omap34xx_usb_host_hs_sysc = {
>> +       .rev_offs       = 0x0000,
>> +       .sysc_offs      = 0x0010,
>> +       .syss_offs      = 0x0014,
>> +       .sysc_flags     = (SYSC_HAS_MIDLEMODE | SYSC_HAS_SIDLEMODE),
>
> SYSC_HAS_ENAWAKEUP is missed or not needed?

not needed. wakeup will through irq-chaining mechanism.

>
>> +       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
>> +                          MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
>> +       .sysc_fields    = &omap_hwmod_sysc_type1,
>> +};
>> +
>> +static struct omap_hwmod_class omap34xx_usb_host_hs_hwmod_class = {
>> +       .name = "usbhs_uhh",
>> +       .sysc = &omap34xx_usb_host_hs_sysc,
>> +};
>> +
>> +static struct omap_hwmod_ocp_if *omap34xx_usb_host_hs_masters[] = {
>> +       &omap34xx_usb_host_hs__l3_main_2,
>> +};
>> +
>> +static struct omap_hwmod_addr_space omap34xx_usb_host_hs_addrs[] = {
>> +       {
>> +               .name           = "uhh",
>> +               .pa_start       = 0x48064000,
>> +               .pa_end         = 0x480643ff,
>> +               .flags          = ADDR_TYPE_RT
>> +       },
>> +       {} /* Terminating Entry */
>> +};
>> +
>> +static struct omap_hwmod_ocp_if omap34xx_l4_cfg__usb_host_hs = {
>> +       .master         = &omap3xxx_l4_core_hwmod,
>> +       .slave          = &omap34xx_usb_host_hs_hwmod,
>> +       .clk            = "l4_ick",
>> +       .addr           = omap34xx_usb_host_hs_addrs,
>> +       .user           = OCP_USER_MPU | OCP_USER_SDMA,
>> +};
>
> Even USBHOST_L4_ICLK is used only by USBHOST_SICLK, it is better to
> define a "usbhost_siclk" clk for consistence with TRM.

I dint understand, what is the change you are suggesting?

keshava
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 5/5 v4] mfd: omap: usb: Runtime PM support
  2011-08-10 16:31           ` Todd Poynor
@ 2011-08-12  6:50             ` Munegowda, Keshava
  2011-08-12 21:30               ` Todd Poynor
  0 siblings, 1 reply; 20+ messages in thread
From: Munegowda, Keshava @ 2011-08-12  6:50 UTC (permalink / raw)
  To: Todd Poynor
  Cc: linux-usb, linux-omap, linux-kernel, balbi, gadiyar, sameo,
	parthab, tony, khilman, b-cousson, paul, johnstul, vishwanath.bs

On Wed, Aug 10, 2011 at 10:01 PM, Todd Poynor <toddpoynor@google.com> wrote:
> On Tue, Aug 09, 2011 at 07:45:09PM +0530, Keshava Munegowda wrote:
>> From: Keshava Munegowda <Keshava_mgowda@ti.com>
>>
>> The usbhs core driver does not enable/disable the intefrace and
>
>
> typo: interface
>
>> fucntional clocks; These clocks are handled by hwmod and runtime pm,
>
>
> typo: functional
>
>> hence insted of the clock enable/disable, the runtime pm APIS are
>> used. however,the port clocks are handled by the usbhs core.
>>
>> Signed-off-by: Keshava Munegowda <keshava_mgowda@ti.com>
>
> ...
>> @@ -913,12 +598,15 @@ static int usbhs_enable(struct device *dev)
>>                               (pdata->ehci_data->reset_gpio_port[1], 1);
>>       }
>>
>> -end_count:
>> -     omap->count++;
>> +     pm_runtime_put_sync(dev);
>>       spin_unlock_irqrestore(&omap->lock, flags);
>
> Is pm_runtime_irq_safe() needed (else I think runtime PM callbacks may
> re-enable IRQs... or there's the new *_suspend runtime PM calls that
> may avoid this)?

 pm_runtime_irq_safe()  is not required; usbhs does not have a parent
and it is the parent driver of
ehci and ohci drivers.


>
> ...
>> @@ -266,10 +261,12 @@ static int ehci_hcd_omap_remove(struct platform_device *pdev)
>>       struct usb_hcd *hcd     = dev_get_drvdata(dev);
>>
>>       usb_remove_hcd(hcd);
>> -     omap_usbhs_disable(dev);
>>       disable_put_regulator(dev->platform_data);
>> -     iounmap(hcd->regs);
>>       usb_put_hcd(hcd);
>> +     iounmap(hcd->regs);

yes , I will do this.

>
>
> usb_put_hcd may release the hcd, needs to be after the deref for
> iounmap.
>
>> +     pm_runtime_put_sync(dev);
>> +     pm_runtime_disable(dev);
>
>
> Todd
>
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 2/5 v4] arm: omap: usb: ehci and ohci hwmod structures for omap3
  2011-08-12  5:46         ` Munegowda, Keshava
@ 2011-08-12  7:25           ` Ming Lei
  2011-08-12  8:12             ` Munegowda, Keshava
  0 siblings, 1 reply; 20+ messages in thread
From: Ming Lei @ 2011-08-12  7:25 UTC (permalink / raw)
  To: Munegowda, Keshava
  Cc: linux-usb, linux-omap, linux-kernel, balbi, gadiyar, sameo,
	parthab, tony, khilman, b-cousson, paul, johnstul, vishwanath.bs

On Fri, Aug 12, 2011 at 1:46 PM, Munegowda, Keshava
<keshava_mgowda@ti.com> wrote:
> On Thu, Aug 11, 2011 at 8:53 PM, Ming Lei <tom.leiming@gmail.com> wrote:

>>> +static struct omap_hwmod_class_sysconfig omap34xx_usb_host_hs_sysc = {
>>> +       .rev_offs       = 0x0000,
>>> +       .sysc_offs      = 0x0010,
>>> +       .syss_offs      = 0x0014,
>>> +       .sysc_flags     = (SYSC_HAS_MIDLEMODE | SYSC_HAS_SIDLEMODE),
>>
>> SYSC_HAS_ENAWAKEUP is missed or not needed?
>
> not needed. wakeup will through irq-chaining mechanism.

I am wondering how irq-chaining mechanism can wakeup MPU, could you
describe it in a little detail?

In fact, I have tested usb remote wakeup on rc1 plus your patches on beagle
xm, seems the usb mouse can't wakeup MPU at all.

>>
>>> +       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
>>> +                          MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
>>> +       .sysc_fields    = &omap_hwmod_sysc_type1,
>>> +};
>>> +
>>> +static struct omap_hwmod_class omap34xx_usb_host_hs_hwmod_class = {
>>> +       .name = "usbhs_uhh",
>>> +       .sysc = &omap34xx_usb_host_hs_sysc,
>>> +};
>>> +
>>> +static struct omap_hwmod_ocp_if *omap34xx_usb_host_hs_masters[] = {
>>> +       &omap34xx_usb_host_hs__l3_main_2,
>>> +};
>>> +
>>> +static struct omap_hwmod_addr_space omap34xx_usb_host_hs_addrs[] = {
>>> +       {
>>> +               .name           = "uhh",
>>> +               .pa_start       = 0x48064000,
>>> +               .pa_end         = 0x480643ff,
>>> +               .flags          = ADDR_TYPE_RT
>>> +       },
>>> +       {} /* Terminating Entry */
>>> +};
>>> +
>>> +static struct omap_hwmod_ocp_if omap34xx_l4_cfg__usb_host_hs = {
>>> +       .master         = &omap3xxx_l4_core_hwmod,
>>> +       .slave          = &omap34xx_usb_host_hs_hwmod,
>>> +       .clk            = "l4_ick",
>>> +       .addr           = omap34xx_usb_host_hs_addrs,
>>> +       .user           = OCP_USER_MPU | OCP_USER_SDMA,
>>> +};
>>
>> Even USBHOST_L4_ICLK is used only by USBHOST_SICLK, it is better to
>> define a "usbhost_siclk" clk for consistence with TRM.
>
> I dint understand, what is the change you are suggesting?

From 23.2.1 of OMAP35x TRM(Rev. M), USBHOST_SICLK inside
'High-speed USB Host controller' is driven by L4 slave interface
clock, so looks like l4 iclk should be parent of USBHOST_SICLK.

Considered  USBHOST_L4_ICLK is used only by USBHOST_SICLK,
you may ignore my question about it.

thanks,
-- 
Ming Lei

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 2/5 v4] arm: omap: usb: ehci and ohci hwmod structures for omap3
  2011-08-12  7:25           ` Ming Lei
@ 2011-08-12  8:12             ` Munegowda, Keshava
  0 siblings, 0 replies; 20+ messages in thread
From: Munegowda, Keshava @ 2011-08-12  8:12 UTC (permalink / raw)
  To: Ming Lei
  Cc: linux-usb, linux-omap, linux-kernel, balbi, gadiyar, sameo,
	parthab, tony, khilman, b-cousson, paul, johnstul, vishwanath.bs

On Fri, Aug 12, 2011 at 12:55 PM, Ming Lei <tom.leiming@gmail.com> wrote:
> On Fri, Aug 12, 2011 at 1:46 PM, Munegowda, Keshava
> <keshava_mgowda@ti.com> wrote:
>> On Thu, Aug 11, 2011 at 8:53 PM, Ming Lei <tom.leiming@gmail.com> wrote:
>
>>>> +static struct omap_hwmod_class_sysconfig omap34xx_usb_host_hs_sysc = {
>>>> +       .rev_offs       = 0x0000,
>>>> +       .sysc_offs      = 0x0010,
>>>> +       .syss_offs      = 0x0014,
>>>> +       .sysc_flags     = (SYSC_HAS_MIDLEMODE | SYSC_HAS_SIDLEMODE),
>>>
>>> SYSC_HAS_ENAWAKEUP is missed or not needed?
>>
>> not needed. wakeup will through irq-chaining mechanism.
>
> I am wondering how irq-chaining mechanism can wakeup MPU, could you
> describe it in a little detail?
>
> In fact, I have tested usb remote wakeup on rc1 plus your patches on beagle
> xm, seems the usb mouse can't wakeup MPU at all.
>
>>>
>>>> +       .idlemodes      = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
>>>> +                          MSTANDBY_FORCE | MSTANDBY_NO | MSTANDBY_SMART),
>>>> +       .sysc_fields    = &omap_hwmod_sysc_type1,
>>>> +};
>>>> +
>>>> +static struct omap_hwmod_class omap34xx_usb_host_hs_hwmod_class = {
>>>> +       .name = "usbhs_uhh",
>>>> +       .sysc = &omap34xx_usb_host_hs_sysc,
>>>> +};
>>>> +
>>>> +static struct omap_hwmod_ocp_if *omap34xx_usb_host_hs_masters[] = {
>>>> +       &omap34xx_usb_host_hs__l3_main_2,
>>>> +};
>>>> +
>>>> +static struct omap_hwmod_addr_space omap34xx_usb_host_hs_addrs[] = {
>>>> +       {
>>>> +               .name           = "uhh",
>>>> +               .pa_start       = 0x48064000,
>>>> +               .pa_end         = 0x480643ff,
>>>> +               .flags          = ADDR_TYPE_RT
>>>> +       },
>>>> +       {} /* Terminating Entry */
>>>> +};
>>>> +
>>>> +static struct omap_hwmod_ocp_if omap34xx_l4_cfg__usb_host_hs = {
>>>> +       .master         = &omap3xxx_l4_core_hwmod,
>>>> +       .slave          = &omap34xx_usb_host_hs_hwmod,
>>>> +       .clk            = "l4_ick",
>>>> +       .addr           = omap34xx_usb_host_hs_addrs,
>>>> +       .user           = OCP_USER_MPU | OCP_USER_SDMA,
>>>> +};
>>>
>>> Even USBHOST_L4_ICLK is used only by USBHOST_SICLK, it is better to
>>> define a "usbhost_siclk" clk for consistence with TRM.
>>
>> I dint understand, what is the change you are suggesting?
>
> From 23.2.1 of OMAP35x TRM(Rev. M), USBHOST_SICLK inside
> 'High-speed USB Host controller' is driven by L4 slave interface
> clock, so looks like l4 iclk should be parent of USBHOST_SICLK.
>
> Considered  USBHOST_L4_ICLK is used only by USBHOST_SICLK,
> you may ignore my question about it.
>
> thanks,
> --
> Ming Lei

Thanks Ming Lei

keshava
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 5/5 v4] mfd: omap: usb: Runtime PM support
  2011-08-12  6:50             ` Munegowda, Keshava
@ 2011-08-12 21:30               ` Todd Poynor
  2011-08-12 23:19                 ` Menon, Nishanth
                                   ` (2 more replies)
  0 siblings, 3 replies; 20+ messages in thread
From: Todd Poynor @ 2011-08-12 21:30 UTC (permalink / raw)
  To: Munegowda, Keshava
  Cc: linux-usb, linux-omap, linux-kernel, balbi, gadiyar, sameo,
	parthab, tony, khilman, b-cousson, paul, johnstul, vishwanath.bs,
	nm, vikram.pandita

On Fri, Aug 12, 2011 at 12:20:21PM +0530, Munegowda, Keshava wrote:
> On Wed, Aug 10, 2011 at 10:01 PM, Todd Poynor <toddpoynor@google.com> wrote:
> >> @@ -913,12 +598,15 @@ static int usbhs_enable(struct device *dev)
> >>                               (pdata->ehci_data->reset_gpio_port[1], 1);
> >>       }
> >>
> >> -end_count:
> >> -     omap->count++;
> >> +     pm_runtime_put_sync(dev);
> >>       spin_unlock_irqrestore(&omap->lock, flags);
> >
> > Is pm_runtime_irq_safe() needed (else I think runtime PM callbacks may
> > re-enable IRQs... or there's the new *_suspend runtime PM calls that
> > may avoid this)?
> 
>  pm_runtime_irq_safe()  is not required; usbhs does not have a parent
> and it is the parent driver of
> ehci and ohci drivers.

But the above expects IRQs to be disabled during the
pm_runtime_put_sync, and synchronous calls can turn IRQs back on in
rpm_idle:

        if (callback) {
                spin_unlock_irq(&dev->power.lock);

                callback(dev);

I see other folks who know this better than me are discussing USB run
time PM and might_sleep contexts, so I'll note this concern and let
others chime in if they think there's a real problem here.


Todd
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 5/5 v4] mfd: omap: usb: Runtime PM support
  2011-08-12 21:30               ` Todd Poynor
@ 2011-08-12 23:19                 ` Menon, Nishanth
  2011-08-17 10:26                 ` Munegowda, Keshava
       [not found]                 ` <20110812213037.GA24803-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
  2 siblings, 0 replies; 20+ messages in thread
From: Menon, Nishanth @ 2011-08-12 23:19 UTC (permalink / raw)
  To: Todd Poynor
  Cc: Munegowda, Keshava, linux-usb, linux-omap, linux-kernel, balbi,
	gadiyar, sameo, parthab, tony, khilman, b-cousson, paul, johnstul,
	vishwanath.bs, vikram.pandita

On Fri, Aug 12, 2011 at 16:30, Todd Poynor <toddpoynor@google.com> wrote:
> On Fri, Aug 12, 2011 at 12:20:21PM +0530, Munegowda, Keshava wrote:
>> On Wed, Aug 10, 2011 at 10:01 PM, Todd Poynor <toddpoynor@google.com> wrote:
>> >> @@ -913,12 +598,15 @@ static int usbhs_enable(struct device *dev)
>> >>                               (pdata->ehci_data->reset_gpio_port[1], 1);
>> >>       }
>> >>
>> >> -end_count:
>> >> -     omap->count++;
>> >> +     pm_runtime_put_sync(dev);
>> >>       spin_unlock_irqrestore(&omap->lock, flags);
>> >
>> > Is pm_runtime_irq_safe() needed (else I think runtime PM callbacks may
>> > re-enable IRQs... or there's the new *_suspend runtime PM calls that
>> > may avoid this)?
>>
>>  pm_runtime_irq_safe()  is not required; usbhs does not have a parent
>> and it is the parent driver of
>> ehci and ohci drivers.
>
> But the above expects IRQs to be disabled during the
> pm_runtime_put_sync, and synchronous calls can turn IRQs back on in
> rpm_idle:
>
>        if (callback) {
>                spin_unlock_irq(&dev->power.lock);
>
>                callback(dev);
>
> I see other folks who know this better than me are discussing USB run
> time PM and might_sleep contexts, so I'll note this concern and let
> others chime in if they think there's a real problem here.

It is rather easy with the following patch applied to pull this bug out!
https://patchwork.kernel.org/patch/1001572/

Regards,
Nishanth Menon
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 5/5 v4] mfd: omap: usb: Runtime PM support
  2011-08-12 21:30               ` Todd Poynor
  2011-08-12 23:19                 ` Menon, Nishanth
@ 2011-08-17 10:26                 ` Munegowda, Keshava
       [not found]                 ` <20110812213037.GA24803-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
  2 siblings, 0 replies; 20+ messages in thread
From: Munegowda, Keshava @ 2011-08-17 10:26 UTC (permalink / raw)
  To: Todd Poynor
  Cc: linux-usb, linux-omap, linux-kernel, balbi, gadiyar, sameo,
	parthab, tony, khilman, b-cousson, paul, johnstul, vishwanath.bs,
	nm, vikram.pandita

On Sat, Aug 13, 2011 at 3:00 AM, Todd Poynor <toddpoynor@google.com> wrote:
> On Fri, Aug 12, 2011 at 12:20:21PM +0530, Munegowda, Keshava wrote:
>> On Wed, Aug 10, 2011 at 10:01 PM, Todd Poynor <toddpoynor@google.com> wrote:
>> >> @@ -913,12 +598,15 @@ static int usbhs_enable(struct device *dev)
>> >>                               (pdata->ehci_data->reset_gpio_port[1], 1);
>> >>       }
>> >>
>> >> -end_count:
>> >> -     omap->count++;
>> >> +     pm_runtime_put_sync(dev);
>> >>       spin_unlock_irqrestore(&omap->lock, flags);
>> >
>> > Is pm_runtime_irq_safe() needed (else I think runtime PM callbacks may
>> > re-enable IRQs... or there's the new *_suspend runtime PM calls that
>> > may avoid this)?
>>
>>  pm_runtime_irq_safe()  is not required; usbhs does not have a parent
>> and it is the parent driver of
>> ehci and ohci drivers.
>
> But the above expects IRQs to be disabled during the
> pm_runtime_put_sync, and synchronous calls can turn IRQs back on in
> rpm_idle:
>
>        if (callback) {
>                spin_unlock_irq(&dev->power.lock);
>
>                callback(dev);
>
> I see other folks who know this better than me are discussing USB run
> time PM and might_sleep contexts, so I'll note this concern and let
> others chime in if they think there's a real problem here.

Thanks, I think I should protect the critical section of call backs here.

>
>
> Todd
>
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 5/5 v4] mfd: omap: usb: Runtime PM support
       [not found]                 ` <20110812213037.GA24803-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
@ 2011-08-29 18:36                   ` Kevin Hilman
  0 siblings, 0 replies; 20+ messages in thread
From: Kevin Hilman @ 2011-08-29 18:36 UTC (permalink / raw)
  To: Todd Poynor
  Cc: Munegowda, Keshava, linux-usb-u79uwXL29TY76Z2rM5mHXA,
	linux-omap-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA, balbi-l0cyMroinI0,
	gadiyar-l0cyMroinI0, sameo-VuQAYsv1563Yd54FQh9/CA,
	parthab-PpE0FKYn9XJWk0Htik3J/w, tony-4v6yS6AI5VpBDgjK7y7TUQ,
	b-cousson-l0cyMroinI0, paul-DWxLp4Yu+b8AvxtiuMwx3w,
	johnstul-r/Jw6+rmf7HQT0dZR+AlfA, vishwanath.bs-l0cyMroinI0,
	nm-l0cyMroinI0, vikram.pandita-l0cyMroinI0

Todd Poynor <toddpoynor-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org> writes:

> On Fri, Aug 12, 2011 at 12:20:21PM +0530, Munegowda, Keshava wrote:
>> On Wed, Aug 10, 2011 at 10:01 PM, Todd Poynor <toddpoynor-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org> wrote:
>> >> @@ -913,12 +598,15 @@ static int usbhs_enable(struct device *dev)
>> >>                               (pdata->ehci_data->reset_gpio_port[1], 1);
>> >>       }
>> >>
>> >> -end_count:
>> >> -     omap->count++;
>> >> +     pm_runtime_put_sync(dev);
>> >>       spin_unlock_irqrestore(&omap->lock, flags);
>> >
>> > Is pm_runtime_irq_safe() needed (else I think runtime PM callbacks may
>> > re-enable IRQs... or there's the new *_suspend runtime PM calls that
>> > may avoid this)?
>> 
>>  pm_runtime_irq_safe()  is not required; usbhs does not have a parent
>> and it is the parent driver of
>> ehci and ohci drivers.
>
> But the above expects IRQs to be disabled during the
> pm_runtime_put_sync, and synchronous calls can turn IRQs back on in
> rpm_idle:
>
>         if (callback) {
>                 spin_unlock_irq(&dev->power.lock);
>
>                 callback(dev);
>
> I see other folks who know this better than me are discussing USB run
> time PM and might_sleep contexts, so I'll note this concern and let
> others chime in if they think there's a real problem here.

FYI... The commit below fixes this mainline (merged as of v3.1-rc4).

Kevin


commit 02b26774afebb2d62695ba3230319d70d8c6cc2d
Author: Kevin Hilman <khilman-l0cyMroinI0@public.gmane.org>
Date:   Fri Aug 5 21:45:20 2011 +0200

    PM / Runtime: Allow _put_sync() from interrupts-disabled context
    
    Currently the use of pm_runtime_put_sync() is not safe from
    interrupts-disabled context because rpm_idle() will release the
    spinlock and enable interrupts for the idle callbacks.  This enables
    interrupts during a time where interrupts were expected to be
    disabled, and can have strange side effects on drivers that expected
    interrupts to be disabled.
    
    This is not a bug since the documentation clearly states that only
    _put_sync_suspend() is safe in IRQ-safe mode.
    
    However, pm_runtime_put_sync() could be made safe when in IRQ-safe
    mode by releasing the spinlock but not re-enabling interrupts, which
    is what this patch aims to do.
    
    Problem was found when using some buggy drivers that set
    pm_runtime_irq_safe() and used _put_sync() in interrupts-disabled
    context.
    
    Reported-by: Colin Cross <ccross-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
    Tested-by: Nishanth Menon <nm-l0cyMroinI0@public.gmane.org>
    Signed-off-by: Kevin Hilman <khilman-l0cyMroinI0@public.gmane.org>
    Signed-off-by: Rafael J. Wysocki <rjw-KKrjLPT3xs0@public.gmane.org>

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 5/5 v4] mfd: omap: usb: Runtime PM support
       [not found]           ` <1312899309-24067-6-git-send-email-keshava_mgowda-l0cyMroinI0@public.gmane.org>
@ 2011-08-29 18:50             ` Kevin Hilman
  2011-08-29 20:47               ` Kevin Hilman
  0 siblings, 1 reply; 20+ messages in thread
From: Kevin Hilman @ 2011-08-29 18:50 UTC (permalink / raw)
  To: Keshava Munegowda
  Cc: linux-usb-u79uwXL29TY76Z2rM5mHXA,
	linux-omap-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA, balbi-l0cyMroinI0,
	gadiyar-l0cyMroinI0, sameo-VuQAYsv1563Yd54FQh9/CA,
	parthab-PpE0FKYn9XJWk0Htik3J/w, tony-4v6yS6AI5VpBDgjK7y7TUQ,
	b-cousson-l0cyMroinI0, paul-DWxLp4Yu+b8AvxtiuMwx3w,
	johnstul-r/Jw6+rmf7HQT0dZR+AlfA, vishwanath.bs-l0cyMroinI0,
	Keshava Munegowda, Jassi Brar

Keshava Munegowda <keshava_mgowda-l0cyMroinI0@public.gmane.org> writes:

> From: Keshava Munegowda <Keshava_mgowda-l0cyMroinI0@public.gmane.org>
>
> The usbhs core driver does not enable/disable the intefrace and
> fucntional clocks; These clocks are handled by hwmod and runtime pm,
> hence insted of the clock enable/disable, the runtime pm APIS are
> used. however,the port clocks are handled by the usbhs core.
>
> Signed-off-by: Keshava Munegowda <keshava_mgowda-l0cyMroinI0@public.gmane.org>

General comment: all usage of pm_runtime_put_sync() can likely be
replaced by the asynchronous versions.  I don't currently see why the
synchronous verions are needed here.

Other than that, the runtime PM parts of this look OK to me.  After
changing to asynchonous puts, feel free to add:

Reviewed-by: Kevin Hilman <khilman-l0cyMroinI0@public.gmane.org>


Also, after a quick glance, it looks like this version of the series
addresses the problems seen by Jassi Brar with the TLL reset[1].  Please
confirm.

Speaking of which, it's helpful to Cc folks who have had comments on
previous versions of your series so they are sure they're previous
issues are addressed.   I've Cc'd Jassi Brar.

Thanks,

Kevin

[1] http://marc.info/?l=linux-omap&m=130921260703865&w=2

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 5/5 v4] mfd: omap: usb: Runtime PM support
  2011-08-29 18:50             ` Kevin Hilman
@ 2011-08-29 20:47               ` Kevin Hilman
       [not found]                 ` <8739gkrllg.fsf-l0cyMroinI0@public.gmane.org>
  0 siblings, 1 reply; 20+ messages in thread
From: Kevin Hilman @ 2011-08-29 20:47 UTC (permalink / raw)
  To: Keshava Munegowda
  Cc: linux-usb, linux-omap, linux-kernel, balbi, gadiyar, sameo,
	parthab, tony, b-cousson, paul, johnstul, vishwanath.bs,
	Jassi Brar

Kevin Hilman <khilman@ti.com> writes:

> Keshava Munegowda <keshava_mgowda@ti.com> writes:
>
>> From: Keshava Munegowda <Keshava_mgowda@ti.com>
>>
>> The usbhs core driver does not enable/disable the intefrace and
>> fucntional clocks; These clocks are handled by hwmod and runtime pm,
>> hence insted of the clock enable/disable, the runtime pm APIS are
>> used. however,the port clocks are handled by the usbhs core.
>>
>> Signed-off-by: Keshava Munegowda <keshava_mgowda@ti.com>
>
> General comment: all usage of pm_runtime_put_sync() can likely be
> replaced by the asynchronous versions.  I don't currently see why the
> synchronous verions are needed here.
>
> Other than that, the runtime PM parts of this look OK to me.  After
> changing to asynchonous puts, feel free to add:
>
> Reviewed-by: Kevin Hilman <khilman@ti.com>

oops, this should've been in response to your v8 version.

Kevin

>
> Also, after a quick glance, it looks like this version of the series
> addresses the problems seen by Jassi Brar with the TLL reset[1].  Please
> confirm.
>
> Speaking of which, it's helpful to Cc folks who have had comments on
> previous versions of your series so they are sure they're previous
> issues are addressed.   I've Cc'd Jassi Brar.
>
> Thanks,
>
> Kevin
>
> [1] http://marc.info/?l=linux-omap&m=130921260703865&w=2

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 5/5 v4] mfd: omap: usb: Runtime PM support
       [not found]                 ` <8739gkrllg.fsf-l0cyMroinI0@public.gmane.org>
@ 2011-08-30  6:17                   ` Munegowda, Keshava
  0 siblings, 0 replies; 20+ messages in thread
From: Munegowda, Keshava @ 2011-08-30  6:17 UTC (permalink / raw)
  To: Kevin Hilman, Samuel Ortiz, Balbi, Felipe
  Cc: linux-usb-u79uwXL29TY76Z2rM5mHXA,
	linux-omap-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA, gadiyar-l0cyMroinI0,
	parthab-PpE0FKYn9XJWk0Htik3J/w, tony-4v6yS6AI5VpBDgjK7y7TUQ,
	b-cousson-l0cyMroinI0, paul-DWxLp4Yu+b8AvxtiuMwx3w,
	johnstul-r/Jw6+rmf7HQT0dZR+AlfA, vishwanath.bs-l0cyMroinI0,
	Jassi Brar

On Tue, Aug 30, 2011 at 2:17 AM, Kevin Hilman <khilman-l0cyMroinI0@public.gmane.org> wrote:
> Kevin Hilman <khilman-l0cyMroinI0@public.gmane.org> writes:
>
>> Keshava Munegowda <keshava_mgowda-l0cyMroinI0@public.gmane.org> writes:
>>
>>> From: Keshava Munegowda <Keshava_mgowda-l0cyMroinI0@public.gmane.org>
>>>
>>> The usbhs core driver does not enable/disable the intefrace and
>>> fucntional clocks; These clocks are handled by hwmod and runtime pm,
>>> hence insted of the clock enable/disable, the runtime pm APIS are
>>> used. however,the port clocks are handled by the usbhs core.
>>>
>>> Signed-off-by: Keshava Munegowda <keshava_mgowda-l0cyMroinI0@public.gmane.org>
>>
>> General comment: all usage of pm_runtime_put_sync() can likely be
>> replaced by the asynchronous versions.  I don't currently see why the
>> synchronous verions are needed here.
>>
>> Other than that, the runtime PM parts of this look OK to me.  After
>> changing to asynchonous puts, feel free to add:
>>
>> Reviewed-by: Kevin Hilman <khilman-l0cyMroinI0@public.gmane.org>
>
> oops, this should've been in response to your v8 version.
>
> Kevin
>
>>
>> Also, after a quick glance, it looks like this version of the series
>> addresses the problems seen by Jassi Brar with the TLL reset[1].  Please
>> confirm.
>>
>> Speaking of which, it's helpful to Cc folks who have had comments on
>> previous versions of your series so they are sure they're previous
>> issues are addressed.   I've Cc'd Jassi Brar.
>>
>> Thanks,
>>
>> Kevin
>>
>> [1] http://marc.info/?l=linux-omap&m=130921260703865&w=2
>

Thanks for review;  yes, its reworks of complete runtime pm of usbhs as
suggested by Jassi Brar.

balbi, sameo
         this patch series available at

the branch kmg-usbhs-pm

of code repository : git://gitorious.org/~kmg/mirrors/kmg-usbhs-pm.git

Regards
Keshava
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2011-08-30  6:17 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-08-09 14:15 [PATCH 0/5 v4] mfd: omap: usb: Runtime PM support for EHCI and OHCI drivers Keshava Munegowda
2011-08-09 14:15 ` [PATCH 1/5 v4] arm: omap: usb: ehci and ohci hwmod structures for omap4 Keshava Munegowda
2011-08-09 14:15   ` [PATCH 2/5 v4] arm: omap: usb: ehci and ohci hwmod structures for omap3 Keshava Munegowda
2011-08-09 14:15     ` [PATCH 3/5 v4] arm: omap: usb: register hwmods of usbhs Keshava Munegowda
2011-08-09 14:15       ` [PATCH 4/5 v4] arm: omap: usb: device name change for the clk names " Keshava Munegowda
2011-08-09 14:15         ` [PATCH 5/5 v4] mfd: omap: usb: Runtime PM support Keshava Munegowda
2011-08-10 16:31           ` Todd Poynor
2011-08-12  6:50             ` Munegowda, Keshava
2011-08-12 21:30               ` Todd Poynor
2011-08-12 23:19                 ` Menon, Nishanth
2011-08-17 10:26                 ` Munegowda, Keshava
     [not found]                 ` <20110812213037.GA24803-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2011-08-29 18:36                   ` Kevin Hilman
2011-08-11 15:20           ` Ming Lei
     [not found]           ` <1312899309-24067-6-git-send-email-keshava_mgowda-l0cyMroinI0@public.gmane.org>
2011-08-29 18:50             ` Kevin Hilman
2011-08-29 20:47               ` Kevin Hilman
     [not found]                 ` <8739gkrllg.fsf-l0cyMroinI0@public.gmane.org>
2011-08-30  6:17                   ` Munegowda, Keshava
     [not found]     ` <1312899309-24067-3-git-send-email-keshava_mgowda-l0cyMroinI0@public.gmane.org>
2011-08-11 15:23       ` [PATCH 2/5 v4] arm: omap: usb: ehci and ohci hwmod structures for omap3 Ming Lei
2011-08-12  5:46         ` Munegowda, Keshava
2011-08-12  7:25           ` Ming Lei
2011-08-12  8:12             ` Munegowda, Keshava

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox