Skip to contentSkip to conversation

usb: musb: fix context save over suspend.

PATCH In review NeilBrown 4 participants 8 messages Jan 21, 2013 – Feb 13, 2013

Subsystems (2)
lore
Share & tools
lore

NeilBrown

author
#0 lore raw

PATCH 1/1 usb: musb: fix context save over suspend.

The standard suspend sequence involves runtime_resuming devices before suspending the system.
So just saving context in runtime_suspend and restoring it in runtime resume isn't enough. We must also save in "suspend" and restore in "resume".

Without this patch, and OMAP3 system with off_mode enabled will find the musb port non-functional after suspend/resume. With the patch it works perfectly.

drivers/usb/musb/musb_core.c +3 -0
index fd34867..b6ccc02 100644
@@ -2225,6 +2225,7 @@ static int musb_suspend(struct device *dev)
 	}
 
 	spin_unlock_irqrestore(&musb->lock, flags);
+	musb_save_context(musb);
 	return 0;
 }
 
@@ -2234,6 +2235,8 @@ static int musb_resume_noirq(struct device *dev)
 	 * unless for some reason the whole soc powered down or the USB
 	 * module got reset through the PSC (vs just being disabled).
 	 */
+	struct musb	*musb = dev_to_musb(dev);
+	musb_restore_context(musb);
 	return 0;
 }
 
#1 lore raw

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi Neil,

Quoted 11 lines · NeilBrown

The standard suspend sequence involves runtime_resuming devices before suspending the system.
So just saving context in runtime_suspend and restoring it in runtime resume isn't enough. We must also save in "suspend" and restore in "resume".

Without this patch, and OMAP3 system with off_mode enabled will find the musb port non-functional after suspend/resume. With the patch it works perfectly.

Hmmm... Some time ago, this has been removed in
5d193ce8 (usb: musb: PM: fix context save/restore in suspend/resume path)

Am I missing something? Or things changed and now this patch is correct?

Quoted 16 lines
drivers/usb/musb/musb_core.c +1 -0
index fd34867..b6ccc02 100644
@@ -2225,6 +2225,7 @@ static int musb_suspend(struct device *dev)
 	}
 
 	spin_unlock_irqrestore(&musb->lock, flags);
+	musb_save_context(musb);
 	return 0;
 }
 

drivers/usb/musb/musb_core.c static int musb_resume_noirq(struct device *dev) · line 2242

Quoted 8 lines
drivers/usb/musb/musb_core.c +2 -0
@@ -2234,6 +2235,8 @@ static int musb_resume_noirq(struct device *dev)
 	 * unless for some reason the whole soc powered down or the USB
 	 * module got reset through the PSC (vs just being disabled).
 	 */
+	struct musb	*musb = dev_to_musb(dev);
+	musb_restore_context(musb);
 	return 0;
 }
 

- --
Regards,
Igor.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.17 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQIcBAEBAgAGBQJQ/SjTAAoJEBDE8YO64EfaHrsP/2bl4rP6L/tWLSZ+rNEdz6B+ Qo+HVOhnTVsOxgWbbd5VrfhE28jLoFGMslrLuI+geeCcJ1zgwNsahG9C11bygyfu 54hQgkmaxDJPDKAlalcy7VK9C6tOTgQV5iSbuRlemttK879dTrb+33zP6idn5+zK kxptY38fpmyojnl8gJiVa6Plik/apQcVr+GIx8CMwj+YQC5vkdg7cUEWyngfyk2C W0U4NceroS8NSjRbcFV3V6Q912TVjKzl+B2yxVD0OBaSK4BpHEncDBXiVx8APq87 4nDeBB5gDXi1rtN3YjcfDaFu0me5qzpYc3JFFidvdLTdXIdvxDzjHgMqsZB8ZBYC R0e5PtIw/62I90d63JkXZXVRTB7JeZsGfZFY2R7MxBab9or8zz0OyYwGWoW63vzH oFrwmAkWoD0IEKcfc8+dd99eicgZrmQL6FDWrEMsX+RS34LRtVU30SVAudRhY+CR MhNCjKyFySwx7wqkGgJl1ECl0Y6U4ua0v4bv7kdE6eyrgbQIkiGliSJ7DhWBPcP6 iMIOTwC7+LwPYP/MX2uYR3DXDfI0XwiqdtyzhD9LJe4PRol8zjozS2j0Y7FriItw jFqsgCgwDc9j8ufcpXf5ZynJYnlCG0iLuAPEUugZot83/CpxgU++A8cuHqUrOnhH 76L95rflUTkpiQ76ffP7
=jqXb
-----END PGP SIGNATURE-----

