Re: [PATCHv2 01/28] OMAP: change get_context_loss_count ret value to int
* Paul Walmsley [111006 15:37]: > On Thu, 9 Jun 2011, Tomi Valkeinen wrote: > > > get_context_loss_count functions return context loss count as u32, and > > zero means an error. However, zero is also returned when context has > > never been lost and could also be returned when the context loss count > > has wrapped and goes to zero. > > > > Change the functions to return an int, with negative value meaning an > > error. > > > > OMAP HSMMC code uses omap_pm_get_dev_context_loss_count(), but as the > > hsmmc code handles the returned value as an int, with negative value > > meaning an error, this patch actually fixes hsmmc code also. > > > > Signed-off-by: Tomi Valkeinen > > Acked-by: Kevin Hilman > > Acked-by: Paul Walmsley > Thanks, picking this into fixes-part2 branch as requested by Paul. Tony -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCHv2 01/28] OMAP: change get_context_loss_count ret value to int
On Thu, 9 Jun 2011, Tomi Valkeinen wrote: > get_context_loss_count functions return context loss count as u32, and > zero means an error. However, zero is also returned when context has > never been lost and could also be returned when the context loss count > has wrapped and goes to zero. > > Change the functions to return an int, with negative value meaning an > error. > > OMAP HSMMC code uses omap_pm_get_dev_context_loss_count(), but as the > hsmmc code handles the returned value as an int, with negative value > meaning an error, this patch actually fixes hsmmc code also. > > Signed-off-by: Tomi Valkeinen > Acked-by: Kevin Hilman Acked-by: Paul Walmsley > - Paul -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCHv2 01/28] OMAP: change get_context_loss_count ret value to int
On Thu, 9 Jun 2011, Tomi Valkeinen wrote: > get_context_loss_count functions return context loss count as u32, and > zero means an error. However, zero is also returned when context has > never been lost and could also be returned when the context loss count > has wrapped and goes to zero. > > Change the functions to return an int, with negative value meaning an > error. > > OMAP HSMMC code uses omap_pm_get_dev_context_loss_count(), but as the > hsmmc code handles the returned value as an int, with negative value > meaning an error, this patch actually fixes hsmmc code also. > > Signed-off-by: Tomi Valkeinen > Acked-by: Kevin Hilman Thanks, queued for 3.2 fixes. - Paul > --- > arch/arm/mach-omap2/omap_hwmod.c |2 +- > arch/arm/mach-omap2/powerdomain.c | 14 ++ > arch/arm/mach-omap2/powerdomain.h |2 +- > arch/arm/plat-omap/include/plat/omap-pm.h |4 ++-- > arch/arm/plat-omap/include/plat/omap_device.h |2 +- > arch/arm/plat-omap/include/plat/omap_hwmod.h |2 +- > arch/arm/plat-omap/omap-pm-noop.c | 24 +--- > arch/arm/plat-omap/omap_device.c |2 +- > 8 files changed, 34 insertions(+), 18 deletions(-) > > diff --git a/arch/arm/mach-omap2/omap_hwmod.c > b/arch/arm/mach-omap2/omap_hwmod.c > index e034294..4f0d554 100644 > --- a/arch/arm/mach-omap2/omap_hwmod.c > +++ b/arch/arm/mach-omap2/omap_hwmod.c > @@ -2332,7 +2332,7 @@ ohsps_unlock: > * Returns the context loss count of the powerdomain assocated with @oh > * upon success, or zero if no powerdomain exists for @oh. > */ > -u32 omap_hwmod_get_context_loss_count(struct omap_hwmod *oh) > +int omap_hwmod_get_context_loss_count(struct omap_hwmod *oh) > { > struct powerdomain *pwrdm; > int ret = 0; > diff --git a/arch/arm/mach-omap2/powerdomain.c > b/arch/arm/mach-omap2/powerdomain.c > index 9af0847..9d53a34 100644 > --- a/arch/arm/mach-omap2/powerdomain.c > +++ b/arch/arm/mach-omap2/powerdomain.c > @@ -935,16 +935,16 @@ int pwrdm_post_transition(void) > * @pwrdm: struct powerdomain * to wait for > * > * Context loss count is the sum of powerdomain off-mode counter, the > - * logic off counter and the per-bank memory off counter. Returns 0 > + * logic off counter and the per-bank memory off counter. Returns negative > * (and WARNs) upon error, otherwise, returns the context loss count. > */ > -u32 pwrdm_get_context_loss_count(struct powerdomain *pwrdm) > +int pwrdm_get_context_loss_count(struct powerdomain *pwrdm) > { > int i, count; > > if (!pwrdm) { > WARN(1, "powerdomain: %s: pwrdm is null\n", __func__); > - return 0; > + return -ENODEV; > } > > count = pwrdm->state_counter[PWRDM_POWER_OFF]; > @@ -953,7 +953,13 @@ u32 pwrdm_get_context_loss_count(struct powerdomain > *pwrdm) > for (i = 0; i < pwrdm->banks; i++) > count += pwrdm->ret_mem_off_counter[i]; > > - pr_debug("powerdomain: %s: context loss count = %u\n", > + /* > + * Context loss count has to be a non-negative value. Clear the sign > + * bit to get a value range from 0 to INT_MAX. > + */ > + count &= INT_MAX; > + > + pr_debug("powerdomain: %s: context loss count = %d\n", >pwrdm->name, count); > > return count; > diff --git a/arch/arm/mach-omap2/powerdomain.h > b/arch/arm/mach-omap2/powerdomain.h > index d23d979..012827f 100644 > --- a/arch/arm/mach-omap2/powerdomain.h > +++ b/arch/arm/mach-omap2/powerdomain.h > @@ -207,7 +207,7 @@ int pwrdm_clkdm_state_switch(struct clockdomain *clkdm); > int pwrdm_pre_transition(void); > int pwrdm_post_transition(void); > int pwrdm_set_lowpwrstchange(struct powerdomain *pwrdm); > -u32 pwrdm_get_context_loss_count(struct powerdomain *pwrdm); > +int pwrdm_get_context_loss_count(struct powerdomain *pwrdm); > bool pwrdm_can_ever_lose_context(struct powerdomain *pwrdm); > > extern void omap2xxx_powerdomains_init(void); > diff --git a/arch/arm/plat-omap/include/plat/omap-pm.h > b/arch/arm/plat-omap/include/plat/omap-pm.h > index c0a7520..68df031 100644 > --- a/arch/arm/plat-omap/include/plat/omap-pm.h > +++ b/arch/arm/plat-omap/include/plat/omap-pm.h > @@ -350,9 +350,9 @@ unsigned long omap_pm_cpu_get_freq(void); > * driver must restore device context. If the number of context losses > * exceeds the maximum positive integer, the function will wrap to 0 and > * continue counting. Returns the number of context losses for this device, > - * or zero upon error. > + * or negative value upon error. > */ > -u32 omap_pm_get_dev_context_loss_count(struct device *dev); > +int omap_pm_get_dev_context_loss_count(struct device *dev); > > void omap_pm_enable_off_mode(void); > void omap_pm_disable_off_mode(void); > diff --git a/arch/arm/plat-omap/include/plat/omap_device.h > b/arch/arm/plat-omap/include/plat/omap_device.h > index e4c349f..70d31d0 100644
Re: [PATCHv2 01/28] OMAP: change get_context_loss_count ret value to int
On 6/14/2011 7:24 PM, Rajendra Nayak wrote: On 6/14/2011 12:54 PM, Tomi Valkeinen wrote: On Tue, 2011-06-14 at 01:13 -0600, Paul Walmsley wrote: Hi Tomi On Mon, 13 Jun 2011, Tomi Valkeinen wrote: Paul, can you take this patch and queue it for an rc? Generally I only queue regressions or fixes for major problems (crashes, corruption, etc.) for -rc series. So probably this one should go in via the normal merge window, unless it's been causing major disruptions? No, only disruptions for me as the DSS pm_runtime patches depend on this one to function correctly. So merge window is ok, I'll handle the DSS side somehow. Hi Paul/Kevin, I had a query, not directly related to this patch, but to the way the omap_pm_get_dev_context_loss_count() api is implemented, which this patch is trying to fix in some ways. I see that the api relies on the pwrdm level state counters, which in-turn seem to be getting updated only in the cpuidle/suspend path. How are domains like DSS which can independently transition outside of the cpuidle path handled? Thinking some more on this, maybe I now understand how this worked on OMAP3. We always had the 'autodeps' on OMAP3 which made sure no clkdm idle's while MPU is not in standby, and hence all transitions would always happen between the pwrdm_pre_transition() and pwrdm_post_transition() (where the pwrdm level state counters get cleared/updated) callbacks. So there were really no domain transitions outside of this on OMAP3. My questions were popping out from the work I was trying to do to support this on OMAP4, and with no 'autodeps' on OMAP4 there will be transitions outside of cpuidle/suspend where counters need to be updated/cleared which at this point I have no clue how to handle :( I will start a separate discussion/thread on this since this is probably not the right place to discuss on how to do this on OMAP4. Thanks, Rajendra What I mean is, if DSS on disabling its clocks transitions to OFF state (it being an independent powerdomain) and tries to use this api to know if it lost context the next time it is re-enabling clocks and all this happens while there was no cpuidle being scheduled, where do the pwrdm level state counters get updated, which tell DSS it did lose context? On another note, i was wondering if it even made any sense to drivers like DSS, which have an independent power domain of its own on OMAP to try and do a restore-only-if-needed kind of an implementation. Would'nt it always lose context the moment it run-time idle's? regards, Rajendra Tomi -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCHv2 01/28] OMAP: change get_context_loss_count ret value to int
On 6/14/2011 12:54 PM, Tomi Valkeinen wrote: On Tue, 2011-06-14 at 01:13 -0600, Paul Walmsley wrote: Hi Tomi On Mon, 13 Jun 2011, Tomi Valkeinen wrote: Paul, can you take this patch and queue it for an rc? Generally I only queue regressions or fixes for major problems (crashes, corruption, etc.) for -rc series. So probably this one should go in via the normal merge window, unless it's been causing major disruptions? No, only disruptions for me as the DSS pm_runtime patches depend on this one to function correctly. So merge window is ok, I'll handle the DSS side somehow. Hi Paul/Kevin, I had a query, not directly related to this patch, but to the way the omap_pm_get_dev_context_loss_count() api is implemented, which this patch is trying to fix in some ways. I see that the api relies on the pwrdm level state counters, which in-turn seem to be getting updated only in the cpuidle/suspend path. How are domains like DSS which can independently transition outside of the cpuidle path handled? What I mean is, if DSS on disabling its clocks transitions to OFF state (it being an independent powerdomain) and tries to use this api to know if it lost context the next time it is re-enabling clocks and all this happens while there was no cpuidle being scheduled, where do the pwrdm level state counters get updated, which tell DSS it did lose context? On another note, i was wondering if it even made any sense to drivers like DSS, which have an independent power domain of its own on OMAP to try and do a restore-only-if-needed kind of an implementation. Would'nt it always lose context the moment it run-time idle's? regards, Rajendra Tomi -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCHv2 01/28] OMAP: change get_context_loss_count ret value to int
On Tue, 2011-06-14 at 01:13 -0600, Paul Walmsley wrote: > Hi Tomi > > On Mon, 13 Jun 2011, Tomi Valkeinen wrote: > > > Paul, can you take this patch and queue it for an rc? > > Generally I only queue regressions or fixes for major problems (crashes, > corruption, etc.) for -rc series. So probably this one should go in via > the normal merge window, unless it's been causing major disruptions? No, only disruptions for me as the DSS pm_runtime patches depend on this one to function correctly. So merge window is ok, I'll handle the DSS side somehow. Tomi -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCHv2 01/28] OMAP: change get_context_loss_count ret value to int
Hi Tomi On Mon, 13 Jun 2011, Tomi Valkeinen wrote: > Paul, can you take this patch and queue it for an rc? Generally I only queue regressions or fixes for major problems (crashes, corruption, etc.) for -rc series. So probably this one should go in via the normal merge window, unless it's been causing major disruptions? - Paul -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCHv2 01/28] OMAP: change get_context_loss_count ret value to int
On Mon, 2011-06-13 at 11:37 -0500, Ghongdemath, Girish wrote: > Tomi, > Couple of queries, > > On Mon, Jun 13, 2011 at 4:51 AM, Tomi Valkeinen wrote: > > Paul, can you take this patch and queue it for an rc? > > > > Tomi > > > > On Thu, 2011-06-09 at 16:56 +0300, Tomi Valkeinen wrote: > >> get_context_loss_count functions return context loss count as u32, and > >> zero means an error. However, zero is also returned when context has > >> never been lost and could also be returned when the context loss count > >> has wrapped and goes to zero. > >> > >> Change the functions to return an int, with negative value meaning an > >> error. > >> > > >> + if (off_mode_enabled) { > > - why have a check for off_mode_enabled? As this only detects valid > next state for MPU/CORE. Other pwrdm can still > hit OFF. It does what the code did previously, without changing the logic. And this doesn't detect anything, it's just an dummy emulation for context loss to test the drivers. > >> + count++; > >> + /* > >> + * Context loss count has to be a non-negative value. > >> + * Clear the sign bit to get a value range from 0 to > >> + * INT_MAX. > >> + */ > >> + count &= INT_MAX; > >> + dummy_context_loss_counter = count; > >> + } > >> } > > - Why not use u32 instead? So that we can return error values. That was the whole point of this patch. Tomi -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCHv2 01/28] OMAP: change get_context_loss_count ret value to int
Tomi, Couple of queries, On Mon, Jun 13, 2011 at 4:51 AM, Tomi Valkeinen wrote: > Paul, can you take this patch and queue it for an rc? > > Tomi > > On Thu, 2011-06-09 at 16:56 +0300, Tomi Valkeinen wrote: >> get_context_loss_count functions return context loss count as u32, and >> zero means an error. However, zero is also returned when context has >> never been lost and could also be returned when the context loss count >> has wrapped and goes to zero. >> >> Change the functions to return an int, with negative value meaning an >> error. >> >> + if (off_mode_enabled) { - why have a check for off_mode_enabled? As this only detects valid next state for MPU/CORE. Other pwrdm can still hit OFF. >> + count++; >> + /* >> + * Context loss count has to be a non-negative value. >> + * Clear the sign bit to get a value range from 0 to >> + * INT_MAX. >> + */ >> + count &= INT_MAX; >> + dummy_context_loss_counter = count; >> + } >> } - Why not use u32 instead? Regards, Girish >> >> pr_debug("OMAP PM: context loss count for dev %s = %d\n", >> @@ -337,7 +347,7 @@ u32 omap_pm_get_dev_context_loss_count(struct device >> *dev) >> >> #else >> >> -u32 omap_pm_get_dev_context_loss_count(struct device *dev) >> +int omap_pm_get_dev_context_loss_count(struct device *dev) >> { >> return dummy_context_loss_counter; >> } >> diff --git a/arch/arm/plat-omap/omap_device.c >> b/arch/arm/plat-omap/omap_device.c >> index 9bbda9a..9753f71 100644 >> --- a/arch/arm/plat-omap/omap_device.c >> +++ b/arch/arm/plat-omap/omap_device.c >> @@ -310,7 +310,7 @@ static void _add_optional_clock_clkdev(struct >> omap_device *od, >> * return the context loss counter for that hwmod, otherwise return >> * zero. >> */ >> -u32 omap_device_get_context_loss_count(struct platform_device *pdev) >> +int omap_device_get_context_loss_count(struct platform_device *pdev) >> { >> struct omap_device *od; >> u32 ret = 0; > > > -- > To unsubscribe from this list: send the line "unsubscribe linux-omap" in > the body of a message to majord...@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCHv2 01/28] OMAP: change get_context_loss_count ret value to int
Paul, can you take this patch and queue it for an rc? Tomi On Thu, 2011-06-09 at 16:56 +0300, Tomi Valkeinen wrote: > get_context_loss_count functions return context loss count as u32, and > zero means an error. However, zero is also returned when context has > never been lost and could also be returned when the context loss count > has wrapped and goes to zero. > > Change the functions to return an int, with negative value meaning an > error. > > OMAP HSMMC code uses omap_pm_get_dev_context_loss_count(), but as the > hsmmc code handles the returned value as an int, with negative value > meaning an error, this patch actually fixes hsmmc code also. > > Signed-off-by: Tomi Valkeinen > Acked-by: Kevin Hilman > --- > arch/arm/mach-omap2/omap_hwmod.c |2 +- > arch/arm/mach-omap2/powerdomain.c | 14 ++ > arch/arm/mach-omap2/powerdomain.h |2 +- > arch/arm/plat-omap/include/plat/omap-pm.h |4 ++-- > arch/arm/plat-omap/include/plat/omap_device.h |2 +- > arch/arm/plat-omap/include/plat/omap_hwmod.h |2 +- > arch/arm/plat-omap/omap-pm-noop.c | 24 +--- > arch/arm/plat-omap/omap_device.c |2 +- > 8 files changed, 34 insertions(+), 18 deletions(-) > > diff --git a/arch/arm/mach-omap2/omap_hwmod.c > b/arch/arm/mach-omap2/omap_hwmod.c > index e034294..4f0d554 100644 > --- a/arch/arm/mach-omap2/omap_hwmod.c > +++ b/arch/arm/mach-omap2/omap_hwmod.c > @@ -2332,7 +2332,7 @@ ohsps_unlock: > * Returns the context loss count of the powerdomain assocated with @oh > * upon success, or zero if no powerdomain exists for @oh. > */ > -u32 omap_hwmod_get_context_loss_count(struct omap_hwmod *oh) > +int omap_hwmod_get_context_loss_count(struct omap_hwmod *oh) > { > struct powerdomain *pwrdm; > int ret = 0; > diff --git a/arch/arm/mach-omap2/powerdomain.c > b/arch/arm/mach-omap2/powerdomain.c > index 9af0847..9d53a34 100644 > --- a/arch/arm/mach-omap2/powerdomain.c > +++ b/arch/arm/mach-omap2/powerdomain.c > @@ -935,16 +935,16 @@ int pwrdm_post_transition(void) > * @pwrdm: struct powerdomain * to wait for > * > * Context loss count is the sum of powerdomain off-mode counter, the > - * logic off counter and the per-bank memory off counter. Returns 0 > + * logic off counter and the per-bank memory off counter. Returns negative > * (and WARNs) upon error, otherwise, returns the context loss count. > */ > -u32 pwrdm_get_context_loss_count(struct powerdomain *pwrdm) > +int pwrdm_get_context_loss_count(struct powerdomain *pwrdm) > { > int i, count; > > if (!pwrdm) { > WARN(1, "powerdomain: %s: pwrdm is null\n", __func__); > - return 0; > + return -ENODEV; > } > > count = pwrdm->state_counter[PWRDM_POWER_OFF]; > @@ -953,7 +953,13 @@ u32 pwrdm_get_context_loss_count(struct powerdomain > *pwrdm) > for (i = 0; i < pwrdm->banks; i++) > count += pwrdm->ret_mem_off_counter[i]; > > - pr_debug("powerdomain: %s: context loss count = %u\n", > + /* > + * Context loss count has to be a non-negative value. Clear the sign > + * bit to get a value range from 0 to INT_MAX. > + */ > + count &= INT_MAX; > + > + pr_debug("powerdomain: %s: context loss count = %d\n", >pwrdm->name, count); > > return count; > diff --git a/arch/arm/mach-omap2/powerdomain.h > b/arch/arm/mach-omap2/powerdomain.h > index d23d979..012827f 100644 > --- a/arch/arm/mach-omap2/powerdomain.h > +++ b/arch/arm/mach-omap2/powerdomain.h > @@ -207,7 +207,7 @@ int pwrdm_clkdm_state_switch(struct clockdomain *clkdm); > int pwrdm_pre_transition(void); > int pwrdm_post_transition(void); > int pwrdm_set_lowpwrstchange(struct powerdomain *pwrdm); > -u32 pwrdm_get_context_loss_count(struct powerdomain *pwrdm); > +int pwrdm_get_context_loss_count(struct powerdomain *pwrdm); > bool pwrdm_can_ever_lose_context(struct powerdomain *pwrdm); > > extern void omap2xxx_powerdomains_init(void); > diff --git a/arch/arm/plat-omap/include/plat/omap-pm.h > b/arch/arm/plat-omap/include/plat/omap-pm.h > index c0a7520..68df031 100644 > --- a/arch/arm/plat-omap/include/plat/omap-pm.h > +++ b/arch/arm/plat-omap/include/plat/omap-pm.h > @@ -350,9 +350,9 @@ unsigned long omap_pm_cpu_get_freq(void); > * driver must restore device context. If the number of context losses > * exceeds the maximum positive integer, the function will wrap to 0 and > * continue counting. Returns the number of context losses for this device, > - * or zero upon error. > + * or negative value upon error. > */ > -u32 omap_pm_get_dev_context_loss_count(struct device *dev); > +int omap_pm_get_dev_context_loss_count(struct device *dev); > > void omap_pm_enable_off_mode(void); > void omap_pm_disable_off_mode(void); > diff --git a/arch/arm/plat-omap/include/plat/omap_device.h > b/arch/arm/plat-omap/include/plat/omap_devi
[PATCHv2 01/28] OMAP: change get_context_loss_count ret value to int
get_context_loss_count functions return context loss count as u32, and zero means an error. However, zero is also returned when context has never been lost and could also be returned when the context loss count has wrapped and goes to zero. Change the functions to return an int, with negative value meaning an error. OMAP HSMMC code uses omap_pm_get_dev_context_loss_count(), but as the hsmmc code handles the returned value as an int, with negative value meaning an error, this patch actually fixes hsmmc code also. Signed-off-by: Tomi Valkeinen Acked-by: Kevin Hilman --- arch/arm/mach-omap2/omap_hwmod.c |2 +- arch/arm/mach-omap2/powerdomain.c | 14 ++ arch/arm/mach-omap2/powerdomain.h |2 +- arch/arm/plat-omap/include/plat/omap-pm.h |4 ++-- arch/arm/plat-omap/include/plat/omap_device.h |2 +- arch/arm/plat-omap/include/plat/omap_hwmod.h |2 +- arch/arm/plat-omap/omap-pm-noop.c | 24 +--- arch/arm/plat-omap/omap_device.c |2 +- 8 files changed, 34 insertions(+), 18 deletions(-) diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c index e034294..4f0d554 100644 --- a/arch/arm/mach-omap2/omap_hwmod.c +++ b/arch/arm/mach-omap2/omap_hwmod.c @@ -2332,7 +2332,7 @@ ohsps_unlock: * Returns the context loss count of the powerdomain assocated with @oh * upon success, or zero if no powerdomain exists for @oh. */ -u32 omap_hwmod_get_context_loss_count(struct omap_hwmod *oh) +int omap_hwmod_get_context_loss_count(struct omap_hwmod *oh) { struct powerdomain *pwrdm; int ret = 0; diff --git a/arch/arm/mach-omap2/powerdomain.c b/arch/arm/mach-omap2/powerdomain.c index 9af0847..9d53a34 100644 --- a/arch/arm/mach-omap2/powerdomain.c +++ b/arch/arm/mach-omap2/powerdomain.c @@ -935,16 +935,16 @@ int pwrdm_post_transition(void) * @pwrdm: struct powerdomain * to wait for * * Context loss count is the sum of powerdomain off-mode counter, the - * logic off counter and the per-bank memory off counter. Returns 0 + * logic off counter and the per-bank memory off counter. Returns negative * (and WARNs) upon error, otherwise, returns the context loss count. */ -u32 pwrdm_get_context_loss_count(struct powerdomain *pwrdm) +int pwrdm_get_context_loss_count(struct powerdomain *pwrdm) { int i, count; if (!pwrdm) { WARN(1, "powerdomain: %s: pwrdm is null\n", __func__); - return 0; + return -ENODEV; } count = pwrdm->state_counter[PWRDM_POWER_OFF]; @@ -953,7 +953,13 @@ u32 pwrdm_get_context_loss_count(struct powerdomain *pwrdm) for (i = 0; i < pwrdm->banks; i++) count += pwrdm->ret_mem_off_counter[i]; - pr_debug("powerdomain: %s: context loss count = %u\n", + /* +* Context loss count has to be a non-negative value. Clear the sign +* bit to get a value range from 0 to INT_MAX. +*/ + count &= INT_MAX; + + pr_debug("powerdomain: %s: context loss count = %d\n", pwrdm->name, count); return count; diff --git a/arch/arm/mach-omap2/powerdomain.h b/arch/arm/mach-omap2/powerdomain.h index d23d979..012827f 100644 --- a/arch/arm/mach-omap2/powerdomain.h +++ b/arch/arm/mach-omap2/powerdomain.h @@ -207,7 +207,7 @@ int pwrdm_clkdm_state_switch(struct clockdomain *clkdm); int pwrdm_pre_transition(void); int pwrdm_post_transition(void); int pwrdm_set_lowpwrstchange(struct powerdomain *pwrdm); -u32 pwrdm_get_context_loss_count(struct powerdomain *pwrdm); +int pwrdm_get_context_loss_count(struct powerdomain *pwrdm); bool pwrdm_can_ever_lose_context(struct powerdomain *pwrdm); extern void omap2xxx_powerdomains_init(void); diff --git a/arch/arm/plat-omap/include/plat/omap-pm.h b/arch/arm/plat-omap/include/plat/omap-pm.h index c0a7520..68df031 100644 --- a/arch/arm/plat-omap/include/plat/omap-pm.h +++ b/arch/arm/plat-omap/include/plat/omap-pm.h @@ -350,9 +350,9 @@ unsigned long omap_pm_cpu_get_freq(void); * driver must restore device context. If the number of context losses * exceeds the maximum positive integer, the function will wrap to 0 and * continue counting. Returns the number of context losses for this device, - * or zero upon error. + * or negative value upon error. */ -u32 omap_pm_get_dev_context_loss_count(struct device *dev); +int omap_pm_get_dev_context_loss_count(struct device *dev); void omap_pm_enable_off_mode(void); void omap_pm_disable_off_mode(void); diff --git a/arch/arm/plat-omap/include/plat/omap_device.h b/arch/arm/plat-omap/include/plat/omap_device.h index e4c349f..70d31d0 100644 --- a/arch/arm/plat-omap/include/plat/omap_device.h +++ b/arch/arm/plat-omap/include/plat/omap_device.h @@ -107,7 +107,7 @@ void __iomem *omap_device_get_rt_va(struct omap_device *od); int omap_device_align_pm_lat(struct platform_device *pdev,