((struct usb_phy *)platform_get_drvdata(pdev))
struct ci13xxx_imx_data {
- struct device_node *phy_np;
struct usb_phy *phy;
struct platform_device *ci_pdev;
struct clk *clk;
CI13XXX_PULLUP_ON_VBUS |
CI13XXX_DISABLE_STREAMING,
};
- struct platform_device *phy_pdev;
struct resource *res;
int ret;
+ struct usb_phy *phy;
if (of_find_property(pdev->dev.of_node, "fsl,usbmisc", NULL)
&& !usbmisc_ops)
return ret;
}
- data->phy_np = of_parse_phandle(pdev->dev.of_node, "fsl,usbphy", 0);
- if (data->phy_np) {
- phy_pdev = of_find_device_by_node(data->phy_np);
- if (phy_pdev) {
- struct usb_phy *phy;
- phy = pdev_to_phy(phy_pdev);
- if (phy &&
- try_module_get(phy_pdev->dev.driver->owner)) {
- usb_phy_init(phy);
- data->phy = phy;
- }
+ phy = devm_usb_get_phy_by_phandle(&pdev->dev, "fsl,usbphy", 0);
+ if (!IS_ERR(phy)) {
+ ret = usb_phy_init(phy);
+ if (ret) {
+ dev_err(&pdev->dev, "unable to init phy: %d\n", ret);
+ goto err_clk;
}
+ } else if (PTR_ERR(phy) == -EPROBE_DEFER) {
+ ret = -EPROBE_DEFER;
+ goto err_clk;
}
/* we only support host now, so enable vbus here */
dev_err(&pdev->dev,
"Failed to enable vbus regulator, err=%d\n",
ret);
- goto put_np;
+ goto err_clk;
}
} else {
data->reg_vbus = NULL;
err:
if (data->reg_vbus)
regulator_disable(data->reg_vbus);
-put_np:
- if (data->phy_np)
- of_node_put(data->phy_np);
+err_clk:
clk_disable_unprepare(data->clk);
return ret;
}
module_put(data->phy->dev->driver->owner);
}
- if (data->phy_np)
- of_node_put(data->phy_np);
-
clk_disable_unprepare(data->clk);
return 0;