author
#2 lore raw

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Quoted 14 lines · On Mon, 21 Jan 2013 13:38:59 +0200 Igor Grinberg <[email protected]>…

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi Neil,

Quoted 8 lines · NeilBrown

The standard suspend sequence involves runtime_resuming devices before suspending the system.
So just saving context in runtime_suspend and restoring it in runtime resume isn't enough. We must also save in "suspend" and restore in "resume".

Quoted 8 lines
Quoted 3 lines

Without this patch, and OMAP3 system with off_mode enabled will find the musb port non-functional after suspend/resume. With the patch it works perfectly.

Hmmm... Some time ago, this has been removed in
5d193ce8 (usb: musb: PM: fix context save/restore in suspend/resume path)

Am I missing something? Or things changed and now this patch is correct?

Hi Igor,
thanks for alerting me to that patch .... does anyone else get the feeling that power management to too complex to be understood by a mere human?

That commit (5d193ce8) suggests that the musb-hdrc device is an 'omap_device', or maybe has a PM domain set to something else. However it isn't/doesn't. dev->pm_domain is NULL. So no PM domain layer will ever call the musb_core musb_runtime_suspend/resume.

The parent device - musb-omap2430 - is an omap device, does have pm_domain set, and does have its omap2430_runtime_suspend/resume called for system suspend and so the context for that device is saved and restored. However that doesn't help the context for musb-hdrc.

Whether musb ever was an omap_device is beyond my archaeological skills to determine.

Kevin: Was musb-hdrc ever a device with a pm_domain? or was it only ever
the various possible parents that had domains?
Are you able to defend your earlier patch in today's kernel? It certainly causes my device not to work properly.

Thanks,
NeilBrown

Quoted 33 lines
Quoted 17 lines
drivers/usb/musb/musb_core.c +1 -0
index fd34867..b6ccc02 100644
@@ -2225,6 +2225,7 @@ static int musb_suspend(struct device *dev)
 	}
 
 	spin_unlock_irqrestore(&musb->lock, flags);
+	musb_save_context(musb);
 	return 0;
 }
 

drivers/usb/musb/musb_core.c static int musb_resume_noirq(struct device *dev) · line 2242

Quoted 8 lines
drivers/usb/musb/musb_core.c +2 -0
@@ -2234,6 +2235,8 @@ static int musb_resume_noirq(struct device *dev)
 	 * unless for some reason the whole soc powered down or the USB
 	 * module got reset through the PSC (vs just being disabled).
 	 */
+	struct musb	*musb = dev_to_musb(dev);
+	musb_restore_context(musb);
 	return 0;
 }
 

- --
Regards,
Igor.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.17 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

Quoted 14 lines

iQIcBAEBAgAGBQJQ/SjTAAoJEBDE8YO64EfaHrsP/2bl4rP6L/tWLSZ+rNEdz6B+ Qo+HVOhnTVsOxgWbbd5VrfhE28jLoFGMslrLuI+geeCcJ1zgwNsahG9C11bygyfu 54hQgkmaxDJPDKAlalcy7VK9C6tOTgQV5iSbuRlemttK879dTrb+33zP6idn5+zK kxptY38fpmyojnl8gJiVa6Plik/apQcVr+GIx8CMwj+YQC5vkdg7cUEWyngfyk2C W0U4NceroS8NSjRbcFV3V6Q912TVjKzl+B2yxVD0OBaSK4BpHEncDBXiVx8APq87 4nDeBB5gDXi1rtN3YjcfDaFu0me5qzpYc3JFFidvdLTdXIdvxDzjHgMqsZB8ZBYC R0e5PtIw/62I90d63JkXZXVRTB7JeZsGfZFY2R7MxBab9or8zz0OyYwGWoW63vzH oFrwmAkWoD0IEKcfc8+dd99eicgZrmQL6FDWrEMsX+RS34LRtVU30SVAudRhY+CR MhNCjKyFySwx7wqkGgJl1ECl0Y6U4ua0v4bv7kdE6eyrgbQIkiGliSJ7DhWBPcP6 iMIOTwC7+LwPYP/MX2uYR3DXDfI0XwiqdtyzhD9LJe4PRol8zjozS2j0Y7FriItw jFqsgCgwDc9j8ufcpXf5ZynJYnlCG0iLuAPEUugZot83/CpxgU++A8cuHqUrOnhH 76L95rflUTkpiQ76ffP7
=jqXb
-----END PGP SIGNATURE-----

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.19 (GNU/Linux)

