RE: [PATCH 0/2] omap_wdt: fix interface clock handling

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> -----Original Message-----
> From: ext Paul Walmsley [mailto:paul@xxxxxxxxx]
> Sent: 9. maaliskuuta 2011 1:02
> To: Jokiniemi Kalle (Nokia-MS/Tampere)
> Cc: Kevin Hilman; linux-omap@xxxxxxxxxxxxxxx; tony@xxxxxxxxxxx; b-
> cousson@xxxxxx; Koskinen Ilkka (Nokia-MS/Tampere); Charulatha
> Varadarajan; wim@xxxxxxxxx
> Subject: Re: [PATCH 0/2] omap_wdt: fix interface clock handling
> 
> Hi,
> 
> On Tue, 8 Mar 2011, Kevin Hilman wrote:
> 
> > Kalle Jokiniemi <kalle.jokiniemi@xxxxxxxxx> writes:
> >
> > > The runtime PM does not offer enough granularity to control
> > > individual clocks separately as needed. Current pm implementation of
> > > omap_wdt blocks the CORE power domain from idling in OMAP SoC, as it
> > > keeps the interface clock of the watchdog always on. This causes
> > > severe power leakage in devices where the omap watchdog is in active
> > > use.
> >
> > The iclk remains active because it's in hardware-controlled auto-idle
> > mode.
> 
> ... and we think that the interface clock never enters auto-idle because the
> WDT doesn't SIdleAck to the PRCM until the special sequence has been
> written to the WDT registers to disable it.  So even if its *CLKEN bits are set to
> zero, the WDT prevents the system from going idle.
> 
> > I believe if you set the WDT hwmod to software-supported idle
> > (OCPIF_SWSUP_IDLE), the runtime PM idle (which calls omap_device idle,
> > then omap_hwmod_idle) should also gate the interface clock.
> 
> Agreed.
> 
> Kalle, since you requested patches, here's one that implements Kevin's first
> suggestion.  I will reply to your second patch with its equivalent for PM
> runtime.  The patches have been compile-tested only.  Perhaps you could
> see if they solve your problem?

Thanks Paul, I'll try these out.

- Kalle

> 
> 
> regards,
> 
> - Paul
> 
> ---
>  arch/arm/mach-omap2/omap_hwmod_2420_data.c |    1 +
>  arch/arm/mach-omap2/omap_hwmod_2430_data.c |    1 +
>  arch/arm/mach-omap2/omap_hwmod_3xxx_data.c |    1 +
>  arch/arm/mach-omap2/omap_hwmod_44xx_data.c |    1 +
>  4 files changed, 4 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/arm/mach-omap2/omap_hwmod_2420_data.c
> b/arch/arm/mach-omap2/omap_hwmod_2420_data.c
> index 1611f74..df4950d 100644
> --- a/arch/arm/mach-omap2/omap_hwmod_2420_data.c
> +++ b/arch/arm/mach-omap2/omap_hwmod_2420_data.c
> @@ -974,6 +974,7 @@ static struct omap_hwmod_ocp_if
> omap2420_l4_wkup__wd_timer2 = {
>  	.clk		= "mpu_wdt_ick",
>  	.addr		= omap2420_wd_timer2_addrs,
>  	.addr_cnt	= ARRAY_SIZE(omap2420_wd_timer2_addrs),
> +	.flags		= OCPIF_SWSUP_IDLE,
>  	.user		= OCP_USER_MPU | OCP_USER_SDMA,
>  };
> 
> diff --git a/arch/arm/mach-omap2/omap_hwmod_2430_data.c
> b/arch/arm/mach-omap2/omap_hwmod_2430_data.c
> index 809424f..21fc908 100644
> --- a/arch/arm/mach-omap2/omap_hwmod_2430_data.c
> +++ b/arch/arm/mach-omap2/omap_hwmod_2430_data.c
> @@ -1074,6 +1074,7 @@ static struct omap_hwmod_ocp_if
> omap2430_l4_wkup__wd_timer2 = {
>  	.clk		= "mpu_wdt_ick",
>  	.addr		= omap2430_wd_timer2_addrs,
>  	.addr_cnt	= ARRAY_SIZE(omap2430_wd_timer2_addrs),
> +	.flags		= OCPIF_SWSUP_IDLE,
>  	.user		= OCP_USER_MPU | OCP_USER_SDMA,
>  };
> 
> diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
> b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
> index 457df3e..7ae2dab 100644
> --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
> +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
> @@ -1234,6 +1234,7 @@ static struct omap_hwmod_ocp_if
> omap3xxx_l4_wkup__wd_timer2 = {
>  	.clk		= "wdt2_ick",
>  	.addr		= omap3xxx_wd_timer2_addrs,
>  	.addr_cnt	= ARRAY_SIZE(omap3xxx_wd_timer2_addrs),
> +	.flags		= OCPIF_SWSUP_IDLE,
>  	.user		= OCP_USER_MPU | OCP_USER_SDMA,
>  };
> 
> diff --git a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
> b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
> index 7b72316..2038813 100644
> --- a/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
> +++ b/arch/arm/mach-omap2/omap_hwmod_44xx_data.c
> @@ -4901,6 +4901,7 @@ static struct omap_hwmod_ocp_if
> omap44xx_l4_wkup__wd_timer2 = {
>  	.clk		= "l4_wkup_clk_mux_ck",
>  	.addr		= omap44xx_wd_timer2_addrs,
>  	.addr_cnt	= ARRAY_SIZE(omap44xx_wd_timer2_addrs),
> +	.flags		= OCPIF_SWSUP_IDLE,
>  	.user		= OCP_USER_MPU | OCP_USER_SDMA,
>  };
> 
> --
> 1.7.2.3

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


[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux