+static int rockchip_u3phy_on_init(struct usb_phy *usb_phy)
+{
+ struct rockchip_u3phy *u3phy =
+ container_of(usb_phy, struct rockchip_u3phy, usb_phy);
+
+ reset_control_deassert(u3phy->rsts[U3_POR_RSTN]);
+ usleep_range(250, 300);
+ reset_control_deassert(u3phy->rsts[PIPE_MAC_RSTN]);
+
+ return 0;
+}
+
+static void rockchip_u3phy_on_shutdown(struct usb_phy *usb_phy)
+{
+ struct rockchip_u3phy *u3phy =
+ container_of(usb_phy, struct rockchip_u3phy, usb_phy);
+
+ reset_control_assert(u3phy->rsts[U3_POR_RSTN]);
+ reset_control_assert(u3phy->rsts[PIPE_MAC_RSTN]);
+ usleep_range(15, 20);
+}
+
+static int rockchip_u3phy_on_disconnect(struct usb_phy *usb_phy,
+ enum usb_device_speed speed)
+{
+ struct rockchip_u3phy *u3phy =
+ container_of(usb_phy, struct rockchip_u3phy, usb_phy);
+
+ dev_info(u3phy->dev, "%s device has disconnected\n",
+ (speed == USB_SPEED_SUPER) ? "U3" : "UW/U2/U1.1/U1");
+
+ if (speed == USB_SPEED_SUPER)
+ atomic_notifier_call_chain(&usb_phy->notifier, 0, NULL);
+
+ return 0;
+}
+