Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

usb: chipidea: udc: add maximum-speed = full-speed option

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>

authored by

Michael Grzeschik and committed by
Greg Kroah-Hartman
4f6743d5 fad56745

+16
+2
Documentation/devicetree/bindings/usb/ci-hdrc-imx.txt
··· 18 18 - vbus-supply: regulator for vbus 19 19 - disable-over-current: disable over current detect 20 20 - external-vbus-divider: enables off-chip resistor divider for Vbus 21 + - maximum-speed: limit the maximum connection speed to "full-speed". 21 22 22 23 Examples: 23 24 usb@02184000 { /* USB OTG */ ··· 29 28 fsl,usbmisc = <&usbmisc 0>; 30 29 disable-over-current; 31 30 external-vbus-divider; 31 + maximum-speed = "full-speed"; 32 32 };
+2
drivers/usb/chipidea/bits.h
··· 50 50 #define PORTSC_PTC (0x0FUL << 16) 51 51 #define PORTSC_PHCD(d) ((d) ? BIT(22) : BIT(23)) 52 52 /* PTS and PTW for non lpm version only */ 53 + #define PORTSC_PFSC BIT(24) 53 54 #define PORTSC_PTS(d) \ 54 55 (u32)((((d) & 0x3) << 30) | (((d) & 0x4) ? BIT(25) : 0)) 55 56 #define PORTSC_PTW BIT(28) 56 57 #define PORTSC_STS BIT(29) 57 58 58 59 /* DEVLC */ 60 + #define DEVLC_PFSC BIT(23) 59 61 #define DEVLC_PSPD (0x03UL << 25) 60 62 #define DEVLC_PSPD_HS (0x02UL << 25) 61 63 #define DEVLC_PTW BIT(27)
+11
drivers/usb/chipidea/core.c
··· 64 64 #include <linux/usb/otg.h> 65 65 #include <linux/usb/chipidea.h> 66 66 #include <linux/usb/of.h> 67 + #include <linux/of.h> 67 68 #include <linux/phy.h> 68 69 #include <linux/regulator/consumer.h> 69 70 ··· 299 298 if (ci->platdata->flags & CI_HDRC_DISABLE_STREAMING) 300 299 hw_write(ci, OP_USBMODE, USBMODE_CI_SDIS, USBMODE_CI_SDIS); 301 300 301 + if (ci->platdata->flags & CI_HDRC_FORCE_FULLSPEED) { 302 + if (ci->hw_bank.lpm) 303 + hw_write(ci, OP_DEVLC, DEVLC_PFSC, DEVLC_PFSC); 304 + else 305 + hw_write(ci, OP_PORTSC, PORTSC_PFSC, PORTSC_PFSC); 306 + } 307 + 302 308 /* USBMODE should be configured step by step */ 303 309 hw_write(ci, OP_USBMODE, USBMODE_CM, USBMODE_CM_IDLE); 304 310 hw_write(ci, OP_USBMODE, USBMODE_CM, mode); ··· 419 411 return PTR_ERR(platdata->reg_vbus); 420 412 } 421 413 } 414 + 415 + if (of_usb_get_maximum_speed(dev->of_node) == USB_SPEED_FULL) 416 + platdata->flags |= CI_HDRC_FORCE_FULLSPEED; 422 417 423 418 return 0; 424 419 }
+1
include/linux/usb/chipidea.h
··· 25 25 */ 26 26 #define CI_HDRC_DUAL_ROLE_NOT_OTG BIT(4) 27 27 #define CI_HDRC_IMX28_WRITE_FIX BIT(5) 28 + #define CI_HDRC_FORCE_FULLSPEED BIT(6) 28 29 enum usb_dr_mode dr_mode; 29 30 #define CI_HDRC_CONTROLLER_RESET_EVENT 0 30 31 #define CI_HDRC_CONTROLLER_STOPPED_EVENT 1