]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
usb: chipidea: udc: add maximum-speed = full-speed option
authorMichael Grzeschik <m.grzeschik@pengutronix.de>
Wed, 19 Feb 2014 05:41:43 +0000 (13:41 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 25 Feb 2014 01:07:52 +0000 (17:07 -0800)
This patch makes it possible to set the chipidea udc into full-speed only mode.
It is set by the oftree property "maximum-speed = full-speed".

Signed-off-by: Peter Chen <peter.chen@freescale.com>
Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Documentation/devicetree/bindings/usb/ci-hdrc-imx.txt
drivers/usb/chipidea/bits.h
drivers/usb/chipidea/core.c
include/linux/usb/chipidea.h

index b4b5b7906c88b0d2e06111068c9e3279e14b07a8..a6a32cb7f7772469688a62258b677dd10c85a92f 100644 (file)
@@ -18,6 +18,7 @@ Optional properties:
 - vbus-supply: regulator for vbus
 - disable-over-current: disable over current detect
 - external-vbus-divider: enables off-chip resistor divider for Vbus
+- maximum-speed: limit the maximum connection speed to "full-speed".
 
 Examples:
 usb@02184000 { /* USB OTG */
@@ -28,4 +29,5 @@ usb@02184000 { /* USB OTG */
        fsl,usbmisc = <&usbmisc 0>;
        disable-over-current;
        external-vbus-divider;
+       maximum-speed = "full-speed";
 };
index a857131656889fa2a2634dc33ed398a5143c373a..83d06c1455b7bd93875b3562dcbbe30f7b4f7f9c 100644 (file)
 #define PORTSC_PTC            (0x0FUL << 16)
 #define PORTSC_PHCD(d)       ((d) ? BIT(22) : BIT(23))
 /* PTS and PTW for non lpm version only */
+#define PORTSC_PFSC           BIT(24)
 #define PORTSC_PTS(d)                                          \
        (u32)((((d) & 0x3) << 30) | (((d) & 0x4) ? BIT(25) : 0))
 #define PORTSC_PTW            BIT(28)
 #define PORTSC_STS            BIT(29)
 
 /* DEVLC */
+#define DEVLC_PFSC            BIT(23)
 #define DEVLC_PSPD            (0x03UL << 25)
 #define DEVLC_PSPD_HS         (0x02UL << 25)
 #define DEVLC_PTW             BIT(27)
index 47b4bd860b65ad8fa5c469eeca4cb087fec7cdae..65aeaacda6cd04dd5ed8ae07de9ecfd2ee88d431 100644 (file)
@@ -64,6 +64,7 @@
 #include <linux/usb/otg.h>
 #include <linux/usb/chipidea.h>
 #include <linux/usb/of.h>
+#include <linux/of.h>
 #include <linux/phy.h>
 #include <linux/regulator/consumer.h>
 
@@ -298,6 +299,13 @@ int hw_device_reset(struct ci_hdrc *ci, u32 mode)
        if (ci->platdata->flags & CI_HDRC_DISABLE_STREAMING)
                hw_write(ci, OP_USBMODE, USBMODE_CI_SDIS, USBMODE_CI_SDIS);
 
+       if (ci->platdata->flags & CI_HDRC_FORCE_FULLSPEED) {
+               if (ci->hw_bank.lpm)
+                       hw_write(ci, OP_DEVLC, DEVLC_PFSC, DEVLC_PFSC);
+               else
+                       hw_write(ci, OP_PORTSC, PORTSC_PFSC, PORTSC_PFSC);
+       }
+
        /* USBMODE should be configured step by step */
        hw_write(ci, OP_USBMODE, USBMODE_CM, USBMODE_CM_IDLE);
        hw_write(ci, OP_USBMODE, USBMODE_CM, mode);
@@ -412,6 +420,9 @@ static int ci_get_platdata(struct device *dev,
                }
        }
 
+       if (of_usb_get_maximum_speed(dev->of_node) == USB_SPEED_FULL)
+               platdata->flags |= CI_HDRC_FORCE_FULLSPEED;
+
        return 0;
 }
 
index 708bd119627f30593b6df8443a3c15eeed74cd58..bbe779f640bed0c91869d527b67d9d797b8441b7 100644 (file)
@@ -25,6 +25,7 @@ struct ci_hdrc_platform_data {
         */
 #define CI_HDRC_DUAL_ROLE_NOT_OTG      BIT(4)
 #define CI_HDRC_IMX28_WRITE_FIX                BIT(5)
+#define CI_HDRC_FORCE_FULLSPEED                BIT(6)
        enum usb_dr_mode        dr_mode;
 #define CI_HDRC_CONTROLLER_RESET_EVENT         0
 #define CI_HDRC_CONTROLLER_STOPPED_EVENT       1