usb: chipidea: Add support for VBUS control with PHY
authorPiyush Mehta <piyush.mehta@xilinx.com>
Mon, 22 Aug 2022 05:40:51 +0000 (11:10 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 31 Aug 2022 07:07:52 +0000 (09:07 +0200)
Some platforms make use of VBUS control over PHY which means controller
driver has to access PHY registers to turn on/off VBUS line.This patch
adds support for such platforms in chipidea.

Flag 'CI_HDRC_PHY_VBUS_CONTROL' added to support VBus control feature.

Acked-by: Peter Chen <peter.chen@kernel.org>
Signed-off-by: Piyush Mehta <piyush.mehta@xilinx.com>
Signed-off-by: Piyush Mehta <piyush.mehta@amd.com>
Link: https://lore.kernel.org/r/20220822054051.2941282-1-piyush.mehta@amd.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/chipidea/ci_hdrc_usb2.c
drivers/usb/chipidea/host.c
drivers/usb/chipidea/otg_fsm.c
include/linux/usb/chipidea.h

index 89e1d82d739b1618429b02e5967890f4ee672306..dc86b12060b56a35692ca8c082d5dc220ac03c0b 100644 (file)
@@ -30,6 +30,7 @@ static const struct ci_hdrc_platform_data ci_default_pdata = {
 
 static const struct ci_hdrc_platform_data ci_zynq_pdata = {
        .capoffset      = DEF_CAPOFFSET,
+       .flags          = CI_HDRC_PHY_VBUS_CONTROL,
 };
 
 static const struct ci_hdrc_platform_data ci_zevio_pdata = {
index bdc3885c0d493c14e8abb6fe0c284cd5938eb137..bc3634a54c6b7f5e5e3aa95bac1e7af0e41e642e 100644 (file)
@@ -63,6 +63,13 @@ static int ehci_ci_portpower(struct usb_hcd *hcd, int portnum, bool enable)
                priv->enabled = enable;
        }
 
+       if (ci->platdata->flags & CI_HDRC_PHY_VBUS_CONTROL) {
+               if (enable)
+                       usb_phy_vbus_on(ci->usb_phy);
+               else
+                       usb_phy_vbus_off(ci->usb_phy);
+       }
+
        if (enable && (ci->platdata->phy_mode == USBPHY_INTERFACE_MODE_HSIC)) {
                /*
                 * Marvell 28nm HSIC PHY requires forcing the port to HS mode.
index 61b157b9c662689667b42eeb7fa55eca9e74d35f..ada78daba6df9cd89a616aa30f72cfee2f3d58c1 100644 (file)
@@ -471,6 +471,10 @@ static void ci_otg_drv_vbus(struct otg_fsm *fsm, int on)
                                return;
                        }
                }
+
+               if (ci->platdata->flags & CI_HDRC_PHY_VBUS_CONTROL)
+                       usb_phy_vbus_on(ci->usb_phy);
+
                /* Disable data pulse irq */
                hw_write_otgsc(ci, OTGSC_DPIE, 0);
 
@@ -480,6 +484,9 @@ static void ci_otg_drv_vbus(struct otg_fsm *fsm, int on)
                if (ci->platdata->reg_vbus)
                        regulator_disable(ci->platdata->reg_vbus);
 
+               if (ci->platdata->flags & CI_HDRC_PHY_VBUS_CONTROL)
+                       usb_phy_vbus_off(ci->usb_phy);
+
                fsm->a_bus_drop = 1;
                fsm->a_bus_req = 0;
        }
index edf3342507f16484909cbb5eaffd2283be23eaad..ee38835ed77cc4bd2b43425fffbaff280c3ab881 100644 (file)
@@ -62,6 +62,7 @@ struct ci_hdrc_platform_data {
 #define CI_HDRC_REQUIRES_ALIGNED_DMA   BIT(13)
 #define CI_HDRC_IMX_IS_HSIC            BIT(14)
 #define CI_HDRC_PMQOS                  BIT(15)
+#define CI_HDRC_PHY_VBUS_CONTROL       BIT(16)
        enum usb_dr_mode        dr_mode;
 #define CI_HDRC_CONTROLLER_RESET_EVENT         0
 #define CI_HDRC_CONTROLLER_STOPPED_EVENT       1