From: Roger Quadros <rogerq@ti.com>
To: <tony@atomide.com>
Cc: <nsekhar@ti.com>, <s-anna@ti.com>, <linux-kernel@vger.kernel.org>,
Roger Quadros <rogerq@ti.com>
Subject: [RFC PATCH 4/4] bus: ti-sysc: Ensure PRU-ICSS doesn't break suspend/resume
Date: Tue, 2 Apr 2019 16:37:52 +0300 [thread overview]
Message-ID: <20190402133752.6912-5-rogerq@ti.com> (raw)
In-Reply-To: <20190402133752.6912-1-rogerq@ti.com>
The PRU-ICSS subsystem's SYSCONFIG register is similar to
omap4-simple but has 2 special bits STANDBY_INIT and SUB_MWAIT.
The STANDBY_INIT bit initiates a Standby sequence (when set) and
triggers a MStandby request to the SoC's PRCM module. This same
bit is also used to enable the OCP master ports (when cleared).
Some PRU applications require the OCP master port access to be
enabled thus keeping it out of standby.
During sustem suspend/resume we must ensure that the PRUSS is in
standby else it will break resume.
NOTE:
1. This patch only adds the PM callbacks with code to fix the System
Suspend/Resume hang issue on AM33xx/AM437x SoCs, but does not
implement the full context save and restore required for the PRUSS
drivers to work across system suspend/resume when the power domain
is switched off (L4PER domain is switched OFF on AM335x/AM437x
during system suspend/resume, so PRUSS modules do lose context).
2. The PRUSS driver functionality on AM57xx SoCs is not affected that
much because the PER power domain to which the PRUSS IPs belong is
not switched OFF during suspend/resume.
Based on work by Suman Anna.
Cc: Suman Anna <s-anna@ti.com>
Signed-off-by: Roger Quadros <rogerq@ti.com>
---
drivers/bus/ti-sysc.c | 36 ++++++++++++++++++++++++++++++++++++
1 file changed, 36 insertions(+)
diff --git a/drivers/bus/ti-sysc.c b/drivers/bus/ti-sysc.c
index e4ab4d422ea5..9c94ce08dd36 100644
--- a/drivers/bus/ti-sysc.c
+++ b/drivers/bus/ti-sysc.c
@@ -71,6 +71,7 @@ static const char * const clock_names[SYSC_MAX_CLOCKS] = {
* @name: name if available
* @revision: interconnect target module revision
* @needs_resume: runtime resume needed on resume from suspend
+ * @in_standby: flag used by PRUSS type during suspend/resume
*/
struct sysc {
struct device *dev;
@@ -92,6 +93,7 @@ struct sysc {
bool enabled;
bool needs_resume;
bool child_needs_resume;
+ bool in_standby;
struct delayed_work idle_work;
};
@@ -1023,6 +1025,21 @@ static int __maybe_unused sysc_noirq_suspend(struct device *dev)
if (ddata->cfg.quirks & SYSC_QUIRK_LEGACY_IDLE)
return 0;
+ if (ddata->cap->type == TI_SYSC_PRUSS) {
+ u32 reg, mask;
+ const struct sysc_regbits *regbits = ddata->cap->regbits;
+
+ mask = BIT(regbits->standby_init_shift);
+ reg = sysc_read(ddata, ddata->offsets[SYSC_SYSCONFIG]);
+ ddata->in_standby = reg & mask;
+
+ /* initiate MStandby */
+ if (!ddata->in_standby) {
+ reg |= mask;
+ sysc_write(ddata, ddata->offsets[SYSC_SYSCONFIG], reg);
+ }
+ }
+
return pm_runtime_force_suspend(dev);
}
@@ -1035,6 +1052,25 @@ static int __maybe_unused sysc_noirq_resume(struct device *dev)
if (ddata->cfg.quirks & SYSC_QUIRK_LEGACY_IDLE)
return 0;
+ if (ddata->cap->type == TI_SYSC_PRUSS && !ddata->in_standby) {
+ u32 reg;
+ const struct sysc_regbits *regbits = ddata->cap->regbits;
+
+ /* re-enable OCP master ports/disable MStandby */
+ reg = sysc_read(ddata, ddata->offsets[SYSC_SYSCONFIG]);
+ reg &= ~BIT(regbits->standby_init_shift);
+ sysc_write(ddata, ddata->offsets[SYSC_SYSCONFIG], reg);
+ ddata->in_standby = 0;
+
+ /* wait till ready for transactions - delay is arbitrary */
+ usleep_range(50, 100);
+ reg = sysc_read(ddata, ddata->offsets[SYSC_SYSCONFIG]);
+ if (reg & BIT(regbits->sub_mwait_shift)) {
+ dev_err(dev, "timeout waiting for SUB_MWAIT_READY\n");
+ return -ETIMEDOUT;
+ }
+ }
+
return pm_runtime_force_resume(dev);
}
--
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki
next prev parent reply other threads:[~2019-04-02 13:38 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-02 13:37 [RFC PATCH 0/4] bus: ti-sysc: Add generic enable/disable & PRUSS Roger Quadros
2019-04-02 13:37 ` [RFC PATCH 1/4] ARM: dts: dra7: Keep usb_otg_ss3 and usb_otg_ss4 disabled Roger Quadros
2019-04-02 16:22 ` Tony Lindgren
2019-04-03 8:38 ` Roger Quadros
2019-04-03 14:53 ` Roger Quadros
2019-04-03 15:09 ` Tony Lindgren
2019-04-02 13:37 ` [RFC PATCH 2/4] bus: ti-sysc: Add generic enable/disable functions Roger Quadros
2019-04-02 17:14 ` Tony Lindgren
2019-04-02 13:37 ` [RFC PATCH 3/4] bus: ti-sysc: Add support for PRU-ICSS type Roger Quadros
2019-04-02 13:37 ` Roger Quadros [this message]
2019-04-02 16:57 ` [RFC PATCH 4/4] bus: ti-sysc: Ensure PRU-ICSS doesn't break suspend/resume Tony Lindgren
2019-04-03 8:46 ` Roger Quadros
2019-04-02 13:39 ` [RFC PATCH 0/4] bus: ti-sysc: Add generic enable/disable & PRUSS Roger Quadros
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=20190402133752.6912-5-rogerq@ti.com \
--to=rogerq@ti.com \
--cc=linux-kernel@vger.kernel.org \
--cc=nsekhar@ti.com \
--cc=s-anna@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome