phy: usb: Put USB phys into IDDQ on suspend to save power in S2 mode
authorAl Cooper <alcooperx@gmail.com>
Fri, 3 Jan 2020 18:18:01 +0000 (13:18 -0500)
committerKishon Vijay Abraham I <kishon@ti.com>
Wed, 8 Jan 2020 07:28:06 +0000 (12:58 +0530)
Currently the Phy driver will put the USB phys into the max
power saving mode (IDDQ) when there is no corresponding XHCI, EHCI
or OHCI client (through rmmod, unbind or if the driver is not
builtin). This change will also put the Phys into IDDQ mode
on suspend so that S2 will get the additional power savings.

Signed-off-by: Al Cooper <alcooperx@gmail.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
drivers/phy/broadcom/phy-brcm-usb-init.c
drivers/phy/broadcom/phy-brcm-usb.c

index bd473d12ab280a0d1f3834fd63247a7614c25a7f..ac7f7995c11f18829d5d6d6e17730ea319cc170e 100644 (file)
@@ -1002,8 +1002,6 @@ void brcm_usb_uninit_common(struct brcm_usb_init_params *params)
 
 void brcm_usb_uninit_eohci(struct brcm_usb_init_params *params)
 {
-       if (USB_CTRL_MASK_FAMILY(params, USB_PM, USB20_HC_RESETB))
-               USB_CTRL_UNSET_FAMILY(params, USB_PM, USB20_HC_RESETB);
 }
 
 void brcm_usb_uninit_xhci(struct brcm_usb_init_params *params)
index 217e3702ef4e5254a9af5474f3b4d6615bfb4046..634afc80377820d59129fd2fa9a2ac13d8848773 100644 (file)
@@ -381,8 +381,15 @@ static int brcm_usb_phy_suspend(struct device *dev)
        struct brcm_usb_phy_data *priv = dev_get_drvdata(dev);
 
        if (priv->init_count) {
-               clk_disable_unprepare(priv->usb_20_clk);
-               clk_disable_unprepare(priv->usb_30_clk);
+               if (priv->phys[BRCM_USB_PHY_3_0].inited)
+                       brcm_usb_uninit_xhci(&priv->ini);
+               if (priv->phys[BRCM_USB_PHY_2_0].inited)
+                       brcm_usb_uninit_eohci(&priv->ini);
+               brcm_usb_uninit_common(&priv->ini);
+               if (priv->phys[BRCM_USB_PHY_3_0].inited)
+                       clk_disable_unprepare(priv->usb_30_clk);
+               if (priv->phys[BRCM_USB_PHY_2_0].inited)
+                       clk_disable_unprepare(priv->usb_20_clk);
        }
        return 0;
 }