]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/phy/phy-omap-usb2.c
usb: phy: omap-usb2: use the new generic PHY framework
[karo-tx-linux.git] / drivers / phy / phy-omap-usb2.c
similarity index 88%
rename from drivers/usb/phy/phy-omap-usb2.c
rename to drivers/phy/phy-omap-usb2.c
index d266861d24f73978c682fed2a1e59518106f3758..4d7b4e5a965909ec49547c7ba42c034dd4352cfa 100644 (file)
@@ -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;
 }