core.c 25.0 KB
Newer Older
1 2 3 4 5 6 7 8
/**
 * core.c - DesignWare USB3 DRD Controller Core file
 *
 * Copyright (C) 2010-2011 Texas Instruments Incorporated - http://www.ti.com
 *
 * Authors: Felipe Balbi <balbi@ti.com>,
 *	    Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 *
F
Felipe Balbi 已提交
9 10 11
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2  of
 * the License as published by the Free Software Foundation.
12
 *
F
Felipe Balbi 已提交
13 14 15 16
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
17
 *
F
Felipe Balbi 已提交
18 19
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
20 21
 */

22
#include <linux/version.h>
23
#include <linux/module.h>
24 25 26 27 28 29 30 31 32 33 34
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/spinlock.h>
#include <linux/platform_device.h>
#include <linux/pm_runtime.h>
#include <linux/interrupt.h>
#include <linux/ioport.h>
#include <linux/io.h>
#include <linux/list.h>
#include <linux/delay.h>
#include <linux/dma-mapping.h>
35
#include <linux/of.h>
H
Heikki Krogerus 已提交
36
#include <linux/acpi.h>
37 38 39

#include <linux/usb/ch9.h>
#include <linux/usb/gadget.h>
40
#include <linux/usb/of.h>
41
#include <linux/usb/otg.h>
42

43
#include "platform_data.h"
44 45 46 47 48 49
#include "core.h"
#include "gadget.h"
#include "io.h"

#include "debug.h"

50 51
/* -------------------------------------------------------------------------- */

52 53 54 55 56 57 58 59 60
void dwc3_set_mode(struct dwc3 *dwc, u32 mode)
{
	u32 reg;

	reg = dwc3_readl(dwc->regs, DWC3_GCTL);
	reg &= ~(DWC3_GCTL_PRTCAPDIR(DWC3_GCTL_PRTCAP_OTG));
	reg |= DWC3_GCTL_PRTCAPDIR(mode);
	dwc3_writel(dwc->regs, DWC3_GCTL, reg);
}
61

62 63 64 65
/**
 * dwc3_core_soft_reset - Issues core soft reset and PHY reset
 * @dwc: pointer to our context structure
 */
66
static int dwc3_core_soft_reset(struct dwc3 *dwc)
67 68
{
	u32		reg;
69
	int		ret;
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85

	/* Before Resetting PHY, put Core in Reset */
	reg = dwc3_readl(dwc->regs, DWC3_GCTL);
	reg |= DWC3_GCTL_CORESOFTRESET;
	dwc3_writel(dwc->regs, DWC3_GCTL, reg);

	/* Assert USB3 PHY reset */
	reg = dwc3_readl(dwc->regs, DWC3_GUSB3PIPECTL(0));
	reg |= DWC3_GUSB3PIPECTL_PHYSOFTRST;
	dwc3_writel(dwc->regs, DWC3_GUSB3PIPECTL(0), reg);

	/* Assert USB2 PHY reset */
	reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0));
	reg |= DWC3_GUSB2PHYCFG_PHYSOFTRST;
	dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg);

F
Felipe Balbi 已提交
86 87
	usb_phy_init(dwc->usb2_phy);
	usb_phy_init(dwc->usb3_phy);
88 89 90 91 92 93 94 95 96
	ret = phy_init(dwc->usb2_generic_phy);
	if (ret < 0)
		return ret;

	ret = phy_init(dwc->usb3_generic_phy);
	if (ret < 0) {
		phy_exit(dwc->usb2_generic_phy);
		return ret;
	}
97 98 99 100 101 102 103 104 105 106 107 108
	mdelay(100);

	/* Clear USB3 PHY reset */
	reg = dwc3_readl(dwc->regs, DWC3_GUSB3PIPECTL(0));
	reg &= ~DWC3_GUSB3PIPECTL_PHYSOFTRST;
	dwc3_writel(dwc->regs, DWC3_GUSB3PIPECTL(0), reg);

	/* Clear USB2 PHY reset */
	reg = dwc3_readl(dwc->regs, DWC3_GUSB2PHYCFG(0));
	reg &= ~DWC3_GUSB2PHYCFG_PHYSOFTRST;
	dwc3_writel(dwc->regs, DWC3_GUSB2PHYCFG(0), reg);

109 110
	mdelay(100);

111 112 113 114
	/* After PHYs are stable we can take Core out of reset state */
	reg = dwc3_readl(dwc->regs, DWC3_GCTL);
	reg &= ~DWC3_GCTL_CORESOFTRESET;
	dwc3_writel(dwc->regs, DWC3_GCTL, reg);
115 116

	return 0;
117 118 119 120 121 122 123 124 125 126 127 128 129 130
}

/**
 * dwc3_free_one_event_buffer - Frees one event buffer
 * @dwc: Pointer to our controller context structure
 * @evt: Pointer to event buffer to be freed
 */
static void dwc3_free_one_event_buffer(struct dwc3 *dwc,
		struct dwc3_event_buffer *evt)
{
	dma_free_coherent(dwc->dev, evt->length, evt->buf, evt->dma);
}

/**
131
 * dwc3_alloc_one_event_buffer - Allocates one event buffer structure
132 133 134
 * @dwc: Pointer to our controller context structure
 * @length: size of the event buffer
 *
135
 * Returns a pointer to the allocated event buffer structure on success
136 137
 * otherwise ERR_PTR(errno).
 */
