Merge tag 'usb-for-v5.3' of git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb...
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 1 Jul 2019 10:01:33 +0000 (12:01 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 1 Jul 2019 10:01:33 +0000 (12:01 +0200)
Felipe writes:

usb: changes for v5.3 merge window

The biggest part here is a set of patches removing unnecesary variables
from several drivers.

Meson-g12a's dwc3 glue implemented IRQ-based OTG/DRD role swap.

Qcom's dwc3 glue added support for ACPI, mainly for the AArch64-based
SoCs.

DWC3 also got support for Intel Elkhart Lake platforms.

* tag 'usb-for-v5.3' of git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb: (30 commits)
  usb: dwc3: remove unused @lock member of dwc3_ep struct
  usb: dwc3: pci: Add Support for Intel Elkhart Lake Devices
  usb: Replace snprintf with scnprintf in gether_get_ifname
  usb: gadget: ether: Fix race between gether_disconnect and rx_submit
  usb: gadget: storage: Remove warning message
  usb: dwc3: gadget: Add support for disabling U1 and U2 entries
  usb: gadget: send usb_gadget as an argument in get_config_params
  doc: dt: bindings: usb: dwc3: Update entries for disabling U1 and U2
  usb: dwc3: qcom: Use of_clk_get_parent_count()
  usb: dwc3: Fix core validation in probe, move after clocks are enabled
  usb: dwc3: qcom: Improve error handling
  usb: dwc3: qcom: Start USB in 'host mode' on the SDM845
  usb: dwc3: qcom: Add support for booting with ACPI
  soc: qcom: geni: Add support for ACPI
  Revert "usb: dwc2: host: Setting qtd to NULL after freeing it"
  usb: gadget: net2272: remove redundant assignments to pointer 's'
  usb: gadget: Zero ffs_io_data
  USB: omap_udc: Remove unneeded variable
  fotg210-udc: Remove unneeded variable
  usb: gadget: at91_udc: Remove unneeded variable
  ...

1  2 
drivers/usb/dwc2/params.c
drivers/usb/dwc2/platform.c
drivers/usb/gadget/function/f_mass_storage.c

@@@ -76,6 -76,7 +76,7 @@@ static void dwc2_set_s3c6400_params(str
        struct dwc2_core_params *p = &hsotg->params;
  
        p->power_down = 0;
+       p->phy_utmi_width = 8;
  }
  
  static void dwc2_set_rk_params(struct dwc2_hsotg *hsotg)
@@@ -253,15 -254,6 +254,15 @@@ static void dwc2_set_param_phy_utmi_wid
        val = (hsotg->hw_params.utmi_phy_data_width ==
               GHWCFG4_UTMI_PHY_DATA_WIDTH_8) ? 8 : 16;
  
 +      if (hsotg->phy) {
 +              /*
 +               * If using the generic PHY framework, check if the PHY bus
 +               * width is 8-bit and set the phyif appropriately.
 +               */
 +              if (phy_get_bus_width(hsotg->phy) == 8)
 +                      val = 8;
 +      }
 +
        hsotg->params.phy_utmi_width = val;
  }
  
