Commit 5799aecd authored by Minas Harutyunyan's avatar Minas Harutyunyan Committed by Felipe Balbi
Browse files

usb: dwc2: Fix channel disable flow



Channel disabling/halting should performed for enabled only channels
to avoid warnings "Unable to clear enable on channel N" which seen
if host works in Slave mode.

Signed-off-by: default avatarMinas Harutyunyan <hminas@synopsys.com>
Signed-off-by: default avatarFelipe Balbi <felipe.balbi@linux.intel.com>
parent c8006f67
Loading
Loading
Loading
Loading
+20 −14
Original line number Diff line number Diff line
@@ -2247,15 +2247,18 @@ static void dwc2_core_host_init(struct dwc2_hsotg *hsotg)
		num_channels = hsotg->params.host_channels;
		for (i = 0; i < num_channels; i++) {
			hcchar = dwc2_readl(hsotg, HCCHAR(i));
			if (hcchar & HCCHAR_CHENA) {
				hcchar &= ~HCCHAR_CHENA;
				hcchar |= HCCHAR_CHDIS;
				hcchar &= ~HCCHAR_EPDIR;
				dwc2_writel(hsotg, hcchar, HCCHAR(i));
			}
		}

		/* Halt all channels to put them into a known state */
		for (i = 0; i < num_channels; i++) {
			hcchar = dwc2_readl(hsotg, HCCHAR(i));
			if (hcchar & HCCHAR_CHENA) {
				hcchar |= HCCHAR_CHENA | HCCHAR_CHDIS;
				hcchar &= ~HCCHAR_EPDIR;
				dwc2_writel(hsotg, hcchar, HCCHAR(i));
@@ -2263,12 +2266,15 @@ static void dwc2_core_host_init(struct dwc2_hsotg *hsotg)
					__func__, i);

				if (dwc2_hsotg_wait_bit_clear(hsotg, HCCHAR(i),
						      HCCHAR_CHENA, 1000)) {
				dev_warn(hsotg->dev, "Unable to clear enable on channel %d\n",
							      HCCHAR_CHENA,
							      1000)) {
					dev_warn(hsotg->dev,
						 "Unable to clear enable on channel %d\n",
						 i);
				}
			}
		}
	}

	/* Enable ACG feature in host mode, if supported */
	dwc2_enable_acg(hsotg);