138 139
static struct dwc3_event_buffer *dwc3_alloc_one_event_buffer(struct dwc3 *dwc,
		unsigned length)
140 141 142
{
	struct dwc3_event_buffer	*evt;

143
	evt = devm_kzalloc(dwc->dev, sizeof(*evt), GFP_KERNEL);
144 145 146 147 148 149 150
	if (!evt)
		return ERR_PTR(-ENOMEM);

	evt->dwc	= dwc;
	evt->length	= length;
	evt->buf	= dma_alloc_coherent(dwc->dev, length,
			&evt->dma, GFP_KERNEL);
151
	if (!evt->buf)
152 153 154 155 156 157 158 159 160 161 162 163 164 165
		return ERR_PTR(-ENOMEM);

	return evt;
}

/**
 * dwc3_free_event_buffers - frees all allocated event buffers
 * @dwc: Pointer to our controller context structure
 */
static void dwc3_free_event_buffers(struct dwc3 *dwc)
{
	struct dwc3_event_buffer	*evt;
	int i;

166
	for (i = 0; i < dwc->num_event_buffers; i++) {
167
		evt = dwc->ev_buffs[i];
168
		if (evt)
169 170 171 172 173 174
			dwc3_free_one_event_buffer(dwc, evt);
	}
}

/**
 * dwc3_alloc_event_buffers - Allocates @num event buffers of size @length
175
 * @dwc: pointer to our controller context structure
176 177
 * @length: size of event buffer
 *
178
 * Returns 0 on success otherwise negative errno. In the error case, dwc
179 180
 * may contain some buffers allocated but not all which were requested.
 */
B
Bill Pemberton 已提交
181
static int dwc3_alloc_event_buffers(struct dwc3 *dwc, unsigned length)
182
{
183
	int			num;
184 185
	int			i;

186 187 188
	num = DWC3_NUM_INT(dwc->hwparams.hwparams1);
	dwc->num_event_buffers = num;

189 190
	dwc->ev_buffs = devm_kzalloc(dwc->dev, sizeof(*dwc->ev_buffs) * num,
			GFP_KERNEL);
191
	if (!dwc->ev_buffs)
192 193
		return -ENOMEM;

194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
	for (i = 0; i < num; i++) {
		struct dwc3_event_buffer	*evt;

		evt = dwc3_alloc_one_event_buffer(dwc, length);
		if (IS_ERR(evt)) {
			dev_err(dwc->dev, "can't allocate event buffer\n");
			return PTR_ERR(evt);
		}
		dwc->ev_buffs[i] = evt;
	}

	return 0;
}

/**
 * dwc3_event_buffers_setup - setup our allocated event buffers
210
 * @dwc: pointer to our controller context structure
211 212 213
 *
 * Returns 0 on success otherwise negative errno.
 */
214
static int dwc3_event_buffers_setup(struct dwc3 *dwc)
215 216 217 218
{
	struct dwc3_event_buffer	*evt;
	int				n;

219
	for (n = 0; n < dwc->num_event_buffers; n++) {
220 221 222 223 224
		evt = dwc->ev_buffs[n];
		dev_dbg(dwc->dev, "Event buf %p dma %08llx length %d\n",
				evt->buf, (unsigned long long) evt->dma,
				evt->length);

225 226
		evt->lpos = 0;

227 228 229 230 231
		dwc3_writel(dwc->regs, DWC3_GEVNTADRLO(n),
				lower_32_bits(evt->dma));
		dwc3_writel(dwc->regs, DWC3_GEVNTADRHI(n),
				upper_32_bits(evt->dma));
		dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(n),
232
				DWC3_GEVNTSIZ_SIZE(evt->length));
233 234 235 236 237 238 239 240 241 242 243
		dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(n), 0);
	}

	return 0;
}

static void dwc3_event_buffers_cleanup(struct dwc3 *dwc)
{
	struct dwc3_event_buffer	*evt;
	int				n;

244
	for (n = 0; n < dwc->num_event_buffers; n++) {
245
		evt = dwc->ev_buffs[n];
246 247 248

		evt->lpos = 0;

249 250
		dwc3_writel(dwc->regs, DWC3_GEVNTADRLO(n), 0);
		dwc3_writel(dwc->regs, DWC3_GEVNTADRHI(n), 0);
251 252
		dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(n), DWC3_GEVNTSIZ_INTMASK
				| DWC3_GEVNTSIZ_SIZE(0));
253 254 255 256
		dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(n), 0);
	}
}

257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340
static int dwc3_alloc_scratch_buffers(struct dwc3 *dwc)
{
	if (!dwc->has_hibernation)
		return 0;

	if (!dwc->nr_scratch)
		return 0;

	dwc->scratchbuf = kmalloc_array(dwc->nr_scratch,
			DWC3_SCRATCHBUF_SIZE, GFP_KERNEL);
	if (!dwc->scratchbuf)
		return -ENOMEM;

	return 0;
}