@@@ -271,6 -271,15 +271,6 @@@ static int dwc2_lowlevel_hw_init(struc
  
        hsotg->plat = dev_get_platdata(hsotg->dev);
  
 -      if (hsotg->phy) {
 -              /*
 -               * If using the generic PHY framework, check if the PHY bus
 -               * width is 8-bit and set the phyif appropriately.
 -               */
 -              if (phy_get_bus_width(hsotg->phy) == 8)
 -                      hsotg->params.phy_utmi_width = 8;
 -      }
 -
        /* Clock */
        hsotg->clk = devm_clk_get_optional(hsotg->dev, "otg");
        if (IS_ERR(hsotg->clk)) {
@@@ -438,6 -447,10 +438,10 @@@ static int dwc2_driver_probe(struct pla
        if (retval)
                goto error;
  
+       hsotg->need_phy_for_wake =
+               of_property_read_bool(dev->dev.of_node,
+                                     "snps,need-phy-for-wake");
        /*
         * Reset before dwc2_get_hwparams() then it could get power-on real
         * reset value form registers.
                hsotg->gadget_enabled = 1;
        }
  
+       /*
+        * If we need PHY for wakeup we must be wakeup capable.
+        * When we have a device that can wake without the PHY we
+        * can adjust this condition.
+        */
+       if (hsotg->need_phy_for_wake)
+               device_set_wakeup_capable(&dev->dev, true);
        hsotg->reset_phy_on_wake =
                of_property_read_bool(dev->dev.of_node,
                                      "snps,reset-phy-on-wake");
@@@ -507,13 -528,17 +519,17 @@@ error
  static int __maybe_unused dwc2_suspend(struct device *dev)
  {
        struct dwc2_hsotg *dwc2 = dev_get_drvdata(dev);
+       bool is_device_mode = dwc2_is_device_mode(dwc2);
        int ret = 0;
  
-       if (dwc2_is_device_mode(dwc2))
+       if (is_device_mode)
                dwc2_hsotg_suspend(dwc2);
  
-       if (dwc2->ll_hw_enabled)
+       if (dwc2->ll_hw_enabled &&
+           (is_device_mode || dwc2_host_can_poweroff_phy(dwc2))) {
                ret = __dwc2_lowlevel_hw_disable(dwc2);
+               dwc2->phy_off_for_suspend = true;
+       }
  
        return ret;
  }
@@@ -523,11 -548,12 +539,12 @@@ static int __maybe_unused dwc2_resume(s
        struct dwc2_hsotg *dwc2 = dev_get_drvdata(dev);
        int ret = 0;
  
-       if (dwc2->ll_hw_enabled) {
+       if (dwc2->phy_off_for_suspend && dwc2->ll_hw_enabled) {
                ret = __dwc2_lowlevel_hw_enable(dwc2);
                if (ret)
                        return ret;
        }
+       dwc2->phy_off_for_suspend = false;
  
        if (dwc2_is_device_mode(dwc2))
                ret = dwc2_hsotg_resume(dwc2);
@@@ -47,7 -47,7 +47,7 @@@
   *
   * For more information about MSF and in particular its module
   * parameters and sysfs interface read the
 - * <Documentation/usb/mass-storage.txt> file.
 + * <Documentation/usb/mass-storage.rst> file.
   */
  
  /*
@@@ -2293,8 -2293,7 +2293,7 @@@ static int fsg_set_alt(struct usb_funct
  static void fsg_disable(struct usb_function *f)
  {
        struct fsg_dev *fsg = fsg_from_func(f);
-       fsg->common->new_fsg = NULL;
-       raise_exception(fsg->common, FSG_STATE_CONFIG_CHANGE);
+       raise_exception(fsg->common, FSG_STATE_DISCONNECT);
  }
  
  
@@@ -2307,6 -2306,7 +2306,7 @@@ static void handle_exception(struct fsg
        enum fsg_state          old_state;
        struct fsg_lun          *curlun;
        unsigned int            exception_req_tag;
+       struct fsg_dev          *fsg;
  
        /*
         * Clear the existing signals.  Anything but SIGUSR1 is converted
                break;
  
        case FSG_STATE_CONFIG_CHANGE:
-               do_set_interface(common, common->new_fsg);
-               if (common->new_fsg)
+               fsg = common->new_fsg;
+               /*
+                * Add a check here to double confirm if a disconnect event
+                * occurs and common->new_fsg has been cleared.
+                */
+               if (fsg) {
+                       do_set_interface(common, fsg);
                        usb_composite_setup_continue(common->cdev);
+               }
+               break;
+       case FSG_STATE_DISCONNECT:
+               do_set_interface(common, NULL);
                break;
  
        case FSG_STATE_EXIT:
@@@ -2989,8 -2999,7 +2999,7 @@@ static void fsg_unbind(struct usb_confi
  
        DBG(fsg, "unbind\n");
        if (fsg->common->fsg == fsg) {
-               fsg->common->new_fsg = NULL;
-               raise_exception(fsg->common, FSG_STATE_CONFIG_CHANGE);
+               raise_exception(fsg->common, FSG_STATE_DISCONNECT);
                /* FIXME: make interruptible or killable somehow? */
                wait_event(common->fsg_wait, common->fsg != fsg);
        }