iQIVAwUBUP21WDnsnt1WYoG5AQIQlQ/+LlXi1ZRXKtO/oj/u4iqs7DL8PNcZX6C7 j7Rrx8nxd2C15pEnxvOYIrojLTrXqz3bgE9NmBvYOYY+dj2/+CaS7RJsTR0gYJi0 AMkLT9k6+edUJ79KtIRmeqbnPEnujOWHkBdg2dLrm4PpYmGUmc8VGeE3+mh3La97 ssZm4gYbip6TPzB4MdvTbhkxbEXJidOcgBJrsdTvMXB8HkZ30Wq6/YELtYoYNpZo rn+CbQo5Dd0bUb8fQ3Fd5unfXqx5N5txBslwK8JgSA3L7l96d3+q9UOfBg/PsUJJ WrnFahv11lypajHtnCnXb3z+TsGgV4v46aUZ4Yk+tkwVv81nbORHTRGoaLReRMG2 Sii/xYeugOuhnJI//07yWrnLfunFbJJyHmfZARz/6kKNoIPrZwRDmVeO3+Iu/39R zmwvJDTqONwenXnZEmxqrON0E/Y8V6hdNlGZdFYIypJr/Ym2rp+R+qcRyEwQxAYi 7h1mACvXE7tYCCoBi+fN5hFaF2VQeN1QqJMTimQjqnkgaI2jQ4Zm7zMCUKREhGPu 3TTvOwuFGM+bwb2eKsW+4zSzebdepXaNjSPCmHSKU++5SVcOMNiZyKlrvoW8znM4 /1Ea+3CmkHqAhmja5Fly4NYL2fdy/NhfIqZI2yIrTAG58iIankQjBHysqAcGrvQp TplHj7osO40=
=G91I
-----END PGP SIGNATURE-----

#3 lore raw

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

It looks like Kevin has a new address:
Kevin Hilman <[email protected]>

Quoted 43 lines · NeilBrown
Quoted 14 lines · On Mon, 21 Jan 2013 13:38:59 +0200 Igor Grinberg <[email protected]>…

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi Neil,

Quoted 8 lines · NeilBrown

The standard suspend sequence involves runtime_resuming devices before suspending the system.
So just saving context in runtime_suspend and restoring it in runtime resume isn't enough. We must also save in "suspend" and restore in "resume".

Quoted 8 lines
Quoted 3 lines

Without this patch, and OMAP3 system with off_mode enabled will find the musb port non-functional after suspend/resume. With the patch it works perfectly.

Hmmm... Some time ago, this has been removed in
5d193ce8 (usb: musb: PM: fix context save/restore in suspend/resume path)

Am I missing something? Or things changed and now this patch is correct?

Hi Igor,
thanks for alerting me to that patch .... does anyone else get the feeling that power management to too complex to be understood by a mere human?

That commit (5d193ce8) suggests that the musb-hdrc device is an 'omap_device', or maybe has a PM domain set to something else. However it isn't/doesn't. dev->pm_domain is NULL. So no PM domain layer will ever call the musb_core musb_runtime_suspend/resume.

The parent device - musb-omap2430 - is an omap device, does have pm_domain set, and does have its omap2430_runtime_suspend/resume called for system suspend and so the context for that device is saved and restored. However that doesn't help the context for musb-hdrc.

Whether musb ever was an omap_device is beyond my archaeological skills to determine.

Quoted 40 lines

Kevin: Was musb-hdrc ever a device with a pm_domain? or was it only ever
the various possible parents that had domains?
Are you able to defend your earlier patch in today's kernel? It certainly causes my device not to work properly.

