aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/devicetree/bindings/power/twl-charger.txt10
-rw-r--r--Documentation/devicetree/bindings/usb/dwc3-st.txt7
-rw-r--r--Documentation/devicetree/bindings/usb/dwc3.txt2
-rw-r--r--Documentation/devicetree/bindings/usb/msm-hsusb.txt11
-rw-r--r--Documentation/devicetree/bindings/usb/renesas_usbhs.txt7
-rw-r--r--Documentation/devicetree/bindings/usb/twlxxxx-usb.txt3
-rw-r--r--Documentation/usb/gadget-testing.txt4
-rw-r--r--MAINTAINERS7
-rw-r--r--drivers/phy/Kconfig7
-rw-r--r--drivers/phy/Makefile1
-rw-r--r--drivers/phy/phy-sun4i-usb.c9
-rw-r--r--drivers/phy/phy-tusb1210.c153
-rw-r--r--drivers/phy/ulpi_phy.h31
-rw-r--r--drivers/power/twl4030_charger.c21
-rw-r--r--drivers/usb/common/Makefile1
-rw-r--r--drivers/usb/common/ulpi.c255
-rw-r--r--drivers/usb/core/Kconfig20
-rw-r--r--drivers/usb/dwc2/Kconfig8
-rw-r--r--drivers/usb/dwc2/Makefile9
-rw-r--r--drivers/usb/dwc2/core.c439
-rw-r--r--drivers/usb/dwc2/core.h120
-rw-r--r--drivers/usb/dwc2/core_intr.c45
-rw-r--r--drivers/usb/dwc2/debug.h27
-rw-r--r--drivers/usb/dwc2/debugfs.c771
-rw-r--r--drivers/usb/dwc2/gadget.c459
-rw-r--r--drivers/usb/dwc2/hcd.c100
-rw-r--r--drivers/usb/dwc2/hcd.h7
-rw-r--r--drivers/usb/dwc2/hcd_intr.c66
-rw-r--r--drivers/usb/dwc2/hcd_queue.c18
-rw-r--r--drivers/usb/dwc2/platform.c25
-rw-r--r--drivers/usb/dwc3/Kconfig7
-rw-r--r--drivers/usb/dwc3/Makefile4
-rw-r--r--drivers/usb/dwc3/core.c108
-rw-r--r--drivers/usb/dwc3/core.h26
-rw-r--r--drivers/usb/dwc3/dwc3-pci.c36
-rw-r--r--drivers/usb/dwc3/gadget.c10
-rw-r--r--drivers/usb/dwc3/platform_data.h2
-rw-r--r--drivers/usb/dwc3/ulpi.c91
-rw-r--r--drivers/usb/gadget/epautoconf.c24
-rw-r--r--drivers/usb/gadget/function/f_fs.c10
-rw-r--r--drivers/usb/gadget/function/f_rndis.c60
-rw-r--r--drivers/usb/gadget/function/rndis.c352
-rw-r--r--drivers/usb/gadget/function/rndis.h33
-rw-r--r--drivers/usb/gadget/function/u_rndis.h2
-rw-r--r--drivers/usb/gadget/function/uvc.h1
-rw-r--r--drivers/usb/gadget/udc/atmel_usba_udc.c6
-rw-r--r--drivers/usb/gadget/udc/net2280.c140
-rw-r--r--drivers/usb/gadget/udc/s3c2410_udc.c28
-rw-r--r--drivers/usb/musb/am35x.c8
-rw-r--r--drivers/usb/musb/blackfin.c5
-rw-r--r--drivers/usb/musb/cppi_dma.c9
-rw-r--r--drivers/usb/musb/da8xx.c6
-rw-r--r--drivers/usb/musb/davinci.c7
-rw-r--r--drivers/usb/musb/jz4740.c6
-rw-r--r--drivers/usb/musb/musb_core.c89
-rw-r--r--drivers/usb/musb/musb_core.h28
-rw-r--r--drivers/usb/musb/musb_cppi41.c8
-rw-r--r--drivers/usb/musb/musb_debugfs.c100
-rw-r--r--drivers/usb/musb/musb_dma.h67
-rw-r--r--drivers/usb/musb/musb_dsps.c6
-rw-r--r--drivers/usb/musb/musb_gadget.c24
-rw-r--r--drivers/usb/musb/musb_host.c527
-rw-r--r--drivers/usb/musb/musb_io.h2
-rw-r--r--drivers/usb/musb/musb_regs.h80
-rw-r--r--drivers/usb/musb/musb_virthub.c2
-rw-r--r--drivers/usb/musb/musbhsdma.c9
-rw-r--r--drivers/usb/musb/omap2430.c5
-rw-r--r--drivers/usb/musb/tusb6010.c8
-rw-r--r--drivers/usb/musb/tusb6010.h6
-rw-r--r--drivers/usb/musb/tusb6010_omap.c9
-rw-r--r--drivers/usb/musb/ux500.c8
-rw-r--r--drivers/usb/musb/ux500_dma.c8
-rw-r--r--drivers/usb/phy/Kconfig3
-rw-r--r--drivers/usb/phy/phy-msm-usb.c110
-rw-r--r--drivers/usb/phy/phy.c97
-rw-r--r--drivers/usb/renesas_usbhs/common.c19
-rw-r--r--drivers/usb/renesas_usbhs/fifo.c24
-rw-r--r--drivers/usb/renesas_usbhs/fifo.h9
-rw-r--r--drivers/usb/renesas_usbhs/mod.c63
-rw-r--r--include/linux/mod_devicetable.h6
-rw-r--r--include/linux/phy/phy-sun4i-usb.h26
-rw-r--r--include/linux/ulpi/driver.h60
-rw-r--r--include/linux/ulpi/interface.h23
-rw-r--r--include/linux/ulpi/regs.h130
-rw-r--r--include/linux/usb/msm_hsusb.h22
-rw-r--r--include/linux/usb/msm_hsusb_hw.h9
-rw-r--r--include/linux/usb/net2280.h3
-rw-r--r--include/linux/usb/phy.h8
-rw-r--r--include/linux/usb/renesas_usbhs.h3
-rw-r--r--include/linux/usb/ulpi.h134
-rw-r--r--include/linux/usb/usb338x.h4
-rw-r--r--scripts/mod/devicetable-offsets.c4
-rw-r--r--scripts/mod/file2alias.c13
93 files changed, 3958 insertions, 1422 deletions
diff --git a/Documentation/devicetree/bindings/power/twl-charger.txt b/Documentation/devicetree/bindings/power/twl-charger.txt
index d5c706216df5..3b4ea1b73b38 100644
--- a/Documentation/devicetree/bindings/power/twl-charger.txt
+++ b/Documentation/devicetree/bindings/power/twl-charger.txt
@@ -1,5 +1,15 @@
1TWL BCI (Battery Charger Interface) 1TWL BCI (Battery Charger Interface)
2 2
3The battery charger needs to interact with the USB phy in order
4to know when charging is permissible, and when there is a connection
5or disconnection.
6
7The choice of phy cannot be configured at a hardware level, so there
8is no value in explicit configuration in device-tree. Rather
9if there is a sibling of the BCI node which is compatible with
10"ti,twl4030-usb", then that is used to determine when and how
11use USB power for charging.
12
3Required properties: 13Required properties:
4- compatible: 14- compatible:
5 - "ti,twl4030-bci" 15 - "ti,twl4030-bci"
diff --git a/Documentation/devicetree/bindings/usb/dwc3-st.txt b/Documentation/devicetree/bindings/usb/dwc3-st.txt
index f9d70252bbb2..01c71b1258f4 100644
--- a/Documentation/devicetree/bindings/usb/dwc3-st.txt
+++ b/Documentation/devicetree/bindings/usb/dwc3-st.txt
@@ -49,8 +49,7 @@ st_dwc3: dwc3@8f94000 {
49 st,syscfg = <&syscfg_core>; 49 st,syscfg = <&syscfg_core>;
50 resets = <&powerdown STIH407_USB3_POWERDOWN>, 50 resets = <&powerdown STIH407_USB3_POWERDOWN>,
51 <&softreset STIH407_MIPHY2_SOFTRESET>; 51 <&softreset STIH407_MIPHY2_SOFTRESET>;
52 reset-names = "powerdown", 52 reset-names = "powerdown", "softreset";
53 "softreset";
54 #address-cells = <1>; 53 #address-cells = <1>;
55 #size-cells = <1>; 54 #size-cells = <1>;
56 pinctrl-names = "default"; 55 pinctrl-names = "default";
@@ -62,7 +61,7 @@ st_dwc3: dwc3@8f94000 {
62 reg = <0x09900000 0x100000>; 61 reg = <0x09900000 0x100000>;
63 interrupts = <GIC_SPI 155 IRQ_TYPE_NONE>; 62 interrupts = <GIC_SPI 155 IRQ_TYPE_NONE>;
64 dr_mode = "host"; 63 dr_mode = "host";
65 phys-names = "usb2-phy", "usb3-phy"; 64 phy-names = "usb2-phy", "usb3-phy";
66 phys = <&usb2_picophy2>, <&phy_port2 MIPHY_TYPE_USB>; 65 phys = <&usb2_picophy2>, <&phy_port2 PHY_TYPE_USB3>;
67 }; 66 };
68}; 67};
diff --git a/Documentation/devicetree/bindings/usb/dwc3.txt b/Documentation/devicetree/bindings/usb/dwc3.txt
index 5cc364309edb..0815eac5b185 100644
--- a/Documentation/devicetree/bindings/usb/dwc3.txt
+++ b/Documentation/devicetree/bindings/usb/dwc3.txt
@@ -38,6 +38,8 @@ Optional properties:
38 - snps,is-utmi-l1-suspend: true when DWC3 asserts output signal 38 - snps,is-utmi-l1-suspend: true when DWC3 asserts output signal
39 utmi_l1_suspend_n, false when asserts utmi_sleep_n 39 utmi_l1_suspend_n, false when asserts utmi_sleep_n
40 - snps,hird-threshold: HIRD threshold 40 - snps,hird-threshold: HIRD threshold
41 - snps,hsphy_interface: High-Speed PHY interface selection between "utmi" for
42 UTMI+ and "ulpi" for ULPI when the DWC_USB3_HSPHY_INTERFACE has value 3.
41 43
42This is usually a subnode to DWC3 glue to which it is connected. 44This is usually a subnode to DWC3 glue to which it is connected.
43 45
diff --git a/Documentation/devicetree/bindings/usb/msm-hsusb.txt b/Documentation/devicetree/bindings/usb/msm-hsusb.txt
index 2826f2af503a..bd8d9e753029 100644
--- a/Documentation/devicetree/bindings/usb/msm-hsusb.txt
+++ b/Documentation/devicetree/bindings/usb/msm-hsusb.txt
@@ -69,6 +69,17 @@ Optional properties:
69 (no, min, max) where each value represents either a voltage 69 (no, min, max) where each value represents either a voltage
70 in microvolts or a value corresponding to voltage corner. 70 in microvolts or a value corresponding to voltage corner.
71 71
72- qcom,manual-pullup: If present, vbus is not routed to USB controller/phy
73 and controller driver therefore enables pull-up explicitly
74 before starting controller using usbcmd run/stop bit.
75
76- extcon: phandles to external connector devices. First phandle
77 should point to external connector, which provide "USB"
78 cable events, the second should point to external connector
79 device, which provide "USB-HOST" cable events. If one of
80 the external connector devices is not required empty <0>
81 phandle should be specified.
82
72Example HSUSB OTG controller device node: 83Example HSUSB OTG controller device node:
73 84
74 usb@f9a55000 { 85 usb@f9a55000 {
diff --git a/Documentation/devicetree/bindings/usb/renesas_usbhs.txt b/Documentation/devicetree/bindings/usb/renesas_usbhs.txt
index dc2a18f0b3a1..64a4ca6cf96f 100644
--- a/Documentation/devicetree/bindings/usb/renesas_usbhs.txt
+++ b/Documentation/devicetree/bindings/usb/renesas_usbhs.txt
@@ -4,6 +4,7 @@ Required properties:
4 - compatible: Must contain one of the following: 4 - compatible: Must contain one of the following:
5 - "renesas,usbhs-r8a7790" 5 - "renesas,usbhs-r8a7790"
6 - "renesas,usbhs-r8a7791" 6 - "renesas,usbhs-r8a7791"
7 - "renesas,usbhs-r8a7794"
7 - reg: Base address and length of the register for the USBHS 8 - reg: Base address and length of the register for the USBHS
8 - interrupts: Interrupt specifier for the USBHS 9 - interrupts: Interrupt specifier for the USBHS
9 - clocks: A list of phandle + clock specifier pairs 10 - clocks: A list of phandle + clock specifier pairs
@@ -15,10 +16,8 @@ Optional properties:
15 - phys: phandle + phy specifier pair 16 - phys: phandle + phy specifier pair
16 - phy-names: must be "usb" 17 - phy-names: must be "usb"
17 - dmas: Must contain a list of references to DMA specifiers. 18 - dmas: Must contain a list of references to DMA specifiers.
18 - dma-names : Must contain a list of DMA names: 19 - dma-names : named "ch%d", where %d is the channel number ranging from zero
19 - tx0 ... tx<n> 20 to the number of channels (DnFIFOs) minus one.
20 - rx0 ... rx<n>
21 - This <n> means DnFIFO in USBHS module.
22 21
23Example: 22Example:
24 usbhs: usb@e6590000 { 23 usbhs: usb@e6590000 {
diff --git a/Documentation/devicetree/bindings/usb/twlxxxx-usb.txt b/Documentation/devicetree/bindings/usb/twlxxxx-usb.txt
index 0aee0ad3f035..17327a296110 100644
--- a/Documentation/devicetree/bindings/usb/twlxxxx-usb.txt
+++ b/Documentation/devicetree/bindings/usb/twlxxxx-usb.txt
@@ -30,6 +30,9 @@ TWL4030 USB PHY AND COMPARATOR
30 - usb_mode : The mode used by the phy to connect to the controller. "1" 30 - usb_mode : The mode used by the phy to connect to the controller. "1"
31 specifies "ULPI" mode and "2" specifies "CEA2011_3PIN" mode. 31 specifies "ULPI" mode and "2" specifies "CEA2011_3PIN" mode.
32 32
33If a sibling node is compatible "ti,twl4030-bci", then it will find
34this device and query it for USB power status.
35
33twl4030-usb { 36twl4030-usb {
34 compatible = "ti,twl4030-usb"; 37 compatible = "ti,twl4030-usb";
35 interrupts = < 10 4 >; 38 interrupts = < 10 4 >;
diff --git a/Documentation/usb/gadget-testing.txt b/Documentation/usb/gadget-testing.txt
index f45b2bf4b41d..592678009c15 100644
--- a/Documentation/usb/gadget-testing.txt
+++ b/Documentation/usb/gadget-testing.txt
@@ -526,8 +526,6 @@ Except for ifname they can be written to until the function is linked to a
526configuration. The ifname is read-only and contains the name of the interface 526configuration. The ifname is read-only and contains the name of the interface
527which was assigned by the net core, e. g. usb0. 527which was assigned by the net core, e. g. usb0.
528 528
529By default there can be only 1 RNDIS interface in the system.
530
531Testing the RNDIS function 529Testing the RNDIS function
532-------------------------- 530--------------------------
533 531
@@ -629,7 +627,7 @@ Function-specific configfs interface
629The function name to use when creating the function directory is "uac2". 627The function name to use when creating the function directory is "uac2".
630The uac2 function provides these attributes in its function directory: 628The uac2 function provides these attributes in its function directory:
631 629
632 chmask - capture channel mask 630 c_chmask - capture channel mask
633 c_srate - capture sampling rate 631 c_srate - capture sampling rate
634 c_ssize - capture sample size (bytes) 632 c_ssize - capture sample size (bytes)
635 p_chmask - playback channel mask 633 p_chmask - playback channel mask
diff --git a/MAINTAINERS b/MAINTAINERS
index f8e0afb708b4..3b9d25f08cb5 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -10489,6 +10489,13 @@ S: Maintained
10489F: Documentation/video4linux/zr364xx.txt 10489F: Documentation/video4linux/zr364xx.txt
10490F: drivers/media/usb/zr364xx/ 10490F: drivers/media/usb/zr364xx/
10491 10491
10492ULPI BUS
10493M: Heikki Krogerus <heikki.krogerus@linux.intel.com>
10494L: linux-usb@vger.kernel.org
10495S: Maintained
10496F: drivers/usb/common/ulpi.c
10497F: include/linux/ulpi/
10498
10492USER-MODE LINUX (UML) 10499USER-MODE LINUX (UML)
10493M: Jeff Dike <jdike@addtoit.com> 10500M: Jeff Dike <jdike@addtoit.com>
10494M: Richard Weinberger <richard@nod.at> 10501M: Richard Weinberger <richard@nod.at>
diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig
index a53bd5b52df9..fceac96c2a31 100644
--- a/drivers/phy/Kconfig
+++ b/drivers/phy/Kconfig
@@ -309,4 +309,11 @@ config PHY_QCOM_UFS
309 help 309 help
310 Support for UFS PHY on QCOM chipsets. 310 Support for UFS PHY on QCOM chipsets.
311 311
312config PHY_TUSB1210
313 tristate "TI TUSB1210 ULPI PHY module"
314 depends on USB_ULPI_BUS
315 select GENERIC_PHY
316 help
317 Support for TI TUSB1210 USB ULPI PHY.
318
312endmenu 319endmenu
diff --git a/drivers/phy/Makefile b/drivers/phy/Makefile
index f12625178780..0a2041803135 100644
--- a/drivers/phy/Makefile
+++ b/drivers/phy/Makefile
@@ -40,3 +40,4 @@ obj-$(CONFIG_PHY_STIH41X_USB) += phy-stih41x-usb.o
40obj-$(CONFIG_PHY_QCOM_UFS) += phy-qcom-ufs.o 40obj-$(CONFIG_PHY_QCOM_UFS) += phy-qcom-ufs.o
41obj-$(CONFIG_PHY_QCOM_UFS) += phy-qcom-ufs-qmp-20nm.o 41obj-$(CONFIG_PHY_QCOM_UFS) += phy-qcom-ufs-qmp-20nm.o
42obj-$(CONFIG_PHY_QCOM_UFS) += phy-qcom-ufs-qmp-14nm.o 42obj-$(CONFIG_PHY_QCOM_UFS) += phy-qcom-ufs-qmp-14nm.o
43obj-$(CONFIG_PHY_TUSB1210) += phy-tusb1210.o
diff --git a/drivers/phy/phy-sun4i-usb.c b/drivers/phy/phy-sun4i-usb.c
index a2b08f3ccb03..e17c539e4f6f 100644
--- a/drivers/phy/phy-sun4i-usb.c
+++ b/drivers/phy/phy-sun4i-usb.c
@@ -30,6 +30,7 @@
30#include <linux/of.h> 30#include <linux/of.h>
31#include <linux/of_address.h> 31#include <linux/of_address.h>
32#include <linux/phy/phy.h> 32#include <linux/phy/phy.h>
33#include <linux/phy/phy-sun4i-usb.h>
33#include <linux/platform_device.h> 34#include <linux/platform_device.h>
34#include <linux/regulator/consumer.h> 35#include <linux/regulator/consumer.h>
35#include <linux/reset.h> 36#include <linux/reset.h>
@@ -58,6 +59,7 @@
58#define PHY_OTG_FUNC_EN 0x28 59#define PHY_OTG_FUNC_EN 0x28
59#define PHY_VBUS_DET_EN 0x29 60#define PHY_VBUS_DET_EN 0x29
60#define PHY_DISCON_TH_SEL 0x2a 61#define PHY_DISCON_TH_SEL 0x2a
62#define PHY_SQUELCH_DETECT 0x3c
61 63
62#define MAX_PHYS 3 64#define MAX_PHYS 3
63 65
@@ -204,6 +206,13 @@ static int sun4i_usb_phy_power_off(struct phy *_phy)
204 return 0; 206 return 0;
205} 207}
206 208
209void sun4i_usb_phy_set_squelch_detect(struct phy *_phy, bool enabled)
210{
211 struct sun4i_usb_phy *phy = phy_get_drvdata(_phy);
212
213 sun4i_usb_phy_write(phy, PHY_SQUELCH_DETECT, enabled ? 0 : 2, 2);
214}
215
207static struct phy_ops sun4i_usb_phy_ops = { 216static struct phy_ops sun4i_usb_phy_ops = {
208 .init = sun4i_usb_phy_init, 217 .init = sun4i_usb_phy_init,
209 .exit = sun4i_usb_phy_exit, 218 .exit = sun4i_usb_phy_exit,
diff --git a/drivers/phy/phy-tusb1210.c b/drivers/phy/phy-tusb1210.c
new file mode 100644
index 000000000000..07efdd318bdc
--- /dev/null
+++ b/drivers/phy/phy-tusb1210.c
@@ -0,0 +1,153 @@
1/**
2 * tusb1210.c - TUSB1210 USB ULPI PHY driver
3 *
4 * Copyright (C) 2015 Intel Corporation
5 *
6 * Author: Heikki Krogerus <heikki.krogerus@linux.intel.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 */
12#include <linux/module.h>
13#include <linux/ulpi/driver.h>
14#include <linux/gpio/consumer.h>
15
16#include "ulpi_phy.h"
17
18#define TUSB1210_VENDOR_SPECIFIC2 0x80
19#define TUSB1210_VENDOR_SPECIFIC2_IHSTX_SHIFT 0
20#define TUSB1210_VENDOR_SPECIFIC2_ZHSDRV_SHIFT 4
21#define TUSB1210_VENDOR_SPECIFIC2_DP_SHIFT 6
22
23struct tusb1210 {
24 struct ulpi *ulpi;
25 struct phy *phy;
26 struct gpio_desc *gpio_reset;
27 struct gpio_desc *gpio_cs;
28 u8 vendor_specific2;
29};
30
31static int tusb1210_power_on(struct phy *phy)
32{
33 struct tusb1210 *tusb = phy_get_drvdata(phy);
34
35 gpiod_set_value_cansleep(tusb->gpio_reset, 1);
36 gpiod_set_value_cansleep(tusb->gpio_cs, 1);
37
38 /* Restore the optional eye diagram optimization value */
39 if (tusb->vendor_specific2)
40 ulpi_write(tusb->ulpi, TUSB1210_VENDOR_SPECIFIC2,
41 tusb->vendor_specific2);
42
43 return 0;
44}
45
46static int tusb1210_power_off(struct phy *phy)
47{
48 struct tusb1210 *tusb = phy_get_drvdata(phy);
49
50 gpiod_set_value_cansleep(tusb->gpio_reset, 0);
51 gpiod_set_value_cansleep(tusb->gpio_cs, 0);
52
53 return 0;
54}
55
56static struct phy_ops phy_ops = {
57 .power_on = tusb1210_power_on,
58 .power_off = tusb1210_power_off,
59 .owner = THIS_MODULE,
60};
61
62static int tusb1210_probe(struct ulpi *ulpi)
63{
64 struct gpio_desc *gpio;
65 struct tusb1210 *tusb;
66 u8 val, reg;
67 int ret;
68
69 tusb = devm_kzalloc(&ulpi->dev, sizeof(*tusb), GFP_KERNEL);
70 if (!tusb)
71 return -ENOMEM;
72
73 gpio = devm_gpiod_get(&ulpi->dev, "reset");
74 if (!IS_ERR(gpio)) {
75 ret = gpiod_direction_output(gpio, 0);
76 if (ret)
77 return ret;
78 gpiod_set_value_cansleep(gpio, 1);
79 tusb->gpio_reset = gpio;
80 }
81
82 gpio = devm_gpiod_get(&ulpi->dev, "cs");
83 if (!IS_ERR(gpio)) {
84 ret = gpiod_direction_output(gpio, 0);
85 if (ret)
86 return ret;
87 gpiod_set_value_cansleep(gpio, 1);
88 tusb->gpio_cs = gpio;
89 }
90
91 /*
92 * VENDOR_SPECIFIC2 register in TUSB1210 can be used for configuring eye
93 * diagram optimization and DP/DM swap.
94 */
95
96 /* High speed output drive strength configuration */
97 device_property_read_u8(&ulpi->dev, "ihstx", &val);
98 reg = val << TUSB1210_VENDOR_SPECIFIC2_IHSTX_SHIFT;
99
100 /* High speed output impedance configuration */
101 device_property_read_u8(&ulpi->dev, "zhsdrv", &val);
102 reg |= val << TUSB1210_VENDOR_SPECIFIC2_ZHSDRV_SHIFT;
103
104 /* DP/DM swap control */
105 device_property_read_u8(&ulpi->dev, "datapolarity", &val);
106 reg |= val << TUSB1210_VENDOR_SPECIFIC2_DP_SHIFT;
107
108 if (reg) {
109 ulpi_write(ulpi, TUSB1210_VENDOR_SPECIFIC2, reg);
110 tusb->vendor_specific2 = reg;
111 }
112
113 tusb->phy = ulpi_phy_create(ulpi, &phy_ops);
114 if (IS_ERR(tusb->phy))
115 return PTR_ERR(tusb->phy);
116
117 tusb->ulpi = ulpi;
118
119 phy_set_drvdata(tusb->phy, tusb);
120 ulpi_set_drvdata(ulpi, tusb);
121 return 0;
122}
123
124static void tusb1210_remove(struct ulpi *ulpi)
125{
126 struct tusb1210 *tusb = ulpi_get_drvdata(ulpi);
127
128 ulpi_phy_destroy(ulpi, tusb->phy);
129}
130
131#define TI_VENDOR_ID 0x0451
132
133static const struct ulpi_device_id tusb1210_ulpi_id[] = {
134 { TI_VENDOR_ID, 0x1507, },
135 { },
136};
137MODULE_DEVICE_TABLE(ulpi, tusb1210_ulpi_id);
138
139static struct ulpi_driver tusb1210_driver = {
140 .id_table = tusb1210_ulpi_id,
141 .probe = tusb1210_probe,
142 .remove = tusb1210_remove,
143 .driver = {
144 .name = "tusb1210",
145 .owner = THIS_MODULE,
146 },
147};
148
149module_ulpi_driver(tusb1210_driver);
150
151MODULE_AUTHOR("Intel Corporation");
152MODULE_LICENSE("GPL v2");
153MODULE_DESCRIPTION("TUSB1210 ULPI PHY driver");
diff --git a/drivers/phy/ulpi_phy.h b/drivers/phy/ulpi_phy.h
new file mode 100644
index 000000000000..ac49fb6285ee
--- /dev/null
+++ b/drivers/phy/ulpi_phy.h
@@ -0,0 +1,31 @@
1#include <linux/phy/phy.h>
2
3/**
4 * Helper that registers PHY for a ULPI device and adds a lookup for binding it
5 * and it's controller, which is always the parent.
6 */
7static inline struct phy
8*ulpi_phy_create(struct ulpi *ulpi, struct phy_ops *ops)
9{
10 struct phy *phy;
11 int ret;
12
13 phy = phy_create(&ulpi->dev, NULL, ops);
14 if (IS_ERR(phy))
15 return phy;
16
17 ret = phy_create_lookup(phy, "usb2-phy", dev_name(ulpi->dev.parent));
18 if (ret) {
19 phy_destroy(phy);
20 return ERR_PTR(ret);
21 }
22
23 return phy;
24}
25
26/* Remove a PHY that was created with ulpi_phy_create() and it's lookup. */
27static inline void ulpi_phy_destroy(struct ulpi *ulpi, struct phy *phy)
28{
29 phy_remove_lookup(phy, "usb2-phy", dev_name(ulpi->dev.parent));
30 phy_destroy(phy);
31}
diff --git a/drivers/power/twl4030_charger.c b/drivers/power/twl4030_charger.c
index 02a522cb7753..022b8910e443 100644
--- a/drivers/power/twl4030_charger.c
+++ b/drivers/power/twl4030_charger.c
@@ -638,10 +638,15 @@ static int __init twl4030_bci_probe(struct platform_device *pdev)
638 638
639 INIT_WORK(&bci->work, twl4030_bci_usb_work); 639 INIT_WORK(&bci->work, twl4030_bci_usb_work);
640 640
641 bci->transceiver = usb_get_phy(USB_PHY_TYPE_USB2); 641 bci->usb_nb.notifier_call = twl4030_bci_usb_ncb;
642 if (!IS_ERR_OR_NULL(bci->transceiver)) { 642 if (bci->dev->of_node) {
643 bci->usb_nb.notifier_call = twl4030_bci_usb_ncb; 643 struct device_node *phynode;
644 usb_register_notifier(bci->transceiver, &bci->usb_nb); 644
645 phynode = of_find_compatible_node(bci->dev->of_node->parent,
646 NULL, "ti,twl4030-usb");
647 if (phynode)
648 bci->transceiver = devm_usb_get_phy_by_node(
649 bci->dev, phynode, &bci->usb_nb);
645 } 650 }
646 651
647 /* Enable interrupts now. */ 652 /* Enable interrupts now. */
@@ -671,10 +676,6 @@ static int __init twl4030_bci_probe(struct platform_device *pdev)
671 return 0; 676 return 0;
672 677
673fail_unmask_interrupts: 678fail_unmask_interrupts:
674 if (!IS_ERR_OR_NULL(bci->transceiver)) {
675 usb_unregister_notifier(bci->transceiver, &bci->usb_nb);
676 usb_put_phy(bci->transceiver);
677 }
678 free_irq(bci->irq_bci, bci); 679 free_irq(bci->irq_bci, bci);
679fail_bci_irq: 680fail_bci_irq:
680 free_irq(bci->irq_chg, bci); 681 free_irq(bci->irq_chg, bci);
@@ -703,10 +704,6 @@ static int __exit twl4030_bci_remove(struct platform_device *pdev)
703 twl_i2c_write_u8(TWL4030_MODULE_INTERRUPTS, 0xff, 704 twl_i2c_write_u8(TWL4030_MODULE_INTERRUPTS, 0xff,
704 TWL4030_INTERRUPTS_BCIIMR2A); 705 TWL4030_INTERRUPTS_BCIIMR2A);
705 706
706 if (!IS_ERR_OR_NULL(bci->transceiver)) {
707 usb_unregister_notifier(bci->transceiver, &bci->usb_nb);
708 usb_put_phy(bci->transceiver);
709 }
710 free_irq(bci->irq_bci, bci); 707 free_irq(bci->irq_bci, bci);
711 free_irq(bci->irq_chg, bci); 708 free_irq(bci->irq_chg, bci);
712 power_supply_unregister(bci->usb); 709 power_supply_unregister(bci->usb);
diff --git a/drivers/usb/common/Makefile b/drivers/usb/common/Makefile
index ca2f8bd0e431..6bbb3ec17018 100644
--- a/drivers/usb/common/Makefile
+++ b/drivers/usb/common/Makefile
@@ -7,3 +7,4 @@ usb-common-y += common.o
7usb-common-$(CONFIG_USB_LED_TRIG) += led.o 7usb-common-$(CONFIG_USB_LED_TRIG) += led.o
8 8
9obj-$(CONFIG_USB_OTG_FSM) += usb-otg-fsm.o 9obj-$(CONFIG_USB_OTG_FSM) += usb-otg-fsm.o
10obj-$(CONFIG_USB_ULPI_BUS) += ulpi.o
diff --git a/drivers/usb/common/ulpi.c b/drivers/usb/common/ulpi.c
new file mode 100644
index 000000000000..0e6f968e93fe
--- /dev/null
+++ b/drivers/usb/common/ulpi.c
@@ -0,0 +1,255 @@
1/**
2 * ulpi.c - USB ULPI PHY bus
3 *
4 * Copyright (C) 2015 Intel Corporation
5 *
6 * Author: Heikki Krogerus <heikki.krogerus@linux.intel.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 */
12
13#include <linux/ulpi/interface.h>
14#include <linux/ulpi/driver.h>
15#include <linux/ulpi/regs.h>
16#include <linux/module.h>
17#include <linux/slab.h>
18#include <linux/acpi.h>
19
20/* -------------------------------------------------------------------------- */
21
22int ulpi_read(struct ulpi *ulpi, u8 addr)
23{
24 return ulpi->ops->read(ulpi->ops, addr);
25}
26EXPORT_SYMBOL_GPL(ulpi_read);
27
28int ulpi_write(struct ulpi *ulpi, u8 addr, u8 val)
29{
30 return ulpi->ops->write(ulpi->ops, addr, val);
31}
32EXPORT_SYMBOL_GPL(ulpi_write);
33
34/* -------------------------------------------------------------------------- */
35
36static int ulpi_match(struct device *dev, struct device_driver *driver)
37{
38 struct ulpi_driver *drv = to_ulpi_driver(driver);
39 struct ulpi *ulpi = to_ulpi_dev(dev);
40 const struct ulpi_device_id *id;
41
42 for (id = drv->id_table; id->vendor; id++)
43 if (id->vendor == ulpi->id.vendor &&
44 id->product == ulpi->id.product)
45 return 1;
46
47 return 0;
48}
49
50static int ulpi_uevent(struct device *dev, struct kobj_uevent_env *env)
51{
52 struct ulpi *ulpi = to_ulpi_dev(dev);
53
54 if (add_uevent_var(env, "MODALIAS=ulpi:v%04xp%04x",
55 ulpi->id.vendor, ulpi->id.product))
56 return -ENOMEM;
57 return 0;
58}
59
60static int ulpi_probe(struct device *dev)
61{
62 struct ulpi_driver *drv = to_ulpi_driver(dev->driver);
63
64 return drv->probe(to_ulpi_dev(dev));
65}
66
67static int ulpi_remove(struct device *dev)
68{
69 struct ulpi_driver *drv = to_ulpi_driver(dev->driver);
70
71 if (drv->remove)
72 drv->remove(to_ulpi_dev(dev));
73
74 return 0;
75}
76
77static struct bus_type ulpi_bus = {
78 .name = "ulpi",
79 .match = ulpi_match,
80 .uevent = ulpi_uevent,
81 .probe = ulpi_probe,
82 .remove = ulpi_remove,
83};
84
85/* -------------------------------------------------------------------------- */
86
87static ssize_t modalias_show(struct device *dev, struct device_attribute *attr,
88 char *buf)
89{
90 struct ulpi *ulpi = to_ulpi_dev(dev);
91
92 return sprintf(buf, "ulpi:v%04xp%04x\n",
93 ulpi->id.vendor, ulpi->id.product);
94}
95static DEVICE_ATTR_RO(modalias);
96
97static struct attribute *ulpi_dev_attrs[] = {
98 &dev_attr_modalias.attr,
99 NULL
100};
101
102static struct attribute_group ulpi_dev_attr_group = {
103 .attrs = ulpi_dev_attrs,
104};
105
106static const struct attribute_group *ulpi_dev_attr_groups[] = {
107 &ulpi_dev_attr_group,
108 NULL
109};
110
111static void ulpi_dev_release(struct device *dev)
112{
113 kfree(to_ulpi_dev(dev));
114}
115
116static struct device_type ulpi_dev_type = {
117 .name = "ulpi_device",
118 .groups = ulpi_dev_attr_groups,
119 .release = ulpi_dev_release,
120};
121
122/* -------------------------------------------------------------------------- */
123
124/**
125 * ulpi_register_driver - register a driver with the ULPI bus
126 * @drv: driver being registered
127 *
128 * Registers a driver with the ULPI bus.
129 */
130int ulpi_register_driver(struct ulpi_driver *drv)
131{
132 if (!drv->probe)
133 return -EINVAL;
134
135 drv->driver.bus = &ulpi_bus;
136
137 return driver_register(&drv->driver);
138}
139EXPORT_SYMBOL_GPL(ulpi_register_driver);
140
141/**
142 * ulpi_unregister_driver - unregister a driver with the ULPI bus
143 * @drv: driver to unregister
144 *
145 * Unregisters a driver with the ULPI bus.
146 */
147void ulpi_unregister_driver(struct ulpi_driver *drv)
148{
149 driver_unregister(&drv->driver);
150}
151EXPORT_SYMBOL_GPL(ulpi_unregister_driver);
152
153/* -------------------------------------------------------------------------- */
154
155static int ulpi_register(struct device *dev, struct ulpi *ulpi)
156{
157 int ret;
158
159 /* Test the interface */
160 ret = ulpi_write(ulpi, ULPI_SCRATCH, 0xaa);
161 if (ret < 0)
162 return ret;
163
164 ret = ulpi_read(ulpi, ULPI_SCRATCH);
165 if (ret < 0)
166 return ret;
167
168 if (ret != 0xaa)
169 return -ENODEV;
170
171 ulpi->id.vendor = ulpi_read(ulpi, ULPI_VENDOR_ID_LOW);
172 ulpi->id.vendor |= ulpi_read(ulpi, ULPI_VENDOR_ID_HIGH) << 8;
173
174 ulpi->id.product = ulpi_read(ulpi, ULPI_PRODUCT_ID_LOW);
175 ulpi->id.product |= ulpi_read(ulpi, ULPI_PRODUCT_ID_HIGH) << 8;
176
177 ulpi->dev.parent = dev;
178 ulpi->dev.bus = &ulpi_bus;
179 ulpi->dev.type = &ulpi_dev_type;
180 dev_set_name(&ulpi->dev, "%s.ulpi", dev_name(dev));
181
182 ACPI_COMPANION_SET(&ulpi->dev, ACPI_COMPANION(dev));
183
184 request_module("ulpi:v%04xp%04x", ulpi->id.vendor, ulpi->id.product);
185
186 ret = device_register(&ulpi->dev);
187 if (ret)
188 return ret;
189
190 dev_dbg(&ulpi->dev, "registered ULPI PHY: vendor %04x, product %04x\n",
191 ulpi->id.vendor, ulpi->id.product);
192
193 return 0;
194}
195
196/**
197 * ulpi_register_interface - instantiate new ULPI device
198 * @dev: USB controller's device interface
199 * @ops: ULPI register access
200 *
201 * Allocates and registers a ULPI device and an interface for it. Called from
202 * the USB controller that provides the ULPI interface.
203 */
204struct ulpi *ulpi_register_interface(struct device *dev, struct ulpi_ops *ops)
205{
206 struct ulpi *ulpi;
207 int ret;
208
209 ulpi = kzalloc(sizeof(*ulpi), GFP_KERNEL);
210 if (!ulpi)
211 return ERR_PTR(-ENOMEM);
212
213 ulpi->ops = ops;
214 ops->dev = dev;
215
216 ret = ulpi_register(dev, ulpi);
217 if (ret) {
218 kfree(ulpi);
219 return ERR_PTR(ret);
220 }
221
222 return ulpi;
223}
224EXPORT_SYMBOL_GPL(ulpi_register_interface);
225
226/**
227 * ulpi_unregister_interface - unregister ULPI interface
228 * @intrf: struct ulpi_interface
229 *
230 * Unregisters a ULPI device and it's interface that was created with
231 * ulpi_create_interface().
232 */
233void ulpi_unregister_interface(struct ulpi *ulpi)
234{
235 device_unregister(&ulpi->dev);
236}
237EXPORT_SYMBOL_GPL(ulpi_unregister_interface);
238
239/* -------------------------------------------------------------------------- */
240
241static int __init ulpi_init(void)
242{
243 return bus_register(&ulpi_bus);
244}
245module_init(ulpi_init);
246
247static void __exit ulpi_exit(void)
248{
249 bus_unregister(&ulpi_bus);
250}
251module_exit(ulpi_exit);
252
253MODULE_AUTHOR("Intel Corporation");
254MODULE_LICENSE("GPL v2");
255MODULE_DESCRIPTION("USB ULPI PHY bus");
diff --git a/drivers/usb/core/Kconfig b/drivers/usb/core/Kconfig
index cc0ced08bae2..a99c89e78126 100644
--- a/drivers/usb/core/Kconfig
+++ b/drivers/usb/core/Kconfig
@@ -84,3 +84,23 @@ config USB_OTG_FSM
84 Implements OTG Finite State Machine as specified in On-The-Go 84 Implements OTG Finite State Machine as specified in On-The-Go
85 and Embedded Host Supplement to the USB Revision 2.0 Specification. 85 and Embedded Host Supplement to the USB Revision 2.0 Specification.
86 86
87config USB_ULPI_BUS
88 tristate "USB ULPI PHY interface support"
89 depends on USB_SUPPORT
90 help
91 UTMI+ Low Pin Interface (ULPI) is specification for a commonly used
92 USB 2.0 PHY interface. The ULPI specification defines a standard set
93 of registers that can be used to detect the vendor and product which
94 allows ULPI to be handled as a bus. This module is the driver for that
95 bus.
96
97 The ULPI interfaces (the buses) are registered by the drivers for USB
98 controllers which support ULPI register access and have ULPI PHY
99 attached to them. The ULPI PHY drivers themselves are normal PHY
100 drivers.
101
102 ULPI PHYs provide often functions such as ADP sensing/probing (OTG
103 protocol) and USB charger detection.
104
105 To compile this driver as a module, choose M here: the module will
106 be called ulpi.
diff --git a/drivers/usb/dwc2/Kconfig b/drivers/usb/dwc2/Kconfig
index 1bcb36ae6505..fd95ba6ec317 100644
--- a/drivers/usb/dwc2/Kconfig
+++ b/drivers/usb/dwc2/Kconfig
@@ -50,18 +50,10 @@ config USB_DWC2_DUAL_ROLE
50 option requires USB_GADGET to be enabled. 50 option requires USB_GADGET to be enabled.
51endchoice 51endchoice
52 52
53config USB_DWC2_PLATFORM
54 tristate "DWC2 Platform"
55 default USB_DWC2_HOST || USB_DWC2_PERIPHERAL
56 help
57 The Designware USB2.0 platform interface module for
58 controllers directly connected to the CPU.
59
60config USB_DWC2_PCI 53config USB_DWC2_PCI
61 tristate "DWC2 PCI" 54 tristate "DWC2 PCI"
62 depends on PCI 55 depends on PCI
63 default n 56 default n
64 select USB_DWC2_PLATFORM
65 select NOP_USB_XCEIV 57 select NOP_USB_XCEIV
66 help 58 help
67 The Designware USB2.0 PCI interface module for controllers 59 The Designware USB2.0 PCI interface module for controllers
diff --git a/drivers/usb/dwc2/Makefile b/drivers/usb/dwc2/Makefile
index f07b425eaff3..50fdaace1e73 100644
--- a/drivers/usb/dwc2/Makefile
+++ b/drivers/usb/dwc2/Makefile
@@ -2,7 +2,7 @@ ccflags-$(CONFIG_USB_DWC2_DEBUG) += -DDEBUG
2ccflags-$(CONFIG_USB_DWC2_VERBOSE) += -DVERBOSE_DEBUG 2ccflags-$(CONFIG_USB_DWC2_VERBOSE) += -DVERBOSE_DEBUG
3 3
4obj-$(CONFIG_USB_DWC2) += dwc2.o 4obj-$(CONFIG_USB_DWC2) += dwc2.o
5dwc2-y := core.o core_intr.o 5dwc2-y := core.o core_intr.o platform.o
6 6
7ifneq ($(filter y,$(CONFIG_USB_DWC2_HOST) $(CONFIG_USB_DWC2_DUAL_ROLE)),) 7ifneq ($(filter y,$(CONFIG_USB_DWC2_HOST) $(CONFIG_USB_DWC2_DUAL_ROLE)),)
8 dwc2-y += hcd.o hcd_intr.o 8 dwc2-y += hcd.o hcd_intr.o
@@ -13,6 +13,10 @@ ifneq ($(filter y,$(CONFIG_USB_DWC2_PERIPHERAL) $(CONFIG_USB_DWC2_DUAL_ROLE)),)
13 dwc2-y += gadget.o 13 dwc2-y += gadget.o
14endif 14endif
15 15
16ifneq ($(CONFIG_DEBUG_FS),)
17 dwc2-y += debugfs.o
18endif
19
16# NOTE: The previous s3c-hsotg peripheral mode only driver has been moved to 20# NOTE: The previous s3c-hsotg peripheral mode only driver has been moved to
17# this location and renamed gadget.c. When building for dynamically linked 21# this location and renamed gadget.c. When building for dynamically linked
18# modules, dwc2.ko will get built for host mode, peripheral mode, and dual-role 22# modules, dwc2.ko will get built for host mode, peripheral mode, and dual-role
@@ -21,6 +25,3 @@ endif
21 25
22obj-$(CONFIG_USB_DWC2_PCI) += dwc2_pci.o 26obj-$(CONFIG_USB_DWC2_PCI) += dwc2_pci.o
23dwc2_pci-y := pci.o 27dwc2_pci-y := pci.o
24
25obj-$(CONFIG_USB_DWC2_PLATFORM) += dwc2_platform.o
26dwc2_platform-y := platform.o
diff --git a/drivers/usb/dwc2/core.c b/drivers/usb/dwc2/core.c
index d5197d492e21..e5b546f1152e 100644
--- a/drivers/usb/dwc2/core.c
+++ b/drivers/usb/dwc2/core.c
@@ -56,6 +56,389 @@
56#include "core.h" 56#include "core.h"
57#include "hcd.h" 57#include "hcd.h"
58 58
59#if IS_ENABLED(CONFIG_USB_DWC2_HOST) || IS_ENABLED(CONFIG_USB_DWC2_DUAL_ROLE)
60/**
61 * dwc2_backup_host_registers() - Backup controller host registers.
62 * When suspending usb bus, registers needs to be backuped
63 * if controller power is disabled once suspended.
64 *
65 * @hsotg: Programming view of the DWC_otg controller
66 */
67static int dwc2_backup_host_registers(struct dwc2_hsotg *hsotg)
68{
69 struct dwc2_hregs_backup *hr;
70 int i;
71
72 dev_dbg(hsotg->dev, "%s\n", __func__);
73
74 /* Backup Host regs */
75 hr = hsotg->hr_backup;
76 if (!hr) {
77 hr = devm_kzalloc(hsotg->dev, sizeof(*hr), GFP_KERNEL);
78 if (!hr) {
79 dev_err(hsotg->dev, "%s: can't allocate host regs\n",
80 __func__);
81 return -ENOMEM;
82 }
83
84 hsotg->hr_backup = hr;
85 }
86 hr->hcfg = readl(hsotg->regs + HCFG);
87 hr->haintmsk = readl(hsotg->regs + HAINTMSK);
88 for (i = 0; i < hsotg->core_params->host_channels; ++i)
89 hr->hcintmsk[i] = readl(hsotg->regs + HCINTMSK(i));
90
91 hr->hprt0 = readl(hsotg->regs + HPRT0);
92 hr->hfir = readl(hsotg->regs + HFIR);
93
94 return 0;
95}
96
97/**
98 * dwc2_restore_host_registers() - Restore controller host registers.
99 * When resuming usb bus, device registers needs to be restored
100 * if controller power were disabled.
101 *
102 * @hsotg: Programming view of the DWC_otg controller
103 */
104static int dwc2_restore_host_registers(struct dwc2_hsotg *hsotg)
105{
106 struct dwc2_hregs_backup *hr;
107 int i;
108
109 dev_dbg(hsotg->dev, "%s\n", __func__);
110
111 /* Restore host regs */
112 hr = hsotg->hr_backup;
113 if (!hr) {
114 dev_err(hsotg->dev, "%s: no host registers to restore\n",
115 __func__);
116 return -EINVAL;
117 }
118
119 writel(hr->hcfg, hsotg->regs + HCFG);
120 writel(hr->haintmsk, hsotg->regs + HAINTMSK);
121
122 for (i = 0; i < hsotg->core_params->host_channels; ++i)
123 writel(hr->hcintmsk[i], hsotg->regs + HCINTMSK(i));
124
125 writel(hr->hprt0, hsotg->regs + HPRT0);
126 writel(hr->hfir, hsotg->regs + HFIR);
127
128 return 0;
129}
130#else
131static inline int dwc2_backup_host_registers(struct dwc2_hsotg *hsotg)
132{ return 0; }
133
134static inline int dwc2_restore_host_registers(struct dwc2_hsotg *hsotg)
135{ return 0; }
136#endif
137
138#if IS_ENABLED(CONFIG_USB_DWC2_PERIPHERAL) || \
139 IS_ENABLED(CONFIG_USB_DWC2_DUAL_ROLE)
140/**
141 * dwc2_backup_device_registers() - Backup controller device registers.
142 * When suspending usb bus, registers needs to be backuped
143 * if controller power is disabled once suspended.
144 *
145 * @hsotg: Programming view of the DWC_otg controller
146 */
147static int dwc2_backup_device_registers(struct dwc2_hsotg *hsotg)
148{
149 struct dwc2_dregs_backup *dr;
150 int i;
151
152 dev_dbg(hsotg->dev, "%s\n", __func__);
153
154 /* Backup dev regs */
155 dr = hsotg->dr_backup;
156 if (!dr) {
157 dr = devm_kzalloc(hsotg->dev, sizeof(*dr), GFP_KERNEL);
158 if (!dr) {
159 dev_err(hsotg->dev, "%s: can't allocate device regs\n",
160 __func__);
161 return -ENOMEM;
162 }
163
164 hsotg->dr_backup = dr;
165 }
166
167 dr->dcfg = readl(hsotg->regs + DCFG);
168 dr->dctl = readl(hsotg->regs + DCTL);
169 dr->daintmsk = readl(hsotg->regs + DAINTMSK);
170 dr->diepmsk = readl(hsotg->regs + DIEPMSK);
171 dr->doepmsk = readl(hsotg->regs + DOEPMSK);
172
173 for (i = 0; i < hsotg->num_of_eps; i++) {
174 /* Backup IN EPs */
175 dr->diepctl[i] = readl(hsotg->regs + DIEPCTL(i));
176
177 /* Ensure DATA PID is correctly configured */
178 if (dr->diepctl[i] & DXEPCTL_DPID)
179 dr->diepctl[i] |= DXEPCTL_SETD1PID;
180 else
181 dr->diepctl[i] |= DXEPCTL_SETD0PID;
182
183 dr->dieptsiz[i] = readl(hsotg->regs + DIEPTSIZ(i));
184 dr->diepdma[i] = readl(hsotg->regs + DIEPDMA(i));
185
186 /* Backup OUT EPs */
187 dr->doepctl[i] = readl(hsotg->regs + DOEPCTL(i));
188
189 /* Ensure DATA PID is correctly configured */
190 if (dr->doepctl[i] & DXEPCTL_DPID)
191 dr->doepctl[i] |= DXEPCTL_SETD1PID;
192 else
193 dr->doepctl[i] |= DXEPCTL_SETD0PID;
194
195 dr->doeptsiz[i] = readl(hsotg->regs + DOEPTSIZ(i));
196 dr->doepdma[i] = readl(hsotg->regs + DOEPDMA(i));
197 }
198
199 return 0;
200}
201
202/**
203 * dwc2_restore_device_registers() - Restore controller device registers.
204 * When resuming usb bus, device registers needs to be restored
205 * if controller power were disabled.
206 *
207 * @hsotg: Programming view of the DWC_otg controller
208 */
209static int dwc2_restore_device_registers(struct dwc2_hsotg *hsotg)
210{
211 struct dwc2_dregs_backup *dr;
212 u32 dctl;
213 int i;
214
215 dev_dbg(hsotg->dev, "%s\n", __func__);
216
217 /* Restore dev regs */
218 dr = hsotg->dr_backup;
219 if (!dr) {
220 dev_err(hsotg->dev, "%s: no device registers to restore\n",
221 __func__);
222 return -EINVAL;
223 }
224
225 writel(dr->dcfg, hsotg->regs + DCFG);
226 writel(dr->dctl, hsotg->regs + DCTL);
227 writel(dr->daintmsk, hsotg->regs + DAINTMSK);
228 writel(dr->diepmsk, hsotg->regs + DIEPMSK);
229 writel(dr->doepmsk, hsotg->regs + DOEPMSK);
230
231 for (i = 0; i < hsotg->num_of_eps; i++) {
232 /* Restore IN EPs */
233 writel(dr->diepctl[i], hsotg->regs + DIEPCTL(i));
234 writel(dr->dieptsiz[i], hsotg->regs + DIEPTSIZ(i));
235 writel(dr->diepdma[i], hsotg->regs + DIEPDMA(i));
236
237 /* Restore OUT EPs */
238 writel(dr->doepctl[i], hsotg->regs + DOEPCTL(i));
239 writel(dr->doeptsiz[i], hsotg->regs + DOEPTSIZ(i));
240 writel(dr->doepdma[i], hsotg->regs + DOEPDMA(i));
241 }
242
243 /* Set the Power-On Programming done bit */
244 dctl = readl(hsotg->regs + DCTL);
245 dctl |= DCTL_PWRONPRGDONE;
246 writel(dctl, hsotg->regs + DCTL);
247
248 return 0;
249}
250#else
251static inline int dwc2_backup_device_registers(struct dwc2_hsotg *hsotg)
252{ return 0; }
253
254static inline int dwc2_restore_device_registers(struct dwc2_hsotg *hsotg)
255{ return 0; }
256#endif
257
258/**
259 * dwc2_backup_global_registers() - Backup global controller registers.
260 * When suspending usb bus, registers needs to be backuped
261 * if controller power is disabled once suspended.
262 *
263 * @hsotg: Programming view of the DWC_otg controller
264 */
265static int dwc2_backup_global_registers(struct dwc2_hsotg *hsotg)
266{
267 struct dwc2_gregs_backup *gr;
268 int i;
269
270 /* Backup global regs */
271 gr = hsotg->gr_backup;
272 if (!gr) {
273 gr = devm_kzalloc(hsotg->dev, sizeof(*gr), GFP_KERNEL);
274 if (!gr) {
275 dev_err(hsotg->dev, "%s: can't allocate global regs\n",
276 __func__);
277 return -ENOMEM;
278 }
279
280 hsotg->gr_backup = gr;
281 }
282
283 gr->gotgctl = readl(hsotg->regs + GOTGCTL);
284 gr->gintmsk = readl(hsotg->regs + GINTMSK);
285 gr->gahbcfg = readl(hsotg->regs + GAHBCFG);
286 gr->gusbcfg = readl(hsotg->regs + GUSBCFG);
287 gr->grxfsiz = readl(hsotg->regs + GRXFSIZ);
288 gr->gnptxfsiz = readl(hsotg->regs + GNPTXFSIZ);
289 gr->hptxfsiz = readl(hsotg->regs + HPTXFSIZ);
290 gr->gdfifocfg = readl(hsotg->regs + GDFIFOCFG);
291 for (i = 0; i < MAX_EPS_CHANNELS; i++)
292 gr->dtxfsiz[i] = readl(hsotg->regs + DPTXFSIZN(i));
293
294 return 0;
295}
296
297/**
298 * dwc2_restore_global_registers() - Restore controller global registers.
299 * When resuming usb bus, device registers needs to be restored
300 * if controller power were disabled.
301 *
302 * @hsotg: Programming view of the DWC_otg controller
303 */
304static int dwc2_restore_global_registers(struct dwc2_hsotg *hsotg)
305{
306 struct dwc2_gregs_backup *gr;
307 int i;
308
309 dev_dbg(hsotg->dev, "%s\n", __func__);
310
311 /* Restore global regs */
312 gr = hsotg->gr_backup;
313 if (!gr) {
314 dev_err(hsotg->dev, "%s: no global registers to restore\n",
315 __func__);
316 return -EINVAL;
317 }
318
319 writel(0xffffffff, hsotg->regs + GINTSTS);
320 writel(gr->gotgctl, hsotg->regs + GOTGCTL);
321 writel(gr->gintmsk, hsotg->regs + GINTMSK);
322 writel(gr->gusbcfg, hsotg->regs + GUSBCFG);
323 writel(gr->gahbcfg, hsotg->regs + GAHBCFG);
324 writel(gr->grxfsiz, hsotg->regs + GRXFSIZ);
325 writel(gr->gnptxfsiz, hsotg->regs + GNPTXFSIZ);
326 writel(gr->hptxfsiz, hsotg->regs + HPTXFSIZ);
327 writel(gr->gdfifocfg, hsotg->regs + GDFIFOCFG);
328 for (i = 0; i < MAX_EPS_CHANNELS; i++)
329 writel(gr->dtxfsiz[i], hsotg->regs + DPTXFSIZN(i));
330
331 return 0;
332}
333
334/**
335 * dwc2_exit_hibernation() - Exit controller from Partial Power Down.
336 *
337 * @hsotg: Programming view of the DWC_otg controller
338 * @restore: Controller registers need to be restored
339 */
340int dwc2_exit_hibernation(struct dwc2_hsotg *hsotg, bool restore)
341{
342 u32 pcgcctl;
343 int ret = 0;
344
345 if (!hsotg->core_params->hibernation)
346 return -ENOTSUPP;
347
348 pcgcctl = readl(hsotg->regs + PCGCTL);
349 pcgcctl &= ~PCGCTL_STOPPCLK;
350 writel(pcgcctl, hsotg->regs + PCGCTL);
351
352 pcgcctl = readl(hsotg->regs + PCGCTL);
353 pcgcctl &= ~PCGCTL_PWRCLMP;
354 writel(pcgcctl, hsotg->regs + PCGCTL);
355
356 pcgcctl = readl(hsotg->regs + PCGCTL);
357 pcgcctl &= ~PCGCTL_RSTPDWNMODULE;
358 writel(pcgcctl, hsotg->regs + PCGCTL);
359
360 udelay(100);
361 if (restore) {
362 ret = dwc2_restore_global_registers(hsotg);
363 if (ret) {
364 dev_err(hsotg->dev, "%s: failed to restore registers\n",
365 __func__);
366 return ret;
367 }
368 if (dwc2_is_host_mode(hsotg)) {
369 ret = dwc2_restore_host_registers(hsotg);
370 if (ret) {
371 dev_err(hsotg->dev, "%s: failed to restore host registers\n",
372 __func__);
373 return ret;
374 }
375 } else {
376 ret = dwc2_restore_device_registers(hsotg);
377 if (ret) {
378 dev_err(hsotg->dev, "%s: failed to restore device registers\n",
379 __func__);
380 return ret;
381 }
382 }
383 }
384
385 return ret;
386}
387
388/**
389 * dwc2_enter_hibernation() - Put controller in Partial Power Down.
390 *
391 * @hsotg: Programming view of the DWC_otg controller
392 */
393int dwc2_enter_hibernation(struct dwc2_hsotg *hsotg)
394{
395 u32 pcgcctl;
396 int ret = 0;
397
398 if (!hsotg->core_params->hibernation)
399 return -ENOTSUPP;
400
401 /* Backup all registers */
402 ret = dwc2_backup_global_registers(hsotg);
403 if (ret) {
404 dev_err(hsotg->dev, "%s: failed to backup global registers\n",
405 __func__);
406 return ret;
407 }
408
409 if (dwc2_is_host_mode(hsotg)) {
410 ret = dwc2_backup_host_registers(hsotg);
411 if (ret) {
412 dev_err(hsotg->dev, "%s: failed to backup host registers\n",
413 __func__);
414 return ret;
415 }
416 } else {
417 ret = dwc2_backup_device_registers(hsotg);
418 if (ret) {
419 dev_err(hsotg->dev, "%s: failed to backup device registers\n",
420 __func__);
421 return ret;
422 }
423 }
424
425 /* Put the controller in low power state */
426 pcgcctl = readl(hsotg->regs + PCGCTL);
427
428 pcgcctl |= PCGCTL_PWRCLMP;
429 writel(pcgcctl, hsotg->regs + PCGCTL);
430 ndelay(20);
431
432 pcgcctl |= PCGCTL_RSTPDWNMODULE;
433 writel(pcgcctl, hsotg->regs + PCGCTL);
434 ndelay(20);
435
436 pcgcctl |= PCGCTL_STOPPCLK;
437 writel(pcgcctl, hsotg->regs + PCGCTL);
438
439 return ret;
440}
441
59/** 442/**
60 * dwc2_enable_common_interrupts() - Initializes the commmon interrupts, 443 * dwc2_enable_common_interrupts() - Initializes the commmon interrupts,
61 * used in both device and host modes 444 * used in both device and host modes
@@ -77,8 +460,10 @@ static void dwc2_enable_common_interrupts(struct dwc2_hsotg *hsotg)
77 460
78 if (hsotg->core_params->dma_enable <= 0) 461 if (hsotg->core_params->dma_enable <= 0)
79 intmsk |= GINTSTS_RXFLVL; 462 intmsk |= GINTSTS_RXFLVL;
463 if (hsotg->core_params->external_id_pin_ctl <= 0)
464 intmsk |= GINTSTS_CONIDSTSCHNG;
80 465
81 intmsk |= GINTSTS_CONIDSTSCHNG | GINTSTS_WKUPINT | GINTSTS_USBSUSP | 466 intmsk |= GINTSTS_WKUPINT | GINTSTS_USBSUSP |
82 GINTSTS_SESSREQINT; 467 GINTSTS_SESSREQINT;
83 468
84 writel(intmsk, hsotg->regs + GINTMSK); 469 writel(intmsk, hsotg->regs + GINTMSK);
@@ -2602,6 +2987,40 @@ static void dwc2_set_param_uframe_sched(struct dwc2_hsotg *hsotg, int val)
2602 hsotg->core_params->uframe_sched = val; 2987 hsotg->core_params->uframe_sched = val;
2603} 2988}
2604 2989
2990static void dwc2_set_param_external_id_pin_ctl(struct dwc2_hsotg *hsotg,
2991 int val)
2992{
2993 if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
2994 if (val >= 0) {
2995 dev_err(hsotg->dev,
2996 "'%d' invalid for parameter external_id_pin_ctl\n",
2997 val);
2998 dev_err(hsotg->dev, "external_id_pin_ctl must be 0 or 1\n");
2999 }
3000 val = 0;
3001 dev_dbg(hsotg->dev, "Setting external_id_pin_ctl to %d\n", val);
3002 }
3003
3004 hsotg->core_params->external_id_pin_ctl = val;
3005}
3006
3007static void dwc2_set_param_hibernation(struct dwc2_hsotg *hsotg,
3008 int val)
3009{
3010 if (DWC2_OUT_OF_BOUNDS(val, 0, 1)) {
3011 if (val >= 0) {
3012 dev_err(hsotg->dev,
3013 "'%d' invalid for parameter hibernation\n",
3014 val);
3015 dev_err(hsotg->dev, "hibernation must be 0 or 1\n");
3016 }
3017 val = 0;
3018 dev_dbg(hsotg->dev, "Setting hibernation to %d\n", val);
3019 }
3020
3021 hsotg->core_params->hibernation = val;
3022}
3023
2605/* 3024/*
2606 * This function is called during module intialization to pass module parameters 3025 * This function is called during module intialization to pass module parameters
2607 * for the DWC_otg core. 3026 * for the DWC_otg core.
@@ -2646,6 +3065,8 @@ void dwc2_set_parameters(struct dwc2_hsotg *hsotg,
2646 dwc2_set_param_ahbcfg(hsotg, params->ahbcfg); 3065 dwc2_set_param_ahbcfg(hsotg, params->ahbcfg);
2647 dwc2_set_param_otg_ver(hsotg, params->otg_ver); 3066 dwc2_set_param_otg_ver(hsotg, params->otg_ver);
2648 dwc2_set_param_uframe_sched(hsotg, params->uframe_sched); 3067 dwc2_set_param_uframe_sched(hsotg, params->uframe_sched);
3068 dwc2_set_param_external_id_pin_ctl(hsotg, params->external_id_pin_ctl);
3069 dwc2_set_param_hibernation(hsotg, params->hibernation);
2649} 3070}
2650 3071
2651/** 3072/**
@@ -2814,6 +3235,22 @@ int dwc2_get_hwparams(struct dwc2_hsotg *hsotg)
2814 return 0; 3235 return 0;
2815} 3236}
2816 3237
3238/*
3239 * Sets all parameters to the given value.
3240 *
3241 * Assumes that the dwc2_core_params struct contains only integers.
3242 */
3243void dwc2_set_all_params(struct dwc2_core_params *params, int value)
3244{
3245 int *p = (int *)params;
3246 size_t size = sizeof(*params) / sizeof(*p);
3247 int i;
3248
3249 for (i = 0; i < size; i++)
3250 p[i] = value;
3251}
3252
3253
2817u16 dwc2_get_otg_version(struct dwc2_hsotg *hsotg) 3254u16 dwc2_get_otg_version(struct dwc2_hsotg *hsotg)
2818{ 3255{
2819 return hsotg->core_params->otg_ver == 1 ? 0x0200 : 0x0103; 3256 return hsotg->core_params->otg_ver == 1 ? 0x0200 : 0x0103;
diff --git a/drivers/usb/dwc2/core.h b/drivers/usb/dwc2/core.h
index 836c012c7707..53b8de03f102 100644
--- a/drivers/usb/dwc2/core.h
+++ b/drivers/usb/dwc2/core.h
@@ -331,6 +331,17 @@ enum dwc2_ep0_state {
331 * by the driver and are ignored in this 331 * by the driver and are ignored in this
332 * configuration value. 332 * configuration value.
333 * @uframe_sched: True to enable the microframe scheduler 333 * @uframe_sched: True to enable the microframe scheduler
334 * @external_id_pin_ctl: Specifies whether ID pin is handled externally.
335 * Disable CONIDSTSCHNG controller interrupt in such
336 * case.
337 * 0 - No (default)
338 * 1 - Yes
339 * @hibernation: Specifies whether the controller support hibernation.
340 * If hibernation is enabled, the controller will enter
341 * hibernation in both peripheral and host mode when
342 * needed.
343 * 0 - No (default)
344 * 1 - Yes
334 * 345 *
335 * The following parameters may be specified when starting the module. These 346 * The following parameters may be specified when starting the module. These
336 * parameters define how the DWC_otg controller should be configured. A 347 * parameters define how the DWC_otg controller should be configured. A
@@ -368,6 +379,8 @@ struct dwc2_core_params {
368 int reload_ctl; 379 int reload_ctl;
369 int ahbcfg; 380 int ahbcfg;
370 int uframe_sched; 381 int uframe_sched;
382 int external_id_pin_ctl;
383 int hibernation;
371}; 384};
372 385
373/** 386/**
@@ -452,6 +465,82 @@ struct dwc2_hw_params {
452#define DWC2_CTRL_BUFF_SIZE 8 465#define DWC2_CTRL_BUFF_SIZE 8
453 466
454/** 467/**
468 * struct dwc2_gregs_backup - Holds global registers state before entering partial
469 * power down
470 * @gotgctl: Backup of GOTGCTL register
471 * @gintmsk: Backup of GINTMSK register
472 * @gahbcfg: Backup of GAHBCFG register
473 * @gusbcfg: Backup of GUSBCFG register
474 * @grxfsiz: Backup of GRXFSIZ register
475 * @gnptxfsiz: Backup of GNPTXFSIZ register
476 * @gi2cctl: Backup of GI2CCTL register
477 * @hptxfsiz: Backup of HPTXFSIZ register
478 * @gdfifocfg: Backup of GDFIFOCFG register
479 * @dtxfsiz: Backup of DTXFSIZ registers for each endpoint
480 * @gpwrdn: Backup of GPWRDN register
481 */
482struct dwc2_gregs_backup {
483 u32 gotgctl;
484 u32 gintmsk;
485 u32 gahbcfg;
486 u32 gusbcfg;
487 u32 grxfsiz;
488 u32 gnptxfsiz;
489 u32 gi2cctl;
490 u32 hptxfsiz;
491 u32 pcgcctl;
492 u32 gdfifocfg;
493 u32 dtxfsiz[MAX_EPS_CHANNELS];
494 u32 gpwrdn;
495};
496
497/**
498 * struct dwc2_dregs_backup - Holds device registers state before entering partial
499 * power down
500 * @dcfg: Backup of DCFG register
501 * @dctl: Backup of DCTL register
502 * @daintmsk: Backup of DAINTMSK register
503 * @diepmsk: Backup of DIEPMSK register
504 * @doepmsk: Backup of DOEPMSK register
505 * @diepctl: Backup of DIEPCTL register
506 * @dieptsiz: Backup of DIEPTSIZ register
507 * @diepdma: Backup of DIEPDMA register
508 * @doepctl: Backup of DOEPCTL register
509 * @doeptsiz: Backup of DOEPTSIZ register
510 * @doepdma: Backup of DOEPDMA register
511 */
512struct dwc2_dregs_backup {
513 u32 dcfg;
514 u32 dctl;
515 u32 daintmsk;
516 u32 diepmsk;
517 u32 doepmsk;
518 u32 diepctl[MAX_EPS_CHANNELS];
519 u32 dieptsiz[MAX_EPS_CHANNELS];
520 u32 diepdma[MAX_EPS_CHANNELS];
521 u32 doepctl[MAX_EPS_CHANNELS];
522 u32 doeptsiz[MAX_EPS_CHANNELS];
523 u32 doepdma[MAX_EPS_CHANNELS];
524};
525
526/**
527 * struct dwc2_hregs_backup - Holds host registers state before entering partial
528 * power down
529 * @hcfg: Backup of HCFG register
530 * @haintmsk: Backup of HAINTMSK register
531 * @hcintmsk: Backup of HCINTMSK register
532 * @hptr0: Backup of HPTR0 register
533 * @hfir: Backup of HFIR register
534 */
535struct dwc2_hregs_backup {
536 u32 hcfg;
537 u32 haintmsk;
538 u32 hcintmsk[MAX_EPS_CHANNELS];
539 u32 hprt0;
540 u32 hfir;
541};
542
543/**
455 * struct dwc2_hsotg - Holds the state of the driver, including the non-periodic 544 * struct dwc2_hsotg - Holds the state of the driver, including the non-periodic
456 * and periodic schedules 545 * and periodic schedules
457 * 546 *
@@ -481,6 +570,9 @@ struct dwc2_hw_params {
481 * interrupt 570 * interrupt
482 * @wkp_timer: Timer object for handling Wakeup Detected interrupt 571 * @wkp_timer: Timer object for handling Wakeup Detected interrupt
483 * @lx_state: Lx state of connected device 572 * @lx_state: Lx state of connected device
573 * @gregs_backup: Backup of global registers during suspend
574 * @dregs_backup: Backup of device registers during suspend
575 * @hregs_backup: Backup of host registers during suspend
484 * 576 *
485 * These are for host mode: 577 * These are for host mode:
486 * 578 *
@@ -613,11 +705,12 @@ struct dwc2_hsotg {
613 struct work_struct wf_otg; 705 struct work_struct wf_otg;
614 struct timer_list wkp_timer; 706 struct timer_list wkp_timer;
615 enum dwc2_lx_state lx_state; 707 enum dwc2_lx_state lx_state;
708 struct dwc2_gregs_backup *gr_backup;
709 struct dwc2_dregs_backup *dr_backup;
710 struct dwc2_hregs_backup *hr_backup;
616 711
617 struct dentry *debug_root; 712 struct dentry *debug_root;
618 struct dentry *debug_file; 713 struct debugfs_regset32 *regset;
619 struct dentry *debug_testmode;
620 struct dentry *debug_fifo;
621 714
622 /* DWC OTG HW Release versions */ 715 /* DWC OTG HW Release versions */
623#define DWC2_CORE_REV_2_71a 0x4f54271a 716#define DWC2_CORE_REV_2_71a 0x4f54271a
@@ -751,6 +844,8 @@ enum dwc2_halt_status {
751 * and the DWC_otg controller 844 * and the DWC_otg controller
752 */ 845 */
753extern void dwc2_core_host_init(struct dwc2_hsotg *hsotg); 846extern void dwc2_core_host_init(struct dwc2_hsotg *hsotg);
847extern int dwc2_enter_hibernation(struct dwc2_hsotg *hsotg);
848extern int dwc2_exit_hibernation(struct dwc2_hsotg *hsotg, bool restore);
754 849
755/* 850/*
756 * Host core Functions. 851 * Host core Functions.
@@ -983,6 +1078,15 @@ extern void dwc2_set_param_ahbcfg(struct dwc2_hsotg *hsotg, int val);
983 1078
984extern void dwc2_set_param_otg_ver(struct dwc2_hsotg *hsotg, int val); 1079extern void dwc2_set_param_otg_ver(struct dwc2_hsotg *hsotg, int val);
985 1080
1081extern void dwc2_set_parameters(struct dwc2_hsotg *hsotg,
1082 const struct dwc2_core_params *params);
1083
1084extern void dwc2_set_all_params(struct dwc2_core_params *params, int value);
1085
1086extern int dwc2_get_hwparams(struct dwc2_hsotg *hsotg);
1087
1088
1089
986/* 1090/*
987 * Dump core registers and SPRAM 1091 * Dump core registers and SPRAM
988 */ 1092 */
@@ -1005,6 +1109,8 @@ extern void s3c_hsotg_core_init_disconnected(struct dwc2_hsotg *dwc2,
1005 bool reset); 1109 bool reset);
1006extern void s3c_hsotg_core_connect(struct dwc2_hsotg *hsotg); 1110extern void s3c_hsotg_core_connect(struct dwc2_hsotg *hsotg);
1007extern void s3c_hsotg_disconnect(struct dwc2_hsotg *dwc2); 1111extern void s3c_hsotg_disconnect(struct dwc2_hsotg *dwc2);
1112extern int s3c_hsotg_set_test_mode(struct dwc2_hsotg *hsotg, int testmode);
1113#define dwc2_is_device_connected(hsotg) (hsotg->connected)
1008#else 1114#else
1009static inline int s3c_hsotg_remove(struct dwc2_hsotg *dwc2) 1115static inline int s3c_hsotg_remove(struct dwc2_hsotg *dwc2)
1010{ return 0; } 1116{ return 0; }
@@ -1018,6 +1124,10 @@ static inline void s3c_hsotg_core_init_disconnected(struct dwc2_hsotg *dwc2,
1018 bool reset) {} 1124 bool reset) {}
1019static inline void s3c_hsotg_core_connect(struct dwc2_hsotg *hsotg) {} 1125static inline void s3c_hsotg_core_connect(struct dwc2_hsotg *hsotg) {}
1020static inline void s3c_hsotg_disconnect(struct dwc2_hsotg *dwc2) {} 1126static inline void s3c_hsotg_disconnect(struct dwc2_hsotg *dwc2) {}
1127static inline int s3c_hsotg_set_test_mode(struct dwc2_hsotg *hsotg,
1128 int testmode)
1129{ return 0; }
1130#define dwc2_is_device_connected(hsotg) (0)
1021#endif 1131#endif
1022 1132
1023#if IS_ENABLED(CONFIG_USB_DWC2_HOST) || IS_ENABLED(CONFIG_USB_DWC2_DUAL_ROLE) 1133#if IS_ENABLED(CONFIG_USB_DWC2_HOST) || IS_ENABLED(CONFIG_USB_DWC2_DUAL_ROLE)
@@ -1025,14 +1135,12 @@ extern int dwc2_hcd_get_frame_number(struct dwc2_hsotg *hsotg);
1025extern void dwc2_hcd_disconnect(struct dwc2_hsotg *hsotg); 1135extern void dwc2_hcd_disconnect(struct dwc2_hsotg *hsotg);
1026extern void dwc2_hcd_start(struct dwc2_hsotg *hsotg); 1136extern void dwc2_hcd_start(struct dwc2_hsotg *hsotg);
1027#else 1137#else
1028static inline void dwc2_set_all_params(struct dwc2_core_params *params, int value) {}
1029static inline int dwc2_hcd_get_frame_number(struct dwc2_hsotg *hsotg) 1138static inline int dwc2_hcd_get_frame_number(struct dwc2_hsotg *hsotg)
1030{ return 0; } 1139{ return 0; }
1031static inline void dwc2_hcd_disconnect(struct dwc2_hsotg *hsotg) {} 1140static inline void dwc2_hcd_disconnect(struct dwc2_hsotg *hsotg) {}
1032static inline void dwc2_hcd_start(struct dwc2_hsotg *hsotg) {} 1141static inline void dwc2_hcd_start(struct dwc2_hsotg *hsotg) {}
1033static inline void dwc2_hcd_remove(struct dwc2_hsotg *hsotg) {} 1142static inline void dwc2_hcd_remove(struct dwc2_hsotg *hsotg) {}
1034static inline int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq, 1143static inline int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq)
1035 const struct dwc2_core_params *params)
1036{ return 0; } 1144{ return 0; }
1037#endif 1145#endif
1038 1146
diff --git a/drivers/usb/dwc2/core_intr.c b/drivers/usb/dwc2/core_intr.c
index 6cf047878dba..927be1e8b3dc 100644
--- a/drivers/usb/dwc2/core_intr.c
+++ b/drivers/usb/dwc2/core_intr.c
@@ -334,6 +334,7 @@ static void dwc2_handle_session_req_intr(struct dwc2_hsotg *hsotg)
334 */ 334 */
335static void dwc2_handle_wakeup_detected_intr(struct dwc2_hsotg *hsotg) 335static void dwc2_handle_wakeup_detected_intr(struct dwc2_hsotg *hsotg)
336{ 336{
337 int ret;
337 dev_dbg(hsotg->dev, "++Resume or Remote Wakeup Detected Interrupt++\n"); 338 dev_dbg(hsotg->dev, "++Resume or Remote Wakeup Detected Interrupt++\n");
338 dev_dbg(hsotg->dev, "%s lxstate = %d\n", __func__, hsotg->lx_state); 339 dev_dbg(hsotg->dev, "%s lxstate = %d\n", __func__, hsotg->lx_state);
339 340
@@ -345,6 +346,11 @@ static void dwc2_handle_wakeup_detected_intr(struct dwc2_hsotg *hsotg)
345 /* Clear Remote Wakeup Signaling */ 346 /* Clear Remote Wakeup Signaling */
346 dctl &= ~DCTL_RMTWKUPSIG; 347 dctl &= ~DCTL_RMTWKUPSIG;
347 writel(dctl, hsotg->regs + DCTL); 348 writel(dctl, hsotg->regs + DCTL);
349 ret = dwc2_exit_hibernation(hsotg, true);
350 if (ret && (ret != -ENOTSUPP))
351 dev_err(hsotg->dev, "exit hibernation failed\n");
352
353 call_gadget(hsotg, resume);
348 } 354 }
349 /* Change to L0 state */ 355 /* Change to L0 state */
350 hsotg->lx_state = DWC2_L0; 356 hsotg->lx_state = DWC2_L0;
@@ -397,6 +403,7 @@ static void dwc2_handle_disconnect_intr(struct dwc2_hsotg *hsotg)
397static void dwc2_handle_usb_suspend_intr(struct dwc2_hsotg *hsotg) 403static void dwc2_handle_usb_suspend_intr(struct dwc2_hsotg *hsotg)
398{ 404{
399 u32 dsts; 405 u32 dsts;
406 int ret;
400 407
401 dev_dbg(hsotg->dev, "USB SUSPEND\n"); 408 dev_dbg(hsotg->dev, "USB SUSPEND\n");
402 409
@@ -411,10 +418,43 @@ static void dwc2_handle_usb_suspend_intr(struct dwc2_hsotg *hsotg)
411 "DSTS.Suspend Status=%d HWCFG4.Power Optimize=%d\n", 418 "DSTS.Suspend Status=%d HWCFG4.Power Optimize=%d\n",
412 !!(dsts & DSTS_SUSPSTS), 419 !!(dsts & DSTS_SUSPSTS),
413 hsotg->hw_params.power_optimized); 420 hsotg->hw_params.power_optimized);
421 if ((dsts & DSTS_SUSPSTS) && hsotg->hw_params.power_optimized) {
422 /* Ignore suspend request before enumeration */
423 if (!dwc2_is_device_connected(hsotg)) {
424 dev_dbg(hsotg->dev,
425 "ignore suspend request before enumeration\n");
426 goto clear_int;
427 }
428
429 ret = dwc2_enter_hibernation(hsotg);
430 if (ret) {
431 if (ret != -ENOTSUPP)
432 dev_err(hsotg->dev,
433 "enter hibernation failed\n");
434 goto skip_power_saving;
435 }
436
437 udelay(100);
438
439 /* Ask phy to be suspended */
440 if (!IS_ERR_OR_NULL(hsotg->uphy))
441 usb_phy_set_suspend(hsotg->uphy, true);
442skip_power_saving:
443 /*
444 * Change to L2 (suspend) state before releasing
445 * spinlock
446 */
447 hsotg->lx_state = DWC2_L2;
448
449 /* Call gadget suspend callback */
450 call_gadget(hsotg, suspend);
451 }
414 } else { 452 } else {
415 if (hsotg->op_state == OTG_STATE_A_PERIPHERAL) { 453 if (hsotg->op_state == OTG_STATE_A_PERIPHERAL) {
416 dev_dbg(hsotg->dev, "a_peripheral->a_host\n"); 454 dev_dbg(hsotg->dev, "a_peripheral->a_host\n");
417 455
456 /* Change to L2 (suspend) state */
457 hsotg->lx_state = DWC2_L2;
418 /* Clear the a_peripheral flag, back to a_host */ 458 /* Clear the a_peripheral flag, back to a_host */
419 spin_unlock(&hsotg->lock); 459 spin_unlock(&hsotg->lock);
420 dwc2_hcd_start(hsotg); 460 dwc2_hcd_start(hsotg);
@@ -423,9 +463,7 @@ static void dwc2_handle_usb_suspend_intr(struct dwc2_hsotg *hsotg)
423 } 463 }
424 } 464 }
425 465
426 /* Change to L2 (suspend) state */ 466clear_int:
427 hsotg->lx_state = DWC2_L2;
428
429 /* Clear interrupt */ 467 /* Clear interrupt */
430 writel(GINTSTS_USBSUSP, hsotg->regs + GINTSTS); 468 writel(GINTSTS_USBSUSP, hsotg->regs + GINTSTS);
431} 469}
@@ -522,4 +560,3 @@ out:
522 spin_unlock(&hsotg->lock); 560 spin_unlock(&hsotg->lock);
523 return retval; 561 return retval;
524} 562}
525EXPORT_SYMBOL_GPL(dwc2_handle_common_intr);
diff --git a/drivers/usb/dwc2/debug.h b/drivers/usb/dwc2/debug.h
new file mode 100644
index 000000000000..12dbd1daec87
--- /dev/null
+++ b/drivers/usb/dwc2/debug.h
@@ -0,0 +1,27 @@
1/**
2 * debug.h - Designware USB2 DRD controller debug header
3 *
4 * Copyright (C) 2015 Intel Corporation
5 * Mian Yousaf Kaukab <yousaf.kaukab@intel.com>
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 of
9 * the License as published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 */
16
17#include "core.h"
18
19#ifdef CONFIG_DEBUG_FS
20extern int dwc2_debugfs_init(struct dwc2_hsotg *);
21extern void dwc2_debugfs_exit(struct dwc2_hsotg *);
22#else
23static inline int dwc2_debugfs_init(struct dwc2_hsotg *hsotg)
24{ return 0; }
25static inline void dwc2_debugfs_exit(struct dwc2_hsotg *hsotg)
26{ }
27#endif
diff --git a/drivers/usb/dwc2/debugfs.c b/drivers/usb/dwc2/debugfs.c
new file mode 100644
index 000000000000..ef2ee3d9a25d
--- /dev/null
+++ b/drivers/usb/dwc2/debugfs.c
@@ -0,0 +1,771 @@
1/**
2 * debugfs.c - Designware USB2 DRD controller debugfs
3 *
4 * Copyright (C) 2015 Intel Corporation
5 * Mian Yousaf Kaukab <yousaf.kaukab@intel.com>
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 of
9 * the License as published by the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 */
16
17#include <linux/spinlock.h>
18#include <linux/debugfs.h>
19#include <linux/seq_file.h>
20#include <linux/uaccess.h>
21
22#include "core.h"
23#include "debug.h"
24
25#if IS_ENABLED(CONFIG_USB_DWC2_PERIPHERAL) || \
26 IS_ENABLED(CONFIG_USB_DWC2_DUAL_ROLE)
27/**
28 * testmode_write - debugfs: change usb test mode
29 * @seq: The seq file to write to.
30 * @v: Unused parameter.
31 *
32 * This debugfs entry modify the current usb test mode.
33 */
34static ssize_t testmode_write(struct file *file, const char __user *ubuf, size_t
35 count, loff_t *ppos)
36{
37 struct seq_file *s = file->private_data;
38 struct dwc2_hsotg *hsotg = s->private;
39 unsigned long flags;
40 u32 testmode = 0;
41 char buf[32];
42
43 if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count)))
44 return -EFAULT;
45
46 if (!strncmp(buf, "test_j", 6))
47 testmode = TEST_J;
48 else if (!strncmp(buf, "test_k", 6))
49 testmode = TEST_K;
50 else if (!strncmp(buf, "test_se0_nak", 12))
51 testmode = TEST_SE0_NAK;
52 else if (!strncmp(buf, "test_packet", 11))
53 testmode = TEST_PACKET;
54 else if (!strncmp(buf, "test_force_enable", 17))
55 testmode = TEST_FORCE_EN;
56 else
57 testmode = 0;
58
59 spin_lock_irqsave(&hsotg->lock, flags);
60 s3c_hsotg_set_test_mode(hsotg, testmode);
61 spin_unlock_irqrestore(&hsotg->lock, flags);
62 return count;
63}
64
65/**
66 * testmode_show - debugfs: show usb test mode state
67 * @seq: The seq file to write to.
68 * @v: Unused parameter.
69 *
70 * This debugfs entry shows which usb test mode is currently enabled.
71 */
72static int testmode_show(struct seq_file *s, void *unused)
73{
74 struct dwc2_hsotg *hsotg = s->private;
75 unsigned long flags;
76 int dctl;
77
78 spin_lock_irqsave(&hsotg->lock, flags);
79 dctl = readl(hsotg->regs + DCTL);
80 dctl &= DCTL_TSTCTL_MASK;
81 dctl >>= DCTL_TSTCTL_SHIFT;
82 spin_unlock_irqrestore(&hsotg->lock, flags);
83
84 switch (dctl) {
85 case 0:
86 seq_puts(s, "no test\n");
87 break;
88 case TEST_J:
89 seq_puts(s, "test_j\n");
90 break;
91 case TEST_K:
92 seq_puts(s, "test_k\n");
93 break;
94 case TEST_SE0_NAK:
95 seq_puts(s, "test_se0_nak\n");
96 break;
97 case TEST_PACKET:
98 seq_puts(s, "test_packet\n");
99 break;
100 case TEST_FORCE_EN:
101 seq_puts(s, "test_force_enable\n");
102 break;
103 default:
104 seq_printf(s, "UNKNOWN %d\n", dctl);
105 }
106
107 return 0;
108}
109
110static int testmode_open(struct inode *inode, struct file *file)
111{
112 return single_open(file, testmode_show, inode->i_private);
113}
114
115static const struct file_operations testmode_fops = {
116 .owner = THIS_MODULE,
117 .open = testmode_open,
118 .write = testmode_write,
119 .read = seq_read,
120 .llseek = seq_lseek,
121 .release = single_release,
122};
123
124/**
125 * state_show - debugfs: show overall driver and device state.
126 * @seq: The seq file to write to.
127 * @v: Unused parameter.
128 *
129 * This debugfs entry shows the overall state of the hardware and
130 * some general information about each of the endpoints available
131 * to the system.
132 */
133static int state_show(struct seq_file *seq, void *v)
134{
135 struct dwc2_hsotg *hsotg = seq->private;
136 void __iomem *regs = hsotg->regs;
137 int idx;
138
139 seq_printf(seq, "DCFG=0x%08x, DCTL=0x%08x, DSTS=0x%08x\n",
140 readl(regs + DCFG),
141 readl(regs + DCTL),
142 readl(regs + DSTS));
143
144 seq_printf(seq, "DIEPMSK=0x%08x, DOEPMASK=0x%08x\n",
145 readl(regs + DIEPMSK), readl(regs + DOEPMSK));
146
147 seq_printf(seq, "GINTMSK=0x%08x, GINTSTS=0x%08x\n",
148 readl(regs + GINTMSK),
149 readl(regs + GINTSTS));
150
151 seq_printf(seq, "DAINTMSK=0x%08x, DAINT=0x%08x\n",
152 readl(regs + DAINTMSK),
153 readl(regs + DAINT));
154
155 seq_printf(seq, "GNPTXSTS=0x%08x, GRXSTSR=%08x\n",
156 readl(regs + GNPTXSTS),
157 readl(regs + GRXSTSR));
158
159 seq_puts(seq, "\nEndpoint status:\n");
160
161 for (idx = 0; idx < hsotg->num_of_eps; idx++) {
162 u32 in, out;
163
164 in = readl(regs + DIEPCTL(idx));
165 out = readl(regs + DOEPCTL(idx));
166
167 seq_printf(seq, "ep%d: DIEPCTL=0x%08x, DOEPCTL=0x%08x",
168 idx, in, out);
169
170 in = readl(regs + DIEPTSIZ(idx));
171 out = readl(regs + DOEPTSIZ(idx));
172
173 seq_printf(seq, ", DIEPTSIZ=0x%08x, DOEPTSIZ=0x%08x",
174 in, out);
175
176 seq_puts(seq, "\n");
177 }
178
179 return 0;
180}
181
182static int state_open(struct inode *inode, struct file *file)
183{
184 return single_open(file, state_show, inode->i_private);
185}
186
187static const struct file_operations state_fops = {
188 .owner = THIS_MODULE,
189 .open = state_open,
190 .read = seq_read,
191 .llseek = seq_lseek,
192 .release = single_release,
193};
194
195/**
196 * fifo_show - debugfs: show the fifo information
197 * @seq: The seq_file to write data to.
198 * @v: Unused parameter.
199 *
200 * Show the FIFO information for the overall fifo and all the
201 * periodic transmission FIFOs.
202 */
203static int fifo_show(struct seq_file *seq, void *v)
204{
205 struct dwc2_hsotg *hsotg = seq->private;
206 void __iomem *regs = hsotg->regs;
207 u32 val;
208 int idx;
209
210 seq_puts(seq, "Non-periodic FIFOs:\n");
211 seq_printf(seq, "RXFIFO: Size %d\n", readl(regs + GRXFSIZ));
212
213 val = readl(regs + GNPTXFSIZ);
214 seq_printf(seq, "NPTXFIFO: Size %d, Start 0x%08x\n",
215 val >> FIFOSIZE_DEPTH_SHIFT,
216 val & FIFOSIZE_DEPTH_MASK);
217
218 seq_puts(seq, "\nPeriodic TXFIFOs:\n");
219
220 for (idx = 1; idx < hsotg->num_of_eps; idx++) {
221 val = readl(regs + DPTXFSIZN(idx));
222
223 seq_printf(seq, "\tDPTXFIFO%2d: Size %d, Start 0x%08x\n", idx,
224 val >> FIFOSIZE_DEPTH_SHIFT,
225 val & FIFOSIZE_STARTADDR_MASK);
226 }
227
228 return 0;
229}
230
231static int fifo_open(struct inode *inode, struct file *file)
232{
233 return single_open(file, fifo_show, inode->i_private);
234}
235
236static const struct file_operations fifo_fops = {
237 .owner = THIS_MODULE,
238 .open = fifo_open,
239 .read = seq_read,
240 .llseek = seq_lseek,
241 .release = single_release,
242};
243
244static const char *decode_direction(int is_in)
245{
246 return is_in ? "in" : "out";
247}
248
249/**
250 * ep_show - debugfs: show the state of an endpoint.
251 * @seq: The seq_file to write data to.
252 * @v: Unused parameter.
253 *
254 * This debugfs entry shows the state of the given endpoint (one is
255 * registered for each available).
256 */
257static int ep_show(struct seq_file *seq, void *v)
258{
259 struct s3c_hsotg_ep *ep = seq->private;
260 struct dwc2_hsotg *hsotg = ep->parent;
261 struct s3c_hsotg_req *req;
262 void __iomem *regs = hsotg->regs;
263 int index = ep->index;
264 int show_limit = 15;
265 unsigned long flags;
266
267 seq_printf(seq, "Endpoint index %d, named %s, dir %s:\n",
268 ep->index, ep->ep.name, decode_direction(ep->dir_in));
269
270 /* first show the register state */
271
272 seq_printf(seq, "\tDIEPCTL=0x%08x, DOEPCTL=0x%08x\n",
273 readl(regs + DIEPCTL(index)),
274 readl(regs + DOEPCTL(index)));
275
276 seq_printf(seq, "\tDIEPDMA=0x%08x, DOEPDMA=0x%08x\n",
277 readl(regs + DIEPDMA(index)),
278 readl(regs + DOEPDMA(index)));
279
280 seq_printf(seq, "\tDIEPINT=0x%08x, DOEPINT=0x%08x\n",
281 readl(regs + DIEPINT(index)),
282 readl(regs + DOEPINT(index)));
283
284 seq_printf(seq, "\tDIEPTSIZ=0x%08x, DOEPTSIZ=0x%08x\n",
285 readl(regs + DIEPTSIZ(index)),
286 readl(regs + DOEPTSIZ(index)));
287
288 seq_puts(seq, "\n");
289 seq_printf(seq, "mps %d\n", ep->ep.maxpacket);
290 seq_printf(seq, "total_data=%ld\n", ep->total_data);
291
292 seq_printf(seq, "request list (%p,%p):\n",
293 ep->queue.next, ep->queue.prev);
294
295 spin_lock_irqsave(&hsotg->lock, flags);
296
297 list_for_each_entry(req, &ep->queue, queue) {
298 if (--show_limit < 0) {
299 seq_puts(seq, "not showing more requests...\n");
300 break;
301 }
302
303 seq_printf(seq, "%c req %p: %d bytes @%p, ",
304 req == ep->req ? '*' : ' ',
305 req, req->req.length, req->req.buf);
306 seq_printf(seq, "%d done, res %d\n",
307 req->req.actual, req->req.status);
308 }
309
310 spin_unlock_irqrestore(&hsotg->lock, flags);
311
312 return 0;
313}
314
315static int ep_open(struct inode *inode, struct file *file)
316{
317 return single_open(file, ep_show, inode->i_private);
318}
319
320static const struct file_operations ep_fops = {
321 .owner = THIS_MODULE,
322 .open = ep_open,
323 .read = seq_read,
324 .llseek = seq_lseek,
325 .release = single_release,
326};
327
328/**
329 * s3c_hsotg_create_debug - create debugfs directory and files
330 * @hsotg: The driver state
331 *
332 * Create the debugfs files to allow the user to get information
333 * about the state of the system. The directory name is created
334 * with the same name as the device itself, in case we end up
335 * with multiple blocks in future systems.
336 */
337static void s3c_hsotg_create_debug(struct dwc2_hsotg *hsotg)
338{
339 struct dentry *root;
340 struct dentry *file;
341 unsigned epidx;
342
343 root = hsotg->debug_root;
344
345 /* create general state file */
346
347 file = debugfs_create_file("state", S_IRUGO, root, hsotg, &state_fops);
348 if (IS_ERR(file))
349 dev_err(hsotg->dev, "%s: failed to create state\n", __func__);
350
351 file = debugfs_create_file("testmode", S_IRUGO | S_IWUSR, root, hsotg,
352 &testmode_fops);
353 if (IS_ERR(file))
354 dev_err(hsotg->dev, "%s: failed to create testmode\n",
355 __func__);
356
357 file = debugfs_create_file("fifo", S_IRUGO, root, hsotg, &fifo_fops);
358 if (IS_ERR(file))
359 dev_err(hsotg->dev, "%s: failed to create fifo\n", __func__);
360
361 /* Create one file for each out endpoint */
362 for (epidx = 0; epidx < hsotg->num_of_eps; epidx++) {
363 struct s3c_hsotg_ep *ep;
364
365 ep = hsotg->eps_out[epidx];
366 if (ep) {
367 file = debugfs_create_file(ep->name, S_IRUGO,
368 root, ep, &ep_fops);
369 if (IS_ERR(file))
370 dev_err(hsotg->dev, "failed to create %s debug file\n",
371 ep->name);
372 }
373 }
374 /* Create one file for each in endpoint. EP0 is handled with out eps */
375 for (epidx = 1; epidx < hsotg->num_of_eps; epidx++) {
376 struct s3c_hsotg_ep *ep;
377
378 ep = hsotg->eps_in[epidx];
379 if (ep) {
380 file = debugfs_create_file(ep->name, S_IRUGO,
381 root, ep, &ep_fops);
382 if (IS_ERR(file))
383 dev_err(hsotg->dev, "failed to create %s debug file\n",
384 ep->name);
385 }
386 }
387}
388#else
389static inline void s3c_hsotg_create_debug(struct dwc2_hsotg *hsotg) {}
390#endif
391
392/* s3c_hsotg_delete_debug is removed as cleanup in done in dwc2_debugfs_exit */
393
394#define dump_register(nm) \
395{ \
396 .name = #nm, \
397 .offset = nm, \
398}
399
400static const struct debugfs_reg32 dwc2_regs[] = {
401 /*
402 * Accessing registers like this can trigger mode mismatch interrupt.
403 * However, according to dwc2 databook, the register access, in this
404 * case, is completed on the processor bus but is ignored by the core
405 * and does not affect its operation.
406 */
407 dump_register(GOTGCTL),
408 dump_register(GOTGINT),
409 dump_register(GAHBCFG),
410 dump_register(GUSBCFG),
411 dump_register(GRSTCTL),
412 dump_register(GINTSTS),
413 dump_register(GINTMSK),
414 dump_register(GRXSTSR),
415 dump_register(GRXSTSP),
416 dump_register(GRXFSIZ),
417 dump_register(GNPTXFSIZ),
418 dump_register(GNPTXSTS),
419 dump_register(GI2CCTL),
420 dump_register(GPVNDCTL),
421 dump_register(GGPIO),
422 dump_register(GUID),
423 dump_register(GSNPSID),
424 dump_register(GHWCFG1),
425 dump_register(GHWCFG2),
426 dump_register(GHWCFG3),
427 dump_register(GHWCFG4),
428 dump_register(GLPMCFG),
429 dump_register(GPWRDN),
430 dump_register(GDFIFOCFG),
431 dump_register(ADPCTL),
432 dump_register(HPTXFSIZ),
433 dump_register(DPTXFSIZN(1)),
434 dump_register(DPTXFSIZN(2)),
435 dump_register(DPTXFSIZN(3)),
436 dump_register(DPTXFSIZN(4)),
437 dump_register(DPTXFSIZN(5)),
438 dump_register(DPTXFSIZN(6)),
439 dump_register(DPTXFSIZN(7)),
440 dump_register(DPTXFSIZN(8)),
441 dump_register(DPTXFSIZN(9)),
442 dump_register(DPTXFSIZN(10)),
443 dump_register(DPTXFSIZN(11)),
444 dump_register(DPTXFSIZN(12)),
445 dump_register(DPTXFSIZN(13)),
446 dump_register(DPTXFSIZN(14)),
447 dump_register(DPTXFSIZN(15)),
448 dump_register(DCFG),
449 dump_register(DCTL),
450 dump_register(DSTS),
451 dump_register(DIEPMSK),
452 dump_register(DOEPMSK),
453 dump_register(DAINT),
454 dump_register(DAINTMSK),
455 dump_register(DTKNQR1),
456 dump_register(DTKNQR2),
457 dump_register(DTKNQR3),
458 dump_register(DTKNQR4),
459 dump_register(DVBUSDIS),
460 dump_register(DVBUSPULSE),
461 dump_register(DIEPCTL(0)),
462 dump_register(DIEPCTL(1)),
463 dump_register(DIEPCTL(2)),
464 dump_register(DIEPCTL(3)),
465 dump_register(DIEPCTL(4)),
466 dump_register(DIEPCTL(5)),
467 dump_register(DIEPCTL(6)),
468 dump_register(DIEPCTL(7)),
469 dump_register(DIEPCTL(8)),
470 dump_register(DIEPCTL(9)),
471 dump_register(DIEPCTL(10)),
472 dump_register(DIEPCTL(11)),
473 dump_register(DIEPCTL(12)),
474 dump_register(DIEPCTL(13)),
475 dump_register(DIEPCTL(14)),
476 dump_register(DIEPCTL(15)),
477 dump_register(DOEPCTL(0)),
478 dump_register(DOEPCTL(1)),
479 dump_register(DOEPCTL(2)),
480 dump_register(DOEPCTL(3)),
481 dump_register(DOEPCTL(4)),
482 dump_register(DOEPCTL(5)),
483 dump_register(DOEPCTL(6)),
484 dump_register(DOEPCTL(7)),
485 dump_register(DOEPCTL(8)),
486 dump_register(DOEPCTL(9)),
487 dump_register(DOEPCTL(10)),
488 dump_register(DOEPCTL(11)),
489 dump_register(DOEPCTL(12)),
490 dump_register(DOEPCTL(13)),
491 dump_register(DOEPCTL(14)),
492 dump_register(DOEPCTL(15)),
493 dump_register(DIEPINT(0)),
494 dump_register(DIEPINT(1)),
495 dump_register(DIEPINT(2)),
496 dump_register(DIEPINT(3)),
497 dump_register(DIEPINT(4)),
498 dump_register(DIEPINT(5)),
499 dump_register(DIEPINT(6)),
500 dump_register(DIEPINT(7)),
501 dump_register(DIEPINT(8)),
502 dump_register(DIEPINT(9)),
503 dump_register(DIEPINT(10)),
504 dump_register(DIEPINT(11)),
505 dump_register(DIEPINT(12)),
506 dump_register(DIEPINT(13)),
507 dump_register(DIEPINT(14)),
508 dump_register(DIEPINT(15)),
509 dump_register(DOEPINT(0)),
510 dump_register(DOEPINT(1)),
511 dump_register(DOEPINT(2)),
512 dump_register(DOEPINT(3)),
513 dump_register(DOEPINT(4)),
514 dump_register(DOEPINT(5)),
515 dump_register(DOEPINT(6)),
516 dump_register(DOEPINT(7)),
517 dump_register(DOEPINT(8)),
518 dump_register(DOEPINT(9)),
519 dump_register(DOEPINT(10)),
520 dump_register(DOEPINT(11)),
521 dump_register(DOEPINT(12)),
522 dump_register(DOEPINT(13)),
523 dump_register(DOEPINT(14)),
524 dump_register(DOEPINT(15)),
525 dump_register(DIEPTSIZ(0)),
526 dump_register(DIEPTSIZ(1)),
527 dump_register(DIEPTSIZ(2)),
528 dump_register(DIEPTSIZ(3)),
529 dump_register(DIEPTSIZ(4)),
530 dump_register(DIEPTSIZ(5)),
531 dump_register(DIEPTSIZ(6)),
532 dump_register(DIEPTSIZ(7)),
533 dump_register(DIEPTSIZ(8)),
534 dump_register(DIEPTSIZ(9)),
535 dump_register(DIEPTSIZ(10)),
536 dump_register(DIEPTSIZ(11)),
537 dump_register(DIEPTSIZ(12)),
538 dump_register(DIEPTSIZ(13)),
539 dump_register(DIEPTSIZ(14)),
540 dump_register(DIEPTSIZ(15)),
541 dump_register(DOEPTSIZ(0)),
542 dump_register(DOEPTSIZ(1)),
543 dump_register(DOEPTSIZ(2)),
544 dump_register(DOEPTSIZ(3)),
545 dump_register(DOEPTSIZ(4)),
546 dump_register(DOEPTSIZ(5)),
547 dump_register(DOEPTSIZ(6)),
548 dump_register(DOEPTSIZ(7)),
549 dump_register(DOEPTSIZ(8)),
550 dump_register(DOEPTSIZ(9)),
551 dump_register(DOEPTSIZ(10)),
552 dump_register(DOEPTSIZ(11)),
553 dump_register(DOEPTSIZ(12)),
554 dump_register(DOEPTSIZ(13)),
555 dump_register(DOEPTSIZ(14)),
556 dump_register(DOEPTSIZ(15)),
557 dump_register(DIEPDMA(0)),
558 dump_register(DIEPDMA(1)),
559 dump_register(DIEPDMA(2)),
560 dump_register(DIEPDMA(3)),
561 dump_register(DIEPDMA(4)),
562 dump_register(DIEPDMA(5)),
563 dump_register(DIEPDMA(6)),
564 dump_register(DIEPDMA(7)),
565 dump_register(DIEPDMA(8)),
566 dump_register(DIEPDMA(9)),
567 dump_register(DIEPDMA(10)),
568 dump_register(DIEPDMA(11)),
569 dump_register(DIEPDMA(12)),
570 dump_register(DIEPDMA(13)),
571 dump_register(DIEPDMA(14)),
572 dump_register(DIEPDMA(15)),
573 dump_register(DOEPDMA(0)),
574 dump_register(DOEPDMA(1)),
575 dump_register(DOEPDMA(2)),
576 dump_register(DOEPDMA(3)),
577 dump_register(DOEPDMA(4)),
578 dump_register(DOEPDMA(5)),
579 dump_register(DOEPDMA(6)),
580 dump_register(DOEPDMA(7)),
581 dump_register(DOEPDMA(8)),
582 dump_register(DOEPDMA(9)),
583 dump_register(DOEPDMA(10)),
584 dump_register(DOEPDMA(11)),
585 dump_register(DOEPDMA(12)),
586 dump_register(DOEPDMA(13)),
587 dump_register(DOEPDMA(14)),
588 dump_register(DOEPDMA(15)),
589 dump_register(DTXFSTS(0)),
590 dump_register(DTXFSTS(1)),
591 dump_register(DTXFSTS(2)),
592 dump_register(DTXFSTS(3)),
593 dump_register(DTXFSTS(4)),
594 dump_register(DTXFSTS(5)),
595 dump_register(DTXFSTS(6)),
596 dump_register(DTXFSTS(7)),
597 dump_register(DTXFSTS(8)),
598 dump_register(DTXFSTS(9)),
599 dump_register(DTXFSTS(10)),
600 dump_register(DTXFSTS(11)),
601 dump_register(DTXFSTS(12)),
602 dump_register(DTXFSTS(13)),
603 dump_register(DTXFSTS(14)),
604 dump_register(DTXFSTS(15)),
605 dump_register(PCGCTL),
606 dump_register(HCFG),
607 dump_register(HFIR),
608 dump_register(HFNUM),
609 dump_register(HPTXSTS),
610 dump_register(HAINT),
611 dump_register(HAINTMSK),
612 dump_register(HFLBADDR),
613 dump_register(HPRT0),
614 dump_register(HCCHAR(0)),
615 dump_register(HCCHAR(1)),
616 dump_register(HCCHAR(2)),
617 dump_register(HCCHAR(3)),
618 dump_register(HCCHAR(4)),
619 dump_register(HCCHAR(5)),
620 dump_register(HCCHAR(6)),
621 dump_register(HCCHAR(7)),
622 dump_register(HCCHAR(8)),
623 dump_register(HCCHAR(9)),
624 dump_register(HCCHAR(10)),
625 dump_register(HCCHAR(11)),
626 dump_register(HCCHAR(12)),
627 dump_register(HCCHAR(13)),
628 dump_register(HCCHAR(14)),
629 dump_register(HCCHAR(15)),
630 dump_register(HCSPLT(0)),
631 dump_register(HCSPLT(1)),
632 dump_register(HCSPLT(2)),
633 dump_register(HCSPLT(3)),
634 dump_register(HCSPLT(4)),
635 dump_register(HCSPLT(5)),
636 dump_register(HCSPLT(6)),
637 dump_register(HCSPLT(7)),
638 dump_register(HCSPLT(8)),
639 dump_register(HCSPLT(9)),
640 dump_register(HCSPLT(10)),
641 dump_register(HCSPLT(11)),
642 dump_register(HCSPLT(12)),
643 dump_register(HCSPLT(13)),
644 dump_register(HCSPLT(14)),
645 dump_register(HCSPLT(15)),
646 dump_register(HCINT(0)),
647 dump_register(HCINT(1)),
648 dump_register(HCINT(2)),
649 dump_register(HCINT(3)),
650 dump_register(HCINT(4)),
651 dump_register(HCINT(5)),
652 dump_register(HCINT(6)),
653 dump_register(HCINT(7)),
654 dump_register(HCINT(8)),
655 dump_register(HCINT(9)),
656 dump_register(HCINT(10)),
657 dump_register(HCINT(11)),
658 dump_register(HCINT(12)),
659 dump_register(HCINT(13)),
660 dump_register(HCINT(14)),
661 dump_register(HCINT(15)),
662 dump_register(HCINTMSK(0)),
663 dump_register(HCINTMSK(1)),
664 dump_register(HCINTMSK(2)),
665 dump_register(HCINTMSK(3)),
666 dump_register(HCINTMSK(4)),
667 dump_register(HCINTMSK(5)),
668 dump_register(HCINTMSK(6)),
669 dump_register(HCINTMSK(7)),
670 dump_register(HCINTMSK(8)),
671 dump_register(HCINTMSK(9)),
672 dump_register(HCINTMSK(10)),
673 dump_register(HCINTMSK(11)),
674 dump_register(HCINTMSK(12)),
675 dump_register(HCINTMSK(13)),
676 dump_register(HCINTMSK(14)),
677 dump_register(HCINTMSK(15)),
678 dump_register(HCTSIZ(0)),
679 dump_register(HCTSIZ(1)),
680 dump_register(HCTSIZ(2)),
681 dump_register(HCTSIZ(3)),
682 dump_register(HCTSIZ(4)),
683 dump_register(HCTSIZ(5)),
684 dump_register(HCTSIZ(6)),
685 dump_register(HCTSIZ(7)),
686 dump_register(HCTSIZ(8)),
687 dump_register(HCTSIZ(9)),
688 dump_register(HCTSIZ(10)),
689 dump_register(HCTSIZ(11)),
690 dump_register(HCTSIZ(12)),
691 dump_register(HCTSIZ(13)),
692 dump_register(HCTSIZ(14)),
693 dump_register(HCTSIZ(15)),
694 dump_register(HCDMA(0)),
695 dump_register(HCDMA(1)),
696 dump_register(HCDMA(2)),
697 dump_register(HCDMA(3)),
698 dump_register(HCDMA(4)),
699 dump_register(HCDMA(5)),
700 dump_register(HCDMA(6)),
701 dump_register(HCDMA(7)),
702 dump_register(HCDMA(8)),
703 dump_register(HCDMA(9)),
704 dump_register(HCDMA(10)),
705 dump_register(HCDMA(11)),
706 dump_register(HCDMA(12)),
707 dump_register(HCDMA(13)),
708 dump_register(HCDMA(14)),
709 dump_register(HCDMA(15)),
710 dump_register(HCDMAB(0)),
711 dump_register(HCDMAB(1)),
712 dump_register(HCDMAB(2)),
713 dump_register(HCDMAB(3)),
714 dump_register(HCDMAB(4)),
715 dump_register(HCDMAB(5)),
716 dump_register(HCDMAB(6)),
717 dump_register(HCDMAB(7)),
718 dump_register(HCDMAB(8)),
719 dump_register(HCDMAB(9)),
720 dump_register(HCDMAB(10)),
721 dump_register(HCDMAB(11)),
722 dump_register(HCDMAB(12)),
723 dump_register(HCDMAB(13)),
724 dump_register(HCDMAB(14)),
725 dump_register(HCDMAB(15)),
726};
727
728int dwc2_debugfs_init(struct dwc2_hsotg *hsotg)
729{
730 int ret;
731 struct dentry *file;
732
733 hsotg->debug_root = debugfs_create_dir(dev_name(hsotg->dev), NULL);
734 if (!hsotg->debug_root) {
735 ret = -ENOMEM;
736 goto err0;
737 }
738
739 /* Add gadget debugfs nodes */
740 s3c_hsotg_create_debug(hsotg);
741
742 hsotg->regset = devm_kzalloc(hsotg->dev, sizeof(*hsotg->regset),
743 GFP_KERNEL);
744 if (!hsotg->regset) {
745 ret = -ENOMEM;
746 goto err1;
747 }
748
749 hsotg->regset->regs = dwc2_regs;
750 hsotg->regset->nregs = ARRAY_SIZE(dwc2_regs);
751 hsotg->regset->base = hsotg->regs;
752
753 file = debugfs_create_regset32("regdump", S_IRUGO, hsotg->debug_root,
754 hsotg->regset);
755 if (!file) {
756 ret = -ENOMEM;
757 goto err1;
758 }
759
760 return 0;
761err1:
762 debugfs_remove_recursive(hsotg->debug_root);
763err0:
764 return ret;
765}
766
767void dwc2_debugfs_exit(struct dwc2_hsotg *hsotg)
768{
769 debugfs_remove_recursive(hsotg->debug_root);
770 hsotg->debug_root = NULL;
771}
diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
index 6a30887082cd..4d47b7c09238 100644
--- a/drivers/usb/dwc2/gadget.c
+++ b/drivers/usb/dwc2/gadget.c
@@ -20,7 +20,6 @@
20#include <linux/interrupt.h> 20#include <linux/interrupt.h>
21#include <linux/platform_device.h> 21#include <linux/platform_device.h>
22#include <linux/dma-mapping.h> 22#include <linux/dma-mapping.h>
23#include <linux/debugfs.h>
24#include <linux/mutex.h> 23#include <linux/mutex.h>
25#include <linux/seq_file.h> 24#include <linux/seq_file.h>
26#include <linux/delay.h> 25#include <linux/delay.h>
@@ -35,7 +34,6 @@
35#include <linux/usb/gadget.h> 34#include <linux/usb/gadget.h>
36#include <linux/usb/phy.h> 35#include <linux/usb/phy.h>
37#include <linux/platform_data/s3c-hsotg.h> 36#include <linux/platform_data/s3c-hsotg.h>
38#include <linux/uaccess.h>
39 37
40#include "core.h" 38#include "core.h"
41#include "hw.h" 39#include "hw.h"
@@ -792,6 +790,13 @@ static int s3c_hsotg_ep_queue(struct usb_ep *ep, struct usb_request *req,
792 ep->name, req, req->length, req->buf, req->no_interrupt, 790 ep->name, req, req->length, req->buf, req->no_interrupt,
793 req->zero, req->short_not_ok); 791 req->zero, req->short_not_ok);
794 792
793 /* Prevent new request submission when controller is suspended */
794 if (hs->lx_state == DWC2_L2) {
795 dev_dbg(hs->dev, "%s: don't submit request while suspended\n",
796 __func__);
797 return -EAGAIN;
798 }
799
795 /* initialise status of the request */ 800 /* initialise status of the request */
796 INIT_LIST_HEAD(&hs_req->queue); 801 INIT_LIST_HEAD(&hs_req->queue);
797 req->actual = 0; 802 req->actual = 0;
@@ -894,7 +899,7 @@ static struct s3c_hsotg_ep *ep_from_windex(struct dwc2_hsotg *hsotg,
894 * @testmode: requested usb test mode 899 * @testmode: requested usb test mode
895 * Enable usb Test Mode requested by the Host. 900 * Enable usb Test Mode requested by the Host.
896 */ 901 */
897static int s3c_hsotg_set_test_mode(struct dwc2_hsotg *hsotg, int testmode) 902int s3c_hsotg_set_test_mode(struct dwc2_hsotg *hsotg, int testmode)
898{ 903{
899 int dctl = readl(hsotg->regs + DCTL); 904 int dctl = readl(hsotg->regs + DCTL);
900 905
@@ -2185,7 +2190,6 @@ void s3c_hsotg_disconnect(struct dwc2_hsotg *hsotg)
2185 2190
2186 call_gadget(hsotg, disconnect); 2191 call_gadget(hsotg, disconnect);
2187} 2192}
2188EXPORT_SYMBOL_GPL(s3c_hsotg_disconnect);
2189 2193
2190/** 2194/**
2191 * s3c_hsotg_irq_fifoempty - TX FIFO empty interrupt handler 2195 * s3c_hsotg_irq_fifoempty - TX FIFO empty interrupt handler
@@ -2310,8 +2314,9 @@ void s3c_hsotg_core_init_disconnected(struct dwc2_hsotg *hsotg,
2310 writel(GINTSTS_ERLYSUSP | GINTSTS_SESSREQINT | 2314 writel(GINTSTS_ERLYSUSP | GINTSTS_SESSREQINT |
2311 GINTSTS_GOUTNAKEFF | GINTSTS_GINNAKEFF | 2315 GINTSTS_GOUTNAKEFF | GINTSTS_GINNAKEFF |
2312 GINTSTS_CONIDSTSCHNG | GINTSTS_USBRST | 2316 GINTSTS_CONIDSTSCHNG | GINTSTS_USBRST |
2313 GINTSTS_ENUMDONE | GINTSTS_OTGINT | 2317 GINTSTS_RESETDET | GINTSTS_ENUMDONE |
2314 GINTSTS_USBSUSP | GINTSTS_WKUPINT, 2318 GINTSTS_OTGINT | GINTSTS_USBSUSP |
2319 GINTSTS_WKUPINT,
2315 hsotg->regs + GINTMSK); 2320 hsotg->regs + GINTMSK);
2316 2321
2317 if (using_dma(hsotg)) 2322 if (using_dma(hsotg))
@@ -2477,7 +2482,19 @@ irq_retry:
2477 } 2482 }
2478 } 2483 }
2479 2484
2480 if (gintsts & GINTSTS_USBRST) { 2485 if (gintsts & GINTSTS_RESETDET) {
2486 dev_dbg(hsotg->dev, "%s: USBRstDet\n", __func__);
2487
2488 writel(GINTSTS_RESETDET, hsotg->regs + GINTSTS);
2489
2490 /* This event must be used only if controller is suspended */
2491 if (hsotg->lx_state == DWC2_L2) {
2492 dwc2_exit_hibernation(hsotg, true);
2493 hsotg->lx_state = DWC2_L0;
2494 }
2495 }
2496
2497 if (gintsts & (GINTSTS_USBRST | GINTSTS_RESETDET)) {
2481 2498
2482 u32 usb_status = readl(hsotg->regs + GOTGCTL); 2499 u32 usb_status = readl(hsotg->regs + GOTGCTL);
2483 2500
@@ -2497,6 +2514,7 @@ irq_retry:
2497 kill_all_requests(hsotg, hsotg->eps_out[0], 2514 kill_all_requests(hsotg, hsotg->eps_out[0],
2498 -ECONNRESET); 2515 -ECONNRESET);
2499 2516
2517 hsotg->lx_state = DWC2_L0;
2500 s3c_hsotg_core_init_disconnected(hsotg, true); 2518 s3c_hsotg_core_init_disconnected(hsotg, true);
2501 } 2519 }
2502 } 2520 }
@@ -2745,7 +2763,7 @@ error:
2745 * s3c_hsotg_ep_disable - disable given endpoint 2763 * s3c_hsotg_ep_disable - disable given endpoint
2746 * @ep: The endpoint to disable. 2764 * @ep: The endpoint to disable.
2747 */ 2765 */
2748static int s3c_hsotg_ep_disable_force(struct usb_ep *ep, bool force) 2766static int s3c_hsotg_ep_disable(struct usb_ep *ep)
2749{ 2767{
2750 struct s3c_hsotg_ep *hs_ep = our_ep(ep); 2768 struct s3c_hsotg_ep *hs_ep = our_ep(ep);
2751 struct dwc2_hsotg *hsotg = hs_ep->parent; 2769 struct dwc2_hsotg *hsotg = hs_ep->parent;
@@ -2788,10 +2806,6 @@ static int s3c_hsotg_ep_disable_force(struct usb_ep *ep, bool force)
2788 return 0; 2806 return 0;
2789} 2807}
2790 2808
2791static int s3c_hsotg_ep_disable(struct usb_ep *ep)
2792{
2793 return s3c_hsotg_ep_disable_force(ep, false);
2794}
2795/** 2809/**
2796 * on_list - check request is on the given endpoint 2810 * on_list - check request is on the given endpoint
2797 * @ep: The endpoint to check. 2811 * @ep: The endpoint to check.
@@ -3187,6 +3201,14 @@ static int s3c_hsotg_vbus_session(struct usb_gadget *gadget, int is_active)
3187 spin_lock_irqsave(&hsotg->lock, flags); 3201 spin_lock_irqsave(&hsotg->lock, flags);
3188 3202
3189 if (is_active) { 3203 if (is_active) {
3204 /*
3205 * If controller is hibernated, it must exit from hibernation
3206 * before being initialized
3207 */
3208 if (hsotg->lx_state == DWC2_L2) {
3209 dwc2_exit_hibernation(hsotg, false);
3210 hsotg->lx_state = DWC2_L0;
3211 }
3190 /* Kill any ep0 requests as controller will be reinitialized */ 3212 /* Kill any ep0 requests as controller will be reinitialized */
3191 kill_all_requests(hsotg, hsotg->eps_out[0], -ECONNRESET); 3213 kill_all_requests(hsotg, hsotg->eps_out[0], -ECONNRESET);
3192 s3c_hsotg_core_init_disconnected(hsotg, false); 3214 s3c_hsotg_core_init_disconnected(hsotg, false);
@@ -3391,404 +3413,6 @@ static void s3c_hsotg_dump(struct dwc2_hsotg *hsotg)
3391#endif 3413#endif
3392} 3414}
3393 3415
3394/**
3395 * testmode_write - debugfs: change usb test mode
3396 * @seq: The seq file to write to.
3397 * @v: Unused parameter.
3398 *
3399 * This debugfs entry modify the current usb test mode.
3400 */
3401static ssize_t testmode_write(struct file *file, const char __user *ubuf, size_t
3402 count, loff_t *ppos)
3403{
3404 struct seq_file *s = file->private_data;
3405 struct dwc2_hsotg *hsotg = s->private;
3406 unsigned long flags;
3407 u32 testmode = 0;
3408 char buf[32];
3409
3410 if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count)))
3411 return -EFAULT;
3412
3413 if (!strncmp(buf, "test_j", 6))
3414 testmode = TEST_J;
3415 else if (!strncmp(buf, "test_k", 6))
3416 testmode = TEST_K;
3417 else if (!strncmp(buf, "test_se0_nak", 12))
3418 testmode = TEST_SE0_NAK;
3419 else if (!strncmp(buf, "test_packet", 11))
3420 testmode = TEST_PACKET;
3421 else if (!strncmp(buf, "test_force_enable", 17))
3422 testmode = TEST_FORCE_EN;
3423 else
3424 testmode = 0;
3425
3426 spin_lock_irqsave(&hsotg->lock, flags);
3427 s3c_hsotg_set_test_mode(hsotg, testmode);
3428 spin_unlock_irqrestore(&hsotg->lock, flags);
3429 return count;
3430}
3431
3432/**
3433 * testmode_show - debugfs: show usb test mode state
3434 * @seq: The seq file to write to.
3435 * @v: Unused parameter.
3436 *
3437 * This debugfs entry shows which usb test mode is currently enabled.
3438 */
3439static int testmode_show(struct seq_file *s, void *unused)
3440{
3441 struct dwc2_hsotg *hsotg = s->private;
3442 unsigned long flags;
3443 int dctl;
3444
3445 spin_lock_irqsave(&hsotg->lock, flags);
3446 dctl = readl(hsotg->regs + DCTL);
3447 dctl &= DCTL_TSTCTL_MASK;
3448 dctl >>= DCTL_TSTCTL_SHIFT;
3449 spin_unlock_irqrestore(&hsotg->lock, flags);
3450
3451 switch (dctl) {
3452 case 0:
3453 seq_puts(s, "no test\n");
3454 break;
3455 case TEST_J:
3456 seq_puts(s, "test_j\n");
3457 break;
3458 case TEST_K:
3459 seq_puts(s, "test_k\n");
3460 break;
3461 case TEST_SE0_NAK:
3462 seq_puts(s, "test_se0_nak\n");
3463 break;
3464 case TEST_PACKET:
3465 seq_puts(s, "test_packet\n");
3466 break;
3467 case TEST_FORCE_EN:
3468 seq_puts(s, "test_force_enable\n");
3469 break;
3470 default:
3471 seq_printf(s, "UNKNOWN %d\n", dctl);
3472 }
3473
3474 return 0;
3475}
3476
3477static int testmode_open(struct inode *inode, struct file *file)
3478{
3479 return single_open(file, testmode_show, inode->i_private);
3480}
3481
3482static const struct file_operations testmode_fops = {
3483 .owner = THIS_MODULE,
3484 .open = testmode_open,
3485 .write = testmode_write,
3486 .read = seq_read,
3487 .llseek = seq_lseek,
3488 .release = single_release,
3489};
3490
3491/**
3492 * state_show - debugfs: show overall driver and device state.
3493 * @seq: The seq file to write to.
3494 * @v: Unused parameter.
3495 *
3496 * This debugfs entry shows the overall state of the hardware and
3497 * some general information about each of the endpoints available
3498 * to the system.
3499 */
3500static int state_show(struct seq_file *seq, void *v)
3501{
3502 struct dwc2_hsotg *hsotg = seq->private;
3503 void __iomem *regs = hsotg->regs;
3504 int idx;
3505
3506 seq_printf(seq, "DCFG=0x%08x, DCTL=0x%08x, DSTS=0x%08x\n",
3507 readl(regs + DCFG),
3508 readl(regs + DCTL),
3509 readl(regs + DSTS));
3510
3511 seq_printf(seq, "DIEPMSK=0x%08x, DOEPMASK=0x%08x\n",
3512 readl(regs + DIEPMSK), readl(regs + DOEPMSK));
3513
3514 seq_printf(seq, "GINTMSK=0x%08x, GINTSTS=0x%08x\n",
3515 readl(regs + GINTMSK),
3516 readl(regs + GINTSTS));
3517
3518 seq_printf(seq, "DAINTMSK=0x%08x, DAINT=0x%08x\n",
3519 readl(regs + DAINTMSK),
3520 readl(regs + DAINT));
3521
3522 seq_printf(seq, "GNPTXSTS=0x%08x, GRXSTSR=%08x\n",
3523 readl(regs + GNPTXSTS),
3524 readl(regs + GRXSTSR));
3525
3526 seq_puts(seq, "\nEndpoint status:\n");
3527
3528 for (idx = 0; idx < hsotg->num_of_eps; idx++) {
3529 u32 in, out;
3530
3531 in = readl(regs + DIEPCTL(idx));
3532 out = readl(regs + DOEPCTL(idx));
3533
3534 seq_printf(seq, "ep%d: DIEPCTL=0x%08x, DOEPCTL=0x%08x",
3535 idx, in, out);
3536
3537 in = readl(regs + DIEPTSIZ(idx));
3538 out = readl(regs + DOEPTSIZ(idx));
3539
3540 seq_printf(seq, ", DIEPTSIZ=0x%08x, DOEPTSIZ=0x%08x",
3541 in, out);
3542
3543 seq_puts(seq, "\n");
3544 }
3545
3546 return 0;
3547}
3548
3549static int state_open(struct inode *inode, struct file *file)
3550{
3551 return single_open(file, state_show, inode->i_private);
3552}
3553
3554static const struct file_operations state_fops = {
3555 .owner = THIS_MODULE,
3556 .open = state_open,
3557 .read = seq_read,
3558 .llseek = seq_lseek,
3559 .release = single_release,
3560};
3561
3562/**
3563 * fifo_show - debugfs: show the fifo information
3564 * @seq: The seq_file to write data to.
3565 * @v: Unused parameter.
3566 *
3567 * Show the FIFO information for the overall fifo and all the
3568 * periodic transmission FIFOs.
3569 */
3570static int fifo_show(struct seq_file *seq, void *v)
3571{
3572 struct dwc2_hsotg *hsotg = seq->private;
3573 void __iomem *regs = hsotg->regs;
3574 u32 val;
3575 int idx;
3576
3577 seq_puts(seq, "Non-periodic FIFOs:\n");
3578 seq_printf(seq, "RXFIFO: Size %d\n", readl(regs + GRXFSIZ));
3579
3580 val = readl(regs + GNPTXFSIZ);
3581 seq_printf(seq, "NPTXFIFO: Size %d, Start 0x%08x\n",
3582 val >> FIFOSIZE_DEPTH_SHIFT,
3583 val & FIFOSIZE_DEPTH_MASK);
3584
3585 seq_puts(seq, "\nPeriodic TXFIFOs:\n");
3586
3587 for (idx = 1; idx < hsotg->num_of_eps; idx++) {
3588 val = readl(regs + DPTXFSIZN(idx));
3589
3590 seq_printf(seq, "\tDPTXFIFO%2d: Size %d, Start 0x%08x\n", idx,
3591 val >> FIFOSIZE_DEPTH_SHIFT,
3592 val & FIFOSIZE_STARTADDR_MASK);
3593 }
3594
3595 return 0;
3596}
3597
3598static int fifo_open(struct inode *inode, struct file *file)
3599{
3600 return single_open(file, fifo_show, inode->i_private);
3601}
3602
3603static const struct file_operations fifo_fops = {
3604 .owner = THIS_MODULE,
3605 .open = fifo_open,
3606 .read = seq_read,
3607 .llseek = seq_lseek,
3608 .release = single_release,
3609};
3610
3611
3612static const char *decode_direction(int is_in)
3613{
3614 return is_in ? "in" : "out";
3615}
3616
3617/**
3618 * ep_show - debugfs: show the state of an endpoint.
3619 * @seq: The seq_file to write data to.
3620 * @v: Unused parameter.
3621 *
3622 * This debugfs entry shows the state of the given endpoint (one is
3623 * registered for each available).
3624 */
3625static int ep_show(struct seq_file *seq, void *v)
3626{
3627 struct s3c_hsotg_ep *ep = seq->private;
3628 struct dwc2_hsotg *hsotg = ep->parent;
3629 struct s3c_hsotg_req *req;
3630 void __iomem *regs = hsotg->regs;
3631 int index = ep->index;
3632 int show_limit = 15;
3633 unsigned long flags;
3634
3635 seq_printf(seq, "Endpoint index %d, named %s, dir %s:\n",
3636 ep->index, ep->ep.name, decode_direction(ep->dir_in));
3637
3638 /* first show the register state */
3639
3640 seq_printf(seq, "\tDIEPCTL=0x%08x, DOEPCTL=0x%08x\n",
3641 readl(regs + DIEPCTL(index)),
3642 readl(regs + DOEPCTL(index)));
3643
3644 seq_printf(seq, "\tDIEPDMA=0x%08x, DOEPDMA=0x%08x\n",
3645 readl(regs + DIEPDMA(index)),
3646 readl(regs + DOEPDMA(index)));
3647
3648 seq_printf(seq, "\tDIEPINT=0x%08x, DOEPINT=0x%08x\n",
3649 readl(regs + DIEPINT(index)),
3650 readl(regs + DOEPINT(index)));
3651
3652 seq_printf(seq, "\tDIEPTSIZ=0x%08x, DOEPTSIZ=0x%08x\n",
3653 readl(regs + DIEPTSIZ(index)),
3654 readl(regs + DOEPTSIZ(index)));
3655
3656 seq_puts(seq, "\n");
3657 seq_printf(seq, "mps %d\n", ep->ep.maxpacket);
3658 seq_printf(seq, "total_data=%ld\n", ep->total_data);
3659
3660 seq_printf(seq, "request list (%p,%p):\n",
3661 ep->queue.next, ep->queue.prev);
3662
3663 spin_lock_irqsave(&hsotg->lock, flags);
3664
3665 list_for_each_entry(req, &ep->queue, queue) {
3666 if (--show_limit < 0) {
3667 seq_puts(seq, "not showing more requests...\n");
3668 break;
3669 }
3670
3671 seq_printf(seq, "%c req %p: %d bytes @%p, ",
3672 req == ep->req ? '*' : ' ',
3673 req, req->req.length, req->req.buf);
3674 seq_printf(seq, "%d done, res %d\n",
3675 req->req.actual, req->req.status);
3676 }
3677
3678 spin_unlock_irqrestore(&hsotg->lock, flags);
3679
3680 return 0;
3681}
3682
3683static int ep_open(struct inode *inode, struct file *file)
3684{
3685 return single_open(file, ep_show, inode->i_private);
3686}
3687
3688static const struct file_operations ep_fops = {
3689 .owner = THIS_MODULE,
3690 .open = ep_open,
3691 .read = seq_read,
3692 .llseek = seq_lseek,
3693 .release = single_release,
3694};
3695
3696/**
3697 * s3c_hsotg_create_debug - create debugfs directory and files
3698 * @hsotg: The driver state
3699 *
3700 * Create the debugfs files to allow the user to get information
3701 * about the state of the system. The directory name is created
3702 * with the same name as the device itself, in case we end up
3703 * with multiple blocks in future systems.
3704 */
3705static void s3c_hsotg_create_debug(struct dwc2_hsotg *hsotg)
3706{
3707 struct dentry *root;
3708 unsigned epidx;
3709
3710 root = debugfs_create_dir(dev_name(hsotg->dev), NULL);
3711 hsotg->debug_root = root;
3712 if (IS_ERR(root)) {
3713 dev_err(hsotg->dev, "cannot create debug root\n");
3714 return;
3715 }
3716
3717 /* create general state file */
3718
3719 hsotg->debug_file = debugfs_create_file("state", S_IRUGO, root,
3720 hsotg, &state_fops);
3721
3722 if (IS_ERR(hsotg->debug_file))
3723 dev_err(hsotg->dev, "%s: failed to create state\n", __func__);
3724
3725 hsotg->debug_testmode = debugfs_create_file("testmode",
3726 S_IRUGO | S_IWUSR, root,
3727 hsotg, &testmode_fops);
3728
3729 if (IS_ERR(hsotg->debug_testmode))
3730 dev_err(hsotg->dev, "%s: failed to create testmode\n",
3731 __func__);
3732
3733 hsotg->debug_fifo = debugfs_create_file("fifo", S_IRUGO, root,
3734 hsotg, &fifo_fops);
3735
3736 if (IS_ERR(hsotg->debug_fifo))
3737 dev_err(hsotg->dev, "%s: failed to create fifo\n", __func__);
3738
3739 /* Create one file for each out endpoint */
3740 for (epidx = 0; epidx < hsotg->num_of_eps; epidx++) {
3741 struct s3c_hsotg_ep *ep;
3742
3743 ep = hsotg->eps_out[epidx];
3744 if (ep) {
3745 ep->debugfs = debugfs_create_file(ep->name, S_IRUGO,
3746 root, ep, &ep_fops);
3747
3748 if (IS_ERR(ep->debugfs))
3749 dev_err(hsotg->dev, "failed to create %s debug file\n",
3750 ep->name);
3751 }
3752 }
3753 /* Create one file for each in endpoint. EP0 is handled with out eps */
3754 for (epidx = 1; epidx < hsotg->num_of_eps; epidx++) {
3755 struct s3c_hsotg_ep *ep;
3756
3757 ep = hsotg->eps_in[epidx];
3758 if (ep) {
3759 ep->debugfs = debugfs_create_file(ep->name, S_IRUGO,
3760 root, ep, &ep_fops);
3761
3762 if (IS_ERR(ep->debugfs))
3763 dev_err(hsotg->dev, "failed to create %s debug file\n",
3764 ep->name);
3765 }
3766 }
3767}
3768
3769/**
3770 * s3c_hsotg_delete_debug - cleanup debugfs entries
3771 * @hsotg: The driver state
3772 *
3773 * Cleanup (remove) the debugfs files for use on module exit.
3774 */
3775static void s3c_hsotg_delete_debug(struct dwc2_hsotg *hsotg)
3776{
3777 unsigned epidx;
3778
3779 for (epidx = 0; epidx < hsotg->num_of_eps; epidx++) {
3780 if (hsotg->eps_in[epidx])
3781 debugfs_remove(hsotg->eps_in[epidx]->debugfs);
3782 if (hsotg->eps_out[epidx])
3783 debugfs_remove(hsotg->eps_out[epidx]->debugfs);
3784 }
3785
3786 debugfs_remove(hsotg->debug_file);
3787 debugfs_remove(hsotg->debug_testmode);
3788 debugfs_remove(hsotg->debug_fifo);
3789 debugfs_remove(hsotg->debug_root);
3790}
3791
3792#ifdef CONFIG_OF 3416#ifdef CONFIG_OF
3793static void s3c_hsotg_of_probe(struct dwc2_hsotg *hsotg) 3417static void s3c_hsotg_of_probe(struct dwc2_hsotg *hsotg)
3794{ 3418{
@@ -3896,6 +3520,8 @@ int dwc2_gadget_init(struct dwc2_hsotg *hsotg, int irq)
3896 hsotg->gadget.max_speed = USB_SPEED_HIGH; 3520 hsotg->gadget.max_speed = USB_SPEED_HIGH;
3897 hsotg->gadget.ops = &s3c_hsotg_gadget_ops; 3521 hsotg->gadget.ops = &s3c_hsotg_gadget_ops;
3898 hsotg->gadget.name = dev_name(dev); 3522 hsotg->gadget.name = dev_name(dev);
3523 if (hsotg->dr_mode == USB_DR_MODE_OTG)
3524 hsotg->gadget.is_otg = 1;
3899 3525
3900 /* reset the system */ 3526 /* reset the system */
3901 3527
@@ -4028,8 +3654,6 @@ int dwc2_gadget_init(struct dwc2_hsotg *hsotg, int irq)
4028 if (ret) 3654 if (ret)
4029 goto err_supplies; 3655 goto err_supplies;
4030 3656
4031 s3c_hsotg_create_debug(hsotg);
4032
4033 s3c_hsotg_dump(hsotg); 3657 s3c_hsotg_dump(hsotg);
4034 3658
4035 return 0; 3659 return 0;
@@ -4041,7 +3665,6 @@ err_clk:
4041 3665
4042 return ret; 3666 return ret;
4043} 3667}
4044EXPORT_SYMBOL_GPL(dwc2_gadget_init);
4045 3668
4046/** 3669/**
4047 * s3c_hsotg_remove - remove function for hsotg driver 3670 * s3c_hsotg_remove - remove function for hsotg driver
@@ -4050,18 +3673,19 @@ EXPORT_SYMBOL_GPL(dwc2_gadget_init);
4050int s3c_hsotg_remove(struct dwc2_hsotg *hsotg) 3673int s3c_hsotg_remove(struct dwc2_hsotg *hsotg)
4051{ 3674{
4052 usb_del_gadget_udc(&hsotg->gadget); 3675 usb_del_gadget_udc(&hsotg->gadget);
4053 s3c_hsotg_delete_debug(hsotg);
4054 clk_disable_unprepare(hsotg->clk); 3676 clk_disable_unprepare(hsotg->clk);
4055 3677
4056 return 0; 3678 return 0;
4057} 3679}
4058EXPORT_SYMBOL_GPL(s3c_hsotg_remove);
4059 3680
4060int s3c_hsotg_suspend(struct dwc2_hsotg *hsotg) 3681int s3c_hsotg_suspend(struct dwc2_hsotg *hsotg)
4061{ 3682{
4062 unsigned long flags; 3683 unsigned long flags;
4063 int ret = 0; 3684 int ret = 0;
4064 3685
3686 if (hsotg->lx_state != DWC2_L0)
3687 return ret;
3688
4065 mutex_lock(&hsotg->init_mutex); 3689 mutex_lock(&hsotg->init_mutex);
4066 3690
4067 if (hsotg->driver) { 3691 if (hsotg->driver) {
@@ -4095,13 +3719,15 @@ int s3c_hsotg_suspend(struct dwc2_hsotg *hsotg)
4095 3719
4096 return ret; 3720 return ret;
4097} 3721}
4098EXPORT_SYMBOL_GPL(s3c_hsotg_suspend);
4099 3722
4100int s3c_hsotg_resume(struct dwc2_hsotg *hsotg) 3723int s3c_hsotg_resume(struct dwc2_hsotg *hsotg)
4101{ 3724{
4102 unsigned long flags; 3725 unsigned long flags;
4103 int ret = 0; 3726 int ret = 0;
4104 3727
3728 if (hsotg->lx_state == DWC2_L2)
3729 return ret;
3730
4105 mutex_lock(&hsotg->init_mutex); 3731 mutex_lock(&hsotg->init_mutex);
4106 3732
4107 if (hsotg->driver) { 3733 if (hsotg->driver) {
@@ -4124,4 +3750,3 @@ int s3c_hsotg_resume(struct dwc2_hsotg *hsotg)
4124 3750
4125 return ret; 3751 return ret;
4126} 3752}
4127EXPORT_SYMBOL_GPL(s3c_hsotg_resume);
diff --git a/drivers/usb/dwc2/hcd.c b/drivers/usb/dwc2/hcd.c
index fbbbac2150a5..b10377c65064 100644
--- a/drivers/usb/dwc2/hcd.c
+++ b/drivers/usb/dwc2/hcd.c
@@ -357,12 +357,12 @@ void dwc2_hcd_stop(struct dwc2_hsotg *hsotg)
357 writel(0, hsotg->regs + HPRT0); 357 writel(0, hsotg->regs + HPRT0);
358} 358}
359 359
360/* Caller must hold driver lock */
360static int dwc2_hcd_urb_enqueue(struct dwc2_hsotg *hsotg, 361static int dwc2_hcd_urb_enqueue(struct dwc2_hsotg *hsotg,
361 struct dwc2_hcd_urb *urb, void **ep_handle, 362 struct dwc2_hcd_urb *urb, void **ep_handle,
362 gfp_t mem_flags) 363 gfp_t mem_flags)
363{ 364{
364 struct dwc2_qtd *qtd; 365 struct dwc2_qtd *qtd;
365 unsigned long flags;
366 u32 intr_mask; 366 u32 intr_mask;
367 int retval; 367 int retval;
368 int dev_speed; 368 int dev_speed;
@@ -413,11 +413,9 @@ static int dwc2_hcd_urb_enqueue(struct dwc2_hsotg *hsotg,
413 */ 413 */
414 return 0; 414 return 0;
415 415
416 spin_lock_irqsave(&hsotg->lock, flags);
417 tr_type = dwc2_hcd_select_transactions(hsotg); 416 tr_type = dwc2_hcd_select_transactions(hsotg);
418 if (tr_type != DWC2_TRANSACTION_NONE) 417 if (tr_type != DWC2_TRANSACTION_NONE)
419 dwc2_hcd_queue_transactions(hsotg, tr_type); 418 dwc2_hcd_queue_transactions(hsotg, tr_type);
420 spin_unlock_irqrestore(&hsotg->lock, flags);
421 } 419 }
422 420
423 return 0; 421 return 0;
@@ -721,9 +719,7 @@ static int dwc2_hc_setup_align_buf(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh,
721 /* 3072 = 3 max-size Isoc packets */ 719 /* 3072 = 3 max-size Isoc packets */
722 buf_size = 3072; 720 buf_size = 3072;
723 721
724 qh->dw_align_buf = dma_alloc_coherent(hsotg->dev, buf_size, 722 qh->dw_align_buf = kmalloc(buf_size, GFP_ATOMIC | GFP_DMA);
725 &qh->dw_align_buf_dma,
726 GFP_ATOMIC);
727 if (!qh->dw_align_buf) 723 if (!qh->dw_align_buf)
728 return -ENOMEM; 724 return -ENOMEM;
729 qh->dw_align_buf_size = buf_size; 725 qh->dw_align_buf_size = buf_size;
@@ -748,6 +744,15 @@ static int dwc2_hc_setup_align_buf(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh,
748 } 744 }
749 } 745 }
750 746
747 qh->dw_align_buf_dma = dma_map_single(hsotg->dev,
748 qh->dw_align_buf, qh->dw_align_buf_size,
749 chan->ep_is_in ? DMA_FROM_DEVICE : DMA_TO_DEVICE);
750 if (dma_mapping_error(hsotg->dev, qh->dw_align_buf_dma)) {
751 dev_err(hsotg->dev, "can't map align_buf\n");
752 chan->align_buf = 0;
753 return -EINVAL;
754 }
755
751 chan->align_buf = qh->dw_align_buf_dma; 756 chan->align_buf = qh->dw_align_buf_dma;
752 return 0; 757 return 0;
753} 758}
@@ -1774,6 +1779,15 @@ static int dwc2_hcd_hub_control(struct dwc2_hsotg *hsotg, u16 typereq,
1774 /* Not supported */ 1779 /* Not supported */
1775 break; 1780 break;
1776 1781
1782 case USB_PORT_FEAT_TEST:
1783 hprt0 = dwc2_read_hprt0(hsotg);
1784 dev_dbg(hsotg->dev,
1785 "SetPortFeature - USB_PORT_FEAT_TEST\n");
1786 hprt0 &= ~HPRT0_TSTCTL_MASK;
1787 hprt0 |= (windex >> 8) << HPRT0_TSTCTL_SHIFT;
1788 writel(hprt0, hsotg->regs + HPRT0);
1789 break;
1790
1777 default: 1791 default:
1778 retval = -EINVAL; 1792 retval = -EINVAL;
1779 dev_err(hsotg->dev, 1793 dev_err(hsotg->dev,
@@ -2313,6 +2327,22 @@ static void _dwc2_hcd_stop(struct usb_hcd *hcd)
2313 usleep_range(1000, 3000); 2327 usleep_range(1000, 3000);
2314} 2328}
2315 2329
2330static int _dwc2_hcd_suspend(struct usb_hcd *hcd)
2331{
2332 struct dwc2_hsotg *hsotg = dwc2_hcd_to_hsotg(hcd);
2333
2334 hsotg->lx_state = DWC2_L2;
2335 return 0;
2336}
2337
2338static int _dwc2_hcd_resume(struct usb_hcd *hcd)
2339{
2340 struct dwc2_hsotg *hsotg = dwc2_hcd_to_hsotg(hcd);
2341
2342 hsotg->lx_state = DWC2_L0;
2343 return 0;
2344}
2345
2316/* Returns the current frame number */ 2346/* Returns the current frame number */
2317static int _dwc2_hcd_get_frame_number(struct usb_hcd *hcd) 2347static int _dwc2_hcd_get_frame_number(struct usb_hcd *hcd)
2318{ 2348{
@@ -2468,7 +2498,7 @@ static int _dwc2_hcd_urb_enqueue(struct usb_hcd *hcd, struct urb *urb,
2468 "%s: unaligned transfer with no transfer_buffer", 2498 "%s: unaligned transfer with no transfer_buffer",
2469 __func__); 2499 __func__);
2470 retval = -EINVAL; 2500 retval = -EINVAL;
2471 goto fail1; 2501 goto fail0;
2472 } 2502 }
2473 } 2503 }
2474 2504
@@ -2496,7 +2526,6 @@ static int _dwc2_hcd_urb_enqueue(struct usb_hcd *hcd, struct urb *urb,
2496 2526
2497 spin_lock_irqsave(&hsotg->lock, flags); 2527 spin_lock_irqsave(&hsotg->lock, flags);
2498 retval = usb_hcd_link_urb_to_ep(hcd, urb); 2528 retval = usb_hcd_link_urb_to_ep(hcd, urb);
2499 spin_unlock_irqrestore(&hsotg->lock, flags);
2500 if (retval) 2529 if (retval)
2501 goto fail1; 2530 goto fail1;
2502 2531
@@ -2505,22 +2534,22 @@ static int _dwc2_hcd_urb_enqueue(struct usb_hcd *hcd, struct urb *urb,
2505 goto fail2; 2534 goto fail2;
2506 2535
2507 if (alloc_bandwidth) { 2536 if (alloc_bandwidth) {
2508 spin_lock_irqsave(&hsotg->lock, flags);
2509 dwc2_allocate_bus_bandwidth(hcd, 2537 dwc2_allocate_bus_bandwidth(hcd,
2510 dwc2_hcd_get_ep_bandwidth(hsotg, ep), 2538 dwc2_hcd_get_ep_bandwidth(hsotg, ep),
2511 urb); 2539 urb);
2512 spin_unlock_irqrestore(&hsotg->lock, flags);
2513 } 2540 }
2514 2541
2542 spin_unlock_irqrestore(&hsotg->lock, flags);
2543
2515 return 0; 2544 return 0;
2516 2545
2517fail2: 2546fail2:
2518 spin_lock_irqsave(&hsotg->lock, flags);
2519 dwc2_urb->priv = NULL; 2547 dwc2_urb->priv = NULL;
2520 usb_hcd_unlink_urb_from_ep(hcd, urb); 2548 usb_hcd_unlink_urb_from_ep(hcd, urb);
2521 spin_unlock_irqrestore(&hsotg->lock, flags);
2522fail1: 2549fail1:
2550 spin_unlock_irqrestore(&hsotg->lock, flags);
2523 urb->hcpriv = NULL; 2551 urb->hcpriv = NULL;
2552fail0:
2524 kfree(dwc2_urb); 2553 kfree(dwc2_urb);
2525 2554
2526 return retval; 2555 return retval;
@@ -2683,6 +2712,9 @@ static struct hc_driver dwc2_hc_driver = {
2683 .hub_status_data = _dwc2_hcd_hub_status_data, 2712 .hub_status_data = _dwc2_hcd_hub_status_data,
2684 .hub_control = _dwc2_hcd_hub_control, 2713 .hub_control = _dwc2_hcd_hub_control,
2685 .clear_tt_buffer_complete = _dwc2_hcd_clear_tt_buffer_complete, 2714 .clear_tt_buffer_complete = _dwc2_hcd_clear_tt_buffer_complete,
2715
2716 .bus_suspend = _dwc2_hcd_suspend,
2717 .bus_resume = _dwc2_hcd_resume,
2686}; 2718};
2687 2719
2688/* 2720/*
@@ -2748,8 +2780,6 @@ static void dwc2_hcd_free(struct dwc2_hsotg *hsotg)
2748 destroy_workqueue(hsotg->wq_otg); 2780 destroy_workqueue(hsotg->wq_otg);
2749 } 2781 }
2750 2782
2751 kfree(hsotg->core_params);
2752 hsotg->core_params = NULL;
2753 del_timer(&hsotg->wkp_timer); 2783 del_timer(&hsotg->wkp_timer);
2754} 2784}
2755 2785
@@ -2762,29 +2792,12 @@ static void dwc2_hcd_release(struct dwc2_hsotg *hsotg)
2762} 2792}
2763 2793
2764/* 2794/*
2765 * Sets all parameters to the given value.
2766 *
2767 * Assumes that the dwc2_core_params struct contains only integers.
2768 */
2769void dwc2_set_all_params(struct dwc2_core_params *params, int value)
2770{
2771 int *p = (int *)params;
2772 size_t size = sizeof(*params) / sizeof(*p);
2773 int i;
2774
2775 for (i = 0; i < size; i++)
2776 p[i] = value;
2777}
2778EXPORT_SYMBOL_GPL(dwc2_set_all_params);
2779
2780/*
2781 * Initializes the HCD. This function allocates memory for and initializes the 2795 * Initializes the HCD. This function allocates memory for and initializes the
2782 * static parts of the usb_hcd and dwc2_hsotg structures. It also registers the 2796 * static parts of the usb_hcd and dwc2_hsotg structures. It also registers the
2783 * USB bus with the core and calls the hc_driver->start() function. It returns 2797 * USB bus with the core and calls the hc_driver->start() function. It returns
2784 * a negative error on failure. 2798 * a negative error on failure.
2785 */ 2799 */
2786int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq, 2800int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq)
2787 const struct dwc2_core_params *params)
2788{ 2801{
2789 struct usb_hcd *hcd; 2802 struct usb_hcd *hcd;
2790 struct dwc2_host_chan *channel; 2803 struct dwc2_host_chan *channel;
@@ -2797,12 +2810,6 @@ int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq,
2797 2810
2798 dev_dbg(hsotg->dev, "DWC OTG HCD INIT\n"); 2811 dev_dbg(hsotg->dev, "DWC OTG HCD INIT\n");
2799 2812
2800 /* Detect config values from hardware */
2801 retval = dwc2_get_hwparams(hsotg);
2802
2803 if (retval)
2804 return retval;
2805
2806 retval = -ENOMEM; 2813 retval = -ENOMEM;
2807 2814
2808 hcfg = readl(hsotg->regs + HCFG); 2815 hcfg = readl(hsotg->regs + HCFG);
@@ -2821,15 +2828,6 @@ int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq,
2821 hsotg->last_frame_num = HFNUM_MAX_FRNUM; 2828 hsotg->last_frame_num = HFNUM_MAX_FRNUM;
2822#endif 2829#endif
2823 2830
2824 hsotg->core_params = kzalloc(sizeof(*hsotg->core_params), GFP_KERNEL);
2825 if (!hsotg->core_params)
2826 goto error1;
2827
2828 dwc2_set_all_params(hsotg->core_params, -1);
2829
2830 /* Validate parameter values */
2831 dwc2_set_parameters(hsotg, params);
2832
2833 /* Check if the bus driver or platform code has setup a dma_mask */ 2831 /* Check if the bus driver or platform code has setup a dma_mask */
2834 if (hsotg->core_params->dma_enable > 0 && 2832 if (hsotg->core_params->dma_enable > 0 &&
2835 hsotg->dev->dma_mask == NULL) { 2833 hsotg->dev->dma_mask == NULL) {
@@ -2947,6 +2945,9 @@ int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq,
2947 /* Don't support SG list at this point */ 2945 /* Don't support SG list at this point */
2948 hcd->self.sg_tablesize = 0; 2946 hcd->self.sg_tablesize = 0;
2949 2947
2948 if (!IS_ERR_OR_NULL(hsotg->uphy))
2949 otg_set_host(hsotg->uphy->otg, &hcd->self);
2950
2950 /* 2951 /*
2951 * Finish generic HCD initialization and start the HCD. This function 2952 * Finish generic HCD initialization and start the HCD. This function
2952 * allocates the DMA buffer pool, registers the USB bus, requests the 2953 * allocates the DMA buffer pool, registers the USB bus, requests the
@@ -2979,7 +2980,6 @@ error1:
2979 dev_err(hsotg->dev, "%s() FAILED, returning %d\n", __func__, retval); 2980 dev_err(hsotg->dev, "%s() FAILED, returning %d\n", __func__, retval);
2980 return retval; 2981 return retval;
2981} 2982}
2982EXPORT_SYMBOL_GPL(dwc2_hcd_init);
2983 2983
2984/* 2984/*
2985 * Removes the HCD. 2985 * Removes the HCD.
@@ -3000,6 +3000,9 @@ void dwc2_hcd_remove(struct dwc2_hsotg *hsotg)
3000 return; 3000 return;
3001 } 3001 }
3002 3002
3003 if (!IS_ERR_OR_NULL(hsotg->uphy))
3004 otg_set_host(hsotg->uphy->otg, NULL);
3005
3003 usb_remove_hcd(hcd); 3006 usb_remove_hcd(hcd);
3004 hsotg->priv = NULL; 3007 hsotg->priv = NULL;
3005 dwc2_hcd_release(hsotg); 3008 dwc2_hcd_release(hsotg);
@@ -3010,4 +3013,3 @@ void dwc2_hcd_remove(struct dwc2_hsotg *hsotg)
3010 kfree(hsotg->frame_num_array); 3013 kfree(hsotg->frame_num_array);
3011#endif 3014#endif
3012} 3015}
3013EXPORT_SYMBOL_GPL(dwc2_hcd_remove);
diff --git a/drivers/usb/dwc2/hcd.h b/drivers/usb/dwc2/hcd.h
index e69a843d8928..7b5841c40033 100644
--- a/drivers/usb/dwc2/hcd.h
+++ b/drivers/usb/dwc2/hcd.h
@@ -451,13 +451,8 @@ static inline u8 dwc2_hcd_is_pipe_out(struct dwc2_hcd_pipe_info *pipe)
451 return !dwc2_hcd_is_pipe_in(pipe); 451 return !dwc2_hcd_is_pipe_in(pipe);
452} 452}
453 453
454extern int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq, 454extern int dwc2_hcd_init(struct dwc2_hsotg *hsotg, int irq);
455 const struct dwc2_core_params *params);
456extern void dwc2_hcd_remove(struct dwc2_hsotg *hsotg); 455extern void dwc2_hcd_remove(struct dwc2_hsotg *hsotg);
457extern void dwc2_set_parameters(struct dwc2_hsotg *hsotg,
458 const struct dwc2_core_params *params);
459extern void dwc2_set_all_params(struct dwc2_core_params *params, int value);
460extern int dwc2_get_hwparams(struct dwc2_hsotg *hsotg);
461 456
462/* Transaction Execution Functions */ 457/* Transaction Execution Functions */
463extern enum dwc2_transaction_type dwc2_hcd_select_transactions( 458extern enum dwc2_transaction_type dwc2_hcd_select_transactions(
diff --git a/drivers/usb/dwc2/hcd_intr.c b/drivers/usb/dwc2/hcd_intr.c
index 551ba878b003..4cc95df4262d 100644
--- a/drivers/usb/dwc2/hcd_intr.c
+++ b/drivers/usb/dwc2/hcd_intr.c
@@ -350,6 +350,9 @@ static void dwc2_port_intr(struct dwc2_hsotg *hsotg)
350 dev_vdbg(hsotg->dev, 350 dev_vdbg(hsotg->dev,
351 "--Port Interrupt HPRT0=0x%08x Port Connect Detected--\n", 351 "--Port Interrupt HPRT0=0x%08x Port Connect Detected--\n",
352 hprt0); 352 hprt0);
353 if (hsotg->lx_state != DWC2_L0)
354 usb_hcd_resume_root_hub(hsotg->priv);
355
353 hsotg->flags.b.port_connect_status_change = 1; 356 hsotg->flags.b.port_connect_status_change = 1;
354 hsotg->flags.b.port_connect_status = 1; 357 hsotg->flags.b.port_connect_status = 1;
355 hprt0_modify |= HPRT0_CONNDET; 358 hprt0_modify |= HPRT0_CONNDET;
@@ -463,10 +466,15 @@ static int dwc2_update_urb_state(struct dwc2_hsotg *hsotg,
463 } 466 }
464 467
465 /* Non DWORD-aligned buffer case handling */ 468 /* Non DWORD-aligned buffer case handling */
466 if (chan->align_buf && xfer_length && chan->ep_is_in) { 469 if (chan->align_buf && xfer_length) {
467 dev_vdbg(hsotg->dev, "%s(): non-aligned buffer\n", __func__); 470 dev_vdbg(hsotg->dev, "%s(): non-aligned buffer\n", __func__);
468 memcpy(urb->buf + urb->actual_length, chan->qh->dw_align_buf, 471 dma_unmap_single(hsotg->dev, chan->qh->dw_align_buf_dma,
469 xfer_length); 472 chan->qh->dw_align_buf_size,
473 chan->ep_is_in ?
474 DMA_FROM_DEVICE : DMA_TO_DEVICE);
475 if (chan->ep_is_in)
476 memcpy(urb->buf + urb->actual_length,
477 chan->qh->dw_align_buf, xfer_length);
470 } 478 }
471 479
472 dev_vdbg(hsotg->dev, "urb->actual_length=%d xfer_length=%d\n", 480 dev_vdbg(hsotg->dev, "urb->actual_length=%d xfer_length=%d\n",
@@ -552,13 +560,18 @@ static enum dwc2_halt_status dwc2_update_isoc_urb_state(
552 chan, chnum, qtd, halt_status, NULL); 560 chan, chnum, qtd, halt_status, NULL);
553 561
554 /* Non DWORD-aligned buffer case handling */ 562 /* Non DWORD-aligned buffer case handling */
555 if (chan->align_buf && frame_desc->actual_length && 563 if (chan->align_buf && frame_desc->actual_length) {
556 chan->ep_is_in) {
557 dev_vdbg(hsotg->dev, "%s(): non-aligned buffer\n", 564 dev_vdbg(hsotg->dev, "%s(): non-aligned buffer\n",
558 __func__); 565 __func__);
559 memcpy(urb->buf + frame_desc->offset + 566 dma_unmap_single(hsotg->dev, chan->qh->dw_align_buf_dma,
560 qtd->isoc_split_offset, chan->qh->dw_align_buf, 567 chan->qh->dw_align_buf_size,
561 frame_desc->actual_length); 568 chan->ep_is_in ?
569 DMA_FROM_DEVICE : DMA_TO_DEVICE);
570 if (chan->ep_is_in)
571 memcpy(urb->buf + frame_desc->offset +
572 qtd->isoc_split_offset,
573 chan->qh->dw_align_buf,
574 frame_desc->actual_length);
562 } 575 }
563 break; 576 break;
564 case DWC2_HC_XFER_FRAME_OVERRUN: 577 case DWC2_HC_XFER_FRAME_OVERRUN:
@@ -581,13 +594,18 @@ static enum dwc2_halt_status dwc2_update_isoc_urb_state(
581 chan, chnum, qtd, halt_status, NULL); 594 chan, chnum, qtd, halt_status, NULL);
582 595
583 /* Non DWORD-aligned buffer case handling */ 596 /* Non DWORD-aligned buffer case handling */
584 if (chan->align_buf && frame_desc->actual_length && 597 if (chan->align_buf && frame_desc->actual_length) {
585 chan->ep_is_in) {
586 dev_vdbg(hsotg->dev, "%s(): non-aligned buffer\n", 598 dev_vdbg(hsotg->dev, "%s(): non-aligned buffer\n",
587 __func__); 599 __func__);
588 memcpy(urb->buf + frame_desc->offset + 600 dma_unmap_single(hsotg->dev, chan->qh->dw_align_buf_dma,
589 qtd->isoc_split_offset, chan->qh->dw_align_buf, 601 chan->qh->dw_align_buf_size,
590 frame_desc->actual_length); 602 chan->ep_is_in ?
603 DMA_FROM_DEVICE : DMA_TO_DEVICE);
604 if (chan->ep_is_in)
605 memcpy(urb->buf + frame_desc->offset +
606 qtd->isoc_split_offset,
607 chan->qh->dw_align_buf,
608 frame_desc->actual_length);
591 } 609 }
592 610
593 /* Skip whole frame */ 611 /* Skip whole frame */
@@ -923,6 +941,8 @@ static int dwc2_xfercomp_isoc_split_in(struct dwc2_hsotg *hsotg,
923 941
924 if (chan->align_buf) { 942 if (chan->align_buf) {
925 dev_vdbg(hsotg->dev, "%s(): non-aligned buffer\n", __func__); 943 dev_vdbg(hsotg->dev, "%s(): non-aligned buffer\n", __func__);
944 dma_unmap_single(hsotg->dev, chan->qh->dw_align_buf_dma,
945 chan->qh->dw_align_buf_size, DMA_FROM_DEVICE);
926 memcpy(qtd->urb->buf + frame_desc->offset + 946 memcpy(qtd->urb->buf + frame_desc->offset +
927 qtd->isoc_split_offset, chan->qh->dw_align_buf, len); 947 qtd->isoc_split_offset, chan->qh->dw_align_buf, len);
928 } 948 }
@@ -1152,8 +1172,14 @@ static void dwc2_update_urb_state_abn(struct dwc2_hsotg *hsotg,
1152 /* Non DWORD-aligned buffer case handling */ 1172 /* Non DWORD-aligned buffer case handling */
1153 if (chan->align_buf && xfer_length && chan->ep_is_in) { 1173 if (chan->align_buf && xfer_length && chan->ep_is_in) {
1154 dev_vdbg(hsotg->dev, "%s(): non-aligned buffer\n", __func__); 1174 dev_vdbg(hsotg->dev, "%s(): non-aligned buffer\n", __func__);
1155 memcpy(urb->buf + urb->actual_length, chan->qh->dw_align_buf, 1175 dma_unmap_single(hsotg->dev, chan->qh->dw_align_buf_dma,
1156 xfer_length); 1176 chan->qh->dw_align_buf_size,
1177 chan->ep_is_in ?
1178 DMA_FROM_DEVICE : DMA_TO_DEVICE);
1179 if (chan->ep_is_in)
1180 memcpy(urb->buf + urb->actual_length,
1181 chan->qh->dw_align_buf,
1182 xfer_length);
1157 } 1183 }
1158 1184
1159 urb->actual_length += xfer_length; 1185 urb->actual_length += xfer_length;
@@ -1182,6 +1208,16 @@ static void dwc2_hc_nak_intr(struct dwc2_hsotg *hsotg,
1182 struct dwc2_host_chan *chan, int chnum, 1208 struct dwc2_host_chan *chan, int chnum,
1183 struct dwc2_qtd *qtd) 1209 struct dwc2_qtd *qtd)
1184{ 1210{
1211 if (!qtd) {
1212 dev_dbg(hsotg->dev, "%s: qtd is NULL\n", __func__);
1213 return;
1214 }
1215
1216 if (!qtd->urb) {
1217 dev_dbg(hsotg->dev, "%s: qtd->urb is NULL\n", __func__);
1218 return;
1219 }
1220
1185 if (dbg_hc(chan)) 1221 if (dbg_hc(chan))
1186 dev_vdbg(hsotg->dev, "--Host Channel %d Interrupt: NAK Received--\n", 1222 dev_vdbg(hsotg->dev, "--Host Channel %d Interrupt: NAK Received--\n",
1187 chnum); 1223 chnum);
diff --git a/drivers/usb/dwc2/hcd_queue.c b/drivers/usb/dwc2/hcd_queue.c
index bb97838bc6c0..9b5c36256627 100644
--- a/drivers/usb/dwc2/hcd_queue.c
+++ b/drivers/usb/dwc2/hcd_queue.c
@@ -229,11 +229,13 @@ static struct dwc2_qh *dwc2_hcd_qh_create(struct dwc2_hsotg *hsotg,
229 */ 229 */
230void dwc2_hcd_qh_free(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh) 230void dwc2_hcd_qh_free(struct dwc2_hsotg *hsotg, struct dwc2_qh *qh)
231{ 231{
232 if (hsotg->core_params->dma_desc_enable > 0) 232 if (hsotg->core_params->dma_desc_enable > 0) {
233 dwc2_hcd_qh_free_ddma(hsotg, qh); 233 dwc2_hcd_qh_free_ddma(hsotg, qh);
234 else if (qh->dw_align_buf) 234 } else {
235 dma_free_coherent(hsotg->dev, qh->dw_align_buf_size, 235 /* kfree(NULL) is safe */
236 qh->dw_align_buf, qh->dw_align_buf_dma); 236 kfree(qh->dw_align_buf);
237 qh->dw_align_buf_dma = (dma_addr_t)0;
238 }
237 kfree(qh); 239 kfree(qh);
238} 240}
239 241
@@ -761,6 +763,7 @@ void dwc2_hcd_qtd_init(struct dwc2_qtd *qtd, struct dwc2_hcd_urb *urb)
761 763
762/** 764/**
763 * dwc2_hcd_qtd_add() - Adds a QTD to the QTD-list of a QH 765 * dwc2_hcd_qtd_add() - Adds a QTD to the QTD-list of a QH
766 * Caller must hold driver lock.
764 * 767 *
765 * @hsotg: The DWC HCD structure 768 * @hsotg: The DWC HCD structure
766 * @qtd: The QTD to add 769 * @qtd: The QTD to add
@@ -777,7 +780,6 @@ int dwc2_hcd_qtd_add(struct dwc2_hsotg *hsotg, struct dwc2_qtd *qtd,
777 struct dwc2_qh **qh, gfp_t mem_flags) 780 struct dwc2_qh **qh, gfp_t mem_flags)
778{ 781{
779 struct dwc2_hcd_urb *urb = qtd->urb; 782 struct dwc2_hcd_urb *urb = qtd->urb;
780 unsigned long flags;
781 int allocated = 0; 783 int allocated = 0;
782 int retval; 784 int retval;
783 785
@@ -792,15 +794,12 @@ int dwc2_hcd_qtd_add(struct dwc2_hsotg *hsotg, struct dwc2_qtd *qtd,
792 allocated = 1; 794 allocated = 1;
793 } 795 }
794 796
795 spin_lock_irqsave(&hsotg->lock, flags);
796
797 retval = dwc2_hcd_qh_add(hsotg, *qh); 797 retval = dwc2_hcd_qh_add(hsotg, *qh);
798 if (retval) 798 if (retval)
799 goto fail; 799 goto fail;
800 800
801 qtd->qh = *qh; 801 qtd->qh = *qh;
802 list_add_tail(&qtd->qtd_list_entry, &(*qh)->qtd_list); 802 list_add_tail(&qtd->qtd_list_entry, &(*qh)->qtd_list);
803 spin_unlock_irqrestore(&hsotg->lock, flags);
804 803
805 return 0; 804 return 0;
806 805
@@ -817,10 +816,7 @@ fail:
817 qtd_list_entry) 816 qtd_list_entry)
818 dwc2_hcd_qtd_unlink_and_free(hsotg, qtd2, qh_tmp); 817 dwc2_hcd_qtd_unlink_and_free(hsotg, qtd2, qh_tmp);
819 818
820 spin_unlock_irqrestore(&hsotg->lock, flags);
821 dwc2_hcd_qh_free(hsotg, qh_tmp); 819 dwc2_hcd_qh_free(hsotg, qh_tmp);
822 } else {
823 spin_unlock_irqrestore(&hsotg->lock, flags);
824 } 820 }
825 821
826 return retval; 822 return retval;
diff --git a/drivers/usb/dwc2/platform.c b/drivers/usb/dwc2/platform.c
index 185663e0b5f4..90935304185a 100644
--- a/drivers/usb/dwc2/platform.c
+++ b/drivers/usb/dwc2/platform.c
@@ -47,6 +47,7 @@
47 47
48#include "core.h" 48#include "core.h"
49#include "hcd.h" 49#include "hcd.h"
50#include "debug.h"
50 51
51static const char dwc2_driver_name[] = "dwc2"; 52static const char dwc2_driver_name[] = "dwc2";
52 53
@@ -76,6 +77,8 @@ static const struct dwc2_core_params params_bcm2835 = {
76 .reload_ctl = 0, 77 .reload_ctl = 0,
77 .ahbcfg = 0x10, 78 .ahbcfg = 0x10,
78 .uframe_sched = 0, 79 .uframe_sched = 0,
80 .external_id_pin_ctl = -1,
81 .hibernation = -1,
79}; 82};
80 83
81static const struct dwc2_core_params params_rk3066 = { 84static const struct dwc2_core_params params_rk3066 = {
@@ -104,6 +107,8 @@ static const struct dwc2_core_params params_rk3066 = {
104 .reload_ctl = -1, 107 .reload_ctl = -1,
105 .ahbcfg = 0x7, /* INCR16 */ 108 .ahbcfg = 0x7, /* INCR16 */
106 .uframe_sched = -1, 109 .uframe_sched = -1,
110 .external_id_pin_ctl = -1,
111 .hibernation = -1,
107}; 112};
108 113
109/** 114/**
@@ -121,6 +126,7 @@ static int dwc2_driver_remove(struct platform_device *dev)
121{ 126{
122 struct dwc2_hsotg *hsotg = platform_get_drvdata(dev); 127 struct dwc2_hsotg *hsotg = platform_get_drvdata(dev);
123 128
129 dwc2_debugfs_exit(hsotg);
124 if (hsotg->hcd_enabled) 130 if (hsotg->hcd_enabled)
125 dwc2_hcd_remove(hsotg); 131 dwc2_hcd_remove(hsotg);
126 if (hsotg->gadget_enabled) 132 if (hsotg->gadget_enabled)
@@ -237,6 +243,21 @@ static int dwc2_driver_probe(struct platform_device *dev)
237 spin_lock_init(&hsotg->lock); 243 spin_lock_init(&hsotg->lock);
238 mutex_init(&hsotg->init_mutex); 244 mutex_init(&hsotg->init_mutex);
239 245
246 /* Detect config values from hardware */
247 retval = dwc2_get_hwparams(hsotg);
248 if (retval)
249 return retval;
250
251 hsotg->core_params = devm_kzalloc(&dev->dev,
252 sizeof(*hsotg->core_params), GFP_KERNEL);
253 if (!hsotg->core_params)
254 return -ENOMEM;
255
256 dwc2_set_all_params(hsotg->core_params, -1);
257
258 /* Validate parameter values */
259 dwc2_set_parameters(hsotg, params);
260
240 if (hsotg->dr_mode != USB_DR_MODE_HOST) { 261 if (hsotg->dr_mode != USB_DR_MODE_HOST) {
241 retval = dwc2_gadget_init(hsotg, irq); 262 retval = dwc2_gadget_init(hsotg, irq);
242 if (retval) 263 if (retval)
@@ -245,7 +266,7 @@ static int dwc2_driver_probe(struct platform_device *dev)
245 } 266 }
246 267
247 if (hsotg->dr_mode != USB_DR_MODE_PERIPHERAL) { 268 if (hsotg->dr_mode != USB_DR_MODE_PERIPHERAL) {
248 retval = dwc2_hcd_init(hsotg, irq, params); 269 retval = dwc2_hcd_init(hsotg, irq);
249 if (retval) { 270 if (retval) {
250 if (hsotg->gadget_enabled) 271 if (hsotg->gadget_enabled)
251 s3c_hsotg_remove(hsotg); 272 s3c_hsotg_remove(hsotg);
@@ -256,6 +277,8 @@ static int dwc2_driver_probe(struct platform_device *dev)
256 277
257 platform_set_drvdata(dev, hsotg); 278 platform_set_drvdata(dev, hsotg);
258 279
280 dwc2_debugfs_init(hsotg);
281
259 return retval; 282 return retval;
260} 283}
261 284
diff --git a/drivers/usb/dwc3/Kconfig b/drivers/usb/dwc3/Kconfig
index 827c4f80379f..473bfaa96c30 100644
--- a/drivers/usb/dwc3/Kconfig
+++ b/drivers/usb/dwc3/Kconfig
@@ -11,6 +11,13 @@ config USB_DWC3
11 11
12if USB_DWC3 12if USB_DWC3
13 13
14config USB_DWC3_ULPI
15 bool "Register ULPI PHY Interface"
16 depends on USB_ULPI_BUS=y || USB_ULPI_BUS=USB_DWC3
17 help
18 Select this if you have ULPI type PHY attached to your DWC3
19 controller.
20
14choice 21choice
15 bool "DWC3 Mode Selection" 22 bool "DWC3 Mode Selection"
16 default USB_DWC3_DUAL_ROLE if (USB && USB_GADGET) 23 default USB_DWC3_DUAL_ROLE if (USB && USB_GADGET)
diff --git a/drivers/usb/dwc3/Makefile b/drivers/usb/dwc3/Makefile
index 46172f47f02d..c7076e37c4ed 100644
--- a/drivers/usb/dwc3/Makefile
+++ b/drivers/usb/dwc3/Makefile
@@ -15,6 +15,10 @@ ifneq ($(filter y,$(CONFIG_USB_DWC3_GADGET) $(CONFIG_USB_DWC3_DUAL_ROLE)),)
15 dwc3-y += gadget.o ep0.o 15 dwc3-y += gadget.o ep0.o
16endif 16endif
17 17
18ifneq ($(CONFIG_USB_DWC3_ULPI),)
19 dwc3-y += ulpi.o
20endif
21
18ifneq ($(CONFIG_DEBUG_FS),) 22ifneq ($(CONFIG_DEBUG_FS),)
19 dwc3-y += debugfs.o 23 dwc3-y += debugfs.o
20endif 24endif
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index 2bbab3d86fff..5c110d8e293b 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -117,6 +117,33 @@ static int dwc3_core_soft_reset(struct dwc3 *dwc)
117} 117}
118 118
119/** 119/**
120 * dwc3_soft_reset - Issue soft reset
121 * @dwc: Pointer to our controller context structure
122 */
123static int dwc3_soft_reset(struct dwc3 *dwc)
124{
125 unsigned long timeout;
126 u32 reg;
127
128 timeout = jiffies + msecs_to_jiffies(500);
129 dwc3_writel(dwc->regs, DWC3_DCTL, DWC3_DCTL_CSFTRST);
130 do {
131 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
132 if (!(reg & DWC3_DCTL_CSFTRST))
133 break;
134
135 if (time_after(jiffies, timeout)) {
136 dev_err(dwc->dev, "Reset Timed Out\n");
137 return -ETIMEDOUT;
138 }
139
140 cpu_relax();
141 } while (true);
142
143 return 0;
144}
145
146/**
120 * dwc3_free_one_event_buffer - Frees one event buffer 147 * dwc3_free_one_event_buffer - Frees one event buffer
121 * @dwc: Pointer to our controller context structure 148 * @dwc: Pointer to our controller context structure
122 * @evt: Pointer to event buffer to be freed 149 * @evt: Pointer to event buffer to be freed
@@ -367,10 +394,15 @@ static void dwc3_cache_hwparams(struct dwc3 *dwc)
367/** 394/**
368 * dwc3_phy_setup - Configure USB PHY Interface of DWC3 Core 395 * dwc3_phy_setup - Configure USB PHY Interface of DWC3 Core
369 * @dwc: Pointer to our controller context structure 396 * @dwc: Pointer to our controller context structure
397 *
398 * Returns 0 on success. The USB PHY interfaces are configured but not
399 * initialized. The PHY interfaces and the PHYs get initialized together with
400 * the core in dwc3_core_init.
370 */ 401 */
371static void dwc3_phy_setup(struct dwc3 *dwc) 402static int dwc3_phy_setup(struct dwc3 *dwc)
372{ 403{
373 u32 reg; 404 u32 reg;
405 int ret;
374 406
375 reg = dwc3_readl(dwc->regs, DWC3_GUSB3PIPECTL(0)); 407 reg = dwc3_readl(dwc->regs, DWC3_GUSB3PIPECTL(0));
376 408
@@ -409,10 +441,41 @@ static void dwc3_phy_setup(struct dwc3 *dwc)
409 441
410 dwc3_writel(dwc->regs, DWC3_GUSB3PIPECTL(0), reg); 442 dwc3_writel(dwc->regs, DWC3_GUSB3PIPECTL(0), reg);
411 443
412 mdelay(100);
413
414 reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0)); 444 reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0));
415 445
446 /* Select the HS PHY interface */
447 switch (DWC3_GHWPARAMS3_HSPHY_IFC(dwc->hwparams.hwparams3)) {
448 case DWC3_GHWPARAMS3_HSPHY_IFC_UTMI_ULPI:
449 if (!strncmp(dwc->hsphy_interface, "utmi", 4)) {
450 reg &= ~DWC3_GUSB2PHYCFG_ULPI_UTMI;
451 break;
452 } else if (!strncmp(dwc->hsphy_interface, "ulpi", 4)) {
453 reg |= DWC3_GUSB2PHYCFG_ULPI_UTMI;
454 dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg);
455 } else {
456 dev_warn(dwc->dev, "HSPHY Interface not defined\n");
457
458 /* Relying on default value. */
459 if (!(reg & DWC3_GUSB2PHYCFG_ULPI_UTMI))
460 break;
461 }
462 /* FALLTHROUGH */
463 case DWC3_GHWPARAMS3_HSPHY_IFC_ULPI:
464 /* Making sure the interface and PHY are operational */
465 ret = dwc3_soft_reset(dwc);
466 if (ret)
467 return ret;
468
469 udelay(1);
470
471 ret = dwc3_ulpi_init(dwc);
472 if (ret)
473 return ret;
474 /* FALLTHROUGH */
475 default:
476 break;
477 }
478
416 /* 479 /*
417 * Above 1.94a, it is recommended to set DWC3_GUSB2PHYCFG_SUSPHY to 480 * Above 1.94a, it is recommended to set DWC3_GUSB2PHYCFG_SUSPHY to
418 * '0' during coreConsultant configuration. So default value will 481 * '0' during coreConsultant configuration. So default value will
@@ -427,7 +490,7 @@ static void dwc3_phy_setup(struct dwc3 *dwc)
427 490
428 dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg); 491 dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg);
429 492
430 mdelay(100); 493 return 0;
431} 494}
432 495
433/** 496/**
@@ -438,7 +501,6 @@ static void dwc3_phy_setup(struct dwc3 *dwc)
438 */ 501 */
439static int dwc3_core_init(struct dwc3 *dwc) 502static int dwc3_core_init(struct dwc3 *dwc)
440{ 503{
441 unsigned long timeout;
442 u32 hwparams4 = dwc->hwparams.hwparams4; 504 u32 hwparams4 = dwc->hwparams.hwparams4;
443 u32 reg; 505 u32 reg;
444 int ret; 506 int ret;
@@ -466,21 +528,9 @@ static int dwc3_core_init(struct dwc3 *dwc)
466 } 528 }
467 529
468 /* issue device SoftReset too */ 530 /* issue device SoftReset too */
469 timeout = jiffies + msecs_to_jiffies(500); 531 ret = dwc3_soft_reset(dwc);
470 dwc3_writel(dwc->regs, DWC3_DCTL, DWC3_DCTL_CSFTRST); 532 if (ret)
471 do { 533 goto err0;
472 reg = dwc3_readl(dwc->regs, DWC3_DCTL);
473 if (!(reg & DWC3_DCTL_CSFTRST))
474 break;
475
476 if (time_after(jiffies, timeout)) {
477 dev_err(dwc->dev, "Reset Timed Out\n");
478 ret = -ETIMEDOUT;
479 goto err0;
480 }
481
482 cpu_relax();
483 } while (true);
484 534
485 ret = dwc3_core_soft_reset(dwc); 535 ret = dwc3_core_soft_reset(dwc);
486 if (ret) 536 if (ret)
@@ -555,8 +605,6 @@ static int dwc3_core_init(struct dwc3 *dwc)
555 605
556 dwc3_writel(dwc->regs, DWC3_GCTL, reg); 606 dwc3_writel(dwc->regs, DWC3_GCTL, reg);
557 607
558 dwc3_phy_setup(dwc);
559
560 ret = dwc3_alloc_scratch_buffers(dwc); 608 ret = dwc3_alloc_scratch_buffers(dwc);
561 if (ret) 609 if (ret)
562 goto err1; 610 goto err1;
@@ -836,6 +884,8 @@ static int dwc3_probe(struct platform_device *pdev)
836 "snps,tx_de_emphasis_quirk"); 884 "snps,tx_de_emphasis_quirk");
837 of_property_read_u8(node, "snps,tx_de_emphasis", 885 of_property_read_u8(node, "snps,tx_de_emphasis",
838 &tx_de_emphasis); 886 &tx_de_emphasis);
887 of_property_read_string(node, "snps,hsphy_interface",
888 &dwc->hsphy_interface);
839 } else if (pdata) { 889 } else if (pdata) {
840 dwc->maximum_speed = pdata->maximum_speed; 890 dwc->maximum_speed = pdata->maximum_speed;
841 dwc->has_lpm_erratum = pdata->has_lpm_erratum; 891 dwc->has_lpm_erratum = pdata->has_lpm_erratum;
@@ -863,6 +913,8 @@ static int dwc3_probe(struct platform_device *pdev)
863 dwc->tx_de_emphasis_quirk = pdata->tx_de_emphasis_quirk; 913 dwc->tx_de_emphasis_quirk = pdata->tx_de_emphasis_quirk;
864 if (pdata->tx_de_emphasis) 914 if (pdata->tx_de_emphasis)
865 tx_de_emphasis = pdata->tx_de_emphasis; 915 tx_de_emphasis = pdata->tx_de_emphasis;
916
917 dwc->hsphy_interface = pdata->hsphy_interface;
866 } 918 }
867 919
868 /* default to superspeed if no maximum_speed passed */ 920 /* default to superspeed if no maximum_speed passed */
@@ -875,12 +927,18 @@ static int dwc3_probe(struct platform_device *pdev)
875 dwc->hird_threshold = hird_threshold 927 dwc->hird_threshold = hird_threshold
876 | (dwc->is_utmi_l1_suspend << 4); 928 | (dwc->is_utmi_l1_suspend << 4);
877 929
930 platform_set_drvdata(pdev, dwc);
931 dwc3_cache_hwparams(dwc);
932
933 ret = dwc3_phy_setup(dwc);
934 if (ret)
935 goto err0;
936
878 ret = dwc3_core_get_phy(dwc); 937 ret = dwc3_core_get_phy(dwc);
879 if (ret) 938 if (ret)
880 goto err0; 939 goto err0;
881 940
882 spin_lock_init(&dwc->lock); 941 spin_lock_init(&dwc->lock);
883 platform_set_drvdata(pdev, dwc);
884 942
885 if (!dev->dma_mask) { 943 if (!dev->dma_mask) {
886 dev->dma_mask = dev->parent->dma_mask; 944 dev->dma_mask = dev->parent->dma_mask;
@@ -892,8 +950,6 @@ static int dwc3_probe(struct platform_device *pdev)
892 pm_runtime_get_sync(dev); 950 pm_runtime_get_sync(dev);
893 pm_runtime_forbid(dev); 951 pm_runtime_forbid(dev);
894 952
895 dwc3_cache_hwparams(dwc);
896
897 ret = dwc3_alloc_event_buffers(dwc, DWC3_EVENT_BUFFERS_SIZE); 953 ret = dwc3_alloc_event_buffers(dwc, DWC3_EVENT_BUFFERS_SIZE);
898 if (ret) { 954 if (ret) {
899 dev_err(dwc->dev, "failed to allocate event buffers\n"); 955 dev_err(dwc->dev, "failed to allocate event buffers\n");
@@ -964,6 +1020,7 @@ err2:
964 1020
965err1: 1021err1:
966 dwc3_free_event_buffers(dwc); 1022 dwc3_free_event_buffers(dwc);
1023 dwc3_ulpi_exit(dwc);
967 1024
968err0: 1025err0:
969 /* 1026 /*
@@ -999,6 +1056,7 @@ static int dwc3_remove(struct platform_device *pdev)
999 phy_power_off(dwc->usb3_generic_phy); 1056 phy_power_off(dwc->usb3_generic_phy);
1000 1057
1001 dwc3_core_exit(dwc); 1058 dwc3_core_exit(dwc);
1059 dwc3_ulpi_exit(dwc);
1002 1060
1003 pm_runtime_put_sync(&pdev->dev); 1061 pm_runtime_put_sync(&pdev->dev);
1004 pm_runtime_disable(&pdev->dev); 1062 pm_runtime_disable(&pdev->dev);
diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
index fdab715a0631..d70da2041d19 100644
--- a/drivers/usb/dwc3/core.h
+++ b/drivers/usb/dwc3/core.h
@@ -30,6 +30,7 @@
30#include <linux/usb/ch9.h> 30#include <linux/usb/ch9.h>
31#include <linux/usb/gadget.h> 31#include <linux/usb/gadget.h>
32#include <linux/usb/otg.h> 32#include <linux/usb/otg.h>
33#include <linux/ulpi/interface.h>
33 34
34#include <linux/phy/phy.h> 35#include <linux/phy/phy.h>
35 36
@@ -173,6 +174,15 @@
173/* Global USB2 PHY Configuration Register */ 174/* Global USB2 PHY Configuration Register */
174#define DWC3_GUSB2PHYCFG_PHYSOFTRST (1 << 31) 175#define DWC3_GUSB2PHYCFG_PHYSOFTRST (1 << 31)
175#define DWC3_GUSB2PHYCFG_SUSPHY (1 << 6) 176#define DWC3_GUSB2PHYCFG_SUSPHY (1 << 6)
177#define DWC3_GUSB2PHYCFG_ULPI_UTMI (1 << 4)
178
179/* Global USB2 PHY Vendor Control Register */
180#define DWC3_GUSB2PHYACC_NEWREGREQ (1 << 25)
181#define DWC3_GUSB2PHYACC_BUSY (1 << 23)
182#define DWC3_GUSB2PHYACC_WRITE (1 << 22)
183#define DWC3_GUSB2PHYACC_ADDR(n) (n << 16)
184#define DWC3_GUSB2PHYACC_EXTEND_ADDR(n) (n << 8)
185#define DWC3_GUSB2PHYACC_DATA(n) (n & 0xff)
176 186
177/* Global USB3 PIPE Control Register */ 187/* Global USB3 PIPE Control Register */
178#define DWC3_GUSB3PIPECTL_PHYSOFTRST (1 << 31) 188#define DWC3_GUSB3PIPECTL_PHYSOFTRST (1 << 31)
@@ -652,6 +662,7 @@ struct dwc3_scratchpad_array {
652 * @usb3_phy: pointer to USB3 PHY 662 * @usb3_phy: pointer to USB3 PHY
653 * @usb2_generic_phy: pointer to USB2 PHY 663 * @usb2_generic_phy: pointer to USB2 PHY
654 * @usb3_generic_phy: pointer to USB3 PHY 664 * @usb3_generic_phy: pointer to USB3 PHY
665 * @ulpi: pointer to ulpi interface
655 * @dcfg: saved contents of DCFG register 666 * @dcfg: saved contents of DCFG register
656 * @gctl: saved contents of GCTL register 667 * @gctl: saved contents of GCTL register
657 * @isoch_delay: wValue from Set Isochronous Delay request; 668 * @isoch_delay: wValue from Set Isochronous Delay request;
@@ -673,6 +684,7 @@ struct dwc3_scratchpad_array {
673 * @test_mode_nr: test feature selector 684 * @test_mode_nr: test feature selector
674 * @lpm_nyet_threshold: LPM NYET response threshold 685 * @lpm_nyet_threshold: LPM NYET response threshold
675 * @hird_threshold: HIRD threshold 686 * @hird_threshold: HIRD threshold
687 * @hsphy_interface: "utmi" or "ulpi"
676 * @delayed_status: true when gadget driver asks for delayed status 688 * @delayed_status: true when gadget driver asks for delayed status
677 * @ep0_bounced: true when we used bounce buffer 689 * @ep0_bounced: true when we used bounce buffer
678 * @ep0_expect_in: true when we expect a DATA IN transfer 690 * @ep0_expect_in: true when we expect a DATA IN transfer
@@ -739,6 +751,8 @@ struct dwc3 {
739 struct phy *usb2_generic_phy; 751 struct phy *usb2_generic_phy;
740 struct phy *usb3_generic_phy; 752 struct phy *usb3_generic_phy;
741 753
754 struct ulpi *ulpi;
755
742 void __iomem *regs; 756 void __iomem *regs;
743 size_t regs_size; 757 size_t regs_size;
744 758
@@ -800,6 +814,8 @@ struct dwc3 {
800 u8 lpm_nyet_threshold; 814 u8 lpm_nyet_threshold;
801 u8 hird_threshold; 815 u8 hird_threshold;
802 816
817 const char *hsphy_interface;
818
803 unsigned delayed_status:1; 819 unsigned delayed_status:1;
804 unsigned ep0_bounced:1; 820 unsigned ep0_bounced:1;
805 unsigned ep0_expect_in:1; 821 unsigned ep0_expect_in:1;
@@ -1035,4 +1051,14 @@ static inline int dwc3_gadget_resume(struct dwc3 *dwc)
1035} 1051}
1036#endif /* !IS_ENABLED(CONFIG_USB_DWC3_HOST) */ 1052#endif /* !IS_ENABLED(CONFIG_USB_DWC3_HOST) */
1037 1053
1054#if IS_ENABLED(CONFIG_USB_DWC3_ULPI)
1055int dwc3_ulpi_init(struct dwc3 *dwc);
1056void dwc3_ulpi_exit(struct dwc3 *dwc);
1057#else
1058static inline int dwc3_ulpi_init(struct dwc3 *dwc)
1059{ return 0; }
1060static inline void dwc3_ulpi_exit(struct dwc3 *dwc)
1061{ }
1062#endif
1063
1038#endif /* __DRIVERS_USB_DWC3_CORE_H */ 1064#endif /* __DRIVERS_USB_DWC3_CORE_H */
diff --git a/drivers/usb/dwc3/dwc3-pci.c b/drivers/usb/dwc3/dwc3-pci.c
index b773fb53d6a7..27e4fc896e9d 100644
--- a/drivers/usb/dwc3/dwc3-pci.c
+++ b/drivers/usb/dwc3/dwc3-pci.c
@@ -21,6 +21,8 @@
21#include <linux/slab.h> 21#include <linux/slab.h>
22#include <linux/pci.h> 22#include <linux/pci.h>
23#include <linux/platform_device.h> 23#include <linux/platform_device.h>
24#include <linux/gpio/consumer.h>
25#include <linux/acpi.h>
24 26
25#include "platform_data.h" 27#include "platform_data.h"
26 28
@@ -31,6 +33,15 @@
31#define PCI_DEVICE_ID_INTEL_SPTLP 0x9d30 33#define PCI_DEVICE_ID_INTEL_SPTLP 0x9d30
32#define PCI_DEVICE_ID_INTEL_SPTH 0xa130 34#define PCI_DEVICE_ID_INTEL_SPTH 0xa130
33 35
36static const struct acpi_gpio_params reset_gpios = { 0, 0, false };
37static const struct acpi_gpio_params cs_gpios = { 1, 0, false };
38
39static const struct acpi_gpio_mapping acpi_dwc3_byt_gpios[] = {
40 { "reset-gpios", &reset_gpios, 1 },
41 { "cs-gpios", &cs_gpios, 1 },
42 { },
43};
44
34static int dwc3_pci_quirks(struct pci_dev *pdev) 45static int dwc3_pci_quirks(struct pci_dev *pdev)
35{ 46{
36 if (pdev->vendor == PCI_VENDOR_ID_AMD && 47 if (pdev->vendor == PCI_VENDOR_ID_AMD &&
@@ -65,6 +76,30 @@ static int dwc3_pci_quirks(struct pci_dev *pdev)
65 sizeof(pdata)); 76 sizeof(pdata));
66 } 77 }
67 78
79 if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
80 pdev->device == PCI_DEVICE_ID_INTEL_BYT) {
81 struct gpio_desc *gpio;
82
83 acpi_dev_add_driver_gpios(ACPI_COMPANION(&pdev->dev),
84 acpi_dwc3_byt_gpios);
85
86 /* These GPIOs will turn on the USB2 PHY */
87 gpio = gpiod_get(&pdev->dev, "cs");
88 if (!IS_ERR(gpio)) {
89 gpiod_direction_output(gpio, 0);
90 gpiod_set_value_cansleep(gpio, 1);
91 gpiod_put(gpio);
92 }
93
94 gpio = gpiod_get(&pdev->dev, "reset");
95 if (!IS_ERR(gpio)) {
96 gpiod_direction_output(gpio, 0);
97 gpiod_set_value_cansleep(gpio, 1);
98 gpiod_put(gpio);
99 usleep_range(10000, 11000);
100 }
101 }
102
68 return 0; 103 return 0;
69} 104}
70 105
@@ -128,6 +163,7 @@ err:
128 163
129static void dwc3_pci_remove(struct pci_dev *pci) 164static void dwc3_pci_remove(struct pci_dev *pci)
130{ 165{
166 acpi_dev_remove_driver_gpios(ACPI_COMPANION(&pci->dev));
131 platform_device_unregister(pci_get_drvdata(pci)); 167 platform_device_unregister(pci_get_drvdata(pci));
132} 168}
133 169
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 8946c32047e9..333a7c0078fc 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -291,6 +291,8 @@ int dwc3_send_gadget_generic_command(struct dwc3 *dwc, unsigned cmd, u32 param)
291 dwc3_trace(trace_dwc3_gadget, 291 dwc3_trace(trace_dwc3_gadget,
292 "Command Complete --> %d", 292 "Command Complete --> %d",
293 DWC3_DGCMD_STATUS(reg)); 293 DWC3_DGCMD_STATUS(reg));
294 if (DWC3_DGCMD_STATUS(reg))
295 return -EINVAL;
294 return 0; 296 return 0;
295 } 297 }
296 298
@@ -328,6 +330,8 @@ int dwc3_send_gadget_ep_cmd(struct dwc3 *dwc, unsigned ep,
328 dwc3_trace(trace_dwc3_gadget, 330 dwc3_trace(trace_dwc3_gadget,
329 "Command Complete --> %d", 331 "Command Complete --> %d",
330 DWC3_DEPCMD_STATUS(reg)); 332 DWC3_DEPCMD_STATUS(reg));
333 if (DWC3_DEPCMD_STATUS(reg))
334 return -EINVAL;
331 return 0; 335 return 0;
332 } 336 }
333 337
@@ -1902,12 +1906,16 @@ static void dwc3_endpoint_transfer_complete(struct dwc3 *dwc,
1902{ 1906{
1903 unsigned status = 0; 1907 unsigned status = 0;
1904 int clean_busy; 1908 int clean_busy;
1909 u32 is_xfer_complete;
1910
1911 is_xfer_complete = (event->endpoint_event == DWC3_DEPEVT_XFERCOMPLETE);
1905 1912
1906 if (event->status & DEPEVT_STATUS_BUSERR) 1913 if (event->status & DEPEVT_STATUS_BUSERR)
1907 status = -ECONNRESET; 1914 status = -ECONNRESET;
1908 1915
1909 clean_busy = dwc3_cleanup_done_reqs(dwc, dep, event, status); 1916 clean_busy = dwc3_cleanup_done_reqs(dwc, dep, event, status);
1910 if (clean_busy) 1917 if (clean_busy && (is_xfer_complete ||
1918 usb_endpoint_xfer_isoc(dep->endpoint.desc)))
1911 dep->flags &= ~DWC3_EP_BUSY; 1919 dep->flags &= ~DWC3_EP_BUSY;
1912 1920
1913 /* 1921 /*
diff --git a/drivers/usb/dwc3/platform_data.h b/drivers/usb/dwc3/platform_data.h
index a2bd464be828..d3614ecbb9ca 100644
--- a/drivers/usb/dwc3/platform_data.h
+++ b/drivers/usb/dwc3/platform_data.h
@@ -45,4 +45,6 @@ struct dwc3_platform_data {
45 45
46 unsigned tx_de_emphasis_quirk:1; 46 unsigned tx_de_emphasis_quirk:1;
47 unsigned tx_de_emphasis:2; 47 unsigned tx_de_emphasis:2;
48
49 const char *hsphy_interface;
48}; 50};
diff --git a/drivers/usb/dwc3/ulpi.c b/drivers/usb/dwc3/ulpi.c
new file mode 100644
index 000000000000..ec004c6d76f2
--- /dev/null
+++ b/drivers/usb/dwc3/ulpi.c
@@ -0,0 +1,91 @@
1/**
2 * ulpi.c - DesignWare USB3 Controller's ULPI PHY interface
3 *
4 * Copyright (C) 2015 Intel Corporation
5 *
6 * Author: Heikki Krogerus <heikki.krogerus@linux.intel.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 */
12
13#include <linux/ulpi/regs.h>
14
15#include "core.h"
16#include "io.h"
17
18#define DWC3_ULPI_ADDR(a) \
19 ((a >= ULPI_EXT_VENDOR_SPECIFIC) ? \
20 DWC3_GUSB2PHYACC_ADDR(ULPI_ACCESS_EXTENDED) | \
21 DWC3_GUSB2PHYACC_EXTEND_ADDR(a) : DWC3_GUSB2PHYACC_ADDR(a))
22
23static int dwc3_ulpi_busyloop(struct dwc3 *dwc)
24{
25 unsigned count = 1000;
26 u32 reg;
27
28 while (count--) {
29 reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYACC(0));
30 if (!(reg & DWC3_GUSB2PHYACC_BUSY))
31 return 0;
32 cpu_relax();
33 }
34
35 return -ETIMEDOUT;
36}
37
38static int dwc3_ulpi_read(struct ulpi_ops *ops, u8 addr)
39{
40 struct dwc3 *dwc = dev_get_drvdata(ops->dev);
41 u32 reg;
42 int ret;
43
44 reg = DWC3_GUSB2PHYACC_NEWREGREQ | DWC3_ULPI_ADDR(addr);
45 dwc3_writel(dwc->regs, DWC3_GUSB2PHYACC(0), reg);
46
47 ret = dwc3_ulpi_busyloop(dwc);
48 if (ret)
49 return ret;
50
51 reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYACC(0));
52
53 return DWC3_GUSB2PHYACC_DATA(reg);
54}
55
56static int dwc3_ulpi_write(struct ulpi_ops *ops, u8 addr, u8 val)
57{
58 struct dwc3 *dwc = dev_get_drvdata(ops->dev);
59 u32 reg;
60
61 reg = DWC3_GUSB2PHYACC_NEWREGREQ | DWC3_ULPI_ADDR(addr);
62 reg |= DWC3_GUSB2PHYACC_WRITE | val;
63 dwc3_writel(dwc->regs, DWC3_GUSB2PHYACC(0), reg);
64
65 return dwc3_ulpi_busyloop(dwc);
66}
67
68static struct ulpi_ops dwc3_ulpi_ops = {
69 .read = dwc3_ulpi_read,
70 .write = dwc3_ulpi_write,
71};
72
73int dwc3_ulpi_init(struct dwc3 *dwc)
74{
75 /* Register the interface */
76 dwc->ulpi = ulpi_register_interface(dwc->dev, &dwc3_ulpi_ops);
77 if (IS_ERR(dwc->ulpi)) {
78 dev_err(dwc->dev, "failed to register ULPI interface");
79 return PTR_ERR(dwc->ulpi);
80 }
81
82 return 0;
83}
84
85void dwc3_ulpi_exit(struct dwc3 *dwc)
86{
87 if (dwc->ulpi) {
88 ulpi_unregister_interface(dwc->ulpi);
89 dwc->ulpi = NULL;
90 }
91}
diff --git a/drivers/usb/gadget/epautoconf.c b/drivers/usb/gadget/epautoconf.c
index 0567cca1465e..919cdfdda78b 100644
--- a/drivers/usb/gadget/epautoconf.c
+++ b/drivers/usb/gadget/epautoconf.c
@@ -258,15 +258,25 @@ struct usb_ep *usb_ep_autoconfig_ss(
258 /* First, apply chip-specific "best usage" knowledge. 258 /* First, apply chip-specific "best usage" knowledge.
259 * This might make a good usb_gadget_ops hook ... 259 * This might make a good usb_gadget_ops hook ...
260 */ 260 */
261 if (gadget_is_net2280 (gadget) && type == USB_ENDPOINT_XFER_INT) { 261 if (gadget_is_net2280(gadget)) {
262 /* ep-e, ep-f are PIO with only 64 byte fifos */ 262 char name[8];
263 ep = find_ep (gadget, "ep-e"); 263
264 if (ep && ep_matches(gadget, ep, desc, ep_comp)) 264 if (type == USB_ENDPOINT_XFER_INT) {
265 goto found_ep; 265 /* ep-e, ep-f are PIO with only 64 byte fifos */
266 ep = find_ep (gadget, "ep-f"); 266 ep = find_ep(gadget, "ep-e");
267 if (ep && ep_matches(gadget, ep, desc, ep_comp))
268 goto found_ep;
269 ep = find_ep(gadget, "ep-f");
270 if (ep && ep_matches(gadget, ep, desc, ep_comp))
271 goto found_ep;
272 }
273
274 /* USB3380: use same address for usb and hardware endpoints */
275 snprintf(name, sizeof(name), "ep%d%s", usb_endpoint_num(desc),
276 usb_endpoint_dir_in(desc) ? "in" : "out");
277 ep = find_ep(gadget, name);
267 if (ep && ep_matches(gadget, ep, desc, ep_comp)) 278 if (ep && ep_matches(gadget, ep, desc, ep_comp))
268 goto found_ep; 279 goto found_ep;
269
270 } else if (gadget_is_goku (gadget)) { 280 } else if (gadget_is_goku (gadget)) {
271 if (USB_ENDPOINT_XFER_INT == type) { 281 if (USB_ENDPOINT_XFER_INT == type) {
272 /* single buffering is enough */ 282 /* single buffering is enough */
diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c
index 6bdb57069044..e455eeee6444 100644
--- a/drivers/usb/gadget/function/f_fs.c
+++ b/drivers/usb/gadget/function/f_fs.c
@@ -3433,6 +3433,7 @@ done:
3433static void ffs_closed(struct ffs_data *ffs) 3433static void ffs_closed(struct ffs_data *ffs)
3434{ 3434{
3435 struct ffs_dev *ffs_obj; 3435 struct ffs_dev *ffs_obj;
3436 struct f_fs_opts *opts;
3436 3437
3437 ENTER(); 3438 ENTER();
3438 ffs_dev_lock(); 3439 ffs_dev_lock();
@@ -3446,8 +3447,13 @@ static void ffs_closed(struct ffs_data *ffs)
3446 if (ffs_obj->ffs_closed_callback) 3447 if (ffs_obj->ffs_closed_callback)
3447 ffs_obj->ffs_closed_callback(ffs); 3448 ffs_obj->ffs_closed_callback(ffs);
3448 3449
3449 if (!ffs_obj->opts || ffs_obj->opts->no_configfs 3450 if (ffs_obj->opts)
3450 || !ffs_obj->opts->func_inst.group.cg_item.ci_parent) 3451 opts = ffs_obj->opts;
3452 else
3453 goto done;
3454
3455 if (opts->no_configfs || !opts->func_inst.group.cg_item.ci_parent
3456 || !atomic_read(&opts->func_inst.group.cg_item.ci_kref.refcount))
3451 goto done; 3457 goto done;
3452 3458
3453 unregister_gadget_item(ffs_obj->opts-> 3459 unregister_gadget_item(ffs_obj->opts->
diff --git a/drivers/usb/gadget/function/f_rndis.c b/drivers/usb/gadget/function/f_rndis.c
index 829edf878dac..32985dade838 100644
--- a/drivers/usb/gadget/function/f_rndis.c
+++ b/drivers/usb/gadget/function/f_rndis.c
@@ -76,7 +76,7 @@ struct f_rndis {
76 u8 ethaddr[ETH_ALEN]; 76 u8 ethaddr[ETH_ALEN];
77 u32 vendorID; 77 u32 vendorID;
78 const char *manufacturer; 78 const char *manufacturer;
79 int config; 79 struct rndis_params *params;
80 80
81 struct usb_ep *notify; 81 struct usb_ep *notify;
82 struct usb_request *notify_req; 82 struct usb_request *notify_req;
@@ -453,7 +453,7 @@ static void rndis_command_complete(struct usb_ep *ep, struct usb_request *req)
453 453
454 /* received RNDIS command from USB_CDC_SEND_ENCAPSULATED_COMMAND */ 454 /* received RNDIS command from USB_CDC_SEND_ENCAPSULATED_COMMAND */
455// spin_lock(&dev->lock); 455// spin_lock(&dev->lock);
456 status = rndis_msg_parser(rndis->config, (u8 *) req->buf); 456 status = rndis_msg_parser(rndis->params, (u8 *) req->buf);
457 if (status < 0) 457 if (status < 0)
458 pr_err("RNDIS command error %d, %d/%d\n", 458 pr_err("RNDIS command error %d, %d/%d\n",
459 status, req->actual, req->length); 459 status, req->actual, req->length);
@@ -499,12 +499,12 @@ rndis_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl)
499 u32 n; 499 u32 n;
500 500
501 /* return the result */ 501 /* return the result */
502 buf = rndis_get_next_response(rndis->config, &n); 502 buf = rndis_get_next_response(rndis->params, &n);
503 if (buf) { 503 if (buf) {
504 memcpy(req->buf, buf, n); 504 memcpy(req->buf, buf, n);
505 req->complete = rndis_response_complete; 505 req->complete = rndis_response_complete;
506 req->context = rndis; 506 req->context = rndis;
507 rndis_free_response(rndis->config, buf); 507 rndis_free_response(rndis->params, buf);
508 value = n; 508 value = n;
509 } 509 }
510 /* else stalls ... spec says to avoid that */ 510 /* else stalls ... spec says to avoid that */
@@ -597,7 +597,7 @@ static int rndis_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
597 if (IS_ERR(net)) 597 if (IS_ERR(net))
598 return PTR_ERR(net); 598 return PTR_ERR(net);
599 599
600 rndis_set_param_dev(rndis->config, net, 600 rndis_set_param_dev(rndis->params, net,
601 &rndis->port.cdc_filter); 601 &rndis->port.cdc_filter);
602 } else 602 } else
603 goto fail; 603 goto fail;
@@ -617,7 +617,7 @@ static void rndis_disable(struct usb_function *f)
617 617
618 DBG(cdev, "rndis deactivated\n"); 618 DBG(cdev, "rndis deactivated\n");
619 619
620 rndis_uninit(rndis->config); 620 rndis_uninit(rndis->params);
621 gether_disconnect(&rndis->port); 621 gether_disconnect(&rndis->port);
622 622
623 usb_ep_disable(rndis->notify); 623 usb_ep_disable(rndis->notify);
@@ -640,9 +640,9 @@ static void rndis_open(struct gether *geth)
640 640
641 DBG(cdev, "%s\n", __func__); 641 DBG(cdev, "%s\n", __func__);
642 642
643 rndis_set_param_medium(rndis->config, RNDIS_MEDIUM_802_3, 643 rndis_set_param_medium(rndis->params, RNDIS_MEDIUM_802_3,
644 bitrate(cdev->gadget) / 100); 644 bitrate(cdev->gadget) / 100);
645 rndis_signal_connect(rndis->config); 645 rndis_signal_connect(rndis->params);
646} 646}
647 647
648static void rndis_close(struct gether *geth) 648static void rndis_close(struct gether *geth)
@@ -651,8 +651,8 @@ static void rndis_close(struct gether *geth)
651 651
652 DBG(geth->func.config->cdev, "%s\n", __func__); 652 DBG(geth->func.config->cdev, "%s\n", __func__);
653 653
654 rndis_set_param_medium(rndis->config, RNDIS_MEDIUM_802_3, 0); 654 rndis_set_param_medium(rndis->params, RNDIS_MEDIUM_802_3, 0);
655 rndis_signal_disconnect(rndis->config); 655 rndis_signal_disconnect(rndis->params);
656} 656}
657 657
658/*-------------------------------------------------------------------------*/ 658/*-------------------------------------------------------------------------*/
@@ -796,11 +796,11 @@ rndis_bind(struct usb_configuration *c, struct usb_function *f)
796 rndis->port.open = rndis_open; 796 rndis->port.open = rndis_open;
797 rndis->port.close = rndis_close; 797 rndis->port.close = rndis_close;
798 798
799 rndis_set_param_medium(rndis->config, RNDIS_MEDIUM_802_3, 0); 799 rndis_set_param_medium(rndis->params, RNDIS_MEDIUM_802_3, 0);
800 rndis_set_host_mac(rndis->config, rndis->ethaddr); 800 rndis_set_host_mac(rndis->params, rndis->ethaddr);
801 801
802 if (rndis->manufacturer && rndis->vendorID && 802 if (rndis->manufacturer && rndis->vendorID &&
803 rndis_set_param_vendor(rndis->config, rndis->vendorID, 803 rndis_set_param_vendor(rndis->params, rndis->vendorID,
804 rndis->manufacturer)) { 804 rndis->manufacturer)) {
805 status = -EINVAL; 805 status = -EINVAL;
806 goto fail_free_descs; 806 goto fail_free_descs;
@@ -944,7 +944,7 @@ static void rndis_free(struct usb_function *f)
944 struct f_rndis_opts *opts; 944 struct f_rndis_opts *opts;
945 945
946 rndis = func_to_rndis(f); 946 rndis = func_to_rndis(f);
947 rndis_deregister(rndis->config); 947 rndis_deregister(rndis->params);
948 opts = container_of(f->fi, struct f_rndis_opts, func_inst); 948 opts = container_of(f->fi, struct f_rndis_opts, func_inst);
949 kfree(rndis); 949 kfree(rndis);
950 mutex_lock(&opts->lock); 950 mutex_lock(&opts->lock);
@@ -968,7 +968,7 @@ static struct usb_function *rndis_alloc(struct usb_function_instance *fi)
968{ 968{
969 struct f_rndis *rndis; 969 struct f_rndis *rndis;
970 struct f_rndis_opts *opts; 970 struct f_rndis_opts *opts;
971 int status; 971 struct rndis_params *params;
972 972
973 /* allocate and initialize one new instance */ 973 /* allocate and initialize one new instance */
974 rndis = kzalloc(sizeof(*rndis), GFP_KERNEL); 974 rndis = kzalloc(sizeof(*rndis), GFP_KERNEL);
@@ -1002,36 +1002,16 @@ static struct usb_function *rndis_alloc(struct usb_function_instance *fi)
1002 rndis->port.func.disable = rndis_disable; 1002 rndis->port.func.disable = rndis_disable;
1003 rndis->port.func.free_func = rndis_free; 1003 rndis->port.func.free_func = rndis_free;
1004 1004
1005 status = rndis_register(rndis_response_available, rndis); 1005 params = rndis_register(rndis_response_available, rndis);
1006 if (status < 0) { 1006 if (IS_ERR(params)) {
1007 kfree(rndis); 1007 kfree(rndis);
1008 return ERR_PTR(status); 1008 return ERR_CAST(params);
1009 } 1009 }
1010 rndis->config = status; 1010 rndis->params = params;
1011 1011
1012 return &rndis->port.func; 1012 return &rndis->port.func;
1013} 1013}
1014 1014
1015DECLARE_USB_FUNCTION(rndis, rndis_alloc_inst, rndis_alloc); 1015DECLARE_USB_FUNCTION_INIT(rndis, rndis_alloc_inst, rndis_alloc);
1016
1017static int __init rndis_mod_init(void)
1018{
1019 int ret;
1020
1021 ret = rndis_init();
1022 if (ret)
1023 return ret;
1024
1025 return usb_function_register(&rndisusb_func);
1026}
1027module_init(rndis_mod_init);
1028
1029static void __exit rndis_mod_exit(void)
1030{
1031 usb_function_unregister(&rndisusb_func);
1032 rndis_exit();
1033}
1034module_exit(rndis_mod_exit);
1035
1036MODULE_LICENSE("GPL"); 1016MODULE_LICENSE("GPL");
1037MODULE_AUTHOR("David Brownell"); 1017MODULE_AUTHOR("David Brownell");
diff --git a/drivers/usb/gadget/function/rndis.c b/drivers/usb/gadget/function/rndis.c
index 95d2324f6977..70d3917cc003 100644
--- a/drivers/usb/gadget/function/rndis.c
+++ b/drivers/usb/gadget/function/rndis.c
@@ -25,6 +25,7 @@
25#include <linux/moduleparam.h> 25#include <linux/moduleparam.h>
26#include <linux/kernel.h> 26#include <linux/kernel.h>
27#include <linux/errno.h> 27#include <linux/errno.h>
28#include <linux/idr.h>
28#include <linux/list.h> 29#include <linux/list.h>
29#include <linux/proc_fs.h> 30#include <linux/proc_fs.h>
30#include <linux/slab.h> 31#include <linux/slab.h>
@@ -57,17 +58,26 @@ MODULE_PARM_DESC (rndis_debug, "enable debugging");
57#define rndis_debug 0 58#define rndis_debug 0
58#endif 59#endif
59 60
60#define RNDIS_MAX_CONFIGS 1 61#ifdef CONFIG_USB_GADGET_DEBUG_FILES
61 62
63#define NAME_TEMPLATE "driver/rndis-%03d"
62 64
63static rndis_params rndis_per_dev_params[RNDIS_MAX_CONFIGS]; 65#endif /* CONFIG_USB_GADGET_DEBUG_FILES */
66
67static DEFINE_IDA(rndis_ida);
64 68
65/* Driver Version */ 69/* Driver Version */
66static const __le32 rndis_driver_version = cpu_to_le32(1); 70static const __le32 rndis_driver_version = cpu_to_le32(1);
67 71
68/* Function Prototypes */ 72/* Function Prototypes */
69static rndis_resp_t *rndis_add_response(int configNr, u32 length); 73static rndis_resp_t *rndis_add_response(struct rndis_params *params,
74 u32 length);
75
76#ifdef CONFIG_USB_GADGET_DEBUG_FILES
77
78static const struct file_operations rndis_proc_fops;
70 79
80#endif /* CONFIG_USB_GADGET_DEBUG_FILES */
71 81
72/* supported OIDs */ 82/* supported OIDs */
73static const u32 oid_supported_list[] = 83static const u32 oid_supported_list[] =
@@ -160,7 +170,7 @@ static const u32 oid_supported_list[] =
160 170
161 171
162/* NDIS Functions */ 172/* NDIS Functions */
163static int gen_ndis_query_resp(int configNr, u32 OID, u8 *buf, 173static int gen_ndis_query_resp(struct rndis_params *params, u32 OID, u8 *buf,
164 unsigned buf_len, rndis_resp_t *r) 174 unsigned buf_len, rndis_resp_t *r)
165{ 175{
166 int retval = -ENOTSUPP; 176 int retval = -ENOTSUPP;
@@ -192,7 +202,7 @@ static int gen_ndis_query_resp(int configNr, u32 OID, u8 *buf,
192 outbuf = (__le32 *)&resp[1]; 202 outbuf = (__le32 *)&resp[1];
193 resp->InformationBufferOffset = cpu_to_le32(16); 203 resp->InformationBufferOffset = cpu_to_le32(16);
194 204
195 net = rndis_per_dev_params[configNr].dev; 205 net = params->dev;
196 stats = dev_get_stats(net, &temp); 206 stats = dev_get_stats(net, &temp);
197 207
198 switch (OID) { 208 switch (OID) {
@@ -225,7 +235,7 @@ static int gen_ndis_query_resp(int configNr, u32 OID, u8 *buf,
225 /* mandatory */ 235 /* mandatory */
226 case RNDIS_OID_GEN_MEDIA_SUPPORTED: 236 case RNDIS_OID_GEN_MEDIA_SUPPORTED:
227 pr_debug("%s: RNDIS_OID_GEN_MEDIA_SUPPORTED\n", __func__); 237 pr_debug("%s: RNDIS_OID_GEN_MEDIA_SUPPORTED\n", __func__);
228 *outbuf = cpu_to_le32(rndis_per_dev_params[configNr].medium); 238 *outbuf = cpu_to_le32(params->medium);
229 retval = 0; 239 retval = 0;
230 break; 240 break;
231 241
@@ -233,16 +243,15 @@ static int gen_ndis_query_resp(int configNr, u32 OID, u8 *buf,
233 case RNDIS_OID_GEN_MEDIA_IN_USE: 243 case RNDIS_OID_GEN_MEDIA_IN_USE:
234 pr_debug("%s: RNDIS_OID_GEN_MEDIA_IN_USE\n", __func__); 244 pr_debug("%s: RNDIS_OID_GEN_MEDIA_IN_USE\n", __func__);
235 /* one medium, one transport... (maybe you do it better) */ 245 /* one medium, one transport... (maybe you do it better) */
236 *outbuf = cpu_to_le32(rndis_per_dev_params[configNr].medium); 246 *outbuf = cpu_to_le32(params->medium);
237 retval = 0; 247 retval = 0;
238 break; 248 break;
239 249
240 /* mandatory */ 250 /* mandatory */
241 case RNDIS_OID_GEN_MAXIMUM_FRAME_SIZE: 251 case RNDIS_OID_GEN_MAXIMUM_FRAME_SIZE:
242 pr_debug("%s: RNDIS_OID_GEN_MAXIMUM_FRAME_SIZE\n", __func__); 252 pr_debug("%s: RNDIS_OID_GEN_MAXIMUM_FRAME_SIZE\n", __func__);
243 if (rndis_per_dev_params[configNr].dev) { 253 if (params->dev) {
244 *outbuf = cpu_to_le32( 254 *outbuf = cpu_to_le32(params->dev->mtu);
245 rndis_per_dev_params[configNr].dev->mtu);
246 retval = 0; 255 retval = 0;
247 } 256 }
248 break; 257 break;
@@ -251,21 +260,18 @@ static int gen_ndis_query_resp(int configNr, u32 OID, u8 *buf,
251 case RNDIS_OID_GEN_LINK_SPEED: 260 case RNDIS_OID_GEN_LINK_SPEED:
252 if (rndis_debug > 1) 261 if (rndis_debug > 1)
253 pr_debug("%s: RNDIS_OID_GEN_LINK_SPEED\n", __func__); 262 pr_debug("%s: RNDIS_OID_GEN_LINK_SPEED\n", __func__);
254 if (rndis_per_dev_params[configNr].media_state 263 if (params->media_state == RNDIS_MEDIA_STATE_DISCONNECTED)
255 == RNDIS_MEDIA_STATE_DISCONNECTED)
256 *outbuf = cpu_to_le32(0); 264 *outbuf = cpu_to_le32(0);
257 else 265 else
258 *outbuf = cpu_to_le32( 266 *outbuf = cpu_to_le32(params->speed);
259 rndis_per_dev_params[configNr].speed);
260 retval = 0; 267 retval = 0;
261 break; 268 break;
262 269
263 /* mandatory */ 270 /* mandatory */
264 case RNDIS_OID_GEN_TRANSMIT_BLOCK_SIZE: 271 case RNDIS_OID_GEN_TRANSMIT_BLOCK_SIZE:
265 pr_debug("%s: RNDIS_OID_GEN_TRANSMIT_BLOCK_SIZE\n", __func__); 272 pr_debug("%s: RNDIS_OID_GEN_TRANSMIT_BLOCK_SIZE\n", __func__);
266 if (rndis_per_dev_params[configNr].dev) { 273 if (params->dev) {
267 *outbuf = cpu_to_le32( 274 *outbuf = cpu_to_le32(params->dev->mtu);
268 rndis_per_dev_params[configNr].dev->mtu);
269 retval = 0; 275 retval = 0;
270 } 276 }
271 break; 277 break;
@@ -273,9 +279,8 @@ static int gen_ndis_query_resp(int configNr, u32 OID, u8 *buf,
273 /* mandatory */ 279 /* mandatory */
274 case RNDIS_OID_GEN_RECEIVE_BLOCK_SIZE: 280 case RNDIS_OID_GEN_RECEIVE_BLOCK_SIZE:
275 pr_debug("%s: RNDIS_OID_GEN_RECEIVE_BLOCK_SIZE\n", __func__); 281 pr_debug("%s: RNDIS_OID_GEN_RECEIVE_BLOCK_SIZE\n", __func__);
276 if (rndis_per_dev_params[configNr].dev) { 282 if (params->dev) {
277 *outbuf = cpu_to_le32( 283 *outbuf = cpu_to_le32(params->dev->mtu);
278 rndis_per_dev_params[configNr].dev->mtu);
279 retval = 0; 284 retval = 0;
280 } 285 }
281 break; 286 break;
@@ -283,20 +288,16 @@ static int gen_ndis_query_resp(int configNr, u32 OID, u8 *buf,
283 /* mandatory */ 288 /* mandatory */
284 case RNDIS_OID_GEN_VENDOR_ID: 289 case RNDIS_OID_GEN_VENDOR_ID:
285 pr_debug("%s: RNDIS_OID_GEN_VENDOR_ID\n", __func__); 290 pr_debug("%s: RNDIS_OID_GEN_VENDOR_ID\n", __func__);
286 *outbuf = cpu_to_le32( 291 *outbuf = cpu_to_le32(params->vendorID);
287 rndis_per_dev_params[configNr].vendorID);
288 retval = 0; 292 retval = 0;
289 break; 293 break;
290 294
291 /* mandatory */ 295 /* mandatory */
292 case RNDIS_OID_GEN_VENDOR_DESCRIPTION: 296 case RNDIS_OID_GEN_VENDOR_DESCRIPTION:
293 pr_debug("%s: RNDIS_OID_GEN_VENDOR_DESCRIPTION\n", __func__); 297 pr_debug("%s: RNDIS_OID_GEN_VENDOR_DESCRIPTION\n", __func__);
294 if (rndis_per_dev_params[configNr].vendorDescr) { 298 if (params->vendorDescr) {
295 length = strlen(rndis_per_dev_params[configNr]. 299 length = strlen(params->vendorDescr);
296 vendorDescr); 300 memcpy(outbuf, params->vendorDescr, length);
297 memcpy(outbuf,
298 rndis_per_dev_params[configNr].vendorDescr,
299 length);
300 } else { 301 } else {
301 outbuf[0] = 0; 302 outbuf[0] = 0;
302 } 303 }
@@ -313,7 +314,7 @@ static int gen_ndis_query_resp(int configNr, u32 OID, u8 *buf,
313 /* mandatory */ 314 /* mandatory */
314 case RNDIS_OID_GEN_CURRENT_PACKET_FILTER: 315 case RNDIS_OID_GEN_CURRENT_PACKET_FILTER:
315 pr_debug("%s: RNDIS_OID_GEN_CURRENT_PACKET_FILTER\n", __func__); 316 pr_debug("%s: RNDIS_OID_GEN_CURRENT_PACKET_FILTER\n", __func__);
316 *outbuf = cpu_to_le32(*rndis_per_dev_params[configNr].filter); 317 *outbuf = cpu_to_le32(*params->filter);
317 retval = 0; 318 retval = 0;
318 break; 319 break;
319 320
@@ -328,8 +329,7 @@ static int gen_ndis_query_resp(int configNr, u32 OID, u8 *buf,
328 case RNDIS_OID_GEN_MEDIA_CONNECT_STATUS: 329 case RNDIS_OID_GEN_MEDIA_CONNECT_STATUS:
329 if (rndis_debug > 1) 330 if (rndis_debug > 1)
330 pr_debug("%s: RNDIS_OID_GEN_MEDIA_CONNECT_STATUS\n", __func__); 331 pr_debug("%s: RNDIS_OID_GEN_MEDIA_CONNECT_STATUS\n", __func__);
331 *outbuf = cpu_to_le32(rndis_per_dev_params[configNr] 332 *outbuf = cpu_to_le32(params->media_state);
332 .media_state);
333 retval = 0; 333 retval = 0;
334 break; 334 break;
335 335
@@ -409,11 +409,9 @@ static int gen_ndis_query_resp(int configNr, u32 OID, u8 *buf,
409 /* mandatory */ 409 /* mandatory */
410 case RNDIS_OID_802_3_PERMANENT_ADDRESS: 410 case RNDIS_OID_802_3_PERMANENT_ADDRESS:
411 pr_debug("%s: RNDIS_OID_802_3_PERMANENT_ADDRESS\n", __func__); 411 pr_debug("%s: RNDIS_OID_802_3_PERMANENT_ADDRESS\n", __func__);
412 if (rndis_per_dev_params[configNr].dev) { 412 if (params->dev) {
413 length = ETH_ALEN; 413 length = ETH_ALEN;
414 memcpy(outbuf, 414 memcpy(outbuf, params->host_mac, length);
415 rndis_per_dev_params[configNr].host_mac,
416 length);
417 retval = 0; 415 retval = 0;
418 } 416 }
419 break; 417 break;
@@ -421,11 +419,9 @@ static int gen_ndis_query_resp(int configNr, u32 OID, u8 *buf,
421 /* mandatory */ 419 /* mandatory */
422 case RNDIS_OID_802_3_CURRENT_ADDRESS: 420 case RNDIS_OID_802_3_CURRENT_ADDRESS:
423 pr_debug("%s: RNDIS_OID_802_3_CURRENT_ADDRESS\n", __func__); 421 pr_debug("%s: RNDIS_OID_802_3_CURRENT_ADDRESS\n", __func__);
424 if (rndis_per_dev_params[configNr].dev) { 422 if (params->dev) {
425 length = ETH_ALEN; 423 length = ETH_ALEN;
426 memcpy(outbuf, 424 memcpy(outbuf, params->host_mac, length);
427 rndis_per_dev_params [configNr].host_mac,
428 length);
429 retval = 0; 425 retval = 0;
430 } 426 }
431 break; 427 break;
@@ -490,12 +486,11 @@ static int gen_ndis_query_resp(int configNr, u32 OID, u8 *buf,
490 return retval; 486 return retval;
491} 487}
492 488
493static int gen_ndis_set_resp(u8 configNr, u32 OID, u8 *buf, u32 buf_len, 489static int gen_ndis_set_resp(struct rndis_params *params, u32 OID,
494 rndis_resp_t *r) 490 u8 *buf, u32 buf_len, rndis_resp_t *r)
495{ 491{
496 rndis_set_cmplt_type *resp; 492 rndis_set_cmplt_type *resp;
497 int i, retval = -ENOTSUPP; 493 int i, retval = -ENOTSUPP;
498 struct rndis_params *params;
499 494
500 if (!r) 495 if (!r)
501 return -ENOMEM; 496 return -ENOMEM;
@@ -514,7 +509,6 @@ static int gen_ndis_set_resp(u8 configNr, u32 OID, u8 *buf, u32 buf_len,
514 } 509 }
515 } 510 }
516 511
517 params = &rndis_per_dev_params[configNr];
518 switch (OID) { 512 switch (OID) {
519 case RNDIS_OID_GEN_CURRENT_PACKET_FILTER: 513 case RNDIS_OID_GEN_CURRENT_PACKET_FILTER:
520 514
@@ -563,16 +557,16 @@ static int gen_ndis_set_resp(u8 configNr, u32 OID, u8 *buf, u32 buf_len,
563 * Response Functions 557 * Response Functions
564 */ 558 */
565 559
566static int rndis_init_response(int configNr, rndis_init_msg_type *buf) 560static int rndis_init_response(struct rndis_params *params,
561 rndis_init_msg_type *buf)
567{ 562{
568 rndis_init_cmplt_type *resp; 563 rndis_init_cmplt_type *resp;
569 rndis_resp_t *r; 564 rndis_resp_t *r;
570 struct rndis_params *params = rndis_per_dev_params + configNr;
571 565
572 if (!params->dev) 566 if (!params->dev)
573 return -ENOTSUPP; 567 return -ENOTSUPP;
574 568
575 r = rndis_add_response(configNr, sizeof(rndis_init_cmplt_type)); 569 r = rndis_add_response(params, sizeof(rndis_init_cmplt_type));
576 if (!r) 570 if (!r)
577 return -ENOMEM; 571 return -ENOMEM;
578 resp = (rndis_init_cmplt_type *)r->buf; 572 resp = (rndis_init_cmplt_type *)r->buf;
@@ -599,11 +593,11 @@ static int rndis_init_response(int configNr, rndis_init_msg_type *buf)
599 return 0; 593 return 0;
600} 594}
601 595
602static int rndis_query_response(int configNr, rndis_query_msg_type *buf) 596static int rndis_query_response(struct rndis_params *params,
597 rndis_query_msg_type *buf)
603{ 598{
604 rndis_query_cmplt_type *resp; 599 rndis_query_cmplt_type *resp;
605 rndis_resp_t *r; 600 rndis_resp_t *r;
606 struct rndis_params *params = rndis_per_dev_params + configNr;
607 601
608 /* pr_debug("%s: OID = %08X\n", __func__, cpu_to_le32(buf->OID)); */ 602 /* pr_debug("%s: OID = %08X\n", __func__, cpu_to_le32(buf->OID)); */
609 if (!params->dev) 603 if (!params->dev)
@@ -615,7 +609,7 @@ static int rndis_query_response(int configNr, rndis_query_msg_type *buf)
615 * rndis_query_cmplt_type followed by data. 609 * rndis_query_cmplt_type followed by data.
616 * oid_supported_list is the largest data reply 610 * oid_supported_list is the largest data reply
617 */ 611 */
618 r = rndis_add_response(configNr, 612 r = rndis_add_response(params,
619 sizeof(oid_supported_list) + sizeof(rndis_query_cmplt_type)); 613 sizeof(oid_supported_list) + sizeof(rndis_query_cmplt_type));
620 if (!r) 614 if (!r)
621 return -ENOMEM; 615 return -ENOMEM;
@@ -624,7 +618,7 @@ static int rndis_query_response(int configNr, rndis_query_msg_type *buf)
624 resp->MessageType = cpu_to_le32(RNDIS_MSG_QUERY_C); 618 resp->MessageType = cpu_to_le32(RNDIS_MSG_QUERY_C);
625 resp->RequestID = buf->RequestID; /* Still LE in msg buffer */ 619 resp->RequestID = buf->RequestID; /* Still LE in msg buffer */
626 620
627 if (gen_ndis_query_resp(configNr, le32_to_cpu(buf->OID), 621 if (gen_ndis_query_resp(params, le32_to_cpu(buf->OID),
628 le32_to_cpu(buf->InformationBufferOffset) 622 le32_to_cpu(buf->InformationBufferOffset)
629 + 8 + (u8 *)buf, 623 + 8 + (u8 *)buf,
630 le32_to_cpu(buf->InformationBufferLength), 624 le32_to_cpu(buf->InformationBufferLength),
@@ -641,14 +635,14 @@ static int rndis_query_response(int configNr, rndis_query_msg_type *buf)
641 return 0; 635 return 0;
642} 636}
643 637
644static int rndis_set_response(int configNr, rndis_set_msg_type *buf) 638static int rndis_set_response(struct rndis_params *params,
639 rndis_set_msg_type *buf)
645{ 640{
646 u32 BufLength, BufOffset; 641 u32 BufLength, BufOffset;
647 rndis_set_cmplt_type *resp; 642 rndis_set_cmplt_type *resp;
648 rndis_resp_t *r; 643 rndis_resp_t *r;
649 struct rndis_params *params = rndis_per_dev_params + configNr;
650 644
651 r = rndis_add_response(configNr, sizeof(rndis_set_cmplt_type)); 645 r = rndis_add_response(params, sizeof(rndis_set_cmplt_type));
652 if (!r) 646 if (!r)
653 return -ENOMEM; 647 return -ENOMEM;
654 resp = (rndis_set_cmplt_type *)r->buf; 648 resp = (rndis_set_cmplt_type *)r->buf;
@@ -671,7 +665,7 @@ static int rndis_set_response(int configNr, rndis_set_msg_type *buf)
671 resp->MessageType = cpu_to_le32(RNDIS_MSG_SET_C); 665 resp->MessageType = cpu_to_le32(RNDIS_MSG_SET_C);
672 resp->MessageLength = cpu_to_le32(16); 666 resp->MessageLength = cpu_to_le32(16);
673 resp->RequestID = buf->RequestID; /* Still LE in msg buffer */ 667 resp->RequestID = buf->RequestID; /* Still LE in msg buffer */
674 if (gen_ndis_set_resp(configNr, le32_to_cpu(buf->OID), 668 if (gen_ndis_set_resp(params, le32_to_cpu(buf->OID),
675 ((u8 *)buf) + 8 + BufOffset, BufLength, r)) 669 ((u8 *)buf) + 8 + BufOffset, BufLength, r))
676 resp->Status = cpu_to_le32(RNDIS_STATUS_NOT_SUPPORTED); 670 resp->Status = cpu_to_le32(RNDIS_STATUS_NOT_SUPPORTED);
677 else 671 else
@@ -681,13 +675,13 @@ static int rndis_set_response(int configNr, rndis_set_msg_type *buf)
681 return 0; 675 return 0;
682} 676}
683 677
684static int rndis_reset_response(int configNr, rndis_reset_msg_type *buf) 678static int rndis_reset_response(struct rndis_params *params,
679 rndis_reset_msg_type *buf)
685{ 680{
686 rndis_reset_cmplt_type *resp; 681 rndis_reset_cmplt_type *resp;
687 rndis_resp_t *r; 682 rndis_resp_t *r;
688 struct rndis_params *params = rndis_per_dev_params + configNr;
689 683
690 r = rndis_add_response(configNr, sizeof(rndis_reset_cmplt_type)); 684 r = rndis_add_response(params, sizeof(rndis_reset_cmplt_type));
691 if (!r) 685 if (!r)
692 return -ENOMEM; 686 return -ENOMEM;
693 resp = (rndis_reset_cmplt_type *)r->buf; 687 resp = (rndis_reset_cmplt_type *)r->buf;
@@ -702,16 +696,15 @@ static int rndis_reset_response(int configNr, rndis_reset_msg_type *buf)
702 return 0; 696 return 0;
703} 697}
704 698
705static int rndis_keepalive_response(int configNr, 699static int rndis_keepalive_response(struct rndis_params *params,
706 rndis_keepalive_msg_type *buf) 700 rndis_keepalive_msg_type *buf)
707{ 701{
708 rndis_keepalive_cmplt_type *resp; 702 rndis_keepalive_cmplt_type *resp;
709 rndis_resp_t *r; 703 rndis_resp_t *r;
710 struct rndis_params *params = rndis_per_dev_params + configNr;
711 704
712 /* host "should" check only in RNDIS_DATA_INITIALIZED state */ 705 /* host "should" check only in RNDIS_DATA_INITIALIZED state */
713 706
714 r = rndis_add_response(configNr, sizeof(rndis_keepalive_cmplt_type)); 707 r = rndis_add_response(params, sizeof(rndis_keepalive_cmplt_type));
715 if (!r) 708 if (!r)
716 return -ENOMEM; 709 return -ENOMEM;
717 resp = (rndis_keepalive_cmplt_type *)r->buf; 710 resp = (rndis_keepalive_cmplt_type *)r->buf;
@@ -729,17 +722,15 @@ static int rndis_keepalive_response(int configNr,
729/* 722/*
730 * Device to Host Comunication 723 * Device to Host Comunication
731 */ 724 */
732static int rndis_indicate_status_msg(int configNr, u32 status) 725static int rndis_indicate_status_msg(struct rndis_params *params, u32 status)
733{ 726{
734 rndis_indicate_status_msg_type *resp; 727 rndis_indicate_status_msg_type *resp;
735 rndis_resp_t *r; 728 rndis_resp_t *r;
736 struct rndis_params *params = rndis_per_dev_params + configNr;
737 729
738 if (params->state == RNDIS_UNINITIALIZED) 730 if (params->state == RNDIS_UNINITIALIZED)
739 return -ENOTSUPP; 731 return -ENOTSUPP;
740 732
741 r = rndis_add_response(configNr, 733 r = rndis_add_response(params, sizeof(rndis_indicate_status_msg_type));
742 sizeof(rndis_indicate_status_msg_type));
743 if (!r) 734 if (!r)
744 return -ENOMEM; 735 return -ENOMEM;
745 resp = (rndis_indicate_status_msg_type *)r->buf; 736 resp = (rndis_indicate_status_msg_type *)r->buf;
@@ -754,53 +745,48 @@ static int rndis_indicate_status_msg(int configNr, u32 status)
754 return 0; 745 return 0;
755} 746}
756 747
757int rndis_signal_connect(int configNr) 748int rndis_signal_connect(struct rndis_params *params)
758{ 749{
759 rndis_per_dev_params[configNr].media_state 750 params->media_state = RNDIS_MEDIA_STATE_CONNECTED;
760 = RNDIS_MEDIA_STATE_CONNECTED; 751 return rndis_indicate_status_msg(params, RNDIS_STATUS_MEDIA_CONNECT);
761 return rndis_indicate_status_msg(configNr,
762 RNDIS_STATUS_MEDIA_CONNECT);
763} 752}
764EXPORT_SYMBOL_GPL(rndis_signal_connect); 753EXPORT_SYMBOL_GPL(rndis_signal_connect);
765 754
766int rndis_signal_disconnect(int configNr) 755int rndis_signal_disconnect(struct rndis_params *params)
767{ 756{
768 rndis_per_dev_params[configNr].media_state 757 params->media_state = RNDIS_MEDIA_STATE_DISCONNECTED;
769 = RNDIS_MEDIA_STATE_DISCONNECTED; 758 return rndis_indicate_status_msg(params, RNDIS_STATUS_MEDIA_DISCONNECT);
770 return rndis_indicate_status_msg(configNr,
771 RNDIS_STATUS_MEDIA_DISCONNECT);
772} 759}
773EXPORT_SYMBOL_GPL(rndis_signal_disconnect); 760EXPORT_SYMBOL_GPL(rndis_signal_disconnect);
774 761
775void rndis_uninit(int configNr) 762void rndis_uninit(struct rndis_params *params)
776{ 763{
777 u8 *buf; 764 u8 *buf;
778 u32 length; 765 u32 length;
779 766
780 if (configNr >= RNDIS_MAX_CONFIGS) 767 if (!params)
781 return; 768 return;
782 rndis_per_dev_params[configNr].state = RNDIS_UNINITIALIZED; 769 params->state = RNDIS_UNINITIALIZED;
783 770
784 /* drain the response queue */ 771 /* drain the response queue */
785 while ((buf = rndis_get_next_response(configNr, &length))) 772 while ((buf = rndis_get_next_response(params, &length)))
786 rndis_free_response(configNr, buf); 773 rndis_free_response(params, buf);
787} 774}
788EXPORT_SYMBOL_GPL(rndis_uninit); 775EXPORT_SYMBOL_GPL(rndis_uninit);
789 776
790void rndis_set_host_mac(int configNr, const u8 *addr) 777void rndis_set_host_mac(struct rndis_params *params, const u8 *addr)
791{ 778{
792 rndis_per_dev_params[configNr].host_mac = addr; 779 params->host_mac = addr;
793} 780}
794EXPORT_SYMBOL_GPL(rndis_set_host_mac); 781EXPORT_SYMBOL_GPL(rndis_set_host_mac);
795 782
796/* 783/*
797 * Message Parser 784 * Message Parser
798 */ 785 */
799int rndis_msg_parser(u8 configNr, u8 *buf) 786int rndis_msg_parser(struct rndis_params *params, u8 *buf)
800{ 787{
801 u32 MsgType, MsgLength; 788 u32 MsgType, MsgLength;
802 __le32 *tmp; 789 __le32 *tmp;
803 struct rndis_params *params;
804 790
805 if (!buf) 791 if (!buf)
806 return -ENOMEM; 792 return -ENOMEM;
@@ -809,9 +795,8 @@ int rndis_msg_parser(u8 configNr, u8 *buf)
809 MsgType = get_unaligned_le32(tmp++); 795 MsgType = get_unaligned_le32(tmp++);
810 MsgLength = get_unaligned_le32(tmp++); 796 MsgLength = get_unaligned_le32(tmp++);
811 797
812 if (configNr >= RNDIS_MAX_CONFIGS) 798 if (!params)
813 return -ENOTSUPP; 799 return -ENOTSUPP;
814 params = &rndis_per_dev_params[configNr];
815 800
816 /* NOTE: RNDIS is *EXTREMELY* chatty ... Windows constantly polls for 801 /* NOTE: RNDIS is *EXTREMELY* chatty ... Windows constantly polls for
817 * rx/tx statistics and link status, in addition to KEEPALIVE traffic 802 * rx/tx statistics and link status, in addition to KEEPALIVE traffic
@@ -824,8 +809,7 @@ int rndis_msg_parser(u8 configNr, u8 *buf)
824 pr_debug("%s: RNDIS_MSG_INIT\n", 809 pr_debug("%s: RNDIS_MSG_INIT\n",
825 __func__); 810 __func__);
826 params->state = RNDIS_INITIALIZED; 811 params->state = RNDIS_INITIALIZED;
827 return rndis_init_response(configNr, 812 return rndis_init_response(params, (rndis_init_msg_type *)buf);
828 (rndis_init_msg_type *)buf);
829 813
830 case RNDIS_MSG_HALT: 814 case RNDIS_MSG_HALT:
831 pr_debug("%s: RNDIS_MSG_HALT\n", 815 pr_debug("%s: RNDIS_MSG_HALT\n",
@@ -838,17 +822,16 @@ int rndis_msg_parser(u8 configNr, u8 *buf)
838 return 0; 822 return 0;
839 823
840 case RNDIS_MSG_QUERY: 824 case RNDIS_MSG_QUERY:
841 return rndis_query_response(configNr, 825 return rndis_query_response(params,
842 (rndis_query_msg_type *)buf); 826 (rndis_query_msg_type *)buf);
843 827
844 case RNDIS_MSG_SET: 828 case RNDIS_MSG_SET:
845 return rndis_set_response(configNr, 829 return rndis_set_response(params, (rndis_set_msg_type *)buf);
846 (rndis_set_msg_type *)buf);
847 830
848 case RNDIS_MSG_RESET: 831 case RNDIS_MSG_RESET:
849 pr_debug("%s: RNDIS_MSG_RESET\n", 832 pr_debug("%s: RNDIS_MSG_RESET\n",
850 __func__); 833 __func__);
851 return rndis_reset_response(configNr, 834 return rndis_reset_response(params,
852 (rndis_reset_msg_type *)buf); 835 (rndis_reset_msg_type *)buf);
853 836
854 case RNDIS_MSG_KEEPALIVE: 837 case RNDIS_MSG_KEEPALIVE:
@@ -856,7 +839,7 @@ int rndis_msg_parser(u8 configNr, u8 *buf)
856 if (rndis_debug > 1) 839 if (rndis_debug > 1)
857 pr_debug("%s: RNDIS_MSG_KEEPALIVE\n", 840 pr_debug("%s: RNDIS_MSG_KEEPALIVE\n",
858 __func__); 841 __func__);
859 return rndis_keepalive_response(configNr, 842 return rndis_keepalive_response(params,
860 (rndis_keepalive_msg_type *) 843 (rndis_keepalive_msg_type *)
861 buf); 844 buf);
862 845
@@ -876,71 +859,131 @@ int rndis_msg_parser(u8 configNr, u8 *buf)
876} 859}
877EXPORT_SYMBOL_GPL(rndis_msg_parser); 860EXPORT_SYMBOL_GPL(rndis_msg_parser);
878 861
879int rndis_register(void (*resp_avail)(void *v), void *v) 862static inline int rndis_get_nr(void)
880{ 863{
881 u8 i; 864 return ida_simple_get(&rndis_ida, 0, 0, GFP_KERNEL);
865}
866
867static inline void rndis_put_nr(int nr)
868{
869 ida_simple_remove(&rndis_ida, nr);
870}
871
872struct rndis_params *rndis_register(void (*resp_avail)(void *v), void *v)
873{
874 struct rndis_params *params;
875 int i;
882 876
883 if (!resp_avail) 877 if (!resp_avail)
884 return -EINVAL; 878 return ERR_PTR(-EINVAL);
879
880 i = rndis_get_nr();
881 if (i < 0) {
882 pr_debug("failed\n");
883
884 return ERR_PTR(-ENODEV);
885 }
886
887 params = kzalloc(sizeof(*params), GFP_KERNEL);
888 if (!params) {
889 rndis_put_nr(i);
885 890
886 for (i = 0; i < RNDIS_MAX_CONFIGS; i++) { 891 return ERR_PTR(-ENOMEM);
887 if (!rndis_per_dev_params[i].used) { 892 }
888 rndis_per_dev_params[i].used = 1; 893
889 rndis_per_dev_params[i].resp_avail = resp_avail; 894#ifdef CONFIG_USB_GADGET_DEBUG_FILES
890 rndis_per_dev_params[i].v = v; 895 {
891 pr_debug("%s: configNr = %d\n", __func__, i); 896 struct proc_dir_entry *proc_entry;
892 return i; 897 char name[20];
898
899 sprintf(name, NAME_TEMPLATE, i);
900 proc_entry = proc_create_data(name, 0660, NULL,
901 &rndis_proc_fops, params);
902 if (!proc_entry) {
903 kfree(params);
904 rndis_put_nr(i);
905
906 return ERR_PTR(-EIO);
893 } 907 }
894 } 908 }
895 pr_debug("failed\n"); 909#endif
910
911 params->confignr = i;
912 params->used = 1;
913 params->state = RNDIS_UNINITIALIZED;
914 params->media_state = RNDIS_MEDIA_STATE_DISCONNECTED;
915 params->resp_avail = resp_avail;
916 params->v = v;
917 INIT_LIST_HEAD(&(params->resp_queue));
918 pr_debug("%s: configNr = %d\n", __func__, i);
896 919
897 return -ENODEV; 920 return params;
898} 921}
899EXPORT_SYMBOL_GPL(rndis_register); 922EXPORT_SYMBOL_GPL(rndis_register);
900 923
901void rndis_deregister(int configNr) 924void rndis_deregister(struct rndis_params *params)
902{ 925{
926 int i;
927
903 pr_debug("%s:\n", __func__); 928 pr_debug("%s:\n", __func__);
904 929
905 if (configNr >= RNDIS_MAX_CONFIGS) return; 930 if (!params)
906 rndis_per_dev_params[configNr].used = 0; 931 return;
932
933 i = params->confignr;
934
935#ifdef CONFIG_USB_GADGET_DEBUG_FILES
936 {
937 char name[20];
938
939 sprintf(name, NAME_TEMPLATE, i);
940 remove_proc_entry(name, NULL);
941 }
942#endif
943
944 kfree(params);
945 rndis_put_nr(i);
907} 946}
908EXPORT_SYMBOL_GPL(rndis_deregister); 947EXPORT_SYMBOL_GPL(rndis_deregister);
909 948int rndis_set_param_dev(struct rndis_params *params, struct net_device *dev,
910int rndis_set_param_dev(u8 configNr, struct net_device *dev, u16 *cdc_filter) 949 u16 *cdc_filter)
911{ 950{
912 pr_debug("%s:\n", __func__); 951 pr_debug("%s:\n", __func__);
913 if (!dev) 952 if (!dev)
914 return -EINVAL; 953 return -EINVAL;
915 if (configNr >= RNDIS_MAX_CONFIGS) return -1; 954 if (!params)
955 return -1;
916 956
917 rndis_per_dev_params[configNr].dev = dev; 957 params->dev = dev;
918 rndis_per_dev_params[configNr].filter = cdc_filter; 958 params->filter = cdc_filter;
919 959
920 return 0; 960 return 0;
921} 961}
922EXPORT_SYMBOL_GPL(rndis_set_param_dev); 962EXPORT_SYMBOL_GPL(rndis_set_param_dev);
923 963
924int rndis_set_param_vendor(u8 configNr, u32 vendorID, const char *vendorDescr) 964int rndis_set_param_vendor(struct rndis_params *params, u32 vendorID,
965 const char *vendorDescr)
925{ 966{
926 pr_debug("%s:\n", __func__); 967 pr_debug("%s:\n", __func__);
927 if (!vendorDescr) return -1; 968 if (!vendorDescr) return -1;
928 if (configNr >= RNDIS_MAX_CONFIGS) return -1; 969 if (!params)
970 return -1;
929 971
930 rndis_per_dev_params[configNr].vendorID = vendorID; 972 params->vendorID = vendorID;
931 rndis_per_dev_params[configNr].vendorDescr = vendorDescr; 973 params->vendorDescr = vendorDescr;
932 974
933 return 0; 975 return 0;
934} 976}
935EXPORT_SYMBOL_GPL(rndis_set_param_vendor); 977EXPORT_SYMBOL_GPL(rndis_set_param_vendor);
936 978
937int rndis_set_param_medium(u8 configNr, u32 medium, u32 speed) 979int rndis_set_param_medium(struct rndis_params *params, u32 medium, u32 speed)
938{ 980{
939 pr_debug("%s: %u %u\n", __func__, medium, speed); 981 pr_debug("%s: %u %u\n", __func__, medium, speed);
940 if (configNr >= RNDIS_MAX_CONFIGS) return -1; 982 if (!params)
983 return -1;
941 984
942 rndis_per_dev_params[configNr].medium = medium; 985 params->medium = medium;
943 rndis_per_dev_params[configNr].speed = speed; 986 params->speed = speed;
944 987
945 return 0; 988 return 0;
946} 989}
@@ -961,13 +1004,12 @@ void rndis_add_hdr(struct sk_buff *skb)
961} 1004}
962EXPORT_SYMBOL_GPL(rndis_add_hdr); 1005EXPORT_SYMBOL_GPL(rndis_add_hdr);
963 1006
964void rndis_free_response(int configNr, u8 *buf) 1007void rndis_free_response(struct rndis_params *params, u8 *buf)
965{ 1008{
966 rndis_resp_t *r; 1009 rndis_resp_t *r;
967 struct list_head *act, *tmp; 1010 struct list_head *act, *tmp;
968 1011
969 list_for_each_safe(act, tmp, 1012 list_for_each_safe(act, tmp, &(params->resp_queue))
970 &(rndis_per_dev_params[configNr].resp_queue))
971 { 1013 {
972 r = list_entry(act, rndis_resp_t, list); 1014 r = list_entry(act, rndis_resp_t, list);
973 if (r && r->buf == buf) { 1015 if (r && r->buf == buf) {
@@ -978,15 +1020,14 @@ void rndis_free_response(int configNr, u8 *buf)
978} 1020}
979EXPORT_SYMBOL_GPL(rndis_free_response); 1021EXPORT_SYMBOL_GPL(rndis_free_response);
980 1022
981u8 *rndis_get_next_response(int configNr, u32 *length) 1023u8 *rndis_get_next_response(struct rndis_params *params, u32 *length)
982{ 1024{
983 rndis_resp_t *r; 1025 rndis_resp_t *r;
984 struct list_head *act, *tmp; 1026 struct list_head *act, *tmp;
985 1027
986 if (!length) return NULL; 1028 if (!length) return NULL;
987 1029
988 list_for_each_safe(act, tmp, 1030 list_for_each_safe(act, tmp, &(params->resp_queue))
989 &(rndis_per_dev_params[configNr].resp_queue))
990 { 1031 {
991 r = list_entry(act, rndis_resp_t, list); 1032 r = list_entry(act, rndis_resp_t, list);
992 if (!r->send) { 1033 if (!r->send) {
@@ -1000,7 +1041,7 @@ u8 *rndis_get_next_response(int configNr, u32 *length)
1000} 1041}
1001EXPORT_SYMBOL_GPL(rndis_get_next_response); 1042EXPORT_SYMBOL_GPL(rndis_get_next_response);
1002 1043
1003static rndis_resp_t *rndis_add_response(int configNr, u32 length) 1044static rndis_resp_t *rndis_add_response(struct rndis_params *params, u32 length)
1004{ 1045{
1005 rndis_resp_t *r; 1046 rndis_resp_t *r;
1006 1047
@@ -1012,8 +1053,7 @@ static rndis_resp_t *rndis_add_response(int configNr, u32 length)
1012 r->length = length; 1053 r->length = length;
1013 r->send = 0; 1054 r->send = 0;
1014 1055
1015 list_add_tail(&r->list, 1056 list_add_tail(&r->list, &(params->resp_queue));
1016 &(rndis_per_dev_params[configNr].resp_queue));
1017 return r; 1057 return r;
1018} 1058}
1019 1059
@@ -1103,11 +1143,11 @@ static ssize_t rndis_proc_write(struct file *file, const char __user *buffer,
1103 break; 1143 break;
1104 case 'C': 1144 case 'C':
1105 case 'c': 1145 case 'c':
1106 rndis_signal_connect(p->confignr); 1146 rndis_signal_connect(p);
1107 break; 1147 break;
1108 case 'D': 1148 case 'D':
1109 case 'd': 1149 case 'd':
1110 rndis_signal_disconnect(p->confignr); 1150 rndis_signal_disconnect(p);
1111 break; 1151 break;
1112 default: 1152 default:
1113 if (fl_speed) p->speed = speed; 1153 if (fl_speed) p->speed = speed;
@@ -1137,54 +1177,4 @@ static const struct file_operations rndis_proc_fops = {
1137 1177
1138#define NAME_TEMPLATE "driver/rndis-%03d" 1178#define NAME_TEMPLATE "driver/rndis-%03d"
1139 1179
1140static struct proc_dir_entry *rndis_connect_state [RNDIS_MAX_CONFIGS];
1141
1142#endif /* CONFIG_USB_GADGET_DEBUG_FILES */ 1180#endif /* CONFIG_USB_GADGET_DEBUG_FILES */
1143
1144
1145int rndis_init(void)
1146{
1147 u8 i;
1148
1149 for (i = 0; i < RNDIS_MAX_CONFIGS; i++) {
1150#ifdef CONFIG_USB_GADGET_DEBUG_FILES
1151 char name [20];
1152
1153 sprintf(name, NAME_TEMPLATE, i);
1154 rndis_connect_state[i] = proc_create_data(name, 0660, NULL,
1155 &rndis_proc_fops,
1156 (void *)(rndis_per_dev_params + i));
1157 if (!rndis_connect_state[i]) {
1158 pr_debug("%s: remove entries", __func__);
1159 while (i) {
1160 sprintf(name, NAME_TEMPLATE, --i);
1161 remove_proc_entry(name, NULL);
1162 }
1163 pr_debug("\n");
1164 return -EIO;
1165 }
1166#endif
1167 rndis_per_dev_params[i].confignr = i;
1168 rndis_per_dev_params[i].used = 0;
1169 rndis_per_dev_params[i].state = RNDIS_UNINITIALIZED;
1170 rndis_per_dev_params[i].media_state
1171 = RNDIS_MEDIA_STATE_DISCONNECTED;
1172 INIT_LIST_HEAD(&(rndis_per_dev_params[i].resp_queue));
1173 }
1174
1175 return 0;
1176}
1177
1178void rndis_exit(void)
1179{
1180#ifdef CONFIG_USB_GADGET_DEBUG_FILES
1181 u8 i;
1182 char name[20];
1183
1184 for (i = 0; i < RNDIS_MAX_CONFIGS; i++) {
1185 sprintf(name, NAME_TEMPLATE, i);
1186 remove_proc_entry(name, NULL);
1187 }
1188#endif
1189}
1190
diff --git a/drivers/usb/gadget/function/rndis.h b/drivers/usb/gadget/function/rndis.h
index 0f4abb4c3775..ef92eb66d8ad 100644
--- a/drivers/usb/gadget/function/rndis.h
+++ b/drivers/usb/gadget/function/rndis.h
@@ -177,7 +177,7 @@ typedef struct rndis_resp_t
177 177
178typedef struct rndis_params 178typedef struct rndis_params
179{ 179{
180 u8 confignr; 180 int confignr;
181 u8 used; 181 u8 used;
182 u16 saved_filter; 182 u16 saved_filter;
183 enum rndis_state state; 183 enum rndis_state state;
@@ -197,24 +197,25 @@ typedef struct rndis_params
197} rndis_params; 197} rndis_params;
198 198
199/* RNDIS Message parser and other useless functions */ 199/* RNDIS Message parser and other useless functions */
200int rndis_msg_parser (u8 configNr, u8 *buf); 200int rndis_msg_parser(struct rndis_params *params, u8 *buf);
201int rndis_register(void (*resp_avail)(void *v), void *v); 201struct rndis_params *rndis_register(void (*resp_avail)(void *v), void *v);
202void rndis_deregister (int configNr); 202void rndis_deregister(struct rndis_params *params);
203int rndis_set_param_dev (u8 configNr, struct net_device *dev, 203int rndis_set_param_dev(struct rndis_params *params, struct net_device *dev,
204 u16 *cdc_filter); 204 u16 *cdc_filter);
205int rndis_set_param_vendor (u8 configNr, u32 vendorID, 205int rndis_set_param_vendor(struct rndis_params *params, u32 vendorID,
206 const char *vendorDescr); 206 const char *vendorDescr);
207int rndis_set_param_medium (u8 configNr, u32 medium, u32 speed); 207int rndis_set_param_medium(struct rndis_params *params, u32 medium,
208void rndis_add_hdr (struct sk_buff *skb); 208 u32 speed);
209void rndis_add_hdr(struct sk_buff *skb);
209int rndis_rm_hdr(struct gether *port, struct sk_buff *skb, 210int rndis_rm_hdr(struct gether *port, struct sk_buff *skb,
210 struct sk_buff_head *list); 211 struct sk_buff_head *list);
211u8 *rndis_get_next_response (int configNr, u32 *length); 212u8 *rndis_get_next_response(struct rndis_params *params, u32 *length);
212void rndis_free_response (int configNr, u8 *buf); 213void rndis_free_response(struct rndis_params *params, u8 *buf);
213 214
214void rndis_uninit (int configNr); 215void rndis_uninit(struct rndis_params *params);
215int rndis_signal_connect (int configNr); 216int rndis_signal_connect(struct rndis_params *params);
216int rndis_signal_disconnect (int configNr); 217int rndis_signal_disconnect(struct rndis_params *params);
217int rndis_state (int configNr); 218int rndis_state(struct rndis_params *params);
218extern void rndis_set_host_mac (int configNr, const u8 *addr); 219extern void rndis_set_host_mac(struct rndis_params *params, const u8 *addr);
219 220
220#endif /* _LINUX_RNDIS_H */ 221#endif /* _LINUX_RNDIS_H */
diff --git a/drivers/usb/gadget/function/u_rndis.h b/drivers/usb/gadget/function/u_rndis.h
index e902aa42a297..4eafd5050545 100644
--- a/drivers/usb/gadget/function/u_rndis.h
+++ b/drivers/usb/gadget/function/u_rndis.h
@@ -39,8 +39,6 @@ struct f_rndis_opts {
39 int refcnt; 39 int refcnt;
40}; 40};
41 41
42int rndis_init(void);
43void rndis_exit(void);
44void rndis_borrow_net(struct usb_function_instance *f, struct net_device *net); 42void rndis_borrow_net(struct usb_function_instance *f, struct net_device *net);
45 43
46#endif /* U_RNDIS_H */ 44#endif /* U_RNDIS_H */
diff --git a/drivers/usb/gadget/function/uvc.h b/drivers/usb/gadget/function/uvc.h
index ebe409b9e419..7d3bb6272e06 100644
--- a/drivers/usb/gadget/function/uvc.h
+++ b/drivers/usb/gadget/function/uvc.h
@@ -56,7 +56,6 @@ struct uvc_event
56#include <linux/usb/composite.h> 56#include <linux/usb/composite.h>
57#include <linux/usb/gadget.h> 57#include <linux/usb/gadget.h>
58#include <linux/videodev2.h> 58#include <linux/videodev2.h>
59#include <linux/version.h>
60#include <media/v4l2-fh.h> 59#include <media/v4l2-fh.h>
61#include <media/v4l2-device.h> 60#include <media/v4l2-device.h>
62 61
diff --git a/drivers/usb/gadget/udc/atmel_usba_udc.c b/drivers/usb/gadget/udc/atmel_usba_udc.c
index 351d48550c33..4095cce05e6a 100644
--- a/drivers/usb/gadget/udc/atmel_usba_udc.c
+++ b/drivers/usb/gadget/udc/atmel_usba_udc.c
@@ -704,8 +704,8 @@ static int queue_dma(struct usba_udc *udc, struct usba_ep *ep,
704 unsigned long flags; 704 unsigned long flags;
705 int ret; 705 int ret;
706 706
707 DBG(DBG_DMA, "%s: req l/%u d/%08x %c%c%c\n", 707 DBG(DBG_DMA, "%s: req l/%u d/%pad %c%c%c\n",
708 ep->ep.name, req->req.length, req->req.dma, 708 ep->ep.name, req->req.length, &req->req.dma,
709 req->req.zero ? 'Z' : 'z', 709 req->req.zero ? 'Z' : 'z',
710 req->req.short_not_ok ? 'S' : 's', 710 req->req.short_not_ok ? 'S' : 's',
711 req->req.no_interrupt ? 'I' : 'i'); 711 req->req.no_interrupt ? 'I' : 'i');
@@ -2203,7 +2203,7 @@ static int usba_udc_remove(struct platform_device *pdev)
2203 return 0; 2203 return 0;
2204} 2204}
2205 2205
2206#ifdef CONFIG_PM 2206#ifdef CONFIG_PM_SLEEP
2207static int usba_udc_suspend(struct device *dev) 2207static int usba_udc_suspend(struct device *dev)
2208{ 2208{
2209 struct usba_udc *udc = dev_get_drvdata(dev); 2209 struct usba_udc *udc = dev_get_drvdata(dev);
diff --git a/drivers/usb/gadget/udc/net2280.c b/drivers/usb/gadget/udc/net2280.c
index 9871b90195ad..2bee912ca65b 100644
--- a/drivers/usb/gadget/udc/net2280.c
+++ b/drivers/usb/gadget/udc/net2280.c
@@ -123,6 +123,11 @@ static char *type_string(u8 bmAttributes)
123#define valid_bit cpu_to_le32(BIT(VALID_BIT)) 123#define valid_bit cpu_to_le32(BIT(VALID_BIT))
124#define dma_done_ie cpu_to_le32(BIT(DMA_DONE_INTERRUPT_ENABLE)) 124#define dma_done_ie cpu_to_le32(BIT(DMA_DONE_INTERRUPT_ENABLE))
125 125
126static void ep_clear_seqnum(struct net2280_ep *ep);
127static void stop_activity(struct net2280 *dev,
128 struct usb_gadget_driver *driver);
129static void ep0_start(struct net2280 *dev);
130
126/*-------------------------------------------------------------------------*/ 131/*-------------------------------------------------------------------------*/
127static inline void enable_pciirqenb(struct net2280_ep *ep) 132static inline void enable_pciirqenb(struct net2280_ep *ep)
128{ 133{
@@ -142,7 +147,9 @@ net2280_enable(struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc)
142{ 147{
143 struct net2280 *dev; 148 struct net2280 *dev;
144 struct net2280_ep *ep; 149 struct net2280_ep *ep;
145 u32 max, tmp; 150 u32 max;
151 u32 tmp = 0;
152 u32 type;
146 unsigned long flags; 153 unsigned long flags;
147 static const u32 ep_key[9] = { 1, 0, 1, 0, 1, 1, 0, 1, 0 }; 154 static const u32 ep_key[9] = { 1, 0, 1, 0, 1, 1, 0, 1, 0 };
148 int ret = 0; 155 int ret = 0;
@@ -198,15 +205,29 @@ net2280_enable(struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc)
198 205
199 /* set type, direction, address; reset fifo counters */ 206 /* set type, direction, address; reset fifo counters */
200 writel(BIT(FIFO_FLUSH), &ep->regs->ep_stat); 207 writel(BIT(FIFO_FLUSH), &ep->regs->ep_stat);
201 tmp = (desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK); 208
202 if (tmp == USB_ENDPOINT_XFER_INT) { 209 if ((dev->quirks & PLX_SUPERSPEED) && dev->enhanced_mode) {
210 tmp = readl(&ep->cfg->ep_cfg);
211 /* If USB ep number doesn't match hardware ep number */
212 if ((tmp & 0xf) != usb_endpoint_num(desc)) {
213 ret = -EINVAL;
214 spin_unlock_irqrestore(&dev->lock, flags);
215 goto print_err;
216 }
217 if (ep->is_in)
218 tmp &= ~USB3380_EP_CFG_MASK_IN;
219 else
220 tmp &= ~USB3380_EP_CFG_MASK_OUT;
221 }
222 type = (desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK);
223 if (type == USB_ENDPOINT_XFER_INT) {
203 /* erratum 0105 workaround prevents hs NYET */ 224 /* erratum 0105 workaround prevents hs NYET */
204 if (dev->chiprev == 0100 && 225 if (dev->chiprev == 0100 &&
205 dev->gadget.speed == USB_SPEED_HIGH && 226 dev->gadget.speed == USB_SPEED_HIGH &&
206 !(desc->bEndpointAddress & USB_DIR_IN)) 227 !(desc->bEndpointAddress & USB_DIR_IN))
207 writel(BIT(CLEAR_NAK_OUT_PACKETS_MODE), 228 writel(BIT(CLEAR_NAK_OUT_PACKETS_MODE),
208 &ep->regs->ep_rsp); 229 &ep->regs->ep_rsp);
209 } else if (tmp == USB_ENDPOINT_XFER_BULK) { 230 } else if (type == USB_ENDPOINT_XFER_BULK) {
210 /* catch some particularly blatant driver bugs */ 231 /* catch some particularly blatant driver bugs */
211 if ((dev->gadget.speed == USB_SPEED_SUPER && max != 1024) || 232 if ((dev->gadget.speed == USB_SPEED_SUPER && max != 1024) ||
212 (dev->gadget.speed == USB_SPEED_HIGH && max != 512) || 233 (dev->gadget.speed == USB_SPEED_HIGH && max != 512) ||
@@ -216,10 +237,10 @@ net2280_enable(struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc)
216 goto print_err; 237 goto print_err;
217 } 238 }
218 } 239 }
219 ep->is_iso = (tmp == USB_ENDPOINT_XFER_ISOC); 240 ep->is_iso = (type == USB_ENDPOINT_XFER_ISOC);
220 /* Enable this endpoint */ 241 /* Enable this endpoint */
221 if (dev->quirks & PLX_LEGACY) { 242 if (dev->quirks & PLX_LEGACY) {
222 tmp <<= ENDPOINT_TYPE; 243 tmp |= type << ENDPOINT_TYPE;
223 tmp |= desc->bEndpointAddress; 244 tmp |= desc->bEndpointAddress;
224 /* default full fifo lines */ 245 /* default full fifo lines */
225 tmp |= (4 << ENDPOINT_BYTE_COUNT); 246 tmp |= (4 << ENDPOINT_BYTE_COUNT);
@@ -228,17 +249,17 @@ net2280_enable(struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc)
228 } else { 249 } else {
229 /* In Legacy mode, only OUT endpoints are used */ 250 /* In Legacy mode, only OUT endpoints are used */
230 if (dev->enhanced_mode && ep->is_in) { 251 if (dev->enhanced_mode && ep->is_in) {
231 tmp <<= IN_ENDPOINT_TYPE; 252 tmp |= type << IN_ENDPOINT_TYPE;
232 tmp |= BIT(IN_ENDPOINT_ENABLE); 253 tmp |= BIT(IN_ENDPOINT_ENABLE);
233 /* Not applicable to Legacy */
234 tmp |= BIT(ENDPOINT_DIRECTION);
235 } else { 254 } else {
236 tmp <<= OUT_ENDPOINT_TYPE; 255 tmp |= type << OUT_ENDPOINT_TYPE;
237 tmp |= BIT(OUT_ENDPOINT_ENABLE); 256 tmp |= BIT(OUT_ENDPOINT_ENABLE);
238 tmp |= (ep->is_in << ENDPOINT_DIRECTION); 257 tmp |= (ep->is_in << ENDPOINT_DIRECTION);
239 } 258 }
240 259
241 tmp |= usb_endpoint_num(desc); 260 tmp |= (4 << ENDPOINT_BYTE_COUNT);
261 if (!dev->enhanced_mode)
262 tmp |= usb_endpoint_num(desc);
242 tmp |= (ep->ep.maxburst << MAX_BURST_SIZE); 263 tmp |= (ep->ep.maxburst << MAX_BURST_SIZE);
243 } 264 }
244 265
@@ -256,6 +277,8 @@ net2280_enable(struct usb_ep *_ep, const struct usb_endpoint_descriptor *desc)
256 BIT(CLEAR_NAK_OUT_PACKETS_MODE), &ep->regs->ep_rsp); 277 BIT(CLEAR_NAK_OUT_PACKETS_MODE), &ep->regs->ep_rsp);
257 } 278 }
258 279
280 if (dev->quirks & PLX_SUPERSPEED)
281 ep_clear_seqnum(ep);
259 writel(tmp, &ep->cfg->ep_cfg); 282 writel(tmp, &ep->cfg->ep_cfg);
260 283
261 /* enable irqs */ 284 /* enable irqs */
@@ -441,6 +464,13 @@ static void ep_reset_338x(struct net2280_regs __iomem *regs,
441 BIT(DATA_PACKET_TRANSMITTED_INTERRUPT) | 464 BIT(DATA_PACKET_TRANSMITTED_INTERRUPT) |
442 BIT(DATA_OUT_PING_TOKEN_INTERRUPT) | 465 BIT(DATA_OUT_PING_TOKEN_INTERRUPT) |
443 BIT(DATA_IN_TOKEN_INTERRUPT), &ep->regs->ep_stat); 466 BIT(DATA_IN_TOKEN_INTERRUPT), &ep->regs->ep_stat);
467
468 tmp = readl(&ep->cfg->ep_cfg);
469 if (ep->is_in)
470 tmp &= ~USB3380_EP_CFG_MASK_IN;
471 else
472 tmp &= ~USB3380_EP_CFG_MASK_OUT;
473 writel(tmp, &ep->cfg->ep_cfg);
444} 474}
445 475
446static void nuke(struct net2280_ep *); 476static void nuke(struct net2280_ep *);
@@ -1468,11 +1498,14 @@ static int net2280_pullup(struct usb_gadget *_gadget, int is_on)
1468 spin_lock_irqsave(&dev->lock, flags); 1498 spin_lock_irqsave(&dev->lock, flags);
1469 tmp = readl(&dev->usb->usbctl); 1499 tmp = readl(&dev->usb->usbctl);
1470 dev->softconnect = (is_on != 0); 1500 dev->softconnect = (is_on != 0);
1471 if (is_on) 1501 if (is_on) {
1472 tmp |= BIT(USB_DETECT_ENABLE); 1502 ep0_start(dev);
1473 else 1503 writel(tmp | BIT(USB_DETECT_ENABLE), &dev->usb->usbctl);
1474 tmp &= ~BIT(USB_DETECT_ENABLE); 1504 } else {
1475 writel(tmp, &dev->usb->usbctl); 1505 writel(tmp & ~BIT(USB_DETECT_ENABLE), &dev->usb->usbctl);
1506 stop_activity(dev, dev->driver);
1507 }
1508
1476 spin_unlock_irqrestore(&dev->lock, flags); 1509 spin_unlock_irqrestore(&dev->lock, flags);
1477 1510
1478 return 0; 1511 return 0;
@@ -1860,8 +1893,8 @@ static void defect7374_enable_data_eps_zero(struct net2280 *dev)
1860 tmp = ((0 << ENDPOINT_NUMBER) | BIT(ENDPOINT_DIRECTION) | 1893 tmp = ((0 << ENDPOINT_NUMBER) | BIT(ENDPOINT_DIRECTION) |
1861 (2 << OUT_ENDPOINT_TYPE) | (2 << IN_ENDPOINT_TYPE) | 1894 (2 << OUT_ENDPOINT_TYPE) | (2 << IN_ENDPOINT_TYPE) |
1862 ((dev->enhanced_mode) ? 1895 ((dev->enhanced_mode) ?
1863 BIT(OUT_ENDPOINT_ENABLE) : BIT(ENDPOINT_ENABLE)) | 1896 BIT(OUT_ENDPOINT_ENABLE) | BIT(IN_ENDPOINT_ENABLE) :
1864 BIT(IN_ENDPOINT_ENABLE)); 1897 BIT(ENDPOINT_ENABLE)));
1865 1898
1866 for (i = 1; i < 5; i++) 1899 for (i = 1; i < 5; i++)
1867 writel(tmp, &dev->ep[i].cfg->ep_cfg); 1900 writel(tmp, &dev->ep[i].cfg->ep_cfg);
@@ -1975,9 +2008,15 @@ static void usb_reset_338x(struct net2280 *dev)
1975 /* clear old dma and irq state */ 2008 /* clear old dma and irq state */
1976 for (tmp = 0; tmp < 4; tmp++) { 2009 for (tmp = 0; tmp < 4; tmp++) {
1977 struct net2280_ep *ep = &dev->ep[tmp + 1]; 2010 struct net2280_ep *ep = &dev->ep[tmp + 1];
2011 struct net2280_dma_regs __iomem *dma;
1978 2012
1979 if (ep->dma) 2013 if (ep->dma) {
1980 abort_dma(ep); 2014 abort_dma(ep);
2015 } else {
2016 dma = &dev->dma[tmp];
2017 writel(BIT(DMA_ABORT), &dma->dmastat);
2018 writel(0, &dma->dmactl);
2019 }
1981 } 2020 }
1982 2021
1983 writel(~0, &dev->regs->irqstat0), writel(~0, &dev->regs->irqstat1); 2022 writel(~0, &dev->regs->irqstat0), writel(~0, &dev->regs->irqstat1);
@@ -2065,6 +2104,12 @@ static void usb_reinit_338x(struct net2280 *dev)
2065 2104
2066 if (dev->enhanced_mode) { 2105 if (dev->enhanced_mode) {
2067 ep->cfg = &dev->epregs[ne[i]]; 2106 ep->cfg = &dev->epregs[ne[i]];
2107 /*
2108 * Set USB endpoint number, hardware allows same number
2109 * in both directions.
2110 */
2111 if (i > 0 && i < 5)
2112 writel(ne[i], &ep->cfg->ep_cfg);
2068 ep->regs = (struct net2280_ep_regs __iomem *) 2113 ep->regs = (struct net2280_ep_regs __iomem *)
2069 (((void __iomem *)&dev->epregs[ne[i]]) + 2114 (((void __iomem *)&dev->epregs[ne[i]]) +
2070 ep_reg_addr[i]); 2115 ep_reg_addr[i]);
@@ -2874,6 +2919,26 @@ next_endpoints3:
2874 return; 2919 return;
2875} 2920}
2876 2921
2922static void usb338x_handle_ep_intr(struct net2280 *dev, u32 stat0)
2923{
2924 u32 index;
2925 u32 bit;
2926
2927 for (index = 0; index < ARRAY_SIZE(ep_bit); index++) {
2928 bit = BIT(ep_bit[index]);
2929
2930 if (!stat0)
2931 break;
2932
2933 if (!(stat0 & bit))
2934 continue;
2935
2936 stat0 &= ~bit;
2937
2938 handle_ep_small(&dev->ep[index]);
2939 }
2940}
2941
2877static void handle_stat0_irqs(struct net2280 *dev, u32 stat) 2942static void handle_stat0_irqs(struct net2280 *dev, u32 stat)
2878{ 2943{
2879 struct net2280_ep *ep; 2944 struct net2280_ep *ep;
@@ -3098,20 +3163,31 @@ do_stall:
3098#undef w_length 3163#undef w_length
3099 3164
3100next_endpoints: 3165next_endpoints:
3101 /* endpoint data irq ? */ 3166 if ((dev->quirks & PLX_SUPERSPEED) && dev->enhanced_mode) {
3102 scratch = stat & 0x7f; 3167 u32 mask = (BIT(ENDPOINT_0_INTERRUPT) |
3103 stat &= ~0x7f; 3168 USB3380_IRQSTAT0_EP_INTR_MASK_IN |
3104 for (num = 0; scratch; num++) { 3169 USB3380_IRQSTAT0_EP_INTR_MASK_OUT);
3105 u32 t; 3170
3106 3171 if (stat & mask) {
3107 /* do this endpoint's FIFO and queue need tending? */ 3172 usb338x_handle_ep_intr(dev, stat & mask);
3108 t = BIT(num); 3173 stat &= ~mask;
3109 if ((scratch & t) == 0) 3174 }
3110 continue; 3175 } else {
3111 scratch ^= t; 3176 /* endpoint data irq ? */
3177 scratch = stat & 0x7f;
3178 stat &= ~0x7f;
3179 for (num = 0; scratch; num++) {
3180 u32 t;
3181
3182 /* do this endpoint's FIFO and queue need tending? */
3183 t = BIT(num);
3184 if ((scratch & t) == 0)
3185 continue;
3186 scratch ^= t;
3112 3187
3113 ep = &dev->ep[num]; 3188 ep = &dev->ep[num];
3114 handle_ep_small(ep); 3189 handle_ep_small(ep);
3190 }
3115 } 3191 }
3116 3192
3117 if (stat) 3193 if (stat)
diff --git a/drivers/usb/gadget/udc/s3c2410_udc.c b/drivers/usb/gadget/udc/s3c2410_udc.c
index b808951491cc..297957512662 100644
--- a/drivers/usb/gadget/udc/s3c2410_udc.c
+++ b/drivers/usb/gadget/udc/s3c2410_udc.c
@@ -92,40 +92,38 @@ static struct s3c2410_udc_mach_info *udc_info;
92 92
93static uint32_t s3c2410_ticks = 0; 93static uint32_t s3c2410_ticks = 0;
94 94
95static int dprintk(int level, const char *fmt, ...) 95__printf(2, 3)
96static void dprintk(int level, const char *fmt, ...)
96{ 97{
97 static char printk_buf[1024];
98 static long prevticks; 98 static long prevticks;
99 static int invocation; 99 static int invocation;
100 struct va_format vaf;
100 va_list args; 101 va_list args;
101 int len;
102 102
103 if (level > USB_S3C2410_DEBUG_LEVEL) 103 if (level > USB_S3C2410_DEBUG_LEVEL)
104 return 0; 104 return;
105
106 va_start(args, fmt);
107
108 vaf.fmt = fmt;
109 vaf.va = &args;
105 110
106 if (s3c2410_ticks != prevticks) { 111 if (s3c2410_ticks != prevticks) {
107 prevticks = s3c2410_ticks; 112 prevticks = s3c2410_ticks;
108 invocation = 0; 113 invocation = 0;
109 } 114 }
110 115
111 len = scnprintf(printk_buf, 116 pr_debug("%1lu.%02d USB: %pV", prevticks, invocation++, &vaf);
112 sizeof(printk_buf), "%1lu.%02d USB: ",
113 prevticks, invocation++);
114 117
115 va_start(args, fmt);
116 len = vscnprintf(printk_buf+len,
117 sizeof(printk_buf)-len, fmt, args);
118 va_end(args); 118 va_end(args);
119
120 pr_debug("%s", printk_buf);
121 return len;
122} 119}
123#else 120#else
124static int dprintk(int level, const char *fmt, ...) 121__printf(2, 3)
122static void dprintk(int level, const char *fmt, ...)
125{ 123{
126 return 0;
127} 124}
128#endif 125#endif
126
129static int s3c2410_udc_debugfs_seq_show(struct seq_file *m, void *p) 127static int s3c2410_udc_debugfs_seq_show(struct seq_file *m, void *p)
130{ 128{
131 u32 addr_reg, pwr_reg, ep_int_reg, usb_int_reg; 129 u32 addr_reg, pwr_reg, ep_int_reg, usb_int_reg;
diff --git a/drivers/usb/musb/am35x.c b/drivers/usb/musb/am35x.c
index 220fd4d3b41c..c41fe588d14d 100644
--- a/drivers/usb/musb/am35x.c
+++ b/drivers/usb/musb/am35x.c
@@ -438,11 +438,15 @@ static void am35x_read_fifo(struct musb_hw_ep *hw_ep, u16 len, u8 *dst)
438} 438}
439 439
440static const struct musb_platform_ops am35x_ops = { 440static const struct musb_platform_ops am35x_ops = {
441 .quirks = MUSB_INDEXED_EP, 441 .quirks = MUSB_DMA_INVENTRA | MUSB_INDEXED_EP,
442 .init = am35x_musb_init, 442 .init = am35x_musb_init,
443 .exit = am35x_musb_exit, 443 .exit = am35x_musb_exit,
444 444
445 .read_fifo = am35x_read_fifo, 445 .read_fifo = am35x_read_fifo,
446#ifdef CONFIG_USB_INVENTRA_DMA
447 .dma_init = musbhs_dma_controller_create,
448 .dma_exit = musbhs_dma_controller_destroy,
449#endif
446 .enable = am35x_musb_enable, 450 .enable = am35x_musb_enable,
447 .disable = am35x_musb_disable, 451 .disable = am35x_musb_disable,
448 452
@@ -565,7 +569,7 @@ static int am35x_remove(struct platform_device *pdev)
565 return 0; 569 return 0;
566} 570}
567 571
568#ifdef CONFIG_PM 572#ifdef CONFIG_PM_SLEEP
569static int am35x_suspend(struct device *dev) 573static int am35x_suspend(struct device *dev)
570{ 574{
571 struct am35x_glue *glue = dev_get_drvdata(dev); 575 struct am35x_glue *glue = dev_get_drvdata(dev);
diff --git a/drivers/usb/musb/blackfin.c b/drivers/usb/musb/blackfin.c
index 6123b748d262..310238c6b5cd 100644
--- a/drivers/usb/musb/blackfin.c
+++ b/drivers/usb/musb/blackfin.c
@@ -465,6 +465,7 @@ static int bfin_musb_exit(struct musb *musb)
465} 465}
466 466
467static const struct musb_platform_ops bfin_ops = { 467static const struct musb_platform_ops bfin_ops = {
468 .quirks = MUSB_DMA_INVENTRA,
468 .init = bfin_musb_init, 469 .init = bfin_musb_init,
469 .exit = bfin_musb_exit, 470 .exit = bfin_musb_exit,
470 471
@@ -477,6 +478,10 @@ static const struct musb_platform_ops bfin_ops = {
477 .fifo_mode = 2, 478 .fifo_mode = 2,
478 .read_fifo = bfin_read_fifo, 479 .read_fifo = bfin_read_fifo,
479 .write_fifo = bfin_write_fifo, 480 .write_fifo = bfin_write_fifo,
481#ifdef CONFIG_USB_INVENTRA_DMA
482 .dma_init = musbhs_dma_controller_create,
483 .dma_exit = musbhs_dma_controller_destroy,
484#endif
480 .enable = bfin_musb_enable, 485 .enable = bfin_musb_enable,
481 .disable = bfin_musb_disable, 486 .disable = bfin_musb_disable,
482 487
diff --git a/drivers/usb/musb/cppi_dma.c b/drivers/usb/musb/cppi_dma.c
index 904fb85d85a6..cc134109b056 100644
--- a/drivers/usb/musb/cppi_dma.c
+++ b/drivers/usb/musb/cppi_dma.c
@@ -1297,7 +1297,8 @@ irqreturn_t cppi_interrupt(int irq, void *dev_id)
1297EXPORT_SYMBOL_GPL(cppi_interrupt); 1297EXPORT_SYMBOL_GPL(cppi_interrupt);
1298 1298
1299/* Instantiate a software object representing a DMA controller. */ 1299/* Instantiate a software object representing a DMA controller. */
1300struct dma_controller *dma_controller_create(struct musb *musb, void __iomem *mregs) 1300struct dma_controller *
1301cppi_dma_controller_create(struct musb *musb, void __iomem *mregs)
1301{ 1302{
1302 struct cppi *controller; 1303 struct cppi *controller;
1303 struct device *dev = musb->controller; 1304 struct device *dev = musb->controller;
@@ -1334,7 +1335,7 @@ struct dma_controller *dma_controller_create(struct musb *musb, void __iomem *mr
1334 if (irq > 0) { 1335 if (irq > 0) {
1335 if (request_irq(irq, cppi_interrupt, 0, "cppi-dma", musb)) { 1336 if (request_irq(irq, cppi_interrupt, 0, "cppi-dma", musb)) {
1336 dev_err(dev, "request_irq %d failed!\n", irq); 1337 dev_err(dev, "request_irq %d failed!\n", irq);
1337 dma_controller_destroy(&controller->controller); 1338 musb_dma_controller_destroy(&controller->controller);
1338 return NULL; 1339 return NULL;
1339 } 1340 }
1340 controller->irq = irq; 1341 controller->irq = irq;
@@ -1343,11 +1344,12 @@ struct dma_controller *dma_controller_create(struct musb *musb, void __iomem *mr
1343 cppi_controller_start(controller); 1344 cppi_controller_start(controller);
1344 return &controller->controller; 1345 return &controller->controller;
1345} 1346}
1347EXPORT_SYMBOL_GPL(cppi_dma_controller_create);
1346 1348
1347/* 1349/*
1348 * Destroy a previously-instantiated DMA controller. 1350 * Destroy a previously-instantiated DMA controller.
1349 */ 1351 */
1350void dma_controller_destroy(struct dma_controller *c) 1352void cppi_dma_controller_destroy(struct dma_controller *c)
1351{ 1353{
1352 struct cppi *cppi; 1354 struct cppi *cppi;
1353 1355
@@ -1363,6 +1365,7 @@ void dma_controller_destroy(struct dma_controller *c)
1363 1365
1364 kfree(cppi); 1366 kfree(cppi);
1365} 1367}
1368EXPORT_SYMBOL_GPL(cppi_dma_controller_destroy);
1366 1369
1367/* 1370/*
1368 * Context: controller irqlocked, endpoint selected 1371 * Context: controller irqlocked, endpoint selected
diff --git a/drivers/usb/musb/da8xx.c b/drivers/usb/musb/da8xx.c
index 9a9c82a4d35d..b03d3b867fca 100644
--- a/drivers/usb/musb/da8xx.c
+++ b/drivers/usb/musb/da8xx.c
@@ -458,11 +458,15 @@ static int da8xx_musb_exit(struct musb *musb)
458} 458}
459 459
460static const struct musb_platform_ops da8xx_ops = { 460static const struct musb_platform_ops da8xx_ops = {
461 .quirks = MUSB_INDEXED_EP, 461 .quirks = MUSB_DMA_CPPI | MUSB_INDEXED_EP,
462 .init = da8xx_musb_init, 462 .init = da8xx_musb_init,
463 .exit = da8xx_musb_exit, 463 .exit = da8xx_musb_exit,
464 464
465 .fifo_mode = 2, 465 .fifo_mode = 2,
466#ifdef CONFIG_USB_TI_CPPI_DMA
467 .dma_init = cppi_dma_controller_create,
468 .dma_exit = cppi_dma_controller_destroy,
469#endif
466 .enable = da8xx_musb_enable, 470 .enable = da8xx_musb_enable,
467 .disable = da8xx_musb_disable, 471 .disable = da8xx_musb_disable,
468 472
diff --git a/drivers/usb/musb/davinci.c b/drivers/usb/musb/davinci.c
index 3c1d9b211b51..cee61a51645e 100644
--- a/drivers/usb/musb/davinci.c
+++ b/drivers/usb/musb/davinci.c
@@ -284,7 +284,7 @@ static irqreturn_t davinci_musb_interrupt(int irq, void *__hci)
284 * mask, state, "vector", and EOI registers. 284 * mask, state, "vector", and EOI registers.
285 */ 285 */
286 cppi = container_of(musb->dma_controller, struct cppi, controller); 286 cppi = container_of(musb->dma_controller, struct cppi, controller);
287 if (is_cppi_enabled() && musb->dma_controller && !cppi->irq) 287 if (is_cppi_enabled(musb) && musb->dma_controller && !cppi->irq)
288 retval = cppi_interrupt(irq, __hci); 288 retval = cppi_interrupt(irq, __hci);
289 289
290 /* ack and handle non-CPPI interrupts */ 290 /* ack and handle non-CPPI interrupts */
@@ -491,9 +491,14 @@ static int davinci_musb_exit(struct musb *musb)
491} 491}
492 492
493static const struct musb_platform_ops davinci_ops = { 493static const struct musb_platform_ops davinci_ops = {
494 .quirks = MUSB_DMA_CPPI,
494 .init = davinci_musb_init, 495 .init = davinci_musb_init,
495 .exit = davinci_musb_exit, 496 .exit = davinci_musb_exit,
496 497
498#ifdef CONFIG_USB_TI_CPPI_DMA
499 .dma_init = cppi_dma_controller_create,
500 .dma_exit = cppi_dma_controller_destroy,
501#endif
497 .enable = davinci_musb_enable, 502 .enable = davinci_musb_enable,
498 .disable = davinci_musb_disable, 503 .disable = davinci_musb_disable,
499 504
diff --git a/drivers/usb/musb/jz4740.c b/drivers/usb/musb/jz4740.c
index bb7b26325a74..5e5a8fa005f8 100644
--- a/drivers/usb/musb/jz4740.c
+++ b/drivers/usb/musb/jz4740.c
@@ -105,8 +105,12 @@ static int jz4740_musb_exit(struct musb *musb)
105 return 0; 105 return 0;
106} 106}
107 107
108/*
109 * DMA has not been confirmed to work with CONFIG_USB_INVENTRA_DMA,
110 * so let's not set up the dma function pointers yet.
111 */
108static const struct musb_platform_ops jz4740_musb_ops = { 112static const struct musb_platform_ops jz4740_musb_ops = {
109 .quirks = MUSB_INDEXED_EP, 113 .quirks = MUSB_DMA_INVENTRA | MUSB_INDEXED_EP,
110 .fifo_mode = 2, 114 .fifo_mode = 2,
111 .init = jz4740_musb_init, 115 .init = jz4740_musb_init,
112 .exit = jz4740_musb_exit, 116 .exit = jz4740_musb_exit,
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
index 3789b08ef67b..d878aee404bf 100644
--- a/drivers/usb/musb/musb_core.c
+++ b/drivers/usb/musb/musb_core.c
@@ -251,6 +251,11 @@ static u32 musb_indexed_ep_offset(u8 epnum, u16 offset)
251 return 0x10 + offset; 251 return 0x10 + offset;
252} 252}
253 253
254static u32 musb_default_busctl_offset(u8 epnum, u16 offset)
255{
256 return 0x80 + (0x08 * epnum) + offset;
257}
258
254static u8 musb_default_readb(const void __iomem *addr, unsigned offset) 259static u8 musb_default_readb(const void __iomem *addr, unsigned offset)
255{ 260{
256 return __raw_readb(addr + offset); 261 return __raw_readb(addr + offset);
@@ -309,7 +314,7 @@ static void musb_default_write_fifo(struct musb_hw_ep *hw_ep, u16 len,
309 index += len & ~0x03; 314 index += len & ~0x03;
310 } 315 }
311 if (len & 0x02) { 316 if (len & 0x02) {
312 musb_writew(fifo, 0, *(u16 *)&src[index]); 317 __raw_writew(*(u16 *)&src[index], fifo);
313 index += 2; 318 index += 2;
314 } 319 }
315 } else { 320 } else {
@@ -319,7 +324,7 @@ static void musb_default_write_fifo(struct musb_hw_ep *hw_ep, u16 len,
319 } 324 }
320 } 325 }
321 if (len & 0x01) 326 if (len & 0x01)
322 musb_writeb(fifo, 0, src[index]); 327 __raw_writeb(src[index], fifo);
323 } else { 328 } else {
324 /* byte aligned */ 329 /* byte aligned */
325 iowrite8_rep(fifo, src, len); 330 iowrite8_rep(fifo, src, len);
@@ -351,7 +356,7 @@ static void musb_default_read_fifo(struct musb_hw_ep *hw_ep, u16 len, u8 *dst)
351 index = len & ~0x03; 356 index = len & ~0x03;
352 } 357 }
353 if (len & 0x02) { 358 if (len & 0x02) {
354 *(u16 *)&dst[index] = musb_readw(fifo, 0); 359 *(u16 *)&dst[index] = __raw_readw(fifo);
355 index += 2; 360 index += 2;
356 } 361 }
357 } else { 362 } else {
@@ -361,7 +366,7 @@ static void musb_default_read_fifo(struct musb_hw_ep *hw_ep, u16 len, u8 *dst)
361 } 366 }
362 } 367 }
363 if (len & 0x01) 368 if (len & 0x01)
364 dst[index] = musb_readb(fifo, 0); 369 dst[index] = __raw_readb(fifo);
365 } else { 370 } else {
366 /* byte aligned */ 371 /* byte aligned */
367 ioread8_rep(fifo, dst, len); 372 ioread8_rep(fifo, dst, len);
@@ -389,6 +394,15 @@ EXPORT_SYMBOL_GPL(musb_readl);
389void (*musb_writel)(void __iomem *addr, unsigned offset, u32 data); 394void (*musb_writel)(void __iomem *addr, unsigned offset, u32 data);
390EXPORT_SYMBOL_GPL(musb_writel); 395EXPORT_SYMBOL_GPL(musb_writel);
391 396
397#ifndef CONFIG_MUSB_PIO_ONLY
398struct dma_controller *
399(*musb_dma_controller_create)(struct musb *musb, void __iomem *base);
400EXPORT_SYMBOL(musb_dma_controller_create);
401
402void (*musb_dma_controller_destroy)(struct dma_controller *c);
403EXPORT_SYMBOL(musb_dma_controller_destroy);
404#endif
405
392/* 406/*
393 * New style IO functions 407 * New style IO functions
394 */ 408 */
@@ -1535,7 +1549,6 @@ static int musb_core_init(u16 musb_type, struct musb *musb)
1535#endif 1549#endif
1536 1550
1537 hw_ep->regs = musb->io.ep_offset(i, 0) + mbase; 1551 hw_ep->regs = musb->io.ep_offset(i, 0) + mbase;
1538 hw_ep->target_regs = musb_read_target_reg_base(i, mbase);
1539 hw_ep->rx_reinit = 1; 1552 hw_ep->rx_reinit = 1;
1540 hw_ep->tx_reinit = 1; 1553 hw_ep->tx_reinit = 1;
1541 1554
@@ -1658,15 +1671,13 @@ void musb_dma_completion(struct musb *musb, u8 epnum, u8 transmit)
1658 /* called with controller lock already held */ 1671 /* called with controller lock already held */
1659 1672
1660 if (!epnum) { 1673 if (!epnum) {
1661#ifndef CONFIG_USB_TUSB_OMAP_DMA 1674 if (!is_cppi_enabled(musb)) {
1662 if (!is_cppi_enabled()) {
1663 /* endpoint 0 */ 1675 /* endpoint 0 */
1664 if (is_host_active(musb)) 1676 if (is_host_active(musb))
1665 musb_h_ep0_irq(musb); 1677 musb_h_ep0_irq(musb);
1666 else 1678 else
1667 musb_g_ep0_irq(musb); 1679 musb_g_ep0_irq(musb);
1668 } 1680 }
1669#endif
1670 } else { 1681 } else {
1671 /* endpoints 1..15 */ 1682 /* endpoints 1..15 */
1672 if (transmit) { 1683 if (transmit) {
@@ -2021,13 +2032,7 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
2021 if (musb->ops->quirks) 2032 if (musb->ops->quirks)
2022 musb->io.quirks = musb->ops->quirks; 2033 musb->io.quirks = musb->ops->quirks;
2023 2034
2024 /* At least tusb6010 has it's own offsets.. */ 2035 /* Set default ep access to indexed offset or flat offset ops */
2025 if (musb->ops->ep_offset)
2026 musb->io.ep_offset = musb->ops->ep_offset;
2027 if (musb->ops->ep_select)
2028 musb->io.ep_select = musb->ops->ep_select;
2029
2030 /* ..and some devices use indexed offset or flat offset */
2031 if (musb->io.quirks & MUSB_INDEXED_EP) { 2036 if (musb->io.quirks & MUSB_INDEXED_EP) {
2032 musb->io.ep_offset = musb_indexed_ep_offset; 2037 musb->io.ep_offset = musb_indexed_ep_offset;
2033 musb->io.ep_select = musb_indexed_ep_select; 2038 musb->io.ep_select = musb_indexed_ep_select;
@@ -2035,6 +2040,11 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
2035 musb->io.ep_offset = musb_flat_ep_offset; 2040 musb->io.ep_offset = musb_flat_ep_offset;
2036 musb->io.ep_select = musb_flat_ep_select; 2041 musb->io.ep_select = musb_flat_ep_select;
2037 } 2042 }
2043 /* And override them with platform specific ops if specified. */
2044 if (musb->ops->ep_offset)
2045 musb->io.ep_offset = musb->ops->ep_offset;
2046 if (musb->ops->ep_select)
2047 musb->io.ep_select = musb->ops->ep_select;
2038 2048
2039 if (musb->ops->fifo_mode) 2049 if (musb->ops->fifo_mode)
2040 fifo_mode = musb->ops->fifo_mode; 2050 fifo_mode = musb->ops->fifo_mode;
@@ -2046,6 +2056,11 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
2046 else 2056 else
2047 musb->io.fifo_offset = musb_default_fifo_offset; 2057 musb->io.fifo_offset = musb_default_fifo_offset;
2048 2058
2059 if (musb->ops->busctl_offset)
2060 musb->io.busctl_offset = musb->ops->busctl_offset;
2061 else
2062 musb->io.busctl_offset = musb_default_busctl_offset;
2063
2049 if (musb->ops->readb) 2064 if (musb->ops->readb)
2050 musb_readb = musb->ops->readb; 2065 musb_readb = musb->ops->readb;
2051 if (musb->ops->writeb) 2066 if (musb->ops->writeb)
@@ -2059,6 +2074,15 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
2059 if (musb->ops->writel) 2074 if (musb->ops->writel)
2060 musb_writel = musb->ops->writel; 2075 musb_writel = musb->ops->writel;
2061 2076
2077#ifndef CONFIG_MUSB_PIO_ONLY
2078 if (!musb->ops->dma_init || !musb->ops->dma_exit) {
2079 dev_err(dev, "DMA controller not set\n");
2080 goto fail2;
2081 }
2082 musb_dma_controller_create = musb->ops->dma_init;
2083 musb_dma_controller_destroy = musb->ops->dma_exit;
2084#endif
2085
2062 if (musb->ops->read_fifo) 2086 if (musb->ops->read_fifo)
2063 musb->io.read_fifo = musb->ops->read_fifo; 2087 musb->io.read_fifo = musb->ops->read_fifo;
2064 else 2088 else
@@ -2078,7 +2102,8 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
2078 pm_runtime_get_sync(musb->controller); 2102 pm_runtime_get_sync(musb->controller);
2079 2103
2080 if (use_dma && dev->dma_mask) { 2104 if (use_dma && dev->dma_mask) {
2081 musb->dma_controller = dma_controller_create(musb, musb->mregs); 2105 musb->dma_controller =
2106 musb_dma_controller_create(musb, musb->mregs);
2082 if (IS_ERR(musb->dma_controller)) { 2107 if (IS_ERR(musb->dma_controller)) {
2083 status = PTR_ERR(musb->dma_controller); 2108 status = PTR_ERR(musb->dma_controller);
2084 goto fail2_5; 2109 goto fail2_5;
@@ -2189,7 +2214,7 @@ fail3:
2189 cancel_delayed_work_sync(&musb->finish_resume_work); 2214 cancel_delayed_work_sync(&musb->finish_resume_work);
2190 cancel_delayed_work_sync(&musb->deassert_reset_work); 2215 cancel_delayed_work_sync(&musb->deassert_reset_work);
2191 if (musb->dma_controller) 2216 if (musb->dma_controller)
2192 dma_controller_destroy(musb->dma_controller); 2217 musb_dma_controller_destroy(musb->dma_controller);
2193fail2_5: 2218fail2_5:
2194 pm_runtime_put_sync(musb->controller); 2219 pm_runtime_put_sync(musb->controller);
2195 2220
@@ -2248,7 +2273,7 @@ static int musb_remove(struct platform_device *pdev)
2248 musb_shutdown(pdev); 2273 musb_shutdown(pdev);
2249 2274
2250 if (musb->dma_controller) 2275 if (musb->dma_controller)
2251 dma_controller_destroy(musb->dma_controller); 2276 musb_dma_controller_destroy(musb->dma_controller);
2252 2277
2253 cancel_work_sync(&musb->irq_work); 2278 cancel_work_sync(&musb->irq_work);
2254 cancel_delayed_work_sync(&musb->finish_resume_work); 2279 cancel_delayed_work_sync(&musb->finish_resume_work);
@@ -2316,18 +2341,18 @@ static void musb_save_context(struct musb *musb)
2316 musb_readb(epio, MUSB_RXINTERVAL); 2341 musb_readb(epio, MUSB_RXINTERVAL);
2317 2342
2318 musb->context.index_regs[i].txfunaddr = 2343 musb->context.index_regs[i].txfunaddr =
2319 musb_read_txfunaddr(musb_base, i); 2344 musb_read_txfunaddr(musb, i);
2320 musb->context.index_regs[i].txhubaddr = 2345 musb->context.index_regs[i].txhubaddr =
2321 musb_read_txhubaddr(musb_base, i); 2346 musb_read_txhubaddr(musb, i);
2322 musb->context.index_regs[i].txhubport = 2347 musb->context.index_regs[i].txhubport =
2323 musb_read_txhubport(musb_base, i); 2348 musb_read_txhubport(musb, i);
2324 2349
2325 musb->context.index_regs[i].rxfunaddr = 2350 musb->context.index_regs[i].rxfunaddr =
2326 musb_read_rxfunaddr(musb_base, i); 2351 musb_read_rxfunaddr(musb, i);
2327 musb->context.index_regs[i].rxhubaddr = 2352 musb->context.index_regs[i].rxhubaddr =
2328 musb_read_rxhubaddr(musb_base, i); 2353 musb_read_rxhubaddr(musb, i);
2329 musb->context.index_regs[i].rxhubport = 2354 musb->context.index_regs[i].rxhubport =
2330 musb_read_rxhubport(musb_base, i); 2355 musb_read_rxhubport(musb, i);
2331 } 2356 }
2332} 2357}
2333 2358
@@ -2335,7 +2360,6 @@ static void musb_restore_context(struct musb *musb)
2335{ 2360{
2336 int i; 2361 int i;
2337 void __iomem *musb_base = musb->mregs; 2362 void __iomem *musb_base = musb->mregs;
2338 void __iomem *ep_target_regs;
2339 void __iomem *epio; 2363 void __iomem *epio;
2340 u8 power; 2364 u8 power;
2341 2365
@@ -2396,21 +2420,18 @@ static void musb_restore_context(struct musb *musb)
2396 musb_writeb(epio, MUSB_RXINTERVAL, 2420 musb_writeb(epio, MUSB_RXINTERVAL,
2397 2421
2398 musb->context.index_regs[i].rxinterval); 2422 musb->context.index_regs[i].rxinterval);
2399 musb_write_txfunaddr(musb_base, i, 2423 musb_write_txfunaddr(musb, i,
2400 musb->context.index_regs[i].txfunaddr); 2424 musb->context.index_regs[i].txfunaddr);
2401 musb_write_txhubaddr(musb_base, i, 2425 musb_write_txhubaddr(musb, i,
2402 musb->context.index_regs[i].txhubaddr); 2426 musb->context.index_regs[i].txhubaddr);
2403 musb_write_txhubport(musb_base, i, 2427 musb_write_txhubport(musb, i,
2404 musb->context.index_regs[i].txhubport); 2428 musb->context.index_regs[i].txhubport);
2405 2429
2406 ep_target_regs = 2430 musb_write_rxfunaddr(musb, i,
2407 musb_read_target_reg_base(i, musb_base);
2408
2409 musb_write_rxfunaddr(ep_target_regs,
2410 musb->context.index_regs[i].rxfunaddr); 2431 musb->context.index_regs[i].rxfunaddr);
2411 musb_write_rxhubaddr(ep_target_regs, 2432 musb_write_rxhubaddr(musb, i,
2412 musb->context.index_regs[i].rxhubaddr); 2433 musb->context.index_regs[i].rxhubaddr);
2413 musb_write_rxhubport(ep_target_regs, 2434 musb_write_rxhubport(musb, i,
2414 musb->context.index_regs[i].rxhubport); 2435 musb->context.index_regs[i].rxhubport);
2415 } 2436 }
2416 musb_writeb(musb_base, MUSB_INDEX, musb->context.index); 2437 musb_writeb(musb_base, MUSB_INDEX, musb->context.index);
diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h
index 3877249a8b2d..4b886d0f6bdf 100644
--- a/drivers/usb/musb/musb_core.h
+++ b/drivers/usb/musb/musb_core.h
@@ -67,7 +67,6 @@ struct musb_ep;
67#include "musb_dma.h" 67#include "musb_dma.h"
68 68
69#include "musb_io.h" 69#include "musb_io.h"
70#include "musb_regs.h"
71 70
72#include "musb_gadget.h" 71#include "musb_gadget.h"
73#include <linux/usb/hcd.h> 72#include <linux/usb/hcd.h>
@@ -157,6 +156,8 @@ struct musb_io;
157 * @writel: write 32 bits 156 * @writel: write 32 bits
158 * @read_fifo: reads the fifo 157 * @read_fifo: reads the fifo
159 * @write_fifo: writes to fifo 158 * @write_fifo: writes to fifo
159 * @dma_init: platform specific dma init function
160 * @dma_exit: platform specific dma exit function
160 * @init: turns on clocks, sets up platform-specific registers, etc 161 * @init: turns on clocks, sets up platform-specific registers, etc
161 * @exit: undoes @init 162 * @exit: undoes @init
162 * @set_mode: forcefully changes operating mode 163 * @set_mode: forcefully changes operating mode
@@ -165,6 +166,8 @@ struct musb_io;
165 * @vbus_status: returns vbus status if possible 166 * @vbus_status: returns vbus status if possible
166 * @set_vbus: forces vbus status 167 * @set_vbus: forces vbus status
167 * @adjust_channel_params: pre check for standard dma channel_program func 168 * @adjust_channel_params: pre check for standard dma channel_program func
169 * @pre_root_reset_end: called before the root usb port reset flag gets cleared
170 * @post_root_reset_end: called after the root usb port reset flag gets cleared
168 */ 171 */
169struct musb_platform_ops { 172struct musb_platform_ops {
170 173
@@ -187,6 +190,7 @@ struct musb_platform_ops {
187 void (*ep_select)(void __iomem *mbase, u8 epnum); 190 void (*ep_select)(void __iomem *mbase, u8 epnum);
188 u16 fifo_mode; 191 u16 fifo_mode;
189 u32 (*fifo_offset)(u8 epnum); 192 u32 (*fifo_offset)(u8 epnum);
193 u32 (*busctl_offset)(u8 epnum, u16 offset);
190 u8 (*readb)(const void __iomem *addr, unsigned offset); 194 u8 (*readb)(const void __iomem *addr, unsigned offset);
191 void (*writeb)(void __iomem *addr, unsigned offset, u8 data); 195 void (*writeb)(void __iomem *addr, unsigned offset, u8 data);
192 u16 (*readw)(const void __iomem *addr, unsigned offset); 196 u16 (*readw)(const void __iomem *addr, unsigned offset);
@@ -195,6 +199,9 @@ struct musb_platform_ops {
195 void (*writel)(void __iomem *addr, unsigned offset, u32 data); 199 void (*writel)(void __iomem *addr, unsigned offset, u32 data);
196 void (*read_fifo)(struct musb_hw_ep *hw_ep, u16 len, u8 *buf); 200 void (*read_fifo)(struct musb_hw_ep *hw_ep, u16 len, u8 *buf);
197 void (*write_fifo)(struct musb_hw_ep *hw_ep, u16 len, const u8 *buf); 201 void (*write_fifo)(struct musb_hw_ep *hw_ep, u16 len, const u8 *buf);
202 struct dma_controller *
203 (*dma_init) (struct musb *musb, void __iomem *base);
204 void (*dma_exit)(struct dma_controller *c);
198 int (*set_mode)(struct musb *musb, u8 mode); 205 int (*set_mode)(struct musb *musb, u8 mode);
199 void (*try_idle)(struct musb *musb, unsigned long timeout); 206 void (*try_idle)(struct musb *musb, unsigned long timeout);
200 int (*recover)(struct musb *musb); 207 int (*recover)(struct musb *musb);
@@ -205,6 +212,8 @@ struct musb_platform_ops {
205 int (*adjust_channel_params)(struct dma_channel *channel, 212 int (*adjust_channel_params)(struct dma_channel *channel,
206 u16 packet_sz, u8 *mode, 213 u16 packet_sz, u8 *mode,
207 dma_addr_t *dma_addr, u32 *len); 214 dma_addr_t *dma_addr, u32 *len);
215 void (*pre_root_reset_end)(struct musb *musb);
216 void (*post_root_reset_end)(struct musb *musb);
208}; 217};
209 218
210/* 219/*
@@ -241,8 +250,6 @@ struct musb_hw_ep {
241 void __iomem *fifo_sync_va; 250 void __iomem *fifo_sync_va;
242#endif 251#endif
243 252
244 void __iomem *target_regs;
245
246 /* currently scheduled peripheral endpoint */ 253 /* currently scheduled peripheral endpoint */
247 struct musb_qh *in_qh; 254 struct musb_qh *in_qh;
248 struct musb_qh *out_qh; 255 struct musb_qh *out_qh;
@@ -437,6 +444,9 @@ struct musb {
437#endif 444#endif
438}; 445};
439 446
447/* This must be included after struct musb is defined */
448#include "musb_regs.h"
449
440static inline struct musb *gadget_to_musb(struct usb_gadget *g) 450static inline struct musb *gadget_to_musb(struct usb_gadget *g)
441{ 451{
442 return container_of(g, struct musb, g); 452 return container_of(g, struct musb, g);
@@ -590,4 +600,16 @@ static inline int musb_platform_exit(struct musb *musb)
590 return musb->ops->exit(musb); 600 return musb->ops->exit(musb);
591} 601}
592 602
603static inline void musb_platform_pre_root_reset_end(struct musb *musb)
604{
605 if (musb->ops->pre_root_reset_end)
606 musb->ops->pre_root_reset_end(musb);
607}
608
609static inline void musb_platform_post_root_reset_end(struct musb *musb)
610{
611 if (musb->ops->post_root_reset_end)
612 musb->ops->post_root_reset_end(musb);
613}
614
593#endif /* __MUSB_CORE_H__ */ 615#endif /* __MUSB_CORE_H__ */
diff --git a/drivers/usb/musb/musb_cppi41.c b/drivers/usb/musb/musb_cppi41.c
index 8bd8c5e26921..4d1b44c232ee 100644
--- a/drivers/usb/musb/musb_cppi41.c
+++ b/drivers/usb/musb/musb_cppi41.c
@@ -678,7 +678,7 @@ err:
678 return ret; 678 return ret;
679} 679}
680 680
681void dma_controller_destroy(struct dma_controller *c) 681void cppi41_dma_controller_destroy(struct dma_controller *c)
682{ 682{
683 struct cppi41_dma_controller *controller = container_of(c, 683 struct cppi41_dma_controller *controller = container_of(c,
684 struct cppi41_dma_controller, controller); 684 struct cppi41_dma_controller, controller);
@@ -687,9 +687,10 @@ void dma_controller_destroy(struct dma_controller *c)
687 cppi41_dma_controller_stop(controller); 687 cppi41_dma_controller_stop(controller);
688 kfree(controller); 688 kfree(controller);
689} 689}
690EXPORT_SYMBOL_GPL(cppi41_dma_controller_destroy);
690 691
691struct dma_controller *dma_controller_create(struct musb *musb, 692struct dma_controller *
692 void __iomem *base) 693cppi41_dma_controller_create(struct musb *musb, void __iomem *base)
693{ 694{
694 struct cppi41_dma_controller *controller; 695 struct cppi41_dma_controller *controller;
695 int ret = 0; 696 int ret = 0;
@@ -726,3 +727,4 @@ kzalloc_fail:
726 return ERR_PTR(ret); 727 return ERR_PTR(ret);
727 return NULL; 728 return NULL;
728} 729}
730EXPORT_SYMBOL_GPL(cppi41_dma_controller_create);
diff --git a/drivers/usb/musb/musb_debugfs.c b/drivers/usb/musb/musb_debugfs.c
index 78a283e9ce40..9b22d946c089 100644
--- a/drivers/usb/musb/musb_debugfs.c
+++ b/drivers/usb/musb/musb_debugfs.c
@@ -191,9 +191,16 @@ static ssize_t musb_test_mode_write(struct file *file,
191{ 191{
192 struct seq_file *s = file->private_data; 192 struct seq_file *s = file->private_data;
193 struct musb *musb = s->private; 193 struct musb *musb = s->private;
194 u8 test = 0; 194 u8 test;
195 char buf[18]; 195 char buf[18];
196 196
197 test = musb_readb(musb->mregs, MUSB_TESTMODE);
198 if (test) {
199 dev_err(musb->controller, "Error: test mode is already set. "
200 "Please do USB Bus Reset to start a new test.\n");
201 return count;
202 }
203
197 memset(buf, 0x00, sizeof(buf)); 204 memset(buf, 0x00, sizeof(buf));
198 205
199 if (copy_from_user(buf, ubuf, min_t(size_t, sizeof(buf) - 1, count))) 206 if (copy_from_user(buf, ubuf, min_t(size_t, sizeof(buf) - 1, count)))
@@ -238,6 +245,90 @@ static const struct file_operations musb_test_mode_fops = {
238 .release = single_release, 245 .release = single_release,
239}; 246};
240 247
248static int musb_softconnect_show(struct seq_file *s, void *unused)
249{
250 struct musb *musb = s->private;
251 u8 reg;
252 int connect;
253
254 switch (musb->xceiv->otg->state) {
255 case OTG_STATE_A_HOST:
256 case OTG_STATE_A_WAIT_BCON:
257 reg = musb_readb(musb->mregs, MUSB_DEVCTL);
258 connect = reg & MUSB_DEVCTL_SESSION ? 1 : 0;
259 break;
260 default:
261 connect = -1;
262 }
263
264 seq_printf(s, "%d\n", connect);
265
266 return 0;
267}
268
269static int musb_softconnect_open(struct inode *inode, struct file *file)
270{
271 return single_open(file, musb_softconnect_show, inode->i_private);
272}
273
274static ssize_t musb_softconnect_write(struct file *file,
275 const char __user *ubuf, size_t count, loff_t *ppos)
276{
277 struct seq_file *s = file->private_data;
278 struct musb *musb = s->private;
279 char buf[2];
280 u8 reg;
281
282 memset(buf, 0x00, sizeof(buf));
283
284 if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count)))
285 return -EFAULT;
286
287 if (!strncmp(buf, "0", 1)) {
288 switch (musb->xceiv->otg->state) {
289 case OTG_STATE_A_HOST:
290 musb_root_disconnect(musb);
291 reg = musb_readb(musb->mregs, MUSB_DEVCTL);
292 reg &= ~MUSB_DEVCTL_SESSION;
293 musb_writeb(musb->mregs, MUSB_DEVCTL, reg);
294 break;
295 default:
296 break;
297 }
298 } else if (!strncmp(buf, "1", 1)) {
299 switch (musb->xceiv->otg->state) {
300 case OTG_STATE_A_WAIT_BCON:
301 /*
302 * musb_save_context() called in musb_runtime_suspend()
303 * might cache devctl with SESSION bit cleared during
304 * soft-disconnect, so specifically set SESSION bit
305 * here to preserve it for musb_runtime_resume().
306 */
307 musb->context.devctl |= MUSB_DEVCTL_SESSION;
308 reg = musb_readb(musb->mregs, MUSB_DEVCTL);
309 reg |= MUSB_DEVCTL_SESSION;
310 musb_writeb(musb->mregs, MUSB_DEVCTL, reg);
311 break;
312 default:
313 break;
314 }
315 }
316
317 return count;
318}
319
320/*
321 * In host mode, connect/disconnect the bus without physically
322 * remove the devices.
323 */
324static const struct file_operations musb_softconnect_fops = {
325 .open = musb_softconnect_open,
326 .write = musb_softconnect_write,
327 .read = seq_read,
328 .llseek = seq_lseek,
329 .release = single_release,
330};
331
241int musb_init_debugfs(struct musb *musb) 332int musb_init_debugfs(struct musb *musb)
242{ 333{
243 struct dentry *root; 334 struct dentry *root;
@@ -264,6 +355,13 @@ int musb_init_debugfs(struct musb *musb)
264 goto err1; 355 goto err1;
265 } 356 }
266 357
358 file = debugfs_create_file("softconnect", S_IRUGO | S_IWUSR,
359 root, musb, &musb_softconnect_fops);
360 if (!file) {
361 ret = -ENOMEM;
362 goto err1;
363 }
364
267 musb->debugfs_root = root; 365 musb->debugfs_root = root;
268 366
269 return 0; 367 return 0;
diff --git a/drivers/usb/musb/musb_dma.h b/drivers/usb/musb/musb_dma.h
index 1d44faa86252..46357e183b4c 100644
--- a/drivers/usb/musb/musb_dma.h
+++ b/drivers/usb/musb/musb_dma.h
@@ -68,16 +68,41 @@ struct musb_hw_ep;
68#define is_dma_capable() (1) 68#define is_dma_capable() (1)
69#endif 69#endif
70 70
71#if defined(CONFIG_USB_TI_CPPI_DMA) || defined(CONFIG_USB_TI_CPPI41_DMA) 71#ifdef CONFIG_USB_UX500_DMA
72#define is_cppi_enabled() 1 72#define musb_dma_ux500(musb) (musb->io.quirks & MUSB_DMA_UX500)
73#else
74#define musb_dma_ux500(musb) 0
75#endif
76
77#ifdef CONFIG_USB_TI_CPPI41_DMA
78#define musb_dma_cppi41(musb) (musb->io.quirks & MUSB_DMA_CPPI41)
79#else
80#define musb_dma_cppi41(musb) 0
81#endif
82
83#ifdef CONFIG_USB_TI_CPPI_DMA
84#define musb_dma_cppi(musb) (musb->io.quirks & MUSB_DMA_CPPI)
73#else 85#else
74#define is_cppi_enabled() 0 86#define musb_dma_cppi(musb) 0
75#endif 87#endif
76 88
77#ifdef CONFIG_USB_TUSB_OMAP_DMA 89#ifdef CONFIG_USB_TUSB_OMAP_DMA
78#define tusb_dma_omap() 1 90#define tusb_dma_omap(musb) (musb->io.quirks & MUSB_DMA_TUSB_OMAP)
91#else
92#define tusb_dma_omap(musb) 0
93#endif
94
95#ifdef CONFIG_USB_INVENTRA_DMA
96#define musb_dma_inventra(musb) (musb->io.quirks & MUSB_DMA_INVENTRA)
79#else 97#else
80#define tusb_dma_omap() 0 98#define musb_dma_inventra(musb) 0
99#endif
100
101#if defined(CONFIG_USB_TI_CPPI_DMA) || defined(CONFIG_USB_TI_CPPI41_DMA)
102#define is_cppi_enabled(musb) \
103 (musb_dma_cppi(musb) || musb_dma_cppi41(musb))
104#else
105#define is_cppi_enabled(musb) 0
81#endif 106#endif
82 107
83/* Anomaly 05000456 - USB Receive Interrupt Is Not Generated in DMA Mode 1 108/* Anomaly 05000456 - USB Receive Interrupt Is Not Generated in DMA Mode 1
@@ -177,19 +202,41 @@ struct dma_controller {
177extern void musb_dma_completion(struct musb *musb, u8 epnum, u8 transmit); 202extern void musb_dma_completion(struct musb *musb, u8 epnum, u8 transmit);
178 203
179#ifdef CONFIG_MUSB_PIO_ONLY 204#ifdef CONFIG_MUSB_PIO_ONLY
180static inline struct dma_controller *dma_controller_create(struct musb *m, 205static inline struct dma_controller *
181 void __iomem *io) 206musb_dma_controller_create(struct musb *m, void __iomem *io)
182{ 207{
183 return NULL; 208 return NULL;
184} 209}
185 210
186static inline void dma_controller_destroy(struct dma_controller *d) { } 211static inline void musb_dma_controller_destroy(struct dma_controller *d) { }
187 212
188#else 213#else
189 214
190extern struct dma_controller *dma_controller_create(struct musb *, void __iomem *); 215extern struct dma_controller *
216(*musb_dma_controller_create)(struct musb *, void __iomem *);
191 217
192extern void dma_controller_destroy(struct dma_controller *); 218extern void (*musb_dma_controller_destroy)(struct dma_controller *);
193#endif 219#endif
194 220
221/* Platform specific DMA functions */
222extern struct dma_controller *
223musbhs_dma_controller_create(struct musb *musb, void __iomem *base);
224extern void musbhs_dma_controller_destroy(struct dma_controller *c);
225
226extern struct dma_controller *
227tusb_dma_controller_create(struct musb *musb, void __iomem *base);
228extern void tusb_dma_controller_destroy(struct dma_controller *c);
229
230extern struct dma_controller *
231cppi_dma_controller_create(struct musb *musb, void __iomem *base);
232extern void cppi_dma_controller_destroy(struct dma_controller *c);
233
234extern struct dma_controller *
235cppi41_dma_controller_create(struct musb *musb, void __iomem *base);
236extern void cppi41_dma_controller_destroy(struct dma_controller *c);
237
238extern struct dma_controller *
239ux500_dma_controller_create(struct musb *musb, void __iomem *base);
240extern void ux500_dma_controller_destroy(struct dma_controller *c);
241
195#endif /* __MUSB_DMA_H__ */ 242#endif /* __MUSB_DMA_H__ */
diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c
index 65d931a28a14..1334a3de31b8 100644
--- a/drivers/usb/musb/musb_dsps.c
+++ b/drivers/usb/musb/musb_dsps.c
@@ -634,10 +634,14 @@ static void dsps_read_fifo32(struct musb_hw_ep *hw_ep, u16 len, u8 *dst)
634} 634}
635 635
636static struct musb_platform_ops dsps_ops = { 636static struct musb_platform_ops dsps_ops = {
637 .quirks = MUSB_INDEXED_EP, 637 .quirks = MUSB_DMA_CPPI41 | MUSB_INDEXED_EP,
638 .init = dsps_musb_init, 638 .init = dsps_musb_init,
639 .exit = dsps_musb_exit, 639 .exit = dsps_musb_exit,
640 640
641#ifdef CONFIG_USB_TI_CPPI41_DMA
642 .dma_init = cppi41_dma_controller_create,
643 .dma_exit = cppi41_dma_controller_destroy,
644#endif
641 .enable = dsps_musb_enable, 645 .enable = dsps_musb_enable,
642 .disable = dsps_musb_disable, 646 .disable = dsps_musb_disable,
643 647
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c
index 4c481cd66c77..625d482f1a97 100644
--- a/drivers/usb/musb/musb_gadget.c
+++ b/drivers/usb/musb/musb_gadget.c
@@ -366,7 +366,7 @@ static void txstate(struct musb *musb, struct musb_request *req)
366 } 366 }
367 367
368#endif 368#endif
369 if (is_cppi_enabled()) { 369 if (is_cppi_enabled(musb)) {
370 /* program endpoint CSR first, then setup DMA */ 370 /* program endpoint CSR first, then setup DMA */
371 csr &= ~(MUSB_TXCSR_P_UNDERRUN | MUSB_TXCSR_TXPKTRDY); 371 csr &= ~(MUSB_TXCSR_P_UNDERRUN | MUSB_TXCSR_TXPKTRDY);
372 csr |= MUSB_TXCSR_DMAENAB | MUSB_TXCSR_DMAMODE | 372 csr |= MUSB_TXCSR_DMAENAB | MUSB_TXCSR_DMAMODE |
@@ -402,7 +402,7 @@ static void txstate(struct musb *musb, struct musb_request *req)
402 musb_writew(epio, MUSB_TXCSR, csr); 402 musb_writew(epio, MUSB_TXCSR, csr);
403 /* invariant: prequest->buf is non-null */ 403 /* invariant: prequest->buf is non-null */
404 } 404 }
405 } else if (tusb_dma_omap()) 405 } else if (tusb_dma_omap(musb))
406 use_dma = use_dma && c->channel_program( 406 use_dma = use_dma && c->channel_program(
407 musb_ep->dma, musb_ep->packet_sz, 407 musb_ep->dma, musb_ep->packet_sz,
408 request->zero, 408 request->zero,
@@ -489,6 +489,7 @@ void musb_g_tx(struct musb *musb, u8 epnum)
489 489
490 if (request) { 490 if (request) {
491 u8 is_dma = 0; 491 u8 is_dma = 0;
492 bool short_packet = false;
492 493
493 if (dma && (csr & MUSB_TXCSR_DMAENAB)) { 494 if (dma && (csr & MUSB_TXCSR_DMAENAB)) {
494 is_dma = 1; 495 is_dma = 1;
@@ -507,15 +508,18 @@ void musb_g_tx(struct musb *musb, u8 epnum)
507 * First, maybe a terminating short packet. Some DMA 508 * First, maybe a terminating short packet. Some DMA
508 * engines might handle this by themselves. 509 * engines might handle this by themselves.
509 */ 510 */
510 if ((request->zero && request->length 511 if ((request->zero && request->length)
511 && (request->length % musb_ep->packet_sz == 0) 512 && (request->length % musb_ep->packet_sz == 0)
512 && (request->actual == request->length)) 513 && (request->actual == request->length))
513#if defined(CONFIG_USB_INVENTRA_DMA) || defined(CONFIG_USB_UX500_DMA) 514 short_packet = true;
514 || (is_dma && (!dma->desired_mode || 515
516 if ((musb_dma_inventra(musb) || musb_dma_ux500(musb)) &&
517 (is_dma && (!dma->desired_mode ||
515 (request->actual & 518 (request->actual &
516 (musb_ep->packet_sz - 1)))) 519 (musb_ep->packet_sz - 1)))))
517#endif 520 short_packet = true;
518 ) { 521
522 if (short_packet) {
519 /* 523 /*
520 * On DMA completion, FIFO may not be 524 * On DMA completion, FIFO may not be
521 * available yet... 525 * available yet...
@@ -595,7 +599,7 @@ static void rxstate(struct musb *musb, struct musb_request *req)
595 return; 599 return;
596 } 600 }
597 601
598 if (is_cppi_enabled() && is_buffer_mapped(req)) { 602 if (is_cppi_enabled(musb) && is_buffer_mapped(req)) {
599 struct dma_controller *c = musb->dma_controller; 603 struct dma_controller *c = musb->dma_controller;
600 struct dma_channel *channel = musb_ep->dma; 604 struct dma_channel *channel = musb_ep->dma;
601 605
@@ -772,7 +776,7 @@ static void rxstate(struct musb *musb, struct musb_request *req)
772 fifo_count = min_t(unsigned, len, fifo_count); 776 fifo_count = min_t(unsigned, len, fifo_count);
773 777
774#ifdef CONFIG_USB_TUSB_OMAP_DMA 778#ifdef CONFIG_USB_TUSB_OMAP_DMA
775 if (tusb_dma_omap() && is_buffer_mapped(req)) { 779 if (tusb_dma_omap(musb) && is_buffer_mapped(req)) {
776 struct dma_controller *c = musb->dma_controller; 780 struct dma_controller *c = musb->dma_controller;
777 struct dma_channel *channel = musb_ep->dma; 781 struct dma_channel *channel = musb_ep->dma;
778 u32 dma_addr = request->dma + request->actual; 782 u32 dma_addr = request->dma + request->actual;
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c
index e1fb5d885c18..26c65e66cc0f 100644
--- a/drivers/usb/musb/musb_host.c
+++ b/drivers/usb/musb/musb_host.c
@@ -181,7 +181,7 @@ static inline void musb_h_tx_dma_start(struct musb_hw_ep *ep)
181 /* NOTE: no locks here; caller should lock and select EP */ 181 /* NOTE: no locks here; caller should lock and select EP */
182 txcsr = musb_readw(ep->regs, MUSB_TXCSR); 182 txcsr = musb_readw(ep->regs, MUSB_TXCSR);
183 txcsr |= MUSB_TXCSR_DMAENAB | MUSB_TXCSR_H_WZC_BITS; 183 txcsr |= MUSB_TXCSR_DMAENAB | MUSB_TXCSR_H_WZC_BITS;
184 if (is_cppi_enabled()) 184 if (is_cppi_enabled(ep->musb))
185 txcsr |= MUSB_TXCSR_DMAMODE; 185 txcsr |= MUSB_TXCSR_DMAMODE;
186 musb_writew(ep->regs, MUSB_TXCSR, txcsr); 186 musb_writew(ep->regs, MUSB_TXCSR, txcsr);
187} 187}
@@ -294,7 +294,7 @@ start:
294 294
295 if (!hw_ep->tx_channel) 295 if (!hw_ep->tx_channel)
296 musb_h_tx_start(hw_ep); 296 musb_h_tx_start(hw_ep);
297 else if (is_cppi_enabled() || tusb_dma_omap()) 297 else if (is_cppi_enabled(musb) || tusb_dma_omap(musb))
298 musb_h_tx_dma_start(hw_ep); 298 musb_h_tx_dma_start(hw_ep);
299 } 299 }
300} 300}
@@ -555,8 +555,9 @@ musb_host_packet_rx(struct musb *musb, struct urb *urb, u8 epnum, u8 iso_err)
555 * the busy/not-empty tests are basically paranoia. 555 * the busy/not-empty tests are basically paranoia.
556 */ 556 */
557static void 557static void
558musb_rx_reinit(struct musb *musb, struct musb_qh *qh, struct musb_hw_ep *ep) 558musb_rx_reinit(struct musb *musb, struct musb_qh *qh, u8 epnum)
559{ 559{
560 struct musb_hw_ep *ep = musb->endpoints + epnum;
560 u16 csr; 561 u16 csr;
561 562
562 /* NOTE: we know the "rx" fifo reinit never triggers for ep0. 563 /* NOTE: we know the "rx" fifo reinit never triggers for ep0.
@@ -594,10 +595,9 @@ musb_rx_reinit(struct musb *musb, struct musb_qh *qh, struct musb_hw_ep *ep)
594 595
595 /* target addr and (for multipoint) hub addr/port */ 596 /* target addr and (for multipoint) hub addr/port */
596 if (musb->is_multipoint) { 597 if (musb->is_multipoint) {
597 musb_write_rxfunaddr(ep->target_regs, qh->addr_reg); 598 musb_write_rxfunaddr(musb, epnum, qh->addr_reg);
598 musb_write_rxhubaddr(ep->target_regs, qh->h_addr_reg); 599 musb_write_rxhubaddr(musb, epnum, qh->h_addr_reg);
599 musb_write_rxhubport(ep->target_regs, qh->h_port_reg); 600 musb_write_rxhubport(musb, epnum, qh->h_port_reg);
600
601 } else 601 } else
602 musb_writeb(musb->mregs, MUSB_FADDR, qh->addr_reg); 602 musb_writeb(musb->mregs, MUSB_FADDR, qh->addr_reg);
603 603
@@ -617,23 +617,22 @@ musb_rx_reinit(struct musb *musb, struct musb_qh *qh, struct musb_hw_ep *ep)
617 ep->rx_reinit = 0; 617 ep->rx_reinit = 0;
618} 618}
619 619
620static bool musb_tx_dma_program(struct dma_controller *dma, 620static int musb_tx_dma_set_mode_mentor(struct dma_controller *dma,
621 struct musb_hw_ep *hw_ep, struct musb_qh *qh, 621 struct musb_hw_ep *hw_ep, struct musb_qh *qh,
622 struct urb *urb, u32 offset, u32 length) 622 struct urb *urb, u32 offset,
623 u32 *length, u8 *mode)
623{ 624{
624 struct dma_channel *channel = hw_ep->tx_channel; 625 struct dma_channel *channel = hw_ep->tx_channel;
625 void __iomem *epio = hw_ep->regs; 626 void __iomem *epio = hw_ep->regs;
626 u16 pkt_size = qh->maxpacket; 627 u16 pkt_size = qh->maxpacket;
627 u16 csr; 628 u16 csr;
628 u8 mode;
629 629
630#if defined(CONFIG_USB_INVENTRA_DMA) || defined(CONFIG_USB_UX500_DMA) 630 if (*length > channel->max_len)
631 if (length > channel->max_len) 631 *length = channel->max_len;
632 length = channel->max_len;
633 632
634 csr = musb_readw(epio, MUSB_TXCSR); 633 csr = musb_readw(epio, MUSB_TXCSR);
635 if (length > pkt_size) { 634 if (*length > pkt_size) {
636 mode = 1; 635 *mode = 1;
637 csr |= MUSB_TXCSR_DMAMODE | MUSB_TXCSR_DMAENAB; 636 csr |= MUSB_TXCSR_DMAMODE | MUSB_TXCSR_DMAENAB;
638 /* autoset shouldn't be set in high bandwidth */ 637 /* autoset shouldn't be set in high bandwidth */
639 /* 638 /*
@@ -649,15 +648,28 @@ static bool musb_tx_dma_program(struct dma_controller *dma,
649 can_bulk_split(hw_ep->musb, qh->type))) 648 can_bulk_split(hw_ep->musb, qh->type)))
650 csr |= MUSB_TXCSR_AUTOSET; 649 csr |= MUSB_TXCSR_AUTOSET;
651 } else { 650 } else {
652 mode = 0; 651 *mode = 0;
653 csr &= ~(MUSB_TXCSR_AUTOSET | MUSB_TXCSR_DMAMODE); 652 csr &= ~(MUSB_TXCSR_AUTOSET | MUSB_TXCSR_DMAMODE);
654 csr |= MUSB_TXCSR_DMAENAB; /* against programmer's guide */ 653 csr |= MUSB_TXCSR_DMAENAB; /* against programmer's guide */
655 } 654 }
656 channel->desired_mode = mode; 655 channel->desired_mode = mode;
657 musb_writew(epio, MUSB_TXCSR, csr); 656 musb_writew(epio, MUSB_TXCSR, csr);
658#else 657
659 if (!is_cppi_enabled() && !tusb_dma_omap()) 658 return 0;
660 return false; 659}
660
661static int musb_tx_dma_set_mode_cppi_tusb(struct dma_controller *dma,
662 struct musb_hw_ep *hw_ep,
663 struct musb_qh *qh,
664 struct urb *urb,
665 u32 offset,
666 u32 *length,
667 u8 *mode)
668{
669 struct dma_channel *channel = hw_ep->tx_channel;
670
671 if (!is_cppi_enabled(hw_ep->musb) && !tusb_dma_omap(hw_ep->musb))
672 return -ENODEV;
661 673
662 channel->actual_len = 0; 674 channel->actual_len = 0;
663 675
@@ -665,8 +677,28 @@ static bool musb_tx_dma_program(struct dma_controller *dma,
665 * TX uses "RNDIS" mode automatically but needs help 677 * TX uses "RNDIS" mode automatically but needs help
666 * to identify the zero-length-final-packet case. 678 * to identify the zero-length-final-packet case.
667 */ 679 */
668 mode = (urb->transfer_flags & URB_ZERO_PACKET) ? 1 : 0; 680 *mode = (urb->transfer_flags & URB_ZERO_PACKET) ? 1 : 0;
669#endif 681
682 return 0;
683}
684
685static bool musb_tx_dma_program(struct dma_controller *dma,
686 struct musb_hw_ep *hw_ep, struct musb_qh *qh,
687 struct urb *urb, u32 offset, u32 length)
688{
689 struct dma_channel *channel = hw_ep->tx_channel;
690 u16 pkt_size = qh->maxpacket;
691 u8 mode;
692 int res;
693
694 if (musb_dma_inventra(hw_ep->musb) || musb_dma_ux500(hw_ep->musb))
695 res = musb_tx_dma_set_mode_mentor(dma, hw_ep, qh, urb,
696 offset, &length, &mode);
697 else
698 res = musb_tx_dma_set_mode_cppi_tusb(dma, hw_ep, qh, urb,
699 offset, &length, &mode);
700 if (res)
701 return false;
670 702
671 qh->segsize = length; 703 qh->segsize = length;
672 704
@@ -678,6 +710,9 @@ static bool musb_tx_dma_program(struct dma_controller *dma,
678 710
679 if (!dma->channel_program(channel, pkt_size, mode, 711 if (!dma->channel_program(channel, pkt_size, mode,
680 urb->transfer_dma + offset, length)) { 712 urb->transfer_dma + offset, length)) {
713 void __iomem *epio = hw_ep->regs;
714 u16 csr;
715
681 dma->channel_release(channel); 716 dma->channel_release(channel);
682 hw_ep->tx_channel = NULL; 717 hw_ep->tx_channel = NULL;
683 718
@@ -801,9 +836,9 @@ static void musb_ep_program(struct musb *musb, u8 epnum,
801 836
802 /* target addr and (for multipoint) hub addr/port */ 837 /* target addr and (for multipoint) hub addr/port */
803 if (musb->is_multipoint) { 838 if (musb->is_multipoint) {
804 musb_write_txfunaddr(mbase, epnum, qh->addr_reg); 839 musb_write_txfunaddr(musb, epnum, qh->addr_reg);
805 musb_write_txhubaddr(mbase, epnum, qh->h_addr_reg); 840 musb_write_txhubaddr(musb, epnum, qh->h_addr_reg);
806 musb_write_txhubport(mbase, epnum, qh->h_port_reg); 841 musb_write_txhubport(musb, epnum, qh->h_port_reg);
807/* FIXME if !epnum, do the same for RX ... */ 842/* FIXME if !epnum, do the same for RX ... */
808 } else 843 } else
809 musb_writeb(mbase, MUSB_FADDR, qh->addr_reg); 844 musb_writeb(mbase, MUSB_FADDR, qh->addr_reg);
@@ -875,7 +910,7 @@ finish:
875 u16 csr; 910 u16 csr;
876 911
877 if (hw_ep->rx_reinit) { 912 if (hw_ep->rx_reinit) {
878 musb_rx_reinit(musb, qh, hw_ep); 913 musb_rx_reinit(musb, qh, epnum);
879 914
880 /* init new state: toggle and NYET, maybe DMA later */ 915 /* init new state: toggle and NYET, maybe DMA later */
881 if (usb_gettoggle(urb->dev, qh->epnum, 0)) 916 if (usb_gettoggle(urb->dev, qh->epnum, 0))
@@ -901,7 +936,7 @@ finish:
901 936
902 /* kick things off */ 937 /* kick things off */
903 938
904 if ((is_cppi_enabled() || tusb_dma_omap()) && dma_channel) { 939 if ((is_cppi_enabled(musb) || tusb_dma_omap(musb)) && dma_channel) {
905 /* Candidate for DMA */ 940 /* Candidate for DMA */
906 dma_channel->actual_len = 0L; 941 dma_channel->actual_len = 0L;
907 qh->segsize = len; 942 qh->segsize = len;
@@ -1441,7 +1476,7 @@ done:
1441 } else if ((usb_pipeisoc(pipe) || transfer_pending) && dma) { 1476 } else if ((usb_pipeisoc(pipe) || transfer_pending) && dma) {
1442 if (musb_tx_dma_program(musb->dma_controller, hw_ep, qh, urb, 1477 if (musb_tx_dma_program(musb->dma_controller, hw_ep, qh, urb,
1443 offset, length)) { 1478 offset, length)) {
1444 if (is_cppi_enabled() || tusb_dma_omap()) 1479 if (is_cppi_enabled(musb) || tusb_dma_omap(musb))
1445 musb_h_tx_dma_start(hw_ep); 1480 musb_h_tx_dma_start(hw_ep);
1446 return; 1481 return;
1447 } 1482 }
@@ -1498,9 +1533,47 @@ done:
1498 MUSB_TXCSR_H_WZC_BITS | MUSB_TXCSR_TXPKTRDY); 1533 MUSB_TXCSR_H_WZC_BITS | MUSB_TXCSR_TXPKTRDY);
1499} 1534}
1500 1535
1536#ifdef CONFIG_USB_TI_CPPI41_DMA
1537/* Seems to set up ISO for cppi41 and not advance len. See commit c57c41d */
1538static int musb_rx_dma_iso_cppi41(struct dma_controller *dma,
1539 struct musb_hw_ep *hw_ep,
1540 struct musb_qh *qh,
1541 struct urb *urb,
1542 size_t len)
1543{
1544 struct dma_channel *channel = hw_ep->tx_channel;
1545 void __iomem *epio = hw_ep->regs;
1546 dma_addr_t *buf;
1547 u32 length, res;
1548 u16 val;
1501 1549
1502#ifdef CONFIG_USB_INVENTRA_DMA 1550 buf = (void *)urb->iso_frame_desc[qh->iso_idx].offset +
1551 (u32)urb->transfer_dma;
1552
1553 length = urb->iso_frame_desc[qh->iso_idx].length;
1554
1555 val = musb_readw(epio, MUSB_RXCSR);
1556 val |= MUSB_RXCSR_DMAENAB;
1557 musb_writew(hw_ep->regs, MUSB_RXCSR, val);
1558
1559 res = dma->channel_program(channel, qh->maxpacket, 0,
1560 (u32)buf, length);
1561
1562 return res;
1563}
1564#else
1565static inline int musb_rx_dma_iso_cppi41(struct dma_controller *dma,
1566 struct musb_hw_ep *hw_ep,
1567 struct musb_qh *qh,
1568 struct urb *urb,
1569 size_t len)
1570{
1571 return false;
1572}
1573#endif
1503 1574
1575#if defined(CONFIG_USB_INVENTRA_DMA) || defined(CONFIG_USB_UX500_DMA) || \
1576 defined(CONFIG_USB_TI_CPPI41_DMA)
1504/* Host side RX (IN) using Mentor DMA works as follows: 1577/* Host side RX (IN) using Mentor DMA works as follows:
1505 submit_urb -> 1578 submit_urb ->
1506 - if queue was empty, ProgramEndpoint 1579 - if queue was empty, ProgramEndpoint
@@ -1535,7 +1608,194 @@ done:
1535 * thus be a great candidate for using mode 1 ... for all but the 1608 * thus be a great candidate for using mode 1 ... for all but the
1536 * last packet of one URB's transfer. 1609 * last packet of one URB's transfer.
1537 */ 1610 */
1611static int musb_rx_dma_inventra_cppi41(struct dma_controller *dma,
1612 struct musb_hw_ep *hw_ep,
1613 struct musb_qh *qh,
1614 struct urb *urb,
1615 size_t len)
1616{
1617 struct dma_channel *channel = hw_ep->rx_channel;
1618 void __iomem *epio = hw_ep->regs;
1619 u16 val;
1620 int pipe;
1621 bool done;
1622
1623 pipe = urb->pipe;
1624
1625 if (usb_pipeisoc(pipe)) {
1626 struct usb_iso_packet_descriptor *d;
1627
1628 d = urb->iso_frame_desc + qh->iso_idx;
1629 d->actual_length = len;
1630
1631 /* even if there was an error, we did the dma
1632 * for iso_frame_desc->length
1633 */
1634 if (d->status != -EILSEQ && d->status != -EOVERFLOW)
1635 d->status = 0;
1636
1637 if (++qh->iso_idx >= urb->number_of_packets) {
1638 done = true;
1639 } else {
1640 /* REVISIT: Why ignore return value here? */
1641 if (musb_dma_cppi41(hw_ep->musb))
1642 done = musb_rx_dma_iso_cppi41(dma, hw_ep, qh,
1643 urb, len);
1644 done = false;
1645 }
1646
1647 } else {
1648 /* done if urb buffer is full or short packet is recd */
1649 done = (urb->actual_length + len >=
1650 urb->transfer_buffer_length
1651 || channel->actual_len < qh->maxpacket
1652 || channel->rx_packet_done);
1653 }
1654
1655 /* send IN token for next packet, without AUTOREQ */
1656 if (!done) {
1657 val = musb_readw(epio, MUSB_RXCSR);
1658 val |= MUSB_RXCSR_H_REQPKT;
1659 musb_writew(epio, MUSB_RXCSR, MUSB_RXCSR_H_WZC_BITS | val);
1660 }
1661
1662 return done;
1663}
1664
1665/* Disadvantage of using mode 1:
1666 * It's basically usable only for mass storage class; essentially all
1667 * other protocols also terminate transfers on short packets.
1668 *
1669 * Details:
1670 * An extra IN token is sent at the end of the transfer (due to AUTOREQ)
1671 * If you try to use mode 1 for (transfer_buffer_length - 512), and try
1672 * to use the extra IN token to grab the last packet using mode 0, then
1673 * the problem is that you cannot be sure when the device will send the
1674 * last packet and RxPktRdy set. Sometimes the packet is recd too soon
1675 * such that it gets lost when RxCSR is re-set at the end of the mode 1
1676 * transfer, while sometimes it is recd just a little late so that if you
1677 * try to configure for mode 0 soon after the mode 1 transfer is
1678 * completed, you will find rxcount 0. Okay, so you might think why not
1679 * wait for an interrupt when the pkt is recd. Well, you won't get any!
1680 */
1681static int musb_rx_dma_in_inventra_cppi41(struct dma_controller *dma,
1682 struct musb_hw_ep *hw_ep,
1683 struct musb_qh *qh,
1684 struct urb *urb,
1685 size_t len,
1686 u8 iso_err)
1687{
1688 struct musb *musb = hw_ep->musb;
1689 void __iomem *epio = hw_ep->regs;
1690 struct dma_channel *channel = hw_ep->rx_channel;
1691 u16 rx_count, val;
1692 int length, pipe, done;
1693 dma_addr_t buf;
1694
1695 rx_count = musb_readw(epio, MUSB_RXCOUNT);
1696 pipe = urb->pipe;
1697
1698 if (usb_pipeisoc(pipe)) {
1699 int d_status = 0;
1700 struct usb_iso_packet_descriptor *d;
1701
1702 d = urb->iso_frame_desc + qh->iso_idx;
1703
1704 if (iso_err) {
1705 d_status = -EILSEQ;
1706 urb->error_count++;
1707 }
1708 if (rx_count > d->length) {
1709 if (d_status == 0) {
1710 d_status = -EOVERFLOW;
1711 urb->error_count++;
1712 }
1713 dev_dbg(musb->controller, "** OVERFLOW %d into %d\n",
1714 rx_count, d->length);
1715
1716 length = d->length;
1717 } else
1718 length = rx_count;
1719 d->status = d_status;
1720 buf = urb->transfer_dma + d->offset;
1721 } else {
1722 length = rx_count;
1723 buf = urb->transfer_dma + urb->actual_length;
1724 }
1538 1725
1726 channel->desired_mode = 0;
1727#ifdef USE_MODE1
1728 /* because of the issue below, mode 1 will
1729 * only rarely behave with correct semantics.
1730 */
1731 if ((urb->transfer_flags & URB_SHORT_NOT_OK)
1732 && (urb->transfer_buffer_length - urb->actual_length)
1733 > qh->maxpacket)
1734 channel->desired_mode = 1;
1735 if (rx_count < hw_ep->max_packet_sz_rx) {
1736 length = rx_count;
1737 channel->desired_mode = 0;
1738 } else {
1739 length = urb->transfer_buffer_length;
1740 }
1741#endif
1742
1743 /* See comments above on disadvantages of using mode 1 */
1744 val = musb_readw(epio, MUSB_RXCSR);
1745 val &= ~MUSB_RXCSR_H_REQPKT;
1746
1747 if (channel->desired_mode == 0)
1748 val &= ~MUSB_RXCSR_H_AUTOREQ;
1749 else
1750 val |= MUSB_RXCSR_H_AUTOREQ;
1751 val |= MUSB_RXCSR_DMAENAB;
1752
1753 /* autoclear shouldn't be set in high bandwidth */
1754 if (qh->hb_mult == 1)
1755 val |= MUSB_RXCSR_AUTOCLEAR;
1756
1757 musb_writew(epio, MUSB_RXCSR, MUSB_RXCSR_H_WZC_BITS | val);
1758
1759 /* REVISIT if when actual_length != 0,
1760 * transfer_buffer_length needs to be
1761 * adjusted first...
1762 */
1763 done = dma->channel_program(channel, qh->maxpacket,
1764 channel->desired_mode,
1765 buf, length);
1766
1767 if (!done) {
1768 dma->channel_release(channel);
1769 hw_ep->rx_channel = NULL;
1770 channel = NULL;
1771 val = musb_readw(epio, MUSB_RXCSR);
1772 val &= ~(MUSB_RXCSR_DMAENAB
1773 | MUSB_RXCSR_H_AUTOREQ
1774 | MUSB_RXCSR_AUTOCLEAR);
1775 musb_writew(epio, MUSB_RXCSR, val);
1776 }
1777
1778 return done;
1779}
1780#else
1781static inline int musb_rx_dma_inventra_cppi41(struct dma_controller *dma,
1782 struct musb_hw_ep *hw_ep,
1783 struct musb_qh *qh,
1784 struct urb *urb,
1785 size_t len)
1786{
1787 return false;
1788}
1789
1790static inline int musb_rx_dma_in_inventra_cppi41(struct dma_controller *dma,
1791 struct musb_hw_ep *hw_ep,
1792 struct musb_qh *qh,
1793 struct urb *urb,
1794 size_t len,
1795 u8 iso_err)
1796{
1797 return false;
1798}
1539#endif 1799#endif
1540 1800
1541/* 1801/*
@@ -1546,6 +1806,7 @@ void musb_host_rx(struct musb *musb, u8 epnum)
1546{ 1806{
1547 struct urb *urb; 1807 struct urb *urb;
1548 struct musb_hw_ep *hw_ep = musb->endpoints + epnum; 1808 struct musb_hw_ep *hw_ep = musb->endpoints + epnum;
1809 struct dma_controller *c = musb->dma_controller;
1549 void __iomem *epio = hw_ep->regs; 1810 void __iomem *epio = hw_ep->regs;
1550 struct musb_qh *qh = hw_ep->in_qh; 1811 struct musb_qh *qh = hw_ep->in_qh;
1551 size_t xfer_len; 1812 size_t xfer_len;
@@ -1661,9 +1922,8 @@ void musb_host_rx(struct musb *musb, u8 epnum)
1661 */ 1922 */
1662 1923
1663 /* FIXME this is _way_ too much in-line logic for Mentor DMA */ 1924 /* FIXME this is _way_ too much in-line logic for Mentor DMA */
1664 1925 if (!musb_dma_inventra(musb) && !musb_dma_ux500(musb) &&
1665#if !defined(CONFIG_USB_INVENTRA_DMA) && !defined(CONFIG_USB_UX500_DMA) 1926 (rx_csr & MUSB_RXCSR_H_REQPKT)) {
1666 if (rx_csr & MUSB_RXCSR_H_REQPKT) {
1667 /* REVISIT this happened for a while on some short reads... 1927 /* REVISIT this happened for a while on some short reads...
1668 * the cleanup still needs investigation... looks bad... 1928 * the cleanup still needs investigation... looks bad...
1669 * and also duplicates dma cleanup code above ... plus, 1929 * and also duplicates dma cleanup code above ... plus,
@@ -1684,7 +1944,7 @@ void musb_host_rx(struct musb *musb, u8 epnum)
1684 musb_writew(epio, MUSB_RXCSR, 1944 musb_writew(epio, MUSB_RXCSR,
1685 MUSB_RXCSR_H_WZC_BITS | rx_csr); 1945 MUSB_RXCSR_H_WZC_BITS | rx_csr);
1686 } 1946 }
1687#endif 1947
1688 if (dma && (rx_csr & MUSB_RXCSR_DMAENAB)) { 1948 if (dma && (rx_csr & MUSB_RXCSR_DMAENAB)) {
1689 xfer_len = dma->actual_len; 1949 xfer_len = dma->actual_len;
1690 1950
@@ -1694,67 +1954,18 @@ void musb_host_rx(struct musb *musb, u8 epnum)
1694 | MUSB_RXCSR_RXPKTRDY); 1954 | MUSB_RXCSR_RXPKTRDY);
1695 musb_writew(hw_ep->regs, MUSB_RXCSR, val); 1955 musb_writew(hw_ep->regs, MUSB_RXCSR, val);
1696 1956
1697#if defined(CONFIG_USB_INVENTRA_DMA) || defined(CONFIG_USB_UX500_DMA) || \ 1957 if (musb_dma_inventra(musb) || musb_dma_ux500(musb) ||
1698 defined(CONFIG_USB_TI_CPPI41_DMA) 1958 musb_dma_cppi41(musb)) {
1699 if (usb_pipeisoc(pipe)) { 1959 done = musb_rx_dma_inventra_cppi41(c, hw_ep, qh, urb, xfer_len);
1700 struct usb_iso_packet_descriptor *d; 1960 dev_dbg(hw_ep->musb->controller,
1701 1961 "ep %d dma %s, rxcsr %04x, rxcount %d\n",
1702 d = urb->iso_frame_desc + qh->iso_idx; 1962 epnum, done ? "off" : "reset",
1703 d->actual_length = xfer_len; 1963 musb_readw(epio, MUSB_RXCSR),
1704 1964 musb_readw(epio, MUSB_RXCOUNT));
1705 /* even if there was an error, we did the dma 1965 } else {
1706 * for iso_frame_desc->length 1966 done = true;
1707 */
1708 if (d->status != -EILSEQ && d->status != -EOVERFLOW)
1709 d->status = 0;
1710
1711 if (++qh->iso_idx >= urb->number_of_packets) {
1712 done = true;
1713 } else {
1714#if defined(CONFIG_USB_TI_CPPI41_DMA)
1715 struct dma_controller *c;
1716 dma_addr_t *buf;
1717 u32 length, ret;
1718
1719 c = musb->dma_controller;
1720 buf = (void *)
1721 urb->iso_frame_desc[qh->iso_idx].offset
1722 + (u32)urb->transfer_dma;
1723
1724 length =
1725 urb->iso_frame_desc[qh->iso_idx].length;
1726
1727 val |= MUSB_RXCSR_DMAENAB;
1728 musb_writew(hw_ep->regs, MUSB_RXCSR, val);
1729
1730 ret = c->channel_program(dma, qh->maxpacket,
1731 0, (u32) buf, length);
1732#endif
1733 done = false;
1734 }
1735
1736 } else {
1737 /* done if urb buffer is full or short packet is recd */
1738 done = (urb->actual_length + xfer_len >=
1739 urb->transfer_buffer_length
1740 || dma->actual_len < qh->maxpacket
1741 || dma->rx_packet_done);
1742 }
1743
1744 /* send IN token for next packet, without AUTOREQ */
1745 if (!done) {
1746 val |= MUSB_RXCSR_H_REQPKT;
1747 musb_writew(epio, MUSB_RXCSR,
1748 MUSB_RXCSR_H_WZC_BITS | val);
1749 } 1967 }
1750 1968
1751 dev_dbg(musb->controller, "ep %d dma %s, rxcsr %04x, rxcount %d\n", epnum,
1752 done ? "off" : "reset",
1753 musb_readw(epio, MUSB_RXCSR),
1754 musb_readw(epio, MUSB_RXCOUNT));
1755#else
1756 done = true;
1757#endif
1758 } else if (urb->status == -EINPROGRESS) { 1969 } else if (urb->status == -EINPROGRESS) {
1759 /* if no errors, be sure a packet is ready for unloading */ 1970 /* if no errors, be sure a packet is ready for unloading */
1760 if (unlikely(!(rx_csr & MUSB_RXCSR_RXPKTRDY))) { 1971 if (unlikely(!(rx_csr & MUSB_RXCSR_RXPKTRDY))) {
@@ -1772,126 +1983,24 @@ void musb_host_rx(struct musb *musb, u8 epnum)
1772 } 1983 }
1773 1984
1774 /* we are expecting IN packets */ 1985 /* we are expecting IN packets */
1775#if defined(CONFIG_USB_INVENTRA_DMA) || defined(CONFIG_USB_UX500_DMA) || \ 1986 if ((musb_dma_inventra(musb) || musb_dma_ux500(musb) ||
1776 defined(CONFIG_USB_TI_CPPI41_DMA) 1987 musb_dma_cppi41(musb)) && dma) {
1777 if (dma) { 1988 dev_dbg(hw_ep->musb->controller,
1778 struct dma_controller *c; 1989 "RX%d count %d, buffer 0x%llx len %d/%d\n",
1779 u16 rx_count; 1990 epnum, musb_readw(epio, MUSB_RXCOUNT),
1780 int ret, length; 1991 (unsigned long long) urb->transfer_dma
1781 dma_addr_t buf; 1992 + urb->actual_length,
1782 1993 qh->offset,
1783 rx_count = musb_readw(epio, MUSB_RXCOUNT); 1994 urb->transfer_buffer_length);
1784 1995
1785 dev_dbg(musb->controller, "RX%d count %d, buffer 0x%llx len %d/%d\n", 1996 done = musb_rx_dma_in_inventra_cppi41(c, hw_ep, qh,
1786 epnum, rx_count, 1997 urb, xfer_len,
1787 (unsigned long long) urb->transfer_dma 1998 iso_err);
1788 + urb->actual_length, 1999 if (done)
1789 qh->offset, 2000 goto finish;
1790 urb->transfer_buffer_length);
1791
1792 c = musb->dma_controller;
1793
1794 if (usb_pipeisoc(pipe)) {
1795 int d_status = 0;
1796 struct usb_iso_packet_descriptor *d;
1797
1798 d = urb->iso_frame_desc + qh->iso_idx;
1799
1800 if (iso_err) {
1801 d_status = -EILSEQ;
1802 urb->error_count++;
1803 }
1804 if (rx_count > d->length) {
1805 if (d_status == 0) {
1806 d_status = -EOVERFLOW;
1807 urb->error_count++;
1808 }
1809 dev_dbg(musb->controller, "** OVERFLOW %d into %d\n",\
1810 rx_count, d->length);
1811
1812 length = d->length;
1813 } else
1814 length = rx_count;
1815 d->status = d_status;
1816 buf = urb->transfer_dma + d->offset;
1817 } else {
1818 length = rx_count;
1819 buf = urb->transfer_dma +
1820 urb->actual_length;
1821 }
1822
1823 dma->desired_mode = 0;
1824#ifdef USE_MODE1
1825 /* because of the issue below, mode 1 will
1826 * only rarely behave with correct semantics.
1827 */
1828 if ((urb->transfer_flags &
1829 URB_SHORT_NOT_OK)
1830 && (urb->transfer_buffer_length -
1831 urb->actual_length)
1832 > qh->maxpacket)
1833 dma->desired_mode = 1;
1834 if (rx_count < hw_ep->max_packet_sz_rx) {
1835 length = rx_count;
1836 dma->desired_mode = 0;
1837 } else {
1838 length = urb->transfer_buffer_length;
1839 }
1840#endif
1841
1842/* Disadvantage of using mode 1:
1843 * It's basically usable only for mass storage class; essentially all
1844 * other protocols also terminate transfers on short packets.
1845 *
1846 * Details:
1847 * An extra IN token is sent at the end of the transfer (due to AUTOREQ)
1848 * If you try to use mode 1 for (transfer_buffer_length - 512), and try
1849 * to use the extra IN token to grab the last packet using mode 0, then
1850 * the problem is that you cannot be sure when the device will send the
1851 * last packet and RxPktRdy set. Sometimes the packet is recd too soon
1852 * such that it gets lost when RxCSR is re-set at the end of the mode 1
1853 * transfer, while sometimes it is recd just a little late so that if you
1854 * try to configure for mode 0 soon after the mode 1 transfer is
1855 * completed, you will find rxcount 0. Okay, so you might think why not
1856 * wait for an interrupt when the pkt is recd. Well, you won't get any!
1857 */
1858
1859 val = musb_readw(epio, MUSB_RXCSR);
1860 val &= ~MUSB_RXCSR_H_REQPKT;
1861
1862 if (dma->desired_mode == 0)
1863 val &= ~MUSB_RXCSR_H_AUTOREQ;
1864 else 2001 else
1865 val |= MUSB_RXCSR_H_AUTOREQ; 2002 dev_err(musb->controller, "error: rx_dma failed\n");
1866 val |= MUSB_RXCSR_DMAENAB;
1867
1868 /* autoclear shouldn't be set in high bandwidth */
1869 if (qh->hb_mult == 1)
1870 val |= MUSB_RXCSR_AUTOCLEAR;
1871
1872 musb_writew(epio, MUSB_RXCSR,
1873 MUSB_RXCSR_H_WZC_BITS | val);
1874
1875 /* REVISIT if when actual_length != 0,
1876 * transfer_buffer_length needs to be
1877 * adjusted first...
1878 */
1879 ret = c->channel_program(
1880 dma, qh->maxpacket,
1881 dma->desired_mode, buf, length);
1882
1883 if (!ret) {
1884 c->channel_release(dma);
1885 hw_ep->rx_channel = NULL;
1886 dma = NULL;
1887 val = musb_readw(epio, MUSB_RXCSR);
1888 val &= ~(MUSB_RXCSR_DMAENAB
1889 | MUSB_RXCSR_H_AUTOREQ
1890 | MUSB_RXCSR_AUTOCLEAR);
1891 musb_writew(epio, MUSB_RXCSR, val);
1892 }
1893 } 2003 }
1894#endif /* Mentor DMA */
1895 2004
1896 if (!dma) { 2005 if (!dma) {
1897 unsigned int received_len; 2006 unsigned int received_len;
diff --git a/drivers/usb/musb/musb_io.h b/drivers/usb/musb/musb_io.h
index 8a57a6f4b3a6..17a80ae20674 100644
--- a/drivers/usb/musb/musb_io.h
+++ b/drivers/usb/musb/musb_io.h
@@ -47,6 +47,7 @@
47 * @fifo_offset: platform specific function to get fifo offset 47 * @fifo_offset: platform specific function to get fifo offset
48 * @read_fifo: platform specific function to read fifo 48 * @read_fifo: platform specific function to read fifo
49 * @write_fifo: platform specific function to write fifo 49 * @write_fifo: platform specific function to write fifo
50 * @busctl_offset: platform specific function to get busctl offset
50 */ 51 */
51struct musb_io { 52struct musb_io {
52 u32 quirks; 53 u32 quirks;
@@ -55,6 +56,7 @@ struct musb_io {
55 u32 (*fifo_offset)(u8 epnum); 56 u32 (*fifo_offset)(u8 epnum);
56 void (*read_fifo)(struct musb_hw_ep *hw_ep, u16 len, u8 *buf); 57 void (*read_fifo)(struct musb_hw_ep *hw_ep, u16 len, u8 *buf);
57 void (*write_fifo)(struct musb_hw_ep *hw_ep, u16 len, const u8 *buf); 58 void (*write_fifo)(struct musb_hw_ep *hw_ep, u16 len, const u8 *buf);
59 u32 (*busctl_offset)(u8 epnum, u16 offset);
58}; 60};
59 61
60/* Do not add new entries here, add them the struct musb_io instead */ 62/* Do not add new entries here, add them the struct musb_io instead */
diff --git a/drivers/usb/musb/musb_regs.h b/drivers/usb/musb/musb_regs.h
index 11f0be07491e..cff5bcf0d00f 100644
--- a/drivers/usb/musb/musb_regs.h
+++ b/drivers/usb/musb/musb_regs.h
@@ -300,9 +300,6 @@
300#define MUSB_RXHUBADDR 0x06 300#define MUSB_RXHUBADDR 0x06
301#define MUSB_RXHUBPORT 0x07 301#define MUSB_RXHUBPORT 0x07
302 302
303#define MUSB_BUSCTL_OFFSET(_epnum, _offset) \
304 (0x80 + (8*(_epnum)) + (_offset))
305
306static inline void musb_write_txfifosz(void __iomem *mbase, u8 c_size) 303static inline void musb_write_txfifosz(void __iomem *mbase, u8 c_size)
307{ 304{
308 musb_writeb(mbase, MUSB_TXFIFOSZ, c_size); 305 musb_writeb(mbase, MUSB_TXFIFOSZ, c_size);
@@ -364,78 +361,84 @@ static inline u16 musb_read_hwvers(void __iomem *mbase)
364 return musb_readw(mbase, MUSB_HWVERS); 361 return musb_readw(mbase, MUSB_HWVERS);
365} 362}
366 363
367static inline void __iomem *musb_read_target_reg_base(u8 i, void __iomem *mbase) 364static inline void musb_write_rxfunaddr(struct musb *musb, u8 epnum,
368{
369 return (MUSB_BUSCTL_OFFSET(i, 0) + mbase);
370}
371
372static inline void musb_write_rxfunaddr(void __iomem *ep_target_regs,
373 u8 qh_addr_reg) 365 u8 qh_addr_reg)
374{ 366{
375 musb_writeb(ep_target_regs, MUSB_RXFUNCADDR, qh_addr_reg); 367 musb_writeb(musb->mregs,
368 musb->io.busctl_offset(epnum, MUSB_RXFUNCADDR),
369 qh_addr_reg);
376} 370}
377 371
378static inline void musb_write_rxhubaddr(void __iomem *ep_target_regs, 372static inline void musb_write_rxhubaddr(struct musb *musb, u8 epnum,
379 u8 qh_h_addr_reg) 373 u8 qh_h_addr_reg)
380{ 374{
381 musb_writeb(ep_target_regs, MUSB_RXHUBADDR, qh_h_addr_reg); 375 musb_writeb(musb->mregs, musb->io.busctl_offset(epnum, MUSB_RXHUBADDR),
376 qh_h_addr_reg);
382} 377}
383 378
384static inline void musb_write_rxhubport(void __iomem *ep_target_regs, 379static inline void musb_write_rxhubport(struct musb *musb, u8 epnum,
385 u8 qh_h_port_reg) 380 u8 qh_h_port_reg)
386{ 381{
387 musb_writeb(ep_target_regs, MUSB_RXHUBPORT, qh_h_port_reg); 382 musb_writeb(musb->mregs, musb->io.busctl_offset(epnum, MUSB_RXHUBPORT),
383 qh_h_port_reg);
388} 384}
389 385
390static inline void musb_write_txfunaddr(void __iomem *mbase, u8 epnum, 386static inline void musb_write_txfunaddr(struct musb *musb, u8 epnum,
391 u8 qh_addr_reg) 387 u8 qh_addr_reg)
392{ 388{
393 musb_writeb(mbase, MUSB_BUSCTL_OFFSET(epnum, MUSB_TXFUNCADDR), 389 musb_writeb(musb->mregs,
394 qh_addr_reg); 390 musb->io.busctl_offset(epnum, MUSB_TXFUNCADDR),
391 qh_addr_reg);
395} 392}
396 393
397static inline void musb_write_txhubaddr(void __iomem *mbase, u8 epnum, 394static inline void musb_write_txhubaddr(struct musb *musb, u8 epnum,
398 u8 qh_addr_reg) 395 u8 qh_addr_reg)
399{ 396{
400 musb_writeb(mbase, MUSB_BUSCTL_OFFSET(epnum, MUSB_TXHUBADDR), 397 musb_writeb(musb->mregs, musb->io.busctl_offset(epnum, MUSB_TXHUBADDR),
401 qh_addr_reg); 398 qh_addr_reg);
402} 399}
403 400
404static inline void musb_write_txhubport(void __iomem *mbase, u8 epnum, 401static inline void musb_write_txhubport(struct musb *musb, u8 epnum,
405 u8 qh_h_port_reg) 402 u8 qh_h_port_reg)
406{ 403{
407 musb_writeb(mbase, MUSB_BUSCTL_OFFSET(epnum, MUSB_TXHUBPORT), 404 musb_writeb(musb->mregs, musb->io.busctl_offset(epnum, MUSB_TXHUBPORT),
408 qh_h_port_reg); 405 qh_h_port_reg);
409} 406}
410 407
411static inline u8 musb_read_rxfunaddr(void __iomem *mbase, u8 epnum) 408static inline u8 musb_read_rxfunaddr(struct musb *musb, u8 epnum)
412{ 409{
413 return musb_readb(mbase, MUSB_BUSCTL_OFFSET(epnum, MUSB_RXFUNCADDR)); 410 return musb_readb(musb->mregs,
411 musb->io.busctl_offset(epnum, MUSB_RXFUNCADDR));
414} 412}
415 413
416static inline u8 musb_read_rxhubaddr(void __iomem *mbase, u8 epnum) 414static inline u8 musb_read_rxhubaddr(struct musb *musb, u8 epnum)
417{ 415{
418 return musb_readb(mbase, MUSB_BUSCTL_OFFSET(epnum, MUSB_RXHUBADDR)); 416 return musb_readb(musb->mregs,
417 musb->io.busctl_offset(epnum, MUSB_RXHUBADDR));
419} 418}
420 419
421static inline u8 musb_read_rxhubport(void __iomem *mbase, u8 epnum) 420static inline u8 musb_read_rxhubport(struct musb *musb, u8 epnum)
422{ 421{
423 return musb_readb(mbase, MUSB_BUSCTL_OFFSET(epnum, MUSB_RXHUBPORT)); 422 return musb_readb(musb->mregs,
423 musb->io.busctl_offset(epnum, MUSB_RXHUBPORT));
424} 424}
425 425
426static inline u8 musb_read_txfunaddr(void __iomem *mbase, u8 epnum) 426static inline u8 musb_read_txfunaddr(struct musb *musb, u8 epnum)
427{ 427{
428 return musb_readb(mbase, MUSB_BUSCTL_OFFSET(epnum, MUSB_TXFUNCADDR)); 428 return musb_readb(musb->mregs,
429 musb->io.busctl_offset(epnum, MUSB_TXFUNCADDR));
429} 430}
430 431
431static inline u8 musb_read_txhubaddr(void __iomem *mbase, u8 epnum) 432static inline u8 musb_read_txhubaddr(struct musb *musb, u8 epnum)
432{ 433{
433 return musb_readb(mbase, MUSB_BUSCTL_OFFSET(epnum, MUSB_TXHUBADDR)); 434 return musb_readb(musb->mregs,
435 musb->io.busctl_offset(epnum, MUSB_TXHUBADDR));
434} 436}
435 437
436static inline u8 musb_read_txhubport(void __iomem *mbase, u8 epnum) 438static inline u8 musb_read_txhubport(struct musb *musb, u8 epnum)
437{ 439{
438 return musb_readb(mbase, MUSB_BUSCTL_OFFSET(epnum, MUSB_TXHUBPORT)); 440 return musb_readb(musb->mregs,
441 musb->io.busctl_offset(epnum, MUSB_TXHUBPORT));
439} 442}
440 443
441#else /* CONFIG_BLACKFIN */ 444#else /* CONFIG_BLACKFIN */
@@ -556,22 +559,17 @@ static inline u16 musb_read_hwvers(void __iomem *mbase)
556 return MUSB_HWVERS_1900; 559 return MUSB_HWVERS_1900;
557} 560}
558 561
559static inline void __iomem *musb_read_target_reg_base(u8 i, void __iomem *mbase) 562static inline void musb_write_rxfunaddr(void __iomem *mbase, u8 epnum,
560{
561 return NULL;
562}
563
564static inline void musb_write_rxfunaddr(void __iomem *ep_target_regs,
565 u8 qh_addr_req) 563 u8 qh_addr_req)
566{ 564{
567} 565}
568 566
569static inline void musb_write_rxhubaddr(void __iomem *ep_target_regs, 567static inline void musb_write_rxhubaddr(void __iomem *mbase, u8 epnum,
570 u8 qh_h_addr_reg) 568 u8 qh_h_addr_reg)
571{ 569{
572} 570}
573 571
574static inline void musb_write_rxhubport(void __iomem *ep_target_regs, 572static inline void musb_write_rxhubport(void __iomem *mbase, u8 epnum,
575 u8 qh_h_port_reg) 573 u8 qh_h_port_reg)
576{ 574{
577} 575}
diff --git a/drivers/usb/musb/musb_virthub.c b/drivers/usb/musb/musb_virthub.c
index 86c4b533e90b..30842bc195f5 100644
--- a/drivers/usb/musb/musb_virthub.c
+++ b/drivers/usb/musb/musb_virthub.c
@@ -195,8 +195,10 @@ void musb_port_reset(struct musb *musb, bool do_reset)
195 msecs_to_jiffies(50)); 195 msecs_to_jiffies(50));
196 } else { 196 } else {
197 dev_dbg(musb->controller, "root port reset stopped\n"); 197 dev_dbg(musb->controller, "root port reset stopped\n");
198 musb_platform_pre_root_reset_end(musb);
198 musb_writeb(mbase, MUSB_POWER, 199 musb_writeb(mbase, MUSB_POWER,
199 power & ~MUSB_POWER_RESET); 200 power & ~MUSB_POWER_RESET);
201 musb_platform_post_root_reset_end(musb);
200 202
201 power = musb_readb(mbase, MUSB_POWER); 203 power = musb_readb(mbase, MUSB_POWER);
202 if (power & MUSB_POWER_HSMODE) { 204 if (power & MUSB_POWER_HSMODE) {
diff --git a/drivers/usb/musb/musbhsdma.c b/drivers/usb/musb/musbhsdma.c
index ab7ec09a8afe..7539c3188ffc 100644
--- a/drivers/usb/musb/musbhsdma.c
+++ b/drivers/usb/musb/musbhsdma.c
@@ -357,7 +357,7 @@ done:
357 return retval; 357 return retval;
358} 358}
359 359
360void dma_controller_destroy(struct dma_controller *c) 360void musbhs_dma_controller_destroy(struct dma_controller *c)
361{ 361{
362 struct musb_dma_controller *controller = container_of(c, 362 struct musb_dma_controller *controller = container_of(c,
363 struct musb_dma_controller, controller); 363 struct musb_dma_controller, controller);
@@ -369,8 +369,10 @@ void dma_controller_destroy(struct dma_controller *c)
369 369
370 kfree(controller); 370 kfree(controller);
371} 371}
372EXPORT_SYMBOL_GPL(musbhs_dma_controller_destroy);
372 373
373struct dma_controller *dma_controller_create(struct musb *musb, void __iomem *base) 374struct dma_controller *musbhs_dma_controller_create(struct musb *musb,
375 void __iomem *base)
374{ 376{
375 struct musb_dma_controller *controller; 377 struct musb_dma_controller *controller;
376 struct device *dev = musb->controller; 378 struct device *dev = musb->controller;
@@ -398,7 +400,7 @@ struct dma_controller *dma_controller_create(struct musb *musb, void __iomem *ba
398 if (request_irq(irq, dma_controller_irq, 0, 400 if (request_irq(irq, dma_controller_irq, 0,
399 dev_name(musb->controller), &controller->controller)) { 401 dev_name(musb->controller), &controller->controller)) {
400 dev_err(dev, "request_irq %d failed!\n", irq); 402 dev_err(dev, "request_irq %d failed!\n", irq);
401 dma_controller_destroy(&controller->controller); 403 musb_dma_controller_destroy(&controller->controller);
402 404
403 return NULL; 405 return NULL;
404 } 406 }
@@ -407,3 +409,4 @@ struct dma_controller *dma_controller_create(struct musb *musb, void __iomem *ba
407 409
408 return &controller->controller; 410 return &controller->controller;
409} 411}
412EXPORT_SYMBOL_GPL(musbhs_dma_controller_create);
diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c
index cc752d8c7773..70f2b8a2e6cf 100644
--- a/drivers/usb/musb/omap2430.c
+++ b/drivers/usb/musb/omap2430.c
@@ -493,6 +493,11 @@ static int omap2430_musb_exit(struct musb *musb)
493} 493}
494 494
495static const struct musb_platform_ops omap2430_ops = { 495static const struct musb_platform_ops omap2430_ops = {
496 .quirks = MUSB_DMA_INVENTRA,
497#ifdef CONFIG_USB_INVENTRA_DMA
498 .dma_init = musbhs_dma_controller_create,
499 .dma_exit = musbhs_dma_controller_destroy,
500#endif
496 .init = omap2430_musb_init, 501 .init = omap2430_musb_init,
497 .exit = omap2430_musb_exit, 502 .exit = omap2430_musb_exit,
498 503
diff --git a/drivers/usb/musb/tusb6010.c b/drivers/usb/musb/tusb6010.c
index 3a5ffd575438..df7c9f46be54 100644
--- a/drivers/usb/musb/tusb6010.c
+++ b/drivers/usb/musb/tusb6010.c
@@ -890,7 +890,7 @@ static irqreturn_t tusb_musb_interrupt(int irq, void *__hci)
890 890
891 dev_dbg(musb->controller, "DMA IRQ %08x\n", dma_src); 891 dev_dbg(musb->controller, "DMA IRQ %08x\n", dma_src);
892 real_dma_src = ~real_dma_src & dma_src; 892 real_dma_src = ~real_dma_src & dma_src;
893 if (tusb_dma_omap() && real_dma_src) { 893 if (tusb_dma_omap(musb) && real_dma_src) {
894 int tx_source = (real_dma_src & 0xffff); 894 int tx_source = (real_dma_src & 0xffff);
895 int i; 895 int i;
896 896
@@ -1181,7 +1181,7 @@ static int tusb_musb_exit(struct musb *musb)
1181} 1181}
1182 1182
1183static const struct musb_platform_ops tusb_ops = { 1183static const struct musb_platform_ops tusb_ops = {
1184 .quirks = MUSB_IN_TUSB, 1184 .quirks = MUSB_DMA_TUSB_OMAP | MUSB_IN_TUSB,
1185 .init = tusb_musb_init, 1185 .init = tusb_musb_init,
1186 .exit = tusb_musb_exit, 1186 .exit = tusb_musb_exit,
1187 1187
@@ -1192,6 +1192,10 @@ static const struct musb_platform_ops tusb_ops = {
1192 .writeb = tusb_writeb, 1192 .writeb = tusb_writeb,
1193 .read_fifo = tusb_read_fifo, 1193 .read_fifo = tusb_read_fifo,
1194 .write_fifo = tusb_write_fifo, 1194 .write_fifo = tusb_write_fifo,
1195#ifdef CONFIG_USB_TUSB_OMAP_DMA
1196 .dma_init = tusb_dma_controller_create,
1197 .dma_exit = tusb_dma_controller_destroy,
1198#endif
1195 .enable = tusb_musb_enable, 1199 .enable = tusb_musb_enable,
1196 .disable = tusb_musb_disable, 1200 .disable = tusb_musb_disable,
1197 1201
diff --git a/drivers/usb/musb/tusb6010.h b/drivers/usb/musb/tusb6010.h
index aec86c86ce32..72cdad23ced9 100644
--- a/drivers/usb/musb/tusb6010.h
+++ b/drivers/usb/musb/tusb6010.h
@@ -12,12 +12,6 @@
12#ifndef __TUSB6010_H__ 12#ifndef __TUSB6010_H__
13#define __TUSB6010_H__ 13#define __TUSB6010_H__
14 14
15#ifdef CONFIG_USB_TUSB_OMAP_DMA
16#define tusb_dma_omap() 1
17#else
18#define tusb_dma_omap() 0
19#endif
20
21/* VLYNQ control register. 32-bit at offset 0x000 */ 15/* VLYNQ control register. 32-bit at offset 0x000 */
22#define TUSB_VLYNQ_CTRL 0x004 16#define TUSB_VLYNQ_CTRL 0x004
23 17
diff --git a/drivers/usb/musb/tusb6010_omap.c b/drivers/usb/musb/tusb6010_omap.c
index 3ce152c0408e..4c82077da475 100644
--- a/drivers/usb/musb/tusb6010_omap.c
+++ b/drivers/usb/musb/tusb6010_omap.c
@@ -625,7 +625,7 @@ static void tusb_omap_dma_release(struct dma_channel *channel)
625 channel = NULL; 625 channel = NULL;
626} 626}
627 627
628void dma_controller_destroy(struct dma_controller *c) 628void tusb_dma_controller_destroy(struct dma_controller *c)
629{ 629{
630 struct tusb_omap_dma *tusb_dma; 630 struct tusb_omap_dma *tusb_dma;
631 int i; 631 int i;
@@ -644,8 +644,10 @@ void dma_controller_destroy(struct dma_controller *c)
644 644
645 kfree(tusb_dma); 645 kfree(tusb_dma);
646} 646}
647EXPORT_SYMBOL_GPL(tusb_dma_controller_destroy);
647 648
648struct dma_controller *dma_controller_create(struct musb *musb, void __iomem *base) 649struct dma_controller *
650tusb_dma_controller_create(struct musb *musb, void __iomem *base)
649{ 651{
650 void __iomem *tbase = musb->ctrl_base; 652 void __iomem *tbase = musb->ctrl_base;
651 struct tusb_omap_dma *tusb_dma; 653 struct tusb_omap_dma *tusb_dma;
@@ -701,7 +703,8 @@ struct dma_controller *dma_controller_create(struct musb *musb, void __iomem *ba
701 return &tusb_dma->controller; 703 return &tusb_dma->controller;
702 704
703cleanup: 705cleanup:
704 dma_controller_destroy(&tusb_dma->controller); 706 musb_dma_controller_destroy(&tusb_dma->controller);
705out: 707out:
706 return NULL; 708 return NULL;
707} 709}
710EXPORT_SYMBOL_GPL(tusb_dma_controller_create);
diff --git a/drivers/usb/musb/ux500.c b/drivers/usb/musb/ux500.c
index abf72728825f..39168fe9b406 100644
--- a/drivers/usb/musb/ux500.c
+++ b/drivers/usb/musb/ux500.c
@@ -188,7 +188,11 @@ static int ux500_musb_exit(struct musb *musb)
188} 188}
189 189
190static const struct musb_platform_ops ux500_ops = { 190static const struct musb_platform_ops ux500_ops = {
191 .quirks = MUSB_INDEXED_EP, 191 .quirks = MUSB_DMA_UX500 | MUSB_INDEXED_EP,
192#ifdef CONFIG_USB_UX500_DMA
193 .dma_init = ux500_dma_controller_create,
194 .dma_exit = ux500_dma_controller_destroy,
195#endif
192 .init = ux500_musb_init, 196 .init = ux500_musb_init,
193 .exit = ux500_musb_exit, 197 .exit = ux500_musb_exit,
194 .fifo_mode = 5, 198 .fifo_mode = 5,
@@ -338,7 +342,7 @@ static int ux500_remove(struct platform_device *pdev)
338 return 0; 342 return 0;
339} 343}
340 344
341#ifdef CONFIG_PM 345#ifdef CONFIG_PM_SLEEP
342static int ux500_suspend(struct device *dev) 346static int ux500_suspend(struct device *dev)
343{ 347{
344 struct ux500_glue *glue = dev_get_drvdata(dev); 348 struct ux500_glue *glue = dev_get_drvdata(dev);
diff --git a/drivers/usb/musb/ux500_dma.c b/drivers/usb/musb/ux500_dma.c
index e93845c26bdb..d0b6a1cd7f62 100644
--- a/drivers/usb/musb/ux500_dma.c
+++ b/drivers/usb/musb/ux500_dma.c
@@ -359,7 +359,7 @@ static int ux500_dma_controller_start(struct ux500_dma_controller *controller)
359 return 0; 359 return 0;
360} 360}
361 361
362void dma_controller_destroy(struct dma_controller *c) 362void ux500_dma_controller_destroy(struct dma_controller *c)
363{ 363{
364 struct ux500_dma_controller *controller = container_of(c, 364 struct ux500_dma_controller *controller = container_of(c,
365 struct ux500_dma_controller, controller); 365 struct ux500_dma_controller, controller);
@@ -367,9 +367,10 @@ void dma_controller_destroy(struct dma_controller *c)
367 ux500_dma_controller_stop(controller); 367 ux500_dma_controller_stop(controller);
368 kfree(controller); 368 kfree(controller);
369} 369}
370EXPORT_SYMBOL_GPL(ux500_dma_controller_destroy);
370 371
371struct dma_controller *dma_controller_create(struct musb *musb, 372struct dma_controller *
372 void __iomem *base) 373ux500_dma_controller_create(struct musb *musb, void __iomem *base)
373{ 374{
374 struct ux500_dma_controller *controller; 375 struct ux500_dma_controller *controller;
375 struct platform_device *pdev = to_platform_device(musb->controller); 376 struct platform_device *pdev = to_platform_device(musb->controller);
@@ -407,3 +408,4 @@ plat_get_fail:
407kzalloc_fail: 408kzalloc_fail:
408 return NULL; 409 return NULL;
409} 410}
411EXPORT_SYMBOL_GPL(ux500_dma_controller_create);
diff --git a/drivers/usb/phy/Kconfig b/drivers/usb/phy/Kconfig
index 3cd3bee54ca6..869c0cfcad98 100644
--- a/drivers/usb/phy/Kconfig
+++ b/drivers/usb/phy/Kconfig
@@ -91,7 +91,7 @@ config TWL6030_USB
91 91
92config USB_GPIO_VBUS 92config USB_GPIO_VBUS
93 tristate "GPIO based peripheral-only VBUS sensing 'transceiver'" 93 tristate "GPIO based peripheral-only VBUS sensing 'transceiver'"
94 depends on GPIOLIB 94 depends on GPIOLIB || COMPILE_TEST
95 select USB_PHY 95 select USB_PHY
96 help 96 help
97 Provides simple GPIO VBUS sensing for controllers with an 97 Provides simple GPIO VBUS sensing for controllers with an
@@ -141,6 +141,7 @@ config USB_MSM_OTG
141 tristate "Qualcomm on-chip USB OTG controller support" 141 tristate "Qualcomm on-chip USB OTG controller support"
142 depends on (USB || USB_GADGET) && (ARCH_QCOM || COMPILE_TEST) 142 depends on (USB || USB_GADGET) && (ARCH_QCOM || COMPILE_TEST)
143 depends on RESET_CONTROLLER 143 depends on RESET_CONTROLLER
144 depends on EXTCON
144 select USB_PHY 145 select USB_PHY
145 help 146 help
146 Enable this to support the USB OTG transceiver on Qualcomm chips. It 147 Enable this to support the USB OTG transceiver on Qualcomm chips. It
diff --git a/drivers/usb/phy/phy-msm-usb.c b/drivers/usb/phy/phy-msm-usb.c
index c9156beeadef..00c49bb1bd29 100644
--- a/drivers/usb/phy/phy-msm-usb.c
+++ b/drivers/usb/phy/phy-msm-usb.c
@@ -240,8 +240,14 @@ static void ulpi_init(struct msm_otg *motg)
240static int msm_phy_notify_disconnect(struct usb_phy *phy, 240static int msm_phy_notify_disconnect(struct usb_phy *phy,
241 enum usb_device_speed speed) 241 enum usb_device_speed speed)
242{ 242{
243 struct msm_otg *motg = container_of(phy, struct msm_otg, phy);
243 int val; 244 int val;
244 245
246 if (motg->manual_pullup) {
247 val = ULPI_MISC_A_VBUSVLDEXT | ULPI_MISC_A_VBUSVLDEXTSEL;
248 usb_phy_io_write(phy, val, ULPI_CLR(ULPI_MISC_A));
249 }
250
245 /* 251 /*
246 * Put the transceiver in non-driving mode. Otherwise host 252 * Put the transceiver in non-driving mode. Otherwise host
247 * may not detect soft-disconnection. 253 * may not detect soft-disconnection.
@@ -422,6 +428,24 @@ static int msm_phy_init(struct usb_phy *phy)
422 ulpi_write(phy, ulpi_val, ULPI_USB_INT_EN_FALL); 428 ulpi_write(phy, ulpi_val, ULPI_USB_INT_EN_FALL);
423 } 429 }
424 430
431 if (motg->manual_pullup) {
432 val = ULPI_MISC_A_VBUSVLDEXTSEL | ULPI_MISC_A_VBUSVLDEXT;
433 ulpi_write(phy, val, ULPI_SET(ULPI_MISC_A));
434
435 val = readl(USB_GENCONFIG_2);
436 val |= GENCONFIG_2_SESS_VLD_CTRL_EN;
437 writel(val, USB_GENCONFIG_2);
438
439 val = readl(USB_USBCMD);
440 val |= USBCMD_SESS_VLD_CTRL;
441 writel(val, USB_USBCMD);
442
443 val = ulpi_read(phy, ULPI_FUNC_CTRL);
444 val &= ~ULPI_FUNC_CTRL_OPMODE_MASK;
445 val |= ULPI_FUNC_CTRL_OPMODE_NORMAL;
446 ulpi_write(phy, val, ULPI_FUNC_CTRL);
447 }
448
425 if (motg->phy_number) 449 if (motg->phy_number)
426 writel(readl(USB_PHY_CTRL2) | BIT(16), USB_PHY_CTRL2); 450 writel(readl(USB_PHY_CTRL2) | BIT(16), USB_PHY_CTRL2);
427 451
@@ -1436,9 +1460,42 @@ static const struct of_device_id msm_otg_dt_match[] = {
1436}; 1460};
1437MODULE_DEVICE_TABLE(of, msm_otg_dt_match); 1461MODULE_DEVICE_TABLE(of, msm_otg_dt_match);
1438 1462
1463static int msm_otg_vbus_notifier(struct notifier_block *nb, unsigned long event,
1464 void *ptr)
1465{
1466 struct msm_usb_cable *vbus = container_of(nb, struct msm_usb_cable, nb);
1467 struct msm_otg *motg = container_of(vbus, struct msm_otg, vbus);
1468
1469 if (event)
1470 set_bit(B_SESS_VLD, &motg->inputs);
1471 else
1472 clear_bit(B_SESS_VLD, &motg->inputs);
1473
1474 schedule_work(&motg->sm_work);
1475
1476 return NOTIFY_DONE;
1477}
1478
1479static int msm_otg_id_notifier(struct notifier_block *nb, unsigned long event,
1480 void *ptr)
1481{
1482 struct msm_usb_cable *id = container_of(nb, struct msm_usb_cable, nb);
1483 struct msm_otg *motg = container_of(id, struct msm_otg, id);
1484
1485 if (event)
1486 clear_bit(ID, &motg->inputs);
1487 else
1488 set_bit(ID, &motg->inputs);
1489
1490 schedule_work(&motg->sm_work);
1491
1492 return NOTIFY_DONE;
1493}
1494
1439static int msm_otg_read_dt(struct platform_device *pdev, struct msm_otg *motg) 1495static int msm_otg_read_dt(struct platform_device *pdev, struct msm_otg *motg)
1440{ 1496{
1441 struct msm_otg_platform_data *pdata; 1497 struct msm_otg_platform_data *pdata;
1498 struct extcon_dev *ext_id, *ext_vbus;
1442 const struct of_device_id *id; 1499 const struct of_device_id *id;
1443 struct device_node *node = pdev->dev.of_node; 1500 struct device_node *node = pdev->dev.of_node;
1444 struct property *prop; 1501 struct property *prop;
@@ -1487,6 +1544,54 @@ static int msm_otg_read_dt(struct platform_device *pdev, struct msm_otg *motg)
1487 motg->vdd_levels[VDD_LEVEL_MAX] = tmp[VDD_LEVEL_MAX]; 1544 motg->vdd_levels[VDD_LEVEL_MAX] = tmp[VDD_LEVEL_MAX];
1488 } 1545 }
1489 1546
1547 motg->manual_pullup = of_property_read_bool(node, "qcom,manual-pullup");
1548
1549 ext_id = ERR_PTR(-ENODEV);
1550 ext_vbus = ERR_PTR(-ENODEV);
1551 if (of_property_read_bool(node, "extcon")) {
1552
1553 /* Each one of them is not mandatory */
1554 ext_vbus = extcon_get_edev_by_phandle(&pdev->dev, 0);
1555 if (IS_ERR(ext_vbus) && PTR_ERR(ext_vbus) != -ENODEV)
1556 return PTR_ERR(ext_vbus);
1557
1558 ext_id = extcon_get_edev_by_phandle(&pdev->dev, 1);
1559 if (IS_ERR(ext_id) && PTR_ERR(ext_id) != -ENODEV)
1560 return PTR_ERR(ext_id);
1561 }
1562
1563 if (!IS_ERR(ext_vbus)) {
1564 motg->vbus.nb.notifier_call = msm_otg_vbus_notifier;
1565 ret = extcon_register_interest(&motg->vbus.conn, ext_vbus->name,
1566 "USB", &motg->vbus.nb);
1567 if (ret < 0) {
1568 dev_err(&pdev->dev, "register VBUS notifier failed\n");
1569 return ret;
1570 }
1571
1572 ret = extcon_get_cable_state(ext_vbus, "USB");
1573 if (ret)
1574 set_bit(B_SESS_VLD, &motg->inputs);
1575 else
1576 clear_bit(B_SESS_VLD, &motg->inputs);
1577 }
1578
1579 if (!IS_ERR(ext_id)) {
1580 motg->id.nb.notifier_call = msm_otg_id_notifier;
1581 ret = extcon_register_interest(&motg->id.conn, ext_id->name,
1582 "USB-HOST", &motg->id.nb);
1583 if (ret < 0) {
1584 dev_err(&pdev->dev, "register ID notifier failed\n");
1585 return ret;
1586 }
1587
1588 ret = extcon_get_cable_state(ext_id, "USB-HOST");
1589 if (ret)
1590 clear_bit(ID, &motg->inputs);
1591 else
1592 set_bit(ID, &motg->inputs);
1593 }
1594
1490 prop = of_find_property(node, "qcom,phy-init-sequence", &len); 1595 prop = of_find_property(node, "qcom,phy-init-sequence", &len);
1491 if (!prop || !len) 1596 if (!prop || !len)
1492 return 0; 1597 return 0;
@@ -1700,6 +1805,11 @@ static int msm_otg_remove(struct platform_device *pdev)
1700 if (phy->otg->host || phy->otg->gadget) 1805 if (phy->otg->host || phy->otg->gadget)
1701 return -EBUSY; 1806 return -EBUSY;
1702 1807
1808 if (motg->id.conn.edev)
1809 extcon_unregister_interest(&motg->id.conn);
1810 if (motg->vbus.conn.edev)
1811 extcon_unregister_interest(&motg->vbus.conn);
1812
1703 msm_otg_debugfs_cleanup(); 1813 msm_otg_debugfs_cleanup();
1704 cancel_delayed_work_sync(&motg->chg_work); 1814 cancel_delayed_work_sync(&motg->chg_work);
1705 cancel_work_sync(&motg->sm_work); 1815 cancel_work_sync(&motg->sm_work);
diff --git a/drivers/usb/phy/phy.c b/drivers/usb/phy/phy.c
index d1cd6b50f520..98f75d2842b7 100644
--- a/drivers/usb/phy/phy.c
+++ b/drivers/usb/phy/phy.c
@@ -22,6 +22,11 @@ static LIST_HEAD(phy_list);
22static LIST_HEAD(phy_bind_list); 22static LIST_HEAD(phy_bind_list);
23static DEFINE_SPINLOCK(phy_lock); 23static DEFINE_SPINLOCK(phy_lock);
24 24
25struct phy_devm {
26 struct usb_phy *phy;
27 struct notifier_block *nb;
28};
29
25static struct usb_phy *__usb_find_phy(struct list_head *list, 30static struct usb_phy *__usb_find_phy(struct list_head *list,
26 enum usb_phy_type type) 31 enum usb_phy_type type)
27{ 32{
@@ -79,6 +84,15 @@ static void devm_usb_phy_release(struct device *dev, void *res)
79 usb_put_phy(phy); 84 usb_put_phy(phy);
80} 85}
81 86
87static void devm_usb_phy_release2(struct device *dev, void *_res)
88{
89 struct phy_devm *res = _res;
90
91 if (res->nb)
92 usb_unregister_notifier(res->phy, res->nb);
93 usb_put_phy(res->phy);
94}
95
82static int devm_usb_phy_match(struct device *dev, void *res, void *match_data) 96static int devm_usb_phy_match(struct device *dev, void *res, void *match_data)
83{ 97{
84 struct usb_phy **phy = res; 98 struct usb_phy **phy = res;
@@ -153,40 +167,30 @@ err0:
153EXPORT_SYMBOL_GPL(usb_get_phy); 167EXPORT_SYMBOL_GPL(usb_get_phy);
154 168
155/** 169/**
156 * devm_usb_get_phy_by_phandle - find the USB PHY by phandle 170 * devm_usb_get_phy_by_node - find the USB PHY by device_node
157 * @dev - device that requests this phy 171 * @dev - device that requests this phy
158 * @phandle - name of the property holding the phy phandle value 172 * @node - the device_node for the phy device.
159 * @index - the index of the phy 173 * @nb - a notifier_block to register with the phy.
160 * 174 *
161 * Returns the phy driver associated with the given phandle value, 175 * Returns the phy driver associated with the given device_node,
162 * after getting a refcount to it, -ENODEV if there is no such phy or 176 * after getting a refcount to it, -ENODEV if there is no such phy or
163 * -EPROBE_DEFER if there is a phandle to the phy, but the device is 177 * -EPROBE_DEFER if the device is not yet loaded. While at that, it
164 * not yet loaded. While at that, it also associates the device with 178 * also associates the device with
165 * the phy using devres. On driver detach, release function is invoked 179 * the phy using devres. On driver detach, release function is invoked
166 * on the devres data, then, devres data is freed. 180 * on the devres data, then, devres data is freed.
167 * 181 *
168 * For use by USB host and peripheral drivers. 182 * For use by peripheral drivers for devices related to a phy,
183 * such as a charger.
169 */ 184 */
170struct usb_phy *devm_usb_get_phy_by_phandle(struct device *dev, 185struct usb_phy *devm_usb_get_phy_by_node(struct device *dev,
171 const char *phandle, u8 index) 186 struct device_node *node,
187 struct notifier_block *nb)
172{ 188{
173 struct usb_phy *phy = ERR_PTR(-ENOMEM), **ptr; 189 struct usb_phy *phy = ERR_PTR(-ENOMEM);
190 struct phy_devm *ptr;
174 unsigned long flags; 191 unsigned long flags;
175 struct device_node *node;
176 192
177 if (!dev->of_node) { 193 ptr = devres_alloc(devm_usb_phy_release2, sizeof(*ptr), GFP_KERNEL);
178 dev_dbg(dev, "device does not have a device node entry\n");
179 return ERR_PTR(-EINVAL);
180 }
181
182 node = of_parse_phandle(dev->of_node, phandle, index);
183 if (!node) {
184 dev_dbg(dev, "failed to get %s phandle in %s node\n", phandle,
185 dev->of_node->full_name);
186 return ERR_PTR(-ENODEV);
187 }
188
189 ptr = devres_alloc(devm_usb_phy_release, sizeof(*ptr), GFP_KERNEL);
190 if (!ptr) { 194 if (!ptr) {
191 dev_dbg(dev, "failed to allocate memory for devres\n"); 195 dev_dbg(dev, "failed to allocate memory for devres\n");
192 goto err0; 196 goto err0;
@@ -205,8 +209,10 @@ struct usb_phy *devm_usb_get_phy_by_phandle(struct device *dev,
205 devres_free(ptr); 209 devres_free(ptr);
206 goto err1; 210 goto err1;
207 } 211 }
208 212 if (nb)
209 *ptr = phy; 213 usb_register_notifier(phy, nb);
214 ptr->phy = phy;
215 ptr->nb = nb;
210 devres_add(dev, ptr); 216 devres_add(dev, ptr);
211 217
212 get_device(phy->dev); 218 get_device(phy->dev);
@@ -215,10 +221,47 @@ err1:
215 spin_unlock_irqrestore(&phy_lock, flags); 221 spin_unlock_irqrestore(&phy_lock, flags);
216 222
217err0: 223err0:
218 of_node_put(node);
219 224
220 return phy; 225 return phy;
221} 226}
227EXPORT_SYMBOL_GPL(devm_usb_get_phy_by_node);
228
229/**
230 * devm_usb_get_phy_by_phandle - find the USB PHY by phandle
231 * @dev - device that requests this phy
232 * @phandle - name of the property holding the phy phandle value
233 * @index - the index of the phy
234 *
235 * Returns the phy driver associated with the given phandle value,
236 * after getting a refcount to it, -ENODEV if there is no such phy or
237 * -EPROBE_DEFER if there is a phandle to the phy, but the device is
238 * not yet loaded. While at that, it also associates the device with
239 * the phy using devres. On driver detach, release function is invoked
240 * on the devres data, then, devres data is freed.
241 *
242 * For use by USB host and peripheral drivers.
243 */
244struct usb_phy *devm_usb_get_phy_by_phandle(struct device *dev,
245 const char *phandle, u8 index)
246{
247 struct device_node *node;
248 struct usb_phy *phy;
249
250 if (!dev->of_node) {
251 dev_dbg(dev, "device does not have a device node entry\n");
252 return ERR_PTR(-EINVAL);
253 }
254
255 node = of_parse_phandle(dev->of_node, phandle, index);
256 if (!node) {
257 dev_dbg(dev, "failed to get %s phandle in %s node\n", phandle,
258 dev->of_node->full_name);
259 return ERR_PTR(-ENODEV);
260 }
261 phy = devm_usb_get_phy_by_node(dev, node, NULL);
262 of_node_put(node);
263 return phy;
264}
222EXPORT_SYMBOL_GPL(devm_usb_get_phy_by_phandle); 265EXPORT_SYMBOL_GPL(devm_usb_get_phy_by_phandle);
223 266
224/** 267/**
diff --git a/drivers/usb/renesas_usbhs/common.c b/drivers/usb/renesas_usbhs/common.c
index 0f7e850fd4aa..e8bf40808b39 100644
--- a/drivers/usb/renesas_usbhs/common.c
+++ b/drivers/usb/renesas_usbhs/common.c
@@ -466,11 +466,15 @@ static int usbhsc_drvcllbck_notify_hotplug(struct platform_device *pdev)
466static const struct of_device_id usbhs_of_match[] = { 466static const struct of_device_id usbhs_of_match[] = {
467 { 467 {
468 .compatible = "renesas,usbhs-r8a7790", 468 .compatible = "renesas,usbhs-r8a7790",
469 .data = (void *)USBHS_TYPE_R8A7790, 469 .data = (void *)USBHS_TYPE_RCAR_GEN2,
470 }, 470 },
471 { 471 {
472 .compatible = "renesas,usbhs-r8a7791", 472 .compatible = "renesas,usbhs-r8a7791",
473 .data = (void *)USBHS_TYPE_R8A7791, 473 .data = (void *)USBHS_TYPE_RCAR_GEN2,
474 },
475 {
476 .compatible = "renesas,usbhs-r8a7794",
477 .data = (void *)USBHS_TYPE_RCAR_GEN2,
474 }, 478 },
475 { }, 479 { },
476}; 480};
@@ -497,14 +501,8 @@ static struct renesas_usbhs_platform_info *usbhs_parse_dt(struct device *dev)
497 if (gpio > 0) 501 if (gpio > 0)
498 dparam->enable_gpio = gpio; 502 dparam->enable_gpio = gpio;
499 503
500 switch (dparam->type) { 504 if (dparam->type == USBHS_TYPE_RCAR_GEN2)
501 case USBHS_TYPE_R8A7790:
502 case USBHS_TYPE_R8A7791:
503 dparam->has_usb_dmac = 1; 505 dparam->has_usb_dmac = 1;
504 break;
505 default:
506 break;
507 }
508 506
509 return info; 507 return info;
510} 508}
@@ -559,8 +557,7 @@ static int usbhs_probe(struct platform_device *pdev)
559 sizeof(struct renesas_usbhs_driver_param)); 557 sizeof(struct renesas_usbhs_driver_param));
560 558
561 switch (priv->dparam.type) { 559 switch (priv->dparam.type) {
562 case USBHS_TYPE_R8A7790: 560 case USBHS_TYPE_RCAR_GEN2:
563 case USBHS_TYPE_R8A7791:
564 priv->pfunc = usbhs_rcar2_ops; 561 priv->pfunc = usbhs_rcar2_ops;
565 if (!priv->dparam.pipe_type) { 562 if (!priv->dparam.pipe_type) {
566 priv->dparam.pipe_type = usbhsc_new_pipe_type; 563 priv->dparam.pipe_type = usbhsc_new_pipe_type;
diff --git a/drivers/usb/renesas_usbhs/fifo.c b/drivers/usb/renesas_usbhs/fifo.c
index fa126a2b0c33..c0f5c652d272 100644
--- a/drivers/usb/renesas_usbhs/fifo.c
+++ b/drivers/usb/renesas_usbhs/fifo.c
@@ -1239,15 +1239,21 @@ static void usbhsf_dma_init_dt(struct device *dev, struct usbhs_fifo *fifo,
1239{ 1239{
1240 char name[16]; 1240 char name[16];
1241 1241
1242 snprintf(name, sizeof(name), "tx%d", channel); 1242 /*
1243 fifo->tx_chan = dma_request_slave_channel_reason(dev, name); 1243 * To avoid complex handing for DnFIFOs, the driver uses each
1244 if (IS_ERR(fifo->tx_chan)) 1244 * DnFIFO as TX or RX direction (not bi-direction).
1245 fifo->tx_chan = NULL; 1245 * So, the driver uses odd channels for TX, even channels for RX.
1246 1246 */
1247 snprintf(name, sizeof(name), "rx%d", channel); 1247 snprintf(name, sizeof(name), "ch%d", channel);
1248 fifo->rx_chan = dma_request_slave_channel_reason(dev, name); 1248 if (channel & 1) {
1249 if (IS_ERR(fifo->rx_chan)) 1249 fifo->tx_chan = dma_request_slave_channel_reason(dev, name);
1250 fifo->rx_chan = NULL; 1250 if (IS_ERR(fifo->tx_chan))
1251 fifo->tx_chan = NULL;
1252 } else {
1253 fifo->rx_chan = dma_request_slave_channel_reason(dev, name);
1254 if (IS_ERR(fifo->rx_chan))
1255 fifo->rx_chan = NULL;
1256 }
1251} 1257}
1252 1258
1253static void usbhsf_dma_init(struct usbhs_priv *priv, struct usbhs_fifo *fifo, 1259static void usbhsf_dma_init(struct usbhs_priv *priv, struct usbhs_fifo *fifo,
diff --git a/drivers/usb/renesas_usbhs/fifo.h b/drivers/usb/renesas_usbhs/fifo.h
index 04d3f8abad9e..c7d9b86d51bf 100644
--- a/drivers/usb/renesas_usbhs/fifo.h
+++ b/drivers/usb/renesas_usbhs/fifo.h
@@ -44,10 +44,11 @@ struct usbhs_fifo_info {
44 struct usbhs_fifo dfifo[USBHS_MAX_NUM_DFIFO]; 44 struct usbhs_fifo dfifo[USBHS_MAX_NUM_DFIFO];
45}; 45};
46#define usbhsf_get_dnfifo(p, n) (&((p)->fifo_info.dfifo[n])) 46#define usbhsf_get_dnfifo(p, n) (&((p)->fifo_info.dfifo[n]))
47#define usbhs_for_each_dfifo(priv, dfifo, i) \ 47#define usbhs_for_each_dfifo(priv, dfifo, i) \
48 for ((i) = 0, dfifo = usbhsf_get_dnfifo(priv, (i)); \ 48 for ((i) = 0; \
49 ((i) < USBHS_MAX_NUM_DFIFO); \ 49 ((i) < USBHS_MAX_NUM_DFIFO) && \
50 (i)++, dfifo = usbhsf_get_dnfifo(priv, (i))) 50 ((dfifo) = usbhsf_get_dnfifo(priv, (i))); \
51 (i)++)
51 52
52struct usbhs_pkt_handle; 53struct usbhs_pkt_handle;
53struct usbhs_pkt { 54struct usbhs_pkt {
diff --git a/drivers/usb/renesas_usbhs/mod.c b/drivers/usb/renesas_usbhs/mod.c
index 9a705b15b3a1..d4be5d594896 100644
--- a/drivers/usb/renesas_usbhs/mod.c
+++ b/drivers/usb/renesas_usbhs/mod.c
@@ -218,10 +218,14 @@ static int usbhs_status_get_each_irq(struct usbhs_priv *priv,
218 /******************** spin lock ********************/ 218 /******************** spin lock ********************/
219 usbhs_lock(priv, flags); 219 usbhs_lock(priv, flags);
220 state->intsts0 = usbhs_read(priv, INTSTS0); 220 state->intsts0 = usbhs_read(priv, INTSTS0);
221 state->intsts1 = usbhs_read(priv, INTSTS1);
222
223 intenb0 = usbhs_read(priv, INTENB0); 221 intenb0 = usbhs_read(priv, INTENB0);
224 intenb1 = usbhs_read(priv, INTENB1); 222
223 if (usbhs_mod_is_host(priv)) {
224 state->intsts1 = usbhs_read(priv, INTSTS1);
225 intenb1 = usbhs_read(priv, INTENB1);
226 } else {
227 state->intsts1 = intenb1 = 0;
228 }
225 229
226 /* mask */ 230 /* mask */
227 if (mod) { 231 if (mod) {
@@ -275,7 +279,8 @@ static irqreturn_t usbhs_interrupt(int irq, void *data)
275 * - Function :: VALID bit should 0 279 * - Function :: VALID bit should 0
276 */ 280 */
277 usbhs_write(priv, INTSTS0, ~irq_state.intsts0 & INTSTS0_MAGIC); 281 usbhs_write(priv, INTSTS0, ~irq_state.intsts0 & INTSTS0_MAGIC);
278 usbhs_write(priv, INTSTS1, ~irq_state.intsts1 & INTSTS1_MAGIC); 282 if (usbhs_mod_is_host(priv))
283 usbhs_write(priv, INTSTS1, ~irq_state.intsts1 & INTSTS1_MAGIC);
279 284
280 usbhs_write(priv, BRDYSTS, ~irq_state.brdysts); 285 usbhs_write(priv, BRDYSTS, ~irq_state.brdysts);
281 usbhs_write(priv, NRDYSTS, ~irq_state.nrdysts); 286 usbhs_write(priv, NRDYSTS, ~irq_state.nrdysts);
@@ -303,19 +308,20 @@ static irqreturn_t usbhs_interrupt(int irq, void *data)
303 if (irq_state.intsts0 & BRDY) 308 if (irq_state.intsts0 & BRDY)
304 usbhs_mod_call(priv, irq_ready, priv, &irq_state); 309 usbhs_mod_call(priv, irq_ready, priv, &irq_state);
305 310
306 /* INTSTS1 */ 311 if (usbhs_mod_is_host(priv)) {
307 if (irq_state.intsts1 & ATTCH) 312 /* INTSTS1 */
308 usbhs_mod_call(priv, irq_attch, priv, &irq_state); 313 if (irq_state.intsts1 & ATTCH)
309 314 usbhs_mod_call(priv, irq_attch, priv, &irq_state);
310 if (irq_state.intsts1 & DTCH)
311 usbhs_mod_call(priv, irq_dtch, priv, &irq_state);
312 315
313 if (irq_state.intsts1 & SIGN) 316 if (irq_state.intsts1 & DTCH)
314 usbhs_mod_call(priv, irq_sign, priv, &irq_state); 317 usbhs_mod_call(priv, irq_dtch, priv, &irq_state);
315 318
316 if (irq_state.intsts1 & SACK) 319 if (irq_state.intsts1 & SIGN)
317 usbhs_mod_call(priv, irq_sack, priv, &irq_state); 320 usbhs_mod_call(priv, irq_sign, priv, &irq_state);
318 321
322 if (irq_state.intsts1 & SACK)
323 usbhs_mod_call(priv, irq_sack, priv, &irq_state);
324 }
319 return IRQ_HANDLED; 325 return IRQ_HANDLED;
320} 326}
321 327
@@ -334,7 +340,8 @@ void usbhs_irq_callback_update(struct usbhs_priv *priv, struct usbhs_mod *mod)
334 * - update INTSTS0 340 * - update INTSTS0
335 */ 341 */
336 usbhs_write(priv, INTENB0, 0); 342 usbhs_write(priv, INTENB0, 0);
337 usbhs_write(priv, INTENB1, 0); 343 if (usbhs_mod_is_host(priv))
344 usbhs_write(priv, INTENB1, 0);
338 345
339 usbhs_write(priv, BEMPENB, 0); 346 usbhs_write(priv, BEMPENB, 0);
340 usbhs_write(priv, BRDYENB, 0); 347 usbhs_write(priv, BRDYENB, 0);
@@ -368,25 +375,27 @@ void usbhs_irq_callback_update(struct usbhs_priv *priv, struct usbhs_mod *mod)
368 intenb0 |= BRDYE; 375 intenb0 |= BRDYE;
369 } 376 }
370 377
371 /* 378 if (usbhs_mod_is_host(priv)) {
372 * INTSTS1 379 /*
373 */ 380 * INTSTS1
374 if (mod->irq_attch) 381 */
375 intenb1 |= ATTCHE; 382 if (mod->irq_attch)
383 intenb1 |= ATTCHE;
376 384
377 if (mod->irq_dtch) 385 if (mod->irq_dtch)
378 intenb1 |= DTCHE; 386 intenb1 |= DTCHE;
379 387
380 if (mod->irq_sign) 388 if (mod->irq_sign)
381 intenb1 |= SIGNE; 389 intenb1 |= SIGNE;
382 390
383 if (mod->irq_sack) 391 if (mod->irq_sack)
384 intenb1 |= SACKE; 392 intenb1 |= SACKE;
393 }
385 } 394 }
386 395
387 if (intenb0) 396 if (intenb0)
388 usbhs_write(priv, INTENB0, intenb0); 397 usbhs_write(priv, INTENB0, intenb0);
389 398
390 if (intenb1) 399 if (usbhs_mod_is_host(priv) && intenb1)
391 usbhs_write(priv, INTENB1, intenb1); 400 usbhs_write(priv, INTENB1, intenb1);
392} 401}
diff --git a/include/linux/mod_devicetable.h b/include/linux/mod_devicetable.h
index 3bfd56778c29..7ab00d61d30a 100644
--- a/include/linux/mod_devicetable.h
+++ b/include/linux/mod_devicetable.h
@@ -629,4 +629,10 @@ struct mcb_device_id {
629 kernel_ulong_t driver_data; 629 kernel_ulong_t driver_data;
630}; 630};
631 631
632struct ulpi_device_id {
633 __u16 vendor;
634 __u16 product;
635 kernel_ulong_t driver_data;
636};
637
632#endif /* LINUX_MOD_DEVICETABLE_H */ 638#endif /* LINUX_MOD_DEVICETABLE_H */
diff --git a/include/linux/phy/phy-sun4i-usb.h b/include/linux/phy/phy-sun4i-usb.h
new file mode 100644
index 000000000000..50aed92ea89c
--- /dev/null
+++ b/include/linux/phy/phy-sun4i-usb.h
@@ -0,0 +1,26 @@
1/*
2 * Copyright (c) 2015 Hans de Goede <hdegoede@redhat.com>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 and
6 * only version 2 as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 */
13
14#ifndef PHY_SUN4I_USB_H_
15#define PHY_SUN4I_USB_H_
16
17#include "phy.h"
18
19/**
20 * sun4i_usb_phy_set_squelch_detect() - Enable/disable squelch detect
21 * @phy: reference to a sun4i usb phy
22 * @enabled: wether to enable or disable squelch detect
23 */
24void sun4i_usb_phy_set_squelch_detect(struct phy *phy, bool enabled);
25
26#endif
diff --git a/include/linux/ulpi/driver.h b/include/linux/ulpi/driver.h
new file mode 100644
index 000000000000..388f6e08b9d4
--- /dev/null
+++ b/include/linux/ulpi/driver.h
@@ -0,0 +1,60 @@
1#ifndef __LINUX_ULPI_DRIVER_H
2#define __LINUX_ULPI_DRIVER_H
3
4#include <linux/mod_devicetable.h>
5
6#include <linux/device.h>
7
8struct ulpi_ops;
9
10/**
11 * struct ulpi - describes ULPI PHY device
12 * @id: vendor and product ids for ULPI device
13 * @ops: I/O access
14 * @dev: device interface
15 */
16struct ulpi {
17 struct ulpi_device_id id;
18 struct ulpi_ops *ops;
19 struct device dev;
20};
21
22#define to_ulpi_dev(d) container_of(d, struct ulpi, dev)
23
24static inline void ulpi_set_drvdata(struct ulpi *ulpi, void *data)
25{
26 dev_set_drvdata(&ulpi->dev, data);
27}
28
29static inline void *ulpi_get_drvdata(struct ulpi *ulpi)
30{
31 return dev_get_drvdata(&ulpi->dev);
32}
33
34/**
35 * struct ulpi_driver - describes a ULPI PHY driver
36 * @id_table: array of device identifiers supported by this driver
37 * @probe: binds this driver to ULPI device
38 * @remove: unbinds this driver from ULPI device
39 * @driver: the name and owner members must be initialized by the drivers
40 */
41struct ulpi_driver {
42 const struct ulpi_device_id *id_table;
43 int (*probe)(struct ulpi *ulpi);
44 void (*remove)(struct ulpi *ulpi);
45 struct device_driver driver;
46};
47
48#define to_ulpi_driver(d) container_of(d, struct ulpi_driver, driver)
49
50int ulpi_register_driver(struct ulpi_driver *drv);
51void ulpi_unregister_driver(struct ulpi_driver *drv);
52
53#define module_ulpi_driver(__ulpi_driver) \
54 module_driver(__ulpi_driver, ulpi_register_driver, \
55 ulpi_unregister_driver)
56
57int ulpi_read(struct ulpi *ulpi, u8 addr);
58int ulpi_write(struct ulpi *ulpi, u8 addr, u8 val);
59
60#endif /* __LINUX_ULPI_DRIVER_H */
diff --git a/include/linux/ulpi/interface.h b/include/linux/ulpi/interface.h
new file mode 100644
index 000000000000..4de8ab491038
--- /dev/null
+++ b/include/linux/ulpi/interface.h
@@ -0,0 +1,23 @@
1#ifndef __LINUX_ULPI_INTERFACE_H
2#define __LINUX_ULPI_INTERFACE_H
3
4#include <linux/types.h>
5
6struct ulpi;
7
8/**
9 * struct ulpi_ops - ULPI register access
10 * @dev: the interface provider
11 * @read: read operation for ULPI register access
12 * @write: write operation for ULPI register access
13 */
14struct ulpi_ops {
15 struct device *dev;
16 int (*read)(struct ulpi_ops *ops, u8 addr);
17 int (*write)(struct ulpi_ops *ops, u8 addr, u8 val);
18};
19
20struct ulpi *ulpi_register_interface(struct device *, struct ulpi_ops *);
21void ulpi_unregister_interface(struct ulpi *);
22
23#endif /* __LINUX_ULPI_INTERFACE_H */
diff --git a/include/linux/ulpi/regs.h b/include/linux/ulpi/regs.h
new file mode 100644
index 000000000000..b5b8b8804560
--- /dev/null
+++ b/include/linux/ulpi/regs.h
@@ -0,0 +1,130 @@
1#ifndef __LINUX_ULPI_REGS_H
2#define __LINUX_ULPI_REGS_H
3
4/*
5 * Macros for Set and Clear
6 * See ULPI 1.1 specification to find the registers with Set and Clear offsets
7 */
8#define ULPI_SET(a) (a + 1)
9#define ULPI_CLR(a) (a + 2)
10
11/*
12 * Register Map
13 */
14#define ULPI_VENDOR_ID_LOW 0x00
15#define ULPI_VENDOR_ID_HIGH 0x01
16#define ULPI_PRODUCT_ID_LOW 0x02
17#define ULPI_PRODUCT_ID_HIGH 0x03
18#define ULPI_FUNC_CTRL 0x04
19#define ULPI_IFC_CTRL 0x07
20#define ULPI_OTG_CTRL 0x0a
21#define ULPI_USB_INT_EN_RISE 0x0d
22#define ULPI_USB_INT_EN_FALL 0x10
23#define ULPI_USB_INT_STS 0x13
24#define ULPI_USB_INT_LATCH 0x14
25#define ULPI_DEBUG 0x15
26#define ULPI_SCRATCH 0x16
27/* Optional Carkit Registers */
28#define ULPI_CARKIT_CTRL 0x19
29#define ULPI_CARKIT_INT_DELAY 0x1c
30#define ULPI_CARKIT_INT_EN 0x1d
31#define ULPI_CARKIT_INT_STS 0x20
32#define ULPI_CARKIT_INT_LATCH 0x21
33#define ULPI_CARKIT_PLS_CTRL 0x22
34/* Other Optional Registers */
35#define ULPI_TX_POS_WIDTH 0x25
36#define ULPI_TX_NEG_WIDTH 0x26
37#define ULPI_POLARITY_RECOVERY 0x27
38/* Access Extended Register Set */
39#define ULPI_ACCESS_EXTENDED 0x2f
40/* Vendor Specific */
41#define ULPI_VENDOR_SPECIFIC 0x30
42/* Extended Registers */
43#define ULPI_EXT_VENDOR_SPECIFIC 0x80
44
45/*
46 * Register Bits
47 */
48
49/* Function Control */
50#define ULPI_FUNC_CTRL_XCVRSEL BIT(0)
51#define ULPI_FUNC_CTRL_XCVRSEL_MASK 0x3
52#define ULPI_FUNC_CTRL_HIGH_SPEED 0x0
53#define ULPI_FUNC_CTRL_FULL_SPEED 0x1
54#define ULPI_FUNC_CTRL_LOW_SPEED 0x2
55#define ULPI_FUNC_CTRL_FS4LS 0x3
56#define ULPI_FUNC_CTRL_TERMSELECT BIT(2)
57#define ULPI_FUNC_CTRL_OPMODE BIT(3)
58#define ULPI_FUNC_CTRL_OPMODE_MASK (0x3 << 3)
59#define ULPI_FUNC_CTRL_OPMODE_NORMAL (0x0 << 3)
60#define ULPI_FUNC_CTRL_OPMODE_NONDRIVING (0x1 << 3)
61#define ULPI_FUNC_CTRL_OPMODE_DISABLE_NRZI (0x2 << 3)
62#define ULPI_FUNC_CTRL_OPMODE_NOSYNC_NOEOP (0x3 << 3)
63#define ULPI_FUNC_CTRL_RESET BIT(5)
64#define ULPI_FUNC_CTRL_SUSPENDM BIT(6)
65
66/* Interface Control */
67#define ULPI_IFC_CTRL_6_PIN_SERIAL_MODE BIT(0)
68#define ULPI_IFC_CTRL_3_PIN_SERIAL_MODE BIT(1)
69#define ULPI_IFC_CTRL_CARKITMODE BIT(2)
70#define ULPI_IFC_CTRL_CLOCKSUSPENDM BIT(3)
71#define ULPI_IFC_CTRL_AUTORESUME BIT(4)
72#define ULPI_IFC_CTRL_EXTERNAL_VBUS BIT(5)
73#define ULPI_IFC_CTRL_PASSTHRU BIT(6)
74#define ULPI_IFC_CTRL_PROTECT_IFC_DISABLE BIT(7)
75
76/* OTG Control */
77#define ULPI_OTG_CTRL_ID_PULLUP BIT(0)
78#define ULPI_OTG_CTRL_DP_PULLDOWN BIT(1)
79#define ULPI_OTG_CTRL_DM_PULLDOWN BIT(2)
80#define ULPI_OTG_CTRL_DISCHRGVBUS BIT(3)
81#define ULPI_OTG_CTRL_CHRGVBUS BIT(4)
82#define ULPI_OTG_CTRL_DRVVBUS BIT(5)
83#define ULPI_OTG_CTRL_DRVVBUS_EXT BIT(6)
84#define ULPI_OTG_CTRL_EXTVBUSIND BIT(7)
85
86/* USB Interrupt Enable Rising,
87 * USB Interrupt Enable Falling,
88 * USB Interrupt Status and
89 * USB Interrupt Latch
90 */
91#define ULPI_INT_HOST_DISCONNECT BIT(0)
92#define ULPI_INT_VBUS_VALID BIT(1)
93#define ULPI_INT_SESS_VALID BIT(2)
94#define ULPI_INT_SESS_END BIT(3)
95#define ULPI_INT_IDGRD BIT(4)
96
97/* Debug */
98#define ULPI_DEBUG_LINESTATE0 BIT(0)
99#define ULPI_DEBUG_LINESTATE1 BIT(1)
100
101/* Carkit Control */
102#define ULPI_CARKIT_CTRL_CARKITPWR BIT(0)
103#define ULPI_CARKIT_CTRL_IDGNDDRV BIT(1)
104#define ULPI_CARKIT_CTRL_TXDEN BIT(2)
105#define ULPI_CARKIT_CTRL_RXDEN BIT(3)
106#define ULPI_CARKIT_CTRL_SPKLEFTEN BIT(4)
107#define ULPI_CARKIT_CTRL_SPKRIGHTEN BIT(5)
108#define ULPI_CARKIT_CTRL_MICEN BIT(6)
109
110/* Carkit Interrupt Enable */
111#define ULPI_CARKIT_INT_EN_IDFLOAT_RISE BIT(0)
112#define ULPI_CARKIT_INT_EN_IDFLOAT_FALL BIT(1)
113#define ULPI_CARKIT_INT_EN_CARINTDET BIT(2)
114#define ULPI_CARKIT_INT_EN_DP_RISE BIT(3)
115#define ULPI_CARKIT_INT_EN_DP_FALL BIT(4)
116
117/* Carkit Interrupt Status and
118 * Carkit Interrupt Latch
119 */
120#define ULPI_CARKIT_INT_IDFLOAT BIT(0)
121#define ULPI_CARKIT_INT_CARINTDET BIT(1)
122#define ULPI_CARKIT_INT_DP BIT(2)
123
124/* Carkit Pulse Control*/
125#define ULPI_CARKIT_PLS_CTRL_TXPLSEN BIT(0)
126#define ULPI_CARKIT_PLS_CTRL_RXPLSEN BIT(1)
127#define ULPI_CARKIT_PLS_CTRL_SPKRLEFT_BIASEN BIT(2)
128#define ULPI_CARKIT_PLS_CTRL_SPKRRIGHT_BIASEN BIT(3)
129
130#endif /* __LINUX_ULPI_REGS_H */
diff --git a/include/linux/usb/msm_hsusb.h b/include/linux/usb/msm_hsusb.h
index 7dbecf9a4656..e55a1504266e 100644
--- a/include/linux/usb/msm_hsusb.h
+++ b/include/linux/usb/msm_hsusb.h
@@ -18,6 +18,7 @@
18#ifndef __ASM_ARCH_MSM_HSUSB_H 18#ifndef __ASM_ARCH_MSM_HSUSB_H
19#define __ASM_ARCH_MSM_HSUSB_H 19#define __ASM_ARCH_MSM_HSUSB_H
20 20
21#include <linux/extcon.h>
21#include <linux/types.h> 22#include <linux/types.h>
22#include <linux/usb/otg.h> 23#include <linux/usb/otg.h>
23#include <linux/clk.h> 24#include <linux/clk.h>
@@ -120,6 +121,17 @@ struct msm_otg_platform_data {
120}; 121};
121 122
122/** 123/**
124 * struct msm_usb_cable - structure for exteternal connector cable
125 * state tracking
126 * @nb: hold event notification callback
127 * @conn: used for notification registration
128 */
129struct msm_usb_cable {
130 struct notifier_block nb;
131 struct extcon_specific_cable_nb conn;
132};
133
134/**
123 * struct msm_otg: OTG driver data. Shared by HCD and DCD. 135 * struct msm_otg: OTG driver data. Shared by HCD and DCD.
124 * @otg: USB OTG Transceiver structure. 136 * @otg: USB OTG Transceiver structure.
125 * @pdata: otg device platform data. 137 * @pdata: otg device platform data.
@@ -138,6 +150,11 @@ struct msm_otg_platform_data {
138 * @chg_type: The type of charger attached. 150 * @chg_type: The type of charger attached.
139 * @dcd_retires: The retry count used to track Data contact 151 * @dcd_retires: The retry count used to track Data contact
140 * detection process. 152 * detection process.
153 * @manual_pullup: true if VBUS is not routed to USB controller/phy
154 * and controller driver therefore enables pull-up explicitly before
155 * starting controller using usbcmd run/stop bit.
156 * @vbus: VBUS signal state trakining, using extcon framework
157 * @id: ID signal state trakining, using extcon framework
141 */ 158 */
142struct msm_otg { 159struct msm_otg {
143 struct usb_phy phy; 160 struct usb_phy phy;
@@ -166,6 +183,11 @@ struct msm_otg {
166 struct reset_control *phy_rst; 183 struct reset_control *phy_rst;
167 struct reset_control *link_rst; 184 struct reset_control *link_rst;
168 int vdd_levels[3]; 185 int vdd_levels[3];
186
187 bool manual_pullup;
188
189 struct msm_usb_cable vbus;
190 struct msm_usb_cable id;
169}; 191};
170 192
171#endif 193#endif
diff --git a/include/linux/usb/msm_hsusb_hw.h b/include/linux/usb/msm_hsusb_hw.h
index a29f6030afb1..e159b39f67a2 100644
--- a/include/linux/usb/msm_hsusb_hw.h
+++ b/include/linux/usb/msm_hsusb_hw.h
@@ -21,6 +21,8 @@
21 21
22#define USB_AHBBURST (MSM_USB_BASE + 0x0090) 22#define USB_AHBBURST (MSM_USB_BASE + 0x0090)
23#define USB_AHBMODE (MSM_USB_BASE + 0x0098) 23#define USB_AHBMODE (MSM_USB_BASE + 0x0098)
24#define USB_GENCONFIG_2 (MSM_USB_BASE + 0x00a0)
25
24#define USB_CAPLENGTH (MSM_USB_BASE + 0x0100) /* 8 bit */ 26#define USB_CAPLENGTH (MSM_USB_BASE + 0x0100) /* 8 bit */
25 27
26#define USB_USBCMD (MSM_USB_BASE + 0x0140) 28#define USB_USBCMD (MSM_USB_BASE + 0x0140)
@@ -30,6 +32,9 @@
30#define USB_PHY_CTRL (MSM_USB_BASE + 0x0240) 32#define USB_PHY_CTRL (MSM_USB_BASE + 0x0240)
31#define USB_PHY_CTRL2 (MSM_USB_BASE + 0x0278) 33#define USB_PHY_CTRL2 (MSM_USB_BASE + 0x0278)
32 34
35#define GENCONFIG_2_SESS_VLD_CTRL_EN BIT(7)
36#define USBCMD_SESS_VLD_CTRL BIT(25)
37
33#define USBCMD_RESET 2 38#define USBCMD_RESET 2
34#define USB_USBINTR (MSM_USB_BASE + 0x0148) 39#define USB_USBINTR (MSM_USB_BASE + 0x0148)
35 40
@@ -50,6 +55,10 @@
50#define ULPI_PWR_CLK_MNG_REG 0x88 55#define ULPI_PWR_CLK_MNG_REG 0x88
51#define OTG_COMP_DISABLE BIT(0) 56#define OTG_COMP_DISABLE BIT(0)
52 57
58#define ULPI_MISC_A 0x96
59#define ULPI_MISC_A_VBUSVLDEXTSEL BIT(1)
60#define ULPI_MISC_A_VBUSVLDEXT BIT(0)
61
53#define ASYNC_INTR_CTRL (1 << 29) /* Enable async interrupt */ 62#define ASYNC_INTR_CTRL (1 << 29) /* Enable async interrupt */
54#define ULPI_STP_CTRL (1 << 30) /* Block communication with PHY */ 63#define ULPI_STP_CTRL (1 << 30) /* Block communication with PHY */
55#define PHY_RETEN (1 << 1) /* PHY retention enable/disable */ 64#define PHY_RETEN (1 << 1) /* PHY retention enable/disable */
diff --git a/include/linux/usb/net2280.h b/include/linux/usb/net2280.h
index 148b8fa5b1a2..725120224472 100644
--- a/include/linux/usb/net2280.h
+++ b/include/linux/usb/net2280.h
@@ -168,6 +168,9 @@ struct net2280_regs {
168#define ENDPOINT_B_INTERRUPT 2 168#define ENDPOINT_B_INTERRUPT 2
169#define ENDPOINT_A_INTERRUPT 1 169#define ENDPOINT_A_INTERRUPT 1
170#define ENDPOINT_0_INTERRUPT 0 170#define ENDPOINT_0_INTERRUPT 0
171#define USB3380_IRQSTAT0_EP_INTR_MASK_IN (0xF << 17)
172#define USB3380_IRQSTAT0_EP_INTR_MASK_OUT (0xF << 1)
173
171 u32 irqstat1; 174 u32 irqstat1;
172#define POWER_STATE_CHANGE_INTERRUPT 27 175#define POWER_STATE_CHANGE_INTERRUPT 27
173#define PCI_ARBITER_TIMEOUT_INTERRUPT 26 176#define PCI_ARBITER_TIMEOUT_INTERRUPT 26
diff --git a/include/linux/usb/phy.h b/include/linux/usb/phy.h
index bc91b5d380fd..e39f251cf861 100644
--- a/include/linux/usb/phy.h
+++ b/include/linux/usb/phy.h
@@ -205,6 +205,8 @@ extern struct usb_phy *usb_get_phy_dev(struct device *dev, u8 index);
205extern struct usb_phy *devm_usb_get_phy_dev(struct device *dev, u8 index); 205extern struct usb_phy *devm_usb_get_phy_dev(struct device *dev, u8 index);
206extern struct usb_phy *devm_usb_get_phy_by_phandle(struct device *dev, 206extern struct usb_phy *devm_usb_get_phy_by_phandle(struct device *dev,
207 const char *phandle, u8 index); 207 const char *phandle, u8 index);
208extern struct usb_phy *devm_usb_get_phy_by_node(struct device *dev,
209 struct device_node *node, struct notifier_block *nb);
208extern void usb_put_phy(struct usb_phy *); 210extern void usb_put_phy(struct usb_phy *);
209extern void devm_usb_put_phy(struct device *dev, struct usb_phy *x); 211extern void devm_usb_put_phy(struct device *dev, struct usb_phy *x);
210extern int usb_bind_phy(const char *dev_name, u8 index, 212extern int usb_bind_phy(const char *dev_name, u8 index,
@@ -238,6 +240,12 @@ static inline struct usb_phy *devm_usb_get_phy_by_phandle(struct device *dev,
238 return ERR_PTR(-ENXIO); 240 return ERR_PTR(-ENXIO);
239} 241}
240 242
243static inline struct usb_phy *devm_usb_get_phy_by_node(struct device *dev,
244 struct device_node *node, struct notifier_block *nb)
245{
246 return ERR_PTR(-ENXIO);
247}
248
241static inline void usb_put_phy(struct usb_phy *x) 249static inline void usb_put_phy(struct usb_phy *x)
242{ 250{
243} 251}
diff --git a/include/linux/usb/renesas_usbhs.h b/include/linux/usb/renesas_usbhs.h
index f06529c14141..3dd5a781da99 100644
--- a/include/linux/usb/renesas_usbhs.h
+++ b/include/linux/usb/renesas_usbhs.h
@@ -169,8 +169,7 @@ struct renesas_usbhs_driver_param {
169#define USBHS_USB_DMAC_XFER_SIZE 32 /* hardcode the xfer size */ 169#define USBHS_USB_DMAC_XFER_SIZE 32 /* hardcode the xfer size */
170}; 170};
171 171
172#define USBHS_TYPE_R8A7790 1 172#define USBHS_TYPE_RCAR_GEN2 1
173#define USBHS_TYPE_R8A7791 2
174 173
175/* 174/*
176 * option: 175 * option:
diff --git a/include/linux/usb/ulpi.h b/include/linux/usb/ulpi.h
index 5c295c26ad37..5f07407a367a 100644
--- a/include/linux/usb/ulpi.h
+++ b/include/linux/usb/ulpi.h
@@ -12,6 +12,8 @@
12#define __LINUX_USB_ULPI_H 12#define __LINUX_USB_ULPI_H
13 13
14#include <linux/usb/otg.h> 14#include <linux/usb/otg.h>
15#include <linux/ulpi/regs.h>
16
15/*-------------------------------------------------------------------------*/ 17/*-------------------------------------------------------------------------*/
16 18
17/* 19/*
@@ -49,138 +51,6 @@
49 51
50/*-------------------------------------------------------------------------*/ 52/*-------------------------------------------------------------------------*/
51 53
52/*
53 * Macros for Set and Clear
54 * See ULPI 1.1 specification to find the registers with Set and Clear offsets
55 */
56#define ULPI_SET(a) (a + 1)
57#define ULPI_CLR(a) (a + 2)
58
59/*-------------------------------------------------------------------------*/
60
61/*
62 * Register Map
63 */
64#define ULPI_VENDOR_ID_LOW 0x00
65#define ULPI_VENDOR_ID_HIGH 0x01
66#define ULPI_PRODUCT_ID_LOW 0x02
67#define ULPI_PRODUCT_ID_HIGH 0x03
68#define ULPI_FUNC_CTRL 0x04
69#define ULPI_IFC_CTRL 0x07
70#define ULPI_OTG_CTRL 0x0a
71#define ULPI_USB_INT_EN_RISE 0x0d
72#define ULPI_USB_INT_EN_FALL 0x10
73#define ULPI_USB_INT_STS 0x13
74#define ULPI_USB_INT_LATCH 0x14
75#define ULPI_DEBUG 0x15
76#define ULPI_SCRATCH 0x16
77/* Optional Carkit Registers */
78#define ULPI_CARCIT_CTRL 0x19
79#define ULPI_CARCIT_INT_DELAY 0x1c
80#define ULPI_CARCIT_INT_EN 0x1d
81#define ULPI_CARCIT_INT_STS 0x20
82#define ULPI_CARCIT_INT_LATCH 0x21
83#define ULPI_CARCIT_PLS_CTRL 0x22
84/* Other Optional Registers */
85#define ULPI_TX_POS_WIDTH 0x25
86#define ULPI_TX_NEG_WIDTH 0x26
87#define ULPI_POLARITY_RECOVERY 0x27
88/* Access Extended Register Set */
89#define ULPI_ACCESS_EXTENDED 0x2f
90/* Vendor Specific */
91#define ULPI_VENDOR_SPECIFIC 0x30
92/* Extended Registers */
93#define ULPI_EXT_VENDOR_SPECIFIC 0x80
94
95/*-------------------------------------------------------------------------*/
96
97/*
98 * Register Bits
99 */
100
101/* Function Control */
102#define ULPI_FUNC_CTRL_XCVRSEL (1 << 0)
103#define ULPI_FUNC_CTRL_XCVRSEL_MASK (3 << 0)
104#define ULPI_FUNC_CTRL_HIGH_SPEED (0 << 0)
105#define ULPI_FUNC_CTRL_FULL_SPEED (1 << 0)
106#define ULPI_FUNC_CTRL_LOW_SPEED (2 << 0)
107#define ULPI_FUNC_CTRL_FS4LS (3 << 0)
108#define ULPI_FUNC_CTRL_TERMSELECT (1 << 2)
109#define ULPI_FUNC_CTRL_OPMODE (1 << 3)
110#define ULPI_FUNC_CTRL_OPMODE_MASK (3 << 3)
111#define ULPI_FUNC_CTRL_OPMODE_NORMAL (0 << 3)
112#define ULPI_FUNC_CTRL_OPMODE_NONDRIVING (1 << 3)
113#define ULPI_FUNC_CTRL_OPMODE_DISABLE_NRZI (2 << 3)
114#define ULPI_FUNC_CTRL_OPMODE_NOSYNC_NOEOP (3 << 3)
115#define ULPI_FUNC_CTRL_RESET (1 << 5)
116#define ULPI_FUNC_CTRL_SUSPENDM (1 << 6)
117
118/* Interface Control */
119#define ULPI_IFC_CTRL_6_PIN_SERIAL_MODE (1 << 0)
120#define ULPI_IFC_CTRL_3_PIN_SERIAL_MODE (1 << 1)
121#define ULPI_IFC_CTRL_CARKITMODE (1 << 2)
122#define ULPI_IFC_CTRL_CLOCKSUSPENDM (1 << 3)
123#define ULPI_IFC_CTRL_AUTORESUME (1 << 4)
124#define ULPI_IFC_CTRL_EXTERNAL_VBUS (1 << 5)
125#define ULPI_IFC_CTRL_PASSTHRU (1 << 6)
126#define ULPI_IFC_CTRL_PROTECT_IFC_DISABLE (1 << 7)
127
128/* OTG Control */
129#define ULPI_OTG_CTRL_ID_PULLUP (1 << 0)
130#define ULPI_OTG_CTRL_DP_PULLDOWN (1 << 1)
131#define ULPI_OTG_CTRL_DM_PULLDOWN (1 << 2)
132#define ULPI_OTG_CTRL_DISCHRGVBUS (1 << 3)
133#define ULPI_OTG_CTRL_CHRGVBUS (1 << 4)
134#define ULPI_OTG_CTRL_DRVVBUS (1 << 5)
135#define ULPI_OTG_CTRL_DRVVBUS_EXT (1 << 6)
136#define ULPI_OTG_CTRL_EXTVBUSIND (1 << 7)
137
138/* USB Interrupt Enable Rising,
139 * USB Interrupt Enable Falling,
140 * USB Interrupt Status and
141 * USB Interrupt Latch
142 */
143#define ULPI_INT_HOST_DISCONNECT (1 << 0)
144#define ULPI_INT_VBUS_VALID (1 << 1)
145#define ULPI_INT_SESS_VALID (1 << 2)
146#define ULPI_INT_SESS_END (1 << 3)
147#define ULPI_INT_IDGRD (1 << 4)
148
149/* Debug */
150#define ULPI_DEBUG_LINESTATE0 (1 << 0)
151#define ULPI_DEBUG_LINESTATE1 (1 << 1)
152
153/* Carkit Control */
154#define ULPI_CARKIT_CTRL_CARKITPWR (1 << 0)
155#define ULPI_CARKIT_CTRL_IDGNDDRV (1 << 1)
156#define ULPI_CARKIT_CTRL_TXDEN (1 << 2)
157#define ULPI_CARKIT_CTRL_RXDEN (1 << 3)
158#define ULPI_CARKIT_CTRL_SPKLEFTEN (1 << 4)
159#define ULPI_CARKIT_CTRL_SPKRIGHTEN (1 << 5)
160#define ULPI_CARKIT_CTRL_MICEN (1 << 6)
161
162/* Carkit Interrupt Enable */
163#define ULPI_CARKIT_INT_EN_IDFLOAT_RISE (1 << 0)
164#define ULPI_CARKIT_INT_EN_IDFLOAT_FALL (1 << 1)
165#define ULPI_CARKIT_INT_EN_CARINTDET (1 << 2)
166#define ULPI_CARKIT_INT_EN_DP_RISE (1 << 3)
167#define ULPI_CARKIT_INT_EN_DP_FALL (1 << 4)
168
169/* Carkit Interrupt Status and
170 * Carkit Interrupt Latch
171 */
172#define ULPI_CARKIT_INT_IDFLOAT (1 << 0)
173#define ULPI_CARKIT_INT_CARINTDET (1 << 1)
174#define ULPI_CARKIT_INT_DP (1 << 2)
175
176/* Carkit Pulse Control*/
177#define ULPI_CARKIT_PLS_CTRL_TXPLSEN (1 << 0)
178#define ULPI_CARKIT_PLS_CTRL_RXPLSEN (1 << 1)
179#define ULPI_CARKIT_PLS_CTRL_SPKRLEFT_BIASEN (1 << 2)
180#define ULPI_CARKIT_PLS_CTRL_SPKRRIGHT_BIASEN (1 << 3)
181
182/*-------------------------------------------------------------------------*/
183
184#if IS_ENABLED(CONFIG_USB_ULPI) 54#if IS_ENABLED(CONFIG_USB_ULPI)
185struct usb_phy *otg_ulpi_create(struct usb_phy_io_ops *ops, 55struct usb_phy *otg_ulpi_create(struct usb_phy_io_ops *ops,
186 unsigned int flags); 56 unsigned int flags);
diff --git a/include/linux/usb/usb338x.h b/include/linux/usb/usb338x.h
index f92eb635b9d3..11525d8d89a7 100644
--- a/include/linux/usb/usb338x.h
+++ b/include/linux/usb/usb338x.h
@@ -43,6 +43,10 @@
43#define IN_ENDPOINT_TYPE 12 43#define IN_ENDPOINT_TYPE 12
44#define OUT_ENDPOINT_ENABLE 10 44#define OUT_ENDPOINT_ENABLE 10
45#define OUT_ENDPOINT_TYPE 8 45#define OUT_ENDPOINT_TYPE 8
46#define USB3380_EP_CFG_MASK_IN ((0x3 << IN_ENDPOINT_TYPE) | \
47 BIT(IN_ENDPOINT_ENABLE))
48#define USB3380_EP_CFG_MASK_OUT ((0x3 << OUT_ENDPOINT_TYPE) | \
49 BIT(OUT_ENDPOINT_ENABLE))
46 50
47struct usb338x_usb_ext_regs { 51struct usb338x_usb_ext_regs {
48 u32 usbclass; 52 u32 usbclass;
diff --git a/scripts/mod/devicetable-offsets.c b/scripts/mod/devicetable-offsets.c
index fce36d0f6898..ada8417362c7 100644
--- a/scripts/mod/devicetable-offsets.c
+++ b/scripts/mod/devicetable-offsets.c
@@ -189,5 +189,9 @@ int main(void)
189 DEVID_FIELD(rio_device_id, asm_did); 189 DEVID_FIELD(rio_device_id, asm_did);
190 DEVID_FIELD(rio_device_id, asm_vid); 190 DEVID_FIELD(rio_device_id, asm_vid);
191 191
192 DEVID(ulpi_device_id);
193 DEVID_FIELD(ulpi_device_id, vendor);
194 DEVID_FIELD(ulpi_device_id, product);
195
192 return 0; 196 return 0;
193} 197}
diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c
index 78691d51a479..a7a8560db44d 100644
--- a/scripts/mod/file2alias.c
+++ b/scripts/mod/file2alias.c
@@ -1192,6 +1192,19 @@ static int do_rio_entry(const char *filename,
1192} 1192}
1193ADD_TO_DEVTABLE("rapidio", rio_device_id, do_rio_entry); 1193ADD_TO_DEVTABLE("rapidio", rio_device_id, do_rio_entry);
1194 1194
1195/* Looks like: ulpi:vNpN */
1196static int do_ulpi_entry(const char *filename, void *symval,
1197 char *alias)
1198{
1199 DEF_FIELD(symval, ulpi_device_id, vendor);
1200 DEF_FIELD(symval, ulpi_device_id, product);
1201
1202 sprintf(alias, "ulpi:v%04xp%04x", vendor, product);
1203
1204 return 1;
1205}
1206ADD_TO_DEVTABLE("ulpi", ulpi_device_id, do_ulpi_entry);
1207
1195/* Does namelen bytes of name exactly match the symbol? */ 1208/* Does namelen bytes of name exactly match the symbol? */
1196static bool sym_is(const char *name, unsigned namelen, const char *symbol) 1209static bool sym_is(const char *name, unsigned namelen, const char *symbol)
1197{ 1210{