|
@@ -2270,9 +2270,32 @@ static int __maybe_unused ravb_resume(struct device *dev)
|
|
|
struct ravb_private *priv = netdev_priv(ndev);
|
|
|
int ret = 0;
|
|
|
|
|
|
- /* If WoL is enabled set reset mode to rearm the WoL logic */
|
|
|
- if (priv->wol_enabled)
|
|
|
+ if (priv->wol_enabled) {
|
|
|
+ /* Reduce the usecount of the clock to zero and then
|
|
|
+ * restore it to its original value. This is done to force
|
|
|
+ * the clock to be re-enabled which is a workaround
|
|
|
+ * for renesas-cpg-mssr driver which do not enable clocks
|
|
|
+ * when resuming from PSCI suspend/resume.
|
|
|
+ *
|
|
|
+ * Without this workaround the driver fails to communicate
|
|
|
+ * with the hardware if WoL was enabled when the system
|
|
|
+ * entered PSCI suspend. This is due to that if WoL is enabled
|
|
|
+ * we explicitly keep the clock from being turned off when
|
|
|
+ * suspending, but in PSCI sleep power is cut so the clock
|
|
|
+ * is disabled anyhow, the clock driver is not aware of this
|
|
|
+ * so the clock is not turned back on when resuming.
|
|
|
+ *
|
|
|
+ * TODO: once the renesas-cpg-mssr suspend/resume is working
|
|
|
+ * this clock dance should be removed.
|
|
|
+ */
|
|
|
+ clk_disable(priv->clk);
|
|
|
+ clk_disable(priv->clk);
|
|
|
+ clk_enable(priv->clk);
|
|
|
+ clk_enable(priv->clk);
|
|
|
+
|
|
|
+ /* Set reset mode to rearm the WoL logic */
|
|
|
ravb_write(ndev, CCC_OPC_RESET, CCC);
|
|
|
+ }
|
|
|
|
|
|
/* All register have been reset to default values.
|
|
|
* Restore all registers which where setup at probe time and
|