core.c 17.7 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/module.h>
23 24 25 26 27 28 29 30 31 32 33
#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>
34
#include <linux/of.h>
35 36 37

#include <linux/usb/ch9.h>
#include <linux/usb/gadget.h>
38
#include <linux/usb/of.h>
39
#include <linux/usb/otg.h>
40

41
#include "platform_data.h"
42 43 44 45 46 47
#include "core.h"
#include "gadget.h"
#include "io.h"

#include "debug.h"

48 49
/* -------------------------------------------------------------------------- */

50 51 52 53 54 55 56 57 58
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);
}
59

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

	/* 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 已提交
83 84
	usb_phy_init(dwc->usb2_phy);
	usb_phy_init(dwc->usb3_phy);
85 86 87 88 89 90 91 92 93 94 95 96
	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);

97 98
	mdelay(100);

99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
	/* 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);
}

/**
 * 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);
}

/**
117
 * dwc3_alloc_one_event_buffer - Allocates one event buffer structure
118 119 120
 * @dwc: Pointer to our controller context structure
 * @length: size of the event buffer
 *
121
 * Returns a pointer to the allocated event buffer structure on success
122 123
 * otherwise ERR_PTR(errno).
 */
124 125
static struct dwc3_event_buffer *dwc3_alloc_one_event_buffer(struct dwc3 *dwc,
		unsigned length)
126 127 128
{
	struct dwc3_event_buffer	*evt;

129
	evt = devm_kzalloc(dwc->dev, sizeof(*evt), GFP_KERNEL);
130 131 132 133 134 135 136
	if (!evt)
		return ERR_PTR(-ENOMEM);

	evt->dwc	= dwc;
	evt->length	= length;
	evt->buf	= dma_alloc_coherent(dwc->dev, length,
			&evt->dma, GFP_KERNEL);
137
	if (!evt->buf)
138 139 140 141 142 143 144 145 146 147 148 149 150 151
		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;

152
	for (i = 0; i < dwc->num_event_buffers; i++) {
153
		evt = dwc->ev_buffs[i];
154
		if (evt)
155 156 157 158 159 160
			dwc3_free_one_event_buffer(dwc, evt);
	}
}

/**
 * dwc3_alloc_event_buffers - Allocates @num event buffers of size @length
161
 * @dwc: pointer to our controller context structure
162 163
 * @length: size of event buffer
 *
164
 * Returns 0 on success otherwise negative errno. In the error case, dwc
165 166
 * may contain some buffers allocated but not all which were requested.
 */
B
Bill Pemberton 已提交
167
static int dwc3_alloc_event_buffers(struct dwc3 *dwc, unsigned length)
168
{
169
	int			num;
170 171
	int			i;

172 173 174
	num = DWC3_NUM_INT(dwc->hwparams.hwparams1);
	dwc->num_event_buffers = num;

175 176
	dwc->ev_buffs = devm_kzalloc(dwc->dev, sizeof(*dwc->ev_buffs) * num,
			GFP_KERNEL);
177 178 179 180 181
	if (!dwc->ev_buffs) {
		dev_err(dwc->dev, "can't allocate event buffers array\n");
		return -ENOMEM;
	}

182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
	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
198
 * @dwc: pointer to our controller context structure
199 200 201
 *
 * Returns 0 on success otherwise negative errno.
 */
202
static int dwc3_event_buffers_setup(struct dwc3 *dwc)
203 204 205 206
{
	struct dwc3_event_buffer	*evt;
	int				n;

207
	for (n = 0; n < dwc->num_event_buffers; n++) {
208 209 210 211 212
		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);

213 214
		evt->lpos = 0;

215 216 217 218 219
		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),
220
				DWC3_GEVNTSIZ_SIZE(evt->length));
221 222 223 224 225 226 227 228 229 230 231
		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;

232
	for (n = 0; n < dwc->num_event_buffers; n++) {
233
		evt = dwc->ev_buffs[n];
234 235 236

		evt->lpos = 0;

237 238
		dwc3_writel(dwc->regs, DWC3_GEVNTADRLO(n), 0);
		dwc3_writel(dwc->regs, DWC3_GEVNTADRHI(n), 0);
239 240
		dwc3_writel(dwc->regs, DWC3_GEVNTSIZ(n), DWC3_GEVNTSIZ_INTMASK
				| DWC3_GEVNTSIZ_SIZE(0));
241 242 243 244
		dwc3_writel(dwc->regs, DWC3_GEVNTCOUNT(n), 0);
	}
}

245 246 247 248 249 250 251 252 253 254 255
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 已提交
256
static void dwc3_cache_hwparams(struct dwc3 *dwc)
257 258 259 260 261 262 263 264 265 266 267 268 269 270
{
	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);
}

271 272 273 274 275 276
/**
 * 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 已提交
277
static int dwc3_core_init(struct dwc3 *dwc)
278 279 280 281 282
{
	unsigned long		timeout;
	u32			reg;
	int			ret;

283 284 285 286 287 288 289
	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;
	}
290
	dwc->revision = reg;
291

292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
	/* 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);

309 310
	dwc3_core_soft_reset(dwc);

311
	reg = dwc3_readl(dwc->regs, DWC3_GCTL);
312
	reg &= ~DWC3_GCTL_SCALEDOWN_MASK;
313 314
	reg &= ~DWC3_GCTL_DISSCRAMBLE;

315
	switch (DWC3_GHWPARAMS1_EN_PWROPT(dwc->hwparams.hwparams1)) {
316 317 318 319 320 321 322 323 324
	case DWC3_GHWPARAMS1_EN_PWROPT_CLK:
		reg &= ~DWC3_GCTL_DSBLCLKGTNG;
		break;
	default:
		dev_dbg(dwc->dev, "No power optimization available\n");
	}

	/*
	 * WORKAROUND: DWC3 revisions <1.90a have a bug
325
	 * where the device can fail to connect at SuperSpeed
326
	 * and falls back to high-speed mode which causes
327
	 * the device to enter a Connect/Disconnect loop
328 329 330 331
	 */
	if (dwc->revision < DWC3_REVISION_190A)
		reg |= DWC3_GCTL_U2RSTECN;

332 333
	dwc3_core_num_eps(dwc);

334 335
	dwc3_writel(dwc->regs, DWC3_GCTL, reg);

336 337 338 339 340 341 342 343
	return 0;

err0:
	return ret;
}

static void dwc3_core_exit(struct dwc3 *dwc)
{
344 345
	usb_phy_shutdown(dwc->usb2_phy);
	usb_phy_shutdown(dwc->usb3_phy);
346 347 348 349
}

#define DWC3_ALIGN_MASK		(16 - 1)

B
Bill Pemberton 已提交
350
static int dwc3_probe(struct platform_device *pdev)
351
{
F
Felipe Balbi 已提交
352 353 354
	struct device		*dev = &pdev->dev;
	struct dwc3_platform_data *pdata = dev_get_platdata(dev);
	struct device_node	*node = dev->of_node;
355 356
	struct resource		*res;
	struct dwc3		*dwc;
357

358
	int			ret = -ENOMEM;
359 360

	void __iomem		*regs;
361 362
	void			*mem;

C
Chanho Park 已提交
363
	mem = devm_kzalloc(dev, sizeof(*dwc) + DWC3_ALIGN_MASK, GFP_KERNEL);
364
	if (!mem) {
C
Chanho Park 已提交
365 366
		dev_err(dev, "not enough memory\n");
		return -ENOMEM;
367 368 369 370
	}
	dwc = PTR_ALIGN(mem, DWC3_ALIGN_MASK + 1);
	dwc->mem = mem;

371
	res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
372
	if (!res) {
373
		dev_err(dev, "missing IRQ\n");
C
Chanho Park 已提交
374
		return -ENODEV;
375
	}
376 377 378 379
	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;
380

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

387
	if (node) {
388 389
		dwc->maximum_speed = of_usb_get_maximum_speed(node);

390 391
		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);
392 393

		dwc->needs_fifo_resize = of_property_read_bool(node, "tx-fifo-resize");
394
		dwc->dr_mode = of_usb_get_dr_mode(node);
395
	} else if (pdata) {
396 397
		dwc->maximum_speed = pdata->maximum_speed;

398 399
		dwc->usb2_phy = devm_usb_get_phy(dev, USB_PHY_TYPE_USB2);
		dwc->usb3_phy = devm_usb_get_phy(dev, USB_PHY_TYPE_USB3);
400 401

		dwc->needs_fifo_resize = pdata->tx_fifo_resize;
402
		dwc->dr_mode = pdata->dr_mode;
403 404 405
	} 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);
406 407
	}

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

F
Felipe Balbi 已提交
412 413 414 415 416 417 418 419 420 421 422
	if (IS_ERR(dwc->usb2_phy)) {
		ret = PTR_ERR(dwc->usb2_phy);

		/*
		 * if -ENXIO is returned, it means PHY layer wasn't
		 * enabled, so it makes no sense to return -EPROBE_DEFER
		 * in that case, since no PHY driver will ever probe.
		 */
		if (ret == -ENXIO)
			return ret;

F
Felipe Balbi 已提交
423 424 425 426
		dev_err(dev, "no usb2 phy configured\n");
		return -EPROBE_DEFER;
	}

F
Felipe Balbi 已提交
427
	if (IS_ERR(dwc->usb3_phy)) {
428
		ret = PTR_ERR(dwc->usb3_phy);
F
Felipe Balbi 已提交
429 430 431 432 433 434 435 436 437

		/*
		 * if -ENXIO is returned, it means PHY layer wasn't
		 * enabled, so it makes no sense to return -EPROBE_DEFER
		 * in that case, since no PHY driver will ever probe.
		 */
		if (ret == -ENXIO)
			return ret;

F
Felipe Balbi 已提交
438 439 440 441
		dev_err(dev, "no usb3 phy configured\n");
		return -EPROBE_DEFER;
	}

442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457
	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);

458 459 460
	usb_phy_set_suspend(dwc->usb2_phy, 0);
	usb_phy_set_suspend(dwc->usb3_phy, 0);

461 462 463 464 465
	spin_lock_init(&dwc->lock);
	platform_set_drvdata(pdev, dwc);

	dwc->regs	= regs;
	dwc->regs_size	= resource_size(res);
C
Chanho Park 已提交
466
	dwc->dev	= dev;
467

468 469 470 471
	dev->dma_mask	= dev->parent->dma_mask;
	dev->dma_parms	= dev->parent->dma_parms;
	dma_set_coherent_mask(dev, dev->parent->coherent_dma_mask);

C
Chanho Park 已提交
472 473 474
	pm_runtime_enable(dev);
	pm_runtime_get_sync(dev);
	pm_runtime_forbid(dev);
475

476 477
	dwc3_cache_hwparams(dwc);

478 479 480 481 482 483 484
	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;
	}

485 486
	ret = dwc3_core_init(dwc);
	if (ret) {
C
Chanho Park 已提交
487
		dev_err(dev, "failed to initialize core\n");
488
		goto err0;
489 490
	}

491 492 493 494 495 496
	ret = dwc3_event_buffers_setup(dwc);
	if (ret) {
		dev_err(dwc->dev, "failed to setup event buffers\n");
		goto err1;
	}

497
	if (IS_ENABLED(CONFIG_USB_DWC3_HOST))
498
		dwc->dr_mode = USB_DR_MODE_HOST;
499
	else if (IS_ENABLED(CONFIG_USB_DWC3_GADGET))
500 501 502 503
		dwc->dr_mode = USB_DR_MODE_PERIPHERAL;

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

505 506
	switch (dwc->dr_mode) {
	case USB_DR_MODE_PERIPHERAL:
507
		dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_DEVICE);
508 509
		ret = dwc3_gadget_init(dwc);
		if (ret) {
C
Chanho Park 已提交
510
			dev_err(dev, "failed to initialize gadget\n");
511
			goto err2;
512
		}
F
Felipe Balbi 已提交
513
		break;
514
	case USB_DR_MODE_HOST:
515
		dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_HOST);
F
Felipe Balbi 已提交
516 517
		ret = dwc3_host_init(dwc);
		if (ret) {
C
Chanho Park 已提交
518
			dev_err(dev, "failed to initialize host\n");
519
			goto err2;
F
Felipe Balbi 已提交
520 521
		}
		break;
522
	case USB_DR_MODE_OTG:
523
		dwc3_set_mode(dwc, DWC3_GCTL_PRTCAP_OTG);
F
Felipe Balbi 已提交
524 525
		ret = dwc3_host_init(dwc);
		if (ret) {
C
Chanho Park 已提交
526
			dev_err(dev, "failed to initialize host\n");
527
			goto err2;
F
Felipe Balbi 已提交
528 529
		}

530 531
		ret = dwc3_gadget_init(dwc);
		if (ret) {
C
Chanho Park 已提交
532
			dev_err(dev, "failed to initialize gadget\n");
533
			goto err2;
534
		}
535 536
		break;
	default:
537
		dev_err(dev, "Unsupported mode of operation %d\n", dwc->dr_mode);
538
		goto err2;
539 540 541 542
	}

	ret = dwc3_debugfs_init(dwc);
	if (ret) {
C
Chanho Park 已提交
543
		dev_err(dev, "failed to initialize debugfs\n");
544
		goto err3;
545 546
	}

C
Chanho Park 已提交
547
	pm_runtime_allow(dev);
548 549 550

	return 0;

551
err3:
552 553
	switch (dwc->dr_mode) {
	case USB_DR_MODE_PERIPHERAL:
554
		dwc3_gadget_exit(dwc);
555
		break;
556
	case USB_DR_MODE_HOST:
F
Felipe Balbi 已提交
557 558
		dwc3_host_exit(dwc);
		break;
559
	case USB_DR_MODE_OTG:
F
Felipe Balbi 已提交
560
		dwc3_host_exit(dwc);
561
		dwc3_gadget_exit(dwc);
F
Felipe Balbi 已提交
562
		break;
563 564 565 566
	default:
		/* do nothing */
		break;
	}
567

568 569 570
err2:
	dwc3_event_buffers_cleanup(dwc);

571
err1:
C
Chanho Park 已提交
572
	dwc3_core_exit(dwc);
573

574 575 576
err0:
	dwc3_free_event_buffers(dwc);

577 578 579
	return ret;
}

B
Bill Pemberton 已提交
580
static int dwc3_remove(struct platform_device *pdev)
581 582 583
{
	struct dwc3	*dwc = platform_get_drvdata(pdev);

584 585 586
	usb_phy_set_suspend(dwc->usb2_phy, 1);
	usb_phy_set_suspend(dwc->usb3_phy, 1);

587 588 589 590 591
	pm_runtime_put(&pdev->dev);
	pm_runtime_disable(&pdev->dev);

	dwc3_debugfs_exit(dwc);

592 593
	switch (dwc->dr_mode) {
	case USB_DR_MODE_PERIPHERAL:
594
		dwc3_gadget_exit(dwc);
595
		break;
596
	case USB_DR_MODE_HOST:
F
Felipe Balbi 已提交
597 598
		dwc3_host_exit(dwc);
		break;
599
	case USB_DR_MODE_OTG:
F
Felipe Balbi 已提交
600
		dwc3_host_exit(dwc);
601
		dwc3_gadget_exit(dwc);
F
Felipe Balbi 已提交
602
		break;
603 604 605 606
	default:
		/* do nothing */
		break;
	}
607

608
	dwc3_event_buffers_cleanup(dwc);
609
	dwc3_free_event_buffers(dwc);
610 611 612 613 614
	dwc3_core_exit(dwc);

	return 0;
}

615
#ifdef CONFIG_PM_SLEEP
616 617 618 619 620 621 622
static int dwc3_prepare(struct device *dev)
{
	struct dwc3	*dwc = dev_get_drvdata(dev);
	unsigned long	flags;

	spin_lock_irqsave(&dwc->lock, flags);

623 624 625
	switch (dwc->dr_mode) {
	case USB_DR_MODE_PERIPHERAL:
	case USB_DR_MODE_OTG:
626 627
		dwc3_gadget_prepare(dwc);
		/* FALLTHROUGH */
628
	case USB_DR_MODE_HOST:
629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645
	default:
		dwc3_event_buffers_cleanup(dwc);
		break;
	}

	spin_unlock_irqrestore(&dwc->lock, flags);

	return 0;
}

static void dwc3_complete(struct device *dev)
{
	struct dwc3	*dwc = dev_get_drvdata(dev);
	unsigned long	flags;

	spin_lock_irqsave(&dwc->lock, flags);

646 647 648
	switch (dwc->dr_mode) {
	case USB_DR_MODE_PERIPHERAL:
	case USB_DR_MODE_OTG:
649 650
		dwc3_gadget_complete(dwc);
		/* FALLTHROUGH */
651
	case USB_DR_MODE_HOST:
652 653 654 655 656 657 658 659 660 661 662 663 664 665 666
	default:
		dwc3_event_buffers_setup(dwc);
		break;
	}

	spin_unlock_irqrestore(&dwc->lock, flags);
}

static int dwc3_suspend(struct device *dev)
{
	struct dwc3	*dwc = dev_get_drvdata(dev);
	unsigned long	flags;

	spin_lock_irqsave(&dwc->lock, flags);

667 668 669
	switch (dwc->dr_mode) {
	case USB_DR_MODE_PERIPHERAL:
	case USB_DR_MODE_OTG:
670 671
		dwc3_gadget_suspend(dwc);
		/* FALLTHROUGH */
672
	case USB_DR_MODE_HOST:
673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698
	default:
		/* do nothing */
		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);

	return 0;
}

static int dwc3_resume(struct device *dev)
{
	struct dwc3	*dwc = dev_get_drvdata(dev);
	unsigned long	flags;

	usb_phy_init(dwc->usb3_phy);
	usb_phy_init(dwc->usb2_phy);

	spin_lock_irqsave(&dwc->lock, flags);

	dwc3_writel(dwc->regs, DWC3_GCTL, dwc->gctl);

699 700 701
	switch (dwc->dr_mode) {
	case USB_DR_MODE_PERIPHERAL:
	case USB_DR_MODE_OTG:
702 703
		dwc3_gadget_resume(dwc);
		/* FALLTHROUGH */
704
	case USB_DR_MODE_HOST:
705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730
	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;
}

static const struct dev_pm_ops dwc3_dev_pm_ops = {
	.prepare	= dwc3_prepare,
	.complete	= dwc3_complete,

	SET_SYSTEM_SLEEP_PM_OPS(dwc3_suspend, dwc3_resume)
};

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

731 732
#ifdef CONFIG_OF
static const struct of_device_id of_dwc3_match[] = {
733 734 735
	{
		.compatible = "snps,dwc3"
	},
736 737 738 739 740 741 742 743
	{
		.compatible = "synopsys,dwc3"
	},
	{ },
};
MODULE_DEVICE_TABLE(of, of_dwc3_match);
#endif

744 745
static struct platform_driver dwc3_driver = {
	.probe		= dwc3_probe,
B
Bill Pemberton 已提交
746
	.remove		= dwc3_remove,
747 748
	.driver		= {
		.name	= "dwc3",
749
		.of_match_table	= of_match_ptr(of_dwc3_match),
750
		.pm	= DWC3_PM_OPS,
751 752 753
	},
};

754 755
module_platform_driver(dwc3_driver);

756
MODULE_ALIAS("platform:dwc3");
757
MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>");
F
Felipe Balbi 已提交
758
MODULE_LICENSE("GPL v2");
759
MODULE_DESCRIPTION("DesignWare USB3 DRD Controller Driver");