diff options
| author | Linus Torvalds <[email protected]> | 2017-07-03 19:30:55 -0700 | 
|---|---|---|
| committer | Linus Torvalds <[email protected]> | 2017-07-03 19:30:55 -0700 | 
| commit | 362f6729cbb1d6bbab59e069f19441b0622ff7ec (patch) | |
| tree | 654070221092c34c97f48fbbdef7d5f02ffc7ba4 /drivers/usb/chipidea/core.c | |
| parent | 4422d80ed7d4bdb2d6e9fb890c66c3d9250ba694 (diff) | |
| parent | 6836796de4019944f4ba4c99a360e8250fd2e735 (diff) | |
Merge tag 'usb-4.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
Pull USB/PHY updates from Greg KH:
 "Here is the big patchset of USB and PHY driver updates for 4.13-rc1.
  On the PHY side, they decided to move files around to "make things
  easier" in their tree. Hopefully that wasn't a mistake, but in
  linux-next testing, we haven't had any reported problems.
  There's the usual set of gadget and xhci and musb updates in here as
  well, along with a number of smaller updates for a raft of different
  USB drivers. Full details in the shortlog, nothing really major.
  All of these have been in linux-next for a while with no reported
  issues"
* tag 'usb-4.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb: (173 commits)
  Add USB quirk for HVR-950q to avoid intermittent device resets
  USB hub_probe: rework ugly goto-into-compound-statement
  usb: host: ohci-pxa27x: Handle return value of clk_prepare_enable
  USB: serial: cp210x: add ID for CEL EM3588 USB ZigBee stick
  usbip: Fix uninitialized variable bug in vhci
  usb: core: read USB ports from DT in the usbport LED trigger driver
  dt-bindings: leds: document new trigger-sources property
  usb: typec: ucsi: Add ACPI driver
  usb: typec: Add support for UCSI interface
  usb: musb: compress return logic into one line
  USB: serial: propagate late probe errors
  USB: serial: refactor port endpoint setup
  usb: musb: tusb6010_omap: Convert to DMAengine API
  ARM: OMAP2+: DMA: Add slave map entries for 24xx external request lines
  usb: musb: tusb6010: Handle DMA TX completion in DMA callback as well
  usb: musb: tusb6010_omap: Allocate DMA channels upfront
  usb: musb: tusb6010_omap: Create new struct for DMA data/parameters
  usb: musb: tusb6010_omap: Use one musb_ep_select call in tusb_omap_dma_program
  usb: musb: tusb6010: Add MUSB_G_NO_SKB_RESERVE to quirks
  usb: musb: Add quirk to avoid skb reserve in gadget mode
  ...
Diffstat (limited to 'drivers/usb/chipidea/core.c')
| -rw-r--r-- | drivers/usb/chipidea/core.c | 29 | 
1 files changed, 21 insertions, 8 deletions
diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c index fe4fe2440729..b17ed3a9a304 100644 --- a/drivers/usb/chipidea/core.c +++ b/drivers/usb/chipidea/core.c @@ -818,7 +818,7 @@ static inline void ci_role_destroy(struct ci_hdrc *ci)  {  	ci_hdrc_gadget_destroy(ci);  	ci_hdrc_host_destroy(ci); -	if (ci->is_otg) +	if (ci->is_otg && ci->roles[CI_ROLE_GADGET])  		ci_hdrc_otg_destroy(ci);  } @@ -980,27 +980,35 @@ static int ci_hdrc_probe(struct platform_device *pdev)  	/* initialize role(s) before the interrupt is requested */  	if (dr_mode == USB_DR_MODE_OTG || dr_mode == USB_DR_MODE_HOST) {  		ret = ci_hdrc_host_init(ci); -		if (ret) -			dev_info(dev, "doesn't support host\n"); +		if (ret) { +			if (ret == -ENXIO) +				dev_info(dev, "doesn't support host\n"); +			else +				goto deinit_phy; +		}  	}  	if (dr_mode == USB_DR_MODE_OTG || dr_mode == USB_DR_MODE_PERIPHERAL) {  		ret = ci_hdrc_gadget_init(ci); -		if (ret) -			dev_info(dev, "doesn't support gadget\n"); +		if (ret) { +			if (ret == -ENXIO) +				dev_info(dev, "doesn't support gadget\n"); +			else +				goto deinit_host; +		}  	}  	if (!ci->roles[CI_ROLE_HOST] && !ci->roles[CI_ROLE_GADGET]) {  		dev_err(dev, "no supported roles\n");  		ret = -ENODEV; -		goto deinit_phy; +		goto deinit_gadget;  	}  	if (ci->is_otg && ci->roles[CI_ROLE_GADGET]) {  		ret = ci_hdrc_otg_init(ci);  		if (ret) {  			dev_err(dev, "init otg fails, ret = %d\n", ret); -			goto stop; +			goto deinit_gadget;  		}  	} @@ -1070,7 +1078,12 @@ static int ci_hdrc_probe(struct platform_device *pdev)  remove_debug:  	dbg_remove_files(ci);  stop: -	ci_role_destroy(ci); +	if (ci->is_otg && ci->roles[CI_ROLE_GADGET]) +		ci_hdrc_otg_destroy(ci); +deinit_gadget: +	ci_hdrc_gadget_destroy(ci); +deinit_host: +	ci_hdrc_host_destroy(ci);  deinit_phy:  	ci_usb_phy_exit(ci);  ulpi_exit:  |