musb_dsps.c 24.9 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
/*
 * Texas Instruments DSPS platforms "glue layer"
 *
 * Copyright (C) 2012, by Texas Instruments
 *
 * Based on the am35x "glue layer" code.
 *
 * This file is part of the Inventra Controller Driver for Linux.
 *
 * The Inventra Controller Driver for Linux is free software; you
 * can redistribute it and/or modify it under the terms of the GNU
 * General Public License version 2 as published by the Free Software
 * Foundation.
 *
 * The Inventra Controller Driver for Linux 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.
 *
 * You should have received a copy of the GNU General Public License
 * along with The Inventra Controller Driver for Linux ; if not,
 * write to the Free Software Foundation, Inc., 59 Temple Place,
 * Suite 330, Boston, MA  02111-1307  USA
 *
 * musb_dsps.c will be a common file for all the TI DSPS platforms
 * such as dm64x, dm36x, dm35x, da8x, am35x and ti81x.
 * For now only ti81x is using this and in future davinci.c, am35x.c
 * da8xx.c would be merged to this file after testing.
 */

#include <linux/io.h>
33
#include <linux/err.h>
34 35 36 37
#include <linux/platform_device.h>
#include <linux/dma-mapping.h>
#include <linux/pm_runtime.h>
#include <linux/module.h>
38
#include <linux/usb/usb_phy_generic.h>
39
#include <linux/platform_data/usb-omap.h>
40
#include <linux/sizes.h>
41 42 43 44

#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/of_address.h>
45
#include <linux/of_irq.h>
46
#include <linux/usb/of.h>
47

M
Markus Pargmann 已提交
48 49
#include <linux/debugfs.h>

50 51
#include "musb_core.h"

52 53
static const struct of_device_id musb_dsps_of_match[];

54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
/**
 * DSPS musb wrapper register offset.
 * FIXME: This should be expanded to have all the wrapper registers from TI DSPS
 * musb ips.
 */
struct dsps_musb_wrapper {
	u16	revision;
	u16	control;
	u16	status;
	u16	epintr_set;
	u16	epintr_clear;
	u16	epintr_status;
	u16	coreintr_set;
	u16	coreintr_clear;
	u16	coreintr_status;
	u16	phy_utmi;
	u16	mode;
71 72
	u16	tx_mode;
	u16	rx_mode;
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95

	/* bit positions for control */
	unsigned	reset:5;

	/* bit positions for interrupt */
	unsigned	usb_shift:5;
	u32		usb_mask;
	u32		usb_bitmap;
	unsigned	drvvbus:5;

	unsigned	txep_shift:5;
	u32		txep_mask;
	u32		txep_bitmap;

	unsigned	rxep_shift:5;
	u32		rxep_mask;
	u32		rxep_bitmap;

	/* bit positions for phy_utmi */
	unsigned	otg_disable:5;

	/* bit positions for mode */
	unsigned	iddig:5;
96
	unsigned	iddig_mux:5;
97
	/* miscellaneous stuff */
98
	unsigned	poll_timeout;
99 100
};

101 102 103 104 105 106 107 108 109 110 111 112 113
/*
 * register shadow for suspend
 */
struct dsps_context {
	u32 control;
	u32 epintr;
	u32 coreintr;
	u32 phy_utmi;
	u32 mode;
	u32 tx_mode;
	u32 rx_mode;
};

114 115 116 117 118
/**
 * DSPS glue structure.
 */
struct dsps_glue {
	struct device *dev;
119
	struct platform_device *musb;	/* child musb pdev */
120
	const struct dsps_musb_wrapper *wrp; /* wrapper register offsets */
121
	int vbus_irq;			/* optional vbus irq */
122 123
	struct timer_list timer;	/* otg_workaround timer */
	unsigned long last_timer;    /* last timer data for each instance */
124
	bool sw_babble_enabled;
125 126

	struct dsps_context context;
M
Markus Pargmann 已提交
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
	struct debugfs_regset32 regset;
	struct dentry *dbgfs_root;
};

static const struct debugfs_reg32 dsps_musb_regs[] = {
	{ "revision",		0x00 },
	{ "control",		0x14 },
	{ "status",		0x18 },
	{ "eoi",		0x24 },
	{ "intr0_stat",		0x30 },
	{ "intr1_stat",		0x34 },
	{ "intr0_set",		0x38 },
	{ "intr1_set",		0x3c },
	{ "txmode",		0x70 },
	{ "rxmode",		0x74 },
	{ "autoreq",		0xd0 },
	{ "srpfixtime",		0xd4 },
	{ "tdown",		0xd8 },
	{ "phy_utmi",		0xe0 },
	{ "mode",		0xe8 },
147 148
};

149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
static void dsps_mod_timer(struct dsps_glue *glue, int wait_ms)
{
	int wait;

	if (wait_ms < 0)
		wait = msecs_to_jiffies(glue->wrp->poll_timeout);
	else
		wait = msecs_to_jiffies(wait_ms);

	mod_timer(&glue->timer, jiffies + wait);
}

/*
 * If no vbus irq from the PMIC is configured, we need to poll VBUS status.
 */
static void dsps_mod_timer_optional(struct dsps_glue *glue)
{
	if (glue->vbus_irq)
		return;

	dsps_mod_timer(glue, -1);
}

172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
/**
 * dsps_musb_enable - enable interrupts
 */
static void dsps_musb_enable(struct musb *musb)
{
	struct device *dev = musb->controller;
	struct platform_device *pdev = to_platform_device(dev->parent);
	struct dsps_glue *glue = platform_get_drvdata(pdev);
	const struct dsps_musb_wrapper *wrp = glue->wrp;
	void __iomem *reg_base = musb->ctrl_base;
	u32 epmask, coremask;

	/* Workaround: setup IRQs through both register sets. */
	epmask = ((musb->epmask & wrp->txep_mask) << wrp->txep_shift) |
	       ((musb->epmask & wrp->rxep_mask) << wrp->rxep_shift);
	coremask = (wrp->usb_bitmap & ~MUSB_INTR_SOF);

189 190
	musb_writel(reg_base, wrp->epintr_set, epmask);
	musb_writel(reg_base, wrp->coreintr_set, coremask);
191 192 193
	/* start polling for ID change in dual-role idle mode */
	if (musb->xceiv->otg->state == OTG_STATE_B_IDLE &&
			musb->port_mode == MUSB_PORT_MODE_DUAL_ROLE)
194
		dsps_mod_timer(glue, -1);
195 196 197 198 199 200 201 202 203 204 205 206 207
}

/**
 * dsps_musb_disable - disable HDRC and flush interrupts
 */
static void dsps_musb_disable(struct musb *musb)
{
	struct device *dev = musb->controller;
	struct platform_device *pdev = to_platform_device(dev->parent);
	struct dsps_glue *glue = platform_get_drvdata(pdev);
	const struct dsps_musb_wrapper *wrp = glue->wrp;
	void __iomem *reg_base = musb->ctrl_base;

208 209
	musb_writel(reg_base, wrp->coreintr_clear, wrp->usb_bitmap);
	musb_writel(reg_base, wrp->epintr_clear,
210
			 wrp->txep_bitmap | wrp->rxep_bitmap);
211
	del_timer_sync(&glue->timer);
212 213
}

214 215
/* Caller must take musb->lock */
static int dsps_check_status(struct musb *musb, void *unused)
216 217 218
{
	void __iomem *mregs = musb->mregs;
	struct device *dev = musb->controller;
219
	struct dsps_glue *glue = dev_get_drvdata(dev->parent);
220 221
	const struct dsps_musb_wrapper *wrp = glue->wrp;
	u8 devctl;
222
	int skip_session = 0;
223

224 225 226
	if (glue->vbus_irq)
		del_timer(&glue->timer);

227 228 229 230
	/*
	 * We poll because DSPS IP's won't expose several OTG-critical
	 * status change events (from the transceiver) otherwise.
	 */
231
	devctl = musb_readb(mregs, MUSB_DEVCTL);
232
	dev_dbg(musb->controller, "Poll devctl %02x (%s)\n", devctl,
233
				usb_otg_state_string(musb->xceiv->otg->state));
234

235
	switch (musb->xceiv->otg->state) {
236
	case OTG_STATE_A_WAIT_VRISE:
237
		dsps_mod_timer_optional(glue);
238
		break;
239
	case OTG_STATE_A_WAIT_BCON:
240
		musb_writeb(musb->mregs, MUSB_DEVCTL, 0);
241 242
		skip_session = 1;
		/* fall */
243

244 245
	case OTG_STATE_A_IDLE:
	case OTG_STATE_B_IDLE:
246 247 248 249 250 251 252 253 254 255 256
		if (!glue->vbus_irq) {
			if (devctl & MUSB_DEVCTL_BDEVICE) {
				musb->xceiv->otg->state = OTG_STATE_B_IDLE;
				MUSB_DEV_MODE(musb);
			} else {
				musb->xceiv->otg->state = OTG_STATE_A_IDLE;
				MUSB_HST_MODE(musb);
			}
			if (!(devctl & MUSB_DEVCTL_SESSION) && !skip_session)
				musb_writeb(mregs, MUSB_DEVCTL,
					    MUSB_DEVCTL_SESSION);
257
		}
258
		dsps_mod_timer_optional(glue);
259 260
		break;
	case OTG_STATE_A_WAIT_VFALL:
261
		musb->xceiv->otg->state = OTG_STATE_A_WAIT_VRISE;
262
		musb_writel(musb->ctrl_base, wrp->coreintr_set,
263 264 265 266 267
			    MUSB_INTR_VBUSERROR << wrp->usb_shift);
		break;
	default:
		break;
	}
268

269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291
	return 0;
}

static void otg_timer(unsigned long _musb)
{
	struct musb *musb = (void *)_musb;
	struct device *dev = musb->controller;
	unsigned long flags;
	int err;

	err = pm_runtime_get(dev);
	if ((err != -EINPROGRESS) && err < 0) {
		dev_err(dev, "Poll could not pm_runtime_get: %i\n", err);
		pm_runtime_put_noidle(dev);

		return;
	}

	spin_lock_irqsave(&musb->lock, flags);
	err = musb_queue_resume_work(musb, dsps_check_status, NULL);
	if (err < 0)
		dev_err(dev, "%s resume work: %i\n", __func__, err);
	spin_unlock_irqrestore(&musb->lock, flags);
292 293
	pm_runtime_mark_last_busy(dev);
	pm_runtime_put_autosuspend(dev);
294 295
}

296 297 298 299 300 301 302 303 304 305 306
void dsps_musb_clear_ep_rxintr(struct musb *musb, int epnum)
{
	u32 epintr;
	struct dsps_glue *glue = dev_get_drvdata(musb->controller->parent);
	const struct dsps_musb_wrapper *wrp = glue->wrp;

	/* musb->lock might already been held */
	epintr = (1 << epnum) << wrp->rxep_shift;
	musb_writel(musb->ctrl_base, wrp->epintr_status, epintr);
}

307 308 309 310 311
static irqreturn_t dsps_interrupt(int irq, void *hci)
{
	struct musb  *musb = hci;
	void __iomem *reg_base = musb->ctrl_base;
	struct device *dev = musb->controller;
312
	struct dsps_glue *glue = dev_get_drvdata(dev->parent);
313 314 315 316 317 318 319 320
	const struct dsps_musb_wrapper *wrp = glue->wrp;
	unsigned long flags;
	irqreturn_t ret = IRQ_NONE;
	u32 epintr, usbintr;

	spin_lock_irqsave(&musb->lock, flags);

	/* Get endpoint interrupts */
321
	epintr = musb_readl(reg_base, wrp->epintr_status);
322 323 324 325
	musb->int_rx = (epintr & wrp->rxep_bitmap) >> wrp->rxep_shift;
	musb->int_tx = (epintr & wrp->txep_bitmap) >> wrp->txep_shift;

	if (epintr)
326
		musb_writel(reg_base, wrp->epintr_status, epintr);
327 328

	/* Get usb core interrupts */
329
	usbintr = musb_readl(reg_base, wrp->coreintr_status);
330
	if (!usbintr && !epintr)
331
		goto out;
332 333 334

	musb->int_usb =	(usbintr & wrp->usb_bitmap) >> wrp->usb_shift;
	if (usbintr)
335
		musb_writel(reg_base, wrp->coreintr_status, usbintr);
336 337 338

	dev_dbg(musb->controller, "usbintr (%x) epintr(%x)\n",
			usbintr, epintr);
339

340
	if (usbintr & ((1 << wrp->drvvbus) << wrp->usb_shift)) {
341
		int drvvbus = musb_readl(reg_base, wrp->status);
342
		void __iomem *mregs = musb->mregs;
343
		u8 devctl = musb_readb(mregs, MUSB_DEVCTL);
344 345
		int err;

346
		err = musb->int_usb & MUSB_INTR_VBUSERROR;
347 348 349 350 351 352 353 354 355 356 357 358 359
		if (err) {
			/*
			 * The Mentor core doesn't debounce VBUS as needed
			 * to cope with device connect current spikes. This
			 * means it's not uncommon for bus-powered devices
			 * to get VBUS errors during enumeration.
			 *
			 * This is a workaround, but newer RTL from Mentor
			 * seems to allow a better one: "re"-starting sessions
			 * without waiting for VBUS to stop registering in
			 * devctl.
			 */
			musb->int_usb &= ~MUSB_INTR_VBUSERROR;
360
			musb->xceiv->otg->state = OTG_STATE_A_WAIT_VFALL;
361
			dsps_mod_timer_optional(glue);
362
			WARNING("VBUS error workaround (delay coming)\n");
363
		} else if (drvvbus) {
364 365
			MUSB_HST_MODE(musb);
			musb->xceiv->otg->default_a = 1;
366
			musb->xceiv->otg->state = OTG_STATE_A_WAIT_VRISE;
367
			dsps_mod_timer_optional(glue);
368 369 370 371
		} else {
			musb->is_active = 0;
			MUSB_DEV_MODE(musb);
			musb->xceiv->otg->default_a = 0;
372
			musb->xceiv->otg->state = OTG_STATE_B_IDLE;
373 374 375 376 377
		}

		/* NOTE: this must complete power-on within 100 ms. */
		dev_dbg(musb->controller, "VBUS %s (%s)%s, devctl %02x\n",
				drvvbus ? "on" : "off",
378
				usb_otg_state_string(musb->xceiv->otg->state),
379 380 381 382 383 384 385 386
				err ? " ERROR" : "",
				devctl);
		ret = IRQ_HANDLED;
	}

	if (musb->int_tx || musb->int_rx || musb->int_usb)
		ret |= musb_interrupt(musb);

387 388 389 390
	/* Poll for ID change and connect */
	switch (musb->xceiv->otg->state) {
	case OTG_STATE_B_IDLE:
	case OTG_STATE_A_WAIT_BCON:
391
		dsps_mod_timer_optional(glue);
392 393 394 395 396
		break;
	default:
		break;
	}

397
out:
398 399 400 401 402
	spin_unlock_irqrestore(&musb->lock, flags);

	return ret;
}

M
Markus Pargmann 已提交
403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426
static int dsps_musb_dbg_init(struct musb *musb, struct dsps_glue *glue)
{
	struct dentry *root;
	struct dentry *file;
	char buf[128];

	sprintf(buf, "%s.dsps", dev_name(musb->controller));
	root = debugfs_create_dir(buf, NULL);
	if (!root)
		return -ENOMEM;
	glue->dbgfs_root = root;

	glue->regset.regs = dsps_musb_regs;
	glue->regset.nregs = ARRAY_SIZE(dsps_musb_regs);
	glue->regset.base = musb->ctrl_base;

	file = debugfs_create_regset32("regdump", S_IRUGO, root, &glue->regset);
	if (!file) {
		debugfs_remove_recursive(root);
		return -ENOMEM;
	}
	return 0;
}

427 428 429
static int dsps_musb_init(struct musb *musb)
{
	struct device *dev = musb->controller;
430
	struct dsps_glue *glue = dev_get_drvdata(dev->parent);
431
	struct platform_device *parent = to_platform_device(dev->parent);
432
	const struct dsps_musb_wrapper *wrp = glue->wrp;
433 434
	void __iomem *reg_base;
	struct resource *r;
435
	u32 rev, val;
M
Markus Pargmann 已提交
436
	int ret;
437

438 439
	r = platform_get_resource_byname(parent, IORESOURCE_MEM, "control");
	reg_base = devm_ioremap_resource(dev, r);
440 441
	if (IS_ERR(reg_base))
		return PTR_ERR(reg_base);
442
	musb->ctrl_base = reg_base;
443

444
	/* NOP driver needs change if supporting dual instance */
445
	musb->xceiv = devm_usb_get_phy_by_phandle(dev->parent, "phys", 0);
446 447
	if (IS_ERR(musb->xceiv))
		return PTR_ERR(musb->xceiv);
448

449 450
	musb->phy = devm_phy_get(dev->parent, "usb2-phy");

451
	/* Returns zero if e.g. not clocked */
452
	rev = musb_readl(reg_base, wrp->revision);
453 454
	if (!rev)
		return -ENODEV;
455

456
	usb_phy_init(musb->xceiv);
457 458 459 460 461 462 463 464 465 466 467 468 469
	if (IS_ERR(musb->phy))  {
		musb->phy = NULL;
	} else {
		ret = phy_init(musb->phy);
		if (ret < 0)
			return ret;
		ret = phy_power_on(musb->phy);
		if (ret) {
			phy_exit(musb->phy);
			return ret;
		}
	}

470
	setup_timer(&glue->timer, otg_timer, (unsigned long) musb);
471 472

	/* Reset the musb */
473
	musb_writel(reg_base, wrp->control, (1 << wrp->reset));
474 475 476 477

	musb->isr = dsps_interrupt;

	/* reset the otgdisable bit, needed for host mode to work */
478
	val = musb_readl(reg_base, wrp->phy_utmi);
479
	val &= ~(1 << wrp->otg_disable);
480
	musb_writel(musb->ctrl_base, wrp->phy_utmi, val);
481

482 483 484 485 486 487
	/*
	 *  Check whether the dsps version has babble control enabled.
	 * In latest silicon revision the babble control logic is enabled.
	 * If MUSB_BABBLE_CTL returns 0x4 then we have the babble control
	 * logic enabled.
	 */
488
	val = musb_readb(musb->mregs, MUSB_BABBLE_CTL);
489
	if (val & MUSB_BABBLE_RCV_DISABLE) {
490 491
		glue->sw_babble_enabled = true;
		val |= MUSB_BABBLE_SW_SESSION_CTRL;
492
		musb_writeb(musb->mregs, MUSB_BABBLE_CTL, val);
493 494
	}

495
	dsps_mod_timer(glue, -1);
496

497
	return dsps_musb_dbg_init(musb, glue);
498 499 500 501 502
}

static int dsps_musb_exit(struct musb *musb)
{
	struct device *dev = musb->controller;
503
	struct dsps_glue *glue = dev_get_drvdata(dev->parent);
504

505
	del_timer_sync(&glue->timer);
506
	usb_phy_shutdown(musb->xceiv);
507 508
	phy_power_off(musb->phy);
	phy_exit(musb->phy);
509 510
	debugfs_remove_recursive(glue->dbgfs_root);

511 512 513
	return 0;
}

514 515 516 517 518 519 520 521
static int dsps_musb_set_mode(struct musb *musb, u8 mode)
{
	struct device *dev = musb->controller;
	struct dsps_glue *glue = dev_get_drvdata(dev->parent);
	const struct dsps_musb_wrapper *wrp = glue->wrp;
	void __iomem *ctrl_base = musb->ctrl_base;
	u32 reg;

522
	reg = musb_readl(ctrl_base, wrp->mode);
523 524 525 526 527 528 529 530 531 532 533 534

	switch (mode) {
	case MUSB_HOST:
		reg &= ~(1 << wrp->iddig);

		/*
		 * if we're setting mode to host-only or device-only, we're
		 * going to ignore whatever the PHY sends us and just force
		 * ID pin status by SW
		 */
		reg |= (1 << wrp->iddig_mux);

535 536
		musb_writel(ctrl_base, wrp->mode, reg);
		musb_writel(ctrl_base, wrp->phy_utmi, 0x02);
537 538 539 540 541 542 543 544 545 546 547
		break;
	case MUSB_PERIPHERAL:
		reg |= (1 << wrp->iddig);

		/*
		 * if we're setting mode to host-only or device-only, we're
		 * going to ignore whatever the PHY sends us and just force
		 * ID pin status by SW
		 */
		reg |= (1 << wrp->iddig_mux);

548
		musb_writel(ctrl_base, wrp->mode, reg);
549 550
		break;
	case MUSB_OTG:
551
		musb_writel(ctrl_base, wrp->phy_utmi, 0x02);
552 553 554 555 556 557 558 559 560
		break;
	default:
		dev_err(glue->dev, "unsupported mode %d\n", mode);
		return -EINVAL;
	}

	return 0;
}

561
static bool dsps_sw_babble_control(struct musb *musb)
562 563 564 565
{
	u8 babble_ctl;
	bool session_restart =  false;

566
	babble_ctl = musb_readb(musb->mregs, MUSB_BABBLE_CTL);
567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582
	dev_dbg(musb->controller, "babble: MUSB_BABBLE_CTL value %x\n",
		babble_ctl);
	/*
	 * check line monitor flag to check whether babble is
	 * due to noise
	 */
	dev_dbg(musb->controller, "STUCK_J is %s\n",
		babble_ctl & MUSB_BABBLE_STUCK_J ? "set" : "reset");

	if (babble_ctl & MUSB_BABBLE_STUCK_J) {
		int timeout = 10;

		/*
		 * babble is due to noise, then set transmit idle (d7 bit)
		 * to resume normal operation
		 */
583
		babble_ctl = musb_readb(musb->mregs, MUSB_BABBLE_CTL);
584
		babble_ctl |= MUSB_BABBLE_FORCE_TXIDLE;
585
		musb_writeb(musb->mregs, MUSB_BABBLE_CTL, babble_ctl);
586 587 588 589

		/* wait till line monitor flag cleared */
		dev_dbg(musb->controller, "Set TXIDLE, wait J to clear\n");
		do {
590
			babble_ctl = musb_readb(musb->mregs, MUSB_BABBLE_CTL);
591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611
			udelay(1);
		} while ((babble_ctl & MUSB_BABBLE_STUCK_J) && timeout--);

		/* check whether stuck_at_j bit cleared */
		if (babble_ctl & MUSB_BABBLE_STUCK_J) {
			/*
			 * real babble condition has occurred
			 * restart the controller to start the
			 * session again
			 */
			dev_dbg(musb->controller, "J not cleared, misc (%x)\n",
				babble_ctl);
			session_restart = true;
		}
	} else {
		session_restart = true;
	}

	return session_restart;
}

612
static int dsps_musb_recover(struct musb *musb)
613 614 615
{
	struct device *dev = musb->controller;
	struct dsps_glue *glue = dev_get_drvdata(dev->parent);
616
	int session_restart = 0;
617

618
	if (glue->sw_babble_enabled)
619
		session_restart = dsps_sw_babble_control(musb);
620
	else
621
		session_restart = 1;
622

623
	return session_restart ? 0 : -EPIPE;
624 625
}

626 627 628 629 630 631
/* Similar to am35x, dm81xx support only 32-bit read operation */
static void dsps_read_fifo32(struct musb_hw_ep *hw_ep, u16 len, u8 *dst)
{
	void __iomem *fifo = hw_ep->fifo;

	if (len >= 4) {
632
		ioread32_rep(fifo, dst, len >> 2);
633 634 635 636 637 638 639 640 641 642 643
		dst += len & ~0x03;
		len &= 0x03;
	}

	/* Read any remaining 1 to 3 bytes */
	if (len > 0) {
		u32 val = musb_readl(fifo, 0);
		memcpy(dst, &val, len);
	}
}

644
static struct musb_platform_ops dsps_ops = {
645
	.quirks		= MUSB_DMA_CPPI41 | MUSB_INDEXED_EP,
646 647 648
	.init		= dsps_musb_init,
	.exit		= dsps_musb_exit,

649 650 651 652
#ifdef CONFIG_USB_TI_CPPI41_DMA
	.dma_init	= cppi41_dma_controller_create,
	.dma_exit	= cppi41_dma_controller_destroy,
#endif
653 654 655
	.enable		= dsps_musb_enable,
	.disable	= dsps_musb_disable,

656
	.set_mode	= dsps_musb_set_mode,
657
	.recover	= dsps_musb_recover,
658
	.clear_ep_rxintr = dsps_musb_clear_ep_rxintr,
659 660 661 662
};

static u64 musb_dmamask = DMA_BIT_MASK(32);

663
static int get_int_prop(struct device_node *dn, const char *s)
664
{
665 666 667 668 669 670 671 672 673
	int ret;
	u32 val;

	ret = of_property_read_u32(dn, s, &val);
	if (ret)
		return 0;
	return val;
}

674 675 676 677
static int get_musb_port_mode(struct device *dev)
{
	enum usb_dr_mode mode;

678
	mode = usb_get_dr_mode(dev);
679 680 681 682 683 684 685 686 687 688 689
	switch (mode) {
	case USB_DR_MODE_HOST:
		return MUSB_PORT_MODE_HOST;

	case USB_DR_MODE_PERIPHERAL:
		return MUSB_PORT_MODE_GADGET;

	case USB_DR_MODE_UNKNOWN:
	case USB_DR_MODE_OTG:
	default:
		return MUSB_PORT_MODE_DUAL_ROLE;
J
Joe Perches 已提交
690
	}
691 692
}

693 694 695 696
static int dsps_create_musb_pdev(struct dsps_glue *glue,
		struct platform_device *parent)
{
	struct musb_hdrc_platform_data pdata;
697
	struct resource	resources[2];
698
	struct resource	*res;
699 700 701 702
	struct device *dev = &parent->dev;
	struct musb_hdrc_config	*config;
	struct platform_device *musb;
	struct device_node *dn = parent->dev.of_node;
703
	int ret, val;
704

705
	memset(resources, 0, sizeof(resources));
706 707
	res = platform_get_resource_byname(parent, IORESOURCE_MEM, "mc");
	if (!res) {
708
		dev_err(dev, "failed to get memory.\n");
709
		return -EINVAL;
710
	}
711
	resources[0] = *res;
712

713 714
	res = platform_get_resource_byname(parent, IORESOURCE_IRQ, "mc");
	if (!res) {
715
		dev_err(dev, "failed to get irq.\n");
716
		return -EINVAL;
717
	}
718
	resources[1] = *res;
719 720

	/* allocate the child platform device */
721 722
	musb = platform_device_alloc("musb-hdrc",
			(resources[0].start & 0xFFF) == 0x400 ? 0 : 1);
723 724
	if (!musb) {
		dev_err(dev, "failed to allocate musb device\n");
725
		return -ENOMEM;
726 727 728 729 730 731
	}

	musb->dev.parent		= dev;
	musb->dev.dma_mask		= &musb_dmamask;
	musb->dev.coherent_dma_mask	= musb_dmamask;

732
	glue->musb = musb;
733

734 735
	ret = platform_device_add_resources(musb, resources,
			ARRAY_SIZE(resources));
736 737
	if (ret) {
		dev_err(dev, "failed to add resources\n");
738
		goto err;
739 740
	}

741 742 743 744
	config = devm_kzalloc(&parent->dev, sizeof(*config), GFP_KERNEL);
	if (!config) {
		ret = -ENOMEM;
		goto err;
745
	}
746 747
	pdata.config = config;
	pdata.platform_ops = &dsps_ops;
748

749 750
	config->num_eps = get_int_prop(dn, "mentor,num-eps");
	config->ram_bits = get_int_prop(dn, "mentor,ram-bits");
751
	config->host_port_deassert_reset_at_resume = 1;
752 753 754
	pdata.mode = get_musb_port_mode(dev);
	/* DT keeps this entry in mA, musb expects it as per USB spec */
	pdata.power = get_int_prop(dn, "mentor,power") / 2;
755 756 757 758

	ret = of_property_read_u32(dn, "mentor,multipoint", &val);
	if (!ret && val)
		config->multipoint = true;
759

760
	config->maximum_speed = usb_get_maximum_speed(&parent->dev);
761 762 763 764 765 766 767 768 769 770 771 772
	switch (config->maximum_speed) {
	case USB_SPEED_LOW:
	case USB_SPEED_FULL:
		break;
	case USB_SPEED_SUPER:
		dev_warn(dev, "ignore incorrect maximum_speed "
				"(super-speed) setting in dts");
		/* fall through */
	default:
		config->maximum_speed = USB_SPEED_HIGH;
	}

773
	ret = platform_device_add_data(musb, &pdata, sizeof(pdata));
774 775
	if (ret) {
		dev_err(dev, "failed to add platform_data\n");
776
		goto err;
777 778 779 780 781
	}

	ret = platform_device_add(musb);
	if (ret) {
		dev_err(dev, "failed to register musb device\n");
782
		goto err;
783 784 785
	}
	return 0;

786
err:
787 788 789 790
	platform_device_put(musb);
	return ret;
}

791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831
static irqreturn_t dsps_vbus_threaded_irq(int irq, void *priv)
{
	struct dsps_glue *glue = priv;
	struct musb *musb = platform_get_drvdata(glue->musb);

	if (!musb)
		return IRQ_NONE;

	dev_dbg(glue->dev, "VBUS interrupt\n");
	dsps_mod_timer(glue, 0);

	return IRQ_HANDLED;
}

static int dsps_setup_optional_vbus_irq(struct platform_device *pdev,
					struct dsps_glue *glue)
{
	int error;

	glue->vbus_irq = platform_get_irq_byname(pdev, "vbus");
	if (glue->vbus_irq == -EPROBE_DEFER)
		return -EPROBE_DEFER;

	if (glue->vbus_irq <= 0) {
		glue->vbus_irq = 0;
		return 0;
	}

	error = devm_request_threaded_irq(glue->dev, glue->vbus_irq,
					  NULL, dsps_vbus_threaded_irq,
					  IRQF_ONESHOT,
					  "vbus", glue);
	if (error) {
		glue->vbus_irq = 0;
		return error;
	}
	dev_dbg(glue->dev, "VBUS irq %i configured\n", glue->vbus_irq);

	return 0;
}

B
Bill Pemberton 已提交
832
static int dsps_probe(struct platform_device *pdev)
833
{
834 835
	const struct of_device_id *match;
	const struct dsps_musb_wrapper *wrp;
836
	struct dsps_glue *glue;
837
	int ret;
838

839 840 841
	if (!strcmp(pdev->name, "musb-hdrc"))
		return -ENODEV;

842
	match = of_match_node(musb_dsps_of_match, pdev->dev.of_node);
843 844
	if (!match) {
		dev_err(&pdev->dev, "fail to get matching of_match struct\n");
845
		return -EINVAL;
846 847
	}
	wrp = match->data;
848

849 850 851
	if (of_device_is_compatible(pdev->dev.of_node, "ti,musb-dm816"))
		dsps_ops.read_fifo = dsps_read_fifo32;

852
	/* allocate glue */
853
	glue = devm_kzalloc(&pdev->dev, sizeof(*glue), GFP_KERNEL);
854
	if (!glue)
855
		return -ENOMEM;
856 857

	glue->dev = &pdev->dev;
858
	glue->wrp = wrp;
859

860 861 862 863 864 865
	if (usb_get_dr_mode(&pdev->dev) == USB_DR_MODE_PERIPHERAL) {
		ret = dsps_setup_optional_vbus_irq(pdev, glue);
		if (ret)
			return ret;
	}

866 867
	platform_set_drvdata(pdev, glue);
	pm_runtime_enable(&pdev->dev);
868 869
	ret = dsps_create_musb_pdev(glue, pdev);
	if (ret)
870
		goto err;
871

872 873
	return 0;

874
err:
875
	pm_runtime_disable(&pdev->dev);
876 877
	return ret;
}
878

B
Bill Pemberton 已提交
879
static int dsps_remove(struct platform_device *pdev)
880 881 882
{
	struct dsps_glue *glue = platform_get_drvdata(pdev);

883
	platform_device_unregister(glue->musb);
884 885

	pm_runtime_disable(&pdev->dev);
M
Markus Pargmann 已提交
886

887 888 889
	return 0;
}

890
static const struct dsps_musb_wrapper am33xx_driver_data = {
891 892 893 894 895 896 897 898 899 900 901
	.revision		= 0x00,
	.control		= 0x14,
	.status			= 0x18,
	.epintr_set		= 0x38,
	.epintr_clear		= 0x40,
	.epintr_status		= 0x30,
	.coreintr_set		= 0x3c,
	.coreintr_clear		= 0x44,
	.coreintr_status	= 0x34,
	.phy_utmi		= 0xe0,
	.mode			= 0xe8,
902 903
	.tx_mode		= 0x70,
	.rx_mode		= 0x74,
904 905 906
	.reset			= 0,
	.otg_disable		= 21,
	.iddig			= 8,
907
	.iddig_mux		= 7,
908 909 910 911 912 913 914 915 916 917
	.usb_shift		= 0,
	.usb_mask		= 0x1ff,
	.usb_bitmap		= (0x1ff << 0),
	.drvvbus		= 8,
	.txep_shift		= 0,
	.txep_mask		= 0xffff,
	.txep_bitmap		= (0xffff << 0),
	.rxep_shift		= 16,
	.rxep_mask		= 0xfffe,
	.rxep_bitmap		= (0xfffe << 16),
918
	.poll_timeout		= 2000, /* ms */
919 920
};

B
Bill Pemberton 已提交
921
static const struct of_device_id musb_dsps_of_match[] = {
922
	{ .compatible = "ti,musb-am33xx",
923 924 925
		.data = &am33xx_driver_data, },
	{ .compatible = "ti,musb-dm816",
		.data = &am33xx_driver_data, },
926 927 928 929
	{  },
};
MODULE_DEVICE_TABLE(of, musb_dsps_of_match);

930
#ifdef CONFIG_PM_SLEEP
931 932 933 934 935
static int dsps_suspend(struct device *dev)
{
	struct dsps_glue *glue = dev_get_drvdata(dev);
	const struct dsps_musb_wrapper *wrp = glue->wrp;
	struct musb *musb = platform_get_drvdata(glue->musb);
936
	void __iomem *mbase;
937

938
	del_timer_sync(&glue->timer);
939 940 941 942 943 944

	if (!musb)
		/* This can happen if the musb device is in -EPROBE_DEFER */
		return 0;

	mbase = musb->ctrl_base;
945 946 947 948 949 950 951
	glue->context.control = musb_readl(mbase, wrp->control);
	glue->context.epintr = musb_readl(mbase, wrp->epintr_set);
	glue->context.coreintr = musb_readl(mbase, wrp->coreintr_set);
	glue->context.phy_utmi = musb_readl(mbase, wrp->phy_utmi);
	glue->context.mode = musb_readl(mbase, wrp->mode);
	glue->context.tx_mode = musb_readl(mbase, wrp->tx_mode);
	glue->context.rx_mode = musb_readl(mbase, wrp->rx_mode);
952 953 954 955 956 957 958 959 960

	return 0;
}

static int dsps_resume(struct device *dev)
{
	struct dsps_glue *glue = dev_get_drvdata(dev);
	const struct dsps_musb_wrapper *wrp = glue->wrp;
	struct musb *musb = platform_get_drvdata(glue->musb);
961 962 963 964
	void __iomem *mbase;

	if (!musb)
		return 0;
965

966
	mbase = musb->ctrl_base;
967 968 969 970 971 972 973
	musb_writel(mbase, wrp->control, glue->context.control);
	musb_writel(mbase, wrp->epintr_set, glue->context.epintr);
	musb_writel(mbase, wrp->coreintr_set, glue->context.coreintr);
	musb_writel(mbase, wrp->phy_utmi, glue->context.phy_utmi);
	musb_writel(mbase, wrp->mode, glue->context.mode);
	musb_writel(mbase, wrp->tx_mode, glue->context.tx_mode);
	musb_writel(mbase, wrp->rx_mode, glue->context.rx_mode);
974
	if (musb->xceiv->otg->state == OTG_STATE_B_IDLE &&
975
	    musb->port_mode == MUSB_PORT_MODE_DUAL_ROLE)
976
		dsps_mod_timer(glue, -1);
977 978 979 980 981 982 983

	return 0;
}
#endif

static SIMPLE_DEV_PM_OPS(dsps_pm_ops, dsps_suspend, dsps_resume);

984 985
static struct platform_driver dsps_usbss_driver = {
	.probe		= dsps_probe,
B
Bill Pemberton 已提交
986
	.remove         = dsps_remove,
987 988
	.driver         = {
		.name   = "musb-dsps",
989
		.pm	= &dsps_pm_ops,
990
		.of_match_table	= musb_dsps_of_match,
991 992 993 994 995 996 997 998
	},
};

MODULE_DESCRIPTION("TI DSPS MUSB Glue Layer");
MODULE_AUTHOR("Ravi B <ravibabu@ti.com>");
MODULE_AUTHOR("Ajay Kumar Gupta <ajay.gupta@ti.com>");
MODULE_LICENSE("GPL v2");

999
module_platform_driver(dsps_usbss_driver);