- clock-names: string, clock name, must be "phyclk"
- vbus_drv-gpio: pull gpio on/off to control vbus power supply.
- #clock-cells: for users of the phy-pll, should be 0
+- reset-names: Only allow the following entries:
+- phy-reset
+- resets: Must contain an entry for each entry in reset-names.
Example:
rockchip,grf = <&grf>;
#address-cells = <1>;
#size-cells = <0>;
+ resets = <&cru SRST_USBHOST1_PHY>;
+ reset-names = "phy-reset";
usbphy0: usb-phy0 {
#phy-cells = <0>;
#include <linux/reset.h>
#include <linux/regmap.h>
#include <linux/mfd/syscon.h>
+#include <linux/delay.h>
/*
* The higher 16-bit of this register is used for write protection
struct clk *clk480m;
struct clk_hw clk480m_hw;
struct phy *phy;
+ struct reset_control *reset;
};
static int rockchip_usb_phy_power(struct rockchip_usb_phy *phy,
return ret;
}
+static int rockchip_usb_phy_reset(struct phy *_phy)
+{
+ struct rockchip_usb_phy *phy = phy_get_drvdata(_phy);
+
+ if (phy->reset) {
+ reset_control_assert(phy->reset);
+ udelay(10);
+ reset_control_deassert(phy->reset);
+ }
+
+ return 0;
+}
+
static const struct phy_ops ops = {
.power_on = rockchip_usb_phy_power_on,
.power_off = rockchip_usb_phy_power_off,
+ .reset = rockchip_usb_phy_reset,
.owner = THIS_MODULE,
};
return -EINVAL;
}
+ rk_phy->reset = of_reset_control_get(child, "phy-reset");
+ if (IS_ERR(rk_phy->reset))
+ rk_phy->reset = NULL;
+
rk_phy->reg_offset = reg_offset;
rk_phy->clk = of_clk_get_by_name(child, "phyclk");