default:
                break;
        }
-
-       clk_disable_unprepare(tp->clk);
 }
 
 static void rtl_pll_power_up(struct rtl8169_private *tp)
 {
-       clk_prepare_enable(tp->clk);
-
        switch (tp->mac_version) {
        case RTL_GIGA_MAC_VER_25 ... RTL_GIGA_MAC_VER_33:
        case RTL_GIGA_MAC_VER_37:
 
 #ifdef CONFIG_PM
 
+static int rtl8169_net_resume(struct rtl8169_private *tp)
+{
+       rtl_rar_set(tp, tp->dev->dev_addr);
+
+       if (tp->TxDescArray)
+               rtl8169_up(tp);
+
+       netif_device_attach(tp->dev);
+
+       return 0;
+}
+
 static int __maybe_unused rtl8169_suspend(struct device *device)
 {
        struct rtl8169_private *tp = dev_get_drvdata(device);
 
        rtnl_lock();
        rtl8169_net_suspend(tp);
+       if (!device_may_wakeup(tp_to_dev(tp)))
+               clk_disable_unprepare(tp->clk);
        rtnl_unlock();
 
        return 0;
 }
 
-static int rtl8169_resume(struct device *device)
+static int __maybe_unused rtl8169_resume(struct device *device)
 {
        struct rtl8169_private *tp = dev_get_drvdata(device);
 
-       rtl_rar_set(tp, tp->dev->dev_addr);
-
-       if (tp->TxDescArray)
-               rtl8169_up(tp);
+       if (!device_may_wakeup(tp_to_dev(tp)))
+               clk_prepare_enable(tp->clk);
 
-       netif_device_attach(tp->dev);
-
-       return 0;
+       return rtl8169_net_resume(tp);
 }
 
 static int rtl8169_runtime_suspend(struct device *device)
 
        __rtl8169_set_wol(tp, tp->saved_wolopts);
 
-       return rtl8169_resume(device);
+       return rtl8169_net_resume(tp);
 }
 
 static int rtl8169_runtime_idle(struct device *device)