From: Kevin Hilman <khilman@ti.com>
To: Nishanth Menon <nm@ti.com>
Cc: Tony Lindgren <tony@atomide.com>,
linux-omap@vger.kernel.org, linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH 3/3] ARM: OMAP3+: PM: VP: check only the VPINIDLE status bit
Date: Thu, 31 May 2012 16:27:28 -0700 [thread overview]
Message-ID: <87k3zsvsm7.fsf@ti.com> (raw)
In-Reply-To: <1337369601-14915-4-git-send-email-nm@ti.com> (Nishanth Menon's message of "Fri, 18 May 2012 14:33:21 -0500")
Nishanth Menon <nm@ti.com> writes:
> Currently we check against the entire 32 bits of the status register
> Where, bits 1-31 are marked as reserved and mentioned in TRM as read
> returns undefined values.
ouch
> Hence, check against purely the vpinidle status bit.
>
> Cc: Tony Lindgren <tony@atomide.com>
> Cc: Kevin Hilman <khilman@ti.com>
> Cc: linux-omap@vger.kernel.org
> Cc: linux-arm-kernel@lists.infradead.org
>
> Reported-by: Vinay Amancha <vinaykumar@ti.com>
> Signed-off-by: Nishanth Menon <nm@ti.com>
Thanks for the fix.
Looking at this combined with the previous patches, since this same
thing is done several places, it looks like we need a helper function
'omap_vp_wait_for_idle()' or similar. That function will do the check,
wait for timeout, and return an error if failure. The callers can than
do appropriate error handling upon failure.
Thanks,
Kevin
> ---
> arch/arm/mach-omap2/vp.c | 15 +++++++++------
> arch/arm/mach-omap2/vp.h | 1 +
> arch/arm/mach-omap2/vp3xxx_data.c | 1 +
> arch/arm/mach-omap2/vp44xx_data.c | 1 +
> 4 files changed, 12 insertions(+), 6 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/vp.c b/arch/arm/mach-omap2/vp.c
> index 985091b..cdcac16 100644
> --- a/arch/arm/mach-omap2/vp.c
> +++ b/arch/arm/mach-omap2/vp.c
> @@ -128,8 +128,9 @@ int omap_vp_forceupdate_scale(struct voltagedomain *voltdm,
> * This is an additional allowance to ensure we are in proper state
> * to enter into forceupdate state transition.
> */
> - omap_test_timeout((voltdm->read(vp->vstatus)),
> - VP_IDLE_TIMEOUT, timeout);
> + omap_test_timeout((voltdm->read(vp->vstatus) &
> + vp->common->vstatus_vpidle), VP_IDLE_TIMEOUT,
> + timeout);
>
> if (timeout >= VP_IDLE_TIMEOUT)
> pr_warning("%s: vdd_%s idle timedout forceupdate(v=%ld)\n",
> @@ -278,8 +279,9 @@ void omap_vp_disable(struct voltagedomain *voltdm)
> * Wait for VP idle Typical latency is <2us. Maximum latency is ~100us
> * Depending on if we catch VP in the middle of an SR operation.
> */
> - omap_test_timeout((voltdm->read(vp->vstatus)),
> - VP_IDLE_TIMEOUT, timeout);
> + omap_test_timeout((voltdm->read(vp->vstatus) &
> + vp->common->vstatus_vpidle), VP_IDLE_TIMEOUT,
> + timeout);
>
> if (timeout >= VP_IDLE_TIMEOUT)
> pr_warning("%s: vdd_%s idle timedout before disable\n",
> @@ -293,8 +295,9 @@ void omap_vp_disable(struct voltagedomain *voltdm)
> /*
> * Wait for VP idle Typical latency is <2us. Maximum latency is ~100us
> */
> - omap_test_timeout((voltdm->read(vp->vstatus)),
> - VP_IDLE_TIMEOUT, timeout);
> + omap_test_timeout((voltdm->read(vp->vstatus) &
> + vp->common->vstatus_vpidle), VP_IDLE_TIMEOUT,
> + timeout);
>
> if (timeout >= VP_IDLE_TIMEOUT)
> pr_warning("%s: vdd_%s idle timedout after disable\n",
> diff --git a/arch/arm/mach-omap2/vp.h b/arch/arm/mach-omap2/vp.h
> index 0abf895..876b5ab 100644
> --- a/arch/arm/mach-omap2/vp.h
> +++ b/arch/arm/mach-omap2/vp.h
> @@ -73,6 +73,7 @@ struct omap_vp_common {
> u8 vpconfig_initvdd;
> u8 vpconfig_forceupdate;
> u8 vpconfig_vpenable;
> + u8 vstatus_vpidle;
> u8 vstepmin_stepmin_shift;
> u8 vstepmin_smpswaittimemin_shift;
> u8 vstepmax_stepmax_shift;
> diff --git a/arch/arm/mach-omap2/vp3xxx_data.c b/arch/arm/mach-omap2/vp3xxx_data.c
> index bd89f80..a65909b 100644
> --- a/arch/arm/mach-omap2/vp3xxx_data.c
> +++ b/arch/arm/mach-omap2/vp3xxx_data.c
> @@ -44,6 +44,7 @@ static const struct omap_vp_common omap3_vp_common = {
> .vpconfig_initvdd = OMAP3430_INITVDD_MASK,
> .vpconfig_forceupdate = OMAP3430_FORCEUPDATE_MASK,
> .vpconfig_vpenable = OMAP3430_VPENABLE_MASK,
> + .vstatus_vpidle = OMAP3430_VPINIDLE_MASK,
> .vstepmin_smpswaittimemin_shift = OMAP3430_SMPSWAITTIMEMIN_SHIFT,
> .vstepmax_smpswaittimemax_shift = OMAP3430_SMPSWAITTIMEMAX_SHIFT,
> .vstepmin_stepmin_shift = OMAP3430_VSTEPMIN_SHIFT,
> diff --git a/arch/arm/mach-omap2/vp44xx_data.c b/arch/arm/mach-omap2/vp44xx_data.c
> index 8c031d1..9d14881 100644
> --- a/arch/arm/mach-omap2/vp44xx_data.c
> +++ b/arch/arm/mach-omap2/vp44xx_data.c
> @@ -44,6 +44,7 @@ static const struct omap_vp_common omap4_vp_common = {
> .vpconfig_initvdd = OMAP4430_INITVDD_MASK,
> .vpconfig_forceupdate = OMAP4430_FORCEUPDATE_MASK,
> .vpconfig_vpenable = OMAP4430_VPENABLE_MASK,
> + .vstatus_vpidle = OMAP4430_VPINIDLE_MASK,
> .vstepmin_smpswaittimemin_shift = OMAP4430_SMPSWAITTIMEMIN_SHIFT,
> .vstepmax_smpswaittimemax_shift = OMAP4430_SMPSWAITTIMEMAX_SHIFT,
> .vstepmin_stepmin_shift = OMAP4430_VSTEPMIN_SHIFT,
WARNING: multiple messages have this Message-ID (diff)
From: khilman@ti.com (Kevin Hilman)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 3/3] ARM: OMAP3+: PM: VP: check only the VPINIDLE status bit
Date: Thu, 31 May 2012 16:27:28 -0700 [thread overview]
Message-ID: <87k3zsvsm7.fsf@ti.com> (raw)
In-Reply-To: <1337369601-14915-4-git-send-email-nm@ti.com> (Nishanth Menon's message of "Fri, 18 May 2012 14:33:21 -0500")
Nishanth Menon <nm@ti.com> writes:
> Currently we check against the entire 32 bits of the status register
> Where, bits 1-31 are marked as reserved and mentioned in TRM as read
> returns undefined values.
ouch
> Hence, check against purely the vpinidle status bit.
>
> Cc: Tony Lindgren <tony@atomide.com>
> Cc: Kevin Hilman <khilman@ti.com>
> Cc: linux-omap at vger.kernel.org
> Cc: linux-arm-kernel at lists.infradead.org
>
> Reported-by: Vinay Amancha <vinaykumar@ti.com>
> Signed-off-by: Nishanth Menon <nm@ti.com>
Thanks for the fix.
Looking at this combined with the previous patches, since this same
thing is done several places, it looks like we need a helper function
'omap_vp_wait_for_idle()' or similar. That function will do the check,
wait for timeout, and return an error if failure. The callers can than
do appropriate error handling upon failure.
Thanks,
Kevin
> ---
> arch/arm/mach-omap2/vp.c | 15 +++++++++------
> arch/arm/mach-omap2/vp.h | 1 +
> arch/arm/mach-omap2/vp3xxx_data.c | 1 +
> arch/arm/mach-omap2/vp44xx_data.c | 1 +
> 4 files changed, 12 insertions(+), 6 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/vp.c b/arch/arm/mach-omap2/vp.c
> index 985091b..cdcac16 100644
> --- a/arch/arm/mach-omap2/vp.c
> +++ b/arch/arm/mach-omap2/vp.c
> @@ -128,8 +128,9 @@ int omap_vp_forceupdate_scale(struct voltagedomain *voltdm,
> * This is an additional allowance to ensure we are in proper state
> * to enter into forceupdate state transition.
> */
> - omap_test_timeout((voltdm->read(vp->vstatus)),
> - VP_IDLE_TIMEOUT, timeout);
> + omap_test_timeout((voltdm->read(vp->vstatus) &
> + vp->common->vstatus_vpidle), VP_IDLE_TIMEOUT,
> + timeout);
>
> if (timeout >= VP_IDLE_TIMEOUT)
> pr_warning("%s: vdd_%s idle timedout forceupdate(v=%ld)\n",
> @@ -278,8 +279,9 @@ void omap_vp_disable(struct voltagedomain *voltdm)
> * Wait for VP idle Typical latency is <2us. Maximum latency is ~100us
> * Depending on if we catch VP in the middle of an SR operation.
> */
> - omap_test_timeout((voltdm->read(vp->vstatus)),
> - VP_IDLE_TIMEOUT, timeout);
> + omap_test_timeout((voltdm->read(vp->vstatus) &
> + vp->common->vstatus_vpidle), VP_IDLE_TIMEOUT,
> + timeout);
>
> if (timeout >= VP_IDLE_TIMEOUT)
> pr_warning("%s: vdd_%s idle timedout before disable\n",
> @@ -293,8 +295,9 @@ void omap_vp_disable(struct voltagedomain *voltdm)
> /*
> * Wait for VP idle Typical latency is <2us. Maximum latency is ~100us
> */
> - omap_test_timeout((voltdm->read(vp->vstatus)),
> - VP_IDLE_TIMEOUT, timeout);
> + omap_test_timeout((voltdm->read(vp->vstatus) &
> + vp->common->vstatus_vpidle), VP_IDLE_TIMEOUT,
> + timeout);
>
> if (timeout >= VP_IDLE_TIMEOUT)
> pr_warning("%s: vdd_%s idle timedout after disable\n",
> diff --git a/arch/arm/mach-omap2/vp.h b/arch/arm/mach-omap2/vp.h
> index 0abf895..876b5ab 100644
> --- a/arch/arm/mach-omap2/vp.h
> +++ b/arch/arm/mach-omap2/vp.h
> @@ -73,6 +73,7 @@ struct omap_vp_common {
> u8 vpconfig_initvdd;
> u8 vpconfig_forceupdate;
> u8 vpconfig_vpenable;
> + u8 vstatus_vpidle;
> u8 vstepmin_stepmin_shift;
> u8 vstepmin_smpswaittimemin_shift;
> u8 vstepmax_stepmax_shift;
> diff --git a/arch/arm/mach-omap2/vp3xxx_data.c b/arch/arm/mach-omap2/vp3xxx_data.c
> index bd89f80..a65909b 100644
> --- a/arch/arm/mach-omap2/vp3xxx_data.c
> +++ b/arch/arm/mach-omap2/vp3xxx_data.c
> @@ -44,6 +44,7 @@ static const struct omap_vp_common omap3_vp_common = {
> .vpconfig_initvdd = OMAP3430_INITVDD_MASK,
> .vpconfig_forceupdate = OMAP3430_FORCEUPDATE_MASK,
> .vpconfig_vpenable = OMAP3430_VPENABLE_MASK,
> + .vstatus_vpidle = OMAP3430_VPINIDLE_MASK,
> .vstepmin_smpswaittimemin_shift = OMAP3430_SMPSWAITTIMEMIN_SHIFT,
> .vstepmax_smpswaittimemax_shift = OMAP3430_SMPSWAITTIMEMAX_SHIFT,
> .vstepmin_stepmin_shift = OMAP3430_VSTEPMIN_SHIFT,
> diff --git a/arch/arm/mach-omap2/vp44xx_data.c b/arch/arm/mach-omap2/vp44xx_data.c
> index 8c031d1..9d14881 100644
> --- a/arch/arm/mach-omap2/vp44xx_data.c
> +++ b/arch/arm/mach-omap2/vp44xx_data.c
> @@ -44,6 +44,7 @@ static const struct omap_vp_common omap4_vp_common = {
> .vpconfig_initvdd = OMAP4430_INITVDD_MASK,
> .vpconfig_forceupdate = OMAP4430_FORCEUPDATE_MASK,
> .vpconfig_vpenable = OMAP4430_VPENABLE_MASK,
> + .vstatus_vpidle = OMAP4430_VPINIDLE_MASK,
> .vstepmin_smpswaittimemin_shift = OMAP4430_SMPSWAITTIMEMIN_SHIFT,
> .vstepmax_smpswaittimemax_shift = OMAP4430_SMPSWAITTIMEMAX_SHIFT,
> .vstepmin_stepmin_shift = OMAP4430_VSTEPMIN_SHIFT,
next prev parent reply other threads:[~2012-05-31 23:27 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <[PATCH] ARM: OMAP3+: PM: VP: ensure VP is idle before disable>
2012-05-18 18:18 ` [PATCH V2] ARM: OMAP3+: PM: VP: ensure VP is idle before disable Nishanth Menon
2012-05-18 18:18 ` Nishanth Menon
2012-05-19 9:52 ` Eduardo Valentin
2012-05-19 9:52 ` Eduardo Valentin
2012-05-21 13:36 ` Menon, Nishanth
2012-05-21 13:36 ` Menon, Nishanth
2012-05-21 14:51 ` Eduardo Valentin
2012-05-21 14:51 ` Eduardo Valentin
2012-05-21 15:14 ` Menon, Nishanth
2012-05-21 15:14 ` Menon, Nishanth
2012-05-22 7:02 ` Valentin, Eduardo
2012-05-22 7:02 ` Valentin, Eduardo
2012-05-18 19:33 ` [PATCH 0/3] ARM: OMAP3+: VP: collate fixes Nishanth Menon
2012-05-18 19:33 ` Nishanth Menon
2012-05-18 19:33 ` [PATCH 1/3] ARM: OMAP3+: PM: VP: ensure VP is idle before disable Nishanth Menon
2012-05-18 19:33 ` Nishanth Menon
2012-05-31 23:21 ` Kevin Hilman
2012-05-31 23:21 ` Kevin Hilman
2012-05-31 23:28 ` Kevin Hilman
2012-05-31 23:28 ` Kevin Hilman
2012-05-31 23:35 ` Nishanth Menon
2012-05-31 23:35 ` Nishanth Menon
2012-05-18 19:33 ` [PATCH 2/3] ARM: OMAP3+: PM: VP: check to ensure VP is idle before forceupdate Nishanth Menon
2012-05-18 19:33 ` Nishanth Menon
2012-05-31 23:23 ` Kevin Hilman
2012-05-31 23:23 ` Kevin Hilman
2012-05-31 23:37 ` Nishanth Menon
2012-05-31 23:37 ` Nishanth Menon
2012-05-18 19:33 ` [PATCH 3/3] ARM: OMAP3+: PM: VP: check only the VPINIDLE status bit Nishanth Menon
2012-05-18 19:33 ` Nishanth Menon
2012-05-31 23:27 ` Kevin Hilman [this message]
2012-05-31 23:27 ` Kevin Hilman
2012-05-31 23:39 ` Nishanth Menon
2012-05-31 23:39 ` Nishanth Menon
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87k3zsvsm7.fsf@ti.com \
--to=khilman@ti.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-omap@vger.kernel.org \
--cc=nm@ti.com \
--cc=tony@atomide.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.