Message ID | 1307627810-3768-2-git-send-email-tomi.valkeinen@ti.com (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
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 <tomi.valkeinen@ti.com> > Acked-by: Kevin Hilman <khilman@ti.com> > --- > 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, > u32 new_wakeup_lat_limit); > struct powerdomain *omap_device_get_pwrdm(struct omap_device *od); > -u32 omap_device_get_context_loss_count(struct platform_device *pdev); > +int omap_device_get_context_loss_count(struct platform_device *pdev); > > /* Other */ > > diff --git a/arch/arm/plat-omap/include/plat/omap_hwmod.h b/arch/arm/plat-omap/include/plat/omap_hwmod.h > index 1adea9c..8658e2d 100644 > --- a/arch/arm/plat-omap/include/plat/omap_hwmod.h > +++ b/arch/arm/plat-omap/include/plat/omap_hwmod.h > @@ -598,7 +598,7 @@ int omap_hwmod_for_each_by_class(const char *classname, > void *user); > > int omap_hwmod_set_postsetup_state(struct omap_hwmod *oh, u8 state); > -u32 omap_hwmod_get_context_loss_count(struct omap_hwmod *oh); > +int omap_hwmod_get_context_loss_count(struct omap_hwmod *oh); > > int omap_hwmod_no_setup_reset(struct omap_hwmod *oh); > > diff --git a/arch/arm/plat-omap/omap-pm-noop.c b/arch/arm/plat-omap/omap-pm-noop.c > index b0471bb2..3dc3801 100644 > --- a/arch/arm/plat-omap/omap-pm-noop.c > +++ b/arch/arm/plat-omap/omap-pm-noop.c > @@ -27,7 +27,7 @@ > #include <plat/omap_device.h> > > static bool off_mode_enabled; > -static u32 dummy_context_loss_counter; > +static int dummy_context_loss_counter; > > /* > * Device-driver-originated constraints (via board-*.c files) > @@ -311,22 +311,32 @@ void omap_pm_disable_off_mode(void) > > #ifdef CONFIG_ARCH_OMAP2PLUS > > -u32 omap_pm_get_dev_context_loss_count(struct device *dev) > +int omap_pm_get_dev_context_loss_count(struct device *dev) > { > struct platform_device *pdev = to_platform_device(dev); > - u32 count; > + int count; > > if (WARN_ON(!dev)) > - return 0; > + return -ENODEV; > > if (dev->parent == &omap_device_parent) { > count = omap_device_get_context_loss_count(pdev); > } else { > WARN_ONCE(off_mode_enabled, "omap_pm: using dummy context loss counter; device %s should be converted to omap_device", > dev_name(dev)); > - if (off_mode_enabled) > - dummy_context_loss_counter++; > + > count = dummy_context_loss_counter; > + > + if (off_mode_enabled) { > + 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; > + } > } > > 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-fbdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Tomi, Couple of queries, On Mon, Jun 13, 2011 at 4:51 AM, Tomi Valkeinen <tomi.valkeinen@ti.com> 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 majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
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 <tomi.valkeinen@ti.com> 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-fbdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
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-fbdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
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-fbdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
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 majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
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 majordomo@vger.kernel.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
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 <tomi.valkeinen@ti.com> > Acked-by: Kevin Hilman <khilman@ti.com> 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 > --- 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, > u32 new_wakeup_lat_limit); > struct powerdomain *omap_device_get_pwrdm(struct omap_device *od); > -u32 omap_device_get_context_loss_count(struct platform_device *pdev); > +int omap_device_get_context_loss_count(struct platform_device *pdev); > > /* Other */ > > diff --git a/arch/arm/plat-omap/include/plat/omap_hwmod.h b/arch/arm/plat-omap/include/plat/omap_hwmod.h > index 1adea9c..8658e2d 100644 > --- a/arch/arm/plat-omap/include/plat/omap_hwmod.h > +++ b/arch/arm/plat-omap/include/plat/omap_hwmod.h > @@ -598,7 +598,7 @@ int omap_hwmod_for_each_by_class(const char *classname, > void *user); > > int omap_hwmod_set_postsetup_state(struct omap_hwmod *oh, u8 state); > -u32 omap_hwmod_get_context_loss_count(struct omap_hwmod *oh); > +int omap_hwmod_get_context_loss_count(struct omap_hwmod *oh); > > int omap_hwmod_no_setup_reset(struct omap_hwmod *oh); > > diff --git a/arch/arm/plat-omap/omap-pm-noop.c b/arch/arm/plat-omap/omap-pm-noop.c > index b0471bb2..3dc3801 100644 > --- a/arch/arm/plat-omap/omap-pm-noop.c > +++ b/arch/arm/plat-omap/omap-pm-noop.c > @@ -27,7 +27,7 @@ > #include <plat/omap_device.h> > > static bool off_mode_enabled; > -static u32 dummy_context_loss_counter; > +static int dummy_context_loss_counter; > > /* > * Device-driver-originated constraints (via board-*.c files) > @@ -311,22 +311,32 @@ void omap_pm_disable_off_mode(void) > > #ifdef CONFIG_ARCH_OMAP2PLUS > > -u32 omap_pm_get_dev_context_loss_count(struct device *dev) > +int omap_pm_get_dev_context_loss_count(struct device *dev) > { > struct platform_device *pdev = to_platform_device(dev); > - u32 count; > + int count; > > if (WARN_ON(!dev)) > - return 0; > + return -ENODEV; > > if (dev->parent == &omap_device_parent) { > count = omap_device_get_context_loss_count(pdev); > } else { > WARN_ONCE(off_mode_enabled, "omap_pm: using dummy context loss counter; device %s should be converted to omap_device", > dev_name(dev)); > - if (off_mode_enabled) > - dummy_context_loss_counter++; > + > count = dummy_context_loss_counter; > + > + if (off_mode_enabled) { > + 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; > + } > } > > 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; > -- > 1.7.4.1 > - Paul -- To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
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, u32 new_wakeup_lat_limit); struct powerdomain *omap_device_get_pwrdm(struct omap_device *od); -u32 omap_device_get_context_loss_count(struct platform_device *pdev); +int omap_device_get_context_loss_count(struct platform_device *pdev); /* Other */ diff --git a/arch/arm/plat-omap/include/plat/omap_hwmod.h b/arch/arm/plat-omap/include/plat/omap_hwmod.h index 1adea9c..8658e2d 100644 --- a/arch/arm/plat-omap/include/plat/omap_hwmod.h +++ b/arch/arm/plat-omap/include/plat/omap_hwmod.h @@ -598,7 +598,7 @@ int omap_hwmod_for_each_by_class(const char *classname, void *user); int omap_hwmod_set_postsetup_state(struct omap_hwmod *oh, u8 state); -u32 omap_hwmod_get_context_loss_count(struct omap_hwmod *oh); +int omap_hwmod_get_context_loss_count(struct omap_hwmod *oh); int omap_hwmod_no_setup_reset(struct omap_hwmod *oh); diff --git a/arch/arm/plat-omap/omap-pm-noop.c b/arch/arm/plat-omap/omap-pm-noop.c index b0471bb2..3dc3801 100644 --- a/arch/arm/plat-omap/omap-pm-noop.c +++ b/arch/arm/plat-omap/omap-pm-noop.c @@ -27,7 +27,7 @@ #include <plat/omap_device.h> static bool off_mode_enabled; -static u32 dummy_context_loss_counter; +static int dummy_context_loss_counter; /* * Device-driver-originated constraints (via board-*.c files) @@ -311,22 +311,32 @@ void omap_pm_disable_off_mode(void) #ifdef CONFIG_ARCH_OMAP2PLUS -u32 omap_pm_get_dev_context_loss_count(struct device *dev) +int omap_pm_get_dev_context_loss_count(struct device *dev) { struct platform_device *pdev = to_platform_device(dev); - u32 count; + int count; if (WARN_ON(!dev)) - return 0; + return -ENODEV; if (dev->parent == &omap_device_parent) { count = omap_device_get_context_loss_count(pdev); } else { WARN_ONCE(off_mode_enabled, "omap_pm: using dummy context loss counter; device %s should be converted to omap_device", dev_name(dev)); - if (off_mode_enabled) - dummy_context_loss_counter++; + count = dummy_context_loss_counter; + + if (off_mode_enabled) { + 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; + } } 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;