static int dwc3_setup_scratch_buffers(struct dwc3 *dwc)
{
	dma_addr_t scratch_addr;
	u32 param;
	int ret;

	if (!dwc->has_hibernation)
		return 0;

	if (!dwc->nr_scratch)
		return 0;

	 /* should never fall here */
	if (!WARN_ON(dwc->scratchbuf))
		return 0;

	scratch_addr = dma_map_single(dwc->dev, dwc->scratchbuf,
			dwc->nr_scratch * DWC3_SCRATCHBUF_SIZE,
			DMA_BIDIRECTIONAL);
	if (dma_mapping_error(dwc->dev, scratch_addr)) {
		dev_err(dwc->dev, "failed to map scratch buffer\n");
		ret = -EFAULT;
		goto err0;
	}

	dwc->scratch_addr = scratch_addr;

	param = lower_32_bits(scratch_addr);

	ret = dwc3_send_gadget_generic_command(dwc,
			DWC3_DGCMD_SET_SCRATCHPAD_ADDR_LO, param);
	if (ret < 0)
		goto err1;

	param = upper_32_bits(scratch_addr);

	ret = dwc3_send_gadget_generic_command(dwc,
			DWC3_DGCMD_SET_SCRATCHPAD_ADDR_HI, param);
	if (ret < 0)
		goto err1;

	return 0;

err1:
	dma_unmap_single(dwc->dev, dwc->scratch_addr, dwc->nr_scratch *
			DWC3_SCRATCHBUF_SIZE, DMA_BIDIRECTIONAL);

err0:
	return ret;
}

static void dwc3_free_scratch_buffers(struct dwc3 *dwc)
{
	if (!dwc->has_hibernation)
		return;

	if (!dwc->nr_scratch)
		return;

	 /* should never fall here */
	if (!WARN_ON(dwc->scratchbuf))
		return;

	dma_unmap_single(dwc->dev, dwc->scratch_addr, dwc->nr_scratch *
			DWC3_SCRATCHBUF_SIZE, DMA_BIDIRECTIONAL);
	kfree(dwc->scratchbuf);
}

341 342 343 344 345 346 347 348 349 350 351
static void dwc3_core_num_eps(struct dwc3 *dwc)
{
	struct dwc3_hwparams	*parms = &dwc->hwparams;

	dwc->num_in_eps = DWC3_NUM_IN_EPS(parms);
	dwc->num_out_eps = DWC3_NUM_EPS(parms) - dwc->num_in_eps;

	dev_vdbg(dwc->dev, "found %d IN and %d OUT endpoints\n",
			dwc->num_in_eps, dwc->num_out_eps);
}

B
Bill Pemberton 已提交
352
static void dwc3_cache_hwparams(struct dwc3 *dwc)
353 354 355 356 357 358 359 360 361 362 363 364 365 366
{
	struct dwc3_hwparams	*parms = &dwc->hwparams;

	parms->hwparams0 = dwc3_readl(dwc->regs, DWC3_GHWPARAMS0);
	parms->hwparams1 = dwc3_readl(dwc->regs, DWC3_GHWPARAMS1);
	parms->hwparams2 = dwc3_readl(dwc->regs, DWC3_GHWPARAMS2);
	parms->hwparams3 = dwc3_readl(dwc->regs, DWC3_GHWPARAMS3);
	parms->hwparams4 = dwc3_readl(dwc->regs, DWC3_GHWPARAMS4);
	parms->hwparams5 = dwc3_readl(dwc->regs, DWC3_GHWPARAMS5);
	parms->hwparams6 = dwc3_readl(dwc->regs, DWC3_GHWPARAMS6);
	parms->hwparams7 = dwc3_readl(dwc->regs, DWC3_GHWPARAMS7);
	parms->hwparams8 = dwc3_readl(dwc->regs, DWC3_GHWPARAMS8);
}

367 368 369 370 371 372 373 374 375 376 377 378 379
/**
 * dwc3_phy_setup - Configure USB PHY Interface of DWC3 Core
 * @dwc: Pointer to our controller context structure
 */
static void dwc3_phy_setup(struct dwc3 *dwc)
{
	u32 reg;

	reg = dwc3_readl(dwc->regs, DWC3_GUSB3PIPECTL(0));

	if (dwc->u2ss_inp3_quirk)
		reg |= DWC3_GUSB3PIPECTL_U2SSINP3OK;

H
Huang Rui 已提交
380 381 382
	if (dwc->req_p1p2p3_quirk)
		reg |= DWC3_GUSB3PIPECTL_REQP1P2P3;

H
Huang Rui 已提交
383 384 385
	if (dwc->del_p1p2p3_quirk)
		reg |= DWC3_GUSB3PIPECTL_DEP1P2P3_EN;

386 387 388
	if (dwc->del_phy_power_chg_quirk)
		reg |= DWC3_GUSB3PIPECTL_DEPOCHANGE;

H
Huang Rui 已提交
389 390 391
	if (dwc->lfps_filter_quirk)
		reg |= DWC3_GUSB3PIPECTL_LFPSFILT;

392 393 394
	if (dwc->rx_detect_poll_quirk)
		reg |= DWC3_GUSB3PIPECTL_RX_DETOPOLL;

395 396 397 398 399
	dwc3_writel(dwc->regs, DWC3_GUSB3PIPECTL(0), reg);

	mdelay(100);
}

400 401 402 403 404 405
/**
 * dwc3_core_init - Low-level initialization of DWC3 Core
 * @dwc: Pointer to our controller context structure
 *
 * Returns 0 on success otherwise negative errno.
 */
B
Bill Pemberton 已提交
406
static int dwc3_core_init(struct dwc3 *dwc)
407 408
{
	unsigned long		timeout;
409
	u32			hwparams4 = dwc->hwparams.hwparams4;
410 411 412
	u32			reg;
	int			ret;

413 414 415 416 417 418 419
	reg = dwc3_readl(dwc->regs, DWC3_GSNPSID);
	/* This should read as U3 followed by revision number */
	if ((reg & DWC3_GSNPSID_MASK) != 0x55330000) {
		dev_err(dwc->dev, "this is not a DesignWare USB3 DRD Core\n");
		ret = -ENODEV;
		goto err0;
	}
420
	dwc->revision = reg;
421

422 423 424 425 426 427
	/*
	 * Write Linux Version Code to our GUID register so it's easy to figure
	 * out which kernel version a bug was found.
	 */
	dwc3_writel(dwc->regs, DWC3_GUID, LINUX_VERSION_CODE);

428 429 430 431 432 433 434
	/* Handle USB2.0-only core configuration */
	if (DWC3_GHWPARAMS3_SSPHY_IFC(dwc->hwparams.hwparams3) ==
			DWC3_GHWPARAMS3_SSPHY_IFC_DIS) {
		if (dwc->maximum_speed == USB_SPEED_SUPER)
			dwc->maximum_speed = USB_SPEED_HIGH;
	}

435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451
	/* issue device SoftReset too */
	timeout = jiffies + msecs_to_jiffies(500);
	dwc3_writel(dwc->regs, DWC3_DCTL, DWC3_DCTL_CSFTRST);
	do {
		reg = dwc3_readl(dwc->regs, DWC3_DCTL);
		if (!(reg & DWC3_DCTL_CSFTRST))
			break;

		if (time_after(jiffies, timeout)) {
			dev_err(dwc->dev, "Reset Timed Out\n");
			ret = -ETIMEDOUT;
			goto err0;
		}

		cpu_relax();
	} while (true);

452 453 454
	ret = dwc3_core_soft_reset(dwc);
	if (ret)
		goto err0;
455

456
	reg = dwc3_readl(dwc->regs, DWC3_GCTL);
457
	reg &= ~DWC3_GCTL_SCALEDOWN_MASK;
458

459
	switch (DWC3_GHWPARAMS1_EN_PWROPT(dwc->hwparams.hwparams1)) {
460
	case DWC3_GHWPARAMS1_EN_PWROPT_CLK:
461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479
		/**
		 * WORKAROUND: DWC3 revisions between 2.10a and 2.50a have an
		 * issue which would cause xHCI compliance tests to fail.
		 *
		 * Because of that we cannot enable clock gating on such
		 * configurations.
		 *
		 * Refers to:
		 *
		 * STAR#9000588375: Clock Gating, SOF Issues when ref_clk-Based
		 * SOF/ITP Mode Used
		 */
		if ((dwc->dr_mode == USB_DR_MODE_HOST ||
				dwc->dr_mode == USB_DR_MODE_OTG) &&
				(dwc->revision >= DWC3_REVISION_210A &&
				dwc->revision <= DWC3_REVISION_250A))
			reg |= DWC3_GCTL_DSBLCLKGTNG | DWC3_GCTL_SOFITPSYNC;
		else
			reg &= ~DWC3_GCTL_DSBLCLKGTNG;
480
		break;
481 482 483
	case DWC3_GHWPARAMS1_EN_PWROPT_HIB:
		/* enable hibernation here */
		dwc->nr_scratch = DWC3_GHWPARAMS4_HIBER_SCRATCHBUFS(hwparams4);
484 485 486 487 488 489

		/*
		 * REVISIT Enabling this bit so that host-mode hibernation
		 * will work. Device-mode hibernation is not yet implemented.
		 */
		reg |= DWC3_GCTL_GBLHIBERNATIONEN;
490
		break;
491 492 493 494
	default:
		dev_dbg(dwc->dev, "No power optimization available\n");
	}

495 496 497 498 499 500
	/* check if current dwc3 is on simulation board */
	if (dwc->hwparams.hwparams6 & DWC3_GHWPARAMS6_EN_FPGA) {
		dev_dbg(dwc->dev, "it is on FPGA board\n");
		dwc->is_fpga = true;
	}

H
Huang Rui 已提交
501 502 503 504 505 506 507 508
	WARN_ONCE(dwc->disable_scramble_quirk && !dwc->is_fpga,
			"disable_scramble cannot be used on non-FPGA builds\n");

	if (dwc->disable_scramble_quirk && dwc->is_fpga)
		reg |= DWC3_GCTL_DISSCRAMBLE;
	else
		reg &= ~DWC3_GCTL_DISSCRAMBLE;

H
Huang Rui 已提交
509 510 511
	if (dwc->u2exit_lfps_quirk)
		reg |= DWC3_GCTL_U2EXIT_LFPS;

512 513
	/*
	 * WORKAROUND: DWC3 revisions <1.90a have a bug
514
	 * where the device can fail to connect at SuperSpeed
515
	 * and falls back to high-speed mode which causes
516
	 * the device to enter a Connect/Disconnect loop
517 518 519 520
	 */
	if (dwc->revision < DWC3_REVISION_190A)
		reg |= DWC3_GCTL_U2RSTECN;

521 522
	dwc3_core_num_eps(dwc);

523 524
	dwc3_writel(dwc->regs, DWC3_GCTL, reg);

525 526
	dwc3_phy_setup(dwc);

527 528 529 530 531 532 533 534
	ret = dwc3_alloc_scratch_buffers(dwc);
	if (ret)
		goto err1;

	ret = dwc3_setup_scratch_buffers(dwc);
	if (ret)
		goto err2;

535 536
	return 0;

537 538 539 540 541 542
err2:
	dwc3_free_scratch_buffers(dwc);

err1:
	usb_phy_shutdown(dwc->usb2_phy);
	usb_phy_shutdown(dwc->usb3_phy);
543 544
	phy_exit(dwc->usb2_generic_phy);
	phy_exit(dwc->usb3_generic_phy);
545

546 547 548 549 550 551
err0:
	return ret;
}

