USB: ehci-platform: check for platform data misconfiguration
authorAlan Stern <stern@rowland.harvard.edu>
Tue, 11 Feb 2014 16:26:10 +0000 (11:26 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 11 Feb 2014 21:39:54 +0000 (13:39 -0800)
The ehci-platform driver checks for misconfigurations in cases where
the Device Tree data specifies big-endian registers or descriptors but
the corresponding driver config settings have not been enabled.  As
Jonas Gorski suggested, we may as well apply the same check to general
platform data too.

This requires moving the code that sets the big-endian quirk flags
from the ehci_platform_reset() routine into ehci_platform_probe(), and
moving the checks out of the DT-specific "if" statement clause.

The patch also changes the text of the error messages in an attempt to
make the nature of the error more clear.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Reported-by: Jonas Gorski <jogo@openwrt.org>
Acked-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/ehci-platform.c

index 117873033d009094070856a369930a21791cb065..b3a0e11073aae8a3ed873305cd1737a1d2a45beb 100644 (file)
@@ -55,10 +55,6 @@ static int ehci_platform_reset(struct usb_hcd *hcd)
 
        hcd->has_tt = pdata->has_tt;
        ehci->has_synopsys_hc_bug = pdata->has_synopsys_hc_bug;
-       if (pdata->big_endian_desc)
-               ehci->big_endian_desc = 1;
-       if (pdata->big_endian_mmio)
-               ehci->big_endian_mmio = 1;
 
        if (pdata->pre_setup) {
                retval = pdata->pre_setup(hcd);
@@ -192,22 +188,6 @@ static int ehci_platform_probe(struct platform_device *dev)
                if (of_property_read_bool(dev->dev.of_node, "big-endian"))
                        ehci->big_endian_mmio = ehci->big_endian_desc = 1;
 
-#ifndef CONFIG_USB_EHCI_BIG_ENDIAN_MMIO
-               if (ehci->big_endian_mmio) {
-                       dev_err(&dev->dev,
-                               "Error big-endian-regs not compiled in\n");
-                       err = -EINVAL;
-                       goto err_put_hcd;
-               }
-#endif
-#ifndef CONFIG_USB_EHCI_BIG_ENDIAN_DESC
-               if (ehci->big_endian_desc) {
-                       dev_err(&dev->dev,
-                               "Error big-endian-desc not compiled in\n");
-                       err = -EINVAL;
-                       goto err_put_hcd;
-               }
-#endif
                priv->phy = devm_phy_get(&dev->dev, "usb");
                if (IS_ERR(priv->phy)) {
                        err = PTR_ERR(priv->phy);
@@ -228,6 +208,28 @@ static int ehci_platform_probe(struct platform_device *dev)
                }
        }
 
+       if (pdata->big_endian_desc)
+               ehci->big_endian_desc = 1;
+       if (pdata->big_endian_mmio)
+               ehci->big_endian_mmio = 1;
+
+#ifndef CONFIG_USB_EHCI_BIG_ENDIAN_MMIO
+       if (ehci->big_endian_mmio) {
+               dev_err(&dev->dev,
+                       "Error: CONFIG_USB_EHCI_BIG_ENDIAN_MMIO not set\n");
+               err = -EINVAL;
+               goto err_put_clks;
+       }
+#endif
+#ifndef CONFIG_USB_EHCI_BIG_ENDIAN_DESC
+       if (ehci->big_endian_desc) {
+               dev_err(&dev->dev,
+                       "Error: CONFIG_USB_EHCI_BIG_ENDIAN_DESC not set\n");
+               err = -EINVAL;
+               goto err_put_clks;
+       }
+#endif
+
        if (pdata->power_on) {
                err = pdata->power_on(dev);
                if (err < 0)