Thanks,
NeilBrown

Quoted 29 lines
Quoted 16 lines
drivers/usb/musb/musb_core.c +1 -0
index fd34867..b6ccc02 100644
@@ -2225,6 +2225,7 @@ static int musb_suspend(struct device *dev)
 	}
 
 	spin_unlock_irqrestore(&musb->lock, flags);
+	musb_save_context(musb);
 	return 0;
 }
 

drivers/usb/musb/musb_core.c static int musb_resume_noirq(struct device *dev) · line 2242

Quoted 8 lines
drivers/usb/musb/musb_core.c +2 -0
@@ -2234,6 +2235,8 @@ static int musb_resume_noirq(struct device *dev)
 	 * unless for some reason the whole soc powered down or the USB
 	 * module got reset through the PSC (vs just being disabled).
 	 */
+	struct musb	*musb = dev_to_musb(dev);
+	musb_restore_context(musb);
 	return 0;
 }
 

- --
Regards,
Igor.

- --
Regards,
Igor.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.17 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQIcBAEBAgAGBQJQ/lgWAAoJEBDE8YO64EfacIAP/3nyXjs8QQpcD6RcNuRSLp3O veKU2grzsUOL/Eu/8TQMM7WDz5n8YlycQ6/THNGGYojjOlEimDC02wbsI4gc5j41 QC1/XGf62Nlxv6CzORzkGkUoKXtVWzgMYKddWKPEwsXMKPun/LH4ZGDp+7Rkfcmu U0k7LM1Pv487iG9pF3Bq5BPYeMxyxyFJC0PiQEK1ZE65RKWbCvInibc7p1bvZ+XX JQxf8Qx1p/kBhqWc6LLpcHT5Z3B/F+3rxEhvf8lSu5fdRPHFffcmuX7bIbC/GlTe e6mODA114mtn5YbaKCmnYExvJcpz4Nziy+8fGLJ56aAyeKI1wsOJzhWDpSKwQiIF CVtYulk5iIfaeUA4sAzvRqEu7dJuaVgm6mEeGHQjebPastYhK7vHjiEOJJ2+LQrs 698A9wMLckp4AQ75HiwXRgi5N0W528gD8piNoIA9Sh1LwyytIa5Wg7uYw14UjtLJ QIerm0v6Ay+8FbVfmpm9k0v3HkYfv0ZVTSdtIXVAE30+WKIBTn0yszxWYo6JZtvj p0NEFUNVuR3C9k/xyzkcqwJh8Q6DrleWJeHWL59xgWWKzfeDKjU/DMOuWmuVEkTO aRdAlW32VDtUeWlWz3Jz3IOWZRJQKCW2o97n/MDyxwMoRiMWcHxYw6jti6se9S7a IGZeEMCcf39fnH5o7i2q
=nwGe
-----END PGP SIGNATURE-----

#4 lore raw

Hi,

I faced the same issue on OMAP4 and made similar fix a week ago: http://review.omapzoom.org/31700 but in this patch I also check is the MUSB is already suspended (so the context is already saved) in .suspend callback so reading/writing to MUSB register is more safe. It is almost same solution as we had a long time ago.

--
Best regards,
Ruslan Bilovol

________________________________________
From: [email protected] [[email protected]] on behalf of Igor Grinberg [[email protected]]
Sent: Tuesday, January 22, 2013 11:12 AM
To: NeilBrown
Cc: Balbi, Felipe; Greg Kroah-Hartman; [email protected]; [email protected]; [email protected]; Kevin Hilman
Subject: Re: [PATCH] usb: musb: fix context save over suspend.

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

It looks like Kevin has a new address:
Kevin Hilman <[email protected]>

Quoted 43 lines · NeilBrown
Quoted 14 lines · On Mon, 21 Jan 2013 13:38:59 +0200 Igor Grinberg <[email protected]>…

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi Neil,

Quoted 8 lines · NeilBrown

The standard suspend sequence involves runtime_resuming devices before suspending the system.
So just saving context in runtime_suspend and restoring it in runtime resume isn't enough. We must also save in "suspend" and restore in "resume".

Quoted 8 lines
Quoted 3 lines

