]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/commitdiff
phy: omap-usb2: Adapt phy-omap-usb2 for AM437x
authorGeorge Cherian <george.cherian@ti.com>
Thu, 6 Mar 2014 12:41:52 +0000 (18:11 +0530)
committerKishon Vijay Abraham I <kishon@ti.com>
Sun, 9 Mar 2014 07:15:07 +0000 (12:45 +0530)
Adapt phy-omap-usb2 driver for AM437x.
- Add new comaptible "ti,am437x-usb2" for AM437x
- Pass proper data to differentiate AM437x and others.
- AM437x doesnot support  set_vbus and start_srp.

Signed-off-by: George Cherian <george.cherian@ti.com>
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
drivers/phy/phy-omap-usb2.c
include/linux/phy/omap_usb.h

index 9c3f056b3ddfd36bad915aef5edda089e70a3957..0c78f54d0650e9938d9c35d604d93fbdd2689dad 100644 (file)
@@ -122,6 +122,31 @@ static struct phy_ops ops = {
        .owner          = THIS_MODULE,
 };
 
+#ifdef CONFIG_OF
+static const struct usb_phy_data omap_usb2_data = {
+       .label = "omap_usb2",
+       .flags = OMAP_USB2_HAS_START_SRP | OMAP_USB2_HAS_SET_VBUS,
+};
+
+static const struct usb_phy_data am437x_usb2_data = {
+       .label = "am437x_usb2",
+       .flags =  0,
+};
+
+static const struct of_device_id omap_usb2_id_table[] = {
+       {
+               .compatible = "ti,omap-usb2",
+               .data = &omap_usb2_data,
+       },
+       {
+               .compatible = "ti,am437x-usb2",
+               .data = &am437x_usb2_data,
+       },
+       {},
+};
+MODULE_DEVICE_TABLE(of, omap_usb2_id_table);
+#endif
+
 static int omap_usb2_probe(struct platform_device *pdev)
 {
        struct omap_usb *phy;
@@ -131,10 +156,16 @@ static int omap_usb2_probe(struct platform_device *pdev)
        struct device_node *node = pdev->dev.of_node;
        struct device_node *control_node;
        struct platform_device *control_pdev;
+       const struct of_device_id *of_id;
+       struct usb_phy_data *phy_data;
+
+       of_id = of_match_device(of_match_ptr(omap_usb2_id_table), &pdev->dev);
 
-       if (!node)
+       if (!of_id)
                return -EINVAL;
 
+       phy_data = (struct usb_phy_data *)of_id->data;
+
        phy = devm_kzalloc(&pdev->dev, sizeof(*phy), GFP_KERNEL);
        if (!phy) {
                dev_err(&pdev->dev, "unable to allocate memory for USB2 PHY\n");
@@ -150,7 +181,7 @@ static int omap_usb2_probe(struct platform_device *pdev)
        phy->dev                = &pdev->dev;
 
        phy->phy.dev            = phy->dev;
-       phy->phy.label          = "omap-usb2";
+       phy->phy.label          = phy_data->label;
        phy->phy.otg            = otg;
        phy->phy.type           = USB_PHY_TYPE_USB2;
 
@@ -171,8 +202,10 @@ static int omap_usb2_probe(struct platform_device *pdev)
 
        otg->set_host           = omap_usb_set_host;
        otg->set_peripheral     = omap_usb_set_peripheral;
-       otg->set_vbus           = omap_usb_set_vbus;
-       otg->start_srp          = omap_usb_start_srp;
+       if (phy_data->flags & OMAP_USB2_HAS_SET_VBUS)
+               otg->set_vbus           = omap_usb_set_vbus;
+       if (phy_data->flags & OMAP_USB2_HAS_START_SRP)
+               otg->start_srp          = omap_usb_start_srp;
        otg->phy                = &phy->phy;
 
        platform_set_drvdata(pdev, phy);
@@ -272,14 +305,6 @@ static const struct dev_pm_ops omap_usb2_pm_ops = {
 #define DEV_PM_OPS     NULL
 #endif
 
-#ifdef CONFIG_OF
-static const struct of_device_id omap_usb2_id_table[] = {
-       { .compatible = "ti,omap-usb2" },
-       {}
-};
-MODULE_DEVICE_TABLE(of, omap_usb2_id_table);
-#endif
-
 static struct platform_driver omap_usb2_driver = {
        .probe          = omap_usb2_probe,
        .remove         = omap_usb2_remove,
index 19d343c37fb5c0bad48215566b5d2567680f9c12..35989a8fc5350d8a4c42efd41b475ad1b2173ea0 100644 (file)
@@ -39,6 +39,15 @@ struct omap_usb {
        struct clk              *optclk;
 };
 
+struct usb_phy_data {
+       const char *label;
+       u8 flags;
+};
+
+/* Driver Flags */
+#define OMAP_USB2_HAS_START_SRP (1 << 0)
+#define OMAP_USB2_HAS_SET_VBUS (1 << 1)
+
 #define        phy_to_omapusb(x)       container_of((x), struct omap_usb, phy)
 
 #if defined(CONFIG_OMAP_USB2) || defined(CONFIG_OMAP_USB2_MODULE)