|
@@ -28,6 +28,7 @@
|
|
|
#include <linux/pm_runtime.h>
|
|
|
#include <linux/delay.h>
|
|
|
#include <linux/usb/omap_control_usb.h>
|
|
|
+#include <linux/phy/phy.h>
|
|
|
|
|
|
/**
|
|
|
* omap_usb2_set_comparator - links the comparator present in the sytem with
|
|
@@ -118,10 +119,36 @@ static int omap_usb2_suspend(struct usb_phy *x, int suspend)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int omap_usb_power_off(struct phy *x)
|
|
|
+{
|
|
|
+ struct omap_usb *phy = phy_get_drvdata(x);
|
|
|
+
|
|
|
+ omap_control_usb_phy_power(phy->control_dev, 0);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int omap_usb_power_on(struct phy *x)
|
|
|
+{
|
|
|
+ struct omap_usb *phy = phy_get_drvdata(x);
|
|
|
+
|
|
|
+ omap_control_usb_phy_power(phy->control_dev, 1);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static struct phy_ops ops = {
|
|
|
+ .power_on = omap_usb_power_on,
|
|
|
+ .power_off = omap_usb_power_off,
|
|
|
+ .owner = THIS_MODULE,
|
|
|
+};
|
|
|
+
|
|
|
static int omap_usb2_probe(struct platform_device *pdev)
|
|
|
{
|
|
|
struct omap_usb *phy;
|
|
|
+ struct phy *generic_phy;
|
|
|
struct usb_otg *otg;
|
|
|
+ struct phy_provider *phy_provider;
|
|
|
|
|
|
phy = devm_kzalloc(&pdev->dev, sizeof(*phy), GFP_KERNEL);
|
|
|
if (!phy) {
|
|
@@ -143,6 +170,11 @@ static int omap_usb2_probe(struct platform_device *pdev)
|
|
|
phy->phy.otg = otg;
|
|
|
phy->phy.type = USB_PHY_TYPE_USB2;
|
|
|
|
|
|
+ phy_provider = devm_of_phy_provider_register(phy->dev,
|
|
|
+ of_phy_simple_xlate);
|
|
|
+ if (IS_ERR(phy_provider))
|
|
|
+ return PTR_ERR(phy_provider);
|
|
|
+
|
|
|
phy->control_dev = omap_get_control_dev();
|
|
|
if (IS_ERR(phy->control_dev)) {
|
|
|
dev_dbg(&pdev->dev, "Failed to get control device\n");
|
|
@@ -158,6 +190,15 @@ static int omap_usb2_probe(struct platform_device *pdev)
|
|
|
otg->start_srp = omap_usb_start_srp;
|
|
|
otg->phy = &phy->phy;
|
|
|
|
|
|
+ platform_set_drvdata(pdev, phy);
|
|
|
+ pm_runtime_enable(phy->dev);
|
|
|
+
|
|
|
+ generic_phy = devm_phy_create(phy->dev, &ops, NULL);
|
|
|
+ if (IS_ERR(generic_phy))
|
|
|
+ return PTR_ERR(generic_phy);
|
|
|
+
|
|
|
+ phy_set_drvdata(generic_phy, phy);
|
|
|
+
|
|
|
phy->wkupclk = devm_clk_get(phy->dev, "usb_phy_cm_clk32k");
|
|
|
if (IS_ERR(phy->wkupclk)) {
|
|
|
dev_err(&pdev->dev, "unable to get usb_phy_cm_clk32k\n");
|
|
@@ -173,10 +214,6 @@ static int omap_usb2_probe(struct platform_device *pdev)
|
|
|
|
|
|
usb_add_phy_dev(&phy->phy);
|
|
|
|
|
|
- platform_set_drvdata(pdev, phy);
|
|
|
-
|
|
|
- pm_runtime_enable(phy->dev);
|
|
|
-
|
|
|
return 0;
|
|
|
}
|
|
|
|