Without this patch, and OMAP3 system with off_mode enabled will find the musb port non-functional after suspend/resume. With the patch it works perfectly.

Hmmm... Some time ago, this has been removed in
5d193ce8 (usb: musb: PM: fix context save/restore in suspend/resume path)

Am I missing something? Or things changed and now this patch is correct?

Hi Igor,
thanks for alerting me to that patch .... does anyone else get the feeling that power management to too complex to be understood by a mere human?

That commit (5d193ce8) suggests that the musb-hdrc device is an 'omap_device', or maybe has a PM domain set to something else. However it isn't/doesn't. dev->pm_domain is NULL. So no PM domain layer will ever call the musb_core musb_runtime_suspend/resume.

The parent device - musb-omap2430 - is an omap device, does have pm_domain set, and does have its omap2430_runtime_suspend/resume called for system suspend and so the context for that device is saved and restored. However that doesn't help the context for musb-hdrc.

Whether musb ever was an omap_device is beyond my archaeological skills to determine.

Quoted 40 lines

Kevin: Was musb-hdrc ever a device with a pm_domain? or was it only ever
the various possible parents that had domains?
Are you able to defend your earlier patch in today's kernel? It certainly causes my device not to work properly.

Thanks,
NeilBrown

Quoted 29 lines
Quoted 16 lines
drivers/usb/musb/musb_core.c +1 -0
index fd34867..b6ccc02 100644
@@ -2225,6 +2225,7 @@ static int musb_suspend(struct device *dev)
    }
 
    spin_unlock_irqrestore(&musb->lock, flags);
+   musb_save_context(musb);
    return 0;
 }
 

drivers/usb/musb/musb_core.c static int musb_resume_noirq(struct device *dev) · line 2242

Quoted 8 lines
drivers/usb/musb/musb_core.c +2 -0
@@ -2234,6 +2235,8 @@ static int musb_resume_noirq(struct device *dev)
     * unless for some reason the whole soc powered down or the USB
     * module got reset through the PSC (vs just being disabled).
     */
+   struct musb     *musb = dev_to_musb(dev);
+   musb_restore_context(musb);
    return 0;
 }
 

- --
Regards,
Igor.

- --
Regards,
Igor.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.17 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQIcBAEBAgAGBQJQ/lgWAAoJEBDE8YO64EfacIAP/3nyXjs8QQpcD6RcNuRSLp3O veKU2grzsUOL/Eu/8TQMM7WDz5n8YlycQ6/THNGGYojjOlEimDC02wbsI4gc5j41 QC1/XGf62Nlxv6CzORzkGkUoKXtVWzgMYKddWKPEwsXMKPun/LH4ZGDp+7Rkfcmu U0k7LM1Pv487iG9pF3Bq5BPYeMxyxyFJC0PiQEK1ZE65RKWbCvInibc7p1bvZ+XX JQxf8Qx1p/kBhqWc6LLpcHT5Z3B/F+3rxEhvf8lSu5fdRPHFffcmuX7bIbC/GlTe e6mODA114mtn5YbaKCmnYExvJcpz4Nziy+8fGLJ56aAyeKI1wsOJzhWDpSKwQiIF CVtYulk5iIfaeUA4sAzvRqEu7dJuaVgm6mEeGHQjebPastYhK7vHjiEOJJ2+LQrs 698A9wMLckp4AQ75HiwXRgi5N0W528gD8piNoIA9Sh1LwyytIa5Wg7uYw14UjtLJ QIerm0v6Ay+8FbVfmpm9k0v3HkYfv0ZVTSdtIXVAE30+WKIBTn0yszxWYo6JZtvj p0NEFUNVuR3C9k/xyzkcqwJh8Q6DrleWJeHWL59xgWWKzfeDKjU/DMOuWmuVEkTO aRdAlW32VDtUeWlWz3Jz3IOWZRJQKCW2o97n/MDyxwMoRiMWcHxYw6jti6se9S7a IGZeEMCcf39fnH5o7i2q
=nwGe
-----END PGP SIGNATURE-----

#5 lore raw
In reply to NeilBrown
Quoted 21 lines · NeilBrown
Quoted 18 lines · On Mon, 21 Jan 2013 13:38:59 +0200 Igor Grinberg <[email protected]>…

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi Neil,

Quoted 11 lines · NeilBrown

The standard suspend sequence involves runtime_resuming devices before suspending the system.
So just saving context in runtime_suspend and restoring it in runtime resume isn't enough. We must also save in "suspend" and restore in "resume".

Without this patch, and OMAP3 system with off_mode enabled will find the musb port non-functional after suspend/resume. With the patch it works perfectly.

Quoted 8 lines
Quoted 4 lines

Hmmm... Some time ago, this has been removed in
5d193ce8 (usb: musb: PM: fix context save/restore in suspend/resume path)

Am I missing something? Or things changed and now this patch is correct?

Hi Igor,
thanks for alerting me to that patch .... does anyone else get the feeling that power management to too complex to be understood by a mere human?

Yes. ;)

Quoted 10 lines

That commit (5d193ce8) suggests that the musb-hdrc device is an 'omap_device', or maybe has a PM domain set to something else. However it isn't/doesn't. dev->pm_domain is NULL. So no PM domain layer will ever call the musb_core musb_runtime_suspend/resume.

The parent device - musb-omap2430 - is an omap device, does have pm_domain set, and does have its omap2430_runtime_suspend/resume called for system suspend and so the context for that device is saved and restored. However that doesn't help the context for musb-hdrc.

Quoted 7 lines

Whether musb ever was an omap_device is beyond my archaeological skills to determine.

Kevin: Was musb-hdrc ever a device with a pm_domain? or was it only ever
the various possible parents that had domains?
Are you able to defend your earlier patch in today's kernel? It certainly causes my device not to work properly.

Sorry for the delay here, I'm back to a place where I can test this on real hardware.

My patch was fixing a real hang when musb was built-in (or loaded), in host-mode (mini-A cable attached) but no devices attached. I just tried to reproduce this, and with your patch, the system hangs during suspend.

That being said, your description makes sense why this context save/restore is needed. Perhaps your patch needs to add a check whether the device is runtime suspended (I gather this is what Ruslan's patch is doing.)

Kevin

author
#6 lore raw
Quoted 52 lines · On Tue, 12 Feb 2013 13:03:36 -0800 Kevin Hilman…
Quoted 21 lines · NeilBrown
Quoted 18 lines · On Mon, 21 Jan 2013 13:38:59 +0200 Igor Grinberg…

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Hi Neil,

Quoted 11 lines · NeilBrown

The standard suspend sequence involves runtime_resuming devices before suspending the system.
So just saving context in runtime_suspend and restoring it in runtime resume isn't enough. We must also save in "suspend" and restore in "resume".

Without this patch, and OMAP3 system with off_mode enabled will find the musb port non-functional after suspend/resume. With the patch it works perfectly.

Quoted 8 lines
Quoted 4 lines

Hmmm... Some time ago, this has been removed in
5d193ce8 (usb: musb: PM: fix context save/restore in suspend/resume path)

Am I missing something? Or things changed and now this patch is correct?

Hi Igor,
thanks for alerting me to that patch .... does anyone else get the feeling that power management to too complex to be understood by a mere human?

Yes. ;)

Quoted 10 lines

That commit (5d193ce8) suggests that the musb-hdrc device is an 'omap_device', or maybe has a PM domain set to something else. However it isn't/doesn't. dev->pm_domain is NULL. So no PM domain layer will ever call the musb_core musb_runtime_suspend/resume.

The parent device - musb-omap2430 - is an omap device, does have pm_domain set, and does have its omap2430_runtime_suspend/resume called for system suspend and so the context for that device is saved and restored. However that doesn't help the context for musb-hdrc.

Quoted 7 lines

Whether musb ever was an omap_device is beyond my archaeological skills to determine.

Kevin: Was musb-hdrc ever a device with a pm_domain? or was it only ever
the various possible parents that had domains?
Are you able to defend your earlier patch in today's kernel? It certainly causes my device not to work properly.

Quoted 7 lines

Sorry for the delay here, I'm back to a place where I can test this on real hardware.

My patch was fixing a real hang when musb was built-in (or loaded), in host-mode (mini-A cable attached) but no devices attached. I just tried to reproduce this, and with your patch, the system hangs during suspend.

Odd. I plug in a mini-A cable, note that the 'mode' file holds 'a_idle' (sometimes just plugging in the cable isn't enough to trigger that, but sometimes it is....) and suspend/resume work perfectly. Though after resume it is back to b_idle.

unplug/replug and it is back to a_idle. suspend/resume and back to b_idle.

Quoted 4 lines

That being said, your description makes sense why this context save/restore is needed. Perhaps your patch needs to add a check whether the device is runtime suspended (I gather this is what Ruslan's patch is doing.)

I'm not sure it is possible for the device to be runtime suspended at this point. Certainly my device never is, even if it was just before the suspend sequence started. Something is waking it up...
(instruments the code).

Ahh - usb_suspend() calls choose_wakeup() which might call pm_runtime_resume() if the could be a need to reprogram the wakeup setting. As that is a 'might', the device might not be runtime-awake when 'suspend' runs.

Can you see if this, on top of my previous patch, does any better on your hardware?

Thanks,
NeilBrown

drivers/usb/musb/musb_core.c +4 -2
index 956db0e..00deb94 100644
@@ -2278,7 +2278,8 @@ static int musb_suspend(struct device *dev)
 	}
 
 	spin_unlock_irqrestore(&musb->lock, flags);
-	musb_save_context(musb);
+	if (!pm_runtime_status_suspended(dev))
+		musb_save_context(musb);
 	return 0;
 }
 
@@ -2289,7 +2290,8 @@ static int musb_resume_noirq(struct device *dev)
 	 * module got reset through the PSC (vs just being disabled).
 	 */
 	struct musb	*musb = dev_to_musb(dev);
-	musb_restore_context(musb);
+	if (!pm_runtime_status_suspended(dev))
+		musb_restore_context(musb);
 	return 0;
 }
 
#7 lore raw
Quoted 4 lines · NeilBrown
Quoted 2 lines · On Tue, 12 Feb 2013 13:03:36 -0800 Kevin Hilman <[email protected]> wrote:

NeilBrown <[email protected]> writes:

[...]

Quoted 22 lines
Quoted 4 lines

My patch was fixing a real hang when musb was built-in (or loaded), in host-mode (mini-A cable attached) but no devices attached. I just tried to reproduce this, and with your patch, the system hangs during suspend.

Odd. I plug in a mini-A cable, note that the 'mode' file holds 'a_idle' (sometimes just plugging in the cable isn't enough to trigger that, but sometimes it is....) and suspend/resume work perfectly. Though after resume it is back to b_idle.

unplug/replug and it is back to a_idle. suspend/resume and back to b_idle.

Quoted 4 lines

That being said, your description makes sense why this context save/restore is needed. Perhaps your patch needs to add a check whether the device is runtime suspended (I gather this is what Ruslan's patch is doing.)

I'm not sure it is possible for the device to be runtime suspended at this point. Certainly my device never is, even if it was just before the suspend sequence started. Something is waking it up...
(instruments the code).

Quoted 7 lines

Ahh - usb_suspend() calls choose_wakeup() which might call pm_runtime_resume() if the could be a need to reprogram the wakeup setting. As that is a 'might', the device might not be runtime-awake when 'suspend' runs.

Can you see if this, on top of my previous patch, does any better on your hardware?

Yes, this patch adding the check on top of your previous one makes things work just fine on my hardware (3530/Overo).

Kevin

Quoted 28 lines

Thanks,
NeilBrown

drivers/usb/musb/musb_core.c +4 -2
index 956db0e..00deb94 100644
@@ -2278,7 +2278,8 @@ static int musb_suspend(struct device *dev)
 	}
 
 	spin_unlock_irqrestore(&musb->lock, flags);
-	musb_save_context(musb);
+	if (!pm_runtime_status_suspended(dev))
+		musb_save_context(musb);
 	return 0;
 }
 
@@ -2289,7 +2290,8 @@ static int musb_resume_noirq(struct device *dev)
 	 * module got reset through the PSC (vs just being disabled).
 	 */
 	struct musb	*musb = dev_to_musb(dev);
-	musb_restore_context(musb);
+	if (!pm_runtime_status_suspended(dev))
+		musb_restore_context(musb);
 	return 0;
 }