static void dwc3_core_exit(struct dwc3 *dwc)
{
552
	dwc3_free_scratch_buffers(dwc);
553 554
	usb_phy_shutdown(dwc->usb2_phy);
	usb_phy_shutdown(dwc->usb3_phy);
555 556
	phy_exit(dwc->usb2_generic_phy);
	phy_exit(dwc->usb3_generic_phy);
557 558
}

559
static int dwc3_core_get_phy(struct dwc3 *dwc)
560
{
561
	struct device		*dev = dwc->dev;
F
Felipe Balbi 已提交
562
	struct device_node	*node = dev->of_node;
563
	int ret;
564

565 566 567
	if (node) {
		dwc->usb2_phy = devm_usb_get_phy_by_phandle(dev, "usb-phy", 0);
		dwc->usb3_phy = devm_usb_get_phy_by_phandle(dev, "usb-phy", 1);
568 569 570
	} else {
		dwc->usb2_phy = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2);
		dwc->usb3_phy = devm_usb_get_phy(dev, USB_PHY_TYPE_USB3);
571 572
	}

F
Felipe Balbi 已提交
573 574
	if (IS_ERR(dwc->usb2_phy)) {
		ret = PTR_ERR(dwc->usb2_phy);
575 576 577
		if (ret == -ENXIO || ret == -ENODEV) {
			dwc->usb2_phy = NULL;
		} else if (ret == -EPROBE_DEFER) {
F
Felipe Balbi 已提交
578
			return ret;
579 580 581 582
		} else {
			dev_err(dev, "no usb2 phy configured\n");
			return ret;
		}
F
Felipe Balbi 已提交
583 584
	}

F
Felipe Balbi 已提交
585
	if (IS_ERR(dwc->usb3_phy)) {
586
		ret = PTR_ERR(dwc->usb3_phy);
587 588 589
		if (ret == -ENXIO || ret == -ENODEV) {
			dwc->usb3_phy = NULL;
		} else if (ret == -EPROBE_DEFER) {
F
Felipe Balbi 已提交
590
			return ret;
591 592 593 594
		} else {
			dev_err(dev, "no usb3 phy configured\n");
			return ret;
		}
F
Felipe Balbi 已提交
595 596
	}

597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622
	dwc->usb2_generic_phy = devm_phy_get(dev, "usb2-phy");
	if (IS_ERR(dwc->usb2_generic_phy)) {
		ret = PTR_ERR(dwc->usb2_generic_phy);
		if (ret == -ENOSYS || ret == -ENODEV) {
			dwc->usb2_generic_phy = NULL;
		} else if (ret == -EPROBE_DEFER) {
			return ret;
		} else {
			dev_err(dev, "no usb2 phy configured\n");
			return ret;
		}
	}

	dwc->usb3_generic_phy = devm_phy_get(dev, "usb3-phy");
	if (IS_ERR(dwc->usb3_generic_phy)) {
		ret = PTR_ERR(dwc->usb3_generic_phy);
		if (ret == -ENOSYS || ret == -ENODEV) {
			dwc->usb3_generic_phy = NULL;
		} else if (ret == -EPROBE_DEFER) {
			return ret;
		} else {
			dev_err(dev, "no usb3 phy configured\n");
			return ret;
		}
	}

623 624 625
	return 0;
}

626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688
static int dwc3_core_init_mode(struct dwc3 *dwc)
{
	struct device *dev = dwc->dev;
	int ret;

	switch (dwc->dr_mode) {
	case USB_DR_MODE_PERIPHERAL:
		dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_DEVICE);
		ret = dwc3_gadget_init(dwc);
		if (ret) {
			dev_err(dev, "failed to initialize gadget\n");
			return ret;
		}
		break;
	case USB_DR_MODE_HOST:
		dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_HOST);
		ret = dwc3_host_init(dwc);
		if (ret) {
			dev_err(dev, "failed to initialize host\n");
			return ret;
		}
		break;
	case USB_DR_MODE_OTG:
		dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_OTG);
		ret = dwc3_host_init(dwc);
		if (ret) {
			dev_err(dev, "failed to initialize host\n");
			return ret;
		}

		ret = dwc3_gadget_init(dwc);
		if (ret) {
			dev_err(dev, "failed to initialize gadget\n");
			return ret;
		}
		break;
	default:
		dev_err(dev, "Unsupported mode of operation %d\n", dwc->dr_mode);
		return -EINVAL;
	}

	return 0;
}

static void dwc3_core_exit_mode(struct dwc3 *dwc)
{
	switch (dwc->dr_mode) {
	case USB_DR_MODE_PERIPHERAL:
		dwc3_gadget_exit(dwc);
		break;
	case USB_DR_MODE_HOST:
		dwc3_host_exit(dwc);
		break;
	case USB_DR_MODE_OTG:
		dwc3_host_exit(dwc);
		dwc3_gadget_exit(dwc);
		break;
	default:
		/* do nothing */
		break;
	}
}

689 690 691 692 693 694 695 696 697
#define DWC3_ALIGN_MASK		(16 - 1)

static int dwc3_probe(struct platform_device *pdev)
{
	struct device		*dev = &pdev->dev;
	struct dwc3_platform_data *pdata = dev_get_platdata(dev);
	struct device_node	*node = dev->of_node;
	struct resource		*res;
	struct dwc3		*dwc;
H
Huang Rui 已提交
698
	u8			lpm_nyet_threshold;
699

700
	int			ret;
701 702 703 704 705

	void __iomem		*regs;
	void			*mem;

	mem = devm_kzalloc(dev, sizeof(*dwc) + DWC3_ALIGN_MASK, GFP_KERNEL);
706
	if (!mem)
707
		return -ENOMEM;
708

709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728
	dwc = PTR_ALIGN(mem, DWC3_ALIGN_MASK + 1);
	dwc->mem = mem;
	dwc->dev = dev;

	res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
	if (!res) {
		dev_err(dev, "missing IRQ\n");
		return -ENODEV;
	}
	dwc->xhci_resources[1].start = res->start;
	dwc->xhci_resources[1].end = res->end;
	dwc->xhci_resources[1].flags = res->flags;
	dwc->xhci_resources[1].name = res->name;

	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!res) {
		dev_err(dev, "missing memory resource\n");
		return -ENODEV;
	}

729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753
	dwc->xhci_resources[0].start = res->start;
	dwc->xhci_resources[0].end = dwc->xhci_resources[0].start +
					DWC3_XHCI_REGS_END;
	dwc->xhci_resources[0].flags = res->flags;
	dwc->xhci_resources[0].name = res->name;

	res->start += DWC3_GLOBALS_REGS_START;

	/*
	 * Request memory region but exclude xHCI regs,
	 * since it will be requested by the xhci-plat driver.
	 */
	regs = devm_ioremap_resource(dev, res);
	if (IS_ERR(regs))
		return PTR_ERR(regs);

	dwc->regs	= regs;
	dwc->regs_size	= resource_size(res);
	/*
	 * restore res->start back to its original value so that,
	 * in case the probe is deferred, we don't end up getting error in
	 * request the memory region the next time probe is called.
	 */
	res->start -= DWC3_GLOBALS_REGS_START;

H
Huang Rui 已提交
754 755 756
	/* default to highest possible threshold */
	lpm_nyet_threshold = 0xff;

757 758
	if (node) {
		dwc->maximum_speed = of_usb_get_maximum_speed(node);
H
Huang Rui 已提交
759 760 761 762
		dwc->has_lpm_erratum = of_property_read_bool(node,
				"snps,has-lpm-erratum");
		of_property_read_u8(node, "snps,lpm-nyet-threshold",
				&lpm_nyet_threshold);
763

H
Huang Rui 已提交
764 765
		dwc->needs_fifo_resize = of_property_read_bool(node,
				"tx-fifo-resize");
766
		dwc->dr_mode = of_usb_get_dr_mode(node);
H
Huang Rui 已提交
767 768 769

		dwc->disable_scramble_quirk = of_property_read_bool(node,
				"snps,disable_scramble_quirk");
H
Huang Rui 已提交
770 771
		dwc->u2exit_lfps_quirk = of_property_read_bool(node,
				"snps,u2exit_lfps_quirk");
772 773
		dwc->u2ss_inp3_quirk = of_property_read_bool(node,
				"snps,u2ss_inp3_quirk");
H
Huang Rui 已提交
774 775
		dwc->req_p1p2p3_quirk = of_property_read_bool(node,
				"snps,req_p1p2p3_quirk");
H
Huang Rui 已提交
776 777
		dwc->del_p1p2p3_quirk = of_property_read_bool(node,
				"snps,del_p1p2p3_quirk");
778 779
		dwc->del_phy_power_chg_quirk = of_property_read_bool(node,
				"snps,del_phy_power_chg_quirk");
H
Huang Rui 已提交
780 781
		dwc->lfps_filter_quirk = of_property_read_bool(node,
				"snps,lfps_filter_quirk");
782 783
		dwc->rx_detect_poll_quirk = of_property_read_bool(node,
				"snps,rx_detect_poll_quirk");
784 785
	} else if (pdata) {
		dwc->maximum_speed = pdata->maximum_speed;
H
Huang Rui 已提交
786 787 788
		dwc->has_lpm_erratum = pdata->has_lpm_erratum;
		if (pdata->lpm_nyet_threshold)
			lpm_nyet_threshold = pdata->lpm_nyet_threshold;
789 790 791

		dwc->needs_fifo_resize = pdata->tx_fifo_resize;
		dwc->dr_mode = pdata->dr_mode;
H
Huang Rui 已提交
792 793

		dwc->disable_scramble_quirk = pdata->disable_scramble_quirk;
H
Huang Rui 已提交
794
		dwc->u2exit_lfps_quirk = pdata->u2exit_lfps_quirk;
795
		dwc->u2ss_inp3_quirk = pdata->u2ss_inp3_quirk;
H
Huang Rui 已提交
796
		dwc->req_p1p2p3_quirk = pdata->req_p1p2p3_quirk;
H
Huang Rui 已提交
797
		dwc->del_p1p2p3_quirk = pdata->del_p1p2p3_quirk;
798
		dwc->del_phy_power_chg_quirk = pdata->del_phy_power_chg_quirk;
H
Huang Rui 已提交
799
		dwc->lfps_filter_quirk = pdata->lfps_filter_quirk;
800
		dwc->rx_detect_poll_quirk = pdata->rx_detect_poll_quirk;
801 802 803 804 805 806
	}

	/* default to superspeed if no maximum_speed passed */
	if (dwc->maximum_speed == USB_SPEED_UNKNOWN)
		dwc->maximum_speed = USB_SPEED_SUPER;

H
Huang Rui 已提交
807 808
	dwc->lpm_nyet_threshold = lpm_nyet_threshold;

809 810 811 812
	ret = dwc3_core_get_phy(dwc);
	if (ret)
		return ret;

813 814 815
	spin_lock_init(&dwc->lock);
	platform_set_drvdata(pdev, dwc);

816 817 818 819 820
	if (!dev->dma_mask) {
		dev->dma_mask = dev->parent->dma_mask;
		dev->dma_parms = dev->parent->dma_parms;
		dma_set_coherent_mask(dev, dev->parent->coherent_dma_mask);
	}
821

C
Chanho Park 已提交
822 823 824
	pm_runtime_enable(dev);
	pm_runtime_get_sync(dev);
	pm_runtime_forbid(dev);
825

826 827
	dwc3_cache_hwparams(dwc);

828 829 830 831 832 833 834
	ret = dwc3_alloc_event_buffers(dwc, DWC3_EVENT_BUFFERS_SIZE);
	if (ret) {
		dev_err(dwc->dev, "failed to allocate event buffers\n");
		ret = -ENOMEM;
		goto err0;
	}

835 836 837 838 839 840 841 842
	if (IS_ENABLED(CONFIG_USB_DWC3_HOST))
		dwc->dr_mode = USB_DR_MODE_HOST;
	else if (IS_ENABLED(CONFIG_USB_DWC3_GADGET))
		dwc->dr_mode = USB_DR_MODE_PERIPHERAL;

	if (dwc->dr_mode == USB_DR_MODE_UNKNOWN)
		dwc->dr_mode = USB_DR_MODE_OTG;

843 844
	ret = dwc3_core_init(dwc);
	if (ret) {
C
Chanho Park 已提交
845
		dev_err(dev, "failed to initialize core\n");
846
		goto err0;
847 848
	}

849 850
	usb_phy_set_suspend(dwc->usb2_phy, 0);
	usb_phy_set_suspend(dwc->usb3_phy, 0);
851 852 853 854 855 856 857
	ret = phy_power_on(dwc->usb2_generic_phy);
	if (ret < 0)
		goto err1;

	ret = phy_power_on(dwc->usb3_generic_phy);
	if (ret < 0)
		goto err_usb2phy_power;
858

859 860 861
	ret = dwc3_event_buffers_setup(dwc);
	if (ret) {
		dev_err(dwc->dev, "failed to setup event buffers\n");
862
		goto err_usb3phy_power;
863 864
	}

865 866
	ret = dwc3_core_init_mode(dwc);
	if (ret)
867
		goto err2;
868 869 870

	ret = dwc3_debugfs_init(dwc);
	if (ret) {
C
Chanho Park 已提交
871
		dev_err(dev, "failed to initialize debugfs\n");
872
		goto err3;
873 874
	}

C
Chanho Park 已提交
875
	pm_runtime_allow(dev);
876 877 878

	return 0;

879
err3:
880
	dwc3_core_exit_mode(dwc);
881

882 883 884
err2:
	dwc3_event_buffers_cleanup(dwc);

885 886 887 888 889 890
err_usb3phy_power:
	phy_power_off(dwc->usb3_generic_phy);

err_usb2phy_power:
	phy_power_off(dwc->usb2_generic_phy);

891
err1:
892 893
	usb_phy_set_suspend(dwc->usb2_phy, 1);
	usb_phy_set_suspend(dwc->usb3_phy, 1);
C
Chanho Park 已提交
894
	dwc3_core_exit(dwc);
895

896 897 898
err0:
	dwc3_free_event_buffers(dwc);

899 900 901
	return ret;
}

B
Bill Pemberton 已提交
902
static int dwc3_remove(struct platform_device *pdev)
903 904 905
{
	struct dwc3	*dwc = platform_get_drvdata(pdev);

906 907 908 909 910
	dwc3_debugfs_exit(dwc);
	dwc3_core_exit_mode(dwc);
	dwc3_event_buffers_cleanup(dwc);
	dwc3_free_event_buffers(dwc);

911 912
	usb_phy_set_suspend(dwc->usb2_phy, 1);
	usb_phy_set_suspend(dwc->usb3_phy, 1);
913 914
	phy_power_off(dwc->usb2_generic_phy);
	phy_power_off(dwc->usb3_generic_phy);
915

916 917
	dwc3_core_exit(dwc);

918
	pm_runtime_put_sync(&pdev->dev);
919 920 921 922 923
	pm_runtime_disable(&pdev->dev);

	return 0;
}

924
#ifdef CONFIG_PM_SLEEP
925 926 927 928 929 930 931
static int dwc3_suspend(struct device *dev)
{
	struct dwc3	*dwc = dev_get_drvdata(dev);
	unsigned long	flags;

	spin_lock_irqsave(&dwc->lock, flags);

932 933 934
	switch (dwc->dr_mode) {
	case USB_DR_MODE_PERIPHERAL:
	case USB_DR_MODE_OTG:
935 936
		dwc3_gadget_suspend(dwc);
		/* FALLTHROUGH */
937
	case USB_DR_MODE_HOST:
938
	default:
939
		dwc3_event_buffers_cleanup(dwc);
940 941 942 943 944 945 946 947
		break;
	}

	dwc->gctl = dwc3_readl(dwc->regs, DWC3_GCTL);
	spin_unlock_irqrestore(&dwc->lock, flags);

	usb_phy_shutdown(dwc->usb3_phy);
	usb_phy_shutdown(dwc->usb2_phy);
948 949
	phy_exit(dwc->usb2_generic_phy);
	phy_exit(dwc->usb3_generic_phy);
950 951 952 953 954 955 956 957

	return 0;
}

static int dwc3_resume(struct device *dev)
{
	struct dwc3	*dwc = dev_get_drvdata(dev);
	unsigned long	flags;
958
	int		ret;
959 960 961

	usb_phy_init(dwc->usb3_phy);
	usb_phy_init(dwc->usb2_phy);
962 963 964 965 966 967 968
	ret = phy_init(dwc->usb2_generic_phy);
	if (ret < 0)
		return ret;

	ret = phy_init(dwc->usb3_generic_phy);
	if (ret < 0)
		goto err_usb2phy_init;
969 970 971

	spin_lock_irqsave(&dwc->lock, flags);

972
	dwc3_event_buffers_setup(dwc);
973 974
	dwc3_writel(dwc->regs, DWC3_GCTL, dwc->gctl);

975 976 977
	switch (dwc->dr_mode) {
	case USB_DR_MODE_PERIPHERAL:
	case USB_DR_MODE_OTG:
978 979
		dwc3_gadget_resume(dwc);
		/* FALLTHROUGH */
980
	case USB_DR_MODE_HOST:
981 982 983 984 985 986 987 988 989 990 991 992
	default:
		/* do nothing */
		break;
	}

	spin_unlock_irqrestore(&dwc->lock, flags);

	pm_runtime_disable(dev);
	pm_runtime_set_active(dev);
	pm_runtime_enable(dev);

	return 0;
993 994 995 996 997

err_usb2phy_init:
	phy_exit(dwc->usb2_generic_phy);

	return ret;
998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008
}

static const struct dev_pm_ops dwc3_dev_pm_ops = {
	SET_SYSTEM_SLEEP_PM_OPS(dwc3_suspend, dwc3_resume)
};

#define DWC3_PM_OPS	&(dwc3_dev_pm_ops)
#else
#define DWC3_PM_OPS	NULL
#endif

1009 1010
#ifdef CONFIG_OF
static const struct of_device_id of_dwc3_match[] = {
1011 1012 1013
	{
		.compatible = "snps,dwc3"
	},
1014 1015 1016 1017 1018 1019 1020 1021
	{
		.compatible = "synopsys,dwc3"
	},
	{ },
};
MODULE_DEVICE_TABLE(of, of_dwc3_match);
#endif

H
Heikki Krogerus 已提交
1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032
#ifdef CONFIG_ACPI

#define ACPI_ID_INTEL_BSW	"808622B7"

static const struct acpi_device_id dwc3_acpi_match[] = {
	{ ACPI_ID_INTEL_BSW, 0 },
	{ },
};
MODULE_DEVICE_TABLE(acpi, dwc3_acpi_match);
#endif

1033 1034
static struct platform_driver dwc3_driver = {
	.probe		= dwc3_probe,
B
Bill Pemberton 已提交
1035
	.remove		= dwc3_remove,
1036 1037
	.driver		= {
		.name	= "dwc3",
1038
		.of_match_table	= of_match_ptr(of_dwc3_match),
H
Heikki Krogerus 已提交
1039
		.acpi_match_table = ACPI_PTR(dwc3_acpi_match),
1040
		.pm	= DWC3_PM_OPS,
1041 1042 1043
	},
};

1044 1045
module_platform_driver(dwc3_driver);

1046
MODULE_ALIAS("platform:dwc3");
1047
MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>");
F
Felipe Balbi 已提交
1048
MODULE_LICENSE("GPL v2");
1049
MODULE_DESCRIPTION("DesignWare USB3 DRD